blob: f10ce33c4301c39ac05590e66073ca0ba2b5c296 [file] [log] [blame]
# Redistribution and use is allowed according to the terms of the BSD license.
#
# Copyright (c) 2011 Peter Johnson
macro (VERSION_GEN _version _version_file _default_version)
set (_vn "v${_default_version}")
# First see if there is a version file (included in release tarballs),
# then try git-describe, then default.
if (EXISTS "${CMAKE_SOURCE_DIR}/version")
file (STRINGS "${CMAKE_SOURCE_DIR}/version" _version_strs LIMIT_COUNT 1)
list (GET _version_strs 0 _version_strs0)
if (NOT (${_version_strs0} STREQUAL ""))
set (_vn "v${_version_strs0}")
endif (NOT (${_version_strs0} STREQUAL ""))
elseif (EXISTS "${CMAKE_SOURCE_DIR}/.git")
execute_process (COMMAND git describe --match "v[0-9]*" --abbrev=4 HEAD
RESULT_VARIABLE _git_result
OUTPUT_VARIABLE _git_vn
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if (_git_result EQUAL 0)
# Special handling until we get a more recent tag on the master
# branch
if (_git_vn MATCHES "^v0[.]1[.]0")
execute_process (COMMAND git merge-base v${_default_version} HEAD
OUTPUT_VARIABLE _merge_base
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
#message (STATUS "Merge base: ${_merge_base}")
execute_process (COMMAND git rev-list ${_merge_base}..HEAD
OUTPUT_VARIABLE _rev_list
ERROR_QUIET)
string (REGEX MATCHALL "[^\n]*\n" _rev_list_lines "${_rev_list}")
#message (STATUS "Rev list: ${_rev_list_lines}")
list (LENGTH _rev_list_lines _vn1)
execute_process (COMMAND git rev-list --max-count=1 --abbrev-commit --abbrev=4 HEAD
OUTPUT_VARIABLE _vn2
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
set (_git_vn "v${_default_version}-${_vn1}-g${_vn2}")
endif (_git_vn MATCHES "^v0[.]1[.]0")
# Append -dirty if there are local changes
execute_process (COMMAND git update-index -q --refresh)
execute_process (COMMAND git diff-index --name-only HEAD --
OUTPUT_VARIABLE _git_vn_dirty)
if (_git_vn_dirty)
set (_git_vn "${_git_vn}-dirty")
endif (_git_vn_dirty)
# Substitute . for - in the result
string (REPLACE "-" "." _vn "${_git_vn}")
endif (_git_result EQUAL 0)
endif (EXISTS "${CMAKE_SOURCE_DIR}/version")
# Strip leading "v" from version
#message (STATUS "_vn: ${_vn}")
string (REGEX REPLACE "^v*(.+)" "\\1" _vn "${_vn}")
# Update version file if required
if (EXISTS ${_version_file})
file (STRINGS ${_version_file} _version_strs LIMIT_COUNT 1)
list (GET _version_strs 0 _vc)
else (EXISTS ${_version_file})
set (_vc "unset")
endif (EXISTS ${_version_file})
if (NOT ("${_vn}" STREQUAL "${_vc}"))
file (WRITE ${_version_file} "${_vn}")
endif (NOT ("${_vn}" STREQUAL "${_vc}"))
# Set output version variable
set (${_version} ${_vn})
endmacro (VERSION_GEN)