From e8343fead1c4f2f9aa8be662be176271659509af Mon Sep 17 00:00:00 2001
From: acrovato <39187559+acrovato@users.noreply.github.com>
Date: Thu, 16 Apr 2020 12:05:28 +0200
Subject: [PATCH] Add Eigen version check to Cmake

---
 CMake/FindEIGEN.cmake   | 49 ++++++++++++++++++++++++++++++++++++++---
 CMake/msys2.cmake       |  1 -
 tbox/src/CMakeLists.txt |  2 +-
 3 files changed, 47 insertions(+), 5 deletions(-)

diff --git a/CMake/FindEIGEN.cmake b/CMake/FindEIGEN.cmake
index e6979b76..0b7e0ad6 100644
--- a/CMake/FindEIGEN.cmake
+++ b/CMake/FindEIGEN.cmake
@@ -12,11 +12,13 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# FindEIGEN.cmake - try to find Eigen headers
+# FindEIGEN.cmake - try to find Eigen 3 headers
+# The logic that checks the version comes from FindEigen3.cmake (source dir)
 # ----------------------------------------------------------------------------   
 # output:
 #    EIGEN_FOUND             : TRUE/FALSE
 #    EIGEN_INCLUDE_DIRS      : where the Eigen/*.h are              [cached]
+#    EIGEN_VERSION           : version number of Eigen
 # ----------------------------------------------------------------------------
 # autodetection:
 #    utiliser "CMAKE_PREFIX_PATH=c:\local"
@@ -24,12 +26,53 @@
 #          ou "INCLUDE=c:\local\include"
 # ----------------------------------------------------------------------------   
 
+# Check version (only for Eigen 3)
+macro(_eigen3_check_version)
+    file(READ "${EIGEN_INCLUDE_DIRS}/Eigen/src/Core/util/Macros.h" _eigen3_version_header)
+
+    string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}")
+    set(EIGEN_WORLD_VERSION "${CMAKE_MATCH_1}")
+    string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen3_major_version_match "${_eigen3_version_header}")
+    set(EIGEN_MAJOR_VERSION "${CMAKE_MATCH_1}")
+    string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen3_minor_version_match "${_eigen3_version_header}")
+    set(EIGEN_MINOR_VERSION "${CMAKE_MATCH_1}")
+
+    set(EIGEN_VERSION ${EIGEN_WORLD_VERSION}.${EIGEN_MAJOR_VERSION}.${EIGEN_MINOR_VERSION})
+
+    if(${EIGEN_VERSION} VERSION_LESS ${EIGEN_FIND_VERSION})
+        message(FATAL_ERROR "Eigen version ${EIGEN_VERSION} found in ${EIGEN_INCLUDE_DIRS}, but at least version ${EIGEN_FIND_VERSION} is required!")
+    endif()
+endmacro()
+
+# Set a dummy version if not provided
+if(NOT EIGEN_FIND_VERSION)
+    if(NOT EIGEN_FIND_VERSION_MAJOR)
+        set(EIGEN_FIND_VERSION_MAJOR 3)
+    endif()
+    if(NOT EIGEN_FIND_VERSION_MINOR)
+        set(EIGEN_FIND_VERSION_MINOR 3)
+    endif()
+    if(NOT EIGEN_FIND_VERSION_PATCH)
+        set(EIGEN_FIND_VERSION_PATCH 4)
+    endif()
+
+    set(EIGEN_FIND_VERSION "${EIGEN_FIND_VERSION_MAJOR}.${EIGEN_FIND_VERSION_MINOR}.${EIGEN_FIND_VERSION_PATCH}")
+endif()
+
+# Find the header and check the version
 find_path(EIGEN_INCLUDE_DIRS "Eigen/Dense" PATHS "/usr/include/eigen3")
+if (EIGEN_INCLUDE_DIRS)
+    _eigen3_check_version()
+else()
+    message(FATAL_ERROR "Eigen3 headers not found! Define the path in the INCLUDE environment variable.")
+endif()
 
 # handle the QUIETLY and REQUIRED arguments and set EIGEN_FOUND to TRUE
 # if all listed variables are TRUE
 include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(EIGEN DEFAULT_MSG 
-				                  EIGEN_INCLUDE_DIRS)
+find_package_handle_standard_args(EIGEN
+                                  FOUND_VAR EIGEN_FOUND
+				                  REQUIRED_VARS EIGEN_INCLUDE_DIRS
+                                  VERSION_VAR EIGEN_VERSION)
 
 #MESSAGE(STATUS "EIGEN_FOUND = ${EIGEN_FOUND}")
diff --git a/CMake/msys2.cmake b/CMake/msys2.cmake
index 14cdf5bd..41eabe84 100644
--- a/CMake/msys2.cmake
+++ b/CMake/msys2.cmake
@@ -17,4 +17,3 @@
 SET(CMAKE_GENERATOR "MSYS Makefiles" CACHE INTERNAL "" FORCE)
 SET(WAVES_USE_MKL    OFF CACHE BOOL "" FORCE)
 SET(WAVES_USE_MUMPS  OFF CACHE BOOL "" FORCE)
-INCLUDE(disable-trilinos)
diff --git a/tbox/src/CMakeLists.txt b/tbox/src/CMakeLists.txt
index 53500082..897d3b58 100644
--- a/tbox/src/CMakeLists.txt
+++ b/tbox/src/CMakeLists.txt
@@ -69,7 +69,7 @@ ELSE()
 ENDIF()
 
 # -- Eigen --
-FIND_PACKAGE(EIGEN REQUIRED)
+FIND_PACKAGE(EIGEN 3.3.4 REQUIRED)
 TARGET_INCLUDE_DIRECTORIES(tbox PUBLIC ${EIGEN_INCLUDE_DIRS} ${LAPACK_INCLUDE_DIRS})
 TARGET_COMPILE_DEFINITIONS(tbox PUBLIC EIGEN_DONT_PARALLELIZE)
 IF(FOUND_MKL)
-- 
GitLab