Commit f5379ab8 authored by Rafael Kitover's avatar Rafael Kitover
Browse files

read version and subversion info from Git

To get the version, find the last tag in git tag of the form "v2.0.0" or
"2.0.0". If this is the last tag and the current commit matches the ref
of this tag, the revision will be empty.

In the case that the current commit is not tagged with a version, to get
the revision, use the short sha unless the current commit is tagged with
something that is not a version string, e.g.  "feature-foo", in which
case the revision will be "feature-foo".

If the current commit is tagged as e.g. "v2.0.1-foo" or "2.0.1-foo" then
the version will be "2.0.1" and the revision will be "foo". Tags of this
form are also checked when finding the current version.

This is all done in cmake. If there is no git detected, the version will
be "2.0.0" and the revision will be "unknown".
parent 9c06c318
......@@ -105,10 +105,8 @@ endif( NOT ENABLE_DEBUGGER AND ENABLE_SDL )
find_package(Git)
if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
INCLUDE(GetGitRevisionDescription)
EXECUTE_PROCESS(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD OUTPUT_VARIABLE SHORT_SHA OUTPUT_STRIP_TRAILING_WHITESPACE)
SET(REVISION ${SHORT_SHA} CACHE STRING "git short sha" FORCE)
include(GitTagVersion)
git_version(VERSION REVISION VERSION_RELEASE)
# only use the plugin to tie the configure state to the sha to force rebuilds
# of files that depend on version.h
......@@ -117,7 +115,9 @@ if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
else()
message(WARNING "Git not found, cannot set version info")
SET(REVISION "unknown")
set(VERSION 2.0.0)
set(REVISION "unknown")
set(VERSION_RELEASE 0)
endif()
# generate version.h
......
function(git_version version revision version_release)
set(${version} "" CACHE STRING "Latest Git Tag Version" FORCE)
set(${revision} "" CACHE STRING "Latest Git Tag Revision" FORCE)
set(${version_release} 0 CACHE STRING "Is this a versioned release without revision" FORCE)
find_package(Git)
if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
# get latest version from tag history
execute_process(COMMAND ${GIT_EXECUTABLE} tag --sort=-creatordate OUTPUT_VARIABLE sorted_tags OUTPUT_STRIP_TRAILING_WHITESPACE)
# convert to list (see: https://public.kitware.com/pipermail/cmake/2007-May/014222.html)
string(REGEX REPLACE ";" "\\\\;" sorted_tags "${sorted_tags}")
string(REGEX REPLACE "\n" ";" sorted_tags "${sorted_tags}")
foreach(tag ${sorted_tags})
if(tag MATCHES "^v?(([0-9]+\\.?)*[0-9]*)(-(.*))?$")
set(${version} "${CMAKE_MATCH_1}" CACHE STRING "Latest Git Tag Version" FORCE)
set(revision_str "${CMAKE_MATCH_4}")
break()
endif()
endforeach()
if(revision_str)
# don't need to read revision from tags
set(${revision} "${revision_str}" CACHE STRING "Latest Git Tag Revision" FORCE)
return()
endif()
# get the current revision
execute_process(COMMAND ${GIT_EXECUTABLE} tag "--format=%(align:width=20)%(refname:short)%(end)%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end)" --sort=-creatordate OUTPUT_VARIABLE sorted_tags_refs OUTPUT_STRIP_TRAILING_WHITESPACE)
# convert to list (see: https://public.kitware.com/pipermail/cmake/2007-May/014222.html)
string(REGEX REPLACE ";" "\\\\;" sorted_tags_refs "${sorted_tags_refs}")
string(REGEX REPLACE "\n" ";" sorted_tags_refs "${sorted_tags_refs}")
# get the newest tag
list(GET sorted_tags_refs 0 tag_ref)
string(REGEX REPLACE "^([^ ]+) +([^ ]+)$" "\\1" tag "${tag_ref}")
string(REGEX REPLACE "^([^ ]+) +([^ ]+)$" "\\2" ref "${tag_ref}")
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD OUTPUT_VARIABLE current_ref OUTPUT_STRIP_TRAILING_WHITESPACE)
if(tag MATCHES "^v?(([0-9]+\\.?)*[0-9]*)(-(.*))?$" AND ref STREQUAL current_ref)
set(revision_str "${CMAKE_MATCH_4}")
# version and no revision tagged for current commit
if(NOT revision_str)
set(${revision} "" CACHE STRING "Latest Git Tag Revision" FORCE)
set(${version_release} 1 CACHE STRING "Is this a versioned release without revision" FORCE)
else()
set(${revision} "${revision_str}" CACHE STRING "Latest Git Tag Revision" FORCE)
endif()
elseif(ref STREQUAL current_ref)
# revision name tagged
set(${revision} "${tag}" CACHE STRING "Latest Git Tag Revision" FORCE)
else()
# dev version, use short sha for ref
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD OUTPUT_VARIABLE short_sha OUTPUT_STRIP_TRAILING_WHITESPACE)
set(${revision} "${short_sha}" CACHE STRING "Latest Git Tag Revision" FORCE)
endif()
endif()
endfunction()
......@@ -18,13 +18,13 @@
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define VBA_NAME "VisualBoyAdvance-M"
#define VBA_CURRENT_VERSION "2.0.0"
#define VBA_CURRENT_VERSION "@VERSION@"
#define VBA_FEATURE_STRING ""
#define _STRINGIFY(N) #N
#if defined(PUBLIC_RELEASE)
#if @VERSION_RELEASE@
#define VBA_SUBVERSION_STRING ""
#else
#define VBA_SUBVERSION_STRING "-" "@REVISION@"
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment