【问题标题】:Prune Bazel -I flags when using CROSSTOOL to build ARM使用 CROSSTOOL 构建 ARM 时 Prune Bazel -I 标志
【发布时间】:2017-08-03 16:24:41
【问题描述】:

我编写了一个自定义 CROSSTOOL 文件,该文件为我的 Cortex-M 目标调用 arm-gcc 编译器。我通过-isystem 指定我的标志,包括 sysroot。

我看到 Bazel 用一堆额外的 -I 标志增加了我对 gcc 的调用。这似乎没问题,b/c Bazel 正在为构建期间生成的文件添加路径等。

我看到 Bazel 还添加了一个我没有指定的 -isystem

-isystem external/bazel_tools/tools/cpp/gcc3

我不知道如何让 Bazel 抑制这种情况,因为通过查看“gcc3”in the code 的唯一出现,它看起来像是在尝试引入特定的 STL。

我可以告诉巴泽尔不要添加这个吗?它充其量是无害的,但可能是阴险的。

【问题讨论】:

标签: c++ bazel


【解决方案1】:

让我先回答一个更普遍的问题:如何强制 Bazel 停止修补我的交叉工具?这可以通过在您的交叉工具中定义no_legacy_features 功能来完成,只需将其放入所有相关的toolchain 消息中:

feature { name: "no_legacy_features" }

使用该功能,Bazel 不会修补您的交叉工具,因此不会添加 -isystem 标志。但它也会停止添加所有其他标志,例如 -D 定义、-l 库等。您可以在 CppActionConfigs 中看到 bazel 添加到您的交叉工具中的所有内容。还有一个问题是我现在每天都会引入新的特性和新的构建变量,所以如果你以后想升级bazel,你肯定需要更新crosstool。如果您不使用action_configs 并且不定义no_legacy_features,您的交叉工具将继续工作。最终我在 crosstool 上的工作将完成,crosstool 将变得稳定。现在不是这样。

现在第二个问题是为什么 bazel 在那里添加 -isystem 标志,我不知道。因此我提交了an issue

【讨论】:

  • 太棒了,谢谢! “no_legacy_features”会抑制依赖分析标志,如 -MMD 等,还是只是关于功能标志?需要明确的是,我 /only/ 在 CROSSTOOL 中搞乱固件;我想要完全明确地控制每个标志,并且我将单个图像静态链接在一起。没有主机端复杂性,没有 dll / so 支持等。对于主机端工作,我使用 vanilla Bazel 和所有默认设置,那里没有自定义 CROSSTOOL。
  • no_legacy_features 将阻止 bazel 向您的交叉工具添加任何内容。例如,我最近的一项更改更改了添加 copts 的方式,并且如果您的交叉工具没有扩展“copts”构建变量,则根本不会得到 copts。因此,除非您不添加它,否则不会自动添加“-MMD”。您可以查看CppActionConfigs.java 以查看大部分 bazel 正常修补到您的交叉工具中的内容。
  • 啊,那可没那么有用。我想利用 Bazel 的依赖分析来进行最少的重建;我不希望 Bazel(通过 CROSSTOOL)弄乱我明确配置的包含路径。
  • 如果您复制 CppActionConfigs 修补的所有功能,您不会丢失任何东西(您指的是 dependency_file 功能,但您需要的不仅仅是这个,尤其是链接)。
  • 有个主意,你能用 nocopts 吗? docs.bazel.build/versions/master/be/…
猜你喜欢
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2020-06-10
相关资源
最近更新 更多