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

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

我想使用VERSION作为输入来生成带有版本字符串的C ++头文件。我还希望这种情况在重建过程中发生,而不仅仅是在重建项目文件时发生。如果VERSION是一个依赖项,那么希望仅在VERSION发生更改时才创建头文件。

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

file(STRINGS "VERSION" FRAMEWORK_VERSION)

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

configure_file(version.h.in version.h)

但这仅在生成项目文件的过程中生成头文件。如果VERSION文件已更改,则在重新构建(即运行cmake --build .)时将不会重新生成版本头文件。

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

这里的最佳做法是什么?

仅使用CMake是否有可能解决这个问题?

wxj343302733 回答:当使用CMake更改基础VERSION文本文件时,如何始终重新生成版本头文件?

一个仅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)

然后,在您的CMakeLists.txt文件中,为run a script定义一个自定义目标:

add_custom_target(VersionHeader
  ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_LIST_DIR}/VersionHeader.cmake
)
add_dependencies(MyFrameworkLib VersionHeader)
本文链接:https://www.f2er.com/3152142.html

大家都在问