C++ 도구 모음 구성

문제 신고 소스 보기 1박 · 7.2 · 7.1 · 7.0 · 6.5 · 6.4

개요

올바른 옵션으로 컴파일러를 호출하려면 Bazel이 컴파일러 내부 요소에는 디렉터리 및 중요 플래그가 포함됩니다. 즉, Bazel이 코드를 해석하려면 간소화된 컴파일러 모델이 필요합니다. 작동한다는 것입니다.

Bazel은 다음 사항을 알아야 합니다.

  • 컴파일러가 thinLTO, 모듈, 동적 링크 또는 PIC를 지원하는지 여부 (위치 독립 코드)
  • gcc, ld, ar, objcopy 등 필수 도구의 경로
  • 내장 시스템에는 디렉터리가 포함되어 있습니다. 이를 검증하려면 Bazel이 소스 파일에 포함된 모든 헤더가 BUILD 파일
  • 기본 sysroot입니다.
  • 컴파일, 연결, 보관처리에 사용할 플래그.
  • 지원되는 컴파일 모드 (opt, dbg, fastbuild)에 사용할 플래그
  • 컴파일러에 특별히 필요한 변수를 만듭니다.

컴파일러가 여러 아키텍처를 지원하는 경우 Bazel은 분리하는 것이 좋습니다

CcToolchainConfigInfo는 API에 필요한 수준의 Bazel의 C++ 규칙의 동작을 구성하기 위한 세부사항 기본적으로 Bazel이 빌드용으로 CcToolchainConfigInfo를 자동으로 구성하지만 수동으로 구성할 수 있는 옵션이 있습니다. 이를 위해서는 스타라크 법칙이 필요합니다. CcToolchainConfigInfo를 제공하며 개발자는 cc_toolchaintoolchain_config 속성을 규칙에 추가합니다. 다음을 호출하여 CcToolchainConfigInfo를 만들 수 있습니다. cc_common.create_cc_toolchain_config_info() 프로세스에 필요한 모든 구조체의 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이 cc_toolchain_suite.toolchains의 해당 항목 속성을 --cpu | --compiler로 정의하세요. Bazel이 포드에서 오류가 발생합니다.

    • --compiler 옵션을 지정하지 않으면 Bazel이 선택합니다. cc_toolchain_suite.toolchains의 해당 항목 속성을 --cpu로 정의하면 됩니다.

    • 플래그를 지정하지 않으면 Bazel이 호스트 시스템을 검사하고 발견 항목을 기준으로 --cpu 값입니다. 자세한 내용은 검사 메커니즘 코드를 설치합니다.

도구 모음이 선택되면 상응하는 featureaction_config Starlark 규칙의 객체는 빌드 구성을 제어합니다 (즉, 참조). 이러한 메시지를 통해 코드를 수정하지 않고도 Bazel에서 완전한 C++ 기능을 Bazel 바이너리 C++ 규칙은 자세히 설명된 여러 고유 작업을 지원합니다. Bazel 소스 코드에 나와 있습니다.

기능

특성은 명령줄 플래그, 작업, 종속 항목 변경이 있을 수 있습니다. 특성 BUILD 파일이 플래그(예: treat_warnings_as_errors)를 사용하거나 C++ 규칙과 다음과 같은 새로운 컴파일 작업 및 입력을 컴파일에 포함합니다. header_modules 또는 thin_lto입니다.

CcToolchainConfigInfo에 특성 목록이 포함되는 것이 이상적입니다. 각 특성으로는 기능은 하나 이상의 플래그 그룹으로 구성되며 각각 플래그 목록을 정의합니다. 각 Bazel 작업에 적용됩니다

특성은 이름으로 지정되므로 Starlark가 완전히 분리될 수 있습니다. 규칙 구성을 사용할 수 있습니다 즉, Bazel 릴리스는 CcToolchainConfigInfo 구성의 동작에 영향을 미치지 않는 한 새로운 기능을 사용하지 않아도 됩니다

기능은 다음 중 한 가지 방법으로 사용 설정됩니다.

  • 지형지물의 enabled 필드가 true로 설정됩니다.
  • Bazel 또는 규칙 소유자가 명시적으로 사용 설정합니다.
  • 사용자가 --feature Bazel 옵션 또는 features 규칙을 통해 사용 설정합니다. 속성

기능에 상호 종속 항목이 있을 수 있고 명령줄 플래그, BUILD 파일에 종속될 수 있음 설정할 수 있습니다

특성 관계

종속 항목은 일반적으로 Bazel을 통해 직접 관리되며 요구사항을 확인하고 기능의 특성에 내재된 충돌을 관리 확인할 수 있습니다 도구 모음 사양을 통해 확장 가능한 지형지물을 제어하는 Starlark 규칙 내에서 직접 사용하기 위한 제약 조건 지원 및 확장을 지원합니다 이는 다음과 같습니다.

제약조건 설명
requires = [
   feature_set (features = [
       'feature-name-1',
       'feature-name-2'
   ]),
]
특성 수준. 이 기능은 지정된 필수 항목이 포함된 경우에만 지원됩니다. 기능이 사용 설정되었습니다. 예를 들어 지형지물이 특정 빌드 모드 (opt, dbg 또는 fastbuild)을 입력합니다. '필요'에 여러 개의 `feature_set`이 포함된 경우 `feature_set`중 하나라도 충족되면 특성이 지원됩니다. (지정된 모든 기능이 사용 설정된 경우)
implies = ['feature']

특성 수준. 이 지형지물은 지정된 지형지물을 암시합니다. 또한 기능을 사용 설정하면 해당 기능을 사용하는 모든 기능도 암시적으로 사용 설정됩니다. 즉, 재귀적으로 작동합니다.

또한 시스템 내에서 기능의 공통 하위 집합을 인수 분해하는 새니타이저의 일반적인 부분과 같은 일련의 특성이 있습니다. 암시됨 기능을 사용 중지할 수 없습니다.

provides = ['feature']

특성 수준. 이 지형지물이 상호 간에 존재하는 여러 기능 중 하나임을 나타냅니다. 독점적인 대체 기능을 제공합니다. 예를 들어 모든 새니타이저는 provides = ["sanitizer"]를 지정합니다.

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

with_features = [
  with_feature_set(
    features = ['feature-1'],
    not_features = ['feature-2'],
  ),
]
플래그 집합 수준 지형지물에서 여러 플래그 집합을 여러 개 지정할 수 있습니다. with_features가 지정되면 플래그 집합은 with_feature_set가 1개 이상 있는 경우 빌드 명령어에 추가 지정된 features의 모든 지형지물이 사용 설정되고 not_features에 지정된 모든 기능이 사용 설정됨 사용 중지됩니다. with_features을 지정하지 않으면 플래그 집합은 다음과 같습니다. 무조건 적용됩니다.

작업

작업은 주어진 조건에 따라 어떤 작업을 실행할지 가정하지 않고 실행되는 것을 볼 수 있습니다. action_config는 작업이 호출하는 도구 바이너리를 지정하고 feature는 도구가 작업을 수행하는 방법을 결정하는 구성 (플래그)을 지정합니다. 작업이 호출될 때 동작합니다.

어떤 Bazel 작업을 나타내는지 알려주는 기능 참조 작업 작업이 Bazel 작업 그래프를 수정할 수 있기 때문입니다. 이 CcToolchainConfigInfo 제공자에는 플래그와 도구가 있는 작업이 포함되어 있습니다. 연결되어 있습니다(예: c++-compile). 플래그는 각 작업에 할당됨 특성과 연결합니다.

각 작업 이름은 Bazel이 수행한 단일 작업 유형을 나타냅니다. 예를 들면 다음과 같습니다. 컴파일하거나 연결할 수 있습니다. 그러나 이 데이터 세트와 모델 사이에는 다대일 관계가 actions, 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_configtools 매개변수를 통해 도구 집합을 지정할 수 있습니다. tool() 생성자는 다음 매개변수를 사용합니다.

필드 설명
path 해당 도구의 경로입니다 (현재 위치 기준).
with_features 하나 이상이 충족되어야 하는 지형지물 집합의 목록 이 도구를 적용할 수 있습니다.

지정된 action_config에 단일 tool만 적용됩니다. 도구 경로와 실행 요구사항을 Bazel 작업에 추가합니다. 도구가 선택됨 도구가 실행될 때까지 action_config에서 tools 속성을 반복합니다. 기능 구성과 일치하는 with_feature 세트가 있는 발견됨 (이 페이지 앞부분의 특성 관계 참고) 를 참조하세요. 도구 목록을 종료할 때는 도구가 표시됩니다.

사용 예

기능과 작업을 함께 사용하여 Bazel 작업을 구현할 수 있음 사용할 수 있습니다 예를 들어 macOS의 경우 컴파일 작업에서 기호를 생성한 다음 전문화된 도구를 사용하여 압축된 dSYM 아카이브를 생성합니다. 그런 다음 이 보관 파일의 압축을 풀어 애플리케이션 번들을 생성하고 .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"],
   ),
]

이 동일한 기능을 Linux에서 완전히 다르게 구현할 수 있습니다. Linux에는 fission 또는 .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 compile 컴파일 출력
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) 파일
stripotps 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인 경우 트러시 연결 작업, 그렇지 않으면 false입니다.
is_using_fission 컴파일, 링크 이 변수가 있으면 분열 (객체별 디버그 정보)이 발생했음을 나타냅니다. 활성화됩니다. 디버그 정보는 대신 .dwo 파일에 있음 .o 파일과 컴파일러와 링커가 이를 알아야 합니다.
fdo_instrument_path 컴파일, 링크 FDO 계측 프로필을 저장하는 디렉터리의 경로입니다.
fdo_profile_path compile FDO 프로필 경로입니다.
fdo_prefetch_hints_path compile 캐시 미리 가져오기 프로필의 경로입니다.
csfdo_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를 추가하여 도구 모음이 더 독립적이 되었습니다.