6.6 配置时记录Git Hash值

    大多数现代源代码存储库都使用Git作为版本控制系统进行跟踪,这可以归功于存储库托管平台GitHub的流行。因此,我们将在本示例中使用Git;然而,实际中会根据具体的动机和实现,可以转化为其他版本控制系统。我们以Git为例,提交的Git Hash决定了源代码的状态。因此,为了标记可执行文件,我们将尝试将Git Hash记录到可执行文件中,方法是将哈希字符串记录在一个头文件中,该头文件可以包含在代码中。

    我们需要两个源文件,类似于前面的示例。其中一个将配置记录的Hash(),详情如下:

    还需要一个示例源文件(example.cpp),将Hash打印到屏幕上:

    1. #include "version.hpp"
    2. #include <iostream>
    3. int main() {
    4. std::cout << "This code has been configured from version " << GIT_HASH << std::endl;
    5. }

    下面演示了从Git记录版本信息的步骤:

    1. 定义项目和支持语言:

    2. 定义GIT_HASH变量:

      1. set(GIT_HASH "unknown")
      2. # find Git and if available set GIT_HASH variable
      3. find_package(Git QUIET)
      4. if(GIT_FOUND)
      5. execute_process(
      6. COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:%h
      7. OUTPUT_VARIABLE GIT_HASH
      8. OUTPUT_STRIP_TRAILING_WHITESPACE
      9. ERROR_QUIET
      10. WORKING_DIRECTORY
      11. ${CMAKE_CURRENT_SOURCE_DIR}
      12. endif()
      13. message(STATUS "Git hash is ${GIT_HASH}")
    3. 验证输出(Hash不同):

      1. $ mkdir -p build
      2. $ cd build
      3. $ cmake ..
      4. $ cmake --build .
      5. $ ./example
      6. This code has been configured from version d58c64f

    使用find_package(Git QUIET)来检测系统上是否有可用的Git。如果有(GIT_FOUNDTrue),运行一个Git命令:${GIT_EXECUTABLE} log -1 --pretty=format:%h。这个命令给出了当前提交Hash的简短版本。当然,这里我们可以灵活地运行Git命令。我们要求execute_process命令将结果放入名为GIT_HASH的变量中,然后删除任何尾随的空格。使用ERROR_QUIET,如果Git命令由于某种原因失败,我们不会停止配置。

    由于Git命令可能会失败(源代码已经分发到Git存储库之外),或者Git在系统上不可用,我们希望为这个变量设置一个默认值,如下所示: