규칙
- cc_binary
- cc_import
- cc_library
- cc_shared_library
- cc_static_library
- cc_test
- cc_toolchain
- cc_toolchain_suite
- fdo_prefetch_hints
- fdo_profile
- memprof_profile
- propeller_optimize
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
|
라벨 목록입니다. 기본값은
|
srcs
|
라벨 목록입니다. 기본값은 모든 순수 어셈블러 파일 (.s, .asm)은 전처리되지 않으며 일반적으로 어셈블러를 사용하여 빌드됩니다. 전처리된 어셈블리 파일 (.S)은 전처리되며 일반적으로 C/C++ 컴파일러를 사용하여 빌드됩니다.
모든
허용되는
... 및 이러한 파일을 생성하는 규칙 (예: |
data
|
라벨 목록입니다. 기본값은 data에 관한 일반적인 의견을 참고하세요.
C++ 코드는 다음과 같이 이러한 데이터 파일에 액세스할 수 있습니다. |
additional_linker_inputs
|
라벨 목록입니다. 기본값은 예를 들어 컴파일된 Windows .res 파일을 여기에 제공하여 바이너리 타겟에 삽입할 수 있습니다. |
conlyopts
|
문자열 목록입니다. 기본값은 |
copts
|
문자열 목록입니다. 기본값은
이 속성의 각 문자열은 바이너리 타겟을 컴파일하기 전에 지정된 순서로
패키지가 기능
|
cxxopts
|
문자열 목록입니다. 기본값은 |
defines
|
문자열 목록입니다. 기본값은 -D이 추가되고 이 타겟의 컴파일 명령줄과 이 타겟에 종속된 모든 규칙에 추가됩니다. 이 경우 광범위한 영향을 미칠 수 있으므로 매우 신중해야 합니다. 확실하지 않은 경우 local_defines에 정의 값을 추가하세요.
|
dynamic_deps
|
라벨 목록입니다. 기본값은 cc_shared_library 종속 항목입니다.
|
hdrs_check
|
문자열, 기본값은 |
includes
|
문자열 목록입니다. 기본값은 -isystem path_to_package/include_entry를 생성합니다.
이는 #include 문 작성에 관한 Google 스타일을 따르지 않는 서드 파티 라이브러리에만 사용해야 합니다.
COPTS와 달리 이러한 플래그는 이 규칙과 이 규칙에 종속된 모든 규칙에 추가됩니다. (참고: 종속된 규칙이 아님) 이 경우 광범위한 영향을 미칠 수 있으므로 매우 신중해야 합니다. 확실하지 않은 경우 COPTS에 '-I' 플래그를 대신 추가하세요.
추가된 |
link_extra_lib
|
라벨: 기본값은
기본적으로 C++ 바이너리는 |
linkopts
|
문자열 목록입니다. 기본값은 LINKOPTS에 추가됩니다.
|
linkshared
|
불리언, 기본값은 linkshared=True를 포함하세요. 기본적으로 이 옵션은 사용 중지되어 있습니다.
이 플래그가 있으면
|
linkstatic
|
불리언, 기본값은 cc_binary 및 cc_test: 정적 모드에서 바이너리를 연결합니다. cc_library.link_static: 아래를 참고하세요.
기본적으로 이 옵션은
사용 설정되어 있고 바이너리 또는 테스트인 경우 이 옵션은 가능한 경우 사용자 라이브러리에 실행 파일을 연결하는 방법에는 세 가지가 있습니다.
프로덕션에서 |
local_defines
|
문자열 목록입니다. 기본값은 -D이 추가되고 이 타겟의 컴파일 명령줄에 추가되지만 종속 항목에는 추가되지 않습니다.
|
malloc
|
라벨: 기본값은
기본적으로 C++ 바이너리는 빈 라이브러리인 |
module_interfaces
|
라벨 목록입니다. 기본값은 C++ 표준에는 모듈 인터페이스 파일 확장자에 관한 제한이 없습니다.
이 사용은 |
nocopts
|
문자열, 기본값은 COPTS(규칙의 copts 속성에 명시적으로 지정된 값 포함)는 이 규칙을 컴파일하기 위해 COPTS에서 삭제됩니다.
이 속성은 third_party 외부에서 필요하거나 사용하면 안 됩니다. 값은 'Make' 변수 대체 외에는 어떤 방식으로도 사전 처리되지 않습니다.
|
reexport_deps
|
라벨 목록입니다. 기본값은 |
stamp
|
정수이며 기본값은
스탬프가 찍힌 바이너리는 종속 항목이 변경되지 않는 한 다시 빌드되지 않습니다. |
win_def_file
|
라벨: 기본값은 이 속성은 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 = 1,
)
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
shared_library = "libmylib.so",
)
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",
)
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 = 1,
)
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,
)
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 = 1, # default value
)
# second will link to libmylib.so (or libmylib.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
|
라벨 목록입니다. 기본값은 |
alwayslink
|
불리언, 기본값은 Windows에서 VS 2017과 함께 alwayslink가 작동하지 않는 경우 알려진 문제 때문이므로 VS 2017을 최신 버전으로 업그레이드하세요. |
includes
|
문자열 목록입니다. 기본값은 -isystem path_to_package/include_entry를 생성합니다.
이는 #include 문 작성에 관한 Google 스타일을 따르지 않는 서드 파티 라이브러리에만 사용해야 합니다.
COPTS와 달리 이러한 플래그는 이 규칙과 이 규칙에 종속된 모든 규칙에 추가됩니다. (참고: 종속된 규칙이 아님) 이 경우 광범위한 영향을 미칠 수 있으므로 매우 신중해야 합니다. 확실하지 않은 경우 COPTS에 '-I' 플래그를 대신 추가하세요.
기본 |
interface_library
|
라벨: 기본값은 허용되는 파일 형식:
|
linkopts
|
문자열 목록입니다. 기본값은 LINKOPTS에 추가됩니다.
|
objects
|
라벨 목록입니다. 기본값은 |
pic_objects
|
라벨 목록입니다. 기본값은 |
pic_static_library
|
라벨: 기본값은 |
shared_library
|
라벨: 기본값은 허용되는 파일 형식:
|
static_library
|
라벨: 기본값은 허용되는 파일 형식:
|
system_provided
|
불리언, 기본값은 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의 헤더는 라이브러리의 공개 인터페이스로 구성되며 라이브러리 자체의 hdrs 및 srcs에 있는 파일과 deps에 라이브러리를 나열하는 cc_* 규칙의 hdrs 및 srcs에 있는 파일에서 직접 포함될 수 있습니다.
srcs의 헤더는 라이브러리 자체의 hdrs 및 srcs에 있는 파일에서만 직접 포함해야 합니다. 헤더를 hdrs에 넣을지 srcs에 넣을지 결정할 때는 이 라이브러리의 소비자가 직접 포함할 수 있기를 원하는지 질문해야 합니다. 이는 프로그래밍 언어에서 public와 private 가시성 간의 결정과 거의 동일합니다.
cc_binary 및 cc_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.cc은 foo.h 및 bar.h을 직접 포함할 수 있지만 baz.h은 포함할 수 없습니다.
| 파일 포함 | 허용된 포함 |
|---|---|
| foo.h | bar.h |
| foo.cc | foo.h bar.h |
| bar.h | bar-impl.h baz.h |
| bar-impl.h | bar.h baz.h |
| bar.cc | bar.h bar-impl.h baz.h |
| baz.h | baz-impl.h |
| baz-impl.h | baz.h |
| baz.cc | baz.h baz-impl.h |
포함 확인 규칙은 직접 포함에만 적용됩니다. 위의 예에서 foo.cc에는 bar.h가 포함될 수 있고, bar.h에는 baz.h가 포함될 수 있으며, baz.h에는 baz-impl.h가 포함될 수 있습니다. 기술적으로 .cc 파일 컴파일은 전이적 deps 클로저의 cc_library에 있는 hdrs 또는 srcs의 헤더 파일을 전이적으로 포함할 수 있습니다. 이 경우 컴파일러는 foo.cc를 컴파일할 때 baz.h 및 baz-impl.h을 읽을 수 있지만 foo.cc에는 #include "baz.h"이 포함되어서는 안 됩니다. 이를 허용하려면 baz를 foo의 deps에 추가해야 합니다.
Bazel은 도구 모음 지원을 통해 포함 확인 규칙을 적용합니다.
layering_check 기능은 툴체인에서 지원해야 하며 --features=layering_check 명령줄 플래그 또는 package 함수의 features 매개변수와 같이 명시적으로 요청해야 합니다. Bazel에서 제공하는 툴체인은 Unix 및 macOS에서 clang을 사용하는 경우에만 이 기능을 지원합니다.
예
기본 바이너리 코드가 이 코드를 참조하지 않더라도 링커가 이 코드를 링크하도록 강제하기 위해 alwayslink 플래그를 사용합니다.
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에서 가져온 것입니다.
서드 파티 코드에는 defines 및 linkopts가 필요한 경우가 많습니다.
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
|
라벨 목록입니다. 기본값은
대부분의 빌드 규칙에서 정의하는 일반적인 속성에서 C++ 라이브러리 규칙의 이름이어야 합니다.
이 규칙의 라이브러리를 연결하는 바이너리를 빌드할 때 'deps'라는 이름과 달리 이 라이브러리의 모든 클라이언트가 여기에 속하지는 않습니다. 런타임 데이터 종속 항목은 사전 컴파일된 서드 파티 라이브러리를 연결하려면 대신 이 라이브러리에 연결하지 않고 항목을 종속시키려면 대신 |
srcs
|
라벨 목록입니다. 기본값은 모든 순수 어셈블러 파일 (.s, .asm)은 전처리되지 않으며 일반적으로 어셈블러를 사용하여 빌드됩니다. 전처리된 어셈블리 파일 (.S)은 전처리되며 일반적으로 C/C++ 컴파일러를 사용하여 빌드됩니다.
모든
허용되는
... 및 이러한 파일을 생성하는 규칙 (예: |
data
|
라벨 목록입니다. 기본값은 data에 관한 일반적인 의견을 참고하세요.
C++ 코드는 다음과 같이 이러한 데이터 파일에 액세스할 수 있습니다. |
hdrs
|
라벨 목록입니다. 기본값은 이는 라이브러리의 인터페이스를 설명하는 헤더 파일을 선언하는 데 적극 권장되는 위치입니다. 이러한 헤더는 이 규칙 또는 종속 규칙의 소스에 의해 포함될 수 있습니다.
이 라이브러리의 클라이언트가 포함하지 않아야 하는 헤더는 게시된 헤더에 포함되어 있더라도 허용되는 |
additional_compiler_inputs
|
라벨 목록입니다. 기본값은 |
additional_linker_inputs
|
라벨 목록입니다. 기본값은 예를 들어 컴파일된 Windows .res 파일을 여기에 제공하여 바이너리 타겟에 삽입할 수 있습니다. |
alwayslink
|
불리언, 기본값은 srcs에 나열된 파일의 모든 객체 파일을 링크합니다.
이는 코드가 바이너리의 코드에 의해 명시적으로 호출되지 않는 경우에 유용합니다. 예를 들어 코드가 일부 서비스에서 제공하는 콜백을 수신하도록 등록하는 경우입니다.
Windows에서 VS 2017과 함께 alwayslink가 작동하지 않는 경우 알려진 문제 때문이므로 VS 2017을 최신 버전으로 업그레이드하세요. |
conlyopts
|
문자열 목록입니다. 기본값은 |
copts
|
문자열 목록입니다. 기본값은
이 속성의 각 문자열은 바이너리 타겟을 컴파일하기 전에 지정된 순서로
패키지가 기능
|
cxxopts
|
문자열 목록입니다. 기본값은 |
defines
|
문자열 목록입니다. 기본값은 -D이 추가되고 이 타겟의 컴파일 명령줄과 이 타겟에 종속된 모든 규칙에 추가됩니다. 이 경우 광범위한 영향을 미칠 수 있으므로 매우 신중해야 합니다. 확실하지 않은 경우 local_defines에 정의 값을 추가하세요.
|
hdrs_check
|
문자열, 기본값은 |
implementation_deps
|
라벨 목록입니다. 기본값은 deps와 달리 이러한 라이브러리 (및 모든 전이 종속 항목)의 헤더와 포함 경로는 이 라이브러리의 컴파일에만 사용되며, 이 라이브러리에 종속된 라이브러리에는 사용되지 않습니다. implementation_deps로 지정된 라이브러리는 이 라이브러리에 종속된 바이너리 타겟에서 계속 연결됩니다.
|
include_prefix
|
문자열, 기본값은 설정되면 이 규칙의 이 접두사가 추가되기 전에 이 속성은 |
includes
|
문자열 목록입니다. 기본값은 -isystem path_to_package/include_entry를 생성합니다.
이는 #include 문 작성에 관한 Google 스타일을 따르지 않는 서드 파티 라이브러리에만 사용해야 합니다.
COPTS와 달리 이러한 플래그는 이 규칙과 이 규칙에 종속된 모든 규칙에 추가됩니다. (참고: 종속된 규칙이 아님) 이 경우 광범위한 영향을 미칠 수 있으므로 매우 신중해야 합니다. 확실하지 않은 경우 COPTS에 '-I' 플래그를 대신 추가하세요.
추가된 |
linkopts
|
문자열 목록입니다. 기본값은 cc_binary.linkopts을 참고하세요.
linkopts 속성은 deps 속성 (또는 유사하게 처리되는 다른 속성, 즉 cc_binary의 malloc 속성)을 통해 이 라이브러리에 직간접적으로 종속되는 모든 타겟에도 적용됩니다. 종속 항목 linkopt가 종속 linkopt보다 우선합니다 (즉 종속 항목 linkopt가 명령줄에 나중에 표시됨). --linkopt에 지정된 linkopts는 규칙 linkopts보다 우선합니다.
또한 '-Wl,-soname' 또는 '-Xlinker -soname' 옵션은 지원되지 않으며 이 속성에서 지정해서는 안 됩니다. |
linkstamp
|
라벨: 기본값은 base 패키지에서만 필요합니다.
|
linkstatic
|
불리언, 기본값은 cc_binary 및 cc_test: 정적 모드에서 바이너리를 연결합니다. cc_library.link_static: 아래를 참고하세요.
기본적으로 이 옵션은
사용 설정되어 있고 바이너리 또는 테스트인 경우 이 옵션은 가능한 경우 사용자 라이브러리에 실행 파일을 연결하는 방법에는 세 가지가 있습니다.
프로덕션에서 |
local_defines
|
문자열 목록입니다. 기본값은 -D이 추가되고 이 타겟의 컴파일 명령줄에 추가되지만 종속 항목에는 추가되지 않습니다.
|
module_interfaces
|
라벨 목록입니다. 기본값은 C++ 표준에는 모듈 인터페이스 파일 확장자에 관한 제한이 없습니다.
이 사용은 |
strip_include_prefix
|
문자열, 기본값은 설정되면 이 규칙의 상대 경로인 경우 패키지 상대 경로로 간주됩니다. 절대 경로인 경우 저장소 상대 경로로 이해됩니다.
이 속성은 |
textual_hdrs
|
라벨 목록입니다. 기본값은 이는 자체적으로 컴파일할 수 없는 헤더 파일을 선언하는 위치입니다. 즉, 유효한 코드를 빌드하려면 항상 다른 소스 파일에 텍스트로 포함되어야 합니다. |
win_def_file
|
라벨: 기본값은 이 속성은 Windows가 타겟 플랫폼인 경우에만 사용해야 합니다. 공유 라이브러리를 연결하는 동안 심볼을 내보내는 데 사용할 수 있습니다. |
cc_shared_library
규칙 소스 보기cc_shared_library(name, deps, additional_linker_inputs, compatible_with, deprecation, distribs, dynamic_deps, exec_compatible_with, exec_properties, experimental_disable_topo_sort_do_not_use_remove_before_7_0, 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_shared는 foo 및 baz를 정적으로 연결합니다. baz는 전이 종속 항목입니다. dynamic_dep bar_shared에서 이미 동적으로 제공하므로 bar를 연결하지 않습니다.
foo_shared는 링커 스크립트 *.lds 파일을 사용하여 내보낼 심볼을 제어합니다. cc_shared_library 규칙 논리는 내보내지는 심볼을 제어하지 않고 내보내진 것으로 간주되는 항목만 사용하여 두 공유 라이브러리가 동일한 타겟을 내보내는 경우 분석 단계에서 오류를 제공합니다.
cc_shared_library의 모든 직접 종속 항목은 내보내진 것으로 간주됩니다. 따라서 Bazel은 분석 중에 foo가 foo_shared에 의해 내보내진다고 가정합니다. baz는 foo_shared에 의해 내보내진 것으로 간주되지 않습니다. exports_filter에 의해 일치하는 모든 타겟도 내보낸 것으로 간주됩니다.
예의 모든 cc_library은 최대 하나의 cc_shared_library에 표시되어야 합니다. baz도 bar_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 종속 항목 중 하나에서 라이브러리가 내보내지지 않도록 해야 합니다.
Two shared libraries in dependencies link the same library statically
이는 동일한 타겟을 정적으로 연결하는 두 개의 서로 다른 cc_shared_library 종속 항목으로 새 cc_shared_library를 만들 때마다 발생합니다.
내보내기 오류와 유사합니다.
이 문제를 해결하는 한 가지 방법은 라이브러리를 cc_shared_library 종속 항목 중 하나에 연결하지 않는 것입니다. 동시에 여전히 연결하는 항목은 연결하지 않는 항목이 기호를 계속 볼 수 있도록 라이브러리를 내보내야 합니다. 또 다른 방법은 타겟을 내보내는 세 번째 라이브러리를 가져오는 것입니다.
세 번째 방법은 문제의 cc_library에 LINKABLE_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_library의 deps에 속하지 않습니다. 이 미리 컴파일된 동적 라이브러리가 cc_libraries 중 하나의 종속 항목인 경우 cc_library가 직접 종속되어야 합니다.
Trying to export a library already exported by a different shared library
현재 규칙에서 동적 종속 항목 중 하나가 이미 내보내고 있는 타겟을 내보낸다고 주장하는 경우 이 오류가 표시됩니다.
이 문제를 해결하려면 deps에서 타겟을 삭제하고 동적 종속 항목에서만 타겟을 사용하거나 exports_filter이 이 타겟을 포착하지 않도록 하세요.
인수
| 속성 | |
|---|---|
name |
이름: 필수 이 타겟의 고유한 이름입니다. |
deps
|
라벨 목록입니다. 기본값은
이러한 직접 종속 항목의 모든 전이 라이브러리 종속 항목은
분석 중에 규칙 구현에서는
또한 구현은 동일한 라이브러리가 두 개 이상의 |
additional_linker_inputs
|
라벨 목록입니다. 기본값은 user_link_flags 속성을 통해 이 작업을 수행할 수 있습니다.
|
dynamic_deps
|
라벨 목록입니다. 기본값은 cc_shared_library 종속 항목입니다.
|
experimental_disable_topo_sort_do_not_use_remove_before_7_0
|
불리언, 기본값은 |
exports_filter
|
문자열 목록입니다. 기본값은
모든 타겟
이 속성은 실제로 이러한 타겟에 종속 항목 에지를 추가하지 않습니다. 종속 항목 에지는 대신 다음 구문이 허용됩니다. foo/BUILD의 모든 타겟을 고려하도록 foo/BUILD 또는 foo/ 아래의 다른 패키지(예: foo/bar/BUILD)의 타겟을 고려하도록 |
roots
|
라벨 목록입니다. 기본값은 |
shared_lib_name
|
문자열, 기본값은 |
static_deps
|
문자열 목록입니다. 기본값은 |
user_link_flags
|
문자열 목록입니다. 기본값은 |
win_def_file
|
라벨: 기본값은 이 속성은 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
|
라벨 목록입니다. 기본값은 객체 파일을 제공하지 않는 종속 항목은 정적 라이브러리에 포함되지 않지만 라벨은 |
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
|
라벨 목록입니다. 기본값은
|
srcs
|
라벨 목록입니다. 기본값은 모든 순수 어셈블러 파일 (.s, .asm)은 전처리되지 않으며 일반적으로 어셈블러를 사용하여 빌드됩니다. 전처리된 어셈블리 파일 (.S)은 전처리되며 일반적으로 C/C++ 컴파일러를 사용하여 빌드됩니다.
모든
허용되는
... 및 이러한 파일을 생성하는 규칙 (예: |
data
|
라벨 목록입니다. 기본값은 data에 관한 일반적인 의견을 참고하세요.
C++ 코드는 다음과 같이 이러한 데이터 파일에 액세스할 수 있습니다. |
additional_linker_inputs
|
라벨 목록입니다. 기본값은 예를 들어 컴파일된 Windows .res 파일을 여기에 제공하여 바이너리 타겟에 삽입할 수 있습니다. |
conlyopts
|
문자열 목록입니다. 기본값은 |
copts
|
문자열 목록입니다. 기본값은
이 속성의 각 문자열은 바이너리 타겟을 컴파일하기 전에 지정된 순서로
패키지가 기능
|
cxxopts
|
문자열 목록입니다. 기본값은 |
defines
|
문자열 목록입니다. 기본값은 -D이 추가되고 이 타겟의 컴파일 명령줄과 이 타겟에 종속된 모든 규칙에 추가됩니다. 이 경우 광범위한 영향을 미칠 수 있으므로 매우 신중해야 합니다. 확실하지 않은 경우 local_defines에 정의 값을 추가하세요.
|
dynamic_deps
|
라벨 목록입니다. 기본값은 cc_shared_library 종속 항목입니다.
|
hdrs_check
|
문자열, 기본값은 |
includes
|
문자열 목록입니다. 기본값은 -isystem path_to_package/include_entry를 생성합니다.
이는 #include 문 작성에 관한 Google 스타일을 따르지 않는 서드 파티 라이브러리에만 사용해야 합니다.
COPTS와 달리 이러한 플래그는 이 규칙과 이 규칙에 종속된 모든 규칙에 추가됩니다. (참고: 종속된 규칙이 아님) 이 경우 광범위한 영향을 미칠 수 있으므로 매우 신중해야 합니다. 확실하지 않은 경우 COPTS에 '-I' 플래그를 대신 추가하세요.
추가된 |
link_extra_lib
|
라벨: 기본값은
기본적으로 C++ 바이너리는 |
linkopts
|
문자열 목록입니다. 기본값은 LINKOPTS에 추가됩니다.
|
linkshared
|
불리언, 기본값은 linkshared=True를 포함하세요. 기본적으로 이 옵션은 사용 중지되어 있습니다.
이 플래그가 있으면
|
linkstatic
|
불리언, 기본값은 cc_binary 및 cc_test: 정적 모드에서 바이너리를 연결합니다. cc_library.link_static: 아래를 참고하세요.
기본적으로 이 옵션은
사용 설정되어 있고 바이너리 또는 테스트인 경우 이 옵션은 가능한 경우 사용자 라이브러리에 실행 파일을 연결하는 방법에는 세 가지가 있습니다.
프로덕션에서 |
local_defines
|
문자열 목록입니다. 기본값은 -D이 추가되고 이 타겟의 컴파일 명령줄에 추가되지만 종속 항목에는 추가되지 않습니다.
|
malloc
|
라벨: 기본값은
기본적으로 C++ 바이너리는 빈 라이브러리인 |
module_interfaces
|
라벨 목록입니다. 기본값은 C++ 표준에는 모듈 인터페이스 파일 확장자에 관한 제한이 없습니다.
이 사용은 |
nocopts
|
문자열, 기본값은 COPTS(규칙의 copts 속성에 명시적으로 지정된 값 포함)는 이 규칙을 컴파일하기 위해 COPTS에서 삭제됩니다.
이 속성은 third_party 외부에서 필요하거나 사용하면 안 됩니다. 값은 'Make' 변수 대체 외에는 어떤 방식으로도 사전 처리되지 않습니다.
|
reexport_deps
|
라벨 목록입니다. 기본값은 |
stamp
|
정수이며 기본값은
스탬프가 찍힌 바이너리는 종속 항목이 변경되지 않는 한 다시 빌드되지 않습니다. |
win_def_file
|
라벨: 기본값은 이 속성은 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로 끝나는 기타 속성과 같은 속성을 통해 이루어집니다. 이러한 속성은 일반적으로 필요한 모든 파일을 globbing하는 filegroup입니다. -
C++ 작업에 올바른 명령줄을 생성합니다. 이는
CcToolchainConfigInfo제공자를 사용하여 실행됩니다 (자세한 내용은 아래 참고).
toolchain_config 속성을 사용하여 C++ 도구 모음을 구성합니다.
자세한 C++ 도구 모음 구성 및 도구 모음 선택 문서는 이
페이지
를 참고하세요.
bazel build //... 호출 시 도구 모음이 불필요하게 빌드되고 구성되지 않도록 하려면 tags = ["manual"] 사용
인수
| 속성 | |
|---|---|
name |
이름: 필수 이 타겟의 고유한 이름입니다. |
all_files
|
라벨: 필수 모든 cc_toolchain 아티팩트의 컬렉션입니다. 이러한 아티팩트는 아래 속성에서 더 정확한 아티팩트 세트를 사용하는 작업을 제외하고 모든 rules_cc 관련 작업에 입력으로 추가됩니다. Bazel은all_files가 다른 모든 아티팩트 제공 속성의 상위 집합이라고 가정합니다 (예: linkstamp 컴파일에는 컴파일 파일과 링크 파일이 모두 필요하므로 all_files를 사용함).
|
ar_files
|
라벨: 기본값은 |
as_files
|
라벨: 기본값은 |
compiler_files
|
라벨: 필수 컴파일 작업에 필요한 모든 cc_toolchain 아티팩트의 컬렉션입니다. |
compiler_files_without_includes
|
라벨: 기본값은 |
coverage_files
|
라벨: 기본값은 |
dwp_files
|
라벨: 필수 dwp 작업에 필요한 모든 cc_toolchain 아티팩트의 컬렉션입니다. |
dynamic_runtime_lib
|
라벨: 기본값은 이는 'static_link_cpp_runtimes' 기능이 사용 설정되고 종속 항목이 동적으로 연결될 때 사용됩니다. |
exec_transition_for_inputs
|
불리언, 기본값은 |
libc_top
|
라벨: 기본값은 |
linker_files
|
라벨: 필수 연결 작업에 필요한 모든 cc_toolchain 아티팩트의 컬렉션입니다. |
module_map
|
라벨: 기본값은 |
objcopy_files
|
라벨: 필수 objcopy 작업에 필요한 모든 cc_toolchain 아티팩트의 컬렉션입니다. |
output_licenses
|
문자열 목록입니다. 기본값은 |
static_runtime_lib
|
라벨: 기본값은 이는 'static_link_cpp_runtimes' 기능이 사용 설정되고 종속 항목이 정적으로 연결될 때 사용됩니다. |
strip_files
|
라벨: 필수 스트립 작업에 필요한 모든 cc_toolchain 아티팩트의 컬렉션입니다. |
supports_header_parsing
|
불리언, 기본값은 |
supports_param_files
|
불리언, 기본값은 |
toolchain_config
|
라벨: 필수 cc_toolchain_config_info를 제공하는 규칙의 라벨입니다.
|
toolchain_identifier
|
문자열, 기본값은
#5380 문제가 해결될 때까지는 |
cc_toolchain_suite
규칙 소스 보기cc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
지원 중단됨: 규칙이 no-op이며 삭제될 예정입니다.
인수
| 속성 | |
|---|---|
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
|
라벨: 기본값은 |
profile
|
라벨: 필수 FDO 프로필 또는 이를 생성하는 규칙의 라벨입니다. FDO 파일에는 색인이 생성되지 않은 LLVM 프로필의 경우 .profraw, 색인이 생성된 LLVM 프로필의 경우 .profdata, LLVM profraw 프로필을 보유하는 .zip, AutoFDO 프로필의 경우 .afdo, XBinary 프로필의 경우 .xfdo와 같은 확장자가 있을 수 있습니다. 라벨은 fdo_absolute_path_profile 규칙을 가리킬 수도 있습니다. |
proto_profile
|
라벨: 기본값은 |
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_optimize(
name = "layout",
cc_profile = "//path:cc_profile.txt",
ld_profile = "//path:ld_profile.txt"
)
인수
| 속성 | |
|---|---|
name |
이름: 필수 이 타겟의 고유한 이름입니다. |
cc_profile
|
라벨: 필수 다양한 컴파일 작업에 전달된 프로필의 라벨입니다. 이 파일의 확장자는 .txt입니다. |
ld_profile
|
라벨: 필수 링크 작업에 전달된 프로필의 라벨입니다. 이 파일의 확장자는 .txt입니다. |