# CMake中变量设置及打印
Git相关信息代码如下,在CMakeLists.txt中照搬配置即可,OUTPUT_VARIABLE后为变量名,可自行修改,其中
GIT_COMMIT_SHA1 为 commit-id或tag-id
GIT_COMMIT_DATE 为 提交时间
GIT_COMMIT_SUBJECT 为 commit-message
GIT_BRANCH_NAME 为 分支名
find_package(Git)
execute_process(COMMAND
"${GIT_EXECUTABLE}" describe --always --abbrev=10 --dirty --tags
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
OUTPUT_VARIABLE GIT_COMMIT_SHA1
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(COMMAND
"${GIT_EXECUTABLE}" log -1 --format=%ad --date=local
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
OUTPUT_VARIABLE GIT_COMMIT_DATE
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(COMMAND
"${GIT_EXECUTABLE}" log -1 --format=%s
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
OUTPUT_VARIABLE GIT_COMMIT_SUBJECT
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(COMMAND
"${GIT_EXECUTABLE}" rev-parse --abbrev-ref HEAD
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE GIT_BRANCH_NAME
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
)
message(STATUS "")
message(STATUS "============================== GIT COMMIT LOG ==============================")
message(STATUS "=== update git commit SHA1 : ${GIT_COMMIT_SHA1}")
message(STATUS "=== update git branch name : ${GIT_BRANCH_NAME}")
message(STATUS "=== update git commit date : ${GIT_COMMIT_DATE}")
message(STATUS "=== update git commit subject : ${GIT_COMMIT_SUBJECT}")
message(STATUS "============================================================================")
message(STATUS "")
打印效果如下
-- ============================== GIT COMMIT LOG ==============================
-- === update git commit SHA1 : v0.0
-- === update git branch name : main
-- === update git commit date : Mon May 15 18:25:17 2023
-- === update git commit subject : print version
-- ============================================================================
# 在程序内使用或打印commit信息
上述变量的作用域在CMakeLists中,若要在程序中获取上述变量的值,可通过下述配置
# CMakeLists.txt
在CMakeLists.txt中配置如下代码
configure_file(version.h.in version.h)
# message("PROJECT_BINARY_DIR=${PROJECT_BINARY_DIR}")
target_include_directories(project
PUBLIC "${PROJECT_BINARY_DIR}"
)
configure_file会根据version.h.in生成version.h,生成位置在PROJECT_BINARY_DIR,可通过message打印查看路径,一般在build文件夹内,其中version.h.in需手动写入所需传递的变量,如下
# version.h.in
const char* GIT_COMMIT_SHA1 = "@GIT_COMMIT_SHA1@";
const char* GIT_COMMIT_DATE = "@GIT_COMMIT_DATE@";
const char* GIT_COMMIT_SUBJECT = "@GIT_COMMIT_SUBJECT@";
const char* GIT_BRANCH_NAME = "@GIT_BRANCH_NAME@";
生成的version.h如下 # version.h
const char* GIT_COMMIT_SHA1 = "v0.0";
const char* GIT_COMMIT_DATE = "Mon May 15 18:25:17 2023";
const char* GIT_COMMIT_SUBJECT = "print version";
const char* GIT_BRANCH_NAME = "main";
至此GIT_COMMIT_SHA1等4个参数即生成并传递到函数内部,在所需使用的文件内include进version.h即可,例如
# print_version.cpp
#include <iostream>
#include "version.h"
extern const char* GIT_COMMIT_DATE;
int main(int argc, char* argv[]) {
std::cout << "commit date: " << GIT_COMMIT_DATE << std::endl;
return 0;
}
则Terminal中打印为
commit date: Mon May 15 18:25:17 2023