Skip to content

Commit 28c0a07

Browse files
committed
#633 added findsuitesparse
1 parent 5d929fa commit 28c0a07

File tree

3 files changed

+245
-1
lines changed

3 files changed

+245
-1
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ SuiteSparse/.gitignore
7474
# cmakefiles
7575
CMakeFiles
7676
Makefile
77-
*.cmake
77+
cmake_install.cmake
7878
*.so
7979
*.json
80+

FindSuiteSparse.cmake

+242
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
# This CMakeFile is adapted from that in dune-common:
2+
3+
# .. cmake_module::
4+
#
5+
# Find the SuiteSparse libraries like UMFPACK or SPQR.
6+
#
7+
# Example which tries to find Suite Sparse's UMFPack component:
8+
#
9+
# :code:`find_package(SuiteSparse OPTIONAL_COMPONENTS UMFPACK)`
10+
#
11+
# `OPTIONAL_COMPONENTS`
12+
# A list of components. Components are:
13+
# AMD, BTF, CAMD, CCOLAMD, CHOLMOD, COLAMD, CXSPARSE,
14+
# KLU, LDL, RBIO, SPQR, UMFPACK
15+
#
16+
# :ref:`SuiteSparse_ROOT`
17+
# Path list to search for SuiteSparse
18+
#
19+
# Sets the following variables:
20+
#
21+
# :code:`SuiteSparse_FOUND`
22+
# True if SuiteSparse was found.
23+
#
24+
# :code:`SuiteSparse_INCLUDE_DIRS`
25+
# Path to the SuiteSparse include dirs.
26+
#
27+
# :code:`SuiteSparse_LIBRARIES`
28+
# Name of the SuiteSparse libraries.
29+
#
30+
# :code:`SuiteSparse_<COMPONENT>_FOUND`
31+
# Whether <COMPONENT> was found as part of SuiteSparse.
32+
#
33+
# .. cmake_variable:: SuiteSparse_ROOT
34+
#
35+
# You may set this variable to have :ref:`FindSuiteSparse` look
36+
# for SuiteSparse in the given path before inspecting
37+
# system paths.
38+
#
39+
40+
find_package(BLAS QUIET)
41+
42+
# look for desired componenents
43+
set(SUITESPARSE_COMPONENTS ${SuiteSparse_FIND_COMPONENTS})
44+
45+
# resolve inter-component dependencies
46+
list(FIND SUITESPARSE_COMPONENTS "UMFPACK" WILL_USE_UMFPACK)
47+
if(NOT WILL_USE_UMFPACK EQUAL -1)
48+
list(APPEND SUITESPARSE_COMPONENTS AMD CHOLMOD)
49+
endif()
50+
list(FIND SUITESPARSE_COMPONENTS "CHOLMOD" WILL_USE_CHOLMOD)
51+
if(NOT WILL_USE_CHOLMOD EQUAL -1)
52+
list(APPEND SUITESPARSE_COMPONENTS AMD CAMD COLAMD CCOLAMD)
53+
endif()
54+
55+
if(SUITESPARSE_COMPONENTS)
56+
list(REMOVE_DUPLICATES SUITESPARSE_COMPONENTS)
57+
endif()
58+
59+
# find SuiteSparse config:
60+
# look for library at positions given by the user
61+
find_library(SUITESPARSE_CONFIG_LIB
62+
NAMES "suitesparseconfig"
63+
PATHS ${SuiteSparse_ROOT}
64+
PATH_SUFFIXES "lib" "lib32" "lib64" "Lib"
65+
NO_DEFAULT_PATH
66+
)
67+
# now also include the deafult paths
68+
find_library(SUITESPARSE_CONFIG_LIB
69+
NAMES "suitesparseconfig"
70+
PATH_SUFFIXES "lib" "lib32" "lib64" "Lib"
71+
)
72+
73+
#look for header files at positions given by the user
74+
find_path(SUITESPARSE_INCLUDE_DIR
75+
NAMES "SuiteSparse_config.h"
76+
PATHS ${SuiteSparse_ROOT}
77+
PATH_SUFFIXES "SuiteSparse_config" "SuiteSparse_config/include" "suitesparse" "include" "src" "SuiteSparse_config/Include"
78+
NO_DEFAULT_PATH
79+
)
80+
#now also look for default paths
81+
find_path(SUITESPARSE_INCLUDE_DIR
82+
NAMES "SuiteSparse_config.h"
83+
PATH_SUFFIXES "SuiteSparse_config" "SuiteSparse_config/include" "suitesparse" "include" "src" "SuiteSparse_config/Include"
84+
)
85+
86+
foreach(_component ${SUITESPARSE_COMPONENTS})
87+
string(TOLOWER ${_component} _componentLower)
88+
89+
#look for library at positions given by the user
90+
find_library(${_component}_LIBRARY
91+
NAMES "${_componentLower}"
92+
PATHS ${SuiteSparse_ROOT}
93+
PATH_SUFFIXES "lib" "lib32" "lib64" "${_component}" "${_component}/Lib"
94+
NO_DEFAULT_PATH
95+
)
96+
#now also include the deafult paths
97+
find_library(${_component}_LIBRARY
98+
NAMES "${_componentLower}"
99+
PATH_SUFFIXES "lib" "lib32" "lib64" "${_component}" "${_component}/Lib"
100+
)
101+
102+
#look for header files at positions given by the user
103+
find_path(${_component}_INCLUDE_DIR
104+
NAMES "${_componentLower}.h"
105+
PATHS ${SuiteSparse_ROOT}
106+
PATH_SUFFIXES "${_componentLower}" "include/${_componentLower}" "suitesparse" "include" "src" "${_component}" "${_component}/Include"
107+
NO_DEFAULT_PATH
108+
)
109+
#now also look for default paths
110+
find_path(${_component}_INCLUDE_DIR
111+
NAMES "${_componentLower}.h"
112+
PATH_SUFFIXES "${_componentLower}" "include/${_componentLower}" "suitesparse" "include" "${_component}" "${_component}/Include"
113+
)
114+
endforeach()
115+
116+
# SPQR has different header file name SuiteSparseQR.hpp
117+
#look for header files at positions given by the user
118+
find_path(SPQR_INCLUDE_DIR
119+
NAMES "SuiteSparseQR.hpp"
120+
PATHS ${SuiteSparse_ROOT}
121+
PATH_SUFFIXES "spqr" "include/spqr" "suitesparse" "include" "src" "SPQR" "SPQR/Include"
122+
NO_DEFAULT_PATH
123+
)
124+
#now also look for default paths
125+
find_path(SPQR_INCLUDE_DIR
126+
NAMES "SuiteSparseQR.hpp"
127+
PATH_SUFFIXES "spqr" "include/spqr" "suitesparse" "include" "SPQR" "SPQR/Include"
128+
)
129+
130+
# resolve inter-modular dependencies
131+
132+
# CHOLMOD requires AMD, COLAMD; CAMD and CCOLAMD are optional
133+
if(CHOLMOD_LIBRARY)
134+
if(NOT (AMD_LIBRARY AND COLAMD_LIBRARY))
135+
message(WARNING "CHOLMOD requires AMD and COLAMD which were not found, skipping the test.")
136+
set(SuiteSparse_CHOLMOD_FOUND "CHOLMOD requires AMD and COLAMD-NOTFOUND")
137+
endif()
138+
139+
list(APPEND CHOLMOD_LIBRARY ${AMD_LIBRARY} ${COLAMD_LIBRARY})
140+
if(CAMD_LIBRARY)
141+
list(APPEND CHOLMOD_LIBRARY ${CAMD_LIBRARY})
142+
endif()
143+
if(CCOLAMD_LIBRARY)
144+
list(APPEND CHOLMOD_LIBRARY ${CCOLAMD_LIBRARY})
145+
endif()
146+
list(REVERSE CHOLMOD_LIBRARY)
147+
# remove duplicates
148+
list(REMOVE_DUPLICATES CHOLMOD_LIBRARY)
149+
list(REVERSE CHOLMOD_LIBRARY)
150+
endif()
151+
152+
# UMFPack requires AMD, can depend on CHOLMOD
153+
if(UMFPACK_LIBRARY)
154+
# check wether cholmod was found
155+
if(CHOLMOD_LIBRARY)
156+
list(APPEND UMFPACK_LIBRARY ${CHOLMOD_LIBRARY})
157+
else()
158+
list(APPEND UMFPACK_LIBRARY ${AMD_LIBRARY})
159+
endif()
160+
list(REVERSE UMFPACK_LIBRARY)
161+
# remove duplicates
162+
list(REMOVE_DUPLICATES UMFPACK_LIBRARY)
163+
list(REVERSE UMFPACK_LIBRARY)
164+
endif()
165+
166+
# check wether everything was found
167+
foreach(_component ${SUITESPARSE_COMPONENTS})
168+
# variable used for component handling
169+
set(SuiteSparse_${_component}_FOUND (${_component}_LIBRARY AND ${_component}_INCLUDE_DIR))
170+
set(HAVE_SUITESPARSE_${_component} SuiteSparse_${_component}_FOUND)
171+
if(SuiteSparse_${_component}_FOUND)
172+
list(APPEND SUITESPARSE_INCLUDE_DIR "${${_component}_INCLUDE_DIR}")
173+
list(APPEND SUITESPARSE_LIBRARY "${${_component}_LIBRARY}")
174+
endif()
175+
176+
mark_as_advanced(
177+
HAVE_SUITESPARSE_${_component}
178+
SuiteSparse_${_component}_FOUND
179+
${_component}_INCLUDE_DIR
180+
${_component}_LIBRARY)
181+
endforeach()
182+
183+
list(APPEND SUITESPARSE_LIBRARY ${SUITESPARSE_CONFIG_LIB})
184+
185+
# make them unique
186+
if(SUITESPARSE_INCLUDE_DIR)
187+
list(REMOVE_DUPLICATES SUITESPARSE_INCLUDE_DIR)
188+
endif()
189+
if(SUITESPARSE_LIBRARY)
190+
list(REVERSE SUITESPARSE_LIBRARY)
191+
list(REMOVE_DUPLICATES SUITESPARSE_LIBRARY)
192+
list(REVERSE SUITESPARSE_LIBRARY)
193+
endif()
194+
195+
# behave like a CMake module is supposed to behave
196+
include(FindPackageHandleStandardArgs)
197+
find_package_handle_standard_args(
198+
"SuiteSparse"
199+
FOUND_VAR SuiteSparse_FOUND
200+
REQUIRED_VARS
201+
BLAS_FOUND
202+
SUITESPARSE_INCLUDE_DIR
203+
SUITESPARSE_LIBRARY
204+
HANDLE_COMPONENTS
205+
)
206+
207+
mark_as_advanced(
208+
SUITESPARSE_INCLUDE_DIR
209+
SUITESPARSE_LIBRARY
210+
SUITESPARSE_CONFIG_LIB
211+
WILL_USE_CHOLMOD
212+
WILL_USE_UMFPACK)
213+
214+
# if both headers and library are found, store results
215+
if(SuiteSparse_FOUND)
216+
set(SuiteSparse_LIBRARIES ${SUITESPARSE_LIBRARY})
217+
set(SuiteSparse_INCLUDE_DIRS ${SUITESPARSE_INCLUDE_DIR})
218+
# log result
219+
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
220+
"Determining location of SuiteSparse succeded:\n"
221+
"Include directory: ${SuiteSparse_INCLUDE_DIRS}\n"
222+
"Library directory: ${SuiteSparse_LIBRARIES}\n\n")
223+
set(SuiteSparse_COMPILER_FLAGS)
224+
foreach(dir ${SuiteSparse_INCLUDE_DIRS})
225+
set(SuiteSparse_COMPILER_FLAGS "${SuiteSparse_COMPILER_FLAGS} -I${dir}/")
226+
endforeach()
227+
set(SuiteSparse_DUNE_COMPILE_FLAGS ${SuiteSparse_COMPILER_FLAGS}
228+
CACHE STRING "Compile Flags used by DUNE when compiling with SuiteSparse programs")
229+
set(SuiteSparse_DUNE_LIBRARIES ${BLAS_LIBRARIES} ${SuiteSparse_LIBRARIES}
230+
CACHE STRING "Libraries used by DUNE when linking SuiteSparse programs")
231+
else()
232+
# log errornous result
233+
file(APPEND ${CMAKE_BINARY_DIR}${CMAKES_FILES_DIRECTORY}/CMakeError.log
234+
"Determing location of SuiteSparse failed:\n"
235+
"Include directory: ${SuiteSparse_INCLUDE_DIRS}\n"
236+
"Library directory: ${SuiteSparse_LIBRARIES}\n\n")
237+
endif()
238+
239+
#set HAVE_SUITESPARSE for config.h
240+
set(HAVE_SUITESPARSE ${SuiteSparse_FOUND})
241+
set(HAVE_UMFPACK ${SuiteSparse_UMFPACK_FOUND})
242+

scripts/replace-cmake/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -1011,6 +1011,7 @@ IF(KLU_ENABLE)
10111011

10121012
set(KLU_FOUND TRUE)
10131013
set(PYBAMM_DIR ${PROJECT_SOURCE_DIR}/..)
1014+
message("PYBAMM DIR")
10141015
message(${PYBAMM_DIR})
10151016
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PYBAMM_DIR}) # use FindSuiteSparse.cmake that is in PyBaMM root
10161017
find_package(SuiteSparse)

0 commit comments

Comments
 (0)