我有一个使用CMake的C ++项目。我希望以某种方式将当前git commit(和“ -dirty”标志)编码到应用程序中,这种方式会在git commit发生更改时自动更新,例如在成功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
后缀;此技术满足本地构建的这些要求。
工作中的扳手是我正在使用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很可能会自动对其进行更新,而无需更改实际的提交。解决此问题的正确方法是什么?
此时,我想知道我是否在使事情变得过于复杂,因此,对于任何可能建议使用其他方法的评论,我将不胜感激。
背景我有一个使用CMake的C ++项目。我希望以一种只要git commit ...