下面是详细的步骤和示例代码:
获取 Git 版本号:
使用 execute_process 命令执行 git describe 或其他适合的 Git 命令来获取版本号。
将命令输出保存到一个 CMake 变量中。
获取编译时间:
使用 CMake 的 string(TIMESTAMP …) 命令获取当前的系统时间,并将其格式化为你想要的格式。
将获取到的信息传递给 C++ 代码:
使用 target_compile_definitions 命令在 CMake 中定义预处理宏,将 Git 版本号和编译时间作为字符串传递给 C++ 代码。
示例:
假设我们仍然有一个简单的项目结构,包含以下文件:
CMakeLists.txt:用于配置 CMake 构建过程。
main.cpp:包含主要的 C++ 代码,用于打印 Git 版本号和编译时间。
CMakeLists.txt 文件内容:
cmake_minimum_required(VERSION 3.0)
project(GetGitVersionAndBuildTime)
# Execute Git command to get the Git version
execute_process(
COMMAND git describe --abbrev=7 --always --tags
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE GIT_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
# Define a CMake variable to pass Git version to C++ code
string(STRIP ${GIT_VERSION} GIT_VERSION) # Trim any leading/trailing whitespace
# Get current date and time
string(TIMESTAMP BUILD_TIME "%Y-%m-%d %H:%M:%S")
# Print Git version and build time for verification
message("Git version: ${GIT_VERSION}")
message("Build time: ${BUILD_TIME}")
# Compile C++ executable
add_executable(get_git_version_and_build_time main.cpp)
# Pass Git version and build time to C++ code using preprocessor macros
target_compile_definitions(get_git_version_and_build_time
PRIVATE GIT_VERSION="${GIT_VERSION}" BUILD_TIME="${BUILD_TIME}")
main.cpp 文件内容:
#include <iostream>
int main() {
std::cout << "Git version: " << GIT_VERSION << std::endl;
std::cout << "Build time: " << BUILD_TIME << std::endl;
return 0;
}
释和注意事项:
execute_process 命令:与之前一样,这个命令用于获取当前 Git 仓库的版本号,并将其保存到 GIT_VERSION 变量中。
string(TIMESTAMP …) 命令:用于获取当前的系统时间,并将其格式化为 %Y-%m-%d %H:%M:%S 这样的字符串格式。可以根据需要选择其他格式。
target_compile_definitions 命令:这个命令用来定义编译目标的预处理宏。在这里,我们将 GIT_VERSION 和 BUILD_TIME 作为宏传递给 get_git_version_and_build_time 可执行文件。
这样,当你运行 get_git_version_and_build_time 可执行文件时,它将会打印出 Git 版本号和编译时间信息,这些信息在编译时动态地获取并嵌入到程序中,非常适合需要版本控制和构建时间追溯的应用场景。