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)