Skip to content

Instantly share code, notes, and snippets.

@grassator
Created April 29, 2014 16:51
Show Gist options
  • Star 17 You must be signed in to star a gist
  • Fork 9 You must be signed in to fork a gist
  • Save grassator/11405930 to your computer and use it in GitHub Desktop.
Save grassator/11405930 to your computer and use it in GitHub Desktop.
# If there is no version tag in git this one will be used
VERSION = 0.1.0
# Need to discard STDERR so get path to NULL device
win32 {
NULL_DEVICE = NUL # Windows doesn't have /dev/null but has NUL
} else {
NULL_DEVICE = /dev/null
}
# Need to call git with manually specified paths to repository
BASE_GIT_COMMAND = git --git-dir $$PWD/.git --work-tree $$PWD
# Trying to get version from git tag / revision
GIT_VERSION = $$system($$BASE_GIT_COMMAND describe --always --tags 2> $$NULL_DEVICE)
# Check if we only have hash without version number
!contains(GIT_VERSION,\d+\.\d+\.\d+) {
# If there is nothing we simply use version defined manually
isEmpty(GIT_VERSION) {
GIT_VERSION = $$VERSION
} else { # otherwise construct proper git describe string
GIT_COMMIT_COUNT = $$system($$BASE_GIT_COMMAND rev-list HEAD --count 2> $$NULL_DEVICE)
isEmpty(GIT_COMMIT_COUNT) {
GIT_COMMIT_COUNT = 0
}
GIT_VERSION = $$VERSION-$$GIT_COMMIT_COUNT-g$$GIT_VERSION
}
}
# Turns describe output like 0.1.5-42-g652c397 into "0.1.5.42.652c397"
GIT_VERSION ~= s/-/"."
GIT_VERSION ~= s/g/""
# Now we are ready to pass parsed version to Qt
VERSION = $$GIT_VERSION
win32 { # On windows version can only be numerical so remove commit hash
VERSION ~= s/\.\d+\.[a-f0-9]{6,}//
}
# Adding C preprocessor #DEFINE so we can use it in C++ code
# also here we want full version on every system so using GIT_VERSION
DEFINES += GIT_VERSION=\\\"$$GIT_VERSION\\\"
# By default Qt only uses major and minor version for Info.plist on Mac.
# This will rewrite Info.plist with full version
macx {
INFO_PLIST_PATH = $$shell_quote($${OUT_PWD}/$${TARGET}.app/Contents/Info.plist)
QMAKE_POST_LINK += /usr/libexec/PlistBuddy -c \"Set :CFBundleShortVersionString $${VERSION}\" $${INFO_PLIST_PATH}
}
@netnazgul
Copy link

Adding to previous comment - qmake doesn't like the line

!contains(GIT_VERSION,\d+\.\d+\.\d+) {

where it says that unescaped backslashes are deprecated, meaning that regexp doesn't work after it.
It doesn't like win32 version fix either, but leaving commit count as 4th number and dot without backslash fixes the problem (so "." works the same as ".").

@z00m1n
Copy link

z00m1n commented Apr 12, 2015

Thanks for your effort, this is a great start to getting version info from git into my application! :-)

Out of the box, the ante-last step seems to fail on Mac OS X 10.8 / XCode Version 5.1.1 (5B1008) with

Set: Entry, ":CFBundleShortVersionString", Does Not Exist

Has this entry possible been introduced only in a later version ? What Mac OS X version was this written on ?

@z00m1n
Copy link

z00m1n commented Apr 12, 2015

It seems, instead of CFBundleShortVersionString, I can also use CFBundleGetInfoString; this is set to "Created by Qt/QMake" by default and is displayed as the contents of the 'Version' field in the Mac OS X info dialog (the one displayed by right-clicking the .app application file and selecting 'Get Info').

@asmaloney
Copy link

I realize this is a couple of years old, but if anyone else lands here this might be useful.

You can replace the whole !contains(GIT_VERSION,\d+\.\d+\.\d+) { section that is recreating the tag-num-ghash format if you simply change the initial git command from:

git describe --always --tags

to:

git describe --long

This will result in git describe always returning it in the tag-num-ghash format. (Reference: the git docs)

@fallomermo
Copy link

Qual o melhor script?

@mrbindraw
Copy link

Hi.
Please, check my repo. Set Qt App version from git.

https://github.com/mrbindraw/TestVersion

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment