【发布时间】:2021-05-01 15:58:49
【问题描述】:
我正在将大型遗留 makefile 项目迁移到 bazel。项目用于在构建之前将所有源代码和头文件复制到单个“构建目录”中,因此所有源文件和头文件都使用单级包含,没有任何前缀 (#include "1.hpp")。
Bazel 要求模块(库)使用从 WORKSPACE 文件开始的头文件的相对路径,但我的目标是引入 bazel 构建文件,这需要对源代码进行 0 次修改。
我使用 bazelrc 来全局设置包含路径,就好像结构是扁平的一样:
.bazelrc:
build --copt=-Ia/b/c
/a/b/BUILD
cc_library(
name = "lib",
srcs = ["c/1.cpp"],
hdrs = ["c/1.hpp"],
visibility = ["//visibility:public"]
)
当我构建这个目标时,我在编译器调用中看到了我的-I 标志,但是编译失败,因为 bazel 找不到头文件 1.hpp:
$ bazel build -s //a/b:lib
...
a/b/c/1.cpp:13:10: fatal error: 1.hpp: No such file or directory
13 | #include "1.hpp"
|
有趣的是,它会打印出我在构建期间调用的 gcc 命令,如果我运行此命令,编译器能够找到 1.hpp 并且 1.cpp 编译。
如何让 bazel “看到”这包括?除了全局 -I 标志之外,我真的需要为每个目标额外指定 copts 吗?
【问题讨论】: