【问题标题】:How to trigger cmake reconfiguration when tracking git commits in a CLion remote toolchain在 CLion 远程工具链中跟踪 git 提交时如何触发 cmake 重新配置
【发布时间】:2020-03-23 12:31:46
【问题描述】:

背景

我有一个使用 CMake 的 C++ 项目。我希望将当前的 git 提交(和“-dirty”标志)以一种在 git 提交更改时自动更新的方式编码到应用程序中,例如在成功 git commitgit 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


    【解决方案1】:

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

    【讨论】:

    • 如果我理解正确,您是在建议一种从 git 中获取信息的方法?我想我已经可以用git describe 做到这一点。问题是我无法控制 CLion 将源代码分发到远程工具链的方式。因为CLion知道git,它也知道不要把.git目录复制到远程,所以我还是需要想办法创建一个文件,只要内容发生变化,就不会触发cmake重新配置.对不起,如果我误解了你。
    • 解决这个问题的正确方法是修复你拒绝正确使用Git的工具。 git archive 专门用于构建标记的源目录以进行部署。如果做不到这一点,请创建一个脚本来构建您的标记文件,然后调用您的构建。
    • 好的,我明白了——谢谢。不幸的是,我无法修复 CLion。我会考虑使用脚本,我只是不确定如何在 CLion 与远程系统同步之前在本地调用它——我可能必须手动运行它。但这是 CLion 的问题。
    猜你喜欢
    • 2013-05-11
    • 2020-01-06
    • 2016-12-17
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    相关资源
    最近更新 更多