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