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
This commit is contained in:
Alex Stewart
2013-11-05 13:10:27 +00:00
committed by Sameer Agarwal
parent 9ba0b352a2
commit b5be6b9c06
+89 -51
View File
@@ -121,6 +121,10 @@ MACRO(SUITESPARSE_REPORT_NOT_FOUND REASON_MSG)
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 @@ MACRO(SUITESPARSE_REPORT_NOT_FOUND REASON_MSG)
# 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 @@ LIST(APPEND SUITESPARSE_CHECK_LIBRARY_DIRS
/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 @@ IF (NOT LAPACK_FOUND)
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 @@ FIND_PATH(AMD_INCLUDE_DIR NAMES amd.h
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 @@ FIND_PATH(CAMD_INCLUDE_DIR NAMES camd.h
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 @@ FIND_PATH(COLAMD_INCLUDE_DIR NAMES colamd.h
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 @@ FIND_PATH(CCOLAMD_INCLUDE_DIR NAMES ccolamd.h
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 @@ FIND_PATH(CHOLMOD_INCLUDE_DIR NAMES cholmod.h
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 @@ FIND_PATH(SUITESPARSEQR_INCLUDE_DIR NAMES SuiteSparseQR.hpp
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 @@ ENDIF(SUITESPARSEQR_FOUND)
#
# 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 @@ FIND_PATH(SUITESPARSE_CONFIG_INCLUDE_DIR NAMES SuiteSparse_config.h
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 @@ IF (EXISTS ${SUITESPARSE_CONFIG_LIBRARY} AND
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 @@ ELSE (EXISTS ${METIS_LIBRARY})
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 @@ IF (AMD_FOUND AND
${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 @@ IF (AMD_FOUND AND
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 @@ ENDIF (CMAKE_SYSTEM_NAME MATCHES "Linux" AND
# 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)