本文介绍了我如何传递git SHA1到编译器作为定义使用cmake?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  g ++ -DGIT_SHA1 =`git log -1 | head -n 1`... 

这非常有用,因为二进制文件知道确切的提交SHA1



如何实现与CMake相同?

解决方案

我做了一些CMake模块对等到一个git repo为版本和类似的目的 - 他们都在我的存储库中



这些功能的好处是,它们会强制重新 - 在每次HEAD提交更改之前配置(重新运行cmake)。与使用execute_process只执行一次操作不同,你不需要记住重新cmake来更新哈希定义。



为了这个特定的目的,你需要最少 GetGitRevisionDescription.cmake GetGitRevisionDescription.cmake.in 文件。然后,在您的主要 CMakeLists.txt 文件中,您将会有这样的

  list(APPEND CMAKE_MODULE_PATH$ {CMAKE_CURRENT_SOURCE_DIR} / whereYouPutMyModules /)
include(GetGitRevisionDescription)
get_git_head_revision(GIT_REFSPEC GIT_SHA1)

然后,您可以将其添加为系统范围的定义(不幸的是会导致大量重建)。

  add_definitions( -  DGIT_SHA1 = $ {GIT_SHA1})

或者,我建议的替代方法:生成一个生成的源文件。在您的来源中创建这两个文件:



GitSHA1.cpp.in:

  #define GIT_SHA1@ GIT_SHA1 @
const char g_GIT_SHA1 [] = GIT_SHA1;

GitSHA1.h:



  extern const char g_GIT_SHA1 []; 

将此添加到您的 CMakeLists.txt 假设您在SOURCES中有一个源文件列表):

  configure_file($ {CMAKE_CURRENT_SOURCE_DIR} /GitSHA1.cpp.in $ {CMAKE_CURRENT_BINARY_DIR} /GitSHA1.cpp@ONLY)
list(APPEND SOURCES$ {CMAKE_CURRENT_BINARY_DIR} /GitSHA1.cppGitSHA1.h)

然后,你有一个全局变量包含你的SHA字符串 - 标题与extern不会改变时,SHA的,所以你可以只包括任何地方你想要的以引用字符串,然后只有生成的CPP需要在每次提交时重新编译,以使您可以随时访问SHA。


In a Makefile this would be done with something like:

g++ -DGIT_SHA1="`git log -1 | head -n 1`" ...

This is very useful, because the binary knows exact commit SHA1 so it can dump it in case of segfault.

How can I achieve the same with CMake?

解决方案

I've made some CMake modules that peer into a git repo for versioning and similar purposes - they're all in my repository at https://github.com/rpavlik/cmake-modules

The good thing about these functions is, they will force a re-configure (a rerun of cmake) before a build every time the HEAD commit changes. Unlike doing something just once with execute_process, you don't need to remember to re-cmake to update the hash definition.

For this specific purpose, you'd need at least the GetGitRevisionDescription.cmake and GetGitRevisionDescription.cmake.in files. Then, in your main CMakeLists.txt file, you'd have something like this

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/whereYouPutMyModules/")
include(GetGitRevisionDescription)
get_git_head_revision(GIT_REFSPEC GIT_SHA1)

Then, you could either add it as a system-wide definition (which unfortunately would cause lots of rebuilding)

add_definitions("-DGIT_SHA1=${GIT_SHA1}")

or, my suggested alternative: Make a generated source file. Create these two files in your source:

GitSHA1.cpp.in:

#define GIT_SHA1 "@GIT_SHA1@"
const char g_GIT_SHA1[] = GIT_SHA1;

GitSHA1.h:

extern const char g_GIT_SHA1[];

Add this to your CMakeLists.txt (assuming you have a list of source files in SOURCES):

configure_file("${CMAKE_CURRENT_SOURCE_DIR}/GitSHA1.cpp.in" "${CMAKE_CURRENT_BINARY_DIR}/GitSHA1.cpp" @ONLY)
list(APPEND SOURCES "${CMAKE_CURRENT_BINARY_DIR}/GitSHA1.cpp" GitSHA1.h)

Then, you have a global variable containing your SHA string - the header with the extern doesn't change when the SHA does, so you can just include that any place you want to refer to the string, and then only the generated CPP needs to be recompiled on every commit to give you access to the SHA everywhere.

这篇关于我如何传递git SHA1到编译器作为定义使用cmake?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-01 04:08