# CMake 构建的时候自动根据git提交生成版本号
很常见的版本需求
# 1. 在 CMake 中获取 Git 提交次数
在 CMakeLists.txt
里加入:
# 获取提交次数
execute_process(
COMMAND git rev-list --count HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE GIT_COMMIT_COUNT
OUTPUT_STRIP_TRAILING_WHITESPACE
)
set(MAJOR_VERSION 1)
set(MINOR_VERSION 0)
set(PATCH_VERSION ${GIT_COMMIT_COUNT})
set(FULL_VERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${PATCH_VERSION}")
message(STATUS "Project version: ${FULL_VERSION}")
# 2. 把版本号作为宏传给 C++
在 add_executable
或 add_library
后面添加:
add_executable(myapp main.cpp)
# 传递版本号给 C++ 代码
target_compile_definitions(myapp PRIVATE
PROJECT_VERSION="${FULL_VERSION}"
PROJECT_VERSION_MAJOR=${MAJOR_VERSION}
PROJECT_VERSION_MINOR=${MINOR_VERSION}
PROJECT_VERSION_PATCH=${PATCH_VERSION}
)
# 3. 在 C++ 中使用
main.cpp
里:
#include <iostream>
int main() {
std::cout << "Version: " << PROJECT_VERSION << std::endl;
std::cout << "Major: " << PROJECT_VERSION_MAJOR << std::endl;
std::cout << "Minor: " << PROJECT_VERSION_MINOR << std::endl;
std::cout << "Patch: " << PROJECT_VERSION_PATCH << std::endl;
return 0;
}
编译输出示例:
Version: 1.0.123
Major: 1
Minor: 0
Patch: 123
# 4. 进阶(推荐)
如果希望在代码里 #include "version.h"
直接使用宏,可以让 CMake 自动生成 version.h
:
configure_file(
${CMAKE_SOURCE_DIR}/version.h.in
${CMAKE_BINARY_DIR}/generated/version.h
@ONLY
)
target_include_directories(myapp PRIVATE ${CMAKE_BINARY_DIR}/generated)
version.h.in
内容:
#pragma once
#define PROJECT_VERSION "@FULL_VERSION@"
#define PROJECT_VERSION_MAJOR @MAJOR_VERSION@
#define PROJECT_VERSION_MINOR @MINOR_VERSION@
#define PROJECT_VERSION_PATCH @PATCH_VERSION@
这样编译时会生成 version.h
,代码里直接:
#include "version.h"
std::cout << PROJECT_VERSION << std::endl;