"Missing dependency declarations" 对于系统 headers 当 cross-compiling 使用 Bazel

"Missing dependency declarations" for system headers when cross-compiling with Bazel

我正在尝试 cross-compile 使用 Bazel 和 cross-compiling 工具链的项目(TensorFlow C 库)。在绝望之后(但那是另一回事),我终于设法让外部依赖项(例如 zlib 或 protobuf)的实际编译与我的工具链一起工作,但是,我现在 缺少依赖项声明 对于所有系统 headers(由 cross-compiling 工具链提供)包含在生成此错误的编译规则中。

这个确切的错误在 Bazel's own tutorial for configuring C++ toolchains (at the very bottom in step 10). They also suggest a fix that consists of adding a featureCcToolchainConfigInfo 中描述,它通过 -isystem 标志添加系统 header 目录。

我在该修复程序中遇到的问题是我无法按照描述添加这些目录的绝对路径,因为这会触发此错误:包含路径...引用了执行根.

我还尝试声明 new local repositories in my WORKSPACE with filegroups and cc_libraries,而不是使用绝对路径,在它们的 srcs/hdrs/includes 中列出路径并引用那些 filegroups/cc_libraries-isystem 标志中,但 none 我的尝试奏效了。也许我做的不对,但我尝试了很多变体。

如果我不能添加绝对路径或让它在本地存储库中工作,那么正确的做法是什么?

为了检查您正在从您的主机使用哪个 headers 并且应该被视为系统 headers / 即使没有明确声明为依赖项也被认为是正常的,您提供目录列表包含 create_cc_toolchain_config_info() 的 headers 到 cxx_builtin_include_directories 属性,因为您正在定义 cc_toolchain。例如从主机为我的系统编译器和系统库编写一个,我可以说:

cc_common.create_cc_toolchain_config_info(
    ...
    cxx_builtin_include_directories = [
        "/usr/include/",
        "/usr/lib64/gcc/x86_64-slackware-linux/9.3.0/include/",
    ],
    ...
)

对于不在 bazel 自己的树中的主机工具,我目前不知道还有另一种方法可以做到这一点。至少从 3.1.0 开始它可以工作并记录在案。

注意:这会配置依赖项检查,而不是工具的搜索路径,这就是您提到的适当 feature 发挥作用的地方。