平台和工具链规则

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

规则

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

查看规则源代码
platform(name, constraint_values, deprecation, distribs, exec_properties, features, licenses, parents, remote_execution_properties, tags, testonly, visibility)

此规则定义了一个新平台,即限制条件选择(例如 CPU 架构或编译器版本)的命名集合,用于描述构建的某些部分可能运行的环境。 如需了解详情,请参阅平台页面。

示例

这定义了一个平台,用于描述在 ARM 上运行 Linux 的任何环境。

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

平台继承

平台可以使用 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,并替换了 的值。k1exec_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.
parents

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

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

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

已废弃。请改用 exec_properties 属性。 用于配置远程执行平台的字符串。实际构建不会尝试解释此字符串,而是将其视为可供特定 SpawnRunner 使用的不透明数据。这可以通过使用宏“{PARENT_REMOTE_EXECUTION_PROPERTIES}”来包含父级平台的“remote_execution_properties”属性中的数据, 如需了解详情,请参阅 平台继承部分。

toolchain

查看规则源代码
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, 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

名称;必需

此目标的唯一名称。