플랫폼 및 도구 모음 규칙

문제 신고 소스 보기 Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

이 규칙 집합은 빌드하려는 특정 하드웨어 플랫폼을 모델링하고 이러한 플랫폼의 코드를 컴파일하는 데 필요한 특정 도구를 지정할 수 있도록 하기 위해 존재합니다. 사용자는 여기에 설명된 개념을 잘 알고 있어야 합니다.

규칙

constraint_setting

규칙 소스 보기
constraint_setting(name, default_constraint_value, deprecation, distribs, features, licenses, tags, testonly, visibility)

이 규칙은 플랫폼에서 값을 지정할 수 있는 새로운 제약 조건 유형을 도입하는 데 사용됩니다. 예를 들어 플랫폼에 설치된 glibc 라이브러리의 버전이 서로 다를 수 있는 기능을 나타내기 위해 'glibc_version'이라는 constraint_setting를 정의할 수 있습니다. 자세한 내용은 플랫폼 페이지를 참고하세요.

constraint_setting에는 확장 가능한 연결된 constraint_value 집합이 있습니다. 일반적으로 이러한 설정은 동일한 패키지에 정의되지만, 때로는 다른 패키지에서 기존 설정에 새로운 값을 도입하기도 합니다. 예를 들어 사전 정의된 설정 @platforms//cpu:cpu는 잘 알려지지 않은 CPU 아키텍처를 타겟팅하는 플랫폼을 정의하기 위해 맞춤 값으로 확장할 수 있습니다.

인수

속성
name

이름: 필수

이 타겟의 고유한 이름입니다.

default_constraint_value

이름; 구성할 수 없음; 기본값은 None

값이 제공되지 않은 경우 사용할 이 설정의 기본값 라벨입니다. 이 속성이 있으면 이 constraint_setting와 동일한 패키지에서 가리키는 constraint_value가 정의되어야 합니다.

제약 조건 설정에 기본값이 있는 경우 플랫폼이 해당 설정의 제약 조건 값을 포함하지 않으면 플랫폼이 기본값을 지정한 것과 같습니다. 그렇지 않고 기본값이 없으면 제약 조건 설정이 해당 플랫폼에서 지정되지 않은 것으로 간주됩니다. 이 경우 플랫폼은 해당 설정에 특정 값이 필요한 제약 조건 목록 (예: config_setting)과 일치하지 않습니다.

constraint_value

규칙 소스 보기
constraint_value(name, constraint_setting, deprecation, distribs, features, licenses, tags, testonly, visibility)
이 규칙은 지정된 제약 조건 유형의 새 값을 도입합니다. 자세한 내용은 플랫폼 페이지를 참고하세요.

다음은 CPU 아키텍처를 나타내는 사전 정의된 constraint_value의 새로운 가능한 값을 만듭니다.

constraint_value(
    name = "mips",
    constraint_setting = "@platforms//cpu:cpu",
)
그러면 플랫폼은 x86_64, arm 등의 대안으로 mips 아키텍처가 있다고 선언할 수 있습니다.

인수

속성
name

이름: 필수

이 타겟의 고유한 이름입니다.

constraint_setting

라벨; 구성할 수 없음; 필수

constraint_value이 선택 가능한 constraint_setting입니다.

platform

규칙 소스 보기
platform(name, constraint_values, deprecation, distribs, exec_properties, features, flags, licenses, parents, remote_execution_properties, required_settings, tags, testonly, visibility)

이 규칙은 빌드의 일부가 실행될 수 있는 환경을 설명하는 제약 조건 선택사항(예: CPU 아키텍처 또는 컴파일러 버전)의 명명된 컬렉션인 새 플랫폼을 정의합니다. 자세한 내용은 플랫폼 페이지를 참고하세요.

이는 ARM에서 Linux를 실행하는 환경을 설명하는 플랫폼을 정의합니다.

platform(
    name = "linux_arm",
    constraint_values = [
        "@platforms//os:linux",
        "@platforms//cpu:arm",
    ],
)

플랫폼 플래그

플랫폼은 flags 속성을 사용하여 플랫폼이 타겟 플랫폼 (즉, --platforms 플래그의 값)으로 사용될 때마다 구성에 추가될 플래그 목록을 지정할 수 있습니다.

플랫폼에서 설정된 플래그는 사실상 우선순위가 가장 높으며 명령줄, rc 파일 또는 전환에서 해당 플래그의 이전 값을 덮어씁니다.

platform(
    name = "foo",
    flags = [
        "--dynamic_mode=fully",
        "--//bool_flag",
        "--no//package:other_bool_flag",
    ],
)

이렇게 하면 foo이라는 플랫폼이 정의됩니다. 이것이 타겟 플랫폼인 경우 (사용자가 --platforms//:foo를 지정했거나, 전환으로 //command_line_option:platforms 플래그가 ["//:foo"]로 설정되었거나, //:foo가 실행 플랫폼으로 사용된 경우) 지정된 플래그가 구성에 설정됩니다.

플랫폼 및 반복 가능한 플래그

일부 플래그는 반복될 때 값을 누적합니다(예: --features, --copt, config.string(repeatable = True)로 생성된 모든 Starlark 플래그). 이러한 플래그는 플랫폼에서 플래그를 설정하는 것과 호환되지 않습니다. 대신 이전 값이 모두 삭제되고 플랫폼의 값으로 덮어쓰여집니다.

예를 들어 다음 플랫폼이 주어지면 build --platforms=//:repeat_demo --features feature_a --features feature_b 호출은 --feature 플래그 값이 ["feature_c", "feature_d"]이 되어 명령줄에 설정된 기능을 삭제합니다.

platform(
    name = "repeat_demo",
    flags = [
        "--features=feature_c",
        "--features=feature_d",
    ],
)

따라서 flags 속성에서 반복 가능한 플래그를 사용하는 것은 권장되지 않습니다.

플랫폼 상속

플랫폼은 parents 속성을 사용하여 제약 조건 값을 상속할 다른 플랫폼을 지정할 수 있습니다. parents 속성은 목록을 사용하지만 현재는 단일 값만 지원되며 여러 상위 요소를 지정하면 오류가 발생합니다.

플랫폼에서 제약 조건 설정 값을 확인할 때는 먼저 직접 설정된 값(constraint_values 속성을 통해)을 확인하고, 그런 다음 상위 항목의 제약 조건 값을 확인합니다. 이 과정은 상위 플랫폼 체인에서 재귀적으로 계속됩니다. 이러한 방식으로 플랫폼에 직접 설정된 값은 상위에 설정된 값을 재정의합니다.

플랫폼은 상위 플랫폼에서 exec_properties 속성을 상속합니다. 상위 및 하위 플랫폼의 exec_properties에 있는 사전 항목이 결합됩니다. 상위 요소와 하위 요소의 exec_properties에 동일한 키가 표시되면 하위 요소의 값이 사용됩니다. 하위 플랫폼에서 빈 문자열을 값으로 지정하면 해당 속성이 설정 해제됩니다.

플랫폼은 상위 플랫폼에서 (지원 중단된) remote_execution_properties 속성을 상속할 수도 있습니다. 참고: 새 코드에서는 exec_properties을 사용해야 합니다. 아래에 설명된 로직은 기존 동작과 호환되도록 유지되지만 향후 삭제될 예정입니다. 상위 플랫폼이 있는 경우 remote_execution_platform 설정 로직은 다음과 같습니다.

  1. 자녀 플랫폼에 remote_execution_property이 설정되지 않은 경우 부모의 remote_execution_properties이 사용됩니다.
  2. remote_execution_property이 하위 플랫폼에 설정되어 있고 리터럴 문자열 {PARENT_REMOTE_EXECUTION_PROPERTIES}가 포함되어 있으면 해당 매크로는 상위 remote_execution_property 속성의 콘텐츠로 대체됩니다.
  3. remote_execution_property이 하위 플랫폼에 설정되어 있고 매크로를 포함하지 않는 경우 하위의 remote_execution_property이 변경되지 않고 사용됩니다.

remote_execution_properties는 지원 중단되고 단계적으로 폐지되므로 동일한 상속 체인에서 remote_execution_propertiesexec_properties를 혼합할 수 없습니다. 지원 중단된 remote_execution_properties보다 exec_properties을 사용하는 것이 좋습니다.

예: 제약 조건 값

platform(
    name = "parent",
    constraint_values = [
        "@platforms//os:linux",
        "@platforms//cpu:arm",
    ],
)
platform(
    name = "child_a",
    parents = [":parent"],
    constraint_values = [
        "@platforms//cpu:x86_64",
    ],
)
platform(
    name = "child_b",
    parents = [":parent"],
)

이 예에서 하위 플랫폼에는 다음과 같은 속성이 있습니다.

  • child_a에는 제약 조건 값 @platforms//os:linux (상위 항목에서 상속됨)과 @platforms//cpu:x86_64 (플랫폼에서 직접 설정됨)이 있습니다.
  • child_b는 상위 항목에서 모든 제약 조건 값을 상속하며 자체 값을 설정하지 않습니다.

예: 실행 속성

platform(
    name = "parent",
    exec_properties = {
      "k1": "v1",
      "k2": "v2",
    },
)
platform(
    name = "child_a",
    parents = [":parent"],
)
platform(
    name = "child_b",
    parents = [":parent"],
    exec_properties = {
      "k1": "child"
    }
)
platform(
    name = "child_c",
    parents = [":parent"],
    exec_properties = {
      "k1": ""
    }
)
platform(
    name = "child_d",
    parents = [":parent"],
    exec_properties = {
      "k3": "v3"
    }
)

이 예에서 하위 플랫폼에는 다음과 같은 속성이 있습니다.

  • child_a은 상위 요소의 'exec_properties'를 상속하고 자체적으로 설정하지 않습니다.
  • child_b은 상위의 exec_properties을 상속하고 k1 값을 재정의합니다. exec_properties{ "k1": "child", "k2": "v2" }입니다.
  • child_c은 상위 항목의 exec_properties을 상속하고 k1을 설정 해제합니다. exec_properties{ "k2": "v2" }입니다.
  • child_d는 상위 요소의 exec_properties을 상속하고 새 속성을 추가합니다. exec_properties{ "k1": "v1", "k2": "v2", "k3": "v3" }입니다.

인수

속성
name

이름: 필수

이 타겟의 고유한 이름입니다.

constraint_values

라벨 목록입니다. 구성할 수 없습니다. 기본값은 []입니다.

이 플랫폼이 포함하는 제약 조건 선택사항의 조합입니다. 플랫폼이 특정 환경에 적용되려면 환경에 이 목록의 값이 하나 이상 있어야 합니다.

이 목록의 각 constraint_value는 서로 다른 constraint_setting에 대한 것이어야 합니다. 예를 들어 CPU 아키텍처가 @platforms//cpu:x86_64@platforms//cpu:arm 모두여야 하는 플랫폼은 정의할 수 없습니다.

exec_properties

사전: 문자열 -> 문자열; 구성할 수 없음; 기본값은 {}입니다.

작업이 원격으로 실행되는 방식에 영향을 주는 문자열의 맵입니다. Bazel은 이를 해석하려고 시도하지 않으며 원격 실행 프로토콜의 플랫폼 필드를 통해 전달되는 불투명 데이터로 처리됩니다. 여기에는 상위 플랫폼의 exec_properties 속성에서 가져온 데이터가 포함됩니다. 하위 및 상위 플랫폼에서 동일한 키를 정의하는 경우 하위 플랫폼의 값이 유지됩니다. 빈 문자열인 값과 연결된 키는 사전에서 삭제됩니다. 이 속성은 지원 중단된 remote_execution_properties를 완전히 대체합니다.
flags

문자열 목록; 구성할 수 없음; 기본값은 []입니다.

이 플랫폼이 구성에서 타겟 플랫폼으로 사용될 때 사용 설정되는 플래그 목록입니다. 전환에서 설정할 수 있는 플래그만 사용할 수 있습니다.
parents

라벨 목록입니다. 구성할 수 없습니다. 기본값은 []입니다.

이 플랫폼이 상속해야 하는 platform 타겟의 라벨입니다. 이 속성은 목록을 사용하지만 플랫폼은 하나만 있어야 합니다. 이 플랫폼에 직접 설정되지 않은 constraint_settings는 상위 플랫폼에서 확인할 수 있습니다. 자세한 내용은 플랫폼 상속 섹션을 참고하세요.
remote_execution_properties

문자열, 구성 불가, 기본값은 ""

DEPRECATED. 대신 exec_properties 속성을 사용하세요. 원격 실행 플랫폼을 구성하는 데 사용되는 문자열입니다. 실제 빌드는 이를 해석하려고 시도하지 않으며 특정 SpawnRunner에서 사용할 수 있는 불투명 데이터로 취급됩니다. 여기에는 '{PARENT_REMOTE_EXECUTION_PROPERTIES}' 매크로를 사용하여 상위 플랫폼의 'remote_execution_properties' 속성에서 가져온 데이터가 포함될 수 있습니다. 자세한 내용은 플랫폼 상속 섹션을 참고하세요.
required_settings

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

이 플랫폼이 도구 모음 확인 중에 실행 플랫폼으로 사용되려면 타겟 구성에서 충족해야 하는 config_setting 목록입니다. 필수 설정은 상위 플랫폼에서 상속되지 않습니다.

도구 모음

규칙 소스 보기
toolchain(name, deprecation, distribs, exec_compatible_with, features, licenses, tags, target_compatible_with, target_settings, testonly, toolchain, toolchain_type, visibility)

이 규칙은 도구 모음 확인 중에 선택할 수 있도록 특정 도구 모음의 유형과 제약 조건을 선언합니다. 자세한 내용은 도구 모음 페이지를 참고하세요.

인수

속성
name

이름: 필수

이 타겟의 고유한 이름입니다.

exec_compatible_with

라벨 목록입니다. 구성할 수 없습니다. 기본값은 []입니다.

이 도구 모음이 해당 플랫폼에서 빌드되는 타겟에 선택되려면 실행 플랫폼에서 충족해야 하는 constraint_value 목록입니다.
target_compatible_with

라벨 목록입니다. 구성할 수 없습니다. 기본값은 []입니다.

이 도구 모음이 해당 플랫폼의 타겟 빌드에 선택되려면 타겟 플랫폼에서 충족해야 하는 constraint_value 목록입니다.
target_settings

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

도구 모음 확인 중에 이 도구 모음이 선택되려면 타겟 구성이 충족해야 하는 config_setting 목록입니다.
toolchain

이름: 필수

이 도구 모음이 선택될 때 사용할 수 있는 실제 도구 또는 도구 모음을 나타내는 타겟입니다.
toolchain_type

라벨; 구성할 수 없음; 필수

이 도구 모음이 제공하는 역할을 나타내는 toolchain_type 타겟의 라벨입니다.

toolchain_type

규칙 소스 보기
toolchain_type(name, compatible_with, deprecation, features, no_match_error, restricted_to, tags, target_compatible_with, testonly, visibility)

이 규칙은 새로운 유형의 도구 모음, 즉 다양한 플랫폼에서 동일한 역할을 하는 도구 클래스를 나타내는 간단한 타겟을 정의합니다.

자세한 내용은 도구 모음 페이지를 참고하세요.

이는 맞춤 규칙의 도구 모음 유형을 정의합니다.

toolchain_type(
    name = "bar_toolchain_type",
)

이는 bzl 파일에서 사용할 수 있습니다.

bar_binary = rule(
    implementation = _bar_binary_impl,
    attrs = {
        "srcs": attr.label_list(allow_files = True),
        ...
        # No `_compiler` attribute anymore.
    },
    toolchains = ["//bar_tools:toolchain_type"]
)

인수

속성
name

이름: 필수

이 타겟의 고유한 이름입니다.

no_match_error

문자열, 구성 불가, 기본값은 ""

이 유형에 일치하는 도구 모음이 없을 때 표시할 맞춤 오류 메시지입니다.