1. Changed the semantics of how SuiteSparse dependencies are checked and used. Now SuiteSparse is built by default, only if all of its

2. Corrected a number of typos and reorganized the CMakefile to handle the corner cases better.

3. Moved the various search paths to the top of the CMakefile so that they are more easily accessible.

4. Tests that depend on gflags are only built if gflags support is compiled in.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0002fbf..39d4c64 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,7 +28,7 @@
 #
 # Author: keir@google.com (Keir Mierle)
 
-CMAKE_MINIMUM_REQUIRED(VERSION 2.2)
+CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
 
 IF (COMMAND cmake_policy)
   CMAKE_POLICY(SET CMP0003 NEW)
@@ -42,140 +42,192 @@
        "Enable tests"
        ON)
 
-# Default locations to search for on various platforms.
-SET(SEARCH_LIBS
-    ${SEARCH_LIBS}
-    /usr/lib
-    /usr/local/lib
-    /usr/local/homebrew/lib     # Mac OS X
-    /opt/local/lib
-    )
-
-SET(SEARCH_HEADERS
-    ${SEARCH_HEADERS}
-    /usr/include
-    /usr/local/include
-    /usr/local/homebrew/include  # Mac OS X
-    /opt/local/include/
-    )
-
 # To get a more static build, try the following line on Mac and Linux:
 # SET(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
 
-# SuiteSparse
-OPTION(SUITESPARSE
-       "Enable SuiteSparse. Needed for efficient solutions of large problems."
-       ON)
+# Default locations to search for on various platforms.
+LIST(APPEND SEARCH_LIBS /usr/lib)
+LIST(APPEND SEARCH_LIBS /usr/local/lib)
+LIST(APPEND SEARCH_LIBS /usr/local/homebrew/lib) # Mac OS X
+LIST(APPEND SEARCH_LIBS /opt/local/lib)
 
-IF (SUITESPARSE)
-  SET(SUITESPARSE_SEARCH_LIBS
-      ${SEARCH_LIBS}
-      /usr/lib/suitesparse             # Ubuntu
-      /usr/local/lib/suitesparse
-      /opt/local/lib/ufsparse          # Mac OS X
-      )
-  SET(SUITESPARSE_SEARCH_HEADERS
-      ${SEARCH_HEADERS}
-      /usr/include/suitesparse         # Ubuntu
-      /usr/local/include/suitesparse,
-      /opt/local/include/ufsparse      # Mac os X
-      )
+LIST(APPEND SEARCH_HEADERS /usr/include)
+LIST(APPEND SEARCH_HEADERS /usr/local/include)
+LIST(APPEND SEARCH_HEADERS /usr/local/homebrew/include) # Mac OS X
+LIST(APPEND SEARCH_HEADERS /opt/local/include)
 
-  FIND_LIBRARY(AMD_LIB NAMES amd PATHS ${SUITESPARSE_SEARCH_LIBS})
-  FIND_PATH(AMD_INCLUDE NAMES amd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
-  IF (NOT EXISTS ${AMD_LIB} OR NOT EXISTS ${AMD_INCLUDE})
-    MESSAGE(FATAL_ERROR
-            "Can't find AMD (part of suitesparse.) "
-            "Please specify -DAMD_INCLUDE=... and -DAMD_LIB=...")
-  ENDIF (NOT EXISTS ${AMD_LIB} OR NOT EXISTS ${AMD_INCLUDE})
+# Locations to search for Eigen
+SET(EIGEN_SEARCH_HEADERS ${SEARCH_HEADERS})
+LIST(APPEND EIGEN_SEARCH_HEADERS /usr/include/eigen3) # Ubuntu 10.04's default location.
+LIST(APPEND EIGEN_SEARCH_HEADERS /usr/local/include/eigen3) 
+LIST(APPEND EIGEN_SEARCH_HEADERS /usr/local/homebrew/include/eigen3)  # Mac OS X
+LIST(APPEND EIGEN_SEARCH_HEADERS /opt/local/var/macports/software/eigen3/opt/local/include/eigen3) # Mac OS X
+
+# Locations to search for SuiteSparse
+SET(SUITESPARSE_SEARCH_LIBS ${SEARCH_LIBS})
+LIST(APPEND SUITESPARSE_SEARCH_LIBS /usr/lib/suitesparse) # Ubuntu
+LIST(APPEND SUITESPARSE_SEARCH_LIBS /usr/local/lib/suitesparse) 
+LIST(APPEND SUITESPARSE_SEARCH_LIBS /opt/local/lib/ufsparse) # Mac OS X
+
+SET(SUITESPARSE_SEARCH_HEADERS ${SEARCH_HEADERS})
+LIST(APPEND SUITESPARSE_SEARCH_HEADERS /usr/include/suitesparse) # Ubuntu
+LIST(APPEND SUITESPARSE_SEARCH_HEADERS /usr/local/include/suitesparse) 
+LIST(APPEND SUITESPARSE_SEARCH_HEADERS /opt/local/include/ufsparse) # Mac OS X
+
+# Check for SuiteSparse dependencies
+MESSAGE("-- Check for AMD")
+SET(AMD_FOUND TRUE)
+
+FIND_LIBRARY(AMD_LIB NAMES amd PATHS ${SUITESPARSE_SEARCH_LIBS})
+IF (EXISTS ${AMD_LIB}) 
   MESSAGE("-- Found AMD library: ${AMD_LIB}")
+ELSE (EXISTS ${AMD_LIB})
+  MESSAGE("-- Did not find AMD library")
+  SET(AMD_FOUND FALSE)
+ENDIF (EXISTS ${AMD_LIB})
+
+FIND_PATH(AMD_INCLUDE NAMES amd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
+IF (EXISTS ${AMD_INCLUDE}) 
   MESSAGE("-- Found AMD header in: ${AMD_INCLUDE}")
+ELSE (EXISTS ${AMD_INCLUDE})
+  MESSAGE("-- Did not find AMD header")
+  SET(AMD_FOUND FALSE)
+ENDIF (EXISTS ${AMD_INCLUDE})
 
-  MESSAGE("-- Check for CAMD")
-  FIND_LIBRARY(CAMD_LIB NAMES camd PATHS ${SUITESPARSE_SEARCH_LIBS})
-  FIND_PATH(CAMD_INCLUDE NAMES camd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
-  IF (NOT EXISTS ${CAMD_LIB} OR NOT EXISTS ${CAMD_INCLUDE})
-    MESSAGE(FATAL_ERROR
-            "Can't find CAMD (part of suitesparse.) "
-            "Please specify -DCAMD_INCLUDE=... and -DCAMD_LIB=...")
-  ENDIF (NOT EXISTS ${CAMD_LIB} OR NOT EXISTS ${CAMD_INCLUDE})
+MESSAGE("-- Check for CAMD")
+SET(CAMD_FOUND TRUE)
+
+FIND_LIBRARY(CAMD_LIB NAMES camd PATHS ${SUITESPARSE_SEARCH_LIBS})
+IF (EXISTS ${CAMD_LIB}) 
   MESSAGE("-- Found CAMD library: ${CAMD_LIB}")
+ELSE (EXISTS ${CAMD_LIB})
+  MESSAGE("-- Did not find CAMD library")
+  SET(CAMD_FOUND FALSE)
+ENDIF (EXISTS ${CAMD_LIB})
+
+FIND_PATH(CAMD_INCLUDE NAMES camd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
+IF (EXISTS ${CAMD_INCLUDE}) 
   MESSAGE("-- Found CAMD header in: ${CAMD_INCLUDE}")
+ELSE (EXISTS ${CAMD_INCLUDE})
+  MESSAGE("-- Did not find CAMD header")
+  SET(CAMD_FOUND FALSE)
+ENDIF (EXISTS ${CAMD_INCLUDE})
 
-  # Note: Even though Ceres doesn't directly depend on COLAMD,
-  # some symbols from COLAMD that are needed for linking.
-  MESSAGE("-- Check for COLAMD")
-  FIND_LIBRARY(COLAMD_LIB NAMES colamd PATHS ${SUITESPARSE_SEARCH_LIBS})
-  FIND_PATH(COLAMD_INCLUDE NAMES colamd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
-  IF (NOT EXISTS ${COLAMD_LIB} OR NOT EXISTS ${COLAMD_INCLUDE})
-    MESSAGE(FATAL_ERROR
-            "Can't find COLAMD (part of suitesparse.)"
-            "Please specify -DCOLAMD_INCLUDE=... and -DCOLAMD_LIB=...")
-  ENDIF (NOT EXISTS ${COLAMD_LIB} OR NOT EXISTS ${COLAMD_INCLUDE})
+MESSAGE("-- Check for COLAMD")
+SET(COLAMD_FOUND TRUE)
+
+FIND_LIBRARY(COLAMD_LIB NAMES colamd PATHS ${SUITESPARSE_SEARCH_LIBS})
+IF (EXISTS ${COLAMD_LIB}) 
   MESSAGE("-- Found COLAMD library: ${COLAMD_LIB}")
+ELSE (EXISTS ${COLAMD_LIB})
+  MESSAGE("-- Did not find COLAMD library")
+  SET(COLAMD_FOUND FALSE)
+ENDIF (EXISTS ${COLAMD_LIB})
+
+FIND_PATH(COLAMD_INCLUDE NAMES colamd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
+IF (EXISTS ${COLAMD_INCLUDE}) 
   MESSAGE("-- Found COLAMD header in: ${COLAMD_INCLUDE}")
+ELSE (EXISTS ${COLAMD_INCLUDE})
+  MESSAGE("-- Did not find COLAMD header")
+  SET(COLAMD_FOUND FALSE)
+ENDIF (EXISTS ${COLAMD_INCLUDE})
 
-  MESSAGE("-- Check for CCOLAMD")
-  FIND_LIBRARY(CCOLAMD_LIB NAMES ccolamd PATHS ${SUITESPARSE_SEARCH_LIBS})
-  FIND_PATH(CCOLAMD_INCLUDE NAMES ccolamd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
-  IF (NOT EXISTS ${CCOLAMD_LIB} OR NOT EXISTS ${CCOLAMD_INCLUDE})
-    MESSAGE(FATAL_ERROR
-            "Can't find CCOLAMD (part of suitesparse.)"
-            "Please specify -DCOLAMD_INCLUDE=... and -DCOLAMD_LIB=...")
-  ENDIF (NOT EXISTS ${CCOLAMD_LIB} OR NOT EXISTS ${CCOLAMD_INCLUDE})
+MESSAGE("-- Check for CCOLAMD")
+SET(CCOLAMD_FOUND TRUE)
+
+FIND_LIBRARY(CCOLAMD_LIB NAMES ccolamd PATHS ${SUITESPARSE_SEARCH_LIBS})
+IF (EXISTS ${CCOLAMD_LIB}) 
   MESSAGE("-- Found CCOLAMD library: ${CCOLAMD_LIB}")
+ELSE (EXISTS ${CCOLAMD_LIB})
+  MESSAGE("-- Did not find CCOLAMD library")
+  SET(CCOLAMD_FOUND FALSE)
+ENDIF (EXISTS ${CCOLAMD_LIB})
+
+FIND_PATH(CCOLAMD_INCLUDE NAMES ccolamd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
+IF (EXISTS ${CCOLAMD_INCLUDE}) 
   MESSAGE("-- Found CCOLAMD header in: ${CCOLAMD_INCLUDE}")
+ELSE (EXISTS ${CCOLAMD_INCLUDE})
+  MESSAGE("-- Did not find CCOLAMD header")
+  SET(CCOLAMD_FOUND FALSE)
+ENDIF (EXISTS ${CCOLAMD_INCLUDE})
 
-  MESSAGE("-- Check for CHOLMOD")
-  FIND_LIBRARY(CHOLMOD_LIB NAMES cholmod PATHS ${SUITESPARSE_SEARCH_LIBS})
-  FIND_PATH(CHOLMOD_INCLUDE NAMES cholmod.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
-  IF (NOT EXISTS ${CHOLMOD_LIB} OR NOT EXISTS ${CHOLMOD_INCLUDE})
-    MESSAGE(FATAL_ERROR
-            "Can't find CHOLMOD (part of suitesparse.)"
-            "Please specify -DCHOLMOD_INCLUDE=... and -DCHOLMOD_LIB=...")
-  ENDIF (NOT EXISTS ${CHOLMOD_LIB} OR NOT EXISTS ${CHOLMOD_INCLUDE})
+MESSAGE("-- Check for CHOLMOD")
+SET(CHOLMOD_FOUND TRUE)
+
+FIND_LIBRARY(CHOLMOD_LIB NAMES cholmod PATHS ${SUITESPARSE_SEARCH_LIBS})
+IF (EXISTS ${CHOLMOD_LIB}) 
   MESSAGE("-- Found CHOLMOD library: ${CHOLMOD_LIB}")
+ELSE (EXISTS ${CHOLMOD_LIB})
+  MESSAGE("-- Did not find CHOLMOD library")
+  SET(CHOLMOD_FOUND FALSE)
+ENDIF (EXISTS ${CHOLMOD_LIB})
+
+FIND_PATH(CHOLMOD_INCLUDE NAMES cholmod.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
+IF (EXISTS ${CHOLMOD_INCLUDE}) 
   MESSAGE("-- Found CHOLMOD header in: ${CHOLMOD_INCLUDE}")
+ELSE (EXISTS ${CHOLMOD_INCLUDE})
+  MESSAGE("-- Did not find CHOLMOD header")
+  SET(CHOLMOD_FOUND FALSE)
+ENDIF (EXISTS ${CHOLMOD_INCLUDE})
 
-  MESSAGE("-- Check for METIS (optional)")
-  FIND_LIBRARY(METIS_LIB NAMES metis PATHS ${SUITESPARSE_SEARCH_LIBS})
-  IF (NOT EXISTS ${METIS_LIB})
-    MESSAGE("   Can't find METIS; disabling. (part of suitesparse.)")
-  ELSE (NOT EXISTS ${METIS_LIB})
-    MESSAGE("-- Found METIS library: ${METIS_LIB}")
-  ENDIF (NOT EXISTS ${METIS_LIB})
+MESSAGE("-- Check for METIS (optional)")
+FIND_LIBRARY(METIS_LIB NAMES metis PATHS ${SUITESPARSE_SEARCH_LIBS})
 
-  MESSAGE("-- Check for LAPACK")
-  IF (APPLE)
-    # Mac OS X has LAPACK/BLAS bundled in a framework called "vecLib". Search for
-    # that instead of for the normal "lapack" library.
-    FIND_LIBRARY(LAPACK_LIB NAMES vecLib)
-  ELSE (APPLE)
-    FIND_LIBRARY(LAPACK_LIB NAMES lapack)
-  ENDIF (APPLE)
+IF (EXISTS ${METIS_LIB}) 
+  MESSAGE("-- Found METIS library: ${METIS_LIB}")
+ELSE (EXISTS ${METIS_LIB})
+  MESSAGE("-- Did not find METIS library")
+ENDIF (EXISTS ${METIS_LIB})
 
-  IF (NOT EXISTS ${LAPACK_LIB})
-    MESSAGE(FATAL_ERROR
-            "Can't find LAPACK "
-            "Please specify -DLAPACK_LIB=...")
-  ENDIF (NOT EXISTS ${LAPACK_LIB})
-  MESSAGE ("-- Found LAPACK library: ${LAPACK_LIB}")
+SET(BLAS_AND_LAPACK_FOUND TRUE)
+IF (APPLE)
+  # Mac OS X has LAPACK/BLAS bundled in a framework called
+  # "vecLib". Search for that instead of for the normal "lapack"
+  # library.
+  FIND_LIBRARY(LAPACK_LIB NAMES vecLib)
+ELSE (APPLE)
+  FIND_LIBRARY(BLAS_LIB NAMES blas)
+  IF (EXISTS ${BLAS_LIB}) 
+    MESSAGE("-- Found BLAS library: ${BLAS_LIB}")
+  ELSE (EXISTS ${BLAS_LIB})
+    MESSAGE("-- Did not find BLAS library")
+    SET(BLAS_AND_LAPACK_FOUND FALSE)
+  ENDIF (EXISTS ${BLAS_LIB})
+  FIND_LIBRARY(LAPACK_LIB NAMES lapack)
+ENDIF (APPLE)
 
-  # On Apple BLAS is linked with vecLib, so don't add it separately.
-  IF (NOT APPLE)
-    MESSAGE("-- Check for BLAS")
-    FIND_LIBRARY(BLAS_LIB NAMES blas)
-    IF (NOT EXISTS ${BLAS_LIB})
-      MESSAGE(FATAL_ERROR
-              "Can't find BLAS (needed for LAPACK and SuiteSparse.)"
-              "Please specify -DBLAS_LIB=...")
-    ENDIF (NOT EXISTS ${BLAS_LIB})
-    MESSAGE ("-- Found BLAS library: ${BLAS_LIB}")
-  ENDIF (NOT APPLE)
+IF (EXISTS ${LAPACK_LIB}) 
+  MESSAGE("-- Found LAPACK library: ${LAPACK_LIB}")
+ELSE (EXISTS ${LAPACK_LIB})
+  SET(BLAS_AND_LAPACK_FOUND FALSE)
+  MESSAGE("-- Did not find LAPACK library")
+ENDIF (EXISTS ${LAPACK_LIB})
 
-ELSE (SUITESPARSE)
-  ADD_DEFINITIONS(-DCERES_NO_SUITESPARSE)
-ENDIF (SUITESPARSE)
+SET(SUITESPARSE_FOUND 
+    AMD_FOUND AND
+    CAMD_FOUND AND
+    COLAMD_FOUND AND
+    CCOLAMD_FOUND AND
+    CHOLMOD_FOUND AND
+    BLAS_AND_LAPACK_FOUND)
+
+# By default, if all of SuiteSparse's dependencies are found, Ceres is
+# built with SuiteSparse support. -DSUITESPARSE=ON/OFF can be used to
+# enable/disable SuiteSparse explicitly.
+IF (DEFINED SUITESPARSE)
+  IF (SUITESPARSE AND NOT SUITESPARSE_FOUND)
+    MESSAGE(FATAL_ERROR "One or more of SuiteSparse's dependencies was not found")
+  ENDIF (SUITESPARSE AND NOT SUITESPARSE_FOUND)
+ELSE (DEFINED SUITESPARSE)
+  IF (SUITESPARSE_FOUND)
+    MESSAGE("-- Found all SuiteSparse dependencies. Building with SuiteSparse")
+    SET(SUITESPARSE ON)
+  ELSE (SUITESPARSE_FOUND)
+    MESSAGE("-- Did not find all SuiteSparse dependencies. Building without SuiteSparse")	
+    SET(SUITESPARSE OFF)
+    ADD_DEFINITIONS(-DCERES_NO_SUITESPARSE)
+  ENDIF (SUITESPARSE_FOUND)
+ENDIF (DEFINED SUITESPARSE)
 
 # Google Flags
 OPTION(GFLAGS
@@ -223,30 +275,25 @@
 
 # Eigen
 MESSAGE("-- Check for Eigen 3.0")
-SET(EIGEN_SEARCH_HEADERS
-    ${SEARCH_HEADERS}
-    /usr/include/eigen3  # Ubuntu 10.04's default location.
-    /usr/local/include/eigen3
-    /usr/local/homebrew/include/eigen3  # Mac OS X
-    /opt/local/var/macports/software/eigen3/opt/local/include/eigen3/
-    )
 FIND_PATH(EIGEN_INCLUDE NAMES Eigen/Core PATHS ${EIGEN_SEARCH_HEADERS})
 IF (NOT EXISTS ${EIGEN_INCLUDE})
   MESSAGE(FATAL_ERROR "Can't find Eigen. Try passing -DEIGEN_INCLUDE=...")
 ENDIF (NOT EXISTS ${EIGEN_INCLUDE})
 MESSAGE("-- Found Eigen 3.0: ${EIGEN_INCLUDE}")
 
+# Template specializations for the Schur complement based solvers. If
+# compile time, binary size or compiler performance is an issue, you
+# may consider disabling this.
 OPTION(SCHUR_SPECIALIZATIONS
        "Enable fixed-size schur specializations."
        ON)
 
 IF (NOT SCHUR_SPECIALIZATIONS)
-  # Disable fixed-size specializations of the schur complement solver, which
-  # requires multiple gigabytes of memory to compile.
   ADD_DEFINITIONS(-DCERES_RESTRICT_SCHUR_SPECIALIZATION)
   MESSAGE("-- Disabling Schur specializations (faster compiles)")
 ENDIF (NOT SCHUR_SPECIALIZATIONS)
 
+# Multithreading using OpenMP
 OPTION(OPENMP
        "Enable threaded solving in Ceres (requires OpenMP)"
        ON)
@@ -262,11 +309,11 @@
   ENDIF(OPENMP_FOUND)
 ENDIF (OPENMP)
 
+# Protocol buffers
 OPTION(PROTOBUF
        "Enable protocol buffers support."
        ON)
 
-# Protocol buffers support.
 IF (PROTOBUF)
   FIND_PACKAGE(Protobuf)
   IF (PROTOBUF_FOUND)
@@ -297,13 +344,17 @@
   include
   internal
   internal/ceres
-  ${AMD_INCLUDE}
-  ${COLAMD_INCLUDE}
-  ${CHOLMOD_INCLUDE}
   ${GLOG_INCLUDE}
-  ${GFLAGS_INCLUDE}
   ${EIGEN_INCLUDE}
-)
+  )
+
+IF (SUITESPARSE)
+  INCLUDE_DIRECTORIES(${CHOLMOD_INCLUDE})
+ENDIF(SUITESPARSE)
+
+IF (GFLAGS)
+  INCLUDE_DIRECTORIES(${GFLAGS_INCLUDE})
+ENDIF (GFLAGS)
 
 # Change the default build type from Debug to Release, while still
 # supporting overriding the build type.