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)