使用 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.h
和 audio/constants.h
之间的冲突,而不使用绝对路径。
我正在努力理解 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.h
和 audio/constants.h
之间的冲突,而不使用绝对路径。