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

问题描述 投票:0回答:3

我正在考虑在

GNU Make
中重新实现我们的构建系统(当前基于
CMake
)。

免责声明:这更多的是一个理论和“最佳实践”问题。我不太了解

CMake
。另外,如果问题更切题,请随时将问题转移给程序员。

据我了解,

CMake
的标准工作流程是

cmake .
make

我怀疑可能存在

CMake
文件和Makefile不同步的问题。

因此,在通常的开发过程中,您应该运行

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

以上如有不妥之处,请指正。

我只想做

awesome-cmake

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

所以,问题是:有没有一种方法可以使用 CMake 进行“原子构建”,以便它跟踪所有所需的信息并抽象出

make
的用法?

build makefile cmake build-process
3个回答
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 重新运行。


0
投票

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

mkdir build
cd build
cmake ..
make

0
投票

如果您想减少输入命令的时间,您可能会对工作流程预设感兴趣。您可以定义一个执行配置和构建(以及更多操作)的工作流程预设,然后使用

cmake --workflow ...
调用它。

仅供参考:要构建,您可以使用

cmake --build ...
而不是特定的构建系统命令,例如
make
。此外,CMake 将尝试生成构建系统来检测 CMake 配置是否已更改,并在必要时首先重新运行 CMake 配置。

© www.soinside.com 2019 - 2024. All rights reserved.