| # 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 (${_version_strs0}) |
| 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) |