使用 cc_library
, 我可以包括 <boost/lexical_cast.hpp>
, 因为它在 /usr/include
中.我该如何让构建失败呢?包含任意系统 header 的能力使得难以验证构建是否可重现和独立,以及是否使用了特定版本的库(我宁愿在工作区中包含库,以保证它们的确切版本)。
$ cat BUILD
cc_library(
name = "example",
srcs = [":example.cpp"],
)
$ cat example.cpp
#include <boost/lexical_cast.hpp>
当然,我仍然希望能够包含标准的 C++ 和 POSIX header 。
最佳答案
恐怕你在这里运气不好。 IIRC 这归结为您的工具链配置(特别是 CROSSTOOL
文件),其中在 cxx_builtin_include_directory
路径中找到的 header 在这个意义上是免费通过 WRT 检查您的所有依赖项是否已正确声明.
换句话说,如果你想确保你只使用你的编译器和相应的 sysroot 头文件,但不会被你系统上的任何其他东西污染,你必须为此定义你自己的工具链(而不是依赖在您的主机上找到的内容)。这样做并将您的工具链设置为外部依赖项通常可能不是一个坏主意,如果您真的想确保您的构建全面一致(这比与之相关的开销更令人担忧,包括初始编写成本配置)。能够使用主机上已有的工具很方便,但可能会带来差异(除非您可以可靠地控制每台机器的设置)。
关于c++ - Bazel 允许我包含来自全局安装的库的 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51232110/