在cmake中,在分布式可执行文件中包含任意构建时信息
当使用在cmake中,在分布式可执行文件中包含任意构建时信息,cmake,Cmake,当使用cmake时,我们希望我们的可分发文件包含一些关于发布本身的信息(例如git标记或提交点)。这样我们就可以从安装的软件包中判断它是什么版本 换句话说,我们正在寻找类似于git show | head-1的输出: commit 695ec2ceca0854...blahblahblah 我们的cmake文件相当简单,包括: add_executable(exename main.cpp functions.cpp functions.h) 我们如何配置CMakeLists.txt,以生成
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";
因此,我们可以在可执行文件上运行字符串
,以获取信息
它也可以是一个完全独立的文件,如commitpoint.txt
,它与可执行文件一起打包和提供
或者,如果有人有更好的方法,我愿意接受建议
我更愿意避免的是在构建时需要手动干预的事情,比如维护一个模块,将信息硬编码到其中并存储在git
本身中。我正在寻找完全自动化的产品。Cmake附带一个可以像这样使用的
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.包含
const char *gitInfo = "@commit_sha1@";
生成的version.cpp
将在生成目录中创建,并包含在可执行文件中
add_executable(exename ... ${CMAKE_CURRENT_BINARY_DIR}/version.cpp)
?configure_文件
在配置时工作。git pull可以更改提交,而无需CMake重新运行add_custom_命令
和/或add_custom_目标
使用找到的Git可执行文件可能会更好。这一点很好!我发现了与svn存储库信息相同的问题,其中提出了在构建时生成此信息的解决方案。