Fix SuiteSparse path and version reporting If SuiteSparse is found, an unhelpful message "Found SuiteSparse: TRUE ..." is printed. Instead, report the found include directory and version information which was previously not shown due to unset SuiteSparse_FOUND variable. Change-Id: Ib43fb99934f34e6007110007d2cd4a8fbd841aa2
diff --git a/cmake/FindSuiteSparse.cmake b/cmake/FindSuiteSparse.cmake index 08b3f17..768b5df 100644 --- a/cmake/FindSuiteSparse.cmake +++ b/cmake/FindSuiteSparse.cmake
@@ -112,20 +112,39 @@ 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) +# 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_FIND_COMPONENTS AMD CAMD CCOLAMD COLAMD) + 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_FIND_COMPONENTS CHOLMOD) + 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) @@ -141,7 +160,10 @@ # 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) - # Do NOT unset SuiteSparse_FOUND_REQUIRED_VARS here, as it is used by + # 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. @@ -182,23 +204,17 @@ # Wrappers to find_path/library that pass the SuiteSparse search hints/paths. # # suitesparse_find_component(<component> [FILES name1 [name2 ...]] -# [LIBRARIES name1 [name2 ...]] -# [REQUIRED]) +# [LIBRARIES name1 [name2 ...]]) macro(suitesparse_find_component COMPONENT) include(CMakeParseArguments) - set(OPTIONS REQUIRED) set(MULTI_VALUE_ARGS FILES LIBRARIES) - cmake_parse_arguments(SuiteSparse_FIND_${COMPONENT} - "${OPTIONS}" "" "${MULTI_VALUE_ARGS}" ${ARGN}) - - if (SuiteSparse_FIND_${COMPONENT}_REQUIRED) - list(APPEND SuiteSparse_FOUND_REQUIRED_VARS SuiteSparse_${COMPONENT}_FOUND) - endif() + cmake_parse_arguments(SuiteSparse_FIND_COMPONENT_${COMPONENT} + "" "" "${MULTI_VALUE_ARGS}" ${ARGN}) set(SuiteSparse_${COMPONENT}_FOUND TRUE) - if (SuiteSparse_FIND_${COMPONENT}_FILES) + if (SuiteSparse_FIND_COMPONENT_${COMPONENT}_FILES) find_path(SuiteSparse_${COMPONENT}_INCLUDE_DIR - NAMES ${SuiteSparse_FIND_${COMPONENT}_FILES} + NAMES ${SuiteSparse_FIND_COMPONENT_${COMPONENT}_FILES} PATH_SUFFIXES ${SuiteSparse_CHECK_PATH_SUFFIXES}) if (SuiteSparse_${COMPONENT}_INCLUDE_DIR) message(STATUS "Found ${COMPONENT} headers in: " @@ -207,7 +223,7 @@ else() # Specified headers not found. set(SuiteSparse_${COMPONENT}_FOUND FALSE) - if (SuiteSparse_FIND_${COMPONENT}_REQUIRED) + if (SuiteSparse_FIND_REQUIRED_${COMPONENT}) suitesparse_report_not_found( "Did not find ${COMPONENT} header (required SuiteSparse component).") else() @@ -219,9 +235,9 @@ endif() endif() - if (SuiteSparse_FIND_${COMPONENT}_LIBRARIES) + if (SuiteSparse_FIND_COMPONENT_${COMPONENT}_LIBRARIES) find_library(SuiteSparse_${COMPONENT}_LIBRARY - NAMES ${SuiteSparse_FIND_${COMPONENT}_LIBRARIES} + NAMES ${SuiteSparse_FIND_COMPONENT_${COMPONENT}_LIBRARIES} PATH_SUFFIXES ${SuiteSparse_CHECK_PATH_SUFFIXES}) if (SuiteSparse_${COMPONENT}_LIBRARY) message(STATUS "Found ${COMPONENT} library: ${SuiteSparse_${COMPONENT}_LIBRARY}") @@ -229,7 +245,7 @@ else () # Specified libraries not found. set(SuiteSparse_${COMPONENT}_FOUND FALSE) - if (SuiteSparse_FIND_${COMPONENT}_REQUIRED) + if (SuiteSparse_FIND_REQUIRED_${COMPONENT}) suitesparse_report_not_found( "Did not find ${COMPONENT} library (required SuiteSparse component).") else() @@ -241,6 +257,14 @@ 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}) @@ -258,7 +282,7 @@ # 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_FOUND_REQUIRED_VARS) +unset(SuiteSparse_REQUIRED_VARS) # BLAS. find_package(BLAS QUIET) @@ -266,7 +290,6 @@ suitesparse_report_not_found( "Did not find BLAS library (required for SuiteSparse).") endif (NOT BLAS_FOUND) -list(APPEND SuiteSparse_FOUND_REQUIRED_VARS BLAS_FOUND) # LAPACK. find_package(LAPACK QUIET) @@ -274,19 +297,22 @@ suitesparse_report_not_found( "Did not find LAPACK library (required for SuiteSparse).") endif (NOT LAPACK_FOUND) -list(APPEND SuiteSparse_FOUND_REQUIRED_VARS LAPACK_FOUND) foreach (component IN LISTS SuiteSparse_FIND_COMPONENTS) - string (TOLOWER ${component} component_lower) + string (TOLOWER ${component} component_library) - if (component STREQUAL "SPQR") + 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_lower}.h) - endif (component STREQUAL "SPQR") + set (component_header ${component_library}.h) + endif (component STREQUAL "Config") - suitesparse_find_component(${component} REQUIRED FILES ${component_header} - LIBRARIES ${component_lower}) + suitesparse_find_component(${component} + FILES ${component_header} + LIBRARIES ${component_library}) endforeach (component IN LISTS SuiteSparse_FIND_COMPONENTS) if (TARGET SuiteSparse::SPQR) @@ -318,12 +344,6 @@ endif (TBB_FOUND) endif (TARGET SuiteSparse::SPQR) -# SuiteSparse_config. -# -# If SuiteSparse version is >= 4 then SuiteSparse_config is required. -suitesparse_find_component( - Config FILES SuiteSparse_config.h LIBRARIES suitesparseconfig) - check_library_exists(rt shm_open "" HAVE_LIBRT) if (TARGET SuiteSparse::Config) @@ -450,7 +470,7 @@ include(FindPackageHandleStandardArgs) if (SuiteSparse_FOUND) find_package_handle_standard_args(SuiteSparse - REQUIRED_VARS ${SuiteSparse_FOUND_REQUIRED_VARS} + REQUIRED_VARS ${SuiteSparse_REQUIRED_VARS} VERSION_VAR SuiteSparse_VERSION FAIL_MESSAGE "Failed to find some/all required components of SuiteSparse." HANDLE_COMPONENTS) @@ -459,7 +479,7 @@ # 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_FOUND_REQUIRED_VARS} + REQUIRED_VARS ${SuiteSparse_REQUIRED_VARS} FAIL_MESSAGE "Failed to find some/all required components of SuiteSparse." HANDLE_COMPONENTS) endif (SuiteSparse_FOUND)