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

Mic*_*kov 3 build-process makefile build cmake

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

免责声明:这更像是一个理论和"最佳实践"问题.我不知道CMake深入.此外,如果问题更多,请随时将问题迁移给程序员.

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

cmake .
make
Run Code Online (Sandbox Code Playgroud)

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

所以,在平时的开发过程中你应该运行make,以避免不必要的重建CMakeCacheMakefiles一般使这一过程更加简单.但是,如果你添加一个新的源文件CMakeLists并运行make它,它将使用旧的CMakeCache,Makefiles并且不会自动重新生成它们.我认为在大规模使用时可能会导致重大问题,因为如果某些东西没有按照它应该构建,你将不得不尝试执行make clean,然后,如果它没有帮助,你将需要删除CMakeCache并重新生成一切(手动!).

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

我想做

awesome-cmake
Run Code Online (Sandbox Code Playgroud)

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

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

Fra*_*ser 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尽可能接近"原子构建".

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

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

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