在cmake中,在分布式可执行文件中包含任意构建时信息

时间:2018-06-13 08:17:05

标签: cmake

使用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本身。我正在寻找完全自动化的东西。

1 个答案:

答案 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)