在CLion远程工具链中跟踪git commit时如何触发cmake重新配置

背景

我有一个使用CMake的C ++项目。我希望以某种方式将当前git commit(和“ -dirty”标志)编码到应用程序中,这种方式会在git commit发生更改时自动更新,例如在成功完成git commitgit checkout之后。 / p>

我知道我可以通过使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 commit(如果存在未提交的更改,则包含-dirty后缀)
  • 如果git commit或dirty flag状态更改,则编译到应用程序中的git commit将会更新,
  • 如果git提交未更改,则不应重新编译或重新链接应用程序。

此技术符合本地构建的这些要求。

并发症

正在研究的扳手是我正在使用CLion在Raspberry Pi上远程编译应用程序(关键问题)(具体细节并不重要)。由于CLion的工作方式,因此.git目录(以及.git/index)不会复制到远程系统上。因此,在RPi上编译代码时,.git/index根本就不存在。因此,该技术失败了,因为RPi上的构建系统根本无法获得所需的信息。

问题

因此,我想到了以某种方式自动在源目录中创建一个新文件(以便CLion将其同步到RPi)的方法,该文件基于.git/index或仅基于{{ 1}},在运行CLion的主机上。每当git commit更改时,我都需要更新此文件。内容可用于填充git describe。如果将此文件附加到GIT_COMMIT,则无论文件内容如何,​​时间戳都会改变时将触发重新配置。相反,我希望仅在文件的内容更改时才进行重新配置,因为每次makefile运行时,生成的makefile都会自动更新该文件,但不会更改实际的提交。

解决这个问题的正确方法是什么?

在这一点上,我想知道我是否使事情变得过于复杂,因此,对于任何可能建议使用其他方法的评论,我将不胜感激。

zhuangwei519 回答:在CLion远程工具链中跟踪git commit时如何触发cmake重新配置

如果要提取要部署到非Git树中的源,请使用git archive以及export-substexport-ignore属性来自定义要部署的内容。例如,您可以在选定文件的标记部分上运行git log的格式化程序,并根据提取的提交ID和消息以及作者(不包括)进行

本文链接:https://www.f2er.com/3018261.html

大家都在问