CMake:是否可以在每次制作后运行 CONFIGURE_FILE?

Mey*_*sam 4 makefile cmake

我的 CMake 文件中有以下一段脚本:

CONFIGURE_FILE(
    ${CMAKE_CURRENT_SOURCE_DIR}/version.hpp.cmake
    ${CMAKE_CURRENT_SOURCE_DIR}/version.hpp
)
Run Code Online (Sandbox Code Playgroud)

但它只在执行后运行cmake,而不是make. 是否可以version.hpp在每次制作后创建文件?

以下是内容version.hpp.cmake

#ifndef _VERSION_HPP_
#define _VERSION_HPP_

#define MAJOR_VERSION "${MAJOR}"
#define MINOR_VERSION "${MINOR}"
#define PATCH_VERSION "${PATCH}"
#define RELEASE_VERSION "${RELEASE}"

#endif //_VERSION_HPP_
Run Code Online (Sandbox Code Playgroud)

MAJORMINORPATCHRELEASE变量已在定义CMakeLists.txt文件。

PS这篇文章显然与我的问题有关,但我无法理解。

Com*_*sMS 5

问题是它configure_file应该在配置时运行,即运行时cmake,而不是编译时,即运行时 make。没有简单的方法可以解决这个问题。

问题是由 编写的信息configure_file取决于来自 CMake 构建环境的变量。如果不再次运行 CMake,则无法检测到对这些变量的更改。如果您将该信息反映在其他地方,您可以使用自定义命令来提取它并为您执行代码生成,正如Peter 的回答所建议的那样。

在答案中链接的 CMake 邮件列表中的帖子中建议的方法基于两阶段 CMake 运行:外部 CMake 项目(仅运行一次)添加了用于构建内部 CMake 项目的自定义构建步骤(然后与执行的每个make)一起运行configure_file。基本思想与 Peter 的回答相同,只是您使用 CMake 脚本而不是 Python 脚本来生成文件。

我的个人建议:对于一个简单的问题作为版本标题,我不会打扰这么复杂的方法。只需将文件生成到您的 BINARY_DIR(而不是像您目前所做的那样生成到您的项目目录!您希望保留从同一源执行多个源外构建的能力)并假设它将在那里进行编译。如果用户有足够的勇气去处理那里生成的文件,他们可以自己重新运行 CMake。