【发布时间】:2016-07-06 09:14:15
【问题描述】:
我希望在命令输出更改时触发 CMake 配置;具体来说,我正在考虑在 git describe --always --dirty 的输出与上次配置 CMake 时发生变化时尝试配置 CMake。
大部分问题都可以通过查看HEAD 文件并将内部的symref 解析为refs/heads/[branch] 并将它们与configure_file(...) 链接来解决,但是当树处于脏状态时,这不会出现( IE 当有未提交的修改时)。在这种情况下,git describe --always --dirty 会将-dirty 后缀附加到输出。
发生这种情况时,git 文件没有任何更改,只有 git 注意到与存储状态的差异,因此我无法在此处的任何文件上 configure_file(...) 让 cmake 注意到更改并重新配置。
所以我正在寻找是否有办法让 cmake 运行 git 命令注意输出的差异并触发重新配置,几乎需要类似于预重新配置检查阶段的东西。
不确定这是否可能,是否有人知道如何实现这种行为?
【问题讨论】:
-
不要在 CMake 本身中做这种事情,因为这会给你一种“鸡和蛋”的问题(当没有文件更改时检查更改的文件)。只需将其移动到调用您的 git、配置和构建步骤的一些 shell 脚本包装器中。
-
所以我希望这样做的原因是我可以将
git describe字符串编译到版本信息中,以确保我确切知道它是从哪个 git commit 构建的,并且 critical,如果该提交有修改。如果我可以避免它并且我不明白为什么它应该以先有鸡还是先有蛋的情况结束,我不想在它之上建立一个元构建系统来获得一小部分功能? -
我不知道如何强制 CMake 在构建期间重新运行配置。但是,如果您只想更改 version.h 并重建依赖它的所有内容,则可以在 build 阶段使用
add_custom_target(BuildVersion COMMAND ${CMAKE_EXECUTABLE} -P <script_file>)之类的内容生成该文件。这将在脚本模式下运行 CMake,您可以在其中使用通常的configure_file命令。进一步add_dependencies(<exec-target> BuildVersion)命令将保证,如果脚本更改 version.h 文件,则该可执行文件将被重建。 -
This related question 可能会有所帮助(另请阅读该答案的 cmets)。
-
有一些解决方案的相关讨论:stackoverflow.com/questions/1435953/…