Skip to content
Snippets Groups Projects
Commit 2f846882 authored by Tobias Malkmus's avatar Tobias Malkmus Committed by Christoph Grüninger
Browse files

[cmake] add SuiteSparse support, replace UMFPACK version

This patch adds the cmake findpackage script which locates Tim Davis' SuiteSparsae collection.

If a certain setting of the SuiteSparse library should be used it can be found using
find_package( SuiteSparse COMPONENETS <list-of-components> )
with a specific list of components.
Existence of components can be check using the SUITESPARSE_<comp>_FOUND/HAVE_SUITESPARSE_<comp> cmake variable.

The UMFPack search routines are redirected to the more general FindSuiteSparse script.
parent 0fbb7212
No related branches found
No related tags found
1 merge request!8Feature/fs1702 cmake add suitesparse support rebased
# module providing convenience methods for compiling
# binaries with SuiteSparse support
#
# Provides the following functions:
#
# add_dune_suitsparse_flags(target1 target2...)
#
# adds SuiteSparse flags to the targets for compilation and linking
function(add_dune_suitesparse_flags _targets)
if(SUITESPARSE_FOUND)
foreach(_target ${_targets})
target_link_libraries(${_target} ${SUITESPARSE_DUNE_LIBRARIES})
get_target_property(_props ${_target} COMPILE_FLAGS)
string(REPLACE "_props-NOTFOUND" "" _props "${_props}")
set_target_properties(${_target} PROPERTIES COMPILE_FLAGS
"${_props} ${SUITESPARSE_DUNE_COMPILE_FLAGS}")
endforeach(_target ${_targets})
endif(SUITESPARSE_FOUND)
endfunction(add_dune_suitesparse_flags)
......@@ -3,6 +3,7 @@ install(FILES
AddMETISFlags.cmake
AddParMETISFlags.cmake
AddPTScotchFlags.cmake
AddSuiteSparseFlags.cmake
AddUMFPackFlags.cmake
CheckCXXFeatures.cmake
CheckForPthreads.c
......@@ -27,6 +28,7 @@ install(FILES
FindParMETIS.cmake
FindPTScotch.cmake
FindSphinx.cmake
FindSuiteSparse.cmake
FindThreadsCMake31.cmake
FindUMFPack.cmake
Headercheck.cmake
......
# Module that checks whether SuiteSparse is available.
#
# Synopsis:
# find_package( SuiteSparse COMPONENTS < list-of-components > )
#
# Components are:
# amd, btf, camd, ccolamd, cholmod, colamd, cxsparse,
# klu, ldl, RBio, spqr, umfpack
#
# Variables used by this module which you may want to set:
# SUITESPARSE_ROOT Path list to search for SuiteSparse
#
# Sets the following variables
#
# SUITESPARSE_FOUND True if SuiteSparse was found and usable in the desired setting
# SUITESPARSE_INCLUDE_DIRS Path to the SuiteSparse include dirs
# SUITESPARSE_LIBRARIES Name of the SuiteSparse libraries
# SUITESPARSE_<COMP>_FOUND True if <COMP> was found as part of SuiteSparse
#
find_package(BLAS QUIET REQUIRED)
if(NOT BLAS_FOUND)
message(WARNING "SuiteSparse requires BLAS which was not found, skipping the test.")
return()
endif()
# look for desired componenents
set( SUITESPARSE_COMPONENTS ${SuiteSparse_FIND_COMPONENTS} )
# resolve inter comp. dependencies
list( FIND SUITESPARSE_COMPONENTS "umfpack" WILL_USE_UMFPACK )
if( NOT WILL_USE_UMFPACK EQUAL -1 )
list( APPEND SUITESPARSE_COMPONENTS amd cholmod )
endif()
list( FIND SUITESPARSE_COMPONENTS "cholmod" WILL_USE_CHOLMOD )
if( NOT WILL_USE_CHOLMOD EQUAL -1 )
list( APPEND SUITESPARSE_COMPONENTS amd camd colamd ccolamd )
endif()
if( SUITESPARSE_COMPONENTS )
list( REMOVE_DUPLICATES SUITESPARSE_COMPONENTS )
endif()
set( ready TRUE )
foreach( modname ${SUITESPARSE_COMPONENTS} )
dune_module_to_uppercase( MODNAME ${modname} )
if( NOT SUITESPARSE_${MODNAME}_FOUND )
set( ready FALSE )
endif()
endforeach()
if( ready )
return ()
endif()
# find SuiteSparse config:
# look for library at positions given by the user
find_library( SUITESPARSE_CONFIG_LIB
NAMES "suitesparseconfig"
PATHS ${SUITESPARSE_ROOT}
PATH_SUFFIXES "lib" "lib32" "lib64" "Lib"
NO_DEFAULT_PATH
)
#now also include the deafult paths
find_library( SUITESPARSE_CONFIG_LIB
NAMES "suitesparseconfig"
PATH_SUFFIXES "lib" "lib32" "lib64" "Lib"
)
#look for header files at positions given by the user
find_path( SUITESPARSE_INCLUDE_DIR
NAMES "SuiteSparse_config.h"
PATHS ${SUITESPARSE_ROOT}
PATH_SUFFIXES "SuiteSparse_config" "SuiteSparse_config/include" "suitesparse" "include" "src" "SuiteSparse_config/Include"
NO_DEFAULT_PATH
)
#now also look for default paths
find_path( SUITESPARSE_INCLUDE_DIR
NAMES "SuiteSparse_config.h"
PATHS ${SUITESPARSE_ROOT}
PATH_SUFFIXES "SuiteSparse_config" "SuiteSparse_config/include" "suitesparse" "include" "src" "SuiteSparse_config/Include"
)
foreach( modname ${SUITESPARSE_COMPONENTS} )
dune_module_to_uppercase( MODNAME ${modname} )
#look for library at positions given by the user
find_library( ${MODNAME}_LIBRARY
NAMES "${modname}"
PATHS ${SUITESPARSE_ROOT}
PATH_SUFFIXES "lib" "lib32" "lib64" "${MODNAME}" "${MODNAME}/Lib"
NO_DEFAULT_PATH
)
#now also include the deafult paths
find_library( ${MODNAME}_LIBRARY
NAMES "${modname}"
PATH_SUFFIXES "lib" "lib32" "lib64" "${MODNAME}" "${MODNAME}/Lib"
)
#look for header files at positions given by the user
find_path(${MODNAME}_INCLUDE_DIR
NAMES "${modname}.h"
PATHS ${SUITESPARSE_ROOT}
PATH_SUFFIXES "${modname}" "include/${modname}" "suitesparse" "include" "src" "${MODNAME}" "${MODNAME}/Include"
NO_DEFAULT_PATH
)
#now also look for default paths
find_path(${MODNAME}_INCLUDE_DIR
NAMES "${modname}.h"
PATH_SUFFIXES "${modname}" "include/${modname}" "suitesparse" "include" "${MODNAME}" "${MODNAME}/Include"
)
endforeach()
# resolve inter-modular dependencies
# CHOLMOD requires AMD, COLAMD; CAMD and CCOLAMD is optional
if( CHOLMOD_LIBRARY )
if( NOT AMD_LIBRARY )
if( NOT COLAMD_LIBRARY )
message(WARNING "CHOLMOD requires AMD and COLAMD which was not found, skipping the test.")
return()
endif()
endif()
list( APPEND CHOLMOD_LIBRARY ${AMD_LIBRARY} ${COLAMD_LIBRARY} )
if( CAMD_LIBRARY )
list( APPEND CHOLMOD_LIBRARY ${CAMD_LIBRARY} )
endif()
if( CCOLAMD_LIBRARY )
list( APPEND CHOLMOD_LIBRARY ${CCOLAMD_LIBRARY} )
endif()
list( REVERSE CHOLMOD_LIBRARY )
# remove duplicates
list( REMOVE_DUPLICATES CHOLMOD_LIBRARY )
list( REVERSE CHOLMOD_LIBRARY )
endif()
# UMFPack requires AMD, can depend on CHOLMOD
if( UMFPACK_LIBRARY )
# check wether cholmod was found
if( CHOLMOD_LIBRARY )
list( APPEND UMFPACK_LIBRARY ${CHOLMOD_LIBRARY} )
else()
list( APPEND UMFPACK_LIBRARY ${AMD_LIBRARY} )
endif()
list( REVERSE UMFPACK_LIBRARY )
# remove duplicates
list( REMOVE_DUPLICATES UMFPACK_LIBRARY )
list( REVERSE UMFPACK_LIBRARY )
endif()
set( SUITESPARSE_FOUND TRUE )
# check wether everything was found
foreach( modname ${SUITESPARSE_COMPONENTS} )
dune_module_to_uppercase( MODNAME ${modname} )
set( SUITESPARSE_${MODNAME}_FOUND TRUE )
if( ${MODNAME}_LIBRARY AND ${MODNAME}_INCLUDE_DIR )
list( APPEND SUITESPARSE_INCLUDE_DIR "${${MODNAME}_INCLUDE_DIR}" )
list( APPEND SUITESPARSE_LIBRARY "${${MODNAME}_LIBRARY}" )
else()
set( SUITESPARSE_FOUND FALSE )
endif()
set( HAVE_SUITESPARSE_${MODNAME} 1 )
mark_as_advanced( HAVE_SUITESPARSE_${MODNAME} )
mark_as_advanced( SUITESPARSE_${MODNAME}_FOUND )
endforeach()
list( APPEND SUITESPARSE_LIBRARY ${SUITESPARSE_CONFIG_LIB} )
# make them unique
if( SUITESPARSE_INCLUDE_DIR )
list( REMOVE_DUPLICATES SUITESPARSE_INCLUDE_DIR )
endif()
if( SUITESPARSE_LIBRARY )
list( REVERSE SUITESPARSE_LIBRARY )
list( REMOVE_DUPLICATES SUITESPARSE_LIBRARY )
list( REVERSE SUITESPARSE_LIBRARY )
endif()
# behave like a CMake module is supposed to behave
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(
"SuiteSparse"
DEFAULT_MSG
SUITESPARSE_INCLUDE_DIR
SUITESPARSE_LIBRARY
)
mark_as_advanced(SUITESPARSE_INCLUDE_DIR SUITESPARSE_LIBRARY)
# if both headers and library are found, store results
if(SUITESPARSE_FOUND)
set(SUITESPARSE_LIBRARIES ${SUITESPARSE_LIBRARY} )
set(SUITESPARSE_INCLUDE_DIRS ${SUITESPARSE_INCLUDE_DIR} )
# log result
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"Determining location of SuiteSparse succeded:\n"
"Include directory: ${SUITESPARSE_INCLUDE_DIRS}\n"
"Library directory: ${SUITESPARSE_LIBRARIES}\n\n")
set( SUITESPARSE_COMPILER_FLAGS )
foreach(dir ${SUITESPARSE_INCLUDE_DIRS})
set( SUITESPARSE_COMPILER_FLAGS "${SUITESPARSE_COMPILER_FLAGS} -I${dir}/" )
endforeach()
set(SUITESPARSE_DUNE_COMPILE_FLAGS ${SUITESPARSE_COMPILER_FLAGS}
CACHE STRING "Compile Flags used by DUNE when compiling with SuiteSparse programs")
set(SUITESPARSE_DUNE_LIBRARIES ${BLAS_LIBRARIES} ${SUITESPARSE_LIBRARIES}
CACHE STRING "Libraries used by DUNE when linking SuiteSparse programs")
else(SUITESPARSE_FOUND)
# log errornous result
file(APPEND ${CMAKE_BINARY_DIR}${CMAKES_FILES_DIRECTORY}/CMakeError.log
"Determing location of SuiteSparse failed:\n"
"Include directory: ${SUITESPARSE_INCLUDE_DIRS}\n"
"Library directory: ${SUITESPARSE_LIBRARIES}\n\n")
endif(SUITESPARSE_FOUND)
#set HAVE_SUITESPARSE for config.h
set(HAVE_SUITESPARSE ${SUITESPARSE_FOUND})
# register all SuiteSparse related flags
if(SUITESPARSE_FOUND)
dune_register_package_flags(
LIBRARIES "${SUITESPARSE_LIBRARIES}"
INCLUDE_DIRS "${SUITESPARSE_INCLUDE_DIRS}")
endif()
......@@ -26,54 +26,15 @@
# system paths.
#
find_package(BLAS QUIET REQUIRED)
if(NOT BLAS_FOUND)
message(WARNING "UMFPack requires BLAS which was not found, skipping the test.")
return()
endif()
find_library(AMD_LIBRARY
NAMES "amd"
PATHS ${UMFPACK_ROOT}
PATH_SUFFIXES "lib" "lib32" "lib64" "AMD" "AMD/Lib"
NO_DEFAULT_PATH
)
find_library(AMD_LIBRARY
NAMES "amd"
PATH_SUFFIXES "lib" "lib32" "lib64" "AMD" "AMD/Lib"
)
include( FindSuiteSparse )
find_package( SuiteSparse COMPONENTS umfpack )
if(NOT AMD_LIBRARY)
message(WARNING "UMFPack requires AMD (approximate minimum degree ordering) which was not found, skipping the test.")
return()
if( SUITESPARSE_FOUND )
set( UMFPACK_FOUND TRUE )
set( UMFPACK_INCLUDE_DIR ${SUITESPARSE_INCLUDE_DIR} )
set( UMFPACK_LIBRARY ${SUITESPARSE_LIBRARY} )
endif()
#look for header files at positions given by the user
find_path(UMFPACK_INCLUDE_DIR
NAMES "umfpack.h"
PATHS ${UMFPACK_ROOT}
PATH_SUFFIXES "umfpack" "include/umfpack" "suitesparse" "include" "src" "UMFPACK" "UMFPACK/Include"
NO_DEFAULT_PATH
)
#now also look for default paths
find_path(UMFPACK_INCLUDE_DIR
NAMES "umfpack.h"
PATH_SUFFIXES "umfpack" "include/umfpack" "suitesparse" "include" "UMFPACK" "UMFPACK/Include"
)
#look for library at positions given by the user
find_library(UMFPACK_LIBRARY
NAMES "umfpack"
PATHS ${UMFPACK_ROOT}
PATH_SUFFIXES "lib" "lib32" "lib64" "UMFPACK" "UMFPACK/Lib"
NO_DEFAULT_PATH
)
#now also include the deafult paths
find_library(UMFPACK_LIBRARY
NAMES "umfpack"
PATH_SUFFIXES "lib" "lib32" "lib64" "UMFPACK" "UMFPACK/Lib"
)
# behave like a CMake module is supposed to behave
include(FindPackageHandleStandardArgs)
......@@ -89,13 +50,16 @@ mark_as_advanced(UMFPACK_INCLUDE_DIR UMFPACK_LIBRARY)
# if both headers and library are found, store results
if(UMFPACK_FOUND)
set(UMFPACK_INCLUDE_DIRS ${UMFPACK_INCLUDE_DIR})
foreach( dir ${UMFPACK_INCLUDE_DIRS} )
list( APPEND UMFPACK_INCLUDE_FLAGS "-I${dir}/" )
endforeach()
set(UMFPACK_LIBRARIES ${UMFPACK_LIBRARY})
# log result
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"Determining location of UMFPack succeded:\n"
"Include directory: ${UMFPACK_INCLUDE_DIRS}\n"
"Library directory: ${UMFPACK_LIBRARIES}\n\n")
set(UMFPACK_DUNE_COMPILE_FLAGS "-I${UMFPACK_INCLUDE_DIRS}"
set(UMFPACK_DUNE_COMPILE_FLAGS "${UMFPACK_INLCUDE_FLAGS}"
CACHE STRING "Compile Flags used by DUNE when compiling with UMFPack programs")
set(UMFPACK_DUNE_LIBRARIES ${UMFPACK_LIBRARIES} ${BLAS_LIBRARIES} ${AMD_LIBRARY}
CACHE STRING "Libraries used by DUNE when linking UMFPack programs")
......@@ -109,6 +73,7 @@ endif(UMFPACK_FOUND)
#set HAVE_UMFPACK for config.h
set(HAVE_UMFPACK ${UMFPACK_FOUND})
set(HAVE_SUITESPARSE_UMFPACK ${UMFPACK_FOUND})
# register all umfpack related flags
if(UMFPACK_FOUND)
......
......@@ -103,6 +103,9 @@
/* Define to if the UMFPack library is available */
#cmakedefine HAVE_UMFPACK ENABLE_UMFPACK
/* Define to 1 if the SuiteSparse library is available */
#cmakedefine HAVE_SUITESPARSE 1
/* Define to ENABLE_PARMETIS if you have the Parmetis library.
This is only true if MPI was found
by configure _and_ if the application uses the PARMETIS_CPPFLAGS */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment