| # Ceres Solver - A fast non-linear least squares minimizer | 
 | # Copyright 2023 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 NO_MODULE) | 
 |   if (TBB_FOUND) | 
 |     message(STATUS "Found Intel Thread Building Blocks (TBB) library " | 
 |       "(${TBB_VERSION_MAJOR}.${TBB_VERSION_MINOR} / ${TBB_INTERFACE_VERSION}). " | 
 |       "Assuming SuiteSparseQR was compiled with TBB.") | 
 |     # Add the TBB libraries to the SuiteSparseQR libraries (the only | 
 |     # libraries to optionally depend on TBB). | 
 |     set_property (TARGET SuiteSparse::SPQR APPEND PROPERTY | 
 |       INTERFACE_LINK_LIBRARIES 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) |