关于 config_setting 与 Bazel 的疑问

Doubts regarding config_setting with Bazel

我正在尝试了解 config_setting 以检测底层平台并有一些疑问。你能帮我澄清一下吗?

  1. x64_windowsx64_windows_(msvc|msys)cpu有什么区别?如果我为所有这些创建 config_setting,是否只有其中一个会触发?我应该忽略 x64_windows 吗?

  2. 检测Windows,推荐的方法是什么?目前我在做:

    config_setting(
        name = "windows",
        values = {"crosstool_top": "//crosstools/windows"},
    )
    
    config_setting(
        name = "windows_msvc",
        values = {
            "crosstool_top": "//crosstools/windows",
            "cpu": "x64_windows_msvc",
        },
    )
    
    config_setting(
        name = "windows_msys",
        values = {
            "crosstool_top": "//crosstools/windows",
            "cpu": "x64_windows_msys",
        },
    )
    

    通过使用这个我想用:windows来匹配所有Windows版本和:windows_msvc,例如,只匹配MSVC .这是最好的方法吗?

  3. darwindarwin_x86_64cpu有什么区别?我知道它们与 macOS 匹配,但在为 macOS 选择某些东西时是否需要始终指定两者?如果没有,是否有更好的方法来仅用一个 config_setting 来检测 macOS?就像使用 //crosstools 和 Windows?

  4. 如何检测Linux?我知道您可以先检测您关心的操作系统,然后再使用 //conditions:default,但最好有一种方法可以专门检测 Linux 而不是将其保留为默认值。

  5. 什么是k8piii等?是否有任何文档描述了所有可能的 cpu 值及其含义?

  6. 如果我想使用 //crosstools 来检测每个平台,有什么地方可以查找所有可用的交叉工具吗?

谢谢!

所有问题都很好。让我一一解决:

  1. --cpu=x64_windows_msys 触发依赖于 MSYS/Cygwin 的 C++ 工具链。 --cpu=x64_windows_msvc 触发 Windows-native (MSVC) 工具链。 -cpu=x64_windows 触发默认值,它仍然是 MSYS 但 being converted 到 MSVC。

    你想支持哪些由你决定,但支持所有的通用性可能是最安全的(如果一个只是另一个的别名,它不需要非常复杂的逻辑)。

    一次只能触发一个config_setting

  2. 除非您使用自定义 -crosstool_top= 标志来指定 Windows 构建,否则您可能希望在 --cpu 上触发,例如:

    config_setting(
        name = "windows",
        values = {"cpu": "x64_windows"}
    

    现在没有很好的方法来定义 all Windows。这是 Bazel 当前识别 平台 能力的缺陷,--cpu--crosstool_top 等设置并没有完全正确地建模。 Ongoing work 开创先河class 概念平台,为您提供最佳解决方案。但目前 --cpu 可能是您最好的选择。

  3. 这基本上与 Windows 相同。但据我所知,默认交叉工具只有 darwin,没有 darwin_x86_64.

  4. 目前最好使用您不想使用的 //conditions:default 方法。一旦第一个 class 平台可用,将为您提供所需的保真度。

  5. k8piii分别是86个64位和32位CPU的假名。按照惯例,它们也往往与 "Linux" 相关联,尽管这不能保证 1-1 匹配。

    没有确定的"all possible CPU values"。基本上,--cpu 只是一个字符串,它在 CROSSTOOL 文件中解析为具有与该字符串匹配的标识符的工具链。这允许您为要自己编码的新 CPU 类型编写新的 CROSSTOOL 文件。因此,确切的可用 CPU 集取决于谁在使用 Bazel 以及他们如何设置工作区。

  6. 同5.一样的原因,没有确定的名单。请参阅 Bazel 的 github tools/ 目录以获取对默认值的引用。