git - 在 CLion 远程工具链中跟踪 git 提交时如何触发 cmake 重新配置
问题描述
背景
我有一个使用 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 commit(
-dirty
如果存在未提交的更改,则为后缀), - 如果 git commit 或脏标志状态发生变化,编译到应用程序中的 git commit 将被更新,
- 如果 git 提交没有更改,则不应重新编译或重新链接应用程序。
此技术满足本地构建的这些要求。
并发症
工作中的关键是我正在使用 CLion 在 Raspberry Pi 上远程编译应用程序(关键问题)(具体细节并不重要)。由于 CLion 的工作方式,.git
目录(因此.git/index
)不会复制到远程系统。因此.git/index
在 RPi 上编译代码时根本不存在。因此,这种技术失败了,因为所需的信息根本无法用于 RPi 上的构建系统。
问题
所以我想以某种方式在源目录中自动创建一个新文件(以便 CLion 将其同步到 RPi),该文件基于运行 CLion 的主机上的.git/index
,或者可能只是 的输出。git describe
每当 git commit 更改时,我都需要更新此文件。内容可用于填充GIT_COMMIT
. 如果附加了这个文件,CMAKE_CONFIGURE_DEPENDS
那么当文件上的时间戳发生变化时,无论内容如何,它都会触发重新配置。相反,我希望仅在文件内容更改时才进行重新配置,因为它很可能会在每次生成文件运行时由生成的生成文件自动更新,但不会更改实际提交。
解决这个问题的正确方法是什么?
在这一点上,我想知道我是否让事情变得过于复杂,所以我很感激任何可能提出替代方法的评论。
解决方案
如果您将要部署的源代码提取到非 Git 树中,请使用和git archive
属性来自定义部署内容。例如,您可以在选定文件的标记部分上运行格式化程序,在提取的提交 ID 和消息和作者中进行替换,等等。export-subst
export-ignore
git log
推荐阅读
- python - Pycharm:原因:java.io.IOException:无法运行程序“python3.7”:错误= 2,没有这样的文件或目录
- eclipse - Eclipse 运行 SpringBoot:SLF4J:类路径包含多个 SLF4J 绑定
- ios - 使用 startAccessingSecurityScopedResource 仍然得到“无法打开,因为您无权查看它”
- python - 在 Colab 环境中使用 xxd 时,它在 bash 中执行
- java - cvc-complex-type.2.4.c:匹配通配符是严格的,但找不到元素“jaxrs:server”的声明
- javascript - 打鼹鼠游戏麻烦
- php - Laravel 如何在分类帖子上添加 orderBy
- scala - Gatling.bat 命令行选项,它们是如何工作的?
- sql-server - 如何使用经典 ASP 更新 SQL 中的多条记录
- oracle - pl sql插入到过程和动态变量中