bazel - cc_toolchain_suite 和 register_toolchains 有什么区别?

标签 bazel

在 C++ 工具链的上下文中,我试图理解 cc_toolchain_suite 和 register_toolchains 之间概念的区别,在我看来它们似乎实现了相同的目的:根据命令行参数选择工具链。

参见 https://docs.bazel.build/versions/master/toolchains.html对于 register_toolchains 参见 https://docs.bazel.build/versions/master/cc-toolchain-config-reference.html对于 cc_toolchain_suite

有人可以帮助理解这两个概念背后的微妙之处吗?

最佳答案

TL;DR cc_toolchain_suite 是遗留工具链配置系统的一部分。它仍然存在于 Bazel 中,因为向新 API 的迁移尚未完成。 register_toolchains 是更新的统一工具链 API 的一部分。尽可能使用 register_toolchains 而不是 cc_toolchain_suite/--*crosstool_top

最初,“工具链”的概念在 Bazel 中并未标准化,因此 Java 工具链的实现方式与 cc 工具链的实现方式截然不同。

在统一的 starlark 工具链 API 之前,cc 工具链以原始文本格式指定 'CROSSTOOL'文件。 随着平台 API 和统一工具链 API 的引入,CROSSTOOL 文件中的概念几乎 1:1 转换为新的统一平台/工具链 starlark API。这主要是为了确保新旧 API 之间存在兼容性。

旧的“CROSSTOOL”配置系统中的一个概念是“工具链套件”,它允许您定义一组针对不同 CPU 的工具链(这是在引入平台 API 之前)。

据我所知,cc_toolchain_suite 仍然是 Bazel 的 starlark API 的一部分的唯一原因是一些 apple/android 工具链尚未完全迁移。

以下是 I've opted to using the newer register_toolchains approach 的几个示例.请注意,这些工具链不再使用 cc_toolchain_suite

关于bazel - cc_toolchain_suite 和 register_toolchains 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58291691/

相关文章:

android - 如何将 Android 的导航架构组件与 Bazel 一起使用?

Bazel:你如何获得生成文件的路径?

c++ - Google Tink库构建C++

java - 在单独的机器上运行 bazel 远程执行程序测试

bazel - 验证 bazel 中的步骤

c++ - 使用 Bazel 分离编译和链接操作

bazel - 简单的 cc_library 规则作为 Skylark 规则

bazel - 如何使bazel `sh_binary`目标依赖于其他二进制目标?

bazel - 如何从本地文件模拟http_archive

node.js - Bazel 与 lerna 和 yarn 工作区一起使用