【发布时间】:2020-03-23 12:31:46
【问题描述】:
背景
我有一个使用 CMake 的 C++ 项目。我希望将当前的 git 提交(和“-dirty”标志)以一种在 git 提交更改时自动更新的方式编码到应用程序中,例如在成功 git commit 或 git checkout 之后。
我知道我可以通过让 CMake 依赖 .git/index 文件来做到这一点,给出这个:
find_package(Git QUIET REQUIRED)
execute_process(
COMMAND "${GIT_EXECUTABLE}" describe --match=NeVeRmAtCh --always --abbrev=8 --dirty
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
RESULT_VARIABLE res
OUTPUT_VARIABLE GIT_COMMIT
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
set_property(GLOBAL APPEND
PROPERTY CMAKE_CONFIGURE_DEPENDS
"${CMAKE_SOURCE_DIR}/.git/index")
target_compile_definitions(mylib PUBLIC GIT_COMMIT=\"${GIT_COMMIT}\")
那么目标程序 (C++) 可以只使用GIT_COMMIT 预处理器符号。
所以我的要求是:
- 应用程序将包含构建它的源代码的 git 提交(以及
-dirty后缀,如果存在未提交的更改), - 如果 git commit 或脏标志状态发生变化,编译到应用程序中的 git commit 将被更新,
- 如果 git 提交未更改,则不应重新编译或重新链接应用程序。
此技术满足本地构建的这些要求。
并发症
工作中的扳手是我正在使用 CLion 在 Raspberry Pi 上远程编译应用程序(关键问题)(具体细节并不重要)。由于 CLion 的工作方式,.git 目录(以及因此.git/index)不会复制到远程系统。因此,在 RPi 上编译代码时,.git/index 根本不存在。因此,这种技术失败了,因为所需的信息根本无法用于 RPi 上的构建系统。
问题
所以我想以某种方式在源目录中自动创建一个新文件(以便 CLion 将其同步到 RPi),该文件基于 .git/index,或者可能只是 git describe 的输出,在运行 CLion 的主机上。每当 git commit 更改时,我都需要更新此文件。内容可用于填充GIT_COMMIT。如果此文件附加到CMAKE_CONFIGURE_DEPENDS,那么当文件上的时间戳更改时,无论内容如何,都会触发重新配置。相反,我希望仅在文件的 contents 更改时才进行重新配置,因为它很可能会在每次 makefile 运行时由生成的 makefile 自动更新,但不会更改实际提交。
解决这个问题的正确方法是什么?
在这一点上,我想知道我是否过于复杂了,所以我会感谢任何可能建议替代方法的 cmets。
【问题讨论】:
标签: git build cmake clion git-commit