有没有一种方法可以执行原子CMake构建?

3

我正在考虑重新实现我们的构建系统(目前基于 GNU Make)使用 CMake

声明:这更多是一个理论性和“最佳实践”问题。我不深入了解 CMake。此外,如果它更相关,请随意将问题迁移到程序员。

据我所知,CMake 的标准工作流程为

cmake .
make

我怀疑存在 CMake 文件和 Makefile 的不同步问题。
在正常的开发过程中,您应该运行 make,以避免不必要的重建 CMakeCacheMakefiles,并使整个过程更加简单明了。但是,如果您在 CMakeLists 中添加了一个新的源文件并运行 make,它将使用旧的 CMakeCacheMakefiles,并且不会自动重新生成它们。我认为,如果在规模上使用,这可能会导致重大问题,因为如果有些东西没有构建成功,您将不得不尝试执行 make clean,然后,如果它没用,您需要手动删除 CMakeCache 并重新生成所有内容。
如果我上面说的有什么不对的地方,请纠正我。
我只想做
awesome-cmake

我会尽力帮助您完成翻译。以下是需要翻译的内容:

能否通过CMake实现"原子构建",使其更新所有需要更新的内容并构建项目?

问题来了:是否有一种方法可以使用CMake进行"原子构建",以便跟踪所有所需信息并抽象出使用make的方法?

2个回答

7
我认为你在这里有几个错误的想法:
我怀疑CMake文件和Makefile之间可能存在脱同步问题。
最终,CMake的全部工作都是生成正确的Makefile(或者Visual Studio解决方案文件、XCode项目文件等等)。除非你手动修改生成的Makefile,否则CMake和Makefile之间不会存在同步问题,因为CMake会生成Makefile。


但是,如果您向CMakeLists添加一个新的源文件并运行make,则会使用旧的CMakeCache和Makefiles,并且不会自动重新生成它们。实际上,相反的情况是正确的:如果您修改了CMakeLists.txt(例如添加新的源文件,更改编译器标志,添加新的依赖项),则运行make将自动触发CMake重新运行。 CMake将读取其先前缓存的值(其中包括先前提供给CMake的任何命令行参数)并生成更新后的Makefile。


如果某些东西没有按照应有的方式构建,您将需要尝试执行make clean,然后,如果这没起作用,您将需要删除CMakeCache并手动重新生成所有内容。是的,如果出现问题,这将是一个相当正常的工作流程。但是,在我的经验中,事情很少会变得那么糟糕。


所以问题是:有没有一种方法可以使用CMake进行"原子构建",从而跟踪所有必需的信息并抽象出对make的使用?
考虑到运行make会导致CMake“做正确的事情”,即在需要时重新运行,我想使用make是尽可能接近“原子构建”的一种方式。
这里要注意的一件事是,不建议使用{{link1:file(GLOB ...)}}或类似方法生成源文件列表。从文档中得知:
我们不建议使用GLOB从源目录树中收集源文件列表。如果添加或删除文件时没有更改CMakeLists.txt文件,则生成的构建系统无法知道何时请求CMake重新生成。
换句话说,如果您确实使用file(GLOB ...)来收集源列表,则需要养成在从源目录树中添加/删除文件后重新运行CMake的习惯;在这种情况下,运行make不会触发CMake的重新运行。

1
如果您修改了CMakeLists.txt文件(例如,添加新源、更改编译器标志、添加新依赖项),则运行make将自动触发CMake的重新运行。 - Michael Pankov

0

CMake 的标准工作流程是在源代码之外进行构建

mkdir build
cd build
cmake ..
make

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接