Bazel是否有与CMake相同的问题?

Does Bazel have the same problems as CMake with file globbing?

本文关键字:问题 CMake 是否 Bazel      更新时间:2023-10-16

我正在开始一个新项目,需要选择一个构建系统。我讨厌不得不手动将每个c++源文件添加到我的构建规则中,因为这是一种应该在2016年实现自动化的事情,而且它会在重构时增加额外的工作量(重命名头文件中的类,源文件和构建系统文件…)。

当我遇到这篇文章时,我开始使用递归文件globbing的CMake:用GLOB全局指定源文件?

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

乍一看,Bazel还允许文件globing。用在巴泽尔身上是邪恶的吗?在代码库上运行find是否存在这样一个扩展问题,构建系统真的需要避免它吗?

Bazel不存在那篇文章中提到的问题,即:

(我们不建议使用GLOB收集源文件列表你的源代码树。如果没有CMakeLists.txt文件,当一个源是添加或删除,然后生成的构建系统不知道何时请求CMake重新生成)

Bazel将始终注意到是否添加,删除或更改了glob的匹配,并相应地重建。Globbing永远不会给你陈旧的结果与Bazel。

在构建百科全书中列出了一些关于globg的警告和限制,因此在使用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"],
)

这将打印"evaluate " glob,因此您可以尝试一下,看看Bazel是如何跟踪输入的。

应该发现在Bazel中使用glob,它可能会导致对大glob的长分析阶段,但是如果您使用——watchfs标志,那么文件系统更改将被跟踪观察文件系统事件而不是声明所有文件,因此增量构建应该非常快。