5

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

当我遇到这篇文章时,我开始将 CMake 与递归文件通配一起使用:使用 GLOB 全局指定源文件?

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

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

4

2 回答 2

7

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

(我们不建议使用 GLOB 从源代码树中收集源文件列表。如果在添加或删除源代码时没有更改 CMakeLists.txt 文件,则生成的构建系统无法知道何时要求 CMake 重新生成。)

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

构建百科全书中列出了一些关于 globbing 的注意事项和限制,因此您应该在使用 glob 之前阅读这些内容。

此外,您可以使用 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 如何跟踪输入。

于 2016-06-29T00:59:54.437 回答
3

应该发现在 Bazel 中使用 glob,它可能会导致大 glob 的分析阶段很长,但是如果您使用 --watchfs 标志,则将跟踪文件系统更改以观察文件系统事件,而不是说明所有文件以便增量构建应该真的很快。

于 2016-06-28T08:29:58.447 回答