gpt4 book ai didi

cmake - 没有 CMake 更改时重建配置文件

转载 作者:行者123 更新时间:2023-12-05 03:05:57 35 4
gpt4 key购买 nike

我有一个包含配置文件的项目。

configure_file(version.h.in version/version.h)

同一代码库在一天内用于多次构建,构建之间无需清理。 version.h 文件将在第一次运行构建时构建,但后续构建不会在 version.h 中重建(并更新修订号)。

有没有一种方法可以强制 CMake 始终重建 version.h 而不管更改,或者更好的是基于 subversion 修订号的更改(或没有更改)?

最佳答案

要完成这项工作,您需要克服一些问题。

  • 当运行 cmake 时,您从 subversion 中提取的任何版本信息都会被烘焙到生成的构建文件中,因此变成静态的。
  • Cmake 仅在检测到生成的构建文件已过时时才重新运行(例如:如果 CMakeLists.txt 文件已更新)
  • 您可以创建一个 custom_target,它将在您每次构建时运行(来自 docs :“目标没有输出文件,并且总是被认为是过时的”) 生成文件,但这将迫使您每次 重建生成的版本文件。

这是一种克服上述所有障碍的方法:

首先,创建一个包含编译版本信息的库。

add_library(version STATIC ${CMAKE_CURRENT_BINARY_DIR}/version_gen.cc)

现在,在库和名为 gen_versioncustom_target 之间添加人工依赖项

add_dependencies(version gen_version)

这将强制 gen_version 构建 version 库之前运行。

现在创建一个名为 gen_versioncustom_target,它将生成版本信息:

add_custom_target(
gen_version
ALL
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/gen_version.cmake)

此自定义目标已添加到 ALL 目标,并将在您每次 构建时运行。它将执行另一个名为 gen_version.cmake

的 cmake 脚本

这是第一个技巧。我们让 cmake 执行一个子进程,并在每个构建上运行一个新的 cmake 脚本,其中所需的版本信息在每个构建中重新计算。

下一个技巧是使用临时输出文件调用configure_file,并且仅在必要时更新真实版本文件。这避免了在版本未更改时重新编译的需要。

在下面的示例中,我展示了从 git 获取版本信息——您可以将其替换为您的颠覆方法。

gen_version.cmake:

# obtain the git version
execute_process(
OUTPUT_VARIABLE ${VERSION}
COMMAND git rev-parse --short HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)

# configure the version file, but output to a temporary location
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/version_gen.in
${CMAKE_CURRENT_BINARY_DIR}/version_gen.cc.tmp
)

# compare with the real version file
execute_process(
COMMAND
${CMAKE_COMMAND} -E compare_files
${CMAKE_CURRENT_BINARY_DIR}/version_gen.cc.tmp
${CMAKE_CURRENT_BINARY_DIR}/version_gen.cc
RESULT_VARIABLE
VERSION_NEEDS_UPDATING

OUTPUT_QUIET
ERROR_QUIET
)

# update the real version file if necessary
if(VERSION_NEEDS_UPDATING)
execute_process(
COMMAND
${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_BINARY_DIR}/version_gen.cc.tmp
${CMAKE_CURRENT_BINARY_DIR}/version_gen.cc
)
endif()

set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/version_gen.cc
PROPERTIES GENERATED TRUE)

关于cmake - 没有 CMake 更改时重建配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50102893/

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