From 0684b39e8e8a36a6537ee6ae0a073270b339910b Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Tue, 18 Dec 2018 00:11:07 +0100
Subject: [PATCH] Improve version numbering management

- allow to define version numbers such as a.b.c(-suffix), where the optional
  suffix parameter may be for instance rc2, beta3 or so...

- deduce the suffix-less release number (a.b.c) since cmake does not support
  release number suffixes...

- improve git-tag matching mechanism. One now searches for the nearest tag that
  matches 'v[0-9]*' and checks if it corresponds to the current release
  number. This allows to define annotate tags that are not related to version
  tags. The only constrain is that such tags must not match 'v[0-9]*'
---
 CMakeLists.txt                   | 23 ++++++++++++++++-------
 cmake/GetPastisGitRevision.cmake | 10 +++-------
 src/utils/CMakeLists.txt         |  2 +-
 src/utils/pastis_version.hpp.in  |  2 +-
 4 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 36532d154..3fe16ca68 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,8 +10,17 @@ include(CheckNotInSources)
 #----------------- Main configuration -----------------
 #------------------------------------------------------
 
-project (Pastis
-  VERSION 0.3.0)
+# custom variable allowing to define version suffixes such as -rc*, -beta*, ...
+set(PASTIS_VERSION "0.3.0")
+
+# deduce PASTIS_SHORT_VERSION using regex
+string(REGEX MATCH "^[0-9]+\.[0-9]+\.[0-9]+" PASTIS_SHORT_VERSION ${PASTIS_VERSION})
+if("${PASTIS_SHORT_VERSION}" STREQUAL "")
+  message(FATAL_ERROR "Unable to compute short version from PASTIS_VERSION=${PASTIS_VERSION}")
+endif()
+
+# set project version as PASTIS_SHORT_VERSION
+project (Pastis VERSION ${PASTIS_SHORT_VERSION})
 
 #------------------------------------------------------
 
@@ -24,23 +33,23 @@ set(PASTIS_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
 
 # Add new build types
 message("* Adding build types...")
-SET(CMAKE_CXX_FLAGS_COVERAGE
+set(CMAKE_CXX_FLAGS_COVERAGE
   "-g -Wall -O0 --coverage"
   CACHE STRING "Flags used by the C++ compiler during coverage builds."
   FORCE )
-SET(CMAKE_C_FLAGS_COVERAGE
+set(CMAKE_C_FLAGS_COVERAGE
   "-g -Wall -O0 --coverage"
   CACHE STRING "Flags used by the C compiler during coverage builds."
   FORCE )
-SET(CMAKE_EXE_LINKER_FLAGS_COVERAGE
+set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
   "--coverage"
   CACHE STRING "Flags used for linking binaries during coverage builds."
   FORCE )
-SET(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
+set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
   "--coverage"
   CACHE STRING "Flags used by the shared libraries linker during coverage builds."
   FORCE )
-MARK_AS_ADVANCED(
+mark_as_advanced(
   CMAKE_CXX_FLAGS_COVERAGE
   CMAKE_C_FLAGS_COVERAGE
   CMAKE_EXE_LINKER_FLAGS_COVERAGE
diff --git a/cmake/GetPastisGitRevision.cmake b/cmake/GetPastisGitRevision.cmake
index f3b6919e5..470ed7191 100644
--- a/cmake/GetPastisGitRevision.cmake
+++ b/cmake/GetPastisGitRevision.cmake
@@ -6,7 +6,7 @@ find_package(Git QUIET)
 
 if(GIT_FOUND)
   execute_process(
-    COMMAND "${GIT_EXECUTABLE}" describe "--abbrev=0"
+    COMMAND "${GIT_EXECUTABLE}" describe "--abbrev=0" "--match=v[0-9]*"
     WORKING_DIRECTORY "${PASTIS_SOURCE_DIR}"
     OUTPUT_VARIABLE PASTIS_GIT_TAG
     RESULT_VARIABLE FOUND_PASTIS_GIT_INFO
@@ -45,12 +45,10 @@ else()
   unset(HAS_PASTIS_GIT_INFO)
 endif()
 
-string(FIND "${PASTIS_GIT_TAG}" "${CMAKE_PASTIS_VERSION}" FOUND_VERSION_SUBSTR)
-
 if(FOUND_PASTIS_GIT_INFO EQUAL 0)
-  if("${FOUND_VERSION_SUBSTR}" STREQUAL "-1")
+  if(NOT("${PASTIS_GIT_TAG}" STREQUAL "v${PASTIS_VERSION}"))
     message("")
-    message ("######  CMake code version  ${CMAKE_PASTIS_VERSION} and")
+    message ("######  CMake code version  ${PASTIS_VERSION} and")
     message ("######  git revision info  ${PASTIS_GIT_TAG} do not match!")
     message("")
   endif()
@@ -65,5 +63,3 @@ endif()
 configure_file("${PASTIS_SOURCE_DIR}/src/utils/pastis_git_revision.hpp.in"
   "${CMAKE_CURRENT_BINARY_DIR}/pastis_git_revision"
   @ONLY)
-
-
diff --git a/src/utils/CMakeLists.txt b/src/utils/CMakeLists.txt
index 5152bf528..045c6d879 100644
--- a/src/utils/CMakeLists.txt
+++ b/src/utils/CMakeLists.txt
@@ -51,7 +51,7 @@ add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pastis_git_revision.hpp
 
 add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pastis_git_revision
   PRE_BUILD
-  COMMAND ${CMAKE_COMMAND} -DCMAKE_PASTIS_VERSION=${Pastis_VERSION} -DPASTIS_SOURCE_DIR=${PASTIS_SOURCE_DIR} -P ${PASTIS_SOURCE_DIR}/cmake/GetPastisGitRevision.cmake
+  COMMAND ${CMAKE_COMMAND} -DPASTIS_VERSION=${PASTIS_VERSION} -DPASTIS_SOURCE_DIR=${PASTIS_SOURCE_DIR} -P ${PASTIS_SOURCE_DIR}/cmake/GetPastisGitRevision.cmake
   COMMENT "Check pastis git status"
   VERBATIM
   )
diff --git a/src/utils/pastis_version.hpp.in b/src/utils/pastis_version.hpp.in
index 2d9bd8215..f07da441f 100644
--- a/src/utils/pastis_version.hpp.in
+++ b/src/utils/pastis_version.hpp.in
@@ -1,6 +1,6 @@
 #ifndef PASTIS_VERSION_HPP
 #define PASTIS_VERSION_HPP
 
-#define PASTIS_VERSION  "@Pastis_VERSION@"
+#define PASTIS_VERSION  "@PASTIS_VERSION@"
 
 #endif // PASTIS_VERSION_HPP
-- 
GitLab