mirror of
https://github.com/RainerKuemmerle/g2o.git
synced 2026-01-18 13:11:20 +01:00
Drop custom script for finding SuiteSparse
Replace custom cmake script for finding SuiteSparse by looking directly for CHOLMOD. Relates #874
This commit is contained in:
committed by
Rainer Kümmerle
parent
ef80e643ad
commit
2f0720e53e
@@ -104,8 +104,8 @@ endif()
|
||||
|
||||
# For building the CHOLMOD based solvers
|
||||
option(G2O_USE_CHOLMOD "Build g2o with CHOLMOD support" ON)
|
||||
find_package(SuiteSparse)
|
||||
if (G2O_USE_CHOLMOD AND SuiteSparse_CHOLMOD_FOUND)
|
||||
find_package(CHOLMOD)
|
||||
if (G2O_USE_CHOLMOD AND TARGET SuiteSparse::CHOLMOD)
|
||||
message(STATUS "Enable support for Cholmod")
|
||||
set(CHOLMOD_FOUND TRUE)
|
||||
else()
|
||||
|
||||
@@ -1,537 +0,0 @@
|
||||
# Ceres Solver - A fast non-linear least squares minimizer
|
||||
# Copyright 2022 Google Inc. All rights reserved.
|
||||
# http://ceres-solver.org/
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its contributors may be
|
||||
# used to endorse or promote products derived from this software without
|
||||
# specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# Author: alexs.mac@gmail.com (Alex Stewart)
|
||||
#
|
||||
|
||||
#[=======================================================================[.rst:
|
||||
FindSuiteSparse
|
||||
===============
|
||||
|
||||
Module for locating SuiteSparse libraries and its dependencies.
|
||||
|
||||
This module defines the following variables:
|
||||
|
||||
``SuiteSparse_FOUND``
|
||||
``TRUE`` iff SuiteSparse and all dependencies have been found.
|
||||
|
||||
``SuiteSparse_VERSION``
|
||||
Extracted from ``SuiteSparse_config.h`` (>= v4).
|
||||
|
||||
``SuiteSparse_VERSION_MAJOR``
|
||||
Equal to 4 if ``SuiteSparse_VERSION`` = 4.2.1
|
||||
|
||||
``SuiteSparse_VERSION_MINOR``
|
||||
Equal to 2 if ``SuiteSparse_VERSION`` = 4.2.1
|
||||
|
||||
``SuiteSparse_VERSION_PATCH``
|
||||
Equal to 1 if ``SuiteSparse_VERSION`` = 4.2.1
|
||||
|
||||
The following variables control the behaviour of this module:
|
||||
|
||||
``SuiteSparse_NO_CMAKE``
|
||||
Do not attempt to use the native SuiteSparse CMake package configuration.
|
||||
|
||||
|
||||
Targets
|
||||
-------
|
||||
|
||||
The following targets define the SuiteSparse components searched for.
|
||||
|
||||
``SuiteSparse::AMD``
|
||||
Symmetric Approximate Minimum Degree (AMD)
|
||||
|
||||
``SuiteSparse::CAMD``
|
||||
Constrained Approximate Minimum Degree (CAMD)
|
||||
|
||||
``SuiteSparse::COLAMD``
|
||||
Column Approximate Minimum Degree (COLAMD)
|
||||
|
||||
``SuiteSparse::CCOLAMD``
|
||||
Constrained Column Approximate Minimum Degree (CCOLAMD)
|
||||
|
||||
``SuiteSparse::CHOLMOD``
|
||||
Sparse Supernodal Cholesky Factorization and Update/Downdate (CHOLMOD)
|
||||
|
||||
``SuiteSparse::Partition``
|
||||
CHOLMOD with METIS support
|
||||
|
||||
``SuiteSparse::SPQR``
|
||||
Multifrontal Sparse QR (SuiteSparseQR)
|
||||
|
||||
``SuiteSparse::Config``
|
||||
Common configuration for all but CSparse (SuiteSparse version >= 4).
|
||||
|
||||
Optional SuiteSparse dependencies:
|
||||
|
||||
``METIS::METIS``
|
||||
Serial Graph Partitioning and Fill-reducing Matrix Ordering (METIS)
|
||||
]=======================================================================]
|
||||
|
||||
if (NOT SuiteSparse_NO_CMAKE)
|
||||
find_package (SuiteSparse NO_MODULE QUIET)
|
||||
endif (NOT SuiteSparse_NO_CMAKE)
|
||||
|
||||
if (SuiteSparse_FOUND)
|
||||
return ()
|
||||
endif (SuiteSparse_FOUND)
|
||||
|
||||
# Push CMP0057 to enable support for IN_LIST, when cmake_minimum_required is
|
||||
# set to <3.3.
|
||||
cmake_policy (PUSH)
|
||||
cmake_policy (SET CMP0057 NEW)
|
||||
|
||||
if (NOT SuiteSparse_FIND_COMPONENTS)
|
||||
set (SuiteSparse_FIND_COMPONENTS
|
||||
AMD
|
||||
CAMD
|
||||
CCOLAMD
|
||||
CHOLMOD
|
||||
COLAMD
|
||||
SPQR
|
||||
)
|
||||
|
||||
foreach (component IN LISTS SuiteSparse_FIND_COMPONENTS)
|
||||
set (SuiteSparse_FIND_REQUIRED_${component} TRUE)
|
||||
endforeach (component IN LISTS SuiteSparse_FIND_COMPONENTS)
|
||||
endif (NOT SuiteSparse_FIND_COMPONENTS)
|
||||
|
||||
# Assume SuiteSparse was found and set it to false only if third-party
|
||||
# dependencies could not be located. SuiteSparse components are handled by
|
||||
# FindPackageHandleStandardArgs HANDLE_COMPONENTS option.
|
||||
set (SuiteSparse_FOUND TRUE)
|
||||
|
||||
include (CheckLibraryExists)
|
||||
include (CheckSymbolExists)
|
||||
include (CMakePushCheckState)
|
||||
|
||||
# Config is a base component and thus always required
|
||||
set (SuiteSparse_IMPLICIT_COMPONENTS Config)
|
||||
|
||||
# CHOLMOD depends on AMD, CAMD, CCOLAMD, and COLAMD.
|
||||
if (CHOLMOD IN_LIST SuiteSparse_FIND_COMPONENTS)
|
||||
list (APPEND SuiteSparse_IMPLICIT_COMPONENTS AMD CAMD CCOLAMD COLAMD)
|
||||
endif (CHOLMOD IN_LIST SuiteSparse_FIND_COMPONENTS)
|
||||
|
||||
# SPQR depends on CHOLMOD.
|
||||
if (SPQR IN_LIST SuiteSparse_FIND_COMPONENTS)
|
||||
list (APPEND SuiteSparse_IMPLICIT_COMPONENTS CHOLMOD)
|
||||
endif (SPQR IN_LIST SuiteSparse_FIND_COMPONENTS)
|
||||
|
||||
# Implicit components are always required
|
||||
foreach (component IN LISTS SuiteSparse_IMPLICIT_COMPONENTS)
|
||||
set (SuiteSparse_FIND_REQUIRED_${component} TRUE)
|
||||
endforeach (component IN LISTS SuiteSparse_IMPLICIT_COMPONENTS)
|
||||
|
||||
list (APPEND SuiteSparse_FIND_COMPONENTS ${SuiteSparse_IMPLICIT_COMPONENTS})
|
||||
|
||||
# Do not list components multiple times.
|
||||
list (REMOVE_DUPLICATES SuiteSparse_FIND_COMPONENTS)
|
||||
|
||||
# Reset CALLERS_CMAKE_FIND_LIBRARY_PREFIXES to its value when
|
||||
# FindSuiteSparse was invoked.
|
||||
macro(SuiteSparse_RESET_FIND_LIBRARY_PREFIX)
|
||||
if (MSVC)
|
||||
set(CMAKE_FIND_LIBRARY_PREFIXES "${CALLERS_CMAKE_FIND_LIBRARY_PREFIXES}")
|
||||
endif (MSVC)
|
||||
endmacro(SuiteSparse_RESET_FIND_LIBRARY_PREFIX)
|
||||
|
||||
# Called if we failed to find SuiteSparse or any of it's required dependencies,
|
||||
# unsets all public (designed to be used externally) variables and reports
|
||||
# error message at priority depending upon [REQUIRED/QUIET/<NONE>] argument.
|
||||
macro(SuiteSparse_REPORT_NOT_FOUND REASON_MSG)
|
||||
# Will be set to FALSE by find_package_handle_standard_args
|
||||
unset (SuiteSparse_FOUND)
|
||||
|
||||
# Do NOT unset SuiteSparse_REQUIRED_VARS here, as it is used by
|
||||
# FindPackageHandleStandardArgs() to generate the automatic error message on
|
||||
# failure which highlights which components are missing.
|
||||
|
||||
suitesparse_reset_find_library_prefix()
|
||||
|
||||
# Note <package>_FIND_[REQUIRED/QUIETLY] variables defined by FindPackage()
|
||||
# use the camelcase library name, not uppercase.
|
||||
if (SuiteSparse_FIND_QUIETLY)
|
||||
message(STATUS "Failed to find SuiteSparse - " ${REASON_MSG} ${ARGN})
|
||||
elseif (SuiteSparse_FIND_REQUIRED)
|
||||
message(FATAL_ERROR "Failed to find SuiteSparse - " ${REASON_MSG} ${ARGN})
|
||||
else()
|
||||
# Neither QUIETLY nor REQUIRED, use no priority which emits a message
|
||||
# but continues configuration and allows generation.
|
||||
message("-- Failed to find SuiteSparse - " ${REASON_MSG} ${ARGN})
|
||||
endif (SuiteSparse_FIND_QUIETLY)
|
||||
|
||||
# Do not call return(), s/t we keep processing if not called with REQUIRED
|
||||
# and report all missing components, rather than bailing after failing to find
|
||||
# the first.
|
||||
endmacro(SuiteSparse_REPORT_NOT_FOUND)
|
||||
|
||||
# Handle possible presence of lib prefix for libraries on MSVC, see
|
||||
# also SuiteSparse_RESET_FIND_LIBRARY_PREFIX().
|
||||
if (MSVC)
|
||||
# Preserve the caller's original values for CMAKE_FIND_LIBRARY_PREFIXES
|
||||
# s/t we can set it back before returning.
|
||||
set(CALLERS_CMAKE_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}")
|
||||
# The empty string in this list is important, it represents the case when
|
||||
# the libraries have no prefix (shared libraries / DLLs).
|
||||
set(CMAKE_FIND_LIBRARY_PREFIXES "lib" "" "${CMAKE_FIND_LIBRARY_PREFIXES}")
|
||||
endif (MSVC)
|
||||
|
||||
# Additional suffixes to try appending to each search path.
|
||||
list(APPEND SuiteSparse_CHECK_PATH_SUFFIXES
|
||||
suitesparse) # Windows/Ubuntu
|
||||
|
||||
# Wrappers to find_path/library that pass the SuiteSparse search hints/paths.
|
||||
#
|
||||
# suitesparse_find_component(<component> [FILES name1 [name2 ...]]
|
||||
# [LIBRARIES name1 [name2 ...]])
|
||||
macro(suitesparse_find_component COMPONENT)
|
||||
include(CMakeParseArguments)
|
||||
set(MULTI_VALUE_ARGS FILES LIBRARIES)
|
||||
cmake_parse_arguments(SuiteSparse_FIND_COMPONENT_${COMPONENT}
|
||||
"" "" "${MULTI_VALUE_ARGS}" ${ARGN})
|
||||
|
||||
set(SuiteSparse_${COMPONENT}_FOUND TRUE)
|
||||
if (SuiteSparse_FIND_COMPONENT_${COMPONENT}_FILES)
|
||||
find_path(SuiteSparse_${COMPONENT}_INCLUDE_DIR
|
||||
NAMES ${SuiteSparse_FIND_COMPONENT_${COMPONENT}_FILES}
|
||||
PATH_SUFFIXES ${SuiteSparse_CHECK_PATH_SUFFIXES})
|
||||
if (SuiteSparse_${COMPONENT}_INCLUDE_DIR)
|
||||
message(STATUS "Found ${COMPONENT} headers in: "
|
||||
"${SuiteSparse_${COMPONENT}_INCLUDE_DIR}")
|
||||
mark_as_advanced(SuiteSparse_${COMPONENT}_INCLUDE_DIR)
|
||||
else()
|
||||
# Specified headers not found.
|
||||
set(SuiteSparse_${COMPONENT}_FOUND FALSE)
|
||||
if (SuiteSparse_FIND_REQUIRED_${COMPONENT})
|
||||
suitesparse_report_not_found(
|
||||
"Did not find ${COMPONENT} header (required SuiteSparse component).")
|
||||
else()
|
||||
message(STATUS "Did not find ${COMPONENT} header (optional "
|
||||
"SuiteSparse component).")
|
||||
# Hide optional vars from CMake GUI even if not found.
|
||||
mark_as_advanced(SuiteSparse_${COMPONENT}_INCLUDE_DIR)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (SuiteSparse_FIND_COMPONENT_${COMPONENT}_LIBRARIES)
|
||||
find_library(SuiteSparse_${COMPONENT}_LIBRARY
|
||||
NAMES ${SuiteSparse_FIND_COMPONENT_${COMPONENT}_LIBRARIES}
|
||||
PATH_SUFFIXES ${SuiteSparse_CHECK_PATH_SUFFIXES})
|
||||
if (SuiteSparse_${COMPONENT}_LIBRARY)
|
||||
message(STATUS "Found ${COMPONENT} library: ${SuiteSparse_${COMPONENT}_LIBRARY}")
|
||||
mark_as_advanced(SuiteSparse_${COMPONENT}_LIBRARY)
|
||||
else ()
|
||||
# Specified libraries not found.
|
||||
set(SuiteSparse_${COMPONENT}_FOUND FALSE)
|
||||
if (SuiteSparse_FIND_REQUIRED_${COMPONENT})
|
||||
suitesparse_report_not_found(
|
||||
"Did not find ${COMPONENT} library (required SuiteSparse component).")
|
||||
else()
|
||||
message(STATUS "Did not find ${COMPONENT} library (optional SuiteSparse "
|
||||
"dependency)")
|
||||
# Hide optional vars from CMake GUI even if not found.
|
||||
mark_as_advanced(SuiteSparse_${COMPONENT}_LIBRARY)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# A component can be optional (given to OPTIONAL_COMPONENTS). However, if the
|
||||
# component is implicit (must be always present, such as the Config component)
|
||||
# assume it be required as well.
|
||||
if (SuiteSparse_FIND_REQUIRED_${COMPONENT})
|
||||
list (APPEND SuiteSparse_REQUIRED_VARS SuiteSparse_${COMPONENT}_INCLUDE_DIR)
|
||||
list (APPEND SuiteSparse_REQUIRED_VARS SuiteSparse_${COMPONENT}_LIBRARY)
|
||||
endif (SuiteSparse_FIND_REQUIRED_${COMPONENT})
|
||||
|
||||
# Define the target only if the include directory and the library were found
|
||||
if (SuiteSparse_${COMPONENT}_INCLUDE_DIR AND SuiteSparse_${COMPONENT}_LIBRARY)
|
||||
if (NOT TARGET SuiteSparse::${COMPONENT})
|
||||
add_library(SuiteSparse::${COMPONENT} IMPORTED UNKNOWN)
|
||||
endif (NOT TARGET SuiteSparse::${COMPONENT})
|
||||
|
||||
set_property(TARGET SuiteSparse::${COMPONENT} PROPERTY
|
||||
INTERFACE_INCLUDE_DIRECTORIES ${SuiteSparse_${COMPONENT}_INCLUDE_DIR})
|
||||
set_property(TARGET SuiteSparse::${COMPONENT} PROPERTY
|
||||
IMPORTED_LOCATION ${SuiteSparse_${COMPONENT}_LIBRARY})
|
||||
endif (SuiteSparse_${COMPONENT}_INCLUDE_DIR AND SuiteSparse_${COMPONENT}_LIBRARY)
|
||||
endmacro()
|
||||
|
||||
# Given the number of components of SuiteSparse, and to ensure that the
|
||||
# automatic failure message generated by FindPackageHandleStandardArgs()
|
||||
# when not all required components are found is helpful, we maintain a list
|
||||
# of all variables that must be defined for SuiteSparse to be considered found.
|
||||
unset(SuiteSparse_REQUIRED_VARS)
|
||||
|
||||
# BLAS.
|
||||
find_package(BLAS QUIET)
|
||||
if (NOT BLAS_FOUND)
|
||||
suitesparse_report_not_found(
|
||||
"Did not find BLAS library (required for SuiteSparse).")
|
||||
endif (NOT BLAS_FOUND)
|
||||
|
||||
# LAPACK.
|
||||
find_package(LAPACK QUIET)
|
||||
if (NOT LAPACK_FOUND)
|
||||
suitesparse_report_not_found(
|
||||
"Did not find LAPACK library (required for SuiteSparse).")
|
||||
endif (NOT LAPACK_FOUND)
|
||||
|
||||
foreach (component IN LISTS SuiteSparse_FIND_COMPONENTS)
|
||||
if (component STREQUAL Partition)
|
||||
# Partition is a meta component that neither provides additional headers nor
|
||||
# a separate library. It is strictly part of CHOLMOD.
|
||||
continue ()
|
||||
endif (component STREQUAL Partition)
|
||||
string (TOLOWER ${component} component_library)
|
||||
|
||||
if (component STREQUAL "Config")
|
||||
set (component_header SuiteSparse_config.h)
|
||||
set (component_library suitesparseconfig)
|
||||
elseif (component STREQUAL "SPQR")
|
||||
set (component_header SuiteSparseQR.hpp)
|
||||
else (component STREQUAL "SPQR")
|
||||
set (component_header ${component_library}.h)
|
||||
endif (component STREQUAL "Config")
|
||||
|
||||
suitesparse_find_component(${component}
|
||||
FILES ${component_header}
|
||||
LIBRARIES ${component_library})
|
||||
endforeach (component IN LISTS SuiteSparse_FIND_COMPONENTS)
|
||||
|
||||
if (TARGET SuiteSparse::SPQR)
|
||||
# SuiteSparseQR may be compiled with Intel Threading Building Blocks,
|
||||
# we assume that if TBB is installed, SuiteSparseQR was compiled with
|
||||
# support for it, this will do no harm if it wasn't.
|
||||
find_package(TBB QUIET)
|
||||
if (TBB_FOUND)
|
||||
message(STATUS "Found Intel Thread Building Blocks (TBB) library "
|
||||
"(${TBB_VERSION_MAJOR}.${TBB_VERSION_MINOR} / ${TBB_INTERFACE_VERSION}) "
|
||||
"include location: ${TBB_INCLUDE_DIRS}. Assuming SuiteSparseQR was "
|
||||
"compiled with TBB.")
|
||||
# Add the TBB libraries to the SuiteSparseQR libraries (the only
|
||||
# libraries to optionally depend on TBB).
|
||||
if (TARGET TBB::tbb)
|
||||
# Native TBB package configuration provides an imported target. Use it if
|
||||
# available.
|
||||
set_property (TARGET SuiteSparse::SPQR APPEND PROPERTY
|
||||
INTERFACE_LINK_LIBRARIES TBB::tbb)
|
||||
else (TARGET TBB::tbb)
|
||||
set_property (TARGET SuiteSparse::SPQR APPEND PROPERTY
|
||||
INTERFACE_INCLUDE_DIRECTORIES ${TBB_INCLUDE_DIRS})
|
||||
set_property (TARGET SuiteSparse::SPQR APPEND PROPERTY
|
||||
INTERFACE_LINK_LIBRARIES ${TBB_LIBRARIES})
|
||||
endif (TARGET TBB::tbb)
|
||||
else (TBB_FOUND)
|
||||
message(STATUS "Did not find Intel TBB library, assuming SuiteSparseQR was "
|
||||
"not compiled with TBB.")
|
||||
endif (TBB_FOUND)
|
||||
endif (TARGET SuiteSparse::SPQR)
|
||||
|
||||
check_library_exists(rt shm_open "" HAVE_LIBRT)
|
||||
|
||||
if (TARGET SuiteSparse::Config)
|
||||
# SuiteSparse_config (SuiteSparse version >= 4) requires librt library for
|
||||
# timing by default when compiled on Linux or Unix, but not on OSX (which
|
||||
# does not have librt).
|
||||
if (HAVE_LIBRT)
|
||||
message(STATUS "Adding librt to "
|
||||
"SuiteSparse_config libraries (required on Linux & Unix [not OSX] if "
|
||||
"SuiteSparse is compiled with timing).")
|
||||
set_property (TARGET SuiteSparse::Config APPEND PROPERTY
|
||||
INTERFACE_LINK_LIBRARIES $<LINK_ONLY:rt>)
|
||||
else (HAVE_LIBRT)
|
||||
message(STATUS "Could not find librt, but found SuiteSparse_config, "
|
||||
"assuming that SuiteSparse was compiled without timing.")
|
||||
endif (HAVE_LIBRT)
|
||||
|
||||
# Add BLAS and LAPACK as dependencies of SuiteSparse::Config for convenience
|
||||
# given that all components depend on it.
|
||||
if (BLAS_FOUND)
|
||||
if (TARGET BLAS::BLAS)
|
||||
set_property (TARGET SuiteSparse::Config APPEND PROPERTY
|
||||
INTERFACE_LINK_LIBRARIES $<LINK_ONLY:BLAS::BLAS>)
|
||||
else (TARGET BLAS::BLAS)
|
||||
set_property (TARGET SuiteSparse::Config APPEND PROPERTY
|
||||
INTERFACE_LINK_LIBRARIES ${BLAS_LIBRARIES})
|
||||
endif (TARGET BLAS::BLAS)
|
||||
endif (BLAS_FOUND)
|
||||
|
||||
if (LAPACK_FOUND)
|
||||
if (TARGET LAPACK::LAPACK)
|
||||
set_property (TARGET SuiteSparse::Config APPEND PROPERTY
|
||||
INTERFACE_LINK_LIBRARIES $<LINK_ONLY:LAPACK::LAPACK>)
|
||||
else (TARGET LAPACK::LAPACK)
|
||||
set_property (TARGET SuiteSparse::Config APPEND PROPERTY
|
||||
INTERFACE_LINK_LIBRARIES ${LAPACK_LIBRARIES})
|
||||
endif (TARGET LAPACK::LAPACK)
|
||||
endif (LAPACK_FOUND)
|
||||
|
||||
# SuiteSparse version >= 4.
|
||||
set(SuiteSparse_VERSION_FILE
|
||||
${SuiteSparse_Config_INCLUDE_DIR}/SuiteSparse_config.h)
|
||||
if (NOT EXISTS ${SuiteSparse_VERSION_FILE})
|
||||
suitesparse_report_not_found(
|
||||
"Could not find file: ${SuiteSparse_VERSION_FILE} containing version "
|
||||
"information for >= v4 SuiteSparse installs, but SuiteSparse_config was "
|
||||
"found (only present in >= v4 installs).")
|
||||
else (NOT EXISTS ${SuiteSparse_VERSION_FILE})
|
||||
file(READ ${SuiteSparse_VERSION_FILE} Config_CONTENTS)
|
||||
|
||||
string(REGEX MATCH "#define SUITESPARSE_MAIN_VERSION[ \t]+([0-9]+)"
|
||||
SuiteSparse_VERSION_LINE "${Config_CONTENTS}")
|
||||
set (SuiteSparse_VERSION_MAJOR ${CMAKE_MATCH_1})
|
||||
|
||||
string(REGEX MATCH "#define SUITESPARSE_SUB_VERSION[ \t]+([0-9]+)"
|
||||
SuiteSparse_VERSION_LINE "${Config_CONTENTS}")
|
||||
set (SuiteSparse_VERSION_MINOR ${CMAKE_MATCH_1})
|
||||
|
||||
string(REGEX MATCH "#define SUITESPARSE_SUBSUB_VERSION[ \t]+([0-9]+)"
|
||||
SuiteSparse_VERSION_LINE "${Config_CONTENTS}")
|
||||
set (SuiteSparse_VERSION_PATCH ${CMAKE_MATCH_1})
|
||||
|
||||
unset (SuiteSparse_VERSION_LINE)
|
||||
|
||||
# This is on a single line s/t CMake does not interpret it as a list of
|
||||
# elements and insert ';' separators which would result in 4.;2.;1 nonsense.
|
||||
set(SuiteSparse_VERSION
|
||||
"${SuiteSparse_VERSION_MAJOR}.${SuiteSparse_VERSION_MINOR}.${SuiteSparse_VERSION_PATCH}")
|
||||
|
||||
if (SuiteSparse_VERSION MATCHES "[0-9]+\\.[0-9]+\\.[0-9]+")
|
||||
set(SuiteSparse_VERSION_COMPONENTS 3)
|
||||
else (SuiteSparse_VERSION MATCHES "[0-9]+\\.[0-9]+\\.[0-9]+")
|
||||
message (WARNING "Could not parse SuiteSparse_config.h: SuiteSparse "
|
||||
"version will not be available")
|
||||
|
||||
unset (SuiteSparse_VERSION)
|
||||
unset (SuiteSparse_VERSION_MAJOR)
|
||||
unset (SuiteSparse_VERSION_MINOR)
|
||||
unset (SuiteSparse_VERSION_PATCH)
|
||||
endif (SuiteSparse_VERSION MATCHES "[0-9]+\\.[0-9]+\\.[0-9]+")
|
||||
endif (NOT EXISTS ${SuiteSparse_VERSION_FILE})
|
||||
endif (TARGET SuiteSparse::Config)
|
||||
|
||||
# CHOLMOD requires AMD CAMD CCOLAMD COLAMD
|
||||
if (TARGET SuiteSparse::CHOLMOD)
|
||||
foreach (component IN ITEMS AMD CAMD CCOLAMD COLAMD)
|
||||
if (TARGET SuiteSparse::${component})
|
||||
set_property (TARGET SuiteSparse::CHOLMOD APPEND PROPERTY
|
||||
INTERFACE_LINK_LIBRARIES SuiteSparse::${component})
|
||||
else (TARGET SuiteSparse::${component})
|
||||
# Consider CHOLMOD not found if COLAMD cannot be found
|
||||
set (SuiteSparse_CHOLMOD_FOUND FALSE)
|
||||
endif (TARGET SuiteSparse::${component})
|
||||
endforeach (component IN ITEMS AMD CAMD CCOLAMD COLAMD)
|
||||
endif (TARGET SuiteSparse::CHOLMOD)
|
||||
|
||||
# SPQR requires CHOLMOD
|
||||
if (TARGET SuiteSparse::SPQR)
|
||||
if (TARGET SuiteSparse::CHOLMOD)
|
||||
set_property (TARGET SuiteSparse::SPQR APPEND PROPERTY
|
||||
INTERFACE_LINK_LIBRARIES SuiteSparse::CHOLMOD)
|
||||
else (TARGET SuiteSparse::CHOLMOD)
|
||||
# Consider SPQR not found if CHOLMOD cannot be found
|
||||
set (SuiteSparse_SQPR_FOUND FALSE)
|
||||
endif (TARGET SuiteSparse::CHOLMOD)
|
||||
endif (TARGET SuiteSparse::SPQR)
|
||||
|
||||
# Add SuiteSparse::Config as dependency to all components
|
||||
if (TARGET SuiteSparse::Config)
|
||||
foreach (component IN LISTS SuiteSparse_FIND_COMPONENTS)
|
||||
if (component STREQUAL Config)
|
||||
continue ()
|
||||
endif (component STREQUAL Config)
|
||||
|
||||
if (TARGET SuiteSparse::${component})
|
||||
set_property (TARGET SuiteSparse::${component} APPEND PROPERTY
|
||||
INTERFACE_LINK_LIBRARIES SuiteSparse::Config)
|
||||
endif (TARGET SuiteSparse::${component})
|
||||
endforeach (component IN LISTS SuiteSparse_FIND_COMPONENTS)
|
||||
endif (TARGET SuiteSparse::Config)
|
||||
|
||||
# Check whether CHOLMOD was compiled with METIS support. The check can be
|
||||
# performed only after the main components have been set up.
|
||||
if (TARGET SuiteSparse::CHOLMOD)
|
||||
# NOTE If SuiteSparse was compiled as a static library we'll need to link
|
||||
# against METIS already during the check. Otherwise, the check can fail due to
|
||||
# undefined references even though SuiteSparse was compiled with METIS.
|
||||
find_package (METIS)
|
||||
|
||||
if (TARGET METIS::METIS)
|
||||
cmake_push_check_state (RESET)
|
||||
set (CMAKE_REQUIRED_LIBRARIES SuiteSparse::CHOLMOD METIS::METIS)
|
||||
check_symbol_exists (cholmod_metis cholmod.h SuiteSparse_CHOLMOD_USES_METIS)
|
||||
cmake_pop_check_state ()
|
||||
|
||||
if (SuiteSparse_CHOLMOD_USES_METIS)
|
||||
set_property (TARGET SuiteSparse::CHOLMOD APPEND PROPERTY
|
||||
INTERFACE_LINK_LIBRARIES $<LINK_ONLY:METIS::METIS>)
|
||||
|
||||
# Provide the SuiteSparse::Partition component whose availability indicates
|
||||
# that CHOLMOD was compiled with the Partition module.
|
||||
if (NOT TARGET SuiteSparse::Partition)
|
||||
add_library (SuiteSparse::Partition IMPORTED INTERFACE)
|
||||
endif (NOT TARGET SuiteSparse::Partition)
|
||||
|
||||
set_property (TARGET SuiteSparse::Partition APPEND PROPERTY
|
||||
INTERFACE_LINK_LIBRARIES SuiteSparse::CHOLMOD)
|
||||
endif (SuiteSparse_CHOLMOD_USES_METIS)
|
||||
endif (TARGET METIS::METIS)
|
||||
endif (TARGET SuiteSparse::CHOLMOD)
|
||||
|
||||
# We do not use suitesparse_find_component to find Partition and therefore must
|
||||
# handle the availability in an extra step.
|
||||
if (TARGET SuiteSparse::Partition)
|
||||
set (SuiteSparse_Partition_FOUND TRUE)
|
||||
else (TARGET SuiteSparse::Partition)
|
||||
set (SuiteSparse_Partition_FOUND FALSE)
|
||||
endif (TARGET SuiteSparse::Partition)
|
||||
|
||||
suitesparse_reset_find_library_prefix()
|
||||
|
||||
# Handle REQUIRED and QUIET arguments to FIND_PACKAGE
|
||||
include(FindPackageHandleStandardArgs)
|
||||
if (SuiteSparse_FOUND)
|
||||
find_package_handle_standard_args(SuiteSparse
|
||||
REQUIRED_VARS ${SuiteSparse_REQUIRED_VARS}
|
||||
VERSION_VAR SuiteSparse_VERSION
|
||||
FAIL_MESSAGE "Failed to find some/all required components of SuiteSparse."
|
||||
HANDLE_COMPONENTS)
|
||||
else (SuiteSparse_FOUND)
|
||||
# Do not pass VERSION_VAR to FindPackageHandleStandardArgs() if we failed to
|
||||
# find SuiteSparse to avoid a confusing autogenerated failure message
|
||||
# that states 'not found (missing: FOO) (found version: x.y.z)'.
|
||||
find_package_handle_standard_args(SuiteSparse
|
||||
REQUIRED_VARS ${SuiteSparse_REQUIRED_VARS}
|
||||
FAIL_MESSAGE "Failed to find some/all required components of SuiteSparse."
|
||||
HANDLE_COMPONENTS)
|
||||
endif (SuiteSparse_FOUND)
|
||||
|
||||
# Pop CMP0057.
|
||||
cmake_policy (POP)
|
||||
Reference in New Issue
Block a user