From 3060d78e8fae064cbc1cbc66681fe3bbd6460d03 Mon Sep 17 00:00:00 2001
From: Dilawar Singh <dilawars@ncbs.res.in>
Date: Fri, 18 Nov 2016 09:47:01 +0530
Subject: [PATCH] Updated CMake and FindGSL.

---
 moose-core/CMakeLists.txt              |  16 +-
 moose-core/cmake_modules/FindGSL.cmake | 213 ++++++++++---------------
 2 files changed, 90 insertions(+), 139 deletions(-)

diff --git a/moose-core/CMakeLists.txt b/moose-core/CMakeLists.txt
index 1ffa3bf0..450a785e 100644
--- a/moose-core/CMakeLists.txt
+++ b/moose-core/CMakeLists.txt
@@ -218,7 +218,7 @@ endif(NOT HDF5_FOUND)
 if(HDF5_FOUND)
     add_definitions( -DUSE_HDF5 )
     include_directories( ${HDF5_INCLUDE_DIRS} )
-    foreach(HDF5_LIB ${HDF5_CXX_LIBRARIES} ${HDF5_HL_LIBRARIES} )
+    foreach(HDF5_LIB ${HDF5_LIBRARIES} )
         if(HDF5_LIB)
             get_filename_component( HDF5_LIB_EXT ${HDF5_LIB} EXT )
             if(HDF5_LIB_EXT)
@@ -269,14 +269,11 @@ if(WITH_BOOST)
     list(APPEND SYSTEM_SHARED_LIBS ${Boost_LIBRARIES})
 endif(WITH_BOOST)
 
-# These libraries could be static of dynamic.
-# When building packages on OBS or launchpad, we build static library of a
-# dependencies if a correct version is not found. 
-# Here we make sure that the correct static version is linked; if a correct
-# shared version is found then link the shared version in SYSTEM_SHARED_LIBS.
+# These libraries could be static of dynamic. We need to discrimate between
+# these two types because of --whole-archive option. See
+# BhallaLab/moose-core#66,
 if(WITH_GSL)
     message(STATUS "Using STATIC gsl libraries: ${GSL_LIBRARIES}")
-
     foreach(GSL_LIB ${GSL_LIBRARIES} )
         if(GSL_LIB)
             get_filename_component( GSL_LIB_EXT ${GSL_LIB} EXT )
@@ -351,6 +348,11 @@ list(APPEND MOOSE_LIBRARIES
     basecode
     )
 
+# Make sure to remove duplicates.
+list(REMOVE_DUPLICATES STATIC_LIBRARIES)
+if(SYSTEM_SHARED_LIBS)
+    list(REMOVE_DUPLICATES SYSTEM_SHARED_LIBS)
+endif( )
 
 # MAC linker does not understand many of gnu-ld options.
 message( STATUS "Shared libs: ${SYSTEM_SHARED_LIBS}")
diff --git a/moose-core/cmake_modules/FindGSL.cmake b/moose-core/cmake_modules/FindGSL.cmake
index b33139af..b08eded1 100644
--- a/moose-core/cmake_modules/FindGSL.cmake
+++ b/moose-core/cmake_modules/FindGSL.cmake
@@ -1,146 +1,95 @@
-## 
-## Try to find gnu scientific library GSL  
-## (see http://www.gnu.org/software/gsl/)
-## Once run this will define: 
-## 
-## GSL_FOUND       = system has GSL lib
-##
-## GSL_LIBRARIES   = full path to the libraries
-##    on Unix/Linux with additional linker flags from "gsl-config --libs"
-## 
-## CMAKE_GSL_CXX_FLAGS  = Unix compiler flags for GSL, essentially "`gsl-config --cxxflags`"
-##
-## GSL_INCLUDE_DIRS      = where to find headers 
-##
-## GSL_LINK_DIRECTORIES = link directories, useful for rpath on Unix
-## GSL_EXE_LINKER_FLAGS = rpath on Unix
-##
-## Felix Woelk 07/2004
-## minor corrections Jan Woetzel
-##
-## www.mip.informatik.uni-kiel.de
-## --------------------------------
-##
-
+# Try to find gnu scientific library GSL  
+# (see http://www.gnu.org/software/gsl/)
+# Once run this will define: 
+# 
+# GSL_FOUND       = system has GSL lib
+#
+# GSL_LIBRARIES   = full path to the libraries
+#    on Unix/Linux with additional linker flags from "gsl-config --libs"
+#
+# GSL_INCLUDE_DIRS      = where to find headers 
+# 
+# GSL_USE_STATIC_LIBRARIES = Set it ON if you want to search for static
+# libraries.
+#
+# Felix Woelk 07/2004
+# minor corrections Jan Woetzel
+#
+# www.mip.informatik.uni-kiel.de
+# --------------------------------
+#
+# Friday 18 November 2016 09:05:56 AM IST
+# MODIFICATIONS: ##   dilawars@ncbs.res.in, For the MOOSE project.
+#      This  version does not use gsl-config file.
+#
+
+# Set this envrionment variable to search in this path first.
 message( STATUS "GSL_ROOT_DIR value $ENV{GSL_ROOT_DIR}")
 
 IF(WIN32)
 
-  SET(GSL_MINGW_PREFIX "c:/msys/local" )
-  SET(GSL_MSVC_PREFIX "$ENV{LIB_DIR}")
-  FIND_LIBRARY(GSL_LIB gsl PATHS 
-    ${GSL_MINGW_PREFIX}/lib 
-    ${GSL_MSVC_PREFIX}/lib
-    )
-  #MSVC version of the lib is just called 'cblas'
-  FIND_LIBRARY(GSLCBLAS_LIB gslcblas cblas PATHS 
-    ${GSL_MINGW_PREFIX}/lib 
-    ${GSL_MSVC_PREFIX}/lib
-    )
-
-  FIND_PATH(GSL_INCLUDE_DIRS gsl/gsl_blas.h 
-    ${GSL_MINGW_PREFIX}/include 
-    ${GSL_MSVC_PREFIX}/include
-    )
+    SET(GSL_MINGW_PREFIX "c:/msys/local" )
+    SET(GSL_MSVC_PREFIX "$ENV{LIB_DIR}")
+    FIND_LIBRARY(GSL_LIB gsl PATHS 
+        ${GSL_MINGW_PREFIX}/lib 
+        ${GSL_MSVC_PREFIX}/lib
+        )
+    #MSVC version of the lib is just called 'cblas'
+    FIND_LIBRARY(GSLCBLAS_LIB gslcblas cblas PATHS 
+        ${GSL_MINGW_PREFIX}/lib 
+        ${GSL_MSVC_PREFIX}/lib
+        )
+
+    FIND_PATH(GSL_INCLUDE_DIRS gsl/gsl_blas.h 
+        ${GSL_MINGW_PREFIX}/include 
+        ${GSL_MSVC_PREFIX}/include
+        )
+
+    IF (GSL_LIB AND GSLCBLAS_LIB)
+        SET (GSL_LIBRARIES ${GSL_LIB} ${GSLCBLAS_LIB})
+    ENDIF (GSL_LIB AND GSLCBLAS_LIB)
 
-  IF (GSL_LIB AND GSLCBLAS_LIB)
-    SET (GSL_LIBRARIES ${GSL_LIB} ${GSLCBLAS_LIB})
-  ENDIF (GSL_LIB AND GSLCBLAS_LIB)
-  
 ELSE(WIN32)
-  IF(UNIX) 
-    SET(GSL_CONFIG_PREFER_PATH "$ENV{GSL_ROOT_DIR}/bin")
-    # GSL_CONFIG must be cleared. This script may be called again after installing
-    # the proper version of gsl
-    if(EXISTS "$ENV{GSL_ROOT_DIR}")
-	set(GSL_CONFIG "$ENV{GSL_ROOT_DIR}/bin/gsl-config")
-	MESSAGE(STATUS "gsl-config from environment variable: ${GSL_CONFIG}")
-	set(GSL_INCLUDE_DIRS)
-        set(GSL_LIBRARIES)
-        set(GSL_VERSION)
-        set(GSL_CONFIG_LIBS)
-    else()
-	FIND_PROGRAM(GSL_CONFIG gsl-config
-			${GSL_CONFIG_PREFER_PATH}
-			$ENV{LIB_DIR}/bin
-			/usr/local/bin/
-			/usr/bin/
-		    )
-    endif()
-    IF (GSL_CONFIG) 
-      # set CXXFLAGS to be fed into CXX_FLAGS by the user:
-      SET(GSL_CXX_FLAGS "`${GSL_CONFIG} --cflags`")
-      
-      # set INCLUDE_DIRS to prefix+include
-      EXEC_PROGRAM(${GSL_CONFIG}
-        ARGS --prefix
-        OUTPUT_VARIABLE GSL_PREFIX)
-      SET(GSL_INCLUDE_DIRS ${GSL_PREFIX}/include CACHE STRING INTERNAL)
-
-      # set link libraries and link flags
-      EXEC_PROGRAM(${GSL_CONFIG}
-          ARGS --libs
-          OUTPUT_VARIABLE GSL_LIBRARIES)
-      
-      ## extract link dirs for rpath  
-      EXEC_PROGRAM(${GSL_CONFIG}
-        ARGS --libs
-        OUTPUT_VARIABLE GSL_CONFIG_LIBS )
-
-     EXEC_PROGRAM(${GSL_CONFIG}
-         ARGS --version
-         OUTPUT_VARIABLE GSL_VERSION
-         )
-
-      ## split off the link dirs (for rpath)
-      ## use regular expression to match wildcard equivalent "-L*<endchar>"
-      ## with <endchar> is a space or a semicolon
-      STRING(REGEX MATCHALL "[-][L]([^ ;])+" 
-        GSL_LINK_DIRECTORIES_WITH_PREFIX 
-        "${GSL_CONFIG_LIBS}" )
-        #      MESSAGE("DBG  GSL_LINK_DIRECTORIES_WITH_PREFIX=${GSL_LINK_DIRECTORIES_WITH_PREFIX}")
 
-      ## remove prefix -L because we need the pure directory for LINK_DIRECTORIES
-      
-      IF (GSL_LINK_DIRECTORIES_WITH_PREFIX)
-        STRING(REGEX REPLACE "[-][L]" "" GSL_LINK_DIRECTORIES ${GSL_LINK_DIRECTORIES_WITH_PREFIX} )
-      ENDIF (GSL_LINK_DIRECTORIES_WITH_PREFIX)
-      SET(GSL_EXE_LINKER_FLAGS "-Wl,-rpath,${GSL_LINK_DIRECTORIES}" CACHE STRING INTERNAL)
-      #      MESSAGE("DBG  GSL_LINK_DIRECTORIES=${GSL_LINK_DIRECTORIES}")
-      #      MESSAGE("DBG  GSL_EXE_LINKER_FLAGS=${GSL_EXE_LINKER_FLAGS}")
+    IF(GSL_USE_STATIC_LIBRARIES)
+        SET(GSL_LIB_NAMES libgsl.a)
+        SET(GSL_CBLAS_LIB_NAMES libgslclabs.a)
+    ELSE(GSL_USE_STATIC_LIBRARIES)
+        SET(GSL_LIB_NAMES gsl)
+        SET(GSL_CBLAS_LIB_NAMES gslcblas)
+    ENDIF( )
+
+    FIND_LIBRARY(GSL_LIB 
+        NAMES ${GSL_LIB_NAMES} 
+        PATHS 
+            $ENV{GSL_ROOT_DIR}/lib $ENV{GSL_ROOT_DIR}/lib64
+            /opt/lib /opt/lib64
+        )
+
+    FIND_LIBRARY(GSLCBLAS_LIB 
+        NAMES ${GSL_CBLAS_LIB_NAMES}
+        PATHS 
+            $ENV{GSL_ROOT_DIR}/lib $ENV{GSL_ROOT_DIR}/lib64
+            /opt/lib /opt/lib64
+        )
+
+    FIND_PATH(GSL_INCLUDE_DIRS NAMES gsl/gsl_blas.h gsl/gsl.h
+        PATHS 
+            $ENV{GSL_ROOT_DIR}/include $ENV{GSL_ROOT_DIR}/include
+            /opt/include /opt/include
+        )
+
+    IF (GSL_LIB AND GSLCBLAS_LIB)
+        SET (GSL_LIBRARIES ${GSL_LIB} ${GSLCBLAS_LIB})
+    ENDIF (GSL_LIB AND GSLCBLAS_LIB)
 
-      #      ADD_DEFINITIONS("-DHAVE_GSL")
-      #      SET(GSL_DEFINITIONS "-DHAVE_GSL")
-      MARK_AS_ADVANCED(
-        GSL_CXX_FLAGS
-        GSL_INCLUDE_DIRS
-        GSL_LIBRARIES
-        GSL_LINK_DIRECTORIES
-        GSL_DEFINITIONS
-      )
-      
-    ELSE(GSL_CONFIG)
-
-      IF (GSL_FIND_REQUIRED)
-         MESSAGE(FATAL_ERROR "Could not find gsl-config. Please set it manually. GSL_CONFIG=${GSL_CONFIG}")
-      ELSE (GSL_FIND_REQUIRED)
-         MESSAGE(STATUS "Could not find GSL")
-         # TODO: Avoid cmake complaints if GSL is not found
-      ENDIF (GSL_FIND_REQUIRED)
-
-    ENDIF(GSL_CONFIG)
-
-  ENDIF(UNIX)
 ENDIF(WIN32)
 
 
 IF(GSL_LIBRARIES)
-  IF(GSL_INCLUDE_DIRS OR GSL_CXX_FLAGS)
-
-    SET(GSL_FOUND 1)
-    
-    MESSAGE(STATUS "Using GSL from ${GSL_PREFIX}")
-
-  ENDIF(GSL_INCLUDE_DIRS OR GSL_CXX_FLAGS)
+    IF(GSL_INCLUDE_DIRS OR GSL_CXX_FLAGS)
+        SET(GSL_FOUND 1)
+        MESSAGE(STATUS "Found GSL ${GSL_LIBRARIES}")
+    ENDIF(GSL_INCLUDE_DIRS OR GSL_CXX_FLAGS)
 ENDIF(GSL_LIBRARIES)
 
-- 
GitLab