22# SuiteSparse/AMD/CMakeLists.txt: cmake for AMD
33#-------------------------------------------------------------------------------
44
5- # Copyright (c) 1996-2022 , Timothy A. Davis, Patrick Amestoy, Iain Duff.
5+ # Copyright (c) 1996-2023 , Timothy A. Davis, Patrick Amestoy, Iain Duff.
66# All Rights Reserved.
77# SPDX-License-Identifier: BSD-3-clause
88
99#-------------------------------------------------------------------------------
1010# get the version
1111#-------------------------------------------------------------------------------
1212
13- cmake_minimum_required ( VERSION 3.19 )
13+ cmake_minimum_required ( VERSION 3.22 )
1414
15- set ( AMD_DATE "Jan 17, 2023 " )
16- set ( AMD_VERSION_MAJOR 3 )
17- set ( AMD_VERSION_MINOR 0 )
18- set ( AMD_VERSION_SUB 3 )
15+ set ( AMD_DATE "Jan 10, 2024 " )
16+ set ( AMD_VERSION_MAJOR 3 CACHE STRING "" FORCE )
17+ set ( AMD_VERSION_MINOR 3 CACHE STRING "" FORCE )
18+ set ( AMD_VERSION_SUB 1 CACHE STRING "" FORCE )
1919
2020message ( STATUS "Building AMD version: v"
2121 ${AMD_VERSION_MAJOR} .
2222 ${AMD_VERSION_MINOR} .
2323 ${AMD_VERSION_SUB} " (" ${AMD_DATE} ")" )
2424
2525#-------------------------------------------------------------------------------
26- # SuiteSparse policies
26+ # define the project
2727#-------------------------------------------------------------------------------
2828
29- set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
30- ${CMAKE_SOURCE_DIR} /cmake_modules
31- ${CMAKE_SOURCE_DIR} /../SuiteSparse_config/cmake_modules )
32-
33- include ( SuiteSparsePolicy )
29+ project ( AMD
30+ VERSION "${AMD_VERSION_MAJOR} .${AMD_VERSION_MINOR} .${AMD_VERSION_SUB} "
31+ LANGUAGES C )
3432
3533#-------------------------------------------------------------------------------
36- # define the project
34+ # SuiteSparse policies
3735#-------------------------------------------------------------------------------
3836
39- if ( WIN32 )
40- # disable Fortran in AMD when compiling on Windows
41- set ( NFORTRAN true )
42- endif ( )
37+ set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
38+ ${PROJECT_SOURCE_DIR} /../SuiteSparse_config/cmake_modules )
39+
40+ include ( SuiteSparsePolicy )
4341
44- if ( NOT NFORTRAN )
42+ if ( SUITESPARSE_HAS_FORTRAN )
4543 # Fortan is available and enabled
46- project ( amd
47- VERSION "${AMD_VERSION_MAJOR} .${AMD_VERSION_MINOR} .${AMD_VERSION_SUB} "
48- LANGUAGES C Fortran )
49- else ( )
50- # no Fortran compiler available; do not compile Source/*.f or Demo/*.f
51- project ( amd
52- VERSION "${AMD_VERSION_MAJOR} .${AMD_VERSION_MINOR} .${AMD_VERSION_SUB} "
53- LANGUAGES C )
44+ enable_language ( Fortran )
5445endif ( )
5546
5647#-------------------------------------------------------------------------------
5748# find library dependencies
5849#-------------------------------------------------------------------------------
5950
60- find_package ( SuiteSparse_config 7.0.0 REQUIRED )
51+ if ( NOT SUITESPARSE_ROOT_CMAKELISTS )
52+ find_package ( SuiteSparse_config 7.5.0
53+ PATHS ${CMAKE_SOURCE_DIR} /../SuiteSparse_config/build NO_DEFAULT_PATH )
54+ if ( NOT TARGET SuiteSparse::SuiteSparseConfig )
55+ find_package ( SuiteSparse_config 7.5.0 REQUIRED )
56+ endif ( )
57+ endif ( )
6158
6259#-------------------------------------------------------------------------------
6360# configure files
@@ -72,85 +69,191 @@ configure_file ( "Config/amd_version.tex.in" "${PROJECT_SOURCE_DIR}/Doc/amd_vers
7269# include directories
7370#-------------------------------------------------------------------------------
7471
75- include_directories ( Source Include ${SUITESPARSE_CONFIG_INCLUDE_DIR} )
72+ include_directories ( Source Include )
7673
7774#-------------------------------------------------------------------------------
7875# dynamic amd library properties
7976#-------------------------------------------------------------------------------
8077
81- if ( NOT NFORTRAN )
78+ if ( SUITESPARSE_HAS_FORTRAN )
8279 file ( GLOB AMD_SOURCES "Source/*.c" "Source/*.f" )
8380else ( )
8481 file ( GLOB AMD_SOURCES "Source/*.c" )
8582endif ( )
8683
87- add_library ( amd SHARED ${AMD_SOURCES} )
88- set_target_properties ( amd PROPERTIES
89- VERSION ${AMD_VERSION_MAJOR} .${AMD_VERSION_MINOR} .${AMD_VERSION_SUB}
90- C_STANDARD_REQUIRED 11
91- SOVERSION ${AMD_VERSION_MAJOR}
92- PUBLIC_HEADER "Include/amd.h"
93- WINDOWS_EXPORT_ALL_SYMBOLS ON )
84+ if ( BUILD_SHARED_LIBS )
85+ add_library ( AMD SHARED ${AMD_SOURCES} )
86+ set_target_properties ( AMD PROPERTIES
87+ VERSION ${AMD_VERSION_MAJOR} .${AMD_VERSION_MINOR} .${AMD_VERSION_SUB}
88+ C_STANDARD 11
89+ C_STANDARD_REQUIRED ON
90+ OUTPUT_NAME amd
91+ SOVERSION ${AMD_VERSION_MAJOR}
92+ PUBLIC_HEADER "Include/amd.h"
93+ WINDOWS_EXPORT_ALL_SYMBOLS ON )
94+
95+ if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" )
96+ set_target_properties ( AMD PROPERTIES EXPORT_NO_SYSTEM ON )
97+ endif ( )
98+
99+ target_include_directories ( AMD
100+ INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR} /Include >
101+ $<INSTALL_INTERFACE:${SUITESPARSE_INCLUDEDIR} > )
102+ endif ( )
94103
95104#-------------------------------------------------------------------------------
96105# static amd library properties
97106#-------------------------------------------------------------------------------
98107
99- if ( NOT NSTATIC )
100- add_library ( amd_static STATIC ${AMD_SOURCES} )
101- set_target_properties ( amd_static PROPERTIES
102- VERSION ${AMD_VERSION_MAJOR} . ${AMD_VERSION_MINOR} . ${AMD_VERSION_SUB}
103- C_STANDARD_REQUIRED 11
108+ if ( BUILD_STATIC_LIBS )
109+ add_library ( AMD_static STATIC ${AMD_SOURCES} )
110+ set_target_properties ( AMD_static PROPERTIES
111+ C_STANDARD 11
112+ C_STANDARD_REQUIRED ON
104113 OUTPUT_NAME amd
105- SOVERSION ${AMD_VERSION_MAJOR} )
114+ PUBLIC_HEADER "Include/amd.h" )
106115
107116 if ( MSVC )
108- set_target_properties ( amd_static PROPERTIES
117+ set_target_properties ( AMD_static PROPERTIES
109118 OUTPUT_NAME amd_static )
110119 endif ( )
120+
121+ if ( ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25" )
122+ set_target_properties ( AMD_static PROPERTIES EXPORT_NO_SYSTEM ON )
123+ endif ( )
124+
125+ target_include_directories ( AMD_static
126+ INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR} /Include >
127+ $<INSTALL_INTERFACE:${SUITESPARSE_INCLUDEDIR} > )
128+
111129endif ( )
112130
113131#-------------------------------------------------------------------------------
114132# add the library dependencies
115133#-------------------------------------------------------------------------------
116134
117- # suitesparseconfig:
118- target_link_libraries ( amd PUBLIC ${SUITESPARSE_CONFIG_LIBRARIES} )
119- if ( NOT NSTATIC )
120- target_link_libraries ( amd_static PUBLIC ${SUITESPARSE_CONFIG_STATIC} )
135+ # SuiteSparseConfig:
136+ if ( BUILD_SHARED_LIBS )
137+ target_link_libraries ( AMD PRIVATE SuiteSparse::SuiteSparseConfig )
138+ target_include_directories ( AMD PUBLIC
139+ "$<TARGET_PROPERTY:SuiteSparse::SuiteSparseConfig,INTERFACE_INCLUDE_DIRECTORIES>" )
140+ endif ( )
141+ if ( BUILD_STATIC_LIBS )
142+ if ( TARGET SuiteSparse::SuiteSparseConfig_static )
143+ target_link_libraries ( AMD_static PUBLIC SuiteSparse::SuiteSparseConfig_static )
144+ else ( )
145+ target_link_libraries ( AMD_static PUBLIC SuiteSparse::SuiteSparseConfig )
146+ endif ( )
121147endif ( )
122148
123149# libm:
124150if ( NOT WIN32 )
125- target_link_libraries ( amd PUBLIC m )
126- if ( NOT NSTATIC )
127- target_link_libraries ( amd_static PUBLIC m )
151+ if ( BUILD_SHARED_LIBS )
152+ target_link_libraries ( AMD PRIVATE m )
153+ endif ( )
154+ if ( BUILD_STATIC_LIBS )
155+ set ( AMD_STATIC_LIBS "${AMD_STATIC_LIBS} -lm" )
156+ target_link_libraries ( AMD_static PUBLIC m )
128157 endif ( )
129158endif ( )
130159
131160#-------------------------------------------------------------------------------
132161# AMD installation location
133162#-------------------------------------------------------------------------------
134163
135- install ( TARGETS amd
136- LIBRARY DESTINATION ${SUITESPARSE_LIBDIR}
137- ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR}
138- RUNTIME DESTINATION ${SUITESPARSE_BINDIR}
139- PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} )
140- install ( FILES ${CMAKE_SOURCE_DIR} /cmake_modules/FindAMD.cmake
141- DESTINATION ${SUITESPARSE_LIBDIR} /cmake/SuiteSparse
142- COMPONENT Development )
143- if ( NOT NSTATIC )
144- install ( TARGETS amd_static
145- ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR} )
164+ include ( CMakePackageConfigHelpers )
165+
166+ if ( BUILD_SHARED_LIBS )
167+ install ( TARGETS AMD
168+ EXPORT AMDTargets
169+ LIBRARY DESTINATION ${SUITESPARSE_LIBDIR}
170+ ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR}
171+ RUNTIME DESTINATION ${SUITESPARSE_BINDIR}
172+ PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} )
173+ endif ( )
174+ if ( BUILD_STATIC_LIBS )
175+ install ( TARGETS AMD_static
176+ EXPORT AMDTargets
177+ ARCHIVE DESTINATION ${SUITESPARSE_LIBDIR}
178+ PUBLIC_HEADER DESTINATION ${SUITESPARSE_INCLUDEDIR} )
179+ endif ( )
180+
181+ # create (temporary) export target file during build
182+ export ( EXPORT AMDTargets
183+ NAMESPACE SuiteSparse::
184+ FILE ${CMAKE_CURRENT_BINARY_DIR} /AMDTargets.cmake )
185+
186+ # install export target, config and version files for find_package
187+ install ( EXPORT AMDTargets
188+ NAMESPACE SuiteSparse::
189+ DESTINATION ${SUITESPARSE_PKGFILEDIR} /cmake/AMD )
190+
191+ # generate config file to be used in common build tree
192+ set ( SUITESPARSE_IN_BUILD_TREE ON )
193+ configure_package_config_file (
194+ Config/AMDConfig.cmake.in
195+ ${CMAKE_CURRENT_BINARY_DIR} /AMDConfig.cmake
196+ INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR} /AMDConfig.cmake )
197+
198+ # generate config file to be installed
199+ set ( SUITESPARSE_IN_BUILD_TREE OFF )
200+ configure_package_config_file (
201+ Config/AMDConfig.cmake.in
202+ ${CMAKE_CURRENT_BINARY_DIR} /target /AMDConfig.cmake
203+ INSTALL_DESTINATION ${SUITESPARSE_PKGFILEDIR} /cmake/AMD )
204+
205+ write_basic_package_version_file (
206+ ${CMAKE_CURRENT_BINARY_DIR} /AMDConfigVersion.cmake
207+ COMPATIBILITY SameMajorVersion )
208+
209+ install ( FILES
210+ ${CMAKE_CURRENT_BINARY_DIR} /target /AMDConfig.cmake
211+ ${CMAKE_CURRENT_BINARY_DIR} /AMDConfigVersion.cmake
212+ DESTINATION ${SUITESPARSE_PKGFILEDIR} /cmake/AMD )
213+
214+ #-------------------------------------------------------------------------------
215+ # create pkg-config file
216+ #-------------------------------------------------------------------------------
217+
218+ if ( NOT MSVC )
219+ set ( prefix "${CMAKE_INSTALL_PREFIX} " )
220+ set ( exec_prefix "\$ {prefix}" )
221+ cmake_path ( IS_ABSOLUTE SUITESPARSE_LIBDIR SUITESPARSE_LIBDIR_IS_ABSOLUTE )
222+ if (SUITESPARSE_LIBDIR_IS_ABSOLUTE)
223+ set ( libdir "${SUITESPARSE_LIBDIR} " )
224+ else ( )
225+ set ( libdir "\$ {exec_prefix}/${SUITESPARSE_LIBDIR} " )
226+ endif ( )
227+ cmake_path ( IS_ABSOLUTE SUITESPARSE_INCLUDEDIR SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE )
228+ if (SUITESPARSE_INCLUDEDIR_IS_ABSOLUTE)
229+ set ( includedir "${SUITESPARSE_INCLUDEDIR} " )
230+ else ( )
231+ set ( includedir "\$ {prefix}/${SUITESPARSE_INCLUDEDIR} " )
232+ endif ( )
233+ if ( BUILD_SHARED_LIBS )
234+ set ( SUITESPARSE_LIB_BASE_NAME $<TARGET_FILE_BASE_NAME:AMD> )
235+ else ( )
236+ set ( SUITESPARSE_LIB_BASE_NAME $<TARGET_FILE_BASE_NAME:AMD_static> )
237+ endif ( )
238+ configure_file (
239+ Config/AMD.pc.in
240+ AMD.pc.out
241+ @ONLY
242+ NEWLINE_STYLE LF )
243+ file ( GENERATE
244+ OUTPUT AMD.pc
245+ INPUT ${CMAKE_CURRENT_BINARY_DIR} /AMD.pc.out
246+ NEWLINE_STYLE LF )
247+ install ( FILES
248+ ${CMAKE_CURRENT_BINARY_DIR} /AMD.pc
249+ DESTINATION ${SUITESPARSE_PKGFILEDIR} /pkgconfig )
146250endif ( )
147251
148252#-------------------------------------------------------------------------------
149253# Demo library and programs
150254#-------------------------------------------------------------------------------
151255
152- option ( DEMO "ON: Build the demo programs. OFF (default): do not build the demo programs." off )
153- if ( DEMO )
256+ if ( SUITESPARSE_DEMOS )
154257
155258 #---------------------------------------------------------------------------
156259 # demo library
@@ -166,19 +269,30 @@ if ( DEMO )
166269 add_executable ( amd_l_demo "Demo/amd_l_demo.c" )
167270 add_executable ( amd_demo2 "Demo/amd_demo2.c" )
168271 add_executable ( amd_simple "Demo/amd_simple.c" )
169- if ( NOT NFORTRAN )
272+ if ( SUITESPARSE_HAS_FORTRAN )
170273 add_executable ( amd_f77demo "Demo/amd_f77demo.f" )
171274 add_executable ( amd_f77simple "Demo/amd_f77simple.f" )
172275 endif ( )
173276
174277 # Libraries required for Demo programs
175- target_link_libraries ( amd_demo PUBLIC amd )
176- target_link_libraries ( amd_l_demo PUBLIC amd )
177- target_link_libraries ( amd_demo2 PUBLIC amd )
178- target_link_libraries ( amd_simple PUBLIC amd )
179- if ( NOT NFORTRAN )
180- target_link_libraries ( amd_f77demo PUBLIC amd )
181- target_link_libraries ( amd_f77simple PUBLIC amd )
278+ if ( BUILD_SHARED_LIBS )
279+ target_link_libraries ( amd_demo PUBLIC AMD )
280+ target_link_libraries ( amd_l_demo PUBLIC AMD )
281+ target_link_libraries ( amd_demo2 PUBLIC AMD )
282+ target_link_libraries ( amd_simple PUBLIC AMD )
283+ if ( SUITESPARSE_HAS_FORTRAN )
284+ target_link_libraries ( amd_f77demo PUBLIC AMD )
285+ target_link_libraries ( amd_f77simple PUBLIC AMD )
286+ endif ( )
287+ else ( )
288+ target_link_libraries ( amd_demo PUBLIC AMD_static )
289+ target_link_libraries ( amd_l_demo PUBLIC AMD_static )
290+ target_link_libraries ( amd_demo2 PUBLIC AMD_static )
291+ target_link_libraries ( amd_simple PUBLIC AMD_static )
292+ if ( SUITESPARSE_HAS_FORTRAN )
293+ target_link_libraries ( amd_f77demo PUBLIC AMD_static )
294+ target_link_libraries ( amd_f77simple PUBLIC AMD_static )
295+ endif ( )
182296 endif ( )
183297
184298else ( )
@@ -192,4 +306,3 @@ endif ( )
192306#-------------------------------------------------------------------------------
193307
194308include ( SuiteSparseReport )
195-
0 commit comments