目录

一、在配置时获取git相关信息

1.git相关命令

(1)git log

(2)git log -n

(3)git log --pretty=format:" "

2.CMake相关命令

(1)execute_process

3.实现

(1)CMakeLists.txt

(2)version.h.in

3.CMake配置

二、在构建时获取git相关信息

1.CMake命令

2.实现

(1)git-hash.cmake

(2)CMakeLists.txt

3.CMake配置及构建

一、在配置时获取git相关信息

        大多数现代源代码存储库都使用Git作为版本控制系统进行跟踪,提交的Git Hash决定了源代码的状态。我们现在在cmake配置时将Git Hash(哈希字符串)记录在一个头文件中,该头文件可以包含在C++源代码中。

        在有git提交记录的项目下创建CMakeLists.txt文件及version.h.in文件。

1.git相关命令

(1)git log

        列出所有历史记录,最近的排在最上方,显示提交对象的哈希值,作者、提交日期、和提交说明。

(2)git log -n

        列出前n条历史记录。

(3)git log --pretty=format:" "

        控制显示的记录格式,常用的格式占位符写法及其代表的意义如下:

%H

提交的完整哈希值

%h

提交的简写哈希值

%T

树的完整哈希值

%t

树的简写哈希值

%P

父提交的完整哈希值

%p

父提交的简写哈希值

%an

作者名字

%ae

作者的电子邮件地址

%ad

作者修订日期(可以用 --date=选项 来定制格式)

%ar

作者修订日期,按多久以前的方式显示

%cn

提交者的名字

%ce

提交者的电子邮件地址

%cd

提交日期

%cr

提交日期(距今多长时间)

%s

提交说明

2.CMake相关命令

(1)execute_process

        CMake I execute_process命令详解(配置)_该用户还没想到好的昵称的博客-CSDN博客

set(GIT_HASH "unknown")
find_package(Git QUIET)
#获取git提交记录的最新一条日志
if(GIT_FOUND)
  execute_process(
    COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:%h
    OUTPUT_VARIABLE GIT_HASH
    OUTPUT_STRIP_TRAILING_WHITESPACE
    ERROR_QUIET
    WORKING_DIRECTORY
      ${CMAKE_CURRENT_SOURCE_DIR}
    )
else()
	message(STATUS "Git not found")
endif()

3.实现

(1)CMakeLists.txt

# set minimum cmake version
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

# project name and language
project(recipe-06 LANGUAGES CXX)

# require C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# GIT_HASH 变量
# in case Git is not available, we default to "unknown"
set(GIT_HASH "unknown")

#获取git提交记录的最新一条日志
# find Git and if available set GIT_HASH variable
find_package(Git QUIET)
if(GIT_FOUND)
  execute_process(
    COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:%h
    OUTPUT_VARIABLE GIT_HASH
    OUTPUT_STRIP_TRAILING_WHITESPACE
    ERROR_QUIET
    WORKING_DIRECTORY
      ${CMAKE_CURRENT_SOURCE_DIR}
    )
else()
	message(STATUS "Git not found")
endif()

message(STATUS "Git hash is ${GIT_HASH}")

# generate file version.hpp based on version.hpp.in
configure_file(
  version.hpp.in
  generated/version.hpp
  @ONLY
  )

# example code
add_executable(example example.cpp)

# needs to find the generated header file
target_include_directories(example
  PRIVATE
    ${CMAKE_CURRENT_BINARY_DIR}/generated
  )

(2)version.h.in

#pragma once

#include <string>

const std::string GIT_HASH = "@GIT_HASH@";

3.CMake配置

        cmake配置时会读取git hash信息,并生成generated/version.h文件。

cmake配置 :

 生成的version.h文件:

#pragma once

#include <string>

const std::string GIT_HASH = "1b9bfcc";

二、在构建时获取git相关信息

        在配置时获取git相关信息有一个令人不满意的地方,如果在配置代码之后更改分支或提交更改,则源代码中包含的版本记录可能指向错误的Git Hash值。所以,我们在构建时记录Git Hash(或者,执行其他操作),以确保每次构建代码时都运行这些操作,因为我们可能只配置一次,但是会构建多次。

1.CMake命令

CMake I add_custom_command命令详解(构建)_该用户还没想到好的昵称的博客-CSDN博客

2.实现

        version.h.in同上,把之前的 CMakeLists.txt 中的大部分代码移到一个单独的文件中,并将该文件命名为 git-hash.cmake。

(1)git-hash.cmake

        git-hash.cmake用来生成version.h文件。

# in case Git is not available, we default to "unknown"
set(GIT_HASH "unknown")

# find Git and if available set GIT_HASH variable
find_package(Git QUIET)
if(GIT_FOUND)
  execute_process(
    COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:%h
    OUTPUT_VARIABLE GIT_HASH
    OUTPUT_STRIP_TRAILING_WHITESPACE
    ERROR_QUIET
    )
endif()

message(STATUS "Git hash is ${GIT_HASH}")

# generate file version.hpp based on version.hpp.in
configure_file(
  ${CMAKE_CURRENT_LIST_DIR}/version.hpp.in
  ${TARGET_DIR}/generated/version.hpp
  @ONLY
  )

(2)CMakeLists.txt

# set minimum cmake version
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)

# project name and language
project(recipe-07 LANGUAGES CXX)

# require C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# example code
add_executable(example example.cpp)

# needs to find the generated header file
target_include_directories(example
  PRIVATE
    ${CMAKE_CURRENT_BINARY_DIR}/generated
  )

#自定义命令:记录了每次编译代码时的 Git Hash
#调用CMake来执行 git-hash.cmake 脚本
#自定义命令将 ALL 目标作为输出。这样,我们就能确保每次都会生成 version.hpp 了。
add_custom_command(
  OUTPUT
    ${CMAKE_CURRENT_BINARY_DIR}/generated/version.hpp
    ALL
  COMMAND
    ${CMAKE_COMMAND} -D TARGET_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/git-hash.cmake
  WORKING_DIRECTORY
    ${CMAKE_CURRENT_SOURCE_DIR}
  )

#自定义目标被添加到ALL目标中,并且依赖于自定义命令的输出。当构建默认目标时,我们确保自定义命令已经运行
# rebuild version.hpp every time
add_custom_target(
  get_git_hash
  ALL
  DEPENDS
    ${CMAKE_CURRENT_BINARY_DIR}/generated/version.hpp
  )

# version.hpp has to be generated
# before we start building example
add_dependencies(example get_git_hash)

3.CMake配置及构建

        生成的version.h文件和之前的一样。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐