From 282b3a71c977e3b950d3b9a6e3bb1da1d8585973 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Tue, 1 May 2018 20:06:31 +0200
Subject: [PATCH] Improved configuration

- checks for OpenMP before setting it as default value for Kokkos
- checks g++ (>7) or clang++ (>5)
- added a few warning to clang++
---
 CMakeLists.txt | 58 +++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 43 insertions(+), 15 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index c77371565..e3f79152a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -13,36 +13,65 @@ include(CheckNotInSources)
 project (Pastis
   VERSION 0.0.4)
 
+#------------------------------------------------------
+
 set(PASTIS_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
 set(PASTIS_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}")
 
+# Default build type is RelWIthDebInfo
+if(NOT CMAKE_BUILD_TYPE)
+  set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
+      "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
+      FORCE)
+endif(NOT CMAKE_BUILD_TYPE)
+
+#------------------------------------------------------
+
+# Checks if compiler version is compatible with Pastis sources
+set(GNU_CXX_MIN_VERSION "7.0.0")
+set(CLANG_CXX_MIN_VERSION "5.0.0")
+
+# Pastis default compiler flags
+set(PASTIS_CXX_FLAGS "${PASTIS_CXX_FLAGS} -Wall")
+
+if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "${GNU_CXX_MIN_VERSION}")
+    message(FATAL_ERROR "Pastis build requires at least g++-${GNU_CXX_MIN_VERSION}")
+  endif()
+elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+  if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "${CLANG_CXX_MIN_VERSION}")
+    message(FATAL_ERROR "Pastis build requires at least llvm/clang ++-${CLANG_CXX_MIN_VERSION}")
+  endif()
+  set(PASTIS_CXX_FLAGS "${PASTIS_CXX_FLAGS} -Wsign-compare -Wunused -Wunused-member-function -Wunused-private-field")
+endif()
+
+
 #------------------------------------------------------
 
-# Kokkos
-set(KOKKOS_ENABLE_OPENMP ON CACHE BOOL "")
+# setting Kokkos defaults to OpenMP when available
+include(FindOpenMP)
+if(${OPENMP_FOUND})
+  set(KOKKOS_ENABLE_OPENMP ON CACHE BOOL "")
+endif()
 
+# sets Kokkos debug flags when non release build
 if (CMAKE_BUILD_TYPE MATCHES "Release")
   set (KOKKOS_ENABLE_DEBUG OFF)
 else()
   set (KOKKOS_ENABLE_DEBUG ON)
 endif()
 
-
-# Pastis default compiler flags
-set(PASTIS_CXX_FLAGS "-Wall")
-
-#set(CMAKE_CXX_STANDARD "17")
+# C++ 17 flags
+if(${CMAKE_VERSION} VERSION_LESS "3.8.0")
+  message(WARNING "Please consider to switch to CMake >= 3.8")
+  set(PASTIS_CXX_FLAGS "${PASTIS_CXX_FLAGS}  -std=gnu++1z")
+else()
+  set(CMAKE_CXX_STANDARD "17")
+endif()
 
 add_subdirectory(${PASTIS_SOURCE_DIR}/packages/kokkos)
 include_directories(${Kokkos_INCLUDE_DIRS_RET})
 
-# Default build type is RelWIthDebInfo
-if(NOT CMAKE_BUILD_TYPE)
-  set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
-      "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
-      FORCE)
-endif(NOT CMAKE_BUILD_TYPE)
-
 # Kokkso compiler flags
 include(GetKokkosCompilerFlags)
 
@@ -89,4 +118,3 @@ target_link_libraries(
   PastisUtils
   PastisMesh
   PastisExperimental)
-
-- 
GitLab