-
-
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} | |
} |
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 ".").
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 ?
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').
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)
Qual o melhor script?
Hi.
Please, check my repo. Set Qt App version from git.
I tried your pri file but I had to edit some lines to get it work and I don't know why.
First, with line 12, qmake tried to execute the git command from inside the .git folder. In order to get it work, line 12 becomes:
Another weird thing,
contains
andisEmpty
functions didn't work as expected and I had to replaceGIT_VERSION
by"$${GIT_VERSION}"
inside these functions.Finally, in the RC file for Windows, version number has 4 digital parts, so removing the commit number from the
VERSION
string is optional.Thank you for your script, it saved me a lot of time!