我正在考虑在
GNU Make
中重新实现我们的构建系统(当前基于 CMake
)。
免责声明:这更多的是一个理论和“最佳实践”问题。我不太了解
CMake
。另外,如果问题更切题,请随时将问题转移给程序员。
据我了解,
CMake
的标准工作流程是
cmake .
make
我怀疑可能存在
CMake
文件和Makefile不同步的问题。
因此,在通常的开发过程中,您应该运行
make
以避免不必要的 CMakeCache
和 Makefiles
重建,并且通常使过程更加直接。但是,如果您向 CMakeLists
添加一个新的源文件并运行 make
,它将使用旧的 CMakeCache
和 Makefiles
并且不会自动重新生成它们。我认为大规模使用时可能会导致重大问题,因为万一某些东西没有按照应有的方式构建,您将不得不尝试执行make clean
,然后,如果它没有帮助,您将需要删除CMakeCache
并重新生成所有内容(手动!)。
以上如有不妥之处,请指正。
我只想做
awesome-cmake
并让它更新所有需要更新和构建项目的内容。
所以,问题是:有没有一种方法可以使用 CMake 进行“原子构建”,以便它跟踪所有所需的信息并抽象出
make
的用法?
我认为你这里有一些不正确的想法:
我怀疑可能存在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 重新运行。
CMake 的标准工作流程是源代码外构建
mkdir build
cd build
cmake ..
make
如果您想减少输入命令的时间,您可能会对工作流程预设感兴趣。您可以定义一个执行配置和构建(以及更多操作)的工作流程预设,然后使用
cmake --workflow ...
调用它。
cmake --build ...
而不是特定的构建系统命令,例如 make
。此外,CMake 将尝试生成构建系统来检测 CMake 配置是否已更改,并在必要时首先重新运行 CMake 配置。