How do I add revision and build date to source?

I have a GCC project and would like to automatically add defines for build date and revision number (from git) to my sources. What’s the best way to do this?

My goal is simple to be able to do something like this on startup:

  • maven Error resolving version for plugin maven-eclipse-plugin in Jenkins
  • How can I stop an Xcode Archive build if my git working copy is dirty?
  • Solution/Project name variable in TFS Build 2010
  • Azure continuous build is failing with “Unable to initialize blade from definition”
  • Configure hudson to build multiple branches
  • Build on commit with subversion
  • printf("Test app build on %s, revision %d", BUILD_DATE, REVISION)

    For building I’m using make with a simple, not autoconf or anything like this.

  • How to update after successful build-gnuradio?
  • Configuring Hudson/Jenkins for staging and production
  • Continuous integration with Android
  • How to mark a build unstable in Jenkins when running shell scripts
  • Should you check in your compiled assets to Git?
  • Is it possible to get the time/date of a commit knowing the commit hash but without access to the repository?
  • 2 Solutions collect form web for “How do I add revision and build date to source?”

    I ended up using a simple command like this in my Makefile:

    echo "#define GIT_REF \"`git show-ref refs/heads/master | cut -d " " -f 1 | cut -c 31-40`\"" > git_ref.h

    RCS keyword substitution is not natively supported by Git, but can be added with a gitattributes filter driver: See “Git equivalent of subversion’s $URL$ keyword expansion”.

    alt text

    For example (not exactly relate to your question, but illustrates the general principle):

    git config filter.rcs-keyword.clean 'perl -pe "s/\\\$Date[^\\\$]*\\\$/\\\$Date\\\$/"'
    git config filter.rcs-keyword.smudge 'perl -pe "s/\\\$Date[^\\\$]*\\\$/\\\$Date: `date`\\\$/"'

    You will base your filter script on the result of git describe --tags called from your Makefile.

    As mentioned in this answer to “Git equivalent of subversion’s $URL$ keyword expansion”, smudge/clear filter driver is not a perfect solution, and adding any kind of meta-data directly in the data (source) is generally a bad idea (you have a debate about it in “What are the basic clearcase concepts every developer should know?”).

    Yet you have a good example of such Git keyword expansion in this answer in “How do I enable ident string for Git repos?”.

    Git Baby is a git and github fan, let's start git clone.