Pass user-specified search hints as HINTS not PATHS.

- As reported as Issue #285, previously we passed user-specified hint
  locations as PATHS to find_path/library which means that they are
  searched after system locations. Now we pass them as HINTS, which are
  searched before system locations.
- Also clean-up FindSuiteSparse to replace repeated code for finding
  each component with a common macro.

Change-Id: I20a1f905d929a23037b1d0b7fb7ffe817abaa3e3
diff --git a/cmake/FindCXSparse.cmake b/cmake/FindCXSparse.cmake
index 718042c..798809c 100644
--- a/cmake/FindCXSparse.cmake
+++ b/cmake/FindCXSparse.cmake
@@ -143,8 +143,8 @@
 # Search supplied hint directories first if supplied.
 find_path(CXSPARSE_INCLUDE_DIR
   NAMES cs.h
-  PATHS ${CXSPARSE_INCLUDE_DIR_HINTS}
-  ${CXSPARSE_CHECK_INCLUDE_DIRS})
+  HINTS ${CXSPARSE_INCLUDE_DIR_HINTS}
+  PATHS ${CXSPARSE_CHECK_INCLUDE_DIRS})
 if (NOT CXSPARSE_INCLUDE_DIR OR
     NOT EXISTS ${CXSPARSE_INCLUDE_DIR})
   cxsparse_report_not_found(
@@ -154,8 +154,8 @@
        NOT EXISTS ${CXSPARSE_INCLUDE_DIR})
 
 find_library(CXSPARSE_LIBRARY NAMES cxsparse
-  PATHS ${CXSPARSE_LIBRARY_DIR_HINTS}
-  ${CXSPARSE_CHECK_LIBRARY_DIRS})
+  HINTS ${CXSPARSE_LIBRARY_DIR_HINTS}
+  PATHS ${CXSPARSE_CHECK_LIBRARY_DIRS})
 if (NOT CXSPARSE_LIBRARY OR
     NOT EXISTS ${CXSPARSE_LIBRARY})
   cxsparse_report_not_found(
diff --git a/cmake/FindEigen.cmake b/cmake/FindEigen.cmake
index 348f043..f6d2664 100644
--- a/cmake/FindEigen.cmake
+++ b/cmake/FindEigen.cmake
@@ -195,8 +195,8 @@
   # Search supplied hint directories first if supplied.
   find_path(EIGEN_INCLUDE_DIR
     NAMES Eigen/Core
-    PATHS ${EIGEN_INCLUDE_DIR_HINTS}
-    ${EIGEN_CHECK_INCLUDE_DIRS}
+    HINTS ${EIGEN_INCLUDE_DIR_HINTS}
+    PATHS ${EIGEN_CHECK_INCLUDE_DIRS}
     PATH_SUFFIXES ${EIGEN_CHECK_PATH_SUFFIXES})
 
   if (NOT EIGEN_INCLUDE_DIR OR
@@ -258,5 +258,6 @@
 # Only mark internal variables as advanced if we found Eigen, otherwise
 # leave it visible in the standard GUI for the user to set manually.
 if (EIGEN_FOUND)
-  mark_as_advanced(FORCE EIGEN_INCLUDE_DIR)
+  mark_as_advanced(FORCE EIGEN_INCLUDE_DIR
+    Eigen3_DIR) # Autogenerated by find_package(Eigen3)
 endif (EIGEN_FOUND)
diff --git a/cmake/FindGflags.cmake b/cmake/FindGflags.cmake
index 0bd5c56..32c04ea 100644
--- a/cmake/FindGflags.cmake
+++ b/cmake/FindGflags.cmake
@@ -456,8 +456,8 @@
   # Search supplied hint directories first if supplied.
   find_path(GFLAGS_INCLUDE_DIR
     NAMES gflags/gflags.h
-    PATHS ${GFLAGS_INCLUDE_DIR_HINTS}
-    ${GFLAGS_CHECK_INCLUDE_DIRS}
+    HINTS ${GFLAGS_INCLUDE_DIR_HINTS}
+    PATHS ${GFLAGS_CHECK_INCLUDE_DIRS}
     PATH_SUFFIXES ${GFLAGS_CHECK_PATH_SUFFIXES})
   if (NOT GFLAGS_INCLUDE_DIR OR
       NOT EXISTS ${GFLAGS_INCLUDE_DIR})
@@ -468,8 +468,8 @@
     NOT EXISTS ${GFLAGS_INCLUDE_DIR})
 
   find_library(GFLAGS_LIBRARY NAMES gflags
-    PATHS ${GFLAGS_LIBRARY_DIR_HINTS}
-    ${GFLAGS_CHECK_LIBRARY_DIRS}
+    HINTS ${GFLAGS_LIBRARY_DIR_HINTS}
+    PATHS ${GFLAGS_CHECK_LIBRARY_DIRS}
     PATH_SUFFIXES ${GFLAGS_CHECK_LIBRARY_SUFFIXES})
   if (NOT GFLAGS_LIBRARY OR
       NOT EXISTS ${GFLAGS_LIBRARY})
diff --git a/cmake/FindGlog.cmake b/cmake/FindGlog.cmake
index a11ba2c..979dced 100644
--- a/cmake/FindGlog.cmake
+++ b/cmake/FindGlog.cmake
@@ -260,8 +260,8 @@
   # Search supplied hint directories first if supplied.
   find_path(GLOG_INCLUDE_DIR
     NAMES glog/logging.h
-    PATHS ${GLOG_INCLUDE_DIR_HINTS}
-    ${GLOG_CHECK_INCLUDE_DIRS}
+    HINTS ${GLOG_INCLUDE_DIR_HINTS}
+    PATHS ${GLOG_CHECK_INCLUDE_DIRS}
     PATH_SUFFIXES ${GLOG_CHECK_PATH_SUFFIXES})
   if (NOT GLOG_INCLUDE_DIR OR
       NOT EXISTS ${GLOG_INCLUDE_DIR})
@@ -272,8 +272,8 @@
     NOT EXISTS ${GLOG_INCLUDE_DIR})
 
   find_library(GLOG_LIBRARY NAMES glog
-    PATHS ${GLOG_LIBRARY_DIR_HINTS}
-    ${GLOG_CHECK_LIBRARY_DIRS}
+    HINTS ${GLOG_LIBRARY_DIR_HINTS}
+    PATHS ${GLOG_CHECK_LIBRARY_DIRS}
     PATH_SUFFIXES ${GLOG_CHECK_LIBRARY_SUFFIXES})
   if (NOT GLOG_LIBRARY OR
       NOT EXISTS ${GLOG_LIBRARY})
diff --git a/cmake/FindSuiteSparse.cmake b/cmake/FindSuiteSparse.cmake
index af1fb1d..db4cc3b 100644
--- a/cmake/FindSuiteSparse.cmake
+++ b/cmake/FindSuiteSparse.cmake
@@ -108,7 +108,9 @@
 #
 # == Intel Thread Building Blocks (TBB)
 # TBB_FOUND
-# TBB_LIBRARIES
+# TBB_LIBRARY
+# TBB_MALLOC_FOUND
+# TBB_MALLOC_LIBRARY
 
 # Reset CALLERS_CMAKE_FIND_LIBRARY_PREFIXES to its value when
 # FindSuiteSparse was invoked.
@@ -174,7 +176,6 @@
 # directories first if supplied, and search user-installed locations first
 # so that we prefer user installs to system installs where both exist.
 list(APPEND SUITESPARSE_CHECK_INCLUDE_DIRS
-  ${SUITESPARSE_INCLUDE_DIR_HINTS}
   /opt/local/include
   /opt/local/include/ufsparse # Mac OS X
   /usr/local/homebrew/include # Mac OS X
@@ -183,7 +184,6 @@
   /usr/include/suitesparse # Ubuntu
   /usr/include)
 list(APPEND SUITESPARSE_CHECK_LIBRARY_DIRS
-  ${SUITESPARSE_LIBRARY_DIR_HINTS}
   /opt/local/lib
   /opt/local/lib/ufsparse # Mac OS X
   /usr/local/homebrew/lib # Mac OS X
@@ -192,6 +192,67 @@
   /usr/lib/suitesparse # Ubuntu
   /usr/lib)
 
+# Wrappers to find_path/library that pass the SuiteSparse search hints/paths.
+#
+# suitesparse_find_component(<component> [FILES name1 [name2 ...]]
+#                                        [LIBRARIES name1 [name2 ...]]
+#                                        [REQUIRED])
+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 ${COMPONENT}_FOUND)
+  endif()
+
+  set(${COMPONENT}_FOUND TRUE)
+  if (SUITESPARSE_FIND_${COMPONENT}_FILES)
+    find_path(${COMPONENT}_INCLUDE_DIR
+      NAMES ${SUITESPARSE_FIND_${COMPONENT}_FILES}
+      HINTS ${SUITESPARSE_INCLUDE_DIR_HINTS}
+      PATHS ${SUITESPARSE_CHECK_INCLUDE_DIRS})
+    if (${COMPONENT}_INCLUDE_DIR)
+      message(STATUS "Found ${COMPONENT} headers in: "
+        "${${COMPONENT}_INCLUDE_DIR}")
+      mark_as_advanced(${COMPONENT}_INCLUDE_DIR)
+    else()
+      # Specified headers not found.
+      set(${COMPONENT}_FOUND FALSE)
+      if (SUITESPARSE_FIND_${COMPONENT}_REQUIRED)
+        suitesparse_report_not_found(
+          "Did not find ${COMPONENT} header (required SuiteSparse component).")
+      else()
+        message(STATUS "Did not find ${COMPONENT} header (optional "
+          "SuiteSparse component).")
+      endif()
+    endif()
+  endif()
+
+  if (SUITESPARSE_FIND_${COMPONENT}_LIBRARIES)
+    find_library(${COMPONENT}_LIBRARY
+      NAMES ${SUITESPARSE_FIND_${COMPONENT}_LIBRARIES}
+      HINTS ${SUITESPARSE_LIBRARY_DIR_HINTS}
+      PATHS ${SUITESPARSE_CHECK_LIBRARY_DIRS})
+    if (${COMPONENT}_LIBRARY)
+      message(STATUS "Found ${COMPONENT} library: ${${COMPONENT}_LIBRARY}")
+      mark_as_advanced(${COMPONENT}_LIBRARY)
+    else ()
+      # Specified libraries not found.
+      set(${COMPONENT}_FOUND FALSE)
+      if (SUITESPARSE_FIND_${COMPONENT}_REQUIRED)
+        suitesparse_report_not_found(
+          "Did not find ${COMPONENT} library (required SuiteSparse component).")
+      else()
+        message(STATUS "Did not find ${COMPONENT} library (optional SuiteSparse "
+          "dependency)")
+      endif()
+    endif()
+  endif()
+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
@@ -214,258 +275,66 @@
 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 (required SuiteSparse component).")
-  set(AMD_FOUND FALSE)
-endif (EXISTS ${AMD_LIBRARY})
-mark_as_advanced(AMD_LIBRARY)
-
-find_path(AMD_INCLUDE_DIR NAMES amd.h
-  PATHS ${SUITESPARSE_CHECK_INCLUDE_DIRS})
-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 (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 (required SuiteSparse component).")
-  set(CAMD_FOUND FALSE)
-endif (EXISTS ${CAMD_LIBRARY})
-mark_as_advanced(CAMD_LIBRARY)
-
-find_path(CAMD_INCLUDE_DIR NAMES camd.h
-  PATHS ${SUITESPARSE_CHECK_INCLUDE_DIRS})
-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 (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 (required SuiteSparse component).")
-  set(COLAMD_FOUND FALSE)
-endif (EXISTS ${COLAMD_LIBRARY})
-mark_as_advanced(COLAMD_LIBRARY)
-
-find_path(COLAMD_INCLUDE_DIR NAMES colamd.h
-  PATHS ${SUITESPARSE_CHECK_INCLUDE_DIRS})
-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 (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 (required SuiteSparse component).")
-  set(CCOLAMD_FOUND FALSE)
-endif (EXISTS ${CCOLAMD_LIBRARY})
-mark_as_advanced(CCOLAMD_LIBRARY)
-
-find_path(CCOLAMD_INCLUDE_DIR NAMES ccolamd.h
-  PATHS ${SUITESPARSE_CHECK_INCLUDE_DIRS})
-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 (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 (required SuiteSparse component).")
-  set(CHOLMOD_FOUND FALSE)
-endif (EXISTS ${CHOLMOD_LIBRARY})
-mark_as_advanced(CHOLMOD_LIBRARY)
-
-find_path(CHOLMOD_INCLUDE_DIR NAMES cholmod.h
-  PATHS ${SUITESPARSE_CHECK_INCLUDE_DIRS})
-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 (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 (required SuiteSparse component).")
-  set(SUITESPARSEQR_FOUND FALSE)
-endif (EXISTS ${SUITESPARSEQR_LIBRARY})
-mark_as_advanced(SUITESPARSEQR_LIBRARY)
-
-find_path(SUITESPARSEQR_INCLUDE_DIR NAMES SuiteSparseQR.hpp
-  PATHS ${SUITESPARSE_CHECK_INCLUDE_DIRS})
-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 (required SuiteSparse component).")
-  set(SUITESPARSEQR_FOUND FALSE)
-endif (EXISTS ${SUITESPARSEQR_INCLUDE_DIR})
-mark_as_advanced(SUITESPARSEQR_INCLUDE_DIR)
-
+suitesparse_find_component(AMD REQUIRED FILES amd.h LIBRARIES amd)
+suitesparse_find_component(CAMD REQUIRED FILES camd.h LIBRARIES camd)
+suitesparse_find_component(COLAMD REQUIRED FILES colamd.h LIBRARIES colamd)
+suitesparse_find_component(COLAMD REQUIRED FILES ccolamd.h LIBRARIES ccolamd)
+suitesparse_find_component(CHOLMOD REQUIRED FILES cholmod.h LIBRARIES cholmod)
+suitesparse_find_component(
+  SUITESPARSEQR REQUIRED FILES SuiteSparseQR.hpp LIBRARIES spqr)
 if (SUITESPARSEQR_FOUND)
   # 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.
-  set(TBB_FOUND TRUE)
-  find_library(TBB_LIBRARIES NAMES tbb
-    PATHS ${SUITESPARSE_CHECK_LIBRARY_DIRS})
-  if (EXISTS ${TBB_LIBRARIES})
-    message(STATUS "Found Intel Thread Building Blocks (TBB) library: "
-      "${TBB_LIBRARIES}, assuming SuiteSparseQR was compiled with TBB.")
-  else (EXISTS ${TBB_LIBRARIES})
-    message(STATUS "Did not find Intel TBB library, assuming SuiteSparseQR was "
-      "not compiled with TBB.")
-    set(TBB_FOUND FALSE)
-  endif (EXISTS ${TBB_LIBRARIES})
-  mark_as_advanced(TBB_LIBRARIES)
-
+  suitesparse_find_component(TBB LIBRARIES tbb)
   if (TBB_FOUND)
-    find_library(TBB_MALLOC_LIB NAMES tbbmalloc
-      PATHS ${SUITESPARSE_CHECK_LIBRARY_DIRS})
-    if (EXISTS ${TBB_MALLOC_LIB})
+    message(STATUS "Found Intel Thread Building Blocks (TBB) library: "
+      "${TBB_LIBRARY}, assuming SuiteSparseQR was compiled with TBB.")
+    suitesparse_find_component(TBB_MALLOC LIBRARIES tbbmalloc)
+    if (TBB_MALLOC_FOUND)
       message(STATUS "Found Intel Thread Building Blocks (TBB) Malloc library: "
-        "${TBB_MALLOC_LIB}")
-      # Append TBB malloc library to TBB libraries list whilst retaining
-      # any CMake generated help string (cache variable).
-      list(APPEND TBB_LIBRARIES ${TBB_MALLOC_LIB})
-      get_property(HELP_STRING CACHE TBB_LIBRARIES PROPERTY HELPSTRING)
-      set(TBB_LIBRARIES "${TBB_LIBRARIES}" CACHE STRING "${HELP_STRING}")
-
+        "${TBB_MALLOC_LIBRARY}")
       # Add the TBB libraries to the SuiteSparseQR libraries (the only
       # libraries to optionally depend on TBB).
-      list(APPEND SUITESPARSEQR_LIBRARY ${TBB_LIBRARIES})
-
-    else (EXISTS ${TBB_MALLOC_LIB})
-      # If we cannot find all required TBB components do not include it as
-      # a dependency.
+      list(APPEND SUITESPARSEQR_LIBRARY ${TBB_LIBRARY} ${TBB_MALLOC_LIBRARY})
+    else()
       message(STATUS "Did not find Intel Thread Building Blocks (TBB) Malloc "
         "Library, discarding TBB as a dependency.")
-      set(TBB_FOUND FALSE)
-    endif (EXISTS ${TBB_MALLOC_LIB})
-    mark_as_advanced(TBB_MALLOC_LIB)
-  endif (TBB_FOUND)
+    endif()
+  else()
+    message(STATUS "Did not find Intel TBB library, assuming SuiteSparseQR was "
+      "not compiled with TBB.")
+  endif()
 endif(SUITESPARSEQR_FOUND)
 
 # UFconfig / SuiteSparse_config.
 #
 # If SuiteSparse version is >= 4 then SuiteSparse_config is required.
 # For SuiteSparse 3, UFconfig.h is required.
-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}")
-endif (EXISTS ${SUITESPARSE_CONFIG_LIBRARY})
-mark_as_advanced(SUITESPARSE_CONFIG_LIBRARY)
+suitesparse_find_component(
+  SUITESPARSE_CONFIG FILES SuiteSparse_config.h LIBRARIES suitesparseconfig)
 
-find_path(SUITESPARSE_CONFIG_INCLUDE_DIR NAMES SuiteSparse_config.h
-  PATHS ${SUITESPARSE_CHECK_INCLUDE_DIRS})
-if (EXISTS ${SUITESPARSE_CONFIG_INCLUDE_DIR})
-  message(STATUS "Found SuiteSparse_config header in: "
-    "${SUITESPARSE_CONFIG_INCLUDE_DIR}")
-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)
+if (SUITESPARSE_CONFIG_FOUND)
   # 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 (CMAKE_SYSTEM_NAME MATCHES "Linux" OR UNIX AND NOT APPLE)
-    find_library(LIBRT_LIBRARY NAMES rt
-      PATHS ${SUITESPARSE_CHECK_LIBRARY_DIRS})
-    if (LIBRT_LIBRARY)
+    suitesparse_find_component(LIBRT LIBRARIES rt)
+    if (LIBRT_FOUND)
       message(STATUS "Adding librt: ${LIBRT_LIBRARY} to "
         "SuiteSparse_config libraries (required on Linux & Unix [not OSX] if "
         "SuiteSparse is compiled with timing).")
-    else (LIBRT_LIBRARY)
+      list(APPEND SUITESPARSE_CONFIG_LIBRARY ${LIBRT_LIBRARY})
+    else()
       message(STATUS "Could not find librt, but found SuiteSparse_config, "
         "assuming that SuiteSparse was compiled without timing.")
-    endif (LIBRT_LIBRARY)
-    mark_as_advanced(LIBRT_LIBRARY)
-    list(APPEND SUITESPARSE_CONFIG_LIBRARY ${LIBRT_LIBRARY})
+    endif ()
   endif (CMAKE_SYSTEM_NAME MATCHES "Linux" OR UNIX AND NOT APPLE)
-
-else (EXISTS ${SUITESPARSE_CONFIG_LIBRARY} AND
-      EXISTS ${SUITESPARSE_CONFIG_INCLUDE_DIR})
+else()
   # 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}")
-    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})
+  suitesparse_find_component(UFCONFIG FILES UFconfig.h)
+endif ()
 
 if (NOT SUITESPARSE_CONFIG_FOUND AND
     NOT UFCONFIG_FOUND)
@@ -473,8 +342,7 @@
     "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)
+endif()
 
 # Extract the SuiteSparse version from the appropriate header (UFconfig.h for
 # <= v3, SuiteSparse_config.h for >= v4).
@@ -548,16 +416,7 @@
 endif (SUITESPARSE_CONFIG_FOUND)
 
 # METIS (Optional dependency).
-find_library(METIS_LIBRARY NAMES metis
-  PATHS ${SUITESPARSE_CHECK_LIBRARY_DIRS})
-if (EXISTS ${METIS_LIBRARY})
-  message(STATUS "Found METIS library: ${METIS_LIBRARY}.")
-  set(METIS_FOUND TRUE)
-else (EXISTS ${METIS_LIBRARY})
-  message(STATUS "Did not find METIS library (optional SuiteSparse dependency)")
-  set(METIS_FOUND FALSE)
-endif (EXISTS ${METIS_LIBRARY})
-mark_as_advanced(METIS_LIBRARY)
+suitesparse_find_component(METIS LIBRARIES metis)
 
 # Only mark SuiteSparse as found if all required components and dependencies
 # have been found.
@@ -621,7 +480,6 @@
     # Any even moderately recent Ubuntu release (likely to be affected by
     # this bug) should have lsb_release, if it isn't present we are likely
     # on a different Linux distribution (should be fine).
-
     execute_process(COMMAND ${LSB_RELEASE_EXECUTABLE} -si
       OUTPUT_VARIABLE LSB_DISTRIBUTOR_ID
       OUTPUT_STRIP_TRAILING_WHITESPACE)