gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:08:46 25 4
gpt4 key购买 nike

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

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

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

file(STRINGS "VERSION" FRAMEWORK_VERSION)

然后使用 configure_file 生成文件命令,例如:
configure_file(version.h.in version.h)

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

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

这里的最佳做法是什么?

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

最佳答案

一种仅限 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)

    关于c++ - 使用 CMake 更改底层 VERSION 文本文件时,如何始终重新生成版本头文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58730431/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com