我制作了一些 CMake 模块,这些模块可以查看 git 存储库以进行版本控制和类似目的 - 它们都在我的存储库中https://github.com/rpavlik/cmake-modules
这些函数的好处是,每次 HEAD 提交更改时,它们都会在构建之前强制重新配置(重新运行 cmake)。与使用execute_process只执行一次操作不同,您不需要记住重新cmake来更新哈希定义。
为了这个特定的目的,你至少需要GetGitRevisionDescription.cmake
and GetGitRevisionDescription.cmake.in
文件。然后,在你的主要CMakeLists.txt
文件,你会有这样的东西
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/whereYouPutMyModules/")
include(GetGitRevisionDescription)
get_git_head_revision(GIT_REFSPEC GIT_SHA1)
然后,您可以将其添加为系统范围的定义(不幸的是,这会导致大量重建)
add_definitions("-DGIT_SHA1=${GIT_SHA1}")
或者,我建议的替代方案:制作生成的源文件。在源中创建这两个文件:
GitSHA1.cpp.in:
#define GIT_SHA1 "@GIT_SHA1@"
const char g_GIT_SHA1[] = GIT_SHA1;
GitSHA1.h:
extern const char g_GIT_SHA1[];
将其添加到您的CMakeLists.txt
(假设您在 SOURCES 中有一个源文件列表):
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/GitSHA1.cpp.in" "${CMAKE_CURRENT_BINARY_DIR}/GitSHA1.cpp" @ONLY)
list(APPEND SOURCES "${CMAKE_CURRENT_BINARY_DIR}/GitSHA1.cpp" GitSHA1.h)
然后,你有一个包含 SHA 字符串的全局变量 - 当 SHA 改变时,带有 extern 的标头不会改变,因此你可以只包含你想要引用该字符串的任何地方,然后只有生成的 CPP 需要每次提交时都会重新编译,以便您可以在任何地方访问 SHA。