背景
我有一个使用C++的CMake项目。我希望将当前的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
预处理符号即可。
所以我的要求是:
-dirty
后缀),如果git提交或脏标志状态更改,编译到应用程序中的git提交将被更新,如果git提交没有更改,则不应该重新编译或重新链接应用程序。这种技术满足了本地构建的这些要求。
并发症
在工作中,我使用CLion远程编译Raspberry上的应用程序(关键问题)(特定的细节并不重要)。由于CLion的工作方式,.git
目录(因此也是.git/index
)没有复制到远程系统。因此,.git/index
在RPi上编译代码时根本不存在。因此,这种技术失败了,因为RPi上的构建系统根本无法获得所需的信息。
问题
因此,我的想法是在源目录中自动创建一个新文件(以便CLion将其同步到RPi),该文件基于.git/index
,或者仅仅是运行CLion的主机上的git describe
输出。每当git提交更改时,我都需要更新这个文件。内容可用于填充GIT_COMMIT
。如果该文件被追加到CMAKE_CONFIGURE_DEPENDS
,那么它将在文件上的时间戳更改时触发重新配置,而不管文件的内容如何。相反,我希望只有当文件的内容发生变化时才会进行重新配置,因为它很可能在makefile每次运行时由生成的makefile自动更新,但不会更改实际提交。
解决这个问题的正确方法是什么?
在这一点上,我想知道我是不是把事情搞得太复杂了,所以我希望有任何意见,可能会提出另一种方法,请。
发布于 2019-11-27 22:30:17
如果要将要部署到非Git树中的源提取出来,请使用git archive
以及export-subst
和export-ignore
属性自定义部署的内容。例如,您可以在选定文件的标记部分上运行git log
的格式化程序,在提取的提交id和消息以及author中进行子处理。
https://stackoverflow.com/questions/59078882
复制相似问题