how to include git commit-number into a c++ executable?
Probably the easiest way to do this would be to add to your makefile a rule to generate a .c file with the current git commit ID:
gitversion.c: .git/HEAD .git/index echo "const char *gitversion = \"$(shell git rev-parse HEAD)\";" > $@
Now simply add gitversion.c
to your build process as normal. Make sure to remove it on make clean
, and add it to .gitignore
so it's not added to the git repository accidentally. Add an extern const char *gitversion;
to a header somewhere, and you can access it like that.
I do the following in CMakeLists.txt:
IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git) FIND_PACKAGE(Git) IF(GIT_FOUND) EXECUTE_PROCESS( COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE "kml2maps_BUILD_VERSION" ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) MESSAGE( STATUS "Git version: ${kml2maps_BUILD_VERSION}" ) ELSE(GIT_FOUND) SET(kml2maps_BUILD_VERSION 0) ENDIF(GIT_FOUND)ENDIF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git)CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/kml2mapsVersion.h.in ${CMAKE_CURRENT_BINARY_DIR}/kml2mapsVersion.h @ONLY)
So the git rev-parse --short HEAD
's output is good to build in the binary.
I use git describe
to get a version which either uses a tag or commit number. This usually gives nice versions like: v0.1-1-g787c667
if the tip of the branch has additional commits above the 'v0.1' tag.
The git command I use is: git describe --tags --always
. I usually use it with the SCons build system and define it as a constant, relevant parts of the SConstruct:
import os, sys from subprocess import *def getGitDesc(): return Popen('git describe --tags --always', stdout=PIPE, shell=True).stdout.read ().strip ()GIT_DESC = getGitDesc () print "Building " + getGitDesc () + ".." env = Environment ()# set up environment env.Append (CPPDEFINES = { 'GIT_DESC' : ('\\"%s\\"' % GIT_DESC) } )# build your programenv.Program (....)
In the C or C++ program I can now access GIT_DESC
as a string-constant:
# include <iostream>using namespace std;int main (int argc, char ** argv) { cout << "Version: " << GIT_DESC << endl; return 42;}
note: the --abbrev=N
argument to git describe
might be useful to achieve consistent version output independent of a users git configuration.