C++ 当使用CMake更改基础版本文本文件时,如何始终重新生成版本头文件?

C++ 当使用CMake更改基础版本文本文件时,如何始终重新生成版本头文件?,c++,cmake,C++,Cmake,我维护一个C++框架/库,它使用CMake作为构建系统。框架的版本反映在一个名为version的文件中(与许多开源库一样) < >我想用一个版本字符串生成一个C++头文件,使用版本作为输入。我还希望在重新构建期间发生这种情况,而不仅仅是在重新创建项目文件时。如果VERSION是一个依赖项,则最好只在VERSION发生更改时创建头文件 我熟悉使用CMake中的file()命令读取版本的比赛的技巧,例如 file(STRINGS "VERSION" FRAMEWORK_VERSION) 然后使用c

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

< >我想用一个版本字符串生成一个C++头文件,使用<代码>版本<代码>作为输入。我还希望在重新构建期间发生这种情况,而不仅仅是在重新创建项目文件时。如果
VERSION
是一个依赖项,则最好只在
VERSION
发生更改时创建头文件

我熟悉使用CMake中的
file()
命令读取
版本的比赛的技巧,例如

file(STRINGS "VERSION" FRAMEWORK_VERSION)
然后使用
configure_file
命令生成文件,例如:

configure_file(version.h.in version.h)
但这仅在生成项目文件期间生成头文件。如果更改了
版本
文件,则在重新构建时不会重新生成版本头文件(即运行
cmake--build.

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

这里的最佳实践是什么


仅使用CMake不可能解决此问题吗?

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

  • 在编译时生成
    version.h
    ,然后再构建库
  • 仅当其内容将更改时(新版本号或新模板文件,
    version.h.in
    ),才重新生成
    version.h
自定义目标的脚本(比如
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)
然后,在
CMakeLists.txt
文件中,定义一个自定义目标:


由于某种原因,
${CMAKE\u SOURCE\u DIR}/VERSION
对我的build/binary目录求值,
${CMAKE\u CURRENT\u LIST\u DIR}/VERSION
得到了正确的结果。奇怪。我不知道这是否是最佳实践,但对我来说已经足够好了。
add_custom_target(VersionHeader
  ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_LIST_DIR}/VersionHeader.cmake
)
add_dependencies(MyFrameworkLib VersionHeader)