使用 CROSSTOOL 构建 ARM 时修剪 Bazel -I 标志

Prune Bazel -I flags when using CROSSTOOL to build ARM

我编写了一个自定义 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。

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

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

feature { name: "no_legacy_features" }

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

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