C / C++ 규칙

문제 신고 소스 보기

규칙

cc_binary

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

암시적 출력 대상

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

인수

특성
name

이름: 필수 항목입니다.

이 대상의 고유한 이름입니다.

deps

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

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

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

srcs

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

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

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

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

모든 #included 파일은 이 규칙의 srcs 속성 또는 참조된 cc_library()hdrs 속성에 언급되어야 합니다. 라이브러리와 연결된 헤더는 라이브러리의 hdrs 속성에 나열되고 이 규칙의 소스와 연결된 나머지 헤더는 srcs에 나열되는 것이 좋습니다. 자세한 설명은 '헤더 포함 확인'을 참고하세요.

규칙의 이름이 srcs에 있으면 이 규칙은 자동으로 그 이름에 종속됩니다. 이름이 지정된 규칙의 outs가 C 또는 C++ 소스 파일인 경우 이 규칙으로 컴파일되고, 라이브러리 파일인 경우 링크됩니다.

허용되는 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

이러한 파일을 생성하는 모든 규칙을 확인할 수 있습니다. gcc 규칙에 따라 다른 확장 프로그램이 다른 프로그래밍 언어를 나타냅니다.

additional_linker_inputs

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

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

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

copts

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

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

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

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

defines

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

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

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

컴파일 줄에 추가할 include dir의 목록입니다.

'Makevariable' 대체가 적용됩니다. 각 문자열은 -isystem가 추가되고 COPTS에 추가됩니다. COPTS와 달리 이러한 플래그는 이 규칙과 이 규칙에 종속된 모든 규칙에 추가됩니다. (참고: 적용되는 규칙이 아님) 광범위한 영향을 미칠 수 있으므로 매우 주의해야 합니다. 확실하지 않은 경우에는 대신 '-I' 플래그를 COPTS에 추가하세요.

헤더는 srcs 또는 hdrs에 추가되어야 합니다. 그렇지 않으면 컴파일이 샌드박스 상태일 때 (기본값) 종속 규칙에 헤더를 사용할 수 없습니다.

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

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

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

linkopts

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

C++ 링커 명령어에 다음 플래그를 추가합니다. 'Make' 변수 대체 적용, 본 셸 토큰화라벨 확장 이 속성의 각 문자열은 바이너리 타겟을 연결하기 전에 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.linkstatic: 아래를 참고하세요.

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

사용 설정되어 있고 바이너리 또는 테스트인 경우 이 옵션은 가능한 경우 항상 사용자 라이브러리의 .so 대신 .a에 연결하도록 빌드 도구에 지시합니다. 정적 라이브러리가 없는 라이브러리와 마찬가지로 일부 시스템 라이브러리는 여전히 동적으로 연결될 수 있습니다. 따라서 결과로 생성되는 실행 파일은 여전히 동적으로 링크되고 대부분 정적입니다.

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

  • 모든 항목이 정적으로 연결되는 full_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를 지정하면 사용 설정됩니다.

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

linkstatic=False인 경우 빌드 도구는 *.runfiles 영역에서 종속된 공유 라이브러리에 대한 심볼릭 링크를 생성합니다.

local_defines

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

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

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

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

기본적으로 C++ 바이너리는 빈 라이브러리인 //tools/cpp:malloc에 링크되므로 바이너리는 libc malloc을 사용하게 됩니다. 이 라벨은 cc_library를 참조해야 합니다. C++ 이외의 규칙용 컴파일인 경우 이 옵션은 적용되지 않습니다. linkshared=True가 지정되면 이 속성의 값은 무시됩니다.

nocopts

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

C++ 컴파일 명령어에서 일치 옵션을 삭제합니다. 'Make' 변수 대체가 적용됩니다. 이 속성의 값은 정규 표현식으로 해석됩니다. 이 정규 표현식과 일치하는 기존 COPTS(규칙의 copts 속성에 명시적으로 지정된 값 포함)은 이 규칙을 컴파일하기 위해 COPTS에서 삭제됩니다. 이 속성은 거의 필요하지 않습니다.
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, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, 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 = 1,
)
2. 공유 라이브러리 연결 (Unix)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. 인터페이스 라이브러리를 사용하여 공유 라이브러리 연결 (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를 사용하여 공유 라이브러리 연결 (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 = 1,
)
5. 정적 라이브러리 또는 공유 라이브러리
에 연결 Unix의 경우:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)

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

# second will link to libmylib.so
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
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",
)

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

# second will link to mylib.dll through mylib.lib
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
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을 최신 버전으로 업그레이드하세요.

interface_library

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

공유 라이브러리를 연결하기 위한 단일 인터페이스 라이브러리

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

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, copts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, nocopts, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

헤더 포함 확인

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

cc_library 규칙의 경우 hdrs의 헤더는 라이브러리의 공개 인터페이스를 구성하며 라이브러리 자체의 hdrssrcs에 있는 파일과 deps에 라이브러리를 나열하는 cc_* 규칙의 hdrssrcs에 있는 파일에서 모두 직접 포함될 수 있습니다. srcs의 헤더는 라이브러리 자체의 hdrssrcs에 있는 파일에서만 직접 포함되어야 합니다. 헤더를 hdrs에 배치할지 srcs에 배치할지 결정할 때는 이 라이브러리의 소비자가 직접 포함할 수 있도록 할지 물어봐야 합니다. 이는 프로그래밍 언어의 public 공개 상태와 private 공개 상태 사이의 결정과 거의 동일합니다.

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를 포함할 수 있으며, 여기에는 baz.h가 포함될 수 있으며 이 경우 baz-impl.h를 포함할 수 있습니다. 기술적으로 .cc 파일의 컴파일은 전이 deps 클로저의 모든 cc_library에 있는 hdrs 또는 srcs에 있는 헤더 파일을 전이적으로 포함할 수 있습니다. 이 경우 컴파일러는 foo.cc를 컴파일할 때 baz.hbaz-impl.h를 읽을 수 있지만 foo.cc에는 #include "baz.h"가 포함되어서는 안 됩니다. 그렇게 하려면 bazfoodeps에 추가해야 합니다.

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

인수

특성
name

이름: 필수 항목입니다.

이 대상의 고유한 이름입니다.

deps

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

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

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

srcs

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

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

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

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

모든 #included 파일은 이 규칙의 srcs 속성 또는 참조된 cc_library()hdrs 속성에 언급되어야 합니다. 라이브러리와 연결된 헤더는 라이브러리의 hdrs 속성에 나열되고 이 규칙의 소스와 연결된 나머지 헤더는 srcs에 나열되는 것이 좋습니다. 자세한 설명은 '헤더 포함 확인'을 참고하세요.

규칙의 이름이 srcs에 있으면 이 규칙은 자동으로 그 이름에 종속됩니다. 이름이 지정된 규칙의 outs가 C 또는 C++ 소스 파일인 경우 이 규칙으로 컴파일되고, 라이브러리 파일인 경우 링크됩니다.

허용되는 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

이러한 파일을 생성하는 모든 규칙을 확인할 수 있습니다. gcc 규칙에 따라 다른 확장 프로그램이 다른 프로그래밍 언어를 나타냅니다.

hdrs

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

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

이 위치는 라이브러리의 인터페이스를 설명하는 헤더 파일을 선언할 때 가장 선호되는 위치입니다. 이러한 헤더는 이 규칙 또는 종속 규칙에 소스가 포함할 수 있게 됩니다. 이 라이브러리의 클라이언트에 의해 포함되어서는 안 되는 헤더는 게시된 헤더에 포함되더라도 대신 srcs 속성에 나열되어야 합니다. 자세한 설명은 '헤더 포함 확인'을 참고하세요.

additional_compiler_inputs

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

예를 들어 새니타이저 무시 목록과 같이 컴파일러 명령줄에 전달할 수 있는 추가 파일입니다. 그런 다음 여기에 지정된 파일을 $(location) 함수와 함께 copt에서 사용할 수 있습니다.
additional_linker_inputs

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

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

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

부울. 기본값은 False입니다.

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

알려진 문제로 인해 Windows의 VS 2017에서 Alwayslink가 작동하지 않으면 VS 2017을 최신 버전으로 업그레이드하세요.

copts

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

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

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

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

defines

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

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

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

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

현재 사용은 cc_라이브러리로 제한되며 --experimental_cc_implementation_deps 플래그로 보호됩니다.

include_prefix

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

이 규칙의 헤더 경로에 추가할 프리픽스입니다.

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

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

includes

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

컴파일 줄에 추가할 include dir의 목록입니다.

'Makevariable' 대체가 적용됩니다. 각 문자열은 -isystem가 추가되고 COPTS에 추가됩니다. COPTS와 달리 이러한 플래그는 이 규칙과 이 규칙에 종속된 모든 규칙에 추가됩니다. (참고: 적용되는 규칙이 아님) 광범위한 영향을 미칠 수 있으므로 매우 주의해야 합니다. 확실하지 않은 경우에는 대신 '-I' 플래그를 COPTS에 추가하세요.

헤더는 srcs 또는 hdrs에 추가되어야 합니다. 그렇지 않으면 컴파일이 샌드박스 상태일 때 (기본값) 종속 규칙에 헤더를 사용할 수 없습니다.

linkopts

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

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

$ 또는 -로 시작하지 않는 이 목록의 각 요소는 deps에 있는 대상의 라벨로 간주됩니다. 이 타겟에 의해 생성된 파일 목록은 링커 옵션에 추가됩니다. 라벨이 잘못되었거나 deps에 선언되지 않으면 오류가 보고됩니다.

linkstamp

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

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

부울. 기본값은 False입니다.

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

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

사용 설정되어 있고 바이너리 또는 테스트인 경우 이 옵션은 가능한 경우 항상 사용자 라이브러리의 .so 대신 .a에 연결하도록 빌드 도구에 지시합니다. 정적 라이브러리가 없는 라이브러리와 마찬가지로 일부 시스템 라이브러리는 여전히 동적으로 연결될 수 있습니다. 따라서 결과로 생성되는 실행 파일은 여전히 동적으로 링크되고 대부분 정적입니다.

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

  • 모든 항목이 정적으로 연결되는 full_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를 지정하면 사용 설정됩니다.

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

linkstatic=False인 경우 빌드 도구는 *.runfiles 영역에서 종속된 공유 라이브러리에 대한 심볼릭 링크를 생성합니다.

local_defines

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

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

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

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

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

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

설정하면 규칙의 hdrs 속성에 있는 헤더에 이 프리픽스가 잘린 경로에서 액세스할 수 있습니다.

상대 경로인 경우 패키지 기준 경로로 사용됩니다. 절대 경로인 경우에는 저장소 기준 경로로 이해됩니다.

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

textual_hdrs

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

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

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

win_def_file

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

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

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

cc_proto_library

규칙 소스 보기
cc_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

cc_proto_library.proto 파일에서 C++ 코드를 생성합니다.

depsproto_library 규칙을 가리켜야 합니다.

예:

cc_library(
    name = "lib",
    deps = [":foo_cc_proto"],
)

cc_proto_library(
    name = "foo_cc_proto",
    deps = [":foo_proto"],
)

proto_library(
    name = "foo_proto",
)

인수

특성
name

이름: 필수 항목입니다.

이 대상의 고유한 이름입니다.

deps

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

C++ 코드를 생성할 proto_library 규칙의 목록입니다.

cc_shared_library

규칙 소스 보기
cc_shared_library(name, deps, additional_linker_inputs, dynamic_deps, exports_filter, shared_lib_name, tags, user_link_flags, 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 규칙 로직은 내보낼 기호를 제어하지 않으며, 2개의 공유 라이브러리가 동일한 타겟을 내보내는 경우 분석 단계에서 오류를 발생시키기 위해 내보낸 것으로 가정되는 내용만 사용합니다.

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

예의 모든 단일 cc_library는 최대 하나의 cc_shared_library에 표시되어야 합니다. bazbar_shared에도 연결하려면 tags = ["LINKABLE_MORE_THAN_ONCE"]baz에 추가해야 합니다.

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`

즉, cc_shared_library 종속 항목 중 하나를 거치지 않고 deps의 전이 클로저에 있는 라이브러리에는 이미 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

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

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

이러한 직접 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)을 사용하여 전이 deps의 어떤 cc_libraries를 다른 cc_shared_library에서 이미 제공했으므로 연결하지 않아야 하는 항목을 결정합니다.

exports_filter

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

이 속성에는 현재 공유 라이브러리에서 내보낸 것으로 의심되는 타겟의 목록이 포함됩니다.

모든 타겟 deps은 공유 라이브러리에서 내보내는 것으로 이미 파악되었습니다. 이 속성은 공유 라이브러리에서 내보낸 모든 타겟을 나열하는 데 사용해야 하지만 deps의 전이 종속 항목입니다.

이 속성은 실제로 이러한 대상에 종속 항목 에지를 추가하지 않으며 대신 deps로 종속 항목 에지를 만들어야 합니다.이 속성의 항목은 문자열입니다. 이 속성에 타겟을 배치하면 공유 라이브러리가 타겟에서 기호를 내보내한다는 주장으로 간주된다는 점에 유의하세요. cc_shared_library 로직은 실제로 링커에 어떤 기호를 내보내야 하는지 알려주는 작업을 처리하지 않습니다.

허용되는 구문은 다음과 같습니다.

foo/BUILD의 모든 타겟을 처리하기 위한 //foo:__package__

foo/BUILD의 타겟 또는 foo/ bar/BUILD와 같이 foo/아래에 있는 다른 패키지의 타겟은 //foo:__subpackages__로 처리

shared_lib_name

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

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

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

링커에 전달할 수 있는 추가 플래그. 예를 들어 링커가 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가 대상 플랫폼인 경우에만 사용해야 합니다. 공유 라이브러리를 연결하는 동안 기호를 내보내는 데 사용할 수 있습니다.

fdo_prefetch_hints

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

작업공간 또는 지정된 절대 경로에 있는 FDO 미리 가져오기 힌트 프로필을 나타냅니다. 예:

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

fdo_profile(
  name = "hints_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

인수

특성
name

이름: 필수 항목입니다.

이 대상의 고유한 이름입니다.

profile

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

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

fdo_profile

규칙 소스 보기
fdo_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, visibility)

작업공간 또는 지정된 절대 경로에 있는 FDO 프로필을 나타냅니다. 예:

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

fdo_profile(
  name = "fdo_abs",
  absolute_path_profile = "/absolute/path/profile.zip",
)

인수

특성
name

이름: 필수 항목입니다.

이 대상의 고유한 이름입니다.

absolute_path_profile

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

FDO 프로필의 절대 경로입니다. FDO 파일에는 .afdo 확장자만 있을 수 있습니다.
profile

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

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, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

작업공간 또는 지정된 절대 경로에 있는 MEMPROF 프로필을 나타냅니다. 예:

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

memprof_profile(
  name = "memprof_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

인수

특성
name

이름: 필수 항목입니다.

이 대상의 고유한 이름입니다.

absolute_path_profile

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

MEMPROF 프로필의 절대 경로입니다. 파일은 .profdata 또는 .zip 확장자만 포함할 수 있습니다. 여기서 zip 파일에는 memprof.profdata 파일이 포함되어야 합니다.
profile

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

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

propeller_optimize

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

작업공간의 프로펠러 최적화 프로필을 나타냅니다. 예:

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

propeller_optimize(
    name = "layout_absolute",
    absolute_cc_profile = "/absolute/cc_profile.txt",
    absolute_ld_profile = "/absolute/ld_profile.txt"
)

인수

특성
name

이름: 필수 항목입니다.

이 대상의 고유한 이름입니다.

ld_profile

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

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

cc_test

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

인수

특성
name

이름: 필수 항목입니다.

이 대상의 고유한 이름입니다.

deps

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

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

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

srcs

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

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

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

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

모든 #included 파일은 이 규칙의 srcs 속성 또는 참조된 cc_library()hdrs 속성에 언급되어야 합니다. 라이브러리와 연결된 헤더는 라이브러리의 hdrs 속성에 나열되고 이 규칙의 소스와 연결된 나머지 헤더는 srcs에 나열되는 것이 좋습니다. 자세한 설명은 '헤더 포함 확인'을 참고하세요.

규칙의 이름이 srcs에 있으면 이 규칙은 자동으로 그 이름에 종속됩니다. 이름이 지정된 규칙의 outs가 C 또는 C++ 소스 파일인 경우 이 규칙으로 컴파일되고, 라이브러리 파일인 경우 링크됩니다.

허용되는 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

이러한 파일을 생성하는 모든 규칙을 확인할 수 있습니다. gcc 규칙에 따라 다른 확장 프로그램이 다른 프로그래밍 언어를 나타냅니다.

additional_linker_inputs

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

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

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

copts

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

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

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

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

defines

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

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

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

컴파일 줄에 추가할 include dir의 목록입니다.

'Makevariable' 대체가 적용됩니다. 각 문자열은 -isystem가 추가되고 COPTS에 추가됩니다. COPTS와 달리 이러한 플래그는 이 규칙과 이 규칙에 종속된 모든 규칙에 추가됩니다. (참고: 적용되는 규칙이 아님) 광범위한 영향을 미칠 수 있으므로 매우 주의해야 합니다. 확실하지 않은 경우에는 대신 '-I' 플래그를 COPTS에 추가하세요.

헤더는 srcs 또는 hdrs에 추가되어야 합니다. 그렇지 않으면 컴파일이 샌드박스 상태일 때 (기본값) 종속 규칙에 헤더를 사용할 수 없습니다.

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

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

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

linkopts

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

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

$ 또는 -로 시작하지 않는 이 목록의 각 요소는 deps에 있는 대상의 라벨로 간주됩니다. 이 타겟에 의해 생성된 파일 목록은 링커 옵션에 추가됩니다. 라벨이 잘못되었거나 deps에 선언되지 않으면 오류가 보고됩니다.

linkstatic

부울. 기본값은 False입니다.

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

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

사용 설정되어 있고 바이너리 또는 테스트인 경우 이 옵션은 가능한 경우 항상 사용자 라이브러리의 .so 대신 .a에 연결하도록 빌드 도구에 지시합니다. 정적 라이브러리가 없는 라이브러리와 마찬가지로 일부 시스템 라이브러리는 여전히 동적으로 연결될 수 있습니다. 따라서 결과로 생성되는 실행 파일은 여전히 동적으로 링크되고 대부분 정적입니다.

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

  • 모든 항목이 정적으로 연결되는 full_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를 지정하면 사용 설정됩니다.

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

linkstatic=False인 경우 빌드 도구는 *.runfiles 영역에서 종속된 공유 라이브러리에 대한 심볼릭 링크를 생성합니다.

local_defines

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

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

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

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

기본적으로 C++ 바이너리는 빈 라이브러리인 //tools/cpp:malloc에 링크되므로 바이너리는 libc malloc을 사용하게 됩니다. 이 라벨은 cc_library를 참조해야 합니다. C++ 이외의 규칙용 컴파일인 경우 이 옵션은 적용되지 않습니다. linkshared=True가 지정되면 이 속성의 값은 무시됩니다.

nocopts

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

C++ 컴파일 명령어에서 일치 옵션을 삭제합니다. 'Make' 변수 대체가 적용됩니다. 이 속성의 값은 정규 표현식으로 해석됩니다. 이 정규 표현식과 일치하는 기존 COPTS(규칙의 copts 속성에 명시적으로 지정된 값 포함)은 이 규칙을 컴파일하기 위해 COPTS에서 삭제됩니다. 이 속성은 거의 필요하지 않습니다.
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_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, 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가 아티팩트를 제공하는 다른 모든 속성의 상위 집합이라고 가정합니다 (예: linktamp 컴파일에는 컴파일 파일과 링크 파일이 모두 필요하므로 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입니다.

입력 검색이 지원되는 경우 컴파일 작업에 필요한 모든 cc_toolchain 아티팩트의 컬렉션입니다 (현재 Google에서만 가능).
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

부울. 기본값은 True입니다.

모든 파일 입력을 전환하지 않고 (기본적으로 대상 플랫폼) exec 플랫폼의 cc_toolchain에 빌드하려면 True로 설정합니다.
libc_top

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

컴파일/연결 작업에 대한 입력으로 전달된 libc의 아티팩트 모음입니다.
linker_files

라벨, 필수

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

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

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

라벨, 필수

objcopy 작업에 필요한 모든 cc_toolchain 아티팩트의 컬렉션입니다.
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이 작업 연결을 위한 매개변수 파일 사용을 지원하는 경우 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)

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

이 규칙의 역할은 다음과 같습니다.

  • 모든 관련 C++ 도구 모음 수집
  • Bazel에 전달된 --cpu--compiler 옵션에 따라 하나의 도구 모음을 선택합니다.

자세한 C++ 도구 모음 구성 및 도구 모음 선택 문서는 이 페이지 를 참고하세요.

인수

특성
name

이름: 필수 항목입니다.

이 대상의 고유한 이름입니다.

toolchains

라벨에 사전 매핑 문자열, 구성 불가, 필수

'<cpu>' 또는 '<cpu>|<compiler>' 문자열에서 cc_toolchain 라벨로 매핑됩니다. '<cpu>'는 --cpu만 Bazel에 전달될 때 사용되며, --cpu--compiler가 모두 Bazel에 전달될 때 '<cpu>|<compiler>'이 사용됩니다. 예:

          cc_toolchain_suite(
            name = "toolchain",
            toolchains = {
              "piii|gcc": ":my_cc_toolchain_for_piii_using_gcc",
              "piii": ":my_cc_toolchain_for_piii_using_default_compiler",
            },
          )