CMake | 在配置或构建时获取git相关信息
在配置或构建时获取git-hash等信息。介绍git log等命令。
目录
(3)git log --pretty=format:" "
一、在配置时获取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:" "
控制显示的记录格式,常用的格式占位符写法及其代表的意义如下:
| 提交的完整哈希值 |
---|---|
| 提交的简写哈希值 |
| 树的完整哈希值 |
| 树的简写哈希值 |
| 父提交的完整哈希值 |
| 父提交的简写哈希值 |
| 作者名字 |
| 作者的电子邮件地址 |
| 作者修订日期(可以用 --date=选项 来定制格式) |
| 作者修订日期,按多久以前的方式显示 |
| 提交者的名字 |
| 提交者的电子邮件地址 |
| 提交日期 |
| 提交日期(距今多长时间) |
| 提交说明 |
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文件和之前的一样。
更多推荐
所有评论(0)