Add UFconfig and/or SuiteSparse_config test to CMakeLists.txt

SuiteSparse 4 requires linking to libsuitesparseconfig.a.
Both SuiteSparse 3 and SuiteSparse 4 require an additional header
(either UFconfig.h or SuiteSparse_config.h) that is not found if it is
in a separate path. Therefore, add explicit checks.

Change-Id: I699902b5db4f1b7f17134b5a54f9aa681445e294
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3ae2595..472ca1f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -188,6 +188,46 @@
   SET(CHOLMOD_FOUND FALSE)
 ENDIF (EXISTS ${CHOLMOD_INCLUDE})
 
+# If SuiteSparse version is >= 4 then SuiteSparse_config is required.
+# For SuiteSparse 3, UFconfig.h is required.
+MESSAGE("-- Check for SuiteSparse_config (SuiteSparse v4)")
+SET(SUITESPARSE_CONFIG_FOUND TRUE)
+
+FIND_LIBRARY(SUITESPARSE_CONFIG_LIB
+             NAMES suitesparseconfig
+             PATHS ${SUITESPARSE_SEARCH_LIBS})
+IF (EXISTS ${SUITESPARSE_CONFIG_LIB})
+  MESSAGE("-- Found SuiteSparse_config library: ${SUITESPARSE_CONFIG_LIB}")
+ELSE (EXISTS ${SUITESPARSE_CONFIG_LIB})
+  MESSAGE("-- Did not find SuiteSparse_config library")
+ENDIF (EXISTS ${SUITESPARSE_CONFIG_LIB})
+
+FIND_PATH(SUITESPARSE_CONFIG_INCLUDE
+          NAMES SuiteSparse_config.h
+          PATHS ${SUITESPARSE_SEARCH_INCLUDES})
+IF (EXISTS ${SUITESPARSE_CONFIG_INCLUDE})
+  MESSAGE("-- Found SuiteSparse_config header in: ${SUITESPARSE_CONFIG_INCLUDE}")
+ELSE (EXISTS ${SUITESPARSE_CONFIG_INCLUDE})
+  MESSAGE("-- Did not find SuiteSparse_config header")
+ENDIF (EXISTS ${SUITESPARSE_CONFIG_INCLUDE})
+
+IF (NOT EXISTS ${SUITESPARSE_CONFIG_LIB} OR NOT EXISTS ${SUITESPARSE_CONFIG_INCLUDE})
+  SET(SUITESPARSE_CONFIG_FOUND FALSE)
+ENDIF (NOT EXISTS ${SUITESPARSE_CONFIG_LIB} OR NOT EXISTS ${SUITESPARSE_CONFIG_INCLUDE})
+
+MESSAGE("-- Check for UFconfig (SuiteSparse v3)")
+SET(UFCONFIG_FOUND TRUE)
+
+FIND_PATH(UFCONFIG_INCLUDE
+          NAMES UFconfig.h
+          PATHS ${SUITESPARSE_SEARCH_INCLUDES})
+IF (EXISTS ${UFCONFIG_INCLUDE})
+  MESSAGE("-- Found UFconfig header in: ${UFCONFIG_INCLUDE}")
+ELSE (EXISTS ${UFCONFIG_INCLUDE})
+  MESSAGE("-- Did not find UFconfig header")
+  SET(UFCONFIG_FOUND FALSE)
+ENDIF (EXISTS ${UFCONFIG_INCLUDE})
+
 MESSAGE("-- Check for METIS (optional)")
 FIND_LIBRARY(METIS_LIB NAMES metis PATHS ${SUITESPARSE_SEARCH_LIBS})
 
@@ -227,6 +267,7 @@
     ${COLAMD_FOUND} AND
     ${CCOLAMD_FOUND} AND
     ${CHOLMOD_FOUND} AND
+    (${SUITESPARSE_CONFIG_FOUND} OR ${UFCONFIG_FOUND}) AND
     ${BLAS_AND_LAPACK_FOUND})
 
 # By default, if all of SuiteSparse's dependencies are found, Ceres is
@@ -444,7 +485,17 @@
   )
 
 IF (${SUITESPARSE})
+  INCLUDE_DIRECTORIES(${AMD_INCLUDE})
+  INCLUDE_DIRECTORIES(${CAMD_INCLUDE})
+  INCLUDE_DIRECTORIES(${COLAMD_INCLUDE})
+  INCLUDE_DIRECTORIES(${CCOLAMD_INCLUDE})
   INCLUDE_DIRECTORIES(${CHOLMOD_INCLUDE})
+  IF (${SUITESPARSE_CONFIG_FOUND})
+    INCLUDE_DIRECTORIES(${SUITESPARSE_CONFIG_INCLUDE})
+  ENDIF (${SUITESPARSE_CONFIG_FOUND})
+  IF (${UFCONFIG_FOUND})
+    INCLUDE_DIRECTORIES(${UFCONFIG_INCLUDE})
+  ENDIF (${UFCONFIG_FOUND})
 ENDIF(${SUITESPARSE})
 
 IF (${CXSPARSE})
diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt
index 1c1d4cd..6f35e96 100644
--- a/internal/ceres/CMakeLists.txt
+++ b/internal/ceres/CMakeLists.txt
@@ -125,6 +125,9 @@
   LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${CAMD_LIB})
   LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${COLAMD_LIB})
   LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${AMD_LIB})
+  IF (EXISTS ${SUITESPARSE_CONFIG_LIB})
+    LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${SUITESPARSE_CONFIG_LIB})
+  ENDIF (EXISTS ${SUITESPARSE_CONFIG_LIB})
 
   IF (EXISTS ${METIS_LIB})
     LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${METIS_LIB})