使用 Bazel 构建时如何避免#includes 中的相对路径

How can I avoid relative paths in #includes when building with Bazel

我正在努力理解 includes 如何在 Bazel 目标中工作的逻辑。我希望我的代码是模块化的,所以我试图避免使用相对路径或长绝对路径的 #include 语句。

假设我有以下工作区结构:

tree .                                                                                  
. 
├── BUILD
├── is_binary_tree
│   ├── BUILD
│   └── is_binary_tree.cpp
├── lib
│   ├── BUILD
│   ├── graphs.cpp
│   └── graphs.h
└── WORKSPACE

我在尝试 bazel build //is_binary_tree:is_binary_tree 时收到以下警告,但我不明白这是什么意思:

WARNING: /is_binary_tree/BUILD:1:10: in includes attribute of cc_binary rule //is_binary_tree:is_binary_tree: '../lib' resolves to 'lib' not below the relative path of its package 'is_binary_tree'. This will be an error in the future

为什么 ../lib 解析为 lib。 lib应该在is_binary_tree的父目录下,所以从is_binary_tree的角度来看,可以在../lib找到,对不对?

为了摆脱相对路径并避免在 is_binary_tree/is_binary_tree.cpp 中出现类似 #include ../lib/graphs.h 的内容,我向我的 is_binary_tree 添加了一个 includes 属性像这样定位:

is_binary_tree/is_binary_tree.cpp

#include "graphs.h"

int main(){
    return 0;
}

is_binary_tree/BUILD

cc_binary(
    name="is_binary_tree",
    srcs=["is_binary_tree.cpp"],
    includes=["../lib"],
    deps=["//lib:graphs"],
)

我收到上述警告。我错过了什么?

更广泛地说,在#include 语句中没有较长相对路径的情况下包含依赖项的最佳方法是什么? (我希望我的代码是模块化的,而不是特定于给定的 Bazel 工作区文件夹组织)

谢谢

includes 应该放在 //lib:graphs 中,这样任何依赖它的东西(在 deps 中都有)都可以使用它。 lib/BUILD 应该是这样的:

cc_library(
    name = "graphs",
    hdrs = ["graphs.h"],
    srcs = ["graphs.cpp"],
    includes = ["."],
    visibility = ["//visibility:public"],
)

然后你从 is_binary_tree 中删除 includes,它应该可以工作。

通常,每个 Bazel 目标都包含有关其文件的信息。这取决于其他目标使用他们的文件。

更广泛地说,Bazel 默认使用相对于 repository 基址的#include 路径。这意味着您可以在任何文件中写入 #include "lib/graphs.h",无论是 is_binary_tree/is_binary_tree.cpp 还是 x/y/z/foobar.cpp。这避免了 graphics/constants.haudio/constants.h 之间的冲突,而不使用绝对路径。