使用 CMake 更改底层 VERSION 文本文件时,如何始终重新生成版本头文件?

arg*_*hol 5 c++ cmake

我维护一个使用 CMake 作为其构建系统的 C++ 框架/库。框架的版本反映在一个名为VERSION(如在许多开源库中)的文件中。

我想生成一个带有版本字符串的 C++ 头文件,VERSION用作输入。我还希望在重新构建期间发生这种情况,而不仅仅是在重新创建项目文件时。如果VERSION是依赖项,那么头文件仅在VERSION发生更改时创建,这将是可取的。

我熟悉使用file()CMake 中的命令来阅读比赛的技术VERSION,例如

file(STRINGS "VERSION" FRAMEWORK_VERSION)
Run Code Online (Sandbox Code Playgroud)

然后使用configure_file命令生成一个文件,例如:

configure_file(version.h.in version.h)
Run Code Online (Sandbox Code Playgroud)

但这只是在生成项目文件时生成头文件。如果VERSION文件发生变化,重新构建(即运行cmake --build .)时不会重新生成版本头文件。

我知道我可以像作为 CMake 宏运行的 Python 脚本一样使用,并在构建过程中始终创建版本标头,但我觉得这有点烦人。

这里的最佳做法是什么?

仅使用 CMake 是否可以解决此问题?

squ*_*les 4

一种仅限 CMake 的解决方案是将您建议的命令包装在自定义目标中以运行 CMake 脚本。如果您使库依赖于自定义目标,它将按以下方式运行:

  • version.h在构建库之前在编译时生成。
  • 仅当其内容发生更改时才重新生成version.h(新版本号或新模板文件,version.h.in

自定义目标的脚本(假设VersionHeader.cmake)将从文件中读取版本号VERSION,并version.h在必要时生成一个新文件。该脚本可以如下所示:

file(STRINGS "${CMAKE_SOURCE_DIR}/VERSION" FRAMEWORK_VERSION)
configure_file(${CMAKE_CURRENT_LIST_DIR}/version.h.in ${CMAKE_CURRENT_LIST_DIR}/version.h @ONLY)
Run Code Online (Sandbox Code Playgroud)

然后,在您的CMakeLists.txt文件中定义一个自定义目标来运行脚本

add_custom_target(VersionHeader
  ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_LIST_DIR}/VersionHeader.cmake
)
add_dependencies(MyFrameworkLib VersionHeader)
Run Code Online (Sandbox Code Playgroud)