Bazel 为建模提供复杂的支持 平台和工具链,支持多架构和 交叉编译 build。
本页总结了这项支持的状态。
另请参阅:
状态
C++
设置 --incompatible_enable_cc_toolchain_resolution
后,C++ 规则会使用平台来选择工具链。
这意味着您可以用以下代码配置 C++ 项目:
bazel build //:my_cpp_project --platforms=//:myplatform
而不是旧版:
bazel build //:my_cpp_project` --cpu=... --crosstool_top=... --compiler=...
在 Bazel 7.0 中,此功能将默认启用 (#7260)。
如需使用平台测试您的 C++ 项目,请参阅 迁移项目和 配置 C++ 工具链。
Java
Java 规则使用平台来选择工具链。
此标志用于替换旧版标志 --java_toolchain
、--host_java_toolchain
、--javabase
和 --host_javabase
。
如需了解详情,请参阅 Java 和 Bazel。
Android
在以下情况下,Android 规则会使用平台来选择工具链
已设置 --incompatible_enable_android_toolchain_resolution
。
这意味着,您可以使用以下方式配置 Android 项目:
bazel build //:my_android_project --android_platforms=//:my_android_platform
而不是使用 --android_crosstool_top
、--android_cpu
等旧版标志,
和 --fat_apk_cpu
。
Bazel 7.0 中默认启用该功能 (#16285)。
如需使用平台测试 Android 项目,请参阅 迁移您的项目。
Apple
Apple 规则不支持平台,尚未安排支持。
您仍然可以将平台 API 与 Apple build 搭配使用(例如,在构建 (混合使用 Apple 规则和纯 C++)和平台 映射。
其他语言
如果您拥有语言规则集,请参阅迁移规则集以添加支持。
背景
引入了平台和工具链,以标准化软件 项目针对不同的架构并进行交叉编译。
这是
启发了
观察到语言维护者已经在广告
临时的、不兼容的方式。例如,C++ 规则使用 --cpu
和
--crosstool_top
,用于声明目标 CPU 和工具链。以上都不是
对“平台”进行正确建模。这会导致构建不当且不正确。
Java、Android 和其他语言都针对类似用途开发了自己的标志,但这些标志之间无法互操作。这使得跨语言 build 变得混乱且复杂。
Bazel 适用于大型、多语言、多平台项目。这需要对这些概念提供更具原则性的支持,包括明确的标准 API。
迁移需求
升级到新 API 需要完成两项工作:发布 API 和升级 规则逻辑来使用它
第一个已完成,但第二个仍在进行中。这包括确保定义了特定于语言的平台和工具链、语言逻辑通过新 API(而非 --crosstool_top
等旧标志)读取工具链,以及 config_setting
基于新 API(而非旧标志)进行选择。
这项工作非常简单,但需要针对每种语言做出不同的努力, 并提醒项目所有者测试即将发生的变化。
因此,此次迁移仍在进行中。
目标
当所有项目均使用以下形式进行构建时,此迁移即告完成:
bazel build //:myproject --platforms=//:myplatform
这意味着:
- 项目的规则会为
//:myplatform
选择合适的工具链。 - 您项目的依赖项会为
//:myplatform
选择合适的工具链。 //:myplatform
参考 通用声明 (共CPU
、OS
和其他与语言无关的通用属性)- 所有相关的
select()
均与//:myplatform
正确匹配。 //:myplatform
在清晰且易于访问的位置定义:在项目的 repo(如果平台对于您的项目是唯一的)或者 使用项目可以找到它
--cpu
、--crosstool_top
和 --fat_apk_cpu
等旧标志将被
我们会在安全的情况下尽快弃用并移除。
最终,这将是配置架构的唯一方式。
迁移项目
如果您使用支持平台的语言进行构建,您的 build 应该已经可以使用如下调用:
bazel build //:myproject --platforms=//:myplatform
如需了解确切的详细信息,请参阅状态和所用语言的文档。
如果某种语言需要标志才能启用平台支持,您还需要设置该标志。如需了解详情,请参阅状态。
为了构建项目,您需要检查以下内容:
“
//:myplatform
”必须存在。这通常由项目所有者负责 因为不同的项目针对的是不同的机器。 请参阅默认平台。您要使用的工具链必须存在。如果使用的是标准工具链,语言所有者应添加有关如何注册它们的说明。如果 编写自己的自定义工具链,需要在现有工具链中注册它们
WORKSPACE
或--extra_toolchains
。如果您的 build 混合了支持和不支持平台的语言,您可能需要平台映射来帮助旧版语言与新 API 搭配使用。如需了解详情,请参阅平台映射。
如果问题仍然存在,请与我们联系寻求支持。
默认平台
项目所有者应定义明确的平台,以描述他们要为哪些架构构建应用。然后,使用 --platforms
触发这些事件。
如果未设置 --platforms
,则 Bazel 默认使用一个 platform
表示
本地构建机器。这是 @local_config_platform//:host
自动生成的
因此无需明确定义它会将本地机器的 OS
和 CPU
映射到 @platforms
中声明的 constraint_value
。
select()
项目可以在 constraint_value
目标上select()
,但不能在完整平台上select()
。这是有意为之,因此 select()
支持尽可能多的
自动化技术。包含 ARM
专用源代码的库应支持所有搭载 ARM
的机器,除非有理由更具体地指定支持的机器。
如需选择一个或多个 constraint_value
,请使用以下语法:
config_setting(
name = "is_arm",
constraint_values = [
"@platforms//cpu:arm",
],
)
这相当于传统上在 --cpu
上进行选择:
config_setting(
name = "is_arm",
values = {
"cpu": "arm",
},
)
如需了解更多详情,请点击此处。
--cpu
、--crosstool_top
等上的 select
不理解 --platforms
。将项目迁移到平台时,您必须将其转换为
constraint_values
或使用平台映射来支持
在迁移过程中导入这两种样式
转场效果
Starlark 过渡变更
对构建图的各个部分进行标记如果您的项目使用会设置 --cpu
、--crossstool_top
或其他旧版标志的转换,则读取 --platforms
的规则将不会看到这些更改。
将项目迁移到平台时,您必须将更改(例如
return { "//command_line_option:cpu": "arm" }
到return {
"//command_line_option:platforms": "//:my_arm_platform" }
或使用平台
映射,以便在迁移过程中同时支持这两种样式。
窗口。
迁移规则集
如果您拥有规则集,并且想要支持平台,则需要满足以下条件:
让规则逻辑通过工具链 API 解析工具链。请参阅 toolchain API (
ctx.toolchains
)。可选:定义一个
--incompatible_enable_platforms_for_my_language
标志, 规则逻辑通过新 API 或旧标志交替解析工具链 例如在迁移测试期间使用--crosstool_top
。定义构成平台组件的相关属性。请参阅常见平台属性
定义标准工具链,并通过规则的注册说明向用户提供这些工具链(详情)
确保
select()
和 配置转换支持平台。这是最大的挑战。对于多语言项目来说,这尤其具有挑战性。 (如果所有语言都无法读取--platforms
,则可能会失败)。
如果您需要混用不支持平台的规则,则可能需要 平台映射来弥合差距。
通用平台属性
应在 @platforms
中声明 OS
和 CPU
等常见的跨语言平台属性。这有利于促进共享、标准化和跨语言兼容性。
您的规则所独有的属性应在规则的代码库中声明。这个 让您能够明确掌握所制定的具体概念 错误。
如果您的规则使用自定义操作系统或 CPU,则应在
与
@platforms
。
平台映射
平台映射是一种临时 API,可让平台感知型逻辑与 旧版逻辑。这是一种粗暴的工具,仅用于解决因迁移时间范围不同而导致的不兼容问题。
平台映射是 platform()
到
一组相应的旧版标志(反之亦然)。例如:
platforms:
# Maps "--platforms=//platforms:ios" to "--cpu=ios_x86_64 --apple_platform_type=ios".
//platforms:ios
--cpu=ios_x86_64
--apple_platform_type=ios
flags:
# Maps "--cpu=ios_x86_64 --apple_platform_type=ios" to "--platforms=//platforms:ios".
--cpu=ios_x86_64
--apple_platform_type=ios
//platforms:ios
# Maps "--cpu=darwin_x86_64 --apple_platform_type=macos" to "//platform:macos".
--cpu=darwin_x86_64
--apple_platform_type=macos
//platforms:macos
Bazel 使用此 ID 来保证所有设置,包括基于平台的设置 在整个构建过程中始终适用,包括 过渡。
默认情况下,Bazel 会从platform_mappings
工作区根目录。您还可以设置
--platform_mappings=//:my_custom_mapping
。
如需了解详情,请参阅平台映射设计。
API 审核
platform
是 constraint_value
目标的集合:
platform(
name = "myplatform",
constraint_values = [
"@platforms//os:linux",
"@platforms//cpu:arm",
],
)
constraint_value
是机器
属性。同一“kind”的值归到一个通用规则下
constraint_setting
:
constraint_setting(name = "os")
constraint_value(
name = "linux",
constraint_setting = ":os",
)
constraint_value(
name = "mac",
constraint_setting = ":os",
)
toolchain
是 Starlark 规则。其
属性声明语言工具(例如 compiler =
"//mytoolchain:custom_gcc"
)。其提供程序通行证
将这些信息传递给需要使用这些工具构建的规则。
工具链会声明它们可以运行的机器的 constraint_value
目标
(target_compatible_with = ["@platforms//os:linux"]
) 以及他们的工具
运行位置
(exec_compatible_with = ["@platforms//os:mac"]
)。
构建 $ bazel build //:myproject --platforms=//:myplatform
时,Bazel 会自动选择可在构建机器上运行的工具链,并为 //:myplatform
构建二进制文件。这称为工具链解析。
您可以使用以下命令在 WORKSPACE
中注册这组可用工具链
register_toolchains
或在
和 --extra_toolchains
搭配使用。
如需了解详情,请点击此处。
问题
如需获得常规支持或咨询有关迁移时间表的问题,请联系 bazel-discuss 或相应规则的所有者。
如需讨论平台/工具链 API 的设计和演变,请与 bazel-dev 联系。