C / C++ 규칙

문제 신고 소스 보기 Nightly · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

규칙

cc_binary

규칙 소스 보기
cc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, distribs, dynamic_deps, env, exec_compatible_with, exec_properties, features, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, module_interfaces, nocopts, output_licenses, reexport_deps, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)

실행 가능한 바이너리를 생성합니다.


타겟의 name는 애플리케이션의 기본 진입점인 소스 파일의 이름 (확장자 제외)과 동일해야 합니다. 예를 들어 진입점이 main.cc에 있으면 이름은 main여야 합니다.

암시적 출력 타겟

  • name.stripped (명시적으로 요청된 경우에만 빌드됨): 바이너리의 제거된 버전입니다. strip -g는 바이너리에서 실행되어 디버그 기호를 삭제합니다. --stripopt=-foo를 사용하여 명령줄에 추가 스트립 옵션을 제공할 수 있습니다.
  • name.dwp (명시적으로 요청된 경우에만 빌드됨): Fission이 사용 설정된 경우: 원격으로 배포된 바이너리를 디버그하는 데 적합한 디버그 정보 패키지 파일입니다. 그 외의 경우: 빈 파일입니다.

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

deps

라벨 목록입니다. 기본값은 []입니다.

바이너리 타겟에 연결할 다른 라이브러리의 목록입니다.

cc_library 또는 objc_library 타겟일 수 있습니다.

링커 스크립트 (.lds)를 종속 항목에 배치하고 linkopts에서 참조할 수도 있습니다.
srcs

라벨 목록입니다. 기본값은 []입니다.

라이브러리 타겟을 만들기 위해 처리되는 C 및 C++ 파일 목록입니다. 생성되지 않은 C/C++ 소스 및 헤더 파일 (일반 소스 코드) 또는 생성된 C/C++ 소스 및 헤더 파일입니다.

모든 .cc, .c, .cpp 파일이 컴파일됩니다. 생성된 파일일 수 있습니다. 이름이 지정된 파일이 다른 규칙의 outs에 있는 경우 이 cc_library는 자동으로 해당 다른 규칙에 종속됩니다.

순수 어셈블러 파일 (.s, .asm)은 사전 처리되지 않으며 일반적으로 어셈블러를 사용하여 빌드됩니다. 사전 처리된 어셈블리 파일 (.S)은 사전 처리되며 일반적으로 C/C++ 컴파일러를 사용하여 빌드됩니다.

.h 파일은 컴파일되지 않지만 이 규칙의 소스에서 포함할 수 있습니다. .cc.h 파일 모두 이러한 srcs 또는 이 규칙의 hdrs 또는 deps 인수에 나열된 규칙에 나열된 헤더를 직접 포함할 수 있습니다.

모든 #included 파일은 이 규칙 또는 참조된 cc_library 규칙의 hdrs 속성에 언급되어야 하며, 이 라이브러리에 비공개인 경우 srcs에 나열되어야 합니다. 자세한 내용은 '헤더 포함 검사'를 참고하세요.

.so, .lo, .a 파일은 사전 컴파일된 파일입니다. 소스 코드가 없는 서드 파티 코드를 사용하는 라이브러리에는 이러한 항목이 srcs로 표시될 수 있습니다.

srcs 속성에 다른 규칙의 라벨이 포함된 경우 cc_library는 컴파일할 소스 파일로 해당 규칙의 출력 파일을 사용합니다. 일회성 소스 코드 생성에 유용합니다. 가끔 사용하는 경우 Starlark 규칙 클래스를 구현하고 cc_common API를 사용하는 것이 좋습니다.

허용되는 srcs 파일 형식은 다음과 같습니다.

  • C 및 C++ 소스 파일: .c, .cc, .cpp, .cxx, .c++, .C
  • C 및 C++ 헤더 파일: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • C 프리프로세서가 있는 어셈블러: .S
  • 보관처리: .a, .pic.a
  • '항상 연결' 라이브러리: .lo, .pic.lo
  • 버전이 지정되거나 지정되지 않은 공유 라이브러리: .so, .so.version
  • 객체 파일: .o, .pic.o

... 및 이러한 파일을 생성하는 모든 규칙 (예: cc_embed_data)을 나타냅니다. 확장자가 다르면 gcc 규칙에 따라 프로그래밍 언어가 다르게 표시됩니다.

data

라벨 목록입니다. 기본값은 []입니다.

런타임 시 이 라이브러리에 필요한 파일 목록입니다. data에 관한 일반적인 설명은 대부분의 빌드 규칙에서 정의하는 일반적인 속성을 참고하세요.

data이 생성된 파일의 이름인 경우 이 cc_library 규칙은 생성 규칙에 자동으로 종속됩니다.

data가 규칙 이름인 경우 이 cc_library 규칙은 자동으로 해당 규칙에 종속되며 해당 규칙의 outs가 이 cc_library의 데이터 파일에 자동으로 추가됩니다.

C++ 코드는 다음과 같이 이러한 데이터 파일에 액세스할 수 있습니다.


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
additional_linker_inputs

라벨 목록입니다. 기본값은 []입니다.

이러한 파일을 C++ 링커 명령어에 전달합니다.

예를 들어 컴파일된 Windows .res 파일을 여기에 제공하여 바이너리 타겟에 삽입할 수 있습니다.

conlyopts

문자열 목록입니다. 기본값은 []입니다.

C 컴파일 명령어에 이러한 옵션을 추가합니다. 'Make 변수' 대체 및 Bourne 셸 토큰화가 적용됩니다.
copts

문자열 목록입니다. 기본값은 []입니다.

C/C++ 컴파일 명령어에 이러한 옵션을 추가합니다. 'Make 변수' 대체 및 Bourne 셸 토큰화가 적용됩니다.

이 속성의 각 문자열은 바이너리 타겟을 컴파일하기 전에 지정된 순서대로 COPTS에 추가됩니다. 플래그는 이 타겟을 컴파일할 때만 적용되며 종속 항목에는 적용되지 않으므로 다른 위치에 포함된 헤더 파일에 주의하세요. 모든 경로는 현재 패키지가 아닌 작업공간을 기준으로 해야 합니다. 이 속성은 third_party 외부에서 필요하지 않습니다.

패키지가 기능 no_copts_tokenization을 선언하는 경우 Bourne 셸 토큰화는 단일 'Make' 변수로 구성된 문자열에만 적용됩니다.

cxxopts

문자열 목록입니다. 기본값은 []입니다.

C++ 컴파일 명령어에 이러한 옵션을 추가합니다. 'Make 변수' 대체 및 Bourne 셸 토큰화가 적용됩니다.
defines

문자열 목록입니다. 기본값은 []입니다.

컴파일 줄에 추가할 정의 목록입니다. 'Make' 변수 대체 및 Bourne 셸 토큰화가 적용됩니다. 단일 Bourne 셸 토큰으로 구성되어야 하는 각 문자열은 -D로 시작하고 이 대상의 컴파일 명령줄과 이 대상에 종속된 모든 규칙에 추가됩니다. 광범위한 영향을 미칠 수 있으므로 주의해야 합니다. 확실하지 않은 경우 정의 값을 local_defines에 추가합니다.
dynamic_deps

라벨 목록입니다. 기본값은 []입니다.

현재 타겟이 종속되는 다른 cc_shared_library 종속 항목입니다.

cc_shared_library 구현은 dynamic_deps 목록 (전이적으로, 즉 현재 타겟의 dynamic_depsdynamic_deps)을 사용하여 전이 depscc_libraries 중 이미 다른 cc_shared_library에서 제공되었으므로 연결해서는 안 되는 cc_libraries를 결정합니다.

hdrs_check

문자열, 기본값은 ""입니다.

지원 중단됨, 무작위 작업
includes

문자열 목록입니다. 기본값은 []입니다.

컴파일 줄에 추가할 포함 디렉터리의 목록입니다. '변수 만들기' 대체가 적용됩니다. 각 문자열 앞에 패키지 경로가 추가되고 'include_paths' CROSSTOOL 기능을 통해 확장되도록 C++ 도구 모음에 전달됩니다. 일반적인 기능 정의가 있는 POSIX 시스템에서 실행되는 도구 모음은 -isystem path_to_package/include_entry를 생성합니다. 이는 #include 문을 작성하는 Google 스타일을 따르지 않는 서드 파티 라이브러리에만 사용해야 합니다. COPTS와 달리 이러한 플래그는 이 규칙과 이 규칙에 종속된 모든 규칙에 추가됩니다. (참고: 종속되는 규칙이 아닙니다.) 광범위한 영향을 미칠 수 있으므로 매우 주의해야 합니다. 확실하지 않다면 COPTS에 '-I' 플래그를 추가하세요.

추가된 include 경로에는 소스 트리의 파일뿐만 아니라 생성된 파일도 포함됩니다.

라벨: 기본값은 "@bazel_tools//tools/cpp:link_extra_lib"입니다.

추가 라이브러리의 연결을 제어합니다.

기본적으로 C++ 바이너리는 기본적으로 라벨 플래그 //tools/cpp:link_extra_libs에 종속되는 //tools/cpp:link_extra_lib에 연결됩니다. 플래그를 설정하지 않으면 이 라이브러리는 기본적으로 비어 있습니다. 라벨 플래그를 설정하면 약한 기호 재정의, 공유 라이브러리 함수의 인터셉터, 특수 런타임 라이브러리 (malloc 대체의 경우 malloc 또는 --custom_malloc를 권장)와 같은 선택적 종속 항목을 연결할 수 있습니다. 이 속성을 None로 설정하면 이 동작이 사용 중지됩니다.

linkopts

문자열 목록입니다. 기본값은 []입니다.

C++ 링커 명령어에 다음 플래그를 추가합니다. 'Make' 변수 대체, Bourne 셸 토큰화, 라벨 확장이 적용됩니다. 이 속성의 각 문자열은 바이너리 타겟을 연결하기 전에 LINKOPTS에 추가됩니다.

이 목록에서 $ 또는 -로 시작하지 않는 각 요소는 deps의 타겟 라벨로 간주됩니다. 이 타겟에서 생성된 파일 목록이 링커 옵션에 추가됩니다. 라벨이 유효하지 않거나 deps에 선언되지 않은 경우 오류가 보고됩니다.

linkshared

불리언. 기본값은 False입니다.

공유 라이브러리를 만듭니다. 이 속성을 사용 설정하려면 규칙에 linkshared=True를 포함하세요. 이 옵션은 기본적으로 사용 중지되어 있습니다.

이 플래그가 있으면 -shared 플래그와 gcc 간에 연결이 발생하며, 결과 공유 라이브러리는 예를 들어 Java 프로그램에 로드하는 데 적합합니다. 그러나 빌드 목적으로는 종속 바이너리에 연결되지 않습니다. cc_binary 규칙으로 빌드된 공유 라이브러리는 다른 프로그램에서 수동으로만 로드된다고 가정되기 때문입니다. 따라서 cc_library 규칙의 대체로 간주해서는 안 됩니다. 확장성을 위해 이 접근 방식을 완전히 피하고 java_librarycc_library 규칙에 종속되도록 하는 것이 좋습니다.

linkopts=['-static']linkshared=True를 모두 지정하면 완전히 독립적인 단일 단위가 생성됩니다. linkstatic=Truelinkshared=True를 모두 지정하면 대부분 자체적으로 완결된 단일 단위가 생성됩니다.

linkstatic

불리언. 기본값은 True입니다.

cc_binarycc_test의 경우 바이너리를 정적인 모드로 연결합니다. cc_library.link_static: 아래를 참고하세요.

이 옵션은 기본적으로 cc_binary에 대해 사용 설정되어 있고 나머지에는 사용 중지되어 있습니다.

이 옵션을 사용 설정하고 바이너리 또는 테스트인 경우 빌드 도구에 가능한 경우 사용자 라이브러리에 .so 대신 .a를 연결하도록 지시합니다. libc와 같은 시스템 라이브러리 (아래 참고, C/C++ 런타임 라이브러리는 아님)는 정적 라이브러리가 없는 라이브러리와 마찬가지로 여전히 동적으로 연결됩니다. 따라서 결과 실행 파일은 여전히 동적으로 연결되므로 대부분 정적입니다.

실행 파일을 연결하는 방법에는 세 가지가 있습니다.

  • 모든 항목이 정적으로 연결되는 fully_static_link 기능이 있는 STATIC(예: 'gcc -static foo.o libbar.a libbaz.a -lm').
    이 모드는 features 속성에 fully_static_link를 지정하여 사용 설정할 수 있습니다.
  • STATIC: 모든 사용자 라이브러리가 정적으로 연결되지만(정적 버전을 사용할 수 있는 경우) 시스템 라이브러리(C/C++ 런타임 라이브러리 제외)는 동적으로 연결됩니다(예: 'gcc foo.o libfoo.a libbaz.a -lm').
    이 모드는 linkstatic=True를 지정하여 사용 설정합니다.
  • DYNAMIC: 모든 라이브러리가 동적으로 연결됩니다 (동적 버전을 사용할 수 있는 경우). 예: 'gcc foo.o libfoo.so libbaz.so -lm'.
    이 모드는 linkstatic=False를 지정하여 사용 설정합니다.

featureslinkstatic 속성 또는 fully_static_link//third_party 외부에서 사용되는 경우 규칙 근처에 이유를 설명하는 주석을 포함하세요.

linkstatic 속성은 cc_library() 규칙에 사용되는 경우 의미가 다릅니다. C++ 라이브러리의 경우 linkstatic=True는 정적 연결만 허용됨을 나타내므로 .so가 생성되지 않습니다. linkstatic=False는 정적 라이브러리가 생성되는 것을 방지하지는 않습니다. 이 속성은 동적 라이브러리 생성을 제어하기 위한 것입니다.

프로덕션에서는 linkstatic=False로 빌드된 코드가 거의 없어야 합니다. linkstatic=False인 경우 빌드 도구는 *.runfiles 영역에서 종속 항목인 공유 라이브러리에 대한 심볼릭 링크를 만듭니다.

local_defines

문자열 목록입니다. 기본값은 []입니다.

컴파일 줄에 추가할 정의 목록입니다. 'Make' 변수 대체 및 Bourne 셸 토큰화가 적용됩니다. 단일 Bourne 셸 토큰으로 구성되어야 하는 각 문자열은 -D로 시작하고 이 타겟의 컴파일 명령줄에 추가되지만 종속 항목에는 추가되지 않습니다.
malloc

라벨: 기본값은 "@bazel_tools//tools/cpp:malloc"입니다.

malloc의 기본 종속 항목을 재정의합니다.

기본적으로 C++ 바이너리는 빈 라이브러리인 //tools/cpp:malloc에 연결되므로 바이너리는 결국 libc malloc을 사용합니다. 이 라벨은 cc_library를 참조해야 합니다. 컴파일이 C++가 아닌 규칙을 위한 경우 이 옵션은 영향을 미치지 않습니다. linkshared=True가 지정된 경우 이 속성의 값은 무시됩니다.

module_interfaces

라벨 목록입니다. 기본값은 []입니다.

파일 목록은 C++20 모듈 인터페이스로 간주됩니다.

C++ 표준에 모듈 인터페이스 파일 확장자에 관한 제한사항이 없음

  • Clang에서 cppm 사용
  • GCC는 모든 소스 파일 확장자를 사용할 수 있습니다.
  • MSVC에서 ixx 사용

사용은 --experimental_cpp_modules 플래그로 보호됩니다.

nocopts

문자열, 기본값은 ""입니다.

C++ 컴파일 명령어에서 일치하는 옵션을 삭제합니다. 'Make' 변수 대체가 적용됩니다. 이 속성의 값은 정규 표현식으로 해석됩니다. 이 정규 표현식과 일치하는 기존 COPTS(규칙의 copts 속성에 명시적으로 지정된 값 포함)는 이 규칙을 컴파일하기 위해 COPTS에서 삭제됩니다. 이 속성은 third_party 외부에서 필요하거나 사용해서는 안 됩니다. 값은 'Make' 변수 대체 외의 방식으로 사전 처리되지 않습니다.
reexport_deps

라벨 목록입니다. 기본값은 []입니다.

stamp

정수, 기본값은 -1

빌드 정보를 바이너리로 인코딩할지 여부입니다. 가능한 값은 다음과 같습니다.
  • stamp = 1: --nostamp 빌드에서도 항상 빌드 정보를 바이너리에 스탬프합니다. 바이너리 및 바이너리에 종속된 모든 다운스트림 작업의 원격 캐싱을 중단할 수 있으므로 이 설정은 피해야 합니다.
  • stamp = 0: 항상 빌드 정보를 상수 값으로 대체합니다. 이렇게 하면 빌드 결과 캐싱이 향상됩니다.
  • stamp = -1: 빌드 정보의 삽입은 --[no]stamp 플래그에 의해 제어됩니다.

스탬프가 지정된 바이너리는 종속 항목이 변경되지 않는 한 다시 빌드되지 않습니다.

win_def_file

라벨: 기본값은 None입니다.

링커에 전달할 Windows DEF 파일입니다.

이 속성은 Windows가 대상 플랫폼인 경우에만 사용해야 합니다. 공유 라이브러리 연결 중에 기호를 내보내기하는 데 사용할 수 있습니다.

cc_import

규칙 소스 보기
cc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, pic_objects, pic_static_library, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, toolchains, visibility)

cc_import 규칙을 사용하면 사용자가 사전 컴파일된 C/C++ 라이브러리를 가져올 수 있습니다.

다음은 일반적인 사용 사례입니다.
1. 정적 라이브러리 연결


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  # If alwayslink is turned on,
  # libmylib.a will be forcely linked into any binary that depends on it.
  # alwayslink = True,
)
2. 공유 라이브러리 연결 (Unix)

cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. 공유 라이브러리를 인터페이스 라이브러리와 연결

Unix의 경우:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # libmylib.ifso is an interface library for libmylib.so which will be passed to linker
  interface_library = "libmylib.ifso",
  # libmylib.so will be available for runtime
  shared_library = "libmylib.so",
)

Windows:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll will be available for runtime
  shared_library = "mylib.dll",
)
4. system_provided=True로 공유 라이브러리 연결

Unix의 경우:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  interface_library = "libmylib.ifso", # Or we can also use libmylib.so as its own interface library
  # libmylib.so is provided by system environment, for example it can be found in LD_LIBRARY_PATH.
  # This indicates that Bazel is not responsible for making libmylib.so available.
  system_provided = True,
)

Windows:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll is provided by system environment, for example it can be found in PATH.
  # This indicates that Bazel is not responsible for making mylib.dll available.
  system_provided = True,
)
5. 정적 또는 공유 라이브러리에 연결

Unix의 경우:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)

Windows:


cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.lib", # A normal static library
  interface_library = "mylib.lib", # An import library for mylib.dll
  shared_library = "mylib.dll",
)

나머지는 Unix와 Windows에서 동일합니다.


# first will link to libmylib.a (or libmylib.lib)
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = True, # default value
)

# second will link to libmylib.so (or libmylib.lib)
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = False,
)

cc_import는 include 속성을 지원합니다. 예를 들면 다음과 같습니다.


cc_import(
  name = "curl_lib",
  hdrs = glob(["vendor/curl/include/curl/*.h"]),
  includes = ["vendor/curl/include"],
  shared_library = "vendor/curl/lib/.libs/libcurl.dylib",
)

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

deps

라벨 목록입니다. 기본값은 []입니다.

타겟이 종속되는 다른 라이브러리의 목록입니다. deps에 관한 일반적인 설명은 대부분의 빌드 규칙에서 정의하는 일반적인 속성을 참고하세요.
hdrs

라벨 목록입니다. 기본값은 []입니다.

종속 규칙의 소스에서 직접 포함할 사전 컴파일된 라이브러리에서 게시한 헤더 파일 목록입니다.

불리언. 기본값은 False입니다.

1인 경우 이 C++ 사전 컴파일된 라이브러리에 직접 또는 간접적으로 종속되는 모든 바이너리는 정적 라이브러리에 보관처리된 모든 객체 파일을 링크합니다. 일부 객체 파일에 바이너리에서 참조하는 기호가 포함되어 있지 않더라도 마찬가지입니다. 이는 코드가 바이너리의 코드에 의해 명시적으로 호출되지 않는 경우에 유용합니다. 예를 들어 코드가 서비스에서 제공하는 콜백을 수신하도록 등록하는 경우입니다.

Windows의 VS 2017에서 alwayslink가 작동하지 않는 경우 알려진 문제로 인한 것이므로 VS 2017을 최신 버전으로 업그레이드하세요.

includes

문자열 목록입니다. 기본값은 []입니다.

컴파일 줄에 추가할 포함 디렉터리의 목록입니다. '변수 만들기' 대체가 적용됩니다. 각 문자열 앞에 패키지 경로가 추가되고 'include_paths' CROSSTOOL 기능을 통해 확장되도록 C++ 도구 모음에 전달됩니다. 일반적인 기능 정의가 있는 POSIX 시스템에서 실행되는 도구 모음은 -isystem path_to_package/include_entry를 생성합니다. 이는 #include 문을 작성하는 Google 스타일을 따르지 않는 서드 파티 라이브러리에만 사용해야 합니다. COPTS와 달리 이러한 플래그는 이 규칙과 이 규칙에 종속된 모든 규칙에 추가됩니다. (참고: 종속되는 규칙이 아닙니다.) 광범위한 영향을 미칠 수 있으므로 매우 주의해야 합니다. 확실하지 않다면 COPTS에 '-I' 플래그를 추가하세요.

기본 include 경로에는 생성된 파일이 포함되지 않습니다. 생성된 헤더 파일을 #include해야 하는 경우 srcs에 나열합니다.

interface_library

라벨: 기본값은 None입니다.

공유 라이브러리 연결을 위한 단일 인터페이스 라이브러리입니다.

허용되는 파일 형식: .ifso, .tbd, .lib, .so 또는 .dylib

linkopts

문자열 목록입니다. 기본값은 []입니다.

C++ 링커 명령어에 다음 플래그를 추가합니다. 'Make' 변수 대체, Bourne 셸 토큰화, 라벨 확장이 적용됩니다. 이 속성의 각 문자열은 바이너리 타겟을 연결하기 전에 LINKOPTS에 추가됩니다.

이 목록에서 $ 또는 -로 시작하지 않는 각 요소는 deps의 타겟 라벨로 간주됩니다. 이 타겟에서 생성된 파일 목록이 링커 옵션에 추가됩니다. 라벨이 유효하지 않거나 deps에 선언되지 않은 경우 오류가 보고됩니다.

objects

라벨 목록입니다. 기본값은 []입니다.

pic_objects

라벨 목록입니다. 기본값은 []입니다.

pic_static_library

라벨: 기본값은 None입니다.

shared_library

라벨: 기본값은 None입니다.

사전 컴파일된 단일 공유 라이브러리입니다. Bazel은 런타임 중에 이에 종속된 바이너리가 이를 사용할 수 있도록 합니다.

허용되는 파일 형식: .so, .dll 또는 .dylib

static_library

라벨: 기본값은 None입니다.

단일 사전 컴파일된 정적 라이브러리

허용되는 파일 형식: .a, .pic.a 또는 .lib

system_provided

불리언. 기본값은 False입니다.

1이면 런타임에 필요한 공유 라이브러리가 시스템에서 제공됨을 나타냅니다. 이 경우 interface_library를 지정하고 shared_library는 비워야 합니다.

cc_library

규칙 소스 보기
cc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

C++ 컴파일 라이브러리에는 cc_library()를 사용하세요. 결과는 필요한 사항에 따라 .so, .lo 또는 .a입니다.

cc_library에 종속된 정적 연결로 빌드하는 경우 종속 라이브러리 규칙의 출력은 .a 파일입니다. alwayslink=True를 지정하면 .lo 파일이 생성됩니다.

실제 출력 파일 이름은 공유 라이브러리의 경우 libfoo.so이며 여기서 foo는 규칙의 이름입니다. 다른 종류의 라이브러리는 각각 .lo.a로 끝납니다. Python 모듈을 정의하는 등 특정 공유 라이브러리 이름이 필요한 경우 genrule을 사용하여 라이브러리를 원하는 이름으로 복사합니다.

헤더 포함 확인

빌드에 사용되는 모든 헤더 파일은 cc_* 규칙의 hdrs 또는 srcs에서 선언해야 합니다. 이는 시행되고 있습니다.

cc_library 규칙의 경우 hdrs의 헤더가 라이브러리의 공개 인터페이스를 구성하며 라이브러리 자체의 hdrssrcs 파일뿐만 아니라 deps에 라이브러리를 나열하는 cc_* 규칙의 hdrssrcs 파일에서 직접 포함할 수 있습니다. srcs의 헤더는 라이브러리 자체의 hdrssrcs 파일에서만 직접 포함해야 합니다. 헤더를 hdrs에 넣을지 srcs에 넣을지 결정할 때는 이 라이브러리의 소비자가 헤더를 직접 포함할 수 있는지 여부를 물어봐야 합니다. 이는 프로그래밍 언어에서 publicprivate 공개 상태 간에 내리는 결정과 거의 같습니다.

cc_binarycc_test 규칙에는 내보낸 인터페이스가 없으므로 hdrs 속성도 없습니다. 바이너리 또는 테스트에 직접 속하는 모든 헤더는 srcs에 나열되어야 합니다.

이러한 규칙을 설명하기 위해 다음 예시를 살펴보세요.


cc_binary(
    name = "foo",
    srcs = [
        "foo.cc",
        "foo.h",
    ],
    deps = [":bar"],
)

cc_library(
    name = "bar",
    srcs = [
        "bar.cc",
        "bar-impl.h",
    ],
    hdrs = ["bar.h"],
    deps = [":baz"],
)

cc_library(
    name = "baz",
    srcs = [
        "baz.cc",
        "baz-impl.h",
    ],
    hdrs = ["baz.h"],
)

이 예에서 허용되는 직접 포함은 아래 표에 나와 있습니다. 예를 들어 foo.ccfoo.hbar.h를 직접 포함할 수 있지만 baz.h는 포함할 수 없습니다.

파일 포함허용되는 포함 항목
foo.hbar.h
foo.ccfoo.h bar.h
bar.hbar-impl.h baz.h
bar-impl.hbar.h baz.h
bar.ccbar.h bar-impl.h baz.h
baz.hbaz-impl.h
baz-impl.hbaz.h
baz.ccbaz.h baz-impl.h

포함 확인 규칙은 직접 포함에만 적용됩니다. 위의 예에서 foo.ccbar.h를 포함할 수 있으며, bar.hbaz.h를 포함할 수 있고, baz.hbaz-impl.h를 포함할 수 있습니다. 기술적으로 .cc 파일의 컴파일은 전이 deps 폐쇄의 모든 cc_library에 있는 hdrs 또는 srcs의 모든 헤더 파일을 전이적으로 포함할 수 있습니다. 이 경우 컴파일러는 foo.cc를 컴파일할 때 baz.hbaz-impl.h를 읽을 수 있지만 foo.cc#include "baz.h"을 포함해서는 안 됩니다. 이를 허용하려면 foodepsbaz를 추가해야 합니다.

Bazel은 포함 검사 규칙을 적용하기 위해 도구 모음 지원에 의존합니다. layering_check 기능은 도구 모음에서 지원되고 --features=layering_check 명령줄 플래그 또는 package 함수의 features 매개변수를 통해 명시적으로 요청되어야 합니다. Bazel에서 제공하는 도구 모음은 Unix 및 macOS에서 clang을 사용하여 이 기능만 지원합니다.


cc_library(
    name = "ast_inspector_lib",
    srcs = ["ast_inspector_lib.cc"],
    hdrs = ["ast_inspector_lib.h"],
    visibility = ["//visibility:public"],
    deps = ["//third_party/llvm/llvm/tools/clang:frontend"],
    # alwayslink as we want to be able to call things in this library at
    # debug time, even if they aren't used anywhere in the code.
    alwayslink = 1,
)

다음 예시는 third_party/python2_4_3/BUILD에서 가져온 것입니다. 일부 코드는 dl 라이브러리를 사용하여 다른 동적 라이브러리를 로드하므로 이 규칙은 dl 라이브러리를 연결하기 위해 -ldl 링크 옵션을 지정합니다.


cc_library(
    name = "python2_4_3",
    linkopts = [
        "-ldl",
        "-lutil",
    ],
    deps = ["//third_party/expat"],
)

다음 예시는 third_party/kde/BUILD에서 가져온 것입니다. 사전 빌드된 .so 파일은 저장소에 보관됩니다. 헤더 파일은 include라는 하위 디렉터리에 있습니다.


cc_library(
    name = "kde",
    srcs = [
        "lib/libDCOP.so",
        "lib/libkdesu.so",
        "lib/libkhtml.so",
        "lib/libkparts.so",
        ...more .so files...,
    ],
    includes = ["include"],
    deps = ["//third_party/X11"],
)

다음 예시는 third_party/gles/BUILD에서 가져온 것입니다. 서드 파티 코드에는 종종 일부 defineslinkopts가 필요합니다.


cc_library(
    name = "gles",
    srcs = [
        "GLES/egl.h",
        "GLES/gl.h",
        "ddx.c",
        "egl.c",
    ],
    defines = [
        "USE_FLOAT",
        "__GL_FLOAT",
        "__GL_COMMON",
    ],
    linkopts = ["-ldl"],  # uses dlopen(), dl library
    deps = [
        "es",
        "//third_party/X11",
    ],
)

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

deps

라벨 목록입니다. 기본값은 []입니다.

라이브러리 타겟이 종속되는 다른 라이브러리의 목록입니다.

cc_library 또는 objc_library 타겟일 수 있습니다.

deps에 관한 일반적인 설명은 대부분의 빌드 규칙에서 정의하는 일반적인 속성을 참고하세요.

C++ 라이브러리 규칙의 이름이어야 합니다. 이 규칙의 라이브러리를 연결하는 바이너리를 빌드하면 deps의 라이브러리도 연결됩니다.

'deps'라는 이름에도 불구하고 이 라이브러리의 모든 클라이언트가 여기에 속하는 것은 아닙니다. 런타임 데이터 종속 항목은 data에 속합니다. 다른 규칙에 의해 생성된 소스 파일은 srcs에 속합니다.

사전 컴파일된 서드 파티 라이브러리를 연결하려면 대신 srcs에 이름을 추가합니다.

이 라이브러리에 연결하지 않고도 종속 항목을 사용하려면 대신 data에 이름을 추가합니다.

srcs

라벨 목록입니다. 기본값은 []입니다.

라이브러리 타겟을 만들기 위해 처리되는 C 및 C++ 파일 목록입니다. 생성되지 않은 C/C++ 소스 및 헤더 파일 (일반 소스 코드) 또는 생성된 C/C++ 소스 및 헤더 파일입니다.

모든 .cc, .c, .cpp 파일이 컴파일됩니다. 생성된 파일일 수 있습니다. 이름이 지정된 파일이 다른 규칙의 outs에 있는 경우 이 cc_library는 자동으로 해당 다른 규칙에 종속됩니다.

순수 어셈블러 파일 (.s, .asm)은 사전 처리되지 않으며 일반적으로 어셈블러를 사용하여 빌드됩니다. 사전 처리된 어셈블리 파일 (.S)은 사전 처리되며 일반적으로 C/C++ 컴파일러를 사용하여 빌드됩니다.

.h 파일은 컴파일되지 않지만 이 규칙의 소스에서 포함할 수 있습니다. .cc.h 파일 모두 이러한 srcs 또는 이 규칙의 hdrs 또는 deps 인수에 나열된 규칙에 나열된 헤더를 직접 포함할 수 있습니다.

모든 #included 파일은 이 규칙 또는 참조된 cc_library 규칙의 hdrs 속성에 언급되어야 하며, 이 라이브러리에 비공개인 경우 srcs에 나열되어야 합니다. 자세한 내용은 '헤더 포함 검사'를 참고하세요.

.so, .lo, .a 파일은 사전 컴파일된 파일입니다. 소스 코드가 없는 서드 파티 코드를 사용하는 라이브러리에는 이러한 항목이 srcs로 표시될 수 있습니다.

srcs 속성에 다른 규칙의 라벨이 포함된 경우 cc_library는 컴파일할 소스 파일로 해당 규칙의 출력 파일을 사용합니다. 일회성 소스 코드 생성에 유용합니다. 가끔 사용하는 경우 Starlark 규칙 클래스를 구현하고 cc_common API를 사용하는 것이 좋습니다.

허용되는 srcs 파일 형식은 다음과 같습니다.

  • C 및 C++ 소스 파일: .c, .cc, .cpp, .cxx, .c++, .C
  • C 및 C++ 헤더 파일: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • C 프리프로세서가 있는 어셈블러: .S
  • 보관처리: .a, .pic.a
  • '항상 연결' 라이브러리: .lo, .pic.lo
  • 버전이 지정되거나 지정되지 않은 공유 라이브러리: .so, .so.version
  • 객체 파일: .o, .pic.o

... 및 이러한 파일을 생성하는 모든 규칙 (예: cc_embed_data)을 나타냅니다. 확장자가 다르면 gcc 규칙에 따라 프로그래밍 언어가 다르게 표시됩니다.

data

라벨 목록입니다. 기본값은 []입니다.

런타임 시 이 라이브러리에 필요한 파일 목록입니다. data에 관한 일반적인 설명은 대부분의 빌드 규칙에서 정의하는 일반적인 속성을 참고하세요.

data이 생성된 파일의 이름인 경우 이 cc_library 규칙은 생성 규칙에 자동으로 종속됩니다.

data가 규칙 이름인 경우 이 cc_library 규칙은 자동으로 해당 규칙에 종속되며 해당 규칙의 outs가 이 cc_library의 데이터 파일에 자동으로 추가됩니다.

C++ 코드는 다음과 같이 이러한 데이터 파일에 액세스할 수 있습니다.


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
hdrs

라벨 목록입니다. 기본값은 []입니다.

종속 규칙의 소스에서 직접 포함할 이 라이브러리에서 게시한 헤더 파일 목록입니다.

라이브러리의 인터페이스를 설명하는 헤더 파일을 선언하는 데 가장 적합한 위치입니다. 이러한 헤더는 이 규칙 또는 종속 규칙의 소스에서 포함할 수 있도록 제공됩니다. 이 라이브러리의 클라이언트에서 포함하지 않아야 하는 헤더는 게시된 헤더에 포함되어 있더라도 srcs 속성에 나열해야 합니다. 자세한 내용은 '헤더 포함 검사'를 참고하세요.

허용되는 headers 파일 형식: .h, .hh, .hpp, .hxx

additional_compiler_inputs

라벨 목록입니다. 기본값은 []입니다.

예를 들어 컴파일러 명령줄에 전달할 수 있는 추가 파일(예: 정리기 무시 목록) 여기에 지정된 파일은 $(location) 함수와 함께 copts에서 사용할 수 있습니다.
additional_linker_inputs

라벨 목록입니다. 기본값은 []입니다.

이러한 파일을 C++ 링커 명령어에 전달합니다.

예를 들어 컴파일된 Windows .res 파일을 여기에 제공하여 바이너리 타겟에 삽입할 수 있습니다.

불리언. 기본값은 False입니다.

1이면 이 C++ 라이브러리에 직접 또는 간접적으로 종속되는 모든 바이너리는 srcs에 나열된 파일의 모든 객체 파일을 링크합니다 (일부 파일에 바이너리에서 참조하는 기호가 포함되어 있지 않더라도). 이는 코드가 바이너리의 코드에 의해 명시적으로 호출되지 않는 경우에 유용합니다. 예를 들어 코드가 서비스에서 제공하는 콜백을 수신하도록 등록하는 경우입니다.

Windows의 VS 2017에서 alwayslink가 작동하지 않는 경우 알려진 문제로 인한 것이므로 VS 2017을 최신 버전으로 업그레이드하세요.

conlyopts

문자열 목록입니다. 기본값은 []입니다.

C 컴파일 명령어에 이러한 옵션을 추가합니다. 'Make 변수' 대체 및 Bourne 셸 토큰화가 적용됩니다.
copts

문자열 목록입니다. 기본값은 []입니다.

C/C++ 컴파일 명령어에 이러한 옵션을 추가합니다. 'Make 변수' 대체 및 Bourne 셸 토큰화가 적용됩니다.

이 속성의 각 문자열은 바이너리 타겟을 컴파일하기 전에 지정된 순서대로 COPTS에 추가됩니다. 플래그는 이 타겟을 컴파일할 때만 적용되며 종속 항목에는 적용되지 않으므로 다른 위치에 포함된 헤더 파일에 주의하세요. 모든 경로는 현재 패키지가 아닌 작업공간을 기준으로 해야 합니다. 이 속성은 third_party 외부에서 필요하지 않습니다.

패키지가 기능 no_copts_tokenization을 선언하는 경우 Bourne 셸 토큰화는 단일 'Make' 변수로 구성된 문자열에만 적용됩니다.

cxxopts

문자열 목록입니다. 기본값은 []입니다.

C++ 컴파일 명령어에 이러한 옵션을 추가합니다. 'Make 변수' 대체 및 Bourne 셸 토큰화가 적용됩니다.
defines

문자열 목록입니다. 기본값은 []입니다.

컴파일 줄에 추가할 정의 목록입니다. 'Make' 변수 대체 및 Bourne 셸 토큰화가 적용됩니다. 단일 Bourne 셸 토큰으로 구성되어야 하는 각 문자열은 -D로 시작하고 이 대상의 컴파일 명령줄과 이 대상에 종속된 모든 규칙에 추가됩니다. 광범위한 영향을 미칠 수 있으므로 주의해야 합니다. 확실하지 않은 경우 정의 값을 local_defines에 추가합니다.
hdrs_check

문자열, 기본값은 ""입니다.

지원 중단됨, 무작위 작업
implementation_deps

라벨 목록입니다. 기본값은 []입니다.

라이브러리 타겟이 종속되는 다른 라이브러리의 목록입니다. deps와 달리 이러한 라이브러리의 헤더 및 포함 경로 (및 모든 전이 종속 항목)는 이 라이브러리에 종속된 라이브러리가 아닌 이 라이브러리의 컴파일에만 사용됩니다. implementation_deps로 지정된 라이브러리는 이 라이브러리에 종속된 바이너리 타겟에 계속 연결됩니다.
include_prefix

문자열, 기본값은 ""입니다.

이 규칙의 헤더 경로에 추가할 접두사입니다.

이 속성을 설정하면 이 규칙의 hdrs 속성 헤더에 액세스할 수 있으며, 이 속성의 값이 저장소 상대 경로 앞에 추가됩니다.

이 접두사가 추가되기 전에 strip_include_prefix 속성의 접두사가 삭제됩니다.

이 속성은 third_party에서만 유효합니다.

includes

문자열 목록입니다. 기본값은 []입니다.

컴파일 줄에 추가할 포함 디렉터리의 목록입니다. '변수 만들기' 대체가 적용됩니다. 각 문자열 앞에 패키지 경로가 추가되고 'include_paths' CROSSTOOL 기능을 통해 확장되도록 C++ 도구 모음에 전달됩니다. 일반적인 기능 정의가 있는 POSIX 시스템에서 실행되는 도구 모음은 -isystem path_to_package/include_entry를 생성합니다. 이는 #include 문을 작성하는 Google 스타일을 따르지 않는 서드 파티 라이브러리에만 사용해야 합니다. COPTS와 달리 이러한 플래그는 이 규칙과 이 규칙에 종속된 모든 규칙에 추가됩니다. (참고: 종속되는 규칙이 아닙니다.) 광범위한 영향을 미칠 수 있으므로 매우 주의해야 합니다. 확실하지 않다면 COPTS에 '-I' 플래그를 추가하세요.

추가된 include 경로에는 소스 트리의 파일뿐만 아니라 생성된 파일도 포함됩니다.

linkopts

문자열 목록입니다. 기본값은 []입니다.

cc_binary.linkopts을 참고하세요. linkopts 속성은 deps 속성을 통해 (또는 유사하게 처리되는 다른 속성: cc_binarymalloc 속성을 통해) 이 라이브러리에 직접 또는 간접적으로 종속되는 모든 타겟에도 적용됩니다. 종속 항목 linkopts는 종속 linkopts보다 우선 적용됩니다 (즉, 종속 항목 linkopts는 명령줄에 나중에 표시됨). --linkopt에 지정된 Linkopts는 규칙 Linkopts보다 우선 적용됩니다.

linkopts 속성은 .a 또는 .lo 파일을 만들 때가 아니라 .so 파일 또는 실행 파일을 만들 때만 적용됩니다. 따라서 linkstatic=True 속성이 설정된 경우 linkopts 속성은 이 라이브러리의 생성에 영향을 미치지 않으며 이 라이브러리에 종속된 다른 타겟에만 영향을 미칩니다.

또한 '-Wl,-soname' 또는 '-Xlinker -soname' 옵션은 지원되지 않으며 이 속성에서 지정해서는 안 됩니다.

cc_library 규칙에 의해 생성된 .so 파일은 종속되는 라이브러리에 연결되지 않습니다. dlopen() 또는 LD_PRELOAD와 함께 수동으로 사용하기 위해 기본 저장소 외부에서 사용할 공유 라이브러리를 만들려는 경우 linkshared=True 속성과 함께 cc_binary 규칙을 사용하는 것이 좋습니다. cc_binary.linkshared를 참조하세요.

linkstamp

라벨: 기본값은 None입니다.

지정된 C++ 소스 파일을 동시에 컴파일하고 최종 바이너리에 연결합니다. 이 트릭은 바이너리에 타임스탬프 정보를 도입하는 데 필요합니다. 일반적인 방식으로 소스 파일을 객체 파일로 컴파일하면 타임스탬프가 잘못됩니다. 링크 스탬프 컴파일에는 특정 컴파일러 플래그 세트가 포함되지 않을 수 있으므로 특정 헤더, 컴파일러 옵션 또는 기타 빌드 변수에 종속되어서는 안 됩니다. 이 옵션은 base 패키지에서만 필요합니다.
linkstatic

불리언. 기본값은 False입니다.

cc_binarycc_test의 경우 바이너리를 정적인 모드로 연결합니다. cc_library.link_static: 아래를 참고하세요.

이 옵션은 기본적으로 cc_binary에 대해 사용 설정되어 있고 나머지에는 사용 중지되어 있습니다.

이 옵션을 사용 설정하고 바이너리 또는 테스트인 경우 빌드 도구에 가능한 경우 사용자 라이브러리에 .so 대신 .a를 연결하도록 지시합니다. libc와 같은 시스템 라이브러리 (아래 참고, C/C++ 런타임 라이브러리는 아님)는 정적 라이브러리가 없는 라이브러리와 마찬가지로 여전히 동적으로 연결됩니다. 따라서 결과 실행 파일은 여전히 동적으로 연결되므로 대부분 정적입니다.

실행 파일을 연결하는 방법에는 세 가지가 있습니다.

  • 모든 항목이 정적으로 연결되는 fully_static_link 기능이 있는 STATIC(예: 'gcc -static foo.o libbar.a libbaz.a -lm').
    이 모드는 features 속성에 fully_static_link를 지정하여 사용 설정할 수 있습니다.
  • STATIC: 모든 사용자 라이브러리가 정적으로 연결되지만(정적 버전을 사용할 수 있는 경우) 시스템 라이브러리(C/C++ 런타임 라이브러리 제외)는 동적으로 연결됩니다(예: 'gcc foo.o libfoo.a libbaz.a -lm').
    이 모드는 linkstatic=True를 지정하여 사용 설정합니다.
  • DYNAMIC: 모든 라이브러리가 동적으로 연결됩니다 (동적 버전을 사용할 수 있는 경우). 예: 'gcc foo.o libfoo.so libbaz.so -lm'.
    이 모드는 linkstatic=False를 지정하여 사용 설정합니다.

featureslinkstatic 속성 또는 fully_static_link//third_party 외부에서 사용되는 경우 규칙 근처에 이유를 설명하는 주석을 포함하세요.

linkstatic 속성은 cc_library() 규칙에 사용되는 경우 의미가 다릅니다. C++ 라이브러리의 경우 linkstatic=True는 정적 연결만 허용됨을 나타내므로 .so가 생성되지 않습니다. linkstatic=False는 정적 라이브러리가 생성되는 것을 방지하지는 않습니다. 이 속성은 동적 라이브러리 생성을 제어하기 위한 것입니다.

프로덕션에서는 linkstatic=False로 빌드된 코드가 거의 없어야 합니다. linkstatic=False인 경우 빌드 도구는 *.runfiles 영역에서 종속 항목인 공유 라이브러리에 대한 심볼릭 링크를 만듭니다.

local_defines

문자열 목록입니다. 기본값은 []입니다.

컴파일 줄에 추가할 정의 목록입니다. 'Make' 변수 대체 및 Bourne 셸 토큰화가 적용됩니다. 단일 Bourne 셸 토큰으로 구성되어야 하는 각 문자열은 -D로 시작하고 이 타겟의 컴파일 명령줄에 추가되지만 종속 항목에는 추가되지 않습니다.
module_interfaces

라벨 목록입니다. 기본값은 []입니다.

파일 목록은 C++20 모듈 인터페이스로 간주됩니다.

C++ 표준에 모듈 인터페이스 파일 확장자에 관한 제한사항이 없음

  • Clang에서 cppm 사용
  • GCC는 모든 소스 파일 확장자를 사용할 수 있습니다.
  • MSVC에서 ixx 사용

사용은 --experimental_cpp_modules 플래그로 보호됩니다.

strip_include_prefix

문자열, 기본값은 ""입니다.

이 규칙의 헤더 경로에서 제거할 접두사입니다.

이 옵션을 설정하면 이 규칙의 hdrs 속성의 헤더에 이 접두사가 잘린 경로에서 액세스할 수 있습니다.

상대 경로인 경우 패키지 상대 경로로 간주됩니다. 절대 경로인 경우 저장소 상대 경로로 이해됩니다.

include_prefix 속성의 접두사는 이 접두사가 제거된 후에 추가됩니다.

이 속성은 third_party에서만 유효합니다.

textual_hdrs

라벨 목록입니다. 기본값은 []입니다.

종속 규칙의 소스에서 텍스트로 포함할 이 라이브러리에서 게시한 헤더 파일 목록입니다.

이 위치는 단독으로 컴파일할 수 없는 헤더 파일을 선언하는 위치입니다. 즉, 유효한 코드를 빌드하려면 항상 다른 소스 파일에 의해 텍스트로 포함되어야 합니다.

win_def_file

라벨: 기본값은 None입니다.

링커에 전달할 Windows DEF 파일입니다.

이 속성은 Windows가 대상 플랫폼인 경우에만 사용해야 합니다. 공유 라이브러리 연결 중에 기호를 내보내기하는 데 사용할 수 있습니다.

cc_shared_library

규칙 소스 보기
cc_shared_library(name, deps, additional_linker_inputs, compatible_with, deprecation, distribs, dynamic_deps, exec_compatible_with, exec_properties, exports_filter, features, restricted_to, roots, shared_lib_name, static_deps, tags, target_compatible_with, testonly, toolchains, user_link_flags, visibility, win_def_file)

공유 라이브러리를 생성합니다.

cc_shared_library(
    name = "foo_shared",
    deps = [
        ":foo",
    ],
    dynamic_deps = [
        ":bar_shared",
    ],
    additional_linker_inputs = [
        ":foo.lds",
    ],
    user_link_flags = [
        "-Wl,--version-script=$(location :foo.lds)",
    ],
)
cc_library(
    name = "foo",
    srcs = ["foo.cc"],
    hdrs = ["foo.h"],
    deps = [
        ":bar",
        ":baz",
    ],
)
cc_shared_library(
    name = "bar_shared",
    shared_lib_name = "bar.so",
    deps = [":bar"],
)
cc_library(
    name = "bar",
    srcs = ["bar.cc"],
    hdrs = ["bar.h"],
)
cc_library(
    name = "baz",
    srcs = ["baz.cc"],
    hdrs = ["baz.h"],
)

이 예에서 foo_sharedfoobaz를 정적으로 연결하며, 후자는 전이 종속 항목입니다. bar는 이미 dynamic_dep bar_shared에 의해 동적으로 제공되므로 연결하지 않습니다.

foo_shared는 링커 스크립트 *.lds 파일을 사용하여 내보낼 기호를 제어합니다. cc_shared_library 규칙 로직은 내보내는 기호를 제어하지 않으며, 두 공유 라이브러리가 동일한 타겟을 내보내는 경우 분석 단계에서 오류를 발생시키기 위해 내보내기로 가정된 기호만 사용합니다.

cc_shared_library의 모든 직접 종속 항목은 내보내기로 간주됩니다. 따라서 Bazel은 분석 중에 foofoo_shared에 의해 내보내지고 있다고 가정합니다. bazfoo_shared에 의해 내보내지는 것으로 가정되지 않습니다. exports_filter와 일치하는 모든 타겟도 내보낸 것으로 간주됩니다.

예시의 모든 cc_library는 최대 1개의 cc_shared_library에 표시되어야 합니다. bazbar_shared에 연결하려면 baztags = ["LINKABLE_MORE_THAN_ONCE"]를 추가해야 합니다.

shared_lib_name 속성으로 인해 bar_shared로 생성된 파일의 이름은 Linux에서 기본적으로 사용하는 libbar.so가 아닌 bar.so입니다.

오류

Two shared libraries in dependencies export the same symbols.

동일한 타겟을 내보내는 두 개의 서로 다른 cc_shared_library 종속 항목이 있는 타겟을 만들 때마다 이 문제가 발생합니다. 이 문제를 해결하려면 cc_shared_library 종속 항목 중 하나에서 라이브러리가 내보내지 않도록 해야 합니다.

동일한 타겟을 정적으로 연결하는 두 가지 cc_shared_library 종속 항목이 있는 새 cc_shared_library를 만들 때마다 이 문제가 발생합니다. 내보내기 오류와 유사합니다.

이 문제를 해결하는 한 가지 방법은 라이브러리를 cc_shared_library 종속 항목 중 하나에 연결하지 않는 것입니다. 동시에 여전히 연결하는 쪽은 라이브러리를 내보내야 연결하지 않는 쪽에서 기호를 볼 수 있습니다. 타겟을 내보내는 서드 파티 라이브러리를 가져오는 것도 또 다른 방법입니다. 세 번째 방법은 문제의 cc_libraryLINKABLE_MORE_THAN_ONCE 태그를 지정하는 것입니다. 하지만 이 수정사항은 드물게 사용해야 하며 cc_library를 두 번 이상 연결해도 안전한지 반드시 확인해야 합니다.

'//foo:foo' is already linked statically in '//bar:bar' but not exported`

즉, deps의 전이 폐쇄에 있는 라이브러리는 cc_shared_library 종속 항목 중 하나를 거치지 않고도 도달할 수 있지만 이미 dynamic_deps의 다른 cc_shared_library에 연결되어 있으며 내보내지 않습니다.

해결 방법은 cc_shared_library 종속 항목에서 내보내거나 내보내는 서드 파티 cc_shared_library를 가져오는 것입니다.

Do not place libraries which only contain a precompiled dynamic library in deps.

사전 컴파일된 동적 라이브러리가 있는 경우 이를 현재 만들고 있는 현재 cc_shared_library 타겟에 정적으로 연결할 필요가 없으며 연결할 수도 없습니다. 따라서 cc_shared_librarydeps에 속하지 않습니다. 이 사전 컴파일된 동적 라이브러리가 cc_libraries 중 하나의 종속 항목인 경우 cc_library는 이 라이브러리에 직접 종속되어야 합니다.

Trying to export a library already exported by a different shared library

현재 규칙에서 동적 종속 항목 중 하나에 의해 이미 내보내지고 있는 타겟을 내보내겠다고 선언하는 경우 이 오류가 표시됩니다.

이 문제를 해결하려면 deps에서 타겟을 삭제하고 동적 종속 항목에서만 타겟을 사용하거나 exports_filter가 이 타겟을 포착하지 않도록 합니다.

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

deps

라벨 목록입니다. 기본값은 []입니다.

전체 보관처리된 후 무조건 공유 라이브러리에 정적으로 연결되는 최상위 라이브러리입니다.

이러한 직접 종속 항목의 모든 전이 종속 항목은 dynamic_depscc_shared_library로 아직 연결되지 않은 한 이 공유 라이브러리에 연결됩니다.

분석 중에 규칙 구현은 여러 cc_shared_libraries가 동일한 타겟을 내보낼 때 오류를 표시하기 위해 deps에 나열된 모든 타겟을 공유 라이브러리에서 내보낸 것으로 간주합니다. 규칙 구현은 공유 객체에서 내보내야 하는 기호를 링커에 알리지 않습니다. 사용자는 소스 코드의 링커 스크립트 또는 공개 상태 선언을 통해 이를 처리해야 합니다.

또한 동일한 라이브러리가 두 개 이상의 cc_shared_library에 정적으로 연결될 때마다 구현에서 오류가 트리거됩니다. "LINKABLE_MORE_THAN_ONCE"cc_library.tags에 추가하거나 `cc_library` 를 공유 라이브러리 중 하나의 내보내기로 나열하여 하나를 다른 라이브러리의 dynamic_dep로 만들 수 있도록 하면 이를 방지할 수 있습니다.

additional_linker_inputs

라벨 목록입니다. 기본값은 []입니다.

링커에 전달할 수 있는 추가 파일(예: 링커 스크립트) 링커가 이 파일을 인식하는 데 필요한 링커 플래그를 별도로 전달해야 합니다. user_link_flags 속성을 통해 할 수 있습니다.
dynamic_deps

라벨 목록입니다. 기본값은 []입니다.

현재 타겟이 종속되는 다른 cc_shared_library 종속 항목입니다.

cc_shared_library 구현은 dynamic_deps 목록 (전이적으로, 즉 현재 타겟의 dynamic_depsdynamic_deps)을 사용하여 전이 depscc_libraries 중 이미 다른 cc_shared_library에서 제공되었으므로 연결해서는 안 되는 cc_libraries를 결정합니다.

exports_filter

문자열 목록입니다. 기본값은 []입니다.

이 속성에는 현재 공유 라이브러리에서 내보낸다고 주장하는 타겟 목록이 포함됩니다.

모든 대상 deps은 이미 공유 라이브러리에서 내보낸 것으로 간주됩니다. 이 속성은 공유 라이브러리에서 내보내지만 deps의 전이 종속 항목인 타겟을 나열하는 데 사용해야 합니다.

이 속성은 실제로 이러한 타겟에 종속 항목 가장자리를 추가하지 않습니다. 대신 종속 항목 가장자리는 deps에서 만들어야 합니다. 이 속성의 항목은 문자열일 뿐입니다. 이 속성에 타겟을 배치하면 공유 라이브러리가 해당 타겟에서 기호를 내보낸다고 주장하는 것으로 간주됩니다. cc_shared_library 로직은 실제로 링커에 내보내야 할 기호를 알려주지 않습니다.

다음 구문은 허용됩니다.

//foo:__pkg__: foo/BUILD의 모든 대상 고려

//foo:__subpackages__: foo/BUILD의 타겟 또는 foo 아래의 다른 패키지(예: foo/bar/BUILD)를 고려합니다.

roots

라벨 목록입니다. 기본값은 []입니다.

shared_lib_name

문자열, 기본값은 ""입니다.

기본적으로 cc_shared_library는 타겟 이름과 플랫폼을 기반으로 공유 라이브러리 출력 파일의 이름을 사용합니다. 여기에는 확장자가 포함되며 접두사가 포함되는 경우도 있습니다. 기본 이름을 원하지 않는 경우도 있습니다. 예를 들어 Python용 C++ 공유 라이브러리를 로드할 때 기본 lib* 접두사는 바람직하지 않은 경우가 많습니다. 이 경우 이 속성을 사용하여 맞춤 이름을 선택할 수 있습니다.
static_deps

문자열 목록입니다. 기본값은 []입니다.

문자열 목록입니다. 기본값은 []입니다.

링커에 전달할 추가 플래그입니다. 예를 들어 additional_linker_inputs를 통해 전달된 링커 스크립트를 링커가 인식하도록 하려면 다음을 사용할 수 있습니다.

 cc_shared_library(
    name = "foo_shared",
    additional_linker_inputs = select({
      "//src/conditions:linux": [
        ":foo.lds",
        ":additional_script.txt",
      ],
      "//conditions:default": []}),
    user_link_flags = select({
      "//src/conditions:linux": [
        "-Wl,-rpath,kittens",
        "-Wl,--version-script=$(location :foo.lds)",
        "-Wl,--script=$(location :additional_script.txt)",
      ],
      "//conditions:default": []}),
      ...
 )
win_def_file

라벨: 기본값은 None입니다.

링커에 전달할 Windows DEF 파일입니다.

이 속성은 Windows가 대상 플랫폼인 경우에만 사용해야 합니다. 공유 라이브러리 연결 중에 기호를 내보내기하는 데 사용할 수 있습니다.

cc_static_library

규칙 소스 보기
cc_static_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
이 규칙은 현재 실험용이며 --experimental_cc_static_library 플래그와 함께만 사용할 수 있습니다. 타겟 목록과 그들의 전이 종속 항목에서 정적 라이브러리를 생성합니다.

결과 정적 라이브러리에는 deps에 나열된 타겟의 객체 파일과 그 전이 종속 항목이 포함되며, PIC 객체가 우선 적용됩니다.

출력 그룹

linkdeps

정적 라이브러리에 객체 파일을 제공하지 않았지만 하나 이상의 정적, 동적 또는 인터페이스 라이브러리를 제공하는 deps에 나열된 대상의 전이 종속 항목 라벨이 포함된 텍스트 파일입니다. 결과 정적 라이브러리에는 이러한 라이브러리가 연결 시간에 제공되어야 할 수 있습니다.

linkopts

deps에 나열된 타겟의 모든 전이 종속 항목에 관한 사용자 제공 linkopts가 포함된 텍스트 파일입니다.

중복 기호

기본적으로 cc_static_library 규칙은 결과 정적 라이브러리에 중복 기호가 포함되어 있지 않은지 확인합니다. 중복 기호가 있는 경우 중복 기호와 이를 포함하는 객체 파일이 나열된 오류 메시지와 함께 빌드가 실패합니다.

이 검사는 features = ["-symbol_check"]를 설정하거나 --features=-symbol_check를 통해 전역적으로 설정하여 타겟 또는 패키지별로 사용 중지할 수 있습니다.

symbol_check용 도구 모음 지원

Bazel과 함께 제공되는 자동 구성된 C++ 도구 모음은 모든 플랫폼에서 symbol_check 기능을 지원합니다. 맞춤 도구 모음은 다음 두 가지 방법 중 하나로 이를 지원할 수 있습니다.

  • ACTION_NAMES.validate_static_library 작업을 구현하고 symbol_check 기능으로 사용 설정합니다. 작업에 설정된 도구는 중복 기호를 확인할 정적인 라이브러리와 검사가 통과하면 생성해야 하는 파일의 경로라는 두 가지 인수로 호출됩니다.
  • symbol_check 기능이 중복 기호에서 정적 라이브러리를 만드는 작업이 실패하도록 하는 보관소 플래그를 추가합니다.

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

deps

라벨 목록입니다. 기본값은 []입니다.

모든 전이 종속 항목을 포함하여 정적 라이브러리로 결합할 타겟 목록입니다.

객체 파일을 제공하지 않는 종속 항목은 정적 라이브러리에 포함되지 않지만 라벨은 linkdeps 출력 그룹에서 제공하는 파일에서 수집됩니다.

cc_test

규칙 소스 보기
cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, distribs, dynamic_deps, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local, local_defines, malloc, module_interfaces, nocopts, reexport_deps, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)

cc_test() 규칙은 테스트를 컴파일합니다. 여기서 테스트는 일부 테스트 코드를 둘러싼 바이너리 래퍼입니다.

기본적으로 C++ 테스트는 동적으로 연결됩니다.
단위 테스트를 정적으로 연결하려면 linkstatic=True를 지정합니다. 테스트에 linkstatic가 필요한 이유를 주석으로 달면 좋습니다. 이 부분은 명확하지 않을 수 있습니다.

암시적 출력 타겟

  • name.stripped (명시적으로 요청된 경우에만 빌드됨): 바이너리의 제거된 버전입니다. strip -g는 바이너리에서 실행되어 디버그 기호를 삭제합니다. --stripopt=-foo를 사용하여 명령줄에 추가 스트립 옵션을 제공할 수 있습니다.
  • name.dwp (명시적으로 요청된 경우에만 빌드됨): Fission이 사용 설정된 경우: 원격으로 배포된 바이너리를 디버그하는 데 적합한 디버그 정보 패키지 파일입니다. 그 외의 경우: 빈 파일입니다.

cc_binary() 인수를 참고하세요. 단, stamp 인수는 테스트의 경우 기본적으로 0으로 설정되고 cc_test에는 추가 모든 테스트 규칙 (*_test)에 공통적인 속성이 있습니다.

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

deps

라벨 목록입니다. 기본값은 []입니다.

바이너리 타겟에 연결할 다른 라이브러리의 목록입니다.

cc_library 또는 objc_library 타겟일 수 있습니다.

링커 스크립트 (.lds)를 종속 항목에 배치하고 linkopts에서 참조할 수도 있습니다.
srcs

라벨 목록입니다. 기본값은 []입니다.

라이브러리 타겟을 만들기 위해 처리되는 C 및 C++ 파일 목록입니다. 생성되지 않은 C/C++ 소스 및 헤더 파일 (일반 소스 코드) 또는 생성된 C/C++ 소스 및 헤더 파일입니다.

모든 .cc, .c, .cpp 파일이 컴파일됩니다. 생성된 파일일 수 있습니다. 이름이 지정된 파일이 다른 규칙의 outs에 있는 경우 이 cc_library는 자동으로 해당 다른 규칙에 종속됩니다.

순수 어셈블러 파일 (.s, .asm)은 사전 처리되지 않으며 일반적으로 어셈블러를 사용하여 빌드됩니다. 사전 처리된 어셈블리 파일 (.S)은 사전 처리되며 일반적으로 C/C++ 컴파일러를 사용하여 빌드됩니다.

.h 파일은 컴파일되지 않지만 이 규칙의 소스에서 포함할 수 있습니다. .cc.h 파일 모두 이러한 srcs 또는 이 규칙의 hdrs 또는 deps 인수에 나열된 규칙에 나열된 헤더를 직접 포함할 수 있습니다.

모든 #included 파일은 이 규칙 또는 참조된 cc_library 규칙의 hdrs 속성에 언급되어야 하며, 이 라이브러리에 비공개인 경우 srcs에 나열되어야 합니다. 자세한 내용은 '헤더 포함 검사'를 참고하세요.

.so, .lo, .a 파일은 사전 컴파일된 파일입니다. 소스 코드가 없는 서드 파티 코드를 사용하는 라이브러리에는 이러한 항목이 srcs로 표시될 수 있습니다.

srcs 속성에 다른 규칙의 라벨이 포함된 경우 cc_library는 컴파일할 소스 파일로 해당 규칙의 출력 파일을 사용합니다. 일회성 소스 코드 생성에 유용합니다. 가끔 사용하는 경우 Starlark 규칙 클래스를 구현하고 cc_common API를 사용하는 것이 좋습니다.

허용되는 srcs 파일 형식은 다음과 같습니다.

  • C 및 C++ 소스 파일: .c, .cc, .cpp, .cxx, .c++, .C
  • C 및 C++ 헤더 파일: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • C 프리프로세서가 있는 어셈블러: .S
  • 보관처리: .a, .pic.a
  • '항상 연결' 라이브러리: .lo, .pic.lo
  • 버전이 지정되거나 지정되지 않은 공유 라이브러리: .so, .so.version
  • 객체 파일: .o, .pic.o

... 및 이러한 파일을 생성하는 모든 규칙 (예: cc_embed_data)을 나타냅니다. 확장자가 다르면 gcc 규칙에 따라 프로그래밍 언어가 다르게 표시됩니다.

data

라벨 목록입니다. 기본값은 []입니다.

런타임 시 이 라이브러리에 필요한 파일 목록입니다. data에 관한 일반적인 설명은 대부분의 빌드 규칙에서 정의하는 일반적인 속성을 참고하세요.

data이 생성된 파일의 이름인 경우 이 cc_library 규칙은 생성 규칙에 자동으로 종속됩니다.

data가 규칙 이름인 경우 이 cc_library 규칙은 자동으로 해당 규칙에 종속되며 해당 규칙의 outs가 이 cc_library의 데이터 파일에 자동으로 추가됩니다.

C++ 코드는 다음과 같이 이러한 데이터 파일에 액세스할 수 있습니다.


  const std::string path = devtools_build::GetDataDependencyFilepath(
      "my/test/data/file");
additional_linker_inputs

라벨 목록입니다. 기본값은 []입니다.

이러한 파일을 C++ 링커 명령어에 전달합니다.

예를 들어 컴파일된 Windows .res 파일을 여기에 제공하여 바이너리 타겟에 삽입할 수 있습니다.

conlyopts

문자열 목록입니다. 기본값은 []입니다.

C 컴파일 명령어에 이러한 옵션을 추가합니다. 'Make 변수' 대체 및 Bourne 셸 토큰화가 적용됩니다.
copts

문자열 목록입니다. 기본값은 []입니다.

C/C++ 컴파일 명령어에 이러한 옵션을 추가합니다. 'Make 변수' 대체 및 Bourne 셸 토큰화가 적용됩니다.

이 속성의 각 문자열은 바이너리 타겟을 컴파일하기 전에 지정된 순서대로 COPTS에 추가됩니다. 플래그는 이 타겟을 컴파일할 때만 적용되며 종속 항목에는 적용되지 않으므로 다른 위치에 포함된 헤더 파일에 주의하세요. 모든 경로는 현재 패키지가 아닌 작업공간을 기준으로 해야 합니다. 이 속성은 third_party 외부에서 필요하지 않습니다.

패키지가 기능 no_copts_tokenization을 선언하는 경우 Bourne 셸 토큰화는 단일 'Make' 변수로 구성된 문자열에만 적용됩니다.

cxxopts

문자열 목록입니다. 기본값은 []입니다.

C++ 컴파일 명령어에 이러한 옵션을 추가합니다. 'Make 변수' 대체 및 Bourne 셸 토큰화가 적용됩니다.
defines

문자열 목록입니다. 기본값은 []입니다.

컴파일 줄에 추가할 정의 목록입니다. 'Make' 변수 대체 및 Bourne 셸 토큰화가 적용됩니다. 단일 Bourne 셸 토큰으로 구성되어야 하는 각 문자열은 -D로 시작하고 이 대상의 컴파일 명령줄과 이 대상에 종속된 모든 규칙에 추가됩니다. 광범위한 영향을 미칠 수 있으므로 주의해야 합니다. 확실하지 않은 경우 정의 값을 local_defines에 추가합니다.
dynamic_deps

라벨 목록입니다. 기본값은 []입니다.

현재 타겟이 종속되는 다른 cc_shared_library 종속 항목입니다.

cc_shared_library 구현은 dynamic_deps 목록 (전이적으로, 즉 현재 타겟의 dynamic_depsdynamic_deps)을 사용하여 전이 depscc_libraries 중 이미 다른 cc_shared_library에서 제공되었으므로 연결해서는 안 되는 cc_libraries를 결정합니다.

hdrs_check

문자열, 기본값은 ""입니다.

지원 중단됨, 무작위 작업
includes

문자열 목록입니다. 기본값은 []입니다.

컴파일 줄에 추가할 포함 디렉터리의 목록입니다. '변수 만들기' 대체가 적용됩니다. 각 문자열 앞에 패키지 경로가 추가되고 'include_paths' CROSSTOOL 기능을 통해 확장되도록 C++ 도구 모음에 전달됩니다. 일반적인 기능 정의가 있는 POSIX 시스템에서 실행되는 도구 모음은 -isystem path_to_package/include_entry를 생성합니다. 이는 #include 문을 작성하는 Google 스타일을 따르지 않는 서드 파티 라이브러리에만 사용해야 합니다. COPTS와 달리 이러한 플래그는 이 규칙과 이 규칙에 종속된 모든 규칙에 추가됩니다. (참고: 종속되는 규칙이 아닙니다.) 광범위한 영향을 미칠 수 있으므로 매우 주의해야 합니다. 확실하지 않다면 COPTS에 '-I' 플래그를 추가하세요.

추가된 include 경로에는 소스 트리의 파일뿐만 아니라 생성된 파일도 포함됩니다.

라벨: 기본값은 "@bazel_tools//tools/cpp:link_extra_lib"입니다.

추가 라이브러리의 연결을 제어합니다.

기본적으로 C++ 바이너리는 기본적으로 라벨 플래그 //tools/cpp:link_extra_libs에 종속되는 //tools/cpp:link_extra_lib에 연결됩니다. 플래그를 설정하지 않으면 이 라이브러리는 기본적으로 비어 있습니다. 라벨 플래그를 설정하면 약한 기호 재정의, 공유 라이브러리 함수의 인터셉터, 특수 런타임 라이브러리 (malloc 대체의 경우 malloc 또는 --custom_malloc를 권장)와 같은 선택적 종속 항목을 연결할 수 있습니다. 이 속성을 None로 설정하면 이 동작이 사용 중지됩니다.

linkopts

문자열 목록입니다. 기본값은 []입니다.

C++ 링커 명령어에 다음 플래그를 추가합니다. 'Make' 변수 대체, Bourne 셸 토큰화, 라벨 확장이 적용됩니다. 이 속성의 각 문자열은 바이너리 타겟을 연결하기 전에 LINKOPTS에 추가됩니다.

이 목록에서 $ 또는 -로 시작하지 않는 각 요소는 deps의 타겟 라벨로 간주됩니다. 이 타겟에서 생성된 파일 목록이 링커 옵션에 추가됩니다. 라벨이 유효하지 않거나 deps에 선언되지 않은 경우 오류가 보고됩니다.

linkshared

불리언. 기본값은 False입니다.

공유 라이브러리를 만듭니다. 이 속성을 사용 설정하려면 규칙에 linkshared=True를 포함하세요. 이 옵션은 기본적으로 사용 중지되어 있습니다.

이 플래그가 있으면 -shared 플래그와 gcc 간에 연결이 발생하며, 결과 공유 라이브러리는 예를 들어 Java 프로그램에 로드하는 데 적합합니다. 그러나 빌드 목적으로는 종속 바이너리에 연결되지 않습니다. cc_binary 규칙으로 빌드된 공유 라이브러리는 다른 프로그램에서 수동으로만 로드된다고 가정되기 때문입니다. 따라서 cc_library 규칙의 대체로 간주해서는 안 됩니다. 확장성을 위해 이 접근 방식을 완전히 피하고 java_librarycc_library 규칙에 종속되도록 하는 것이 좋습니다.

linkopts=['-static']linkshared=True를 모두 지정하면 완전히 독립적인 단일 단위가 생성됩니다. linkstatic=Truelinkshared=True를 모두 지정하면 대부분 자체적으로 완결된 단일 단위가 생성됩니다.

linkstatic

불리언. 기본값은 False입니다.

cc_binarycc_test의 경우 바이너리를 정적인 모드로 연결합니다. cc_library.link_static: 아래를 참고하세요.

이 옵션은 기본적으로 cc_binary에 대해 사용 설정되어 있고 나머지에는 사용 중지되어 있습니다.

이 옵션을 사용 설정하고 바이너리 또는 테스트인 경우 빌드 도구에 가능한 경우 사용자 라이브러리에 .so 대신 .a를 연결하도록 지시합니다. libc와 같은 시스템 라이브러리 (아래 참고, C/C++ 런타임 라이브러리는 아님)는 정적 라이브러리가 없는 라이브러리와 마찬가지로 여전히 동적으로 연결됩니다. 따라서 결과 실행 파일은 여전히 동적으로 연결되므로 대부분 정적입니다.

실행 파일을 연결하는 방법에는 세 가지가 있습니다.

  • 모든 항목이 정적으로 연결되는 fully_static_link 기능이 있는 STATIC(예: 'gcc -static foo.o libbar.a libbaz.a -lm').
    이 모드는 features 속성에 fully_static_link를 지정하여 사용 설정할 수 있습니다.
  • STATIC: 모든 사용자 라이브러리가 정적으로 연결되지만(정적 버전을 사용할 수 있는 경우) 시스템 라이브러리(C/C++ 런타임 라이브러리 제외)는 동적으로 연결됩니다(예: 'gcc foo.o libfoo.a libbaz.a -lm').
    이 모드는 linkstatic=True를 지정하여 사용 설정합니다.
  • DYNAMIC: 모든 라이브러리가 동적으로 연결됩니다 (동적 버전을 사용할 수 있는 경우). 예: 'gcc foo.o libfoo.so libbaz.so -lm'.
    이 모드는 linkstatic=False를 지정하여 사용 설정합니다.

featureslinkstatic 속성 또는 fully_static_link//third_party 외부에서 사용되는 경우 규칙 근처에 이유를 설명하는 주석을 포함하세요.

linkstatic 속성은 cc_library() 규칙에 사용되는 경우 의미가 다릅니다. C++ 라이브러리의 경우 linkstatic=True는 정적 연결만 허용됨을 나타내므로 .so가 생성되지 않습니다. linkstatic=False는 정적 라이브러리가 생성되는 것을 방지하지는 않습니다. 이 속성은 동적 라이브러리 생성을 제어하기 위한 것입니다.

프로덕션에서는 linkstatic=False로 빌드된 코드가 거의 없어야 합니다. linkstatic=False인 경우 빌드 도구는 *.runfiles 영역에서 종속 항목인 공유 라이브러리에 대한 심볼릭 링크를 만듭니다.

local_defines

문자열 목록입니다. 기본값은 []입니다.

컴파일 줄에 추가할 정의 목록입니다. 'Make' 변수 대체 및 Bourne 셸 토큰화가 적용됩니다. 단일 Bourne 셸 토큰으로 구성되어야 하는 각 문자열은 -D로 시작하고 이 타겟의 컴파일 명령줄에 추가되지만 종속 항목에는 추가되지 않습니다.
malloc

라벨: 기본값은 "@bazel_tools//tools/cpp:malloc"입니다.

malloc의 기본 종속 항목을 재정의합니다.

기본적으로 C++ 바이너리는 빈 라이브러리인 //tools/cpp:malloc에 연결되므로 바이너리는 결국 libc malloc을 사용합니다. 이 라벨은 cc_library를 참조해야 합니다. 컴파일이 C++가 아닌 규칙을 위한 경우 이 옵션은 영향을 미치지 않습니다. linkshared=True가 지정된 경우 이 속성의 값은 무시됩니다.

module_interfaces

라벨 목록입니다. 기본값은 []입니다.

파일 목록은 C++20 모듈 인터페이스로 간주됩니다.

C++ 표준에 모듈 인터페이스 파일 확장자에 관한 제한사항이 없음

  • Clang에서 cppm 사용
  • GCC는 모든 소스 파일 확장자를 사용할 수 있습니다.
  • MSVC에서 ixx 사용

사용은 --experimental_cpp_modules 플래그로 보호됩니다.

nocopts

문자열, 기본값은 ""입니다.

C++ 컴파일 명령어에서 일치하는 옵션을 삭제합니다. 'Make' 변수 대체가 적용됩니다. 이 속성의 값은 정규 표현식으로 해석됩니다. 이 정규 표현식과 일치하는 기존 COPTS(규칙의 copts 속성에 명시적으로 지정된 값 포함)는 이 규칙을 컴파일하기 위해 COPTS에서 삭제됩니다. 이 속성은 third_party 외부에서 필요하거나 사용해서는 안 됩니다. 값은 'Make' 변수 대체 외의 방식으로 사전 처리되지 않습니다.
reexport_deps

라벨 목록입니다. 기본값은 []입니다.

stamp

정수, 기본값은 0

빌드 정보를 바이너리로 인코딩할지 여부입니다. 가능한 값은 다음과 같습니다.
  • stamp = 1: --nostamp 빌드에서도 항상 빌드 정보를 바이너리에 스탬프합니다. 바이너리 및 바이너리에 종속된 모든 다운스트림 작업의 원격 캐싱을 중단할 수 있으므로 이 설정은 피해야 합니다.
  • stamp = 0: 항상 빌드 정보를 상수 값으로 대체합니다. 이렇게 하면 빌드 결과 캐싱이 향상됩니다.
  • stamp = -1: 빌드 정보의 삽입은 --[no]stamp 플래그에 의해 제어됩니다.

스탬프가 지정된 바이너리는 종속 항목이 변경되지 않는 한 다시 빌드되지 않습니다.

win_def_file

라벨: 기본값은 None입니다.

링커에 전달할 Windows DEF 파일입니다.

이 속성은 Windows가 대상 플랫폼인 경우에만 사용해야 합니다. 공유 라이브러리 연결 중에 기호를 내보내기하는 데 사용할 수 있습니다.

cc_toolchain

규칙 소스 보기
cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, toolchains, visibility)

C++ 도구 모음을 나타냅니다.

이 규칙은 다음을 담당합니다.

  • C++ 작업 실행에 필요한 모든 아티팩트를 수집합니다. 이는 all_files, compiler_files, linker_files 또는 _files로 끝나는 기타 속성과 같은 속성을 통해 이루어집니다. 이러한 속성은 가장 일반적으로 모든 필수 파일을 글로빙하는 파일 그룹입니다.
  • C++ 작업에 맞는 올바른 명령줄을 생성합니다. 이는 CcToolchainConfigInfo 제공업체를 사용하여 실행됩니다 (아래 세부정보 참고).

toolchain_config 속성을 사용하여 C++ 도구 모음을 구성합니다. 자세한 C++ 도구 모음 구성 및 도구 모음 선택 문서는 이 페이지 를 참고하세요.

bazel build //...를 호출할 때 도구 모음이 불필요하게 빌드되고 구성되지 않도록 하려면 tags = ["manual"]를 사용하세요.

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

all_files

라벨: 필수사항

모든 cc_toolchain 아티팩트 모음입니다. 이러한 아티팩트는 아래 속성의 더 정확한 아티팩트 세트를 사용하는 작업을 제외하고 모든 rules_cc 관련 작업에 입력으로 추가됩니다. Bazel은 all_files가 다른 모든 아티팩트 제공 속성의 상위 집합이라고 가정합니다 (예: 링크 스탬프 컴파일에는 컴파일 파일과 링크 파일 모두 필요하므로 all_files가 사용됨).

여기에는 cc_toolchain.files가 포함되며 C++ 도구 모음을 사용하는 모든 Starlark 규칙에서 사용됩니다.

ar_files

라벨: 기본값은 None입니다.

보관처리 작업에 필요한 모든 cc_toolchain 아티팩트 모음입니다.
as_files

라벨: 기본값은 None입니다.

조합 작업에 필요한 모든 cc_toolchain 아티팩트 모음입니다.
compiler_files

라벨: 필수사항

컴파일 작업에 필요한 모든 cc_toolchain 아티팩트 모음입니다.
compiler_files_without_includes

라벨: 기본값은 None입니다.

입력 검색이 지원되는 경우 (현재 Google만 해당) 컴파일 작업에 필요한 모든 cc_toolchain 아티팩트를 수집합니다.
coverage_files

라벨: 기본값은 None입니다.

노출 영역 작업에 필요한 모든 cc_toolchain 아티팩트 모음입니다. 지정하지 않으면 all_files가 사용됩니다.
dwp_files

라벨: 필수사항

dwp 작업에 필요한 모든 cc_toolchain 아티팩트 모음입니다.
dynamic_runtime_lib

라벨: 기본값은 None입니다.

C++ 런타임 라이브러리의 동적 라이브러리 아티팩트 (예: libstdc++.so)

이는 'static_link_cpp_runtimes' 기능이 사용 설정되어 있고 종속 항목을 동적으로 연결하는 경우에 사용됩니다.

exec_transition_for_inputs

불리언. 기본값은 False입니다.

지원 중단되었습니다. 작업 없음
libc_top

라벨: 기본값은 None입니다.

컴파일/링크 작업에 입력으로 전달되는 libc용 아티팩트 모음입니다.
linker_files

라벨: 필수사항

연결 작업에 필요한 모든 cc_toolchain 아티팩트 모음입니다.
module_map

라벨: 기본값은 None입니다.

모듈식 빌드에 사용되는 모듈 맵 아티팩트입니다.
objcopy_files

라벨: 필수사항

objcopy 작업에 필요한 모든 cc_toolchain 아티팩트 모음입니다.
output_licenses

문자열 목록입니다. 기본값은 []입니다.

static_runtime_lib

라벨: 기본값은 None입니다.

C++ 런타임 라이브러리의 정적 라이브러리 아티팩트 (예: libstdc++.a)입니다.

이는 'static_link_cpp_runtimes' 기능이 사용 설정되어 있고 종속 항목을 정적으로 연결하는 경우에 사용됩니다.

strip_files

라벨: 필수사항

스트립 작업에 필요한 모든 cc_toolchain 아티팩트 모음입니다.
supports_header_parsing

불리언. 기본값은 False입니다.

cc_toolchain이 헤더 파싱 작업을 지원하는 경우 true로 설정합니다.
supports_param_files

불리언. 기본값은 True입니다.

cc_toolchain이 연결 작업에 param 파일 사용을 지원하는 경우 True로 설정합니다.
toolchain_config

라벨: 필수사항

cc_toolchain_config_info를 제공하는 규칙의 라벨입니다.
toolchain_identifier

문자열, 기본값은 ""입니다.

이 cc_toolchain을 상응하는 crosstool_config.toolchain과 일치시키는 데 사용되는 식별자입니다.

#5380 문제가 해결될 때까지 cc_toolchainCROSSTOOL.toolchain에 연결하는 권장 방법입니다. toolchain_config 속성 (#5380)으로 대체됩니다.

cc_toolchain_suite

규칙 소스 보기
cc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

지원 중단됨: 이 규칙은 무작위 작업이며 삭제될 예정입니다.

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

fdo_prefetch_hints

규칙 소스 보기
fdo_prefetch_hints(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

워크스페이스에 있는 FDO 미리 가져오기 힌트 프로필을 나타냅니다. 예:


fdo_prefetch_hints(
    name = "hints",
    profile = "//path/to/hints:profile.afdo",
)

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

profile

라벨: 필수사항

힌트 프로필의 라벨입니다. 힌트 파일의 확장자는 .afdo입니다. 라벨은 fdo_absolute_path_profile 규칙을 가리킬 수도 있습니다.

fdo_profile

규칙 소스 보기
fdo_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, memprof_profile, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

워크스페이스에 있는 FDO 프로필을 나타냅니다. 예:


fdo_profile(
    name = "fdo",
    profile = "//path/to/fdo:profile.zip",
)

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

memprof_profile

라벨: 기본값은 None입니다.

MemProf 프로필의 라벨입니다. 프로필에는 .profdata 확장자 (색인이 생성되거나 기호화된 memprof 프로필의 경우) 또는 memprof .profdata 파일이 포함된 zip 파일의 경우.zip 확장자가 있어야 합니다.
profile

라벨: 필수사항

FDO 프로필의 라벨 또는 이를 생성하는 규칙입니다. FDO 파일은 색인이 생성되지 않은 LLVM 프로필의 경우 .profraw, 색인이 생성된 LLVM 프로필의 경우 .profdata, LLVM profraw 프로필을 보유한 .zip, AutoFDO 프로필의 경우 .afdo, XBinary 프로필의 경우 .xfdo 확장자 중 하나를 가질 수 있습니다. 라벨은 fdo_absolute_path_profile 규칙을 가리킬 수도 있습니다.
proto_profile

라벨: 기본값은 None입니다.

protobuf 프로필의 라벨입니다.

memprof_profile

규칙 소스 보기
memprof_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

워크스페이스에 있는 MEMPROF 프로필을 나타냅니다. 예:


memprof_profile(
    name = "memprof",
    profile = "//path/to/memprof:profile.afdo",
)

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

profile

라벨: 필수사항

MEMPROF 프로필의 라벨입니다. 프로필에는 .profdata 확장자 (색인이 생성되거나 기호화된 memprof 프로필의 경우) 또는 memprof .profdata 파일이 포함된 zip 파일의 경우.zip 확장자가 있어야 합니다. 라벨은 fdo_absolute_path_profile 규칙을 가리킬 수도 있습니다.

propeller_optimize

규칙 소스 보기
propeller_optimize(name, cc_profile, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, ld_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

워크스페이스의 Propeller 최적화 프로필을 나타냅니다. 예:


propeller_optimize(
    name = "layout",
    cc_profile = "//path:cc_profile.txt",
    ld_profile = "//path:ld_profile.txt"
)

인수

속성
name

이름: 필수사항

이 타겟의 고유한 이름입니다.

cc_profile

라벨: 필수사항

다양한 컴파일 작업에 전달된 프로필의 라벨입니다. 이 파일의 확장자는 .txt입니다.
ld_profile

라벨: 필수사항

연결 작업에 전달된 프로필의 라벨입니다. 이 파일의 확장자는 .txt입니다.