From 5d2862f5139c68007f3fcf041a2a59347784bea7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Thu, 22 Mar 2018 00:09:10 +0100
Subject: [PATCH] Version in CMakeLists.txt

- added pastis version
- compilation checks compatibility of version and git revision info
- separates git info and version info for git-less compilation
---
 CMakeLists.txt                   | 10 +++++++---
 cmake/GetPastisGitRevision.cmake | 32 +++++++++++++++++++++-----------
 main.cpp                         | 13 ++++++++-----
 utils/CMakeLists.txt             | 14 ++++++++++++--
 utils/RevisionInfo.cpp           | 14 ++++++++++----
 utils/RevisionInfo.hpp           |  7 ++++---
 utils/pastis_git_revision.hpp.in | 10 +++++-----
 utils/pastis_version.hpp.in      |  6 ++++++
 8 files changed, 73 insertions(+), 33 deletions(-)
 create mode 100644 utils/pastis_version.hpp.in

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 77b791c43..d0d79e1cd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,13 +10,16 @@ include(CheckNotInSources)
 #----------------- Main configuration -----------------
 #------------------------------------------------------
 
-project (Pastis)
+project (Pastis
+  VERSION 0.0.2)
+
+set(PASTIS_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
 
 # Rang (colors? Useless thus necessary!)
-include_directories(${CMAKE_SOURCE_DIR}/packages/rang/include)
+include_directories(${PASTIS_SOURCE_DIR}/packages/rang/include)
 
 # CLI11
-include_directories(${CMAKE_SOURCE_DIR}/packages/CLI11/include)
+include_directories(${PASTIS_SOURCE_DIR}/packages/CLI11/include)
 
 # Kokkos
 add_subdirectory(${CMAKE_SOURCE_DIR}/packages/kokkos)
@@ -41,3 +44,4 @@ target_link_libraries(
   pastis
   kokkos
   PastisUtils)
+
diff --git a/cmake/GetPastisGitRevision.cmake b/cmake/GetPastisGitRevision.cmake
index c18a046df..6fe87b3eb 100644
--- a/cmake/GetPastisGitRevision.cmake
+++ b/cmake/GetPastisGitRevision.cmake
@@ -1,20 +1,30 @@
 # --------------- get git revision info ---------------
 
-# quite hugly but seems necessary
-set(CMAKE_CURRENT_SOURCE_DIR ${INVOCATION_DIR})
-
-list(APPEND CMAKE_MODULE_PATH "${INVOCATION_DIR}/../cmake/cmake-modules")
+list(APPEND CMAKE_MODULE_PATH "${PASTIS_SOURCE_DIR}/cmake/cmake-modules")
 include(GetGitRevisionDescription)
 
-git_describe(PASTIS_VERSION "--abbrev=0")
-get_git_head_revision(PASTIS_HEAD PASTIS_HASH)
-git_local_changes(PASTIS_HAS_LOCAL_CHANGES)
+git_describe(PASTIS_GIT_TAG "--abbrev=0")
+get_git_head_revision(PASTIS_GIT_HEAD PASTIS_GIT_HASH)
+git_local_changes(PASTIS_GIT_HAS_LOCAL_CHANGES)
 
-if(${PASTIS_HAS_LOCAL_CHANGES} STREQUAL "CLEAN")
-  set(PASTIS_IS_CLEAN true)
+if(${PASTIS_GIT_HAS_LOCAL_CHANGES} STREQUAL "CLEAN")
+  set(PASTIS_GIT_IS_CLEAN true)
 else()
-  set(PASTIS_IS_CLEAN false)
+  set(PASTIS_GIT_IS_CLEAN false)
+endif()
+
+string(FIND "${PASTIS_GIT_TAG}" "${CMAKE_PASTIS_VERSION}" FOUND_VERSION_SUBSTR)
+
+if("${FOUND_VERSION_SUBSTR}" STREQUAL "-1")
+  message("")
+  message ("######  CMake code version  ${CMAKE_PASTIS_VERSION} and")
+  message ("######  git revision info  ${PASTIS_GIT_TAG} do not match!")
+  message("")
 endif()
 
 # Generates revision header file candidate
-configure_file("${CMAKE_CURRENT_SOURCE_DIR}/pastis_git_revision.hpp.in" "${CMAKE_CURRENT_BINARY_DIR}/pastis_git_revision" @ONLY)
+configure_file("${PASTIS_SOURCE_DIR}/utils/pastis_git_revision.hpp.in"
+  "${CMAKE_CURRENT_BINARY_DIR}/pastis_git_revision"
+  @ONLY)
+
+
diff --git a/main.cpp b/main.cpp
index ed30eade2..13ef49deb 100644
--- a/main.cpp
+++ b/main.cpp
@@ -14,17 +14,20 @@ int main(int argc, char *argv[])
 
   CLI11_PARSE(app, argc, argv);
 
+  std::cout << "Code version: "
+	    << rang::style::bold << RevisionInfo::version() << rang::style::reset << '\n';
+
   std::cout << "-------------------- "
 	    << rang::fg::green
 	    << "git info"
 	    << rang::fg::reset
 	    <<" -------------------------"
 	    << '\n';
-  std::cout << "version: " << rang::fg::reset
-	    << rang::style::bold << RevisionInfo::version() << rang::style::reset << '\n';
-  std::cout << "HEAD: " << rang::style::bold << RevisionInfo::head() << rang::style::reset << '\n';
-  std::cout << "hash: " << rang::style::bold << RevisionInfo::hash() << rang::style::reset << "  (";
-  if (RevisionInfo::isClean()) {
+  std::cout << "tag:  " << rang::fg::reset
+	    << rang::style::bold << RevisionInfo::gitTag() << rang::style::reset << '\n';
+  std::cout << "HEAD: " << rang::style::bold << RevisionInfo::gitHead() << rang::style::reset << '\n';
+  std::cout << "hash: " << rang::style::bold << RevisionInfo::gitHash() << rang::style::reset << "  (";
+  if (RevisionInfo::gitIsClean()) {
     std::cout << rang::fgB::green << "clean" << rang::fg::reset;
   } else {
     std::cout << rang::fgB::red << "dirty" << rang::fg::reset; 
diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt
index 0d341f975..22b66dac7 100644
--- a/utils/CMakeLists.txt
+++ b/utils/CMakeLists.txt
@@ -44,15 +44,24 @@ 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} -DINVOCATION_DIR=${CMAKE_CURRENT_SOURCE_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/../cmake/GetPastisGitRevision.cmake
+  COMMAND ${CMAKE_COMMAND} -DCMAKE_PASTIS_VERSION=${Pastis_VERSION} -DPASTIS_SOURCE_DIR=${PASTIS_SOURCE_DIR} -P ${PASTIS_SOURCE_DIR}/cmake/GetPastisGitRevision.cmake
   COMMENT "Check pastis git status"
   VERBATIM
   )
 
+# --------- check git revision info at build ----------
+
+configure_file("${PASTIS_SOURCE_DIR}/utils/pastis_version.hpp.in"
+  "${CMAKE_CURRENT_BINARY_DIR}/pastis_version.hpp"
+  @ONLY)
+
+
 list(
   APPEND
   SOURCES
-  ${CMAKE_CURRENT_BINARY_DIR}/pastis_git_revision.hpp)
+  ${CMAKE_CURRENT_BINARY_DIR}/pastis_git_revision.hpp
+  ${CMAKE_CURRENT_BINARY_DIR}/pastis_version.hpp
+  )
 
 include_directories(${CMAKE_CURRENT_BINARY_DIR})
 
@@ -60,3 +69,4 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR})
 add_dependencies(
   PastisUtils
   PastisGitRevison)
+
diff --git a/utils/RevisionInfo.cpp b/utils/RevisionInfo.cpp
index f9ce466f1..fd1bbc59f 100644
--- a/utils/RevisionInfo.cpp
+++ b/utils/RevisionInfo.cpp
@@ -1,22 +1,28 @@
 #include <RevisionInfo.hpp>
 #include <pastis_git_revision.hpp>
+#include <pastis_version.hpp>
 
 std::string RevisionInfo::version()
 {
-  return PASTIS_GIT_VERSION;
+  return PASTIS_VERSION;
 }
 
-std::string RevisionInfo::head()
+std::string RevisionInfo::gitTag()
+{
+  return PASTIS_GIT_TAG;
+}
+
+std::string RevisionInfo::gitHead()
 {
   return PASTIS_GIT_HEAD;
 }
 
-std::string RevisionInfo::hash()
+std::string RevisionInfo::gitHash()
 {
   return PASTIS_GIT_HASH;
 }
 
-bool RevisionInfo::isClean()
+bool RevisionInfo::gitIsClean()
 {
   return PASTIS_GIT_IS_CLEAN;
 }
diff --git a/utils/RevisionInfo.hpp b/utils/RevisionInfo.hpp
index 4f1fee3b0..b0d547bd6 100644
--- a/utils/RevisionInfo.hpp
+++ b/utils/RevisionInfo.hpp
@@ -6,9 +6,10 @@
 struct RevisionInfo
 {
   static std::string version();
-  static std::string head();
-  static std::string hash();
-  static bool isClean();
+  static std::string gitTag();
+  static std::string gitHead();
+  static std::string gitHash();
+  static bool gitIsClean();
 };
 
 #endif // REVISION_INFO_HPP
diff --git a/utils/pastis_git_revision.hpp.in b/utils/pastis_git_revision.hpp.in
index 2d4c4523a..fe0b3e6df 100644
--- a/utils/pastis_git_revision.hpp.in
+++ b/utils/pastis_git_revision.hpp.in
@@ -1,10 +1,10 @@
 #ifndef PASTIS_GIT_REVISION_HPP
 #define PASTIS_GIT_REVISION_HPP
 
-#define PASTIS_GIT_VERSION "@PASTIS_VERSION@"
-#define PASTIS_GIT_HEAD "@PASTIS_HEAD@"
-#define PASTIS_GIT_HASH "@PASTIS_HASH@"
-#define PASTIS_GIT_HAS_LOCAL_CHANGES "@PASTIS_HAS_LOCAL_CHANGES@"
-#define PASTIS_GIT_IS_CLEAN @PASTIS_IS_CLEAN@
+#define PASTIS_GIT_TAG  "@PASTIS_GIT_TAG@"
+#define PASTIS_GIT_HEAD "@PASTIS_GIT_HEAD@"
+#define PASTIS_GIT_HASH "@PASTIS_GIT_HASH@"
+#define PASTIS_GIT_HAS_LOCAL_CHANGES "@PASTIS_GIT_HAS_LOCAL_CHANGES@"
+#define PASTIS_GIT_IS_CLEAN @PASTIS_GIT_IS_CLEAN@
 
 #endif // PASTIS_GIT_REVISION_HPP
diff --git a/utils/pastis_version.hpp.in b/utils/pastis_version.hpp.in
new file mode 100644
index 000000000..2d9bd8215
--- /dev/null
+++ b/utils/pastis_version.hpp.in
@@ -0,0 +1,6 @@
+#ifndef PASTIS_VERSION_HPP
+#define PASTIS_VERSION_HPP
+
+#define PASTIS_VERSION  "@Pastis_VERSION@"
+
+#endif // PASTIS_VERSION_HPP
-- 
GitLab