3

我正在考虑GNU MakeCMake.

免责声明:这更像是一个理论和“最佳实践”的问题。我不知道CMake深入。另外,如果那里更主题化,请随时将问题迁移给程序员。

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

cmake .
make

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

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

如果我对上述某些事情不正确,请纠正我。

我只想做

awesome-cmake

并让它更新所有需要更新和构建项目的东西。

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

4

2 回答 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尽可能接近“原子构建”。

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

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

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

于 2013-11-14T23:18:04.170 回答
0

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

mkdir build
cd build
cmake ..
make
于 2013-11-18T12:49:28.477 回答