我正在考虑在GNU Make
重新实现我们的构建系统(目前基于CMake
)。
免责声明:这更像是一个理论和“最佳实践”问题。我不深入了解CMake
。此外,如果问题更多,请随时将问题转移给程序员。
据我了解,CMake
的标准工作流程是
cmake .
make
我怀疑可能存在CMake
文件和Makefile的去同步问题。
因此,在通常的开发过程中,您应该运行make
以避免对CMakeCache
和Makefiles
进行不必要的重建,并且通常会使过程更直接。但是,如果您将新的源文件添加到CMakeLists
并运行make
,则它将使用旧的CMakeCache
和Makefiles
,并且不会自动重新生成它们。我认为在大规模使用时可能会导致重大问题,因为如果某些东西没有按照它应该构建,你将不得不尝试执行make clean
,然后,如果它没有帮助,你需要删除CMakeCache
并重新生成所有内容(手动!)。
如果我对上述内容不对,请纠正我。
我想做的事情
awesome-cmake
让它更新所有需要更新和构建项目的内容。
所以,问题是:有没有办法用CMake进行“原子构建”,以便跟踪所有必需的信息并抽象出make
的用法?
答案 0 :(得分:6)
我认为你有几个不正确的想法:
我怀疑可能存在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。
答案 1 :(得分:0)
CMake的标准工作流程是源代码构建
mkdir build
cd build
cmake ..
make