개요
올바른 옵션으로 컴파일러를 호출하려면 Bazel이 컴파일러 내부 요소에는 디렉터리 및 중요 플래그가 포함됩니다. 즉, Bazel이 코드를 해석하려면 간소화된 컴파일러 모델이 필요합니다. 작동한다는 것입니다.
Bazel은 다음 사항을 알아야 합니다.
- 컴파일러가 thinLTO, 모듈, 동적 링크 또는 PIC를 지원하는지 여부 (위치 독립 코드)
- gcc, ld, ar, objcopy 등 필수 도구의 경로
- 내장 시스템 포함 디렉터리 Bazel은
이러한 정보가 있어야
소스 파일에 포함된 모든 헤더가
BUILD
파일 - 기본 sysroot입니다.
- 컴파일, 연결, 보관처리에 사용할 플래그.
- 지원되는 컴파일 모드(opt, dbg, fastbuild)에 사용할 플래그입니다.
- 컴파일러에 특별히 필요한 변수를 만듭니다.
컴파일러가 여러 아키텍처를 지원하는 경우 Bazel은 분리하는 것이 좋습니다
CcToolchainConfigInfo
는 API에 필요한 수준의
Bazel의 C++ 규칙의 동작을 구성하기 위한 세부사항 기본적으로
Bazel이 빌드용으로 CcToolchainConfigInfo
를 자동으로 구성하지만
수동으로 구성할 수 있는 옵션이 있습니다. 이를 위해서는 CcToolchainConfigInfo
를 제공하는 Starlark 규칙이 필요하며 cc_toolchain
의 toolchain_config
속성을 규칙으로 가리켜야 합니다.
cc_common.create_cc_toolchain_config_info()
를 호출하여 CcToolchainConfigInfo
를 만들 수 있습니다.
프로세스에 필요한 모든 구조체의 Starlark 생성자는 @rules_cc//cc:cc_toolchain_config_lib.bzl
에서 확인할 수 있습니다.
C++ 대상이 분석 단계에 진입하면 Bazel이 적절한 항목을 선택합니다.
BUILD
파일에 기반하여 cc_toolchain
타겟을 가져오고
지정된 대상의 CcToolchainConfigInfo
제공자
cc_toolchain.toolchain_config
속성 cc_toolchain
타겟
CcToolchainProvider
를 통해 이 정보를 C++ 타겟에 전달합니다.
예를 들어 cc_binary
또는 cc_library
와 같은 규칙에 의해 인스턴스화된 컴파일 또는 연결 작업에는 다음 정보가 필요합니다.
- 사용할 컴파일러 또는 링커
- 컴파일러/링커의 명령줄 플래그
--copt/--linkopt
옵션을 통해 전달되는 구성 플래그- 환경 변수
- 작업이 실행되는 샌드박스에 필요한 아티팩트
샌드박스에 필요한 아티팩트를 제외한 위의 모든 정보는 cc_toolchain
가 가리키는 Starlark 타겟에 지정됩니다.
샌드박스로 전달할 아티팩트는 cc_toolchain
에 선언됩니다.
있습니다. 예를 들어 cc_toolchain.linker_files
속성을 사용하여 링커 바이너리와 샌드박스로 제공할 도구 모음 라이브러리를 지정할 수 있습니다.
도구 모음 선택
도구 모음 선택 로직은 다음과 같이 작동합니다.
사용자가
BUILD
파일에서cc_toolchain_suite
대상을 지정하고 포인트 대상에게 Bazel을--crosstool_top
옵션.cc_toolchain_suite
타겟은 여러 도구 모음을 참조합니다.--cpu
및--compiler
플래그의 값에 따라--cpu
플래그 값만을 기반으로 하거나 공동--cpu | --compiler
값을 기반으로 하여 선택되는 도구 모음을 결정합니다. 선정 절차는 다음과 같습니다.--compiler
옵션을 지정하면 Bazel은--cpu | --compiler
를 사용하여cc_toolchain_suite.toolchains
속성에서 상응하는 항목을 선택합니다. Bazel에서 해당 항목을 찾지 못하면 오류가 발생합니다.--compiler
옵션을 지정하지 않으면 Bazel은--cpu
만 사용하여cc_toolchain_suite.toolchains
속성에서 상응하는 항목을 선택합니다.플래그를 지정하지 않으면 Bazel은 호스트 시스템을 검사하고 발견된 내용을 기반으로
--cpu
값을 선택합니다. 검사 메커니즘 코드를 참고하세요.
도구 모음이 선택되면 상응하는 feature
및 action_config
Starlark 규칙의 객체는 빌드 구성을 제어합니다 (즉,
참조). 이러한 메시지를 통해
코드를 수정하지 않고도 Bazel에서 완전한 C++ 기능을
Bazel 바이너리 C++ 규칙은 Bazel 소스 코드에 자세히 설명된 여러 고유한 작업을 지원합니다.
기능
기능은 명령줄 플래그, 작업, 실행 환경의 제약 조건 또는 종속 항목 변경이 필요한 항목입니다. 특성
BUILD
파일이
플래그(예: treat_warnings_as_errors
)를 사용하거나 C++ 규칙과
다음과 같은 새로운 컴파일 작업 및 입력을 컴파일에 포함합니다.
header_modules
또는 thin_lto
입니다.
이상적으로 CcToolchainConfigInfo
에는 기능 목록이 포함되어야 합니다. 여기서 각 기능은 하나 이상의 플래그 그룹으로 구성되며, 각 플래그 그룹은 특정 Bazel 작업에 적용되는 플래그 목록을 정의합니다.
기능은 이름으로 지정되므로 Starlark 규칙 구성을 Bazel 출시에서 완전히 분리할 수 있습니다. 즉, Bazel 릴리스는
CcToolchainConfigInfo
구성의 동작에 영향을 미치지 않는 한
새로운 기능을 사용하지 않아도 됩니다
기능은 다음 중 한 가지 방법으로 사용 설정됩니다.
- 지형지물의
enabled
필드는true
로 설정됩니다. - Bazel 또는 규칙 소유자가 명시적으로 사용 설정합니다.
- 사용자가
--feature
Bazel 옵션 또는features
규칙을 통해 사용 설정합니다. 속성
기능은 상호 종속될 수 있으며 명령줄 플래그, BUILD
파일 설정, 기타 변수에 종속될 수 있습니다.
특성 관계
종속 항목은 일반적으로 Bazel로 직접 관리되며, Bazel은 요구사항을 적용하고 빌드에 정의된 기능의 본질에 내재된 충돌을 관리합니다. 도구 모음 사양을 통해 확장 가능한 지형지물을 제어하는 Starlark 규칙 내에서 직접 사용하기 위한 제약 조건 지원 및 확장을 지원합니다 이는 다음과 같습니다.
제약조건 | 설명 |
requires = [ feature_set (features = [ 'feature-name-1', 'feature-name-2' ]), ] |
기능 수준 이 기능은 지정된 필수 기능이 사용 설정된 경우에만 지원됩니다. 예를 들어 특정 빌드 모드(opt , dbg 또는 fastbuild )에서만 기능이 지원되는 경우입니다. `requires`에 여러 개의 `feature_set`이 포함된 경우 지정된 모든 기능이 사용 설정된 경우 `feature_set` 중 하나라도 충족되면 기능이 지원됩니다.
|
implies = ['feature'] |
기능 수준 이 지형지물은 지정된 지형지물을 암시합니다. 또한 기능을 사용 설정하면 해당 기능을 사용하는 모든 기능도 암시적으로 사용 설정됩니다. 즉, 재귀적으로 작동합니다. 또한 정리기의 공통 부분과 같은 기능 집합에서 기능의 공통 하위 집합을 제외하는 기능을 제공합니다. 암시됨 기능을 사용 중지할 수 없습니다. |
provides = ['feature'] |
특성 수준. 이 지형지물이 상호 협력하는 여러 기능 중 하나임을 나타냅니다.
독점적인 대체 기능을 제공합니다. 예를 들어 모든 정리 도구는 이렇게 하면 사용자가 요청하는 경우 대안을 나열하여 오류 처리를 개선합니다. 한 번에 두 개 이상의 상호 배타적인 기능에 사용할 수 있습니다. |
with_features = [ with_feature_set( features = ['feature-1'], not_features = ['feature-2'], ), ] |
플래그 집합 수준 기능은 multiple을 사용하여 여러 플래그 세트를 지정할 수 있습니다.
with_features 가 지정되면 플래그 집합은
with_feature_set 가 하나 이상 있는 경우 빌드 명령어에 추가
지정된 features 의 모든 지형지물이
사용 설정되고 not_features 에 지정된 모든 기능이 사용 설정됨
사용 중지됩니다.
with_features 을 지정하지 않으면 플래그 집합은 다음과 같습니다.
무조건 적용됩니다.
|
작업
작업은 작업이 실행되는 방식을 가정하지 않고도 작업이 실행되는 상황을 유연하게 수정할 수 있도록 지원합니다.
action_config
는 작업이 호출하는 도구 바이너리를 지정하고
feature
는 도구가 작업을 수행하는 방법을 결정하는 구성 (플래그)을 지정합니다.
작업이 호출될 때 동작합니다.
기능은 작업이 Bazel 작업 그래프를 수정할 수 있으므로 작업을 참조하여 영향을 주는 Bazel 작업을 알립니다. CcToolchainConfigInfo
제공자에는 c++-compile
와 같이 플래그 및 도구가 연결된 작업이 포함됩니다. 플래그는 기능과 연결하여 각 작업에 할당됩니다.
각 작업 이름은 컴파일 또는 연결과 같이 Bazel에서 실행하는 단일 유형의 작업을 나타냅니다. 그러나 작업과 Bazel 작업 유형 사이에는 다대일 관계가 있습니다. 여기서 Bazel 작업 유형은 작업을 구현하는 Java 클래스(예: CppCompileAction
)를 참조합니다. 특히 아래 표의 '어셈블러 작업' 및 '컴파일러 작업'은 CppCompileAction
이고 링크 작업은 CppLinkAction
입니다.
어셈블러 작업
작업 | 설명 |
preprocess-assemble
|
전처리로 조합합니다. 일반적으로 .S 파일에 사용됩니다.
|
assemble
|
전처리 없이 조립합니다. 일반적으로 .s 파일에 사용됩니다.
|
컴파일러 작업
작업 | 설명 |
cc-flags-make-variable
|
CC_FLAGS 를 genrule에 전파합니다.
|
c-compile
|
C로 컴파일합니다. |
c++-compile
|
C++로 컴파일합니다. |
c++-header-parsing
|
헤더 파일에서 컴파일러의 파서를 실행하여 헤더가 독립형인지 확인합니다. 그렇지 않으면 컴파일 오류가 발생합니다. 모듈을 지원하는 도구 모음에만 적용됩니다. |
링크 작업
작업 | 설명 |
c++-link-dynamic-library
|
모든 종속 항목이 포함된 공유 라이브러리를 연결합니다. |
c++-link-nodeps-dynamic-library
|
소스 cc_library 개만 포함된 공유 라이브러리를 연결합니다.
|
c++-link-executable
|
즉시 실행할 수 있는 최종 라이브러리를 연결합니다. |
AR 작업
AR 작업은 ar
를 통해 객체 파일을 보관 파일 라이브러리(.a
파일)로 조합하고 일부 시맨틱을 이름에 인코딩합니다.
작업 | 설명 |
c++-link-static-library
|
정적 라이브러리(보관 파일)를 만듭니다. |
LTO 작업
작업 | 설명 |
lto-backend
|
비트코드를 네이티브 객체로 컴파일하는 ThinLTO 작업 |
lto-index
|
전역 색인을 생성하는 ThinLTO 작업 |
action_config 사용
action_config
는 작업 중에 호출할 도구(바이너리)와 기능에 의해 정의된 플래그 집합을 지정하여 Bazel 작업을 설명하는 Starlark 구조체입니다. 이 플래그는 작업 실행에 제약조건을 적용합니다.
action_config()
생성자에는 다음과 같은 매개변수가 있습니다.
속성 | 설명 |
action_name
|
이 작업에 해당하는 Bazel 작업입니다. Bazel은 이 속성을 사용하여 작업별 도구 및 실행 요구사항을 찾습니다. |
tools
|
호출할 실행 파일입니다. 작업에 적용되는 도구는 기능 구성과 일치하는 기능 세트가 있는 목록의 첫 번째 도구입니다. 기본값을 입력해야 합니다. |
flag_sets
|
작업 그룹에 적용되는 플래그 목록입니다. 기능과 동일합니다. |
env_sets
|
작업 그룹에 적용되는 환경 제약 조건 목록입니다. 기능과 동일합니다. |
action_config
는 앞에서 설명한 지형지물 관계에 따라 다른 지형지물 및 action_config
을 요구하고 암시할 수 있습니다. 이 동작은 기능의 동작과 유사합니다.
마지막 두 속성은 페이지의 해당 속성과 중복됩니다.
일부 Bazel 작업에는 특정 플래그 또는
환경 변수이며 목표는 불필요한 사용을 피하는 것입니다. action_config
+feature
쌍. 일반적으로 여러 action_config
에서 단일 지형지물을 공유하는 것이 좋습니다.
동일한 도구 모음 내에서 동일한 action_name
로 action_config
를 두 개 이상 정의할 수 없습니다. 이렇게 하면 도구 경로의 모호성이 방지되고 action_config
의 의도, 즉 작업의 속성이 도구 모음의 한곳에서 명확하게 설명된다는 의도가 적용됩니다.
도구 생성자 사용
action_config
는 tools
매개변수를 통해 도구 집합을 지정할 수 있습니다.
tool()
생성자는 다음 매개변수를 사용합니다.
필드 | 설명 |
path
|
해당 도구의 경로(현재 위치를 기준으로 함) |
with_features
|
하나 이상이 충족되어야 하는 지형지물 집합의 목록 이 도구를 적용할 수 있습니다. |
지정된 action_config
의 경우 단일 tool
만 도구 경로와 실행 요구사항을 Bazel 작업에 적용합니다. 도구가 선택됨
도구가 실행될 때까지 action_config
에서 tools
속성을 반복합니다.
기능 구성과 일치하는 with_feature
세트가 있는 발견됨
(이 페이지 앞부분의 특성 관계 참고)
를 참조하세요. 도구 목록을 종료할 때는
도구가 표시됩니다.
사용 예
기능과 작업을 함께 사용하여 Bazel 작업을 구현할 수 있음
사용할 수 있습니다 예를 들어 macOS에서 디버그 기호를 생성하려면 컴파일 작업에서 기호를 생성한 다음 링크 작업 중에 특수 도구를 호출하여 압축된 dsym 보관 파일을 만든 후 이 보관 파일의 압축을 풀어 Xcode에서 사용할 수 있는 애플리케이션 번들 및 .plist
파일을 만들어야 합니다.
Bazel을 사용하면 이 프로세스를 대신 다음과 같이 구현할 수 있습니다.
unbundle-debuginfo
는 Bazel 작업임:
load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")
action_configs = [
action_config (
action_name = ACTION_NAMES.cpp_link_executable,
tools = [
tool(
with_features = [
with_feature(features=["generate-debug-symbols"]),
],
path = "toolchain/mac/ld-with-dsym-packaging",
),
tool (path = "toolchain/mac/ld"),
],
),
]
features = [
feature(
name = "generate-debug-symbols",
flag_sets = [
flag_set (
actions = [
ACTION_NAMES.c_compile,
ACTION_NAMES.cpp_compile
],
flag_groups = [
flag_group(
flags = ["-g"],
),
],
)
],
implies = ["unbundle-debuginfo"],
),
]
동일한 기능이 fission
를 사용하는 Linux와 .pdb
파일을 생성하는 Windows에서 완전히 다르게 구현될 수 있습니다. 예를 들어 fission
기반 디버그 기호 생성의 구현은 다음과 같습니다.
load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")
action_configs = [
action_config (
name = ACTION_NAMES.cpp_compile,
tools = [
tool(
path = "toolchain/bin/gcc",
),
],
),
]
features = [
feature (
name = "generate-debug-symbols",
requires = [with_feature_set(features = ["dbg"])],
flag_sets = [
flag_set(
actions = [ACTION_NAMES.cpp_compile],
flag_groups = [
flag_group(
flags = ["-gsplit-dwarf"],
),
],
),
flag_set(
actions = [ACTION_NAMES.cpp_link_executable],
flag_groups = [
flag_group(
flags = ["-Wl", "--gdb-index"],
),
],
),
],
),
]
신고 그룹
CcToolchainConfigInfo
를 사용하면
특정 목적을 달성하는 데
도움이 될 수 있습니다 사전 정의된 변수를 사용하여 에 플래그를 지정할 수 있습니다.
는 플래그 값 내에 있으며, 플래그를
build 명령어를 사용하여 빌드됩니다 예를 들면 다음과 같습니다.
flag_group (
flags = ["%{output_execpath}"],
)
이 경우 플래그의 내용은 출력 파일 경로로 대체됩니다. 확인할 수 있습니다.
플래그 그룹은 표시된 순서대로 빌드 명령어로 확장됩니다. 위에서 아래로, 왼쪽에서 오른쪽으로 이동합니다.
빌드 명령어에 추가할 때 다른 값으로 반복해야 하는 플래그의 경우 플래그 그룹은 list
유형의 변수를 반복할 수 있습니다. 예를 들어
list
유형의 변수 include_path
:
flag_group (
iterate_over = "include_paths",
flags = ["-I%{include_paths}"],
)
include_paths
목록의 각 경로 요소에 대해 -I<path>
로 확장됩니다. 플래그 그룹 선언의 본문에 있는 모든 플래그(또는 flag_group
)는 단위로 확장됩니다. 예를 들면 다음과 같습니다.
flag_group (
iterate_over = "include_paths",
flags = ["-I", "%{include_paths}"],
)
include_paths
목록의 각 경로 요소에 관해 -I <path>
로 확장됩니다.
변수는 여러 번 반복될 수 있습니다. 예를 들면 다음과 같습니다.
flag_group (
iterate_over = "include_paths",
flags = ["-iprefix=%{include_paths}", "-isystem=%{include_paths}"],
)
다음으로 확장됩니다.
-iprefix=<inc0> -isystem=<inc0> -iprefix=<inc1> -isystem=<inc1>
변수는 점 표기법을 사용하여 액세스할 수 있는 구조에 해당할 수 있습니다. 예를 들면 다음과 같습니다.
flag_group (
flags = ["-l%{libraries_to_link.name}"],
)
구조체는 중첩될 수 있으며 시퀀스를 포함할 수도 있습니다. 이름 충돌 방지 명시적으로 지정하려면 필드에 전체 경로를 지정해야 합니다. 예를 들면 다음과 같습니다.
flag_group (
iterate_over = "libraries_to_link",
flag_groups = [
flag_group (
iterate_over = "libraries_to_link.shared_libraries",
flags = ["-l%{libraries_to_link.shared_libraries.name}"],
),
],
)
조건부 확장
플래그 그룹은 특정 항목의 존재 여부에 따라 조건부 확장을 지원합니다.
변수 또는 필드(expand_if_available
, expand_if_not_available
사용)
expand_if_true
, expand_if_false
또는 expand_if_equal
속성 예를 들면 다음과 같습니다.
flag_group (
iterate_over = "libraries_to_link",
flag_groups = [
flag_group (
iterate_over = "libraries_to_link.shared_libraries",
flag_groups = [
flag_group (
expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
flags = ["--whole_archive"],
),
flag_group (
flags = ["-l%{libraries_to_link.shared_libraries.name}"],
),
flag_group (
expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
flags = ["--no_whole_archive"],
),
],
),
],
)
CcToolchainConfigInfo 참조
이 섹션에서는 빌드 변수, 기능, 기타 애플리케이션 빌드에 관해 필요한 모든 정보를 제공합니다.
CcToolchainConfigInfo 빌드 변수
다음은 CcToolchainConfigInfo
빌드 변수의 참조입니다.
변수 | 작업 | 설명 |
source_file
|
compile | 컴파일할 소스 파일입니다. |
input_file
|
strip | 제거할 아티팩트입니다. |
output_file
|
컴파일, 스트립 | 컴파일 출력입니다. |
output_assembly_file
|
compile | 생성된 어셈블리 파일
compile 작업은 일반적으로
--save_temps 플래그. 콘텐츠는
output_file
|
output_preprocess_file
|
compile | 사전 처리된 출력입니다. 컴파일에만 적용
소스 파일만 사전 처리하는 작업(일반적으로
--save_temps 플래그. 콘텐츠는 output_file 와 동일합니다.
|
includes
|
compile | 컴파일러가 필수 파일 시퀀스 컴파일된 소스에 무조건 포함됩니다. |
include_paths
|
compile | 컴파일러가 #include<foo.h> 및 #include "foo.h" 를 사용하여 포함된 헤더를 검색하는 시퀀스 디렉터리입니다.
|
quote_include_paths
|
compile | -iquote 시퀀스에는 컴파일러가 #include "foo.h" 를 사용하여 포함된 헤더를 검색하는 디렉터리가 포함됩니다.
|
system_include_paths
|
compile | -isystem 시퀀스에는 컴파일러가 #include <foo.h> 를 사용하여 포함된 헤더를 검색하는 디렉터리가 포함됩니다.
|
dependency_file
|
compile | 컴파일러에서 생성한 .d 종속 항목 파일
|
preprocessor_defines
|
compile | defines 의 시퀀스입니다(예: --DDEBUG ).
|
pic
|
compile | 출력을 위치 독립 코드로 컴파일합니다. |
gcov_gcno_file
|
compile | gcov 적용 범위 파일
|
per_object_debug_info_file
|
compile | 객체별 디버그 정보(.dwp ) 파일입니다.
|
stripopts
|
strip | stripopts 의 시퀀스
|
legacy_compile_flags
|
compile | 레거시의 플래그 시퀀스
CROSSTOOL 필드(예: compiler_flag ,
optional_compiler_flag , cxx_flag ,
optional_cxx_flag 입니다.
|
user_compile_flags
|
compile | copt 규칙 속성 또는 --copt , --cxxopt , --conlyopt 플래그의 플래그 시퀀스입니다.
|
unfiltered_compile_flags
|
compile | unfiltered_cxx_flag 기존 CROSSTOOL 필드 또는 unfiltered_compile_flags 기능의 플래그 시퀀스입니다. 이는 다음을 기준으로 필터링되지 않습니다.
nocopts 규칙 속성
|
sysroot
|
sysroot
|
|
runtime_library_search_directories
|
링크 | 링커 런타임 검색 경로의 항목 (일반적으로
-rpath 플래그로 설정됨).
|
library_search_directories
|
링크 | 링커 검색 경로의 항목 (일반적으로
-L 플래그).
|
libraries_to_link
|
링크 | 링커 호출의 입력으로 연결할 파일을 제공하는 플래그입니다. |
def_file_path
|
링크 | MSVC를 사용하는 Windows에서 사용되는 def 파일의 위치입니다. |
linker_param_file
|
링크 | 명령줄 길이 제한을 극복하기 위해 bazel에서 만든 링커 매개변수 파일의 위치입니다. |
output_execpath
|
링크 | 링커의 출력의 Execpath입니다. |
generate_interface_library
|
링크 | 인터페이스 라이브러리가 있어야 하는지 여부에 따라 "yes" 또는 "no"
있습니다.
|
interface_library_builder_path
|
링크 | 인터페이스 라이브러리 빌더 도구의 경로입니다. |
interface_library_input_path
|
링크 | 인터페이스 라이브러리 ifso 빌더 도구의 입력입니다.
|
interface_library_output_path
|
링크 | ifso 빌더 도구를 사용하여 인터페이스 라이브러리를 생성하는 경로입니다.
|
legacy_link_flags
|
링크 | 기존 CROSSTOOL 필드에서 가져온 링커 플래그입니다.
|
user_link_flags
|
링크 | --linkopt 또는 linkopts 속성에서 가져온 링커 플래그입니다.
|
linkstamp_paths
|
링크 | linkstamp 경로를 제공하는 빌드 변수입니다. |
force_pic
|
링크 | 이 변수가 있으면 PIC/PIE 코드가 생성되어야 합니다 (Bazel 옵션 `--force_pic` 이 전달됨). |
strip_debug_symbols
|
링크 | 이 변수가 있는 경우 디버그 기호를 제거해야 함을 나타냅니다. |
is_cc_test
|
링크 | 현재 작업이 cc_test 연결 작업인 경우 true이고, 그렇지 않으면 false입니다.
|
is_using_fission
|
컴파일, 링크 | 이 변수가 있으면 분열 (객체별 디버그 정보)이 발생했음을 나타냅니다.
활성화됩니다. 디버그 정보는 대신 .dwo 파일에 있음
.o 파일과 컴파일러와 링커가 이를 알아야 합니다.
|
fdo_instrument_path
|
컴파일, 링크 | FDO 계측 프로필을 저장하는 디렉터리의 경로입니다. |
fdo_profile_path
|
compile | FDO 프로필의 경로입니다. |
fdo_prefetch_hints_path
|
compile | 캐시 미리 가져오기 프로필의 경로입니다. |
cs_fdo_instrument_path
|
컴파일, 연결 | 컨텍스트 인식 FDO가 저장되는 디렉터리 경로 계측 프로필 |
잘 알려진 지형지물
다음은 기능 및 활성화 조건에 관한 참조입니다.
기능 | 문서 |
opt | dbg | fastbuild
|
컴파일 모드에 따라 기본적으로 사용 설정됩니다. |
static_linking_mode | dynamic_linking_mode
|
연결 모드에 따라 기본적으로 사용 설정됩니다. |
per_object_debug_info
|
supports_fission 기능이 지정되고
현재 컴파일 모드는
--fission 플래그.
|
supports_start_end_lib
|
사용 설정되고 --start_end_lib 옵션이 설정된 경우 Bazel
정적 라이브러리에 대해 링크하지 않고 대신
객체에 연결하는 --start-lib/--end-lib 링커 옵션
할 수 있습니다. 이렇게 하면 Bazel에서 정적 라이브러리를 빌드할 필요가 없으므로 빌드 속도가 빨라집니다.
|
supports_interface_shared_libraries
|
--interface_shared_objects 옵션이 사용 설정된 경우
설정된 경우 Bazel은 linkstatic 가
공유된 인터페이스에 대해 false (기본적으로 cc_test 초)
제공합니다 이렇게 하면 점진적으로 다시 연결하는 속도가 더 빨라집니다.
|
supports_dynamic_linker
|
사용 설정하면 C++ 규칙은 도구 모음이 공유 라이브러리를 생성할 수 있음을 알 수 있습니다. |
static_link_cpp_runtimes
|
사용 설정하면 Bazel이 정적 연결에서 C++ 런타임을 정적으로 연결합니다.
동적 링크 모드에서 동적으로 사용할 수 있습니다. 연결 모드에 따라 cc_toolchain.static_runtime_lib 또는 cc_toolchain.dynamic_runtime_lib 속성에 지정된 아티팩트가 연결 작업에 추가됩니다.
|
supports_pic
|
이를 활성화하면 툴체인이 동적 라이브러리에 PIC 객체를 사용한다는 것을 알게 됩니다. PIC 컴파일이 필요할 때마다 `pic` 변수가 존재합니다. 사용 설정되지 않은 경우 `--force_pic` 이 전달되면 Bazel은 `supports_pic` 을 요청하고 이 기능이 사용 설정되어 있는지 확인합니다. 기능이 없거나 사용할 수 없는 경우 `--force_pic` 을 사용할 수 없습니다. |
static_linking_mode | dynamic_linking_mode
|
연결 모드에 따라 기본적으로 사용 설정됩니다. |
no_legacy_features
|
Bazel이 기존 기능을 C++ 구성이 있는 경우 전체 목록 보기 참조하세요. |
기존 기능 패치 로직
Bazel은 이전 버전과의 호환성을 위해 도구 모음의 기능에 다음과 같은 변경사항을 적용합니다.
legacy_compile_flags
기능을 도구 모음 상단으로 이동합니다.default_compile_flags
기능을 도구 모음 상단으로 이동합니다.- 도구 모음 상단에
dependency_file
(없는 경우) 기능을 추가합니다. - 도구 모음 상단에
pic
(없는 경우) 기능을 추가합니다. - 도구 모음 상단에
per_object_debug_info
기능 (없는 경우)을 추가합니다. - 도구 모음 상단에
preprocessor_defines
기능 (없는 경우)을 추가합니다. - 도구 모음 상단에
includes
기능 (없는 경우)을 추가합니다. - 도구 모음 상단에
include_paths
기능 (없는 경우)을 추가합니다. - 도구 모음 상단에
fdo_instrument
(없는 경우) 기능을 추가합니다. - 도구 모음 상단에
fdo_optimize
기능 (없는 경우)을 추가합니다. - 도구 모음 상단에
cs_fdo_instrument
기능 (없는 경우)을 추가합니다. - 도구 모음 상단에
cs_fdo_optimize
기능 (없는 경우)을 추가합니다. - 도구 모음 상단에
fdo_prefetch_hints
(없는 경우) 기능을 추가합니다. - 도구 모음 상단에
autofdo
(없는 경우) 기능을 추가합니다. - 도구 모음 상단에
build_interface_libraries
(없는 경우) 기능을 추가합니다. - 도구 모음 상단에
dynamic_library_linker_tool
기능 (없는 경우)을 추가합니다. - 도구 모음 상단에
shared_flag
(없는 경우) 기능을 추가합니다. - 도구 모음 상단에
linkstamps
(없는 경우) 기능을 추가합니다. - 도구 모음 상단에
output_execpath_flags
(없는 경우) 기능을 추가합니다. - 도구 모음 상단에
runtime_library_search_directories
기능 (없는 경우)을 추가합니다. - 도구 모음 상단에
library_search_directories
기능 (없는 경우)을 추가합니다. - 도구 모음 상단에
archiver_flags
기능 (없는 경우)을 추가합니다. - 도구 모음 상단에
libraries_to_link
(없는 경우) 기능을 추가합니다. - 도구 모음 상단에
force_pic_flags
기능 (없는 경우)을 추가합니다. - 도구 모음 상단에
user_link_flags
(없는 경우) 기능을 추가합니다. - 도구 모음 상단에
legacy_link_flags
(없는 경우) 기능을 추가합니다. - 도구 모음 상단에
static_libgcc
(없는 경우) 기능을 추가합니다. - 도구 모음 상단에
fission_support
(없는 경우) 기능을 추가합니다. - 도구 모음 상단에
strip_debug_symbols
기능 (없는 경우)을 추가합니다. - 도구 모음 상단에
coverage
(없는 경우) 기능을 추가합니다. - 도구 모음 상단에
llvm_coverage_map_format
(없는 경우) 기능을 추가합니다. - 도구 모음 상단에
gcc_coverage_map_format
(없는 경우) 기능을 추가합니다. - 도구 모음 하단에
fully_static_link
기능 (없는 경우)을 추가합니다. - 도구 모음 하단에
user_compile_flags
기능 (없는 경우)을 추가합니다. - 도구 모음 하단에
sysroot
기능 (없는 경우)을 추가합니다. - 도구 모음 하단에
unfiltered_compile_flags
(없는 경우) 기능을 추가합니다. - 도구 모음 하단에
linker_param_file
(없는 경우) 기능을 추가합니다. - 도구 모음 하단에
compiler_input_flags
(없는 경우) 기능을 추가합니다. - 도구 모음 하단에
compiler_output_flags
기능 (없는 경우)을 추가합니다.
다음은 기능 목록입니다. 계획은 한 번 삭제하면
Starlark의 Crosstool은
완료되었습니다. 궁금한 점은
CppActionConfigs
프로덕션 도구 모음의 경우 no_legacy_features
를 추가하여
도구 모음이 더 독립적이 되었습니다.