c++ - Bazel 在文件通配方面是否存在与 CMake 相同的问题?

标签 c++ build cmake filesystems bazel

我正在开始一个新项目,需要选择一个构建系统。我讨厌必须手动将每个 C++ 源文件添加到我的构建规则中,因为这种事情应该在 2016 年之前实现自动化,并且在重构时会导致额外的繁忙工作(重命名头文件中的类、源文件和构建系统文件...)。

当我看到这篇文章时,我开始使用 CMake 递归文件通配:Specify source files globally with GLOB?

这表明 globbing 是邪恶的,因为 CMake 使用两个阶段进行构建(cmake 和 make),而在正常使用中用户只重新运行第二阶段(make)。

乍一看,Bazel 还允许文件通配。与 Bazel 一起使用是邪恶的吗?在代码库上运行 find 这样的扩展问题是否真的需要构建系统来避免?

最佳答案

Bazel 没有那个帖子中提到的问题,即:

(We do not recommend using GLOB to collect a list of source files from your source tree. If no CMakeLists.txt file changes when a source is added or removed then the generated build system cannot know when to ask CMake to regenerate.)

Bazel 将始终注意到是否从 glob 的匹配项中添加、删除或更改了任何内容,并相应地进行重建。使用 Bazel,Globbing 永远不会给您带来陈旧的结果。

列出了一些警告和限制 in the build encyclopedia对于 globbing,所以你应该在使用 globs 之前阅读它。

此外,您还可以使用 bazel 查询查看正在生成的内容:

bazel query '//path/to/your:target' --output=build
# /Users/kchodorow/gitroot/path/to/your/BUILD:7:1
java_library(
    name = "target",
    srcs = ["//path/to/your:A.java", "//path/to/your:B.java"],
)

这将打印“已评估”的 glob,因此您可以尝试并查看 Bazel 如何跟踪输入。

关于c++ - Bazel 在文件通配方面是否存在与 CMake 相同的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38066040/

相关文章:

c++ - 如何使用 ncurses 在 C++ 上打印矩阵?

android - 失败 : setup-jack-server when building LineageOS

build - Docker自动化构建导致意外失败

qt - 使用Qt Creator打开CMakeLists.txt,如何保存为.pro文件?

c++ - C++ 控制台输出问题

c++ - Xcode 生成的存档文件缺少 dylib

c++ - 按范围初始化数组

c# - 可以在构建脚本中将常量传递给 C# 编译器

c++ - 包含 cmath header 时 Cmake 编译错误

c++ - 我怎么能用cmake自动匹配所有子目录