Cleaning up messages output when SuiteSparse is not found. - Automatically generated failure message now provides more information as to which sub-modules are missing. Change-Id: I6eed94af49263540b8f87917b75c41b8f49658a0
diff --git a/cmake/FindSuiteSparse.cmake b/cmake/FindSuiteSparse.cmake index 3f3a50d..b9729ab 100644 --- a/cmake/FindSuiteSparse.cmake +++ b/cmake/FindSuiteSparse.cmake
@@ -121,6 +121,10 @@ UNSET(SUITESPARSE_MAIN_VERSION) UNSET(SUITESPARSE_SUB_VERSION) UNSET(SUITESPARSE_SUBSUB_VERSION) + # Do NOT unset SUITESPARSE_FOUND_REQUIRED_VARS here, as it is used by + # FindPackageHandleStandardArgs() to generate the automatic error message on + # failure which highlights which components are missing. + # Note <package>_FIND_[REQUIRED/QUIETLY] variables defined by FindPackage() # use the camelcase library name, not uppercase. IF (SuiteSparse_FIND_QUIETLY) @@ -132,6 +136,8 @@ # 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. ENDMACRO(SUITESPARSE_REPORT_NOT_FOUND) # Specify search directories for include files and libraries (this is the union @@ -157,12 +163,19 @@ /usr/lib/suitesparse # Ubuntu /usr/lib) +# 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_FOUND_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) +LIST(APPEND SUITESPARSE_FOUND_REQUIRED_VARS BLAS_FOUND) # LAPACK. FIND_PACKAGE(LAPACK QUIET) @@ -170,15 +183,18 @@ SUITESPARSE_REPORT_NOT_FOUND( "Did not find LAPACK library (required for SuiteSparse).") ENDIF (NOT LAPACK_FOUND) +LIST(APPEND SUITESPARSE_FOUND_REQUIRED_VARS LAPACK_FOUND) # AMD. SET(AMD_FOUND TRUE) +LIST(APPEND SUITESPARSE_FOUND_REQUIRED_VARS AMD_FOUND) FIND_LIBRARY(AMD_LIBRARY NAMES amd PATHS ${SUITESPARSE_CHECK_LIBRARY_DIRS}) IF (EXISTS ${AMD_LIBRARY}) MESSAGE(STATUS "Found AMD library: ${AMD_LIBRARY}") ELSE (EXISTS ${AMD_LIBRARY}) - SUITESPARSE_REPORT_NOT_FOUND("Did not find AMD library.") + SUITESPARSE_REPORT_NOT_FOUND( + "Did not find AMD library (required SuiteSparse component).") SET(AMD_FOUND FALSE) ENDIF (EXISTS ${AMD_LIBRARY}) MARK_AS_ADVANCED(AMD_LIBRARY) @@ -188,19 +204,22 @@ IF (EXISTS ${AMD_INCLUDE_DIR}) MESSAGE(STATUS "Found AMD header in: ${AMD_INCLUDE_DIR}") ELSE (EXISTS ${AMD_INCLUDE_DIR}) - SUITESPARSE_REPORT_NOT_FOUND("Did not find AMD header.") + SUITESPARSE_REPORT_NOT_FOUND( + "Did not find AMD header (required SuiteSparse component).") SET(AMD_FOUND FALSE) ENDIF (EXISTS ${AMD_INCLUDE_DIR}) MARK_AS_ADVANCED(AMD_INCLUDE_DIR) # CAMD. SET(CAMD_FOUND TRUE) +LIST(APPEND SUITESPARSE_FOUND_REQUIRED_VARS CAMD_FOUND) FIND_LIBRARY(CAMD_LIBRARY NAMES camd PATHS ${SUITESPARSE_CHECK_LIBRARY_DIRS}) IF (EXISTS ${CAMD_LIBRARY}) MESSAGE(STATUS "Found CAMD library: ${CAMD_LIBRARY}") ELSE (EXISTS ${CAMD_LIBRARY}) - SUITESPARSE_REPORT_NOT_FOUND("Did not find CAMD library.") + SUITESPARSE_REPORT_NOT_FOUND( + "Did not find CAMD library (required SuiteSparse component).") SET(CAMD_FOUND FALSE) ENDIF (EXISTS ${CAMD_LIBRARY}) MARK_AS_ADVANCED(CAMD_LIBRARY) @@ -210,19 +229,22 @@ IF (EXISTS ${CAMD_INCLUDE_DIR}) MESSAGE(STATUS "Found CAMD header in: ${CAMD_INCLUDE_DIR}") ELSE (EXISTS ${CAMD_INCLUDE_DIR}) - SUITESPARSE_REPORT_NOT_FOUND("Did not find CAMD header.") + SUITESPARSE_REPORT_NOT_FOUND( + "Did not find CAMD header (required SuiteSparse component).") SET(CAMD_FOUND FALSE) ENDIF (EXISTS ${CAMD_INCLUDE_DIR}) MARK_AS_ADVANCED(CAMD_INCLUDE_DIR) # COLAMD. SET(COLAMD_FOUND TRUE) +LIST(APPEND SUITESPARSE_FOUND_REQUIRED_VARS COLAMD_FOUND) FIND_LIBRARY(COLAMD_LIBRARY NAMES colamd PATHS ${SUITESPARSE_CHECK_LIBRARY_DIRS}) IF (EXISTS ${COLAMD_LIBRARY}) MESSAGE(STATUS "Found COLAMD library: ${COLAMD_LIBRARY}") ELSE (EXISTS ${COLAMD_LIBRARY}) - SUITESPARSE_REPORT_NOT_FOUND("Did not find COLAMD library.") + SUITESPARSE_REPORT_NOT_FOUND( + "Did not find COLAMD library (required SuiteSparse component).") SET(COLAMD_FOUND FALSE) ENDIF (EXISTS ${COLAMD_LIBRARY}) MARK_AS_ADVANCED(COLAMD_LIBRARY) @@ -232,19 +254,22 @@ IF (EXISTS ${COLAMD_INCLUDE_DIR}) MESSAGE(STATUS "Found COLAMD header in: ${COLAMD_INCLUDE_DIR}") ELSE (EXISTS ${COLAMD_INCLUDE_DIR}) - SUITESPARSE_REPORT_NOT_FOUND("Did not find COLAMD header.") + SUITESPARSE_REPORT_NOT_FOUND( + "Did not find COLAMD header (required SuiteSparse component).") SET(COLAMD_FOUND FALSE) ENDIF (EXISTS ${COLAMD_INCLUDE_DIR}) MARK_AS_ADVANCED(COLAMD_INCLUDE_DIR) # CCOLAMD. SET(CCOLAMD_FOUND TRUE) +LIST(APPEND SUITESPARSE_FOUND_REQUIRED_VARS CCOLAMD_FOUND) FIND_LIBRARY(CCOLAMD_LIBRARY NAMES ccolamd PATHS ${SUITESPARSE_CHECK_LIBRARY_DIRS}) IF (EXISTS ${CCOLAMD_LIBRARY}) MESSAGE(STATUS "Found CCOLAMD library: ${CCOLAMD_LIBRARY}") ELSE (EXISTS ${CCOLAMD_LIBRARY}) - SUITESPARSE_REPORT_NOT_FOUND("Did not find CCOLAMD library.") + SUITESPARSE_REPORT_NOT_FOUND( + "Did not find CCOLAMD library (required SuiteSparse component).") SET(CCOLAMD_FOUND FALSE) ENDIF (EXISTS ${CCOLAMD_LIBRARY}) MARK_AS_ADVANCED(CCOLAMD_LIBRARY) @@ -254,19 +279,22 @@ IF (EXISTS ${CCOLAMD_INCLUDE_DIR}) MESSAGE(STATUS "Found CCOLAMD header in: ${CCOLAMD_INCLUDE_DIR}") ELSE (EXISTS ${CCOLAMD_INCLUDE_DIR}) - SUITESPARSE_REPORT_NOT_FOUND("Did not find CCOLAMD header.") + SUITESPARSE_REPORT_NOT_FOUND( + "Did not find CCOLAMD header (required SuiteSparse component).") SET(CCOLAMD_FOUND FALSE) ENDIF (EXISTS ${CCOLAMD_INCLUDE_DIR}) MARK_AS_ADVANCED(CCOLAMD_INCLUDE_DIR) # CHOLMOD. SET(CHOLMOD_FOUND TRUE) +LIST(APPEND SUITESPARSE_FOUND_REQUIRED_VARS CHOLMOD_FOUND) FIND_LIBRARY(CHOLMOD_LIBRARY NAMES cholmod PATHS ${SUITESPARSE_CHECK_LIBRARY_DIRS}) IF (EXISTS ${CHOLMOD_LIBRARY}) MESSAGE(STATUS "Found CHOLMOD library: ${CHOLMOD_LIBRARY}") ELSE (EXISTS ${CHOLMOD_LIBRARY}) - SUITESPARSE_REPORT_NOT_FOUND("Did not find CHOLMOD library.") + SUITESPARSE_REPORT_NOT_FOUND( + "Did not find CHOLMOD library (required SuiteSparse component).") SET(CHOLMOD_FOUND FALSE) ENDIF (EXISTS ${CHOLMOD_LIBRARY}) MARK_AS_ADVANCED(CHOLMOD_LIBRARY) @@ -276,19 +304,22 @@ IF (EXISTS ${CHOLMOD_INCLUDE_DIR}) MESSAGE(STATUS "Found CHOLMOD header in: ${CHOLMOD_INCLUDE_DIR}") ELSE (EXISTS ${CHOLMOD_INCLUDE_DIR}) - SUITESPARSE_REPORT_NOT_FOUND("Did not find CHOLMOD header.") + SUITESPARSE_REPORT_NOT_FOUND( + "Did not find CHOLMOD header (required SuiteSparse component).") SET(CHOLMOD_FOUND FALSE) ENDIF (EXISTS ${CHOLMOD_INCLUDE_DIR}) MARK_AS_ADVANCED(CHOLMOD_INCLUDE_DIR) # SuiteSparseQR. SET(SUITESPARSEQR_FOUND TRUE) +LIST(APPEND SUITESPARSE_FOUND_REQUIRED_VARS SUITESPARSEQR_FOUND) FIND_LIBRARY(SUITESPARSEQR_LIBRARY NAMES spqr PATHS ${SUITESPARSE_CHECK_LIBRARY_DIRS}) IF (EXISTS ${SUITESPARSEQR_LIBRARY}) MESSAGE(STATUS "Found SuiteSparseQR library: ${SUITESPARSEQR_LIBRARY}") ELSE (EXISTS ${SUITESPARSEQR_LIBRARY}) - SUITESPARSE_REPORT_NOT_FOUND("Did not find SUITESPARSEQR library.") + SUITESPARSE_REPORT_NOT_FOUND( + "Did not find SuiteSparseQR library (required SuiteSparse component).") SET(SUITESPARSEQR_FOUND FALSE) ENDIF (EXISTS ${SUITESPARSEQR_LIBRARY}) MARK_AS_ADVANCED(SUITESPARSEQR_LIBRARY) @@ -298,7 +329,8 @@ IF (EXISTS ${SUITESPARSEQR_INCLUDE_DIR}) MESSAGE(STATUS "Found SuiteSparseQR header in: ${SUITESPARSEQR_INCLUDE_DIR}") ELSE (EXISTS ${SUITESPARSEQR_INCLUDE_DIR}) - SUITESPARSE_REPORT_NOT_FOUND("Did not find SUITESPARSEQR header.") + SUITESPARSE_REPORT_NOT_FOUND( + "Did not find SUITESPARSEQR header (required SuiteSparse component).") SET(SUITESPARSEQR_FOUND FALSE) ENDIF (EXISTS ${SUITESPARSEQR_INCLUDE_DIR}) MARK_AS_ADVANCED(SUITESPARSEQR_INCLUDE_DIR) @@ -351,17 +383,11 @@ # # If SuiteSparse version is >= 4 then SuiteSparse_config is required. # For SuiteSparse 3, UFconfig.h is required. -SET(SUITESPARSE_CONFIG_FOUND TRUE) -SET(UFCONFIG_FOUND TRUE) - FIND_LIBRARY(SUITESPARSE_CONFIG_LIBRARY NAMES suitesparseconfig PATHS ${SUITESPARSE_CHECK_LIBRARY_DIRS}) IF (EXISTS ${SUITESPARSE_CONFIG_LIBRARY}) MESSAGE(STATUS "Found SuiteSparse_config library: " "${SUITESPARSE_CONFIG_LIBRARY}") -ELSE (EXISTS ${SUITESPARSE_CONFIG_LIBRARY}) - MESSAGE(STATUS "Did not find SuiteSparse_config library (should be present " - "in SuiteSparse >= v4 installs).") ENDIF (EXISTS ${SUITESPARSE_CONFIG_LIBRARY}) MARK_AS_ADVANCED(SUITESPARSE_CONFIG_LIBRARY) @@ -370,15 +396,15 @@ IF (EXISTS ${SUITESPARSE_CONFIG_INCLUDE_DIR}) MESSAGE(STATUS "Found SuiteSparse_config header in: " "${SUITESPARSE_CONFIG_INCLUDE_DIR}") - SET(UFCONFIG_FOUND FALSE) -ELSE (EXISTS ${SUITESPARSE_CONFIG_INCLUDE_DIR}) - MESSAGE(STATUS "Did not find SuiteSparse_config header (should be present " - "in SuiteSparse >= v4 installs).") ENDIF (EXISTS ${SUITESPARSE_CONFIG_INCLUDE_DIR}) MARK_AS_ADVANCED(SUITESPARSE_CONFIG_INCLUDE_DIR) +SET(SUITESPARSE_CONFIG_FOUND FALSE) +SET(UFCONFIG_FOUND FALSE) + IF (EXISTS ${SUITESPARSE_CONFIG_LIBRARY} AND EXISTS ${SUITESPARSE_CONFIG_INCLUDE_DIR}) + SET(SUITESPARSE_CONFIG_FOUND TRUE) # 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). @@ -396,24 +422,35 @@ MARK_AS_ADVANCED(LIBRT_LIBRARY) LIST(APPEND SUITESPARSE_CONFIG_LIBRARY ${LIBRT_LIBRARY}) ENDIF (CMAKE_SYSTEM_NAME MATCHES "Linux" OR UNIX AND NOT APPLE) + ELSE (EXISTS ${SUITESPARSE_CONFIG_LIBRARY} AND EXISTS ${SUITESPARSE_CONFIG_INCLUDE_DIR}) + # Failed to find SuiteSparse_config (>= v4 installs), instead look for + # UFconfig header which should be present in < v4 installs. SET(SUITESPARSE_CONFIG_FOUND FALSE) FIND_PATH(UFCONFIG_INCLUDE_DIR NAMES UFconfig.h PATHS ${SUITESPARSE_CHECK_INCLUDE_DIRS}) IF (EXISTS ${UFCONFIG_INCLUDE_DIR}) MESSAGE(STATUS "Found UFconfig header in: ${UFCONFIG_INCLUDE_DIR}") - ELSE (EXISTS ${UFCONFIG_INCLUDE_DIR}) - MESSAGE(STATUS "Did not find UFconfig header (should be present " - "in SuiteSparse < v4 installs)") - SET(UFCONFIG_FOUND FALSE) + SET(UFCONFIG_FOUND TRUE) ENDIF (EXISTS ${UFCONFIG_INCLUDE_DIR}) MARK_AS_ADVANCED(UFCONFIG_INCLUDE_DIR) ENDIF (EXISTS ${SUITESPARSE_CONFIG_LIBRARY} AND EXISTS ${SUITESPARSE_CONFIG_INCLUDE_DIR}) +IF (NOT SUITESPARSE_CONFIG_FOUND AND + NOT UFCONFIG_FOUND) + SUITESPARSE_REPORT_NOT_FOUND( + "Failed to find either: SuiteSparse_config header & library (should be " + "present in all SuiteSparse >= v4 installs), or UFconfig header (should " + "be present in all SuiteSparse < v4 installs).") +ENDIF (NOT SUITESPARSE_CONFIG_FOUND AND + NOT UFCONFIG_FOUND) + # Extract the SuiteSparse version from the appropriate header (UFconfig.h for # <= v3, SuiteSparse_config.h for >= v4). +LIST(APPEND SUITESPARSE_FOUND_REQUIRED_VARS SUITESPARSE_VERSION) + IF (UFCONFIG_FOUND) # SuiteSparse version <= 3. SET(SUITESPARSE_VERSION_FILE ${UFCONFIG_INCLUDE_DIR}/UFconfig.h) @@ -491,18 +528,16 @@ ENDIF (EXISTS ${METIS_LIBRARY}) MARK_AS_ADVANCED(METIS_LIBRARY) -# Only mark SuiteSparse as found if all required dependencies have been found. -SET(SUITESPARSE_FOUND FALSE) -IF (AMD_FOUND AND - CAMD_FOUND AND - COLAMD_FOUND AND - CCOLAMD_FOUND AND - CHOLMOD_FOUND AND - SUITESPARSEQR_FOUND AND - (SUITESPARSE_CONFIG_FOUND OR UFCONFIG_FOUND) AND - BLAS_FOUND AND - LAPACK_FOUND) - SET(SUITESPARSE_FOUND TRUE) +# Only mark SuiteSparse as found if all required components and dependencies +# have been found. +SET(SUITESPARSE_FOUND TRUE) +FOREACH(REQUIRED_VAR ${SUITESPARSE_FOUND_REQUIRED_VARS}) + IF (NOT ${REQUIRED_VAR}) + SET(SUITESPARSE_FOUND FALSE) + ENDIF (NOT ${REQUIRED_VAR}) +ENDFOREACH(REQUIRED_VAR ${SUITESPARSE_FOUND_REQUIRED_VARS}) + +IF (SUITESPARSE_FOUND) LIST(APPEND SUITESPARSE_INCLUDE_DIRS ${AMD_INCLUDE_DIR} ${CAMD_INCLUDE_DIR} @@ -532,7 +567,9 @@ ${CCOLAMD_LIBRARY} ${CAMD_LIBRARY} ${COLAMD_LIBRARY} - ${AMD_LIBRARY}) + ${AMD_LIBRARY} + ${LAPACK_LIBRARIES} + ${BLAS_LIBRARIES}) IF (SUITESPARSE_CONFIG_FOUND) LIST(APPEND SUITESPARSE_LIBRARIES ${SUITESPARSE_CONFIG_LIBRARY}) @@ -541,9 +578,6 @@ LIST(APPEND SUITESPARSE_LIBRARIES ${METIS_LIBRARY}) ENDIF (METIS_FOUND) -ELSE() - SUITESPARSE_REPORT_NOT_FOUND( - "Failed to find some/all required components of SuiteSparse.") ENDIF() # Determine if we are running on Ubuntu with the package install of SuiteSparse @@ -577,12 +611,16 @@ # Handle REQUIRED and QUIET arguments to FIND_PACKAGE INCLUDE(FindPackageHandleStandardArgs) -# A change to CMake after release 2.8.10.2 means that -# FindPackageHandleStandardArgs() unsets <LibraryName>_FOUND without checking -# if it is one of the variables passed whose existence & validity is verified -# by FindPackageHandleStandardArgs() in conjunction with handling the REQUIRED -# and QUIET optional arguments, as such we use an intermediary variable. -SET(SUITESPARSE_FOUND_COPY ${SUITESPARSE_FOUND}) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(SuiteSparse - REQUIRED_VARS SUITESPARSE_INCLUDE_DIRS SUITESPARSE_LIBRARIES SUITESPARSE_FOUND_COPY - VERSION_VAR SUITESPARSE_VERSION) +IF (SUITESPARSE_FOUND) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(SuiteSparse + REQUIRED_VARS ${SUITESPARSE_FOUND_REQUIRED_VARS} + VERSION_VAR SUITESPARSE_VERSION + FAIL_MESSAGE "Failed to find some/all required components of SuiteSparse.") +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_FOUND_REQUIRED_VARS} + FAIL_MESSAGE "Failed to find some/all required components of SuiteSparse.") +ENDIF (SUITESPARSE_FOUND)