gpt4 book ai didi

git - 如何在命令输出更改时触发 CMake 重新配置

转载 作者:太空狗 更新时间:2023-10-29 13:26:16 27 4
gpt4 key购买 nike

我希望在命令输出更改时触发 CMake 配置;具体来说,当 git describe --always --dirty 的输出与上一次配置 CMake 时发生变化时,我正在尝试配置 CMake。

这个问题的大部分可以通过观察 HEAD 文件并将其中的 symref 解析为 refs/heads/[branch] 并将它们与 configure_file 链接来解决(...) 但是,当树处于脏状态时(即有未提交的修改时),这不会起作用。在这种情况下,git describe --always --dirty 会将 -dirty 后缀附加到输出。

发生这种情况时,git 文件没有任何变化,只是 git 注意到与存储状态的差异,所以我不能对此处的任何文件configure_file(...) 获取 cmake注意到更改并重新配置。

所以我正在寻找是否有办法让 cmake 运行 git 命令注意输出的差异并触发重新配置,几乎需要类似于预重新配置检查阶段的东西。

不确定这是否可行,是否有人知道如何实现这种行为?

最佳答案

问题

这里的问题是“重新配置前检查阶段”是由您的构建环境处理的。仅当它的某些输入文件发生更改时才会调用 CMake(因为 CMake 已为您的构建环境生成规则以跟踪这些文件是否发生更改)。

对于此讨论,我们假设您有类似的东西:

execute_process(
COMMAND ${GIT_EXECUTABLE} describe --always --dirty
OUTPUT_VARIABLE _git_file_list
OUTPUT_STRIP_TRAILING_WHITESPACE
)

configure_file(version.h.in version.h)

外部命令输出更改时无内置重新配置

如果没有您在构建过程中加入的额外脚本,我认为“检查外部命令的输出作为重新配置前的步骤”之类的事情是不可能的。

您可以强制 CMake 每次都重新配置,例如通过在实际构建之前调用 make rebuild_cache 或添加例如add_custom_command(TARGET MyExe POST_BUILD ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/version.h),但是每次调用配置过程是非常耗时的事情。

解决方案

在我的项目中,我已经将类似上面代码的内容移动到它自己的 WriteVersionInfo.cmake 脚本中:

set(_version_cpp_full_path "${CMAKE_CURRENT_BINARY_DIR}/version.cpp")
set(_version_obj_full_path "${_version_cpp_full_path}${CMAKE_CXX_OUTPUT_EXTENSION}")

string(REPLACE " " ";" _compiler_flags_list ${CMAKE_CXX_FLAGS})

# Create a dummy output to satisfy dependency check
if (NOT EXISTS ${_version_obj_full_path})
file(WRITE ${_version_obj_full_path} "")
endif()

add_custom_command(
TARGET MyExe
PRE_LINK
COMMAND ${CMAKE_COMMAND} -D GIT_EXECUTABLE=${GIT_EXECUTABLE}
-D _version_cpp_name=${_version_cpp_full_path}
-P ${CMAKE_CURRENT_SOURCE_DIR}/WriteVersionInfo.cmake
COMMAND ${CMAKE_CXX_COMPILER} ${_compiler_flags_list}
-o ${_version_obj_full_path}
-c ${_version_cpp_full_path}
VERBATIM
)

target_link_libraries(
MyExe
${_version_obj_full_path}
)

在这里,我直接写入一个.cpp 文件,并将其作为PRE_LINK 步骤直接传递给编译器。请注意,上述方法不适用于库目标(因为没有预链接步骤)。

引用资料

关于git - 如何在命令输出更改时触发 CMake 重新配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38220304/

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