使用cmake
时,我们希望我们的可解析文件包含有关发布本身的一些信息(例如git
标记或提交点)。这样我们基本上可以从已安装的软件包中分辨出它是什么版本。
换句话说,我们正在寻找类似git show | head -1
输出的内容:
commit 695ec2ceca0854...blahblahblah
我们的cmake
文件相当简单,包括:
add_executable(exename main.cpp functions.cpp functions.h)
我们如何配置CMakeLists.txt
以生成此信息和将其包含在项目的包装中。
这可以作为具有一个字符串对象的文件(例如:
)烘焙到可执行文件中char *x = "XYZZY-commit 695ec2ceca0854...blahblahblah";
这样我们就可以在可执行文件上运行strings
来获取信息。
它也可以是一个完全独立的文件,如commitpoint.txt
,它与可执行文件一起打包并附带。
或者,如果有人有更好的方式,我可以接受建议。
我喜欢避免在构建时需要手动干预,例如维护一个模块,其中信息被硬编码到其中并存储在git
本身。我正在寻找完全自动化的东西。
答案 0 :(得分:1)
Cmake附带find module for git可以像这样使用
find_package(Git)
if(Git_FOUND)
execute_process(COMMAND "${GIT_EXECUTABLE}" log --pretty=format:%h -n 1
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE commit_sha1
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
else()
set(commit_sha1 "Unknown")
endif()
其中git参数和工作目录显然可以根据您的需要进行调整。现在可以在配置文件时使用存储所需信息的变量
configure_file(version.cpp.in version.cpp)
version.cpp.in
包含
const char *gitInfo = "@commit_sha1@";
生成的version.cpp
将在构建目录中创建,并通过
add_executable(exename ... ${CMAKE_CURRENT_BINARY_DIR}/version.cpp)