平台和工具链规则

报告问题 查看源代码 每夜 build · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

这组规则可让您对要构建的特定硬件平台进行建模,并指定为这些平台编译代码时可能需要的特定工具。用户应熟悉此处介绍的概念。

规则

constraint_setting

查看规则源代码
constraint_setting(name, default_constraint_value, deprecation, distribs, features, licenses, tags, testonly, visibility)

此规则用于引入平台可以为其指定值的新约束条件类型。例如,您可以定义一个名为“glibc_version”的 constraint_setting,以表示平台可以安装不同版本的 glibc 库。 如需了解详情,请参阅平台页面。

每个 constraint_setting 都有一组可扩展的关联 constraint_value。通常,这些值是在同一个软件包中定义的,但有时其他软件包也会为现有设置引入新值。例如,您可以使用自定义值扩展预定义设置 @platforms//cpu:cpu,以定义定位到不常见 CPU 架构的平台。

参数

属性
name

名称;必需

此目标的唯一名称。

default_constraint_value

名称不可配置;默认为 None

此设置的默认值的标签,在未指定值时使用。如果存在此属性,则它指向的 constraint_value 必须与此 constraint_setting 在同一软件包中定义。

如果某个约束条件设置具有默认值,那么每当平台未为该设置包含任何约束条件值时,就等同于平台指定了默认值。否则,如果没有默认值,则该平台会将约束条件设置视为未指定。在这种情况下,平台不会与任何要求为该设置提供特定值的约束条件列表(例如 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",
)
然后,平台可以声明其采用 mips 架构,作为 x86_64arm 等的替代方案。

参数

属性
name

名称;必需

此目标的唯一名称。

constraint_setting

标签不可配置;必需

constraint_value 的可选 constraint_setting

平台

查看规则源代码
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 建议使用 exec_properties,而不是已废弃的 remote_execution_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”,而不会设置自己的“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 不会尝试对其进行解读,而是将其视为通过远程执行协议的“Platform”字段转发的不透明数据。 这包括父级平台的 exec_properties 属性中的所有数据。 如果子平台和父平台定义了相同的键,系统会保留子平台的值。与空字符串值关联的所有键都会从字典中移除。 此属性完全取代了已废弃的 remote_execution_properties
flags

字符串列表;不可配置;默认为 []

当此平台在配置中用作目标平台时,将启用的标志的列表。只能使用可在转场中设置的标志。
parents

标签列表;不可配置;默认值为 []

此平台应继承的 platform 目标的标签。虽然该属性采用列表,但其中不应包含多个平台。在父级平台中可以找到未直接在此平台上设置的任何 constraint_settings。 如需了解详情,请参阅平台继承部分。
remote_execution_properties

字符串;不可配置;默认值为 ""

已弃用。请改用 exec_properties 属性。 用于配置远程执行平台的字符串。实际 build 不会尝试解读此信息,而是将其视为可供特定 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 列表,以便为该平台上的目标 build 选择此工具链。
target_compatible_with

标签列表;不可配置;默认值为 []

目标平台必须满足的 constraint_value 列表,以便为该平台的目标 build 选择此工具链。
target_settings

标签列表;默认值为 []

目标配置必须满足的 config_setting 列表,以便在工具链解析期间选择此工具链。
toolchain

名称;必需

此目标代表选择此工具链时可用的实际工具或工具套件。
toolchain_type

标签不可配置;必需

toolchain_type 目标的标签,表示此工具链所提供的角色。

toolchain_type

查看规则源代码
toolchain_type(name, compatible_with, deprecation, features, 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

名称;必需

此目标的唯一名称。