C++ 도구 모음 구성

<ph type="x-smartling-placeholder"></ph> 문제 신고 <ph type="x-smartling-placeholder"></ph> 소스 보기 1박 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

개요

올바른 옵션으로 컴파일러를 호출하려면 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_toolchaintoolchain_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 속성을 사용하여 링커 바이너리와 샌드박스로 제공할 도구 모음 라이브러리를 지정할 수 있습니다.

도구 모음 선택

도구 모음 선택 로직은 다음과 같이 작동합니다.

  1. 사용자가 BUILD 파일에서 cc_toolchain_suite 대상을 지정하고 포인트 대상에게 Bazel을 --crosstool_top 옵션.

  2. 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 값을 선택합니다. 검사 메커니즘 코드를 참고하세요.

도구 모음이 선택되면 상응하는 featureaction_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']

특성 수준. 이 지형지물이 상호 협력하는 여러 기능 중 하나임을 나타냅니다. 독점적인 대체 기능을 제공합니다. 예를 들어 모든 정리 도구는 provides = ["sanitizer"]를 지정할 수 있습니다.

이렇게 하면 사용자가 요청하는 경우 대안을 나열하여 오류 처리를 개선합니다. 한 번에 두 개 이상의 상호 배타적인 기능에 사용할 수 있습니다.

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_nameaction_config를 두 개 이상 정의할 수 없습니다. 이렇게 하면 도구 경로의 모호성이 방지되고 action_config의 의도, 즉 작업의 속성이 도구 모음의 한곳에서 명확하게 설명된다는 의도가 적용됩니다.

도구 생성자 사용

action_configtools 매개변수를 통해 도구 집합을 지정할 수 있습니다. 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를 추가하여 도구 모음이 더 독립적이 되었습니다.