有没有办法执行原子CMake构建?

时间:2013-11-14 19:22:49

标签: build makefile cmake build-process

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

免责声明:这更像是一个理论和“最佳实践”问题。我不深入了解CMake。此外,如果问题更多,请随时将问题转移给程序员。

据我了解,CMake的标准工作流程是

cmake .
make

我怀疑可能存在CMake文件和Makefile的去同步问题。

因此,在通常的开发过程中,您应该运行make以避免对CMakeCacheMakefiles进行不必要的重建,并且通常会使过程更直接。但是,如果您将新的源文件添加到CMakeLists并运行make,则它将使用旧的CMakeCacheMakefiles,并且不会自动重新生成它们。我认为在大规模使用时可能会导致重大问题,因为如果某些东西没有按照它应该构建,你将不得不尝试执行make clean,然后,如果它没有帮助,你需要删除CMakeCache并重新生成所有内容(手动!)。

如果我对上述内容不对,请纠正我。

我想做的事情

awesome-cmake

让它更新所有需要更新和构建项目的内容。

所以,问题是:有没有办法用CMake进行“原子构建”,以便跟踪所有必需的信息并抽象出make的用法?

2 个答案:

答案 0 :(得分:6)

我认为你有几个不正确的想法:

  

我怀疑可能存在CMake文件和Makefile的去同步问题。

最终,CMake是关于生成正确的Makefile(或Visual Studio解决方案文件,或XCode项目文件,或其他)。除非您手动修改生成的Makefile,否则CMake和Makefile之间不会出现同步问题,因为CMake会生成Makefile。


  

但是,如果您将新的源文件添加到CMakeLists并运行make,那么它将使用旧的CMakeCacheMakefiles,而不是自动重新生成它们。

实际上,情况恰恰相反:如果修改CMakeLists.txt(例如添加新源,更改编译器标志,添加新依赖项),则运行make将自动触发重新运行CMake。 CMake将读取其先前缓存的值(包括之前提供给CMake的任何命令行参数)并生成更新的Makefile。


  如果某些内容无法正常构建,则必须尝试执行make clean,然后,如果它没有帮助,则需要删除CMakeCache并重新生成所有内容(手动!)。

是的,如果出现问题,这将是一个非常正常的工作流程。但是,根据我的经验,事情往往不会那么糟糕。


  

所以,问题是:有没有办法用CMake进行“原子构建”,以便跟踪所有必需的信息并抽象出make的用法?

鉴于运行make将导致CMake“做正确的事”,即如果需要重新运行,我想使用make尽可能接近“原子构建”。

要注意的一件事是使用file(GLOB ...)或类似的方法生成源文件列表。来自文档:

  

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

换句话说,如果你使用file(GLOB ...)来收集源列表,你需要养成在源树中添加/删除文件后重新运行CMake的习惯;在这种情况下,运行make不会触发重新运行CMake。

答案 1 :(得分:0)

CMake的标准工作流程是源代码构建

mkdir build
cd build
cmake ..
make