当使用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
本身中。我正在寻找完全自动化的东西。
Cmake 附带了一个 git 的 find 模块,可以像这样使用
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)