在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存储库信息相同的问题,其中提出了在构建时生成此信息的解决方案。