奇技淫巧[1]:cmake中獲取git信息

1 目的

獲取當前源碼的git分支名及Commit Hash,將其寫入頭文件並生成至指定目錄。

2 要點

  • macro宏的使用
  • execute_process執行一個子進程
  • configure_file修改並拷貝文件

3 用法

工程結構如下:

root
├── CMakeLists.txt
├── cmake
│ └── Utility.cmake
└── include
└── git_version.h.in

首先在CMakeLists.txt中加入自定義cmake文件目錄,這樣在include(Utility)時cmake會自動搜索並引入Utility.cmake

[CMakeLists.txt]:

# 添加自定義cmake文件目錄
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

# 使用Utility.cmake
include(Utility)

Utility.cmake中定義了get_git_hashget_git_branch兩個宏,分別用於獲取當前源碼的Commit Hash及git分支名

[CMakeLists.txt]:

# 獲取當前的GIT_HASH
set(GIT_HASH "")
get_git_hash(GIT_HASH)
message(STATUS "Git hash is ${GIT_HASH}")

# 獲取當前的分支
set(GIT_BRANCH "")
get_git_branch(GIT_BRANCH)
message(STATUS "Git branch is ${GIT_BRANCH}")

宏的定義在Utility.cmake中,以get_git_hash為例代碼如下,其中execute_processexec_program的新版實現,盡量使用前者以獲得更多特性支持

另:get_git_branch只需將COMMAND替換為${GIT_EXECUTABLE} symbolic-ref --short -q HEAD即可

[Utility.cmake]:

# get git hash
macro(get_git_hash _git_hash) # 宏的開始
find_package(Git QUIET) # 查找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}
)
endif()
endmacro() # 宏的結束

在獲取GIT_HASHGIT_BRANCH兩個字元串變數之後,執行configure_file,將git_version.h.in中的@GIT_BRANCH@@GIT_HASH@進行替換,並保存為指定路徑下的git_version.h

[CMakeLists.txt]:

configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/include/git_version.h.in # 輸入
${CMAKE_BINARY_DIR}/generate/git_version.h # 輸出
@ONLY # 只接受形如@VAR@的佔位符
)

[git_version.h.in]:

#pragma once
#include <string>

const std::string git_branch = "@GIT_BRANCH@";
const std::string git_hash = "@GIT_HASH@";

執行cmake之後build下多了相應的文件

root
└── build
├── ...
└── generate
└── git_version.h

[git_version.h]:

#pragma once
#include <string>

const std::string git_branch = "master";
const std::string git_hash = "e40f51c";

4 源碼

git clone https://github.com/zfrxiaxia/cmake_template_git.git


推薦閱讀:
相关文章