使用Bazel使用不同的编译器/链接器选项构建C / C ++依赖项

问题描述 投票:2回答:2

因此,我正在修改项目以使用clang ++和消毒剂(用于模糊测试)构建,而不是仅使用g ++。它使用bazel构建。

该项目当前下载了其某些构建依赖项(m4 / bison / flex),并使用https://github.com/bazelbuild/rules_foreign_cc中的make_configure规则构建了这些依赖项。重要的是,这些仅用于代码生成,不针对它们进行链接/编译。

不幸的是,那些非常依赖的东西碰巧有各种消毒剂问题。这意味着,如果我们使用--copt =“-fsanitize = address”进行构建,则无法使用它们进行代码生成,并且构建会失败!现在,如果我们遇到了带有链接依赖项的敏感问题,那将是不可避免的,我们需要与维护人员一起进行修复,但是现在我们真的只想解决这些问题,因为它们不会直接影响我们正在编译的实际目标的安全性和可靠性。

是否有一种简单的方法或多或少地为规则指定“请忽略在命令行上仅针对此目标传递的编译器标志/链接器选项/等。在大多数情况下,似乎通过命令行(或通过全局配置)传递的linkopts / copts / cxxopts是可加的,我们希望避免这种情况。如果没有,解决该问题的最佳方法是什么?当我们进入包裹实际构建规则的自定义规则时,是否保存/取消设置/重置所有变量?

谢谢,埃弗里特

c++ bazel
2个回答
0
投票

所以,最终找到了我的答案。

这里有几种方法可能会起作用。一种是自定义的SkyLark规则,它会覆盖命令行提供的工具。这样做确实具有潜在的优势,即与传递给编译器/链接器的某些选项可能无法很好地发挥作用的其他命令行选项相比,它具有“更进一步的证明”。

但是,最终更容易了解gcc / clang编译器家族具有有趣的行为,可以很好地与bazel配合使用的事实-如果您指定“ conflicting”命令行参数,则似乎后面一个总是采取。因此,我们要做的就是确保将“ -fno-sanitize = address”传递到要为其关闭ASAN的目标的构建规则中,同时将“ -fsanitize = address”传递到全局构建中。

希望这可以帮助陷入此类问题的其他任何人。--Everett


0
投票

“正确的方法”是定义您自己的工具链,并在其中添加功能,例如:

© www.soinside.com 2019 - 2024. All rights reserved.