Cmake refactoring 1. Use CMake FindLAPACK and FindBLAS Modules. 2. Remove SEARCH_HEADERS and SEARCH_LIBS and replace them with CMAKE variables. This leads to simplification of the FIND_LIBRARY and FIND_PATH calls. 3. Make miniglog a fallback when glog is not present and the user indicates MINIGLOG=OFF. 4. Add time.h to miniglog. 5. Remove shared library building. Change-Id: I8a97156d3d7cf645fbbfe8e571761bc16c89f43f
diff --git a/CMakeLists.txt b/CMakeLists.txt index a85bd14..06031ec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt
@@ -83,84 +83,84 @@ ENABLE_TESTING() -OPTION(BUILD_TESTING - "Enable tests" +OPTION(MINIGLOG "Use a stripped down version of glog" OFF) +OPTION(GFLAGS "Enable Google Flags." ON) +# 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) +OPTION(CUSTOM_BLAS + "Use handcoded BLAS routines (usually faster) instead of Eigen." ON) - -OPTION(BUILD_ANDROID - "Build for Android. Use build_android.sh instead of setting this." +# Multithreading using OpenMP +OPTION(OPENMP "Enable threaded solving in Ceres (requires OpenMP)" ON) +# TODO(sameeragarwal): Replace this with a positive option instead? +OPTION(DISABLE_TR1 + "Don't use TR1. This replaces some hash tables with sets. Slower." OFF) - -OPTION(BUILD_SHARED - "Build a dynamically linkable version of Ceres Solver." - ON) - -# To get a more static build, try the following line on Mac and Linux: -# SET(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) +# Line search minimizer is useful for large scale problems or when +# sparse linear algebra libraries are not available. If compile time, +# binary size or compiler performance is an issue, consider disabling +# this. +OPTION(LINE_SEARCH_MINIMIZER "Enable the line search minimizer." ON) +OPTION(BUILD_TESTING "Enable tests" ON) +OPTION(BUILD_DOCUMENTATION "Build User's Guide (html)" OFF) +OPTION(BUILD_EXAMPLES "Build examples" 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) -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) +# Libraries +LIST(APPEND CMAKE_LIBRARY_PATH /opt/local/lib) +LIST(APPEND CMAKE_LIBRARY_PATH /opt/local/lib/ufsparse) # Mac OS X +LIST(APPEND CMAKE_LIBRARY_PATH /usr/lib) +LIST(APPEND CMAKE_LIBRARY_PATH /usr/lib/suitesparse) # Ubuntu +LIST(APPEND CMAKE_LIBRARY_PATH /usr/local/homebrew/lib) # Mac OS X +LIST(APPEND CMAKE_LIBRARY_PATH /usr/local/lib) +LIST(APPEND CMAKE_LIBRARY_PATH /usr/local/lib/suitesparse) -# 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 +# Headers +LIST(APPEND CMAKE_INCLUDE_PATH /opt/local/include) +LIST(APPEND CMAKE_INCLUDE_PATH /opt/local/include/ufsparse) # Mac OS X +LIST(APPEND CMAKE_INCLUDE_PATH /opt/local/var/macports/software/eigen3/opt/local/include/eigen3) # Mac OS X +LIST(APPEND CMAKE_INCLUDE_PATH /usr/include) +LIST(APPEND CMAKE_INCLUDE_PATH /usr/include/eigen3) # Ubuntu 10.04's default location. +LIST(APPEND CMAKE_INCLUDE_PATH /usr/include/suitesparse) # Ubuntu +LIST(APPEND CMAKE_INCLUDE_PATH /usr/local/homebrew/include) # Mac OS X +LIST(APPEND CMAKE_INCLUDE_PATH /usr/local/homebrew/include/eigen3) # Mac OS X +LIST(APPEND CMAKE_INCLUDE_PATH /usr/local/include) +LIST(APPEND CMAKE_INCLUDE_PATH /usr/local/include/eigen3) +LIST(APPEND CMAKE_INCLUDE_PATH /usr/local/include/suitesparse) -# 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 - -SET(CXSPARSE_SEARCH_LIBS ${SEARCH_LIBS}) -SET(CXSPARSE_SEARCH_HEADERS ${SEARCH_HEADERS}) -LIST(APPEND CXSPARSE_SEARCH_HEADERS /usr/include/suitesparse) # Ubuntu +# Eigen +FIND_PATH(EIGEN_INCLUDE NAMES Eigen/Core) +IF (NOT EXISTS ${EIGEN_INCLUDE}) + MESSAGE(FATAL_ERROR "Can't find Eigen. Try passing -DEIGEN_INCLUDE=...") +ELSE (NOT EXISTS ${EIGEN_INCLUDE}) + MESSAGE("-- Found Eigen 3.x: ${EIGEN_INCLUDE}") +ENDIF (NOT EXISTS ${EIGEN_INCLUDE}) SET(BLAS_AND_LAPACK_FOUND TRUE) IF ((NOT DEFINED LAPACK) OR (DEFINED LAPACK AND LAPACK)) - MESSAGE("${LAPACK}") + FIND_PACKAGE(LAPACK) + IF (LAPACK_FOUND) + MESSAGE("-- Found LAPACK library: ${LAPACK_LIBRARIES}") + ELSE (LAPACK_FOUND) + MESSAGE("-- Did not find LAPACK library") + SET(BLAS_AND_LAPACK_FOUND FALSE) + ENDIF (LAPACK_FOUND) - 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) + FIND_PACKAGE(BLAS) + IF (BLAS_FOUND) + MESSAGE("-- Found BLAS library: ${BLAS_LIBRARIES}") + ELSE (BLAS_FOUND) + MESSAGE("-- Did not find BLAS library") + SET(BLAS_AND_BLAS_FOUND FALSE) + ENDIF (BLAS_FOUND) + ELSE ((NOT DEFINED LAPACK) OR (DEFINED LAPACK AND LAPACK)) SET(BLAS_AND_LAPACK_FOUND FALSE) ENDIF ((NOT DEFINED LAPACK) OR (DEFINED LAPACK AND LAPACK)) -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}) - IF (NOT BLAS_AND_LAPACK_FOUND) ADD_DEFINITIONS(-DCERES_NO_LAPACK) ENDIF (NOT BLAS_AND_LAPACK_FOUND) @@ -169,7 +169,7 @@ # Check for SuiteSparse dependencies SET(AMD_FOUND TRUE) -FIND_LIBRARY(AMD_LIB NAMES amd PATHS ${SUITESPARSE_SEARCH_LIBS}) +FIND_LIBRARY(AMD_LIB NAMES amd) IF (EXISTS ${AMD_LIB}) MESSAGE("-- Found AMD library: ${AMD_LIB}") ELSE (EXISTS ${AMD_LIB}) @@ -177,7 +177,7 @@ SET(AMD_FOUND FALSE) ENDIF (EXISTS ${AMD_LIB}) -FIND_PATH(AMD_INCLUDE NAMES amd.h PATHS ${SUITESPARSE_SEARCH_HEADERS}) +FIND_PATH(AMD_INCLUDE NAMES amd.h) IF (EXISTS ${AMD_INCLUDE}) MESSAGE("-- Found AMD header in: ${AMD_INCLUDE}") ELSE (EXISTS ${AMD_INCLUDE}) @@ -186,7 +186,7 @@ ENDIF (EXISTS ${AMD_INCLUDE}) SET(CAMD_FOUND TRUE) -FIND_LIBRARY(CAMD_LIB NAMES camd PATHS ${SUITESPARSE_SEARCH_LIBS}) +FIND_LIBRARY(CAMD_LIB NAMES camd) IF (EXISTS ${CAMD_LIB}) MESSAGE("-- Found CAMD library: ${CAMD_LIB}") ELSE (EXISTS ${CAMD_LIB}) @@ -194,7 +194,7 @@ SET(CAMD_FOUND FALSE) ENDIF (EXISTS ${CAMD_LIB}) -FIND_PATH(CAMD_INCLUDE NAMES camd.h PATHS ${SUITESPARSE_SEARCH_HEADERS}) +FIND_PATH(CAMD_INCLUDE NAMES camd.h) IF (EXISTS ${CAMD_INCLUDE}) MESSAGE("-- Found CAMD header in: ${CAMD_INCLUDE}") ELSE (EXISTS ${CAMD_INCLUDE}) @@ -203,7 +203,7 @@ ENDIF (EXISTS ${CAMD_INCLUDE}) SET(COLAMD_FOUND TRUE) -FIND_LIBRARY(COLAMD_LIB NAMES colamd PATHS ${SUITESPARSE_SEARCH_LIBS}) +FIND_LIBRARY(COLAMD_LIB NAMES colamd) IF (EXISTS ${COLAMD_LIB}) MESSAGE("-- Found COLAMD library: ${COLAMD_LIB}") ELSE (EXISTS ${COLAMD_LIB}) @@ -211,7 +211,7 @@ SET(COLAMD_FOUND FALSE) ENDIF (EXISTS ${COLAMD_LIB}) -FIND_PATH(COLAMD_INCLUDE NAMES colamd.h PATHS ${SUITESPARSE_SEARCH_HEADERS}) +FIND_PATH(COLAMD_INCLUDE NAMES colamd.h) IF (EXISTS ${COLAMD_INCLUDE}) MESSAGE("-- Found COLAMD header in: ${COLAMD_INCLUDE}") ELSE (EXISTS ${COLAMD_INCLUDE}) @@ -220,7 +220,7 @@ ENDIF (EXISTS ${COLAMD_INCLUDE}) SET(CCOLAMD_FOUND TRUE) -FIND_LIBRARY(CCOLAMD_LIB NAMES ccolamd PATHS ${SUITESPARSE_SEARCH_LIBS}) +FIND_LIBRARY(CCOLAMD_LIB NAMES ccolamd) IF (EXISTS ${CCOLAMD_LIB}) MESSAGE("-- Found CCOLAMD library: ${CCOLAMD_LIB}") ELSE (EXISTS ${CCOLAMD_LIB}) @@ -228,7 +228,7 @@ SET(CCOLAMD_FOUND FALSE) ENDIF (EXISTS ${CCOLAMD_LIB}) -FIND_PATH(CCOLAMD_INCLUDE NAMES ccolamd.h PATHS ${SUITESPARSE_SEARCH_HEADERS}) +FIND_PATH(CCOLAMD_INCLUDE NAMES ccolamd.h) IF (EXISTS ${CCOLAMD_INCLUDE}) MESSAGE("-- Found CCOLAMD header in: ${CCOLAMD_INCLUDE}") ELSE (EXISTS ${CCOLAMD_INCLUDE}) @@ -237,7 +237,7 @@ ENDIF (EXISTS ${CCOLAMD_INCLUDE}) SET(CHOLMOD_FOUND TRUE) -FIND_LIBRARY(CHOLMOD_LIB NAMES cholmod PATHS ${SUITESPARSE_SEARCH_LIBS}) +FIND_LIBRARY(CHOLMOD_LIB NAMES cholmod) IF (EXISTS ${CHOLMOD_LIB}) MESSAGE("-- Found CHOLMOD library: ${CHOLMOD_LIB}") ELSE (EXISTS ${CHOLMOD_LIB}) @@ -245,7 +245,7 @@ SET(CHOLMOD_FOUND FALSE) ENDIF (EXISTS ${CHOLMOD_LIB}) -FIND_PATH(CHOLMOD_INCLUDE NAMES cholmod.h PATHS ${SUITESPARSE_SEARCH_HEADERS}) +FIND_PATH(CHOLMOD_INCLUDE NAMES cholmod.h) IF (EXISTS ${CHOLMOD_INCLUDE}) MESSAGE("-- Found CHOLMOD header in: ${CHOLMOD_INCLUDE}") ELSE (EXISTS ${CHOLMOD_INCLUDE}) @@ -254,7 +254,7 @@ ENDIF (EXISTS ${CHOLMOD_INCLUDE}) SET(SUITESPARSEQR_FOUND TRUE) -FIND_LIBRARY(SUITESPARSEQR_LIB NAMES spqr PATHS ${SUITESPARSE_SEARCH_LIBS}) +FIND_LIBRARY(SUITESPARSEQR_LIB NAMES spqr) IF (EXISTS ${SUITESPARSEQR_LIB}) MESSAGE("-- Found SUITESPARSEQR library: ${SUITESPARSEQR_LIB}") ELSE (EXISTS ${SUITESPARSEQR_LIB}) @@ -262,7 +262,7 @@ SET(SUITESPARSEQR_FOUND FALSE) ENDIF (EXISTS ${SUITESPARSEQR_LIB}) -FIND_PATH(SUITESPARSEQR_INCLUDE NAMES SuiteSparseQR.hpp PATHS ${SUITESPARSE_SEARCH_HEADERS}) +FIND_PATH(SUITESPARSEQR_INCLUDE NAMES SuiteSparseQR.hpp) IF (EXISTS ${SUITESPARSEQR_INCLUDE}) MESSAGE("-- Found SUITESPARSEQR header in: ${SUITESPARSEQR_INCLUDE}") ELSE (EXISTS ${SUITESPARSEQR_INCLUDE}) @@ -275,18 +275,14 @@ SET(SUITESPARSE_CONFIG_FOUND TRUE) SET(UFCONFIG_FOUND TRUE) -FIND_LIBRARY(SUITESPARSE_CONFIG_LIB - NAMES suitesparseconfig - PATHS ${SUITESPARSE_SEARCH_LIBS}) +FIND_LIBRARY(SUITESPARSE_CONFIG_LIB NAMES suitesparseconfig) 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_HEADERS}) +FIND_PATH(SUITESPARSE_CONFIG_INCLUDE NAMES SuiteSparse_config.h) IF (EXISTS ${SUITESPARSE_CONFIG_INCLUDE}) MESSAGE("-- Found SuiteSparse_config header in: ${SUITESPARSE_CONFIG_INCLUDE}") SET(UFCONFIG_FOUND FALSE) @@ -294,20 +290,20 @@ MESSAGE("-- Did not find SuiteSparse_config header") ENDIF (EXISTS ${SUITESPARSE_CONFIG_INCLUDE}) -IF (NOT EXISTS ${SUITESPARSE_CONFIG_LIB} OR NOT EXISTS ${SUITESPARSE_CONFIG_INCLUDE}) +IF (NOT EXISTS ${SUITESPARSE_CONFIG_LIB} OR + NOT EXISTS ${SUITESPARSE_CONFIG_INCLUDE}) SET(SUITESPARSE_CONFIG_FOUND FALSE) - FIND_PATH(UFCONFIG_INCLUDE - NAMES UFconfig.h - PATHS ${SUITESPARSE_SEARCH_HEADERS}) + FIND_PATH(UFCONFIG_INCLUDE NAMES UFconfig.h) 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}) -ENDIF (NOT EXISTS ${SUITESPARSE_CONFIG_LIB} OR NOT EXISTS ${SUITESPARSE_CONFIG_INCLUDE}) +ENDIF (NOT EXISTS ${SUITESPARSE_CONFIG_LIB} OR + NOT EXISTS ${SUITESPARSE_CONFIG_INCLUDE}) -FIND_LIBRARY(METIS_LIB NAMES metis PATHS ${SUITESPARSE_SEARCH_LIBS}) +FIND_LIBRARY(METIS_LIB NAMES metis) IF (EXISTS ${METIS_LIB}) MESSAGE("-- Found METIS library: ${METIS_LIB}") ELSE (EXISTS ${METIS_LIB}) @@ -316,7 +312,7 @@ # SuiteSparseQR may be compiled with Intel Threading Building Blocks. SET(TBB_FOUND TRUE) -FIND_LIBRARY(TBB_LIB NAMES tbb PATHS ${SEARCH_LIBS}) +FIND_LIBRARY(TBB_LIB NAMES tbb) IF (EXISTS ${TBB_LIB}) MESSAGE("-- Found TBB library: ${TBB_LIB}") ELSE (EXISTS ${TBB_LIB}) @@ -324,7 +320,7 @@ SET(TBB_FOUND FALSE) ENDIF (EXISTS ${TBB_LIB}) -FIND_LIBRARY(TBB_MALLOC_LIB NAMES tbbmalloc PATHS ${SEARCH_LIBS}) +FIND_LIBRARY(TBB_MALLOC_LIB NAMES tbbmalloc) IF (EXISTS ${TBB_MALLOC_LIB}) MESSAGE("-- Found TBB Malloc library: ${TBB_MALLOC_LIB}") ELSE (EXISTS ${TBB_MALLOC_LIB}) @@ -383,7 +379,7 @@ IF ((NOT DEFINED CXSPARSE) OR (DEFINED CXSPARSE AND CXSPARSE)) SET(CXSPARSE_FOUND ON) -FIND_LIBRARY(CXSPARSE_LIB NAMES cxsparse PATHS ${CXSPARSE_SEARCH_LIBS}) +FIND_LIBRARY(CXSPARSE_LIB NAMES cxsparse) IF (EXISTS ${CXSPARSE_LIB}) MESSAGE("-- Found CXSparse library in: ${CXSPARSE_LIB}") ELSE (EXISTS ${CXSPARSE_LIB}) @@ -391,7 +387,7 @@ SET(CXSPARSE_FOUND FALSE) ENDIF (EXISTS ${CXSPARSE_LIB}) -FIND_PATH(CXSPARSE_INCLUDE NAMES cs.h PATHS ${CXSPARSE_SEARCH_HEADERS}) +FIND_PATH(CXSPARSE_INCLUDE NAMES cs.h) IF (EXISTS ${CXSPARSE_INCLUDE}) MESSAGE("-- Found CXSparse header in: ${CXSPARSE_INCLUDE}") ELSE (EXISTS ${CXSPARSE_INCLUDE}) @@ -419,20 +415,15 @@ ENDIF (CXSPARSE_FOUND) ENDIF (DEFINED CXSPARSE) -# Google Flags -OPTION(GFLAGS - "Enable Google Flags." - ON) - IF (GFLAGS) - FIND_LIBRARY(GFLAGS_LIB NAMES gflags PATHS ${SEARCH_LIBS}) + FIND_LIBRARY(GFLAGS_LIB NAMES gflags) IF (NOT EXISTS ${GFLAGS_LIB}) MESSAGE(FATAL_ERROR "Can't find Google Flags. Please specify: " "-DGFLAGS_LIB=...") ENDIF (NOT EXISTS ${GFLAGS_LIB}) MESSAGE("-- Found Google Flags library: ${GFLAGS_LIB}") - FIND_PATH(GFLAGS_INCLUDE NAMES gflags/gflags.h PATHS ${SEARCH_HEADERS}) + FIND_PATH(GFLAGS_INCLUDE NAMES gflags/gflags.h) IF (NOT EXISTS ${GFLAGS_INCLUDE}) MESSAGE(FATAL_ERROR "Can't find Google Flags. Please specify: " @@ -444,77 +435,44 @@ ADD_DEFINITIONS(-DCERES_NO_GFLAGS) ENDIF (GFLAGS) -# Google Logging -IF (NOT BUILD_ANDROID) - FIND_LIBRARY(GLOG_LIB NAMES glog PATHS ${SEARCH_LIBS}) - IF (NOT EXISTS ${GLOG_LIB}) - MESSAGE(FATAL_ERROR - "Can't find Google Log. Please specify: " - "-DGLOG_LIB=...") - ENDIF (NOT EXISTS ${GLOG_LIB}) - MESSAGE("-- Found Google Log library: ${GLOG_LIB}") - - FIND_PATH(GLOG_INCLUDE NAMES glog/logging.h PATHS ${SEARCH_HEADERS}) - IF (NOT EXISTS ${GLOG_INCLUDE}) - MESSAGE(FATAL_ERROR - "Can't find Google Log. Please specify: " - "-DGLOG_INCLUDE=...") - ENDIF (NOT EXISTS ${GLOG_INCLUDE}) - MESSAGE("-- Found Google Log header in: ${GLOG_INCLUDE}") -ELSE (NOT BUILD_ANDROID) +IF (MINIGLOG) SET(GLOG_LIB miniglog) - MESSAGE("-- Using minimal Glog substitute for Android (library): ${GLOG_LIB}") + MESSAGE("-- Using minimal Glog substitute (library): ${GLOG_LIB}") SET(GLOG_INCLUDE internal/ceres/miniglog) - MESSAGE("-- Using minimal Glog substitute for Android (include): ${GLOG_INCLUDE}") -ENDIF (NOT BUILD_ANDROID) + MESSAGE("-- Using minimal Glog substitute (include): ${GLOG_INCLUDE}") +ELSE (MINIGLOG) + FIND_LIBRARY(GLOG_LIB NAMES glog) + IF (EXISTS ${GLOG_LIB}) + MESSAGE("-- Found Google Log library: ${GLOG_LIB}") + ELSE (EXISTS ${GLOG_LIB}) + MESSAGE(FATAL_ERROR + "Can't find Google Log. Please specify: -DGLOG_LIB=...") + ENDIF (EXISTS ${GLOG_LIB}) -# Eigen -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=...") -ELSE (NOT EXISTS ${EIGEN_INCLUDE}) - MESSAGE("-- Found Eigen 3.x: ${EIGEN_INCLUDE}") -ENDIF (NOT EXISTS ${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) + FIND_PATH(GLOG_INCLUDE NAMES glog/logging.h) + IF (EXISTS ${GLOG_INCLUDE}) + MESSAGE("-- Found Google Log header in: ${GLOG_INCLUDE}") + ELSE (EXISTS ${GLOG_INCLUDE}) + MESSAGE(FATAL_ERROR + "Can't find Google Log. Please specify: -DGLOG_INCLUDE=...") + ENDIF (EXISTS ${GLOG_INCLUDE}) +ENDIF (MINIGLOG) IF (NOT SCHUR_SPECIALIZATIONS) ADD_DEFINITIONS(-DCERES_RESTRICT_SCHUR_SPECIALIZATION) MESSAGE("-- Disabling Schur specializations (faster compiles)") ENDIF (NOT SCHUR_SPECIALIZATIONS) -# Line search minimizer is useful for large scale problems or when -# sparse linear algebra libraries are not available. If compile time, -# binary size or compiler performance is an issue, consider disabling -# this. -OPTION(LINE_SEARCH_MINIMIZER - "Enable the line search minimizer." - ON) - IF (NOT LINE_SEARCH_MINIMIZER) ADD_DEFINITIONS(-DCERES_NO_LINE_SEARCH_MINIMIZER) MESSAGE("-- Disabling line search minimizer") ENDIF (NOT LINE_SEARCH_MINIMIZER) -OPTION(CUSTOM_BLAS - "Use handcoded BLAS routines (usually faster) instead of Eigen." - ON) - IF (NOT CUSTOM_BLAS) ADD_DEFINITIONS(-DCERES_NO_CUSTOM_BLAS) MESSAGE("-- Disabling custom blas") ENDIF (NOT CUSTOM_BLAS) -# Multithreading using OpenMP -OPTION(OPENMP - "Enable threaded solving in Ceres (requires OpenMP)" - ON) - IF (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") SET(OPENMP_FOUND FALSE) ELSE (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") @@ -543,17 +501,6 @@ ADD_DEFINITIONS(-DCERES_NO_THREADS) ENDIF (OPENMP_FOUND) -# Disable threads in mutex.h. Someday, after there is OpenMP support in -# Android, this can get removed. Also turn on a workaround for an NDK bug. -IF (BUILD_ANDROID) - ADD_DEFINITIONS(-DCERES_NO_THREADS) - ADD_DEFINITIONS(-DCERES_WORK_AROUND_ANDROID_NDK_COMPILER_BUG) -ENDIF (BUILD_ANDROID) - -OPTION(DISABLE_TR1 - "Don't use TR1. This replaces some hash tables with sets. Slower." - OFF) - IF (DISABLE_TR1) MESSAGE("-- Replacing unordered_map/set with map/set (warning: slower!)") ADD_DEFINITIONS(-DCERES_NO_TR1) @@ -647,25 +594,20 @@ IF (CMAKE_BUILD_TYPE STREQUAL "Release") IF (CMAKE_COMPILER_IS_GNUCXX) - IF (BUILD_ANDROID) - # TODO(keir): Figure out what flags should go here to make an optimized - # native ARM binary for Android. - ELSE (BUILD_ANDROID) - # Linux - IF (CMAKE_SYSTEM_NAME MATCHES "Linux") - SET (CERES_CXX_FLAGS "${CERES_CXX_FLAGS} -march=native -mtune=native") - ENDIF (CMAKE_SYSTEM_NAME MATCHES "Linux") - # Mac OS X - IF (CMAKE_SYSTEM_NAME MATCHES "Darwin") - SET (CERES_CXX_FLAGS "${CERES_CXX_FLAGS} -msse3") - # Use of -fast only applicable for Apple's GCC - # Assume this is being used if GCC version < 4.3 on OSX - EXECUTE_PROCESS(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) - IF (GCC_VERSION VERSION_LESS 4.3) - SET (CERES_CXX_FLAGS "${CERES_CXX_FLAGS} -fast") - ENDIF (GCC_VERSION VERSION_LESS 4.3) - ENDIF (CMAKE_SYSTEM_NAME MATCHES "Darwin") - ENDIF (BUILD_ANDROID) + # Linux + IF (CMAKE_SYSTEM_NAME MATCHES "Linux") + SET (CERES_CXX_FLAGS "${CERES_CXX_FLAGS} -march=native -mtune=native") + ENDIF (CMAKE_SYSTEM_NAME MATCHES "Linux") + # Mac OS X + IF (CMAKE_SYSTEM_NAME MATCHES "Darwin") + SET (CERES_CXX_FLAGS "${CERES_CXX_FLAGS} -msse3") + # Use of -fast only applicable for Apple's GCC + # Assume this is being used if GCC version < 4.3 on OSX + EXECUTE_PROCESS(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) + IF (GCC_VERSION VERSION_LESS 4.3) + SET (CERES_CXX_FLAGS "${CERES_CXX_FLAGS} -fast") + ENDIF (GCC_VERSION VERSION_LESS 4.3) + ENDIF (CMAKE_SYSTEM_NAME MATCHES "Darwin") ENDIF (CMAKE_COMPILER_IS_GNUCXX) IF (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") # Use of -O4 requires use of gold linker & LLVM-gold plugin, which might @@ -733,10 +675,6 @@ ADD_SUBDIRECTORY(internal/ceres) -OPTION(BUILD_DOCUMENTATION - "Build User's Guide (html)" - OFF) - IF (BUILD_DOCUMENTATION) MESSAGE("-- Documentation building is enabled") @@ -748,8 +686,6 @@ ADD_SUBDIRECTORY(docs) ENDIF (BUILD_DOCUMENTATION) -OPTION(BUILD_EXAMPLES "Build examples" ON) - IF (BUILD_EXAMPLES) MESSAGE("-- Build the examples.") ADD_SUBDIRECTORY(examples)
diff --git a/cmake/CeresConfig.cmake.in b/cmake/CeresConfig.cmake.in index 8ec5677..d000046 100644 --- a/cmake/CeresConfig.cmake.in +++ b/cmake/CeresConfig.cmake.in
@@ -47,4 +47,3 @@ # Set the expected library variable SET(CERES_LIBRARIES ceres) -SET(CERES_LIBRARIES_SHARED ceres_shared)
diff --git a/docs/source/version_history.rst b/docs/source/version_history.rst index bddbbd7..a781186 100644 --- a/docs/source/version_history.rst +++ b/docs/source/version_history.rst
@@ -31,6 +31,7 @@ #. Use of Inner iterations can now be adaptively stopped. Iteration and runtime statistics for inner iterations are not reported in ``Solver::Summary`` and ``Solver::Summary::FullReport``. +#. Improved inner iteration step acceptance criterion. #. Add BlockRandomAccessCRSMatrix. #. Speeded up automatic differentiation by 7\%. #. Bundle adjustment example from libmv/Blender (Sergey Sharybin) @@ -40,9 +41,13 @@ #. Ability to write trust region problems to disk. #. Add sinh, cosh, tanh and tan functions to automatic differentiation (Johannes Schönberger) +#. Simplifications to the cmake build file. +#. ``miniglog`` can now be used as a replacement for ``google-glog`` + on non Android platforms. (This is NOT recommended). Bug Fixes --------- +#. Fix how ceres calls CAMD (Manas Jagadev) #. Fix breakage on old versions of SuiteSparse. (Fisher Yu) #. Fix warning C4373 in Visual Studio (Petter Strandmark) #. Fix compilation error caused by missing suitesparse headers and
diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt index 9138c0d..7562f5c 100644 --- a/internal/ceres/CMakeLists.txt +++ b/internal/ceres/CMakeLists.txt
@@ -132,20 +132,14 @@ ENDIF (SCHUR_SPECIALIZATIONS) # For Android, use the internal Glog implementation. -IF (BUILD_ANDROID) - ADD_LIBRARY(miniglog STATIC - miniglog/glog/logging.cc) - - # The Android logging library that defines e.g. __android_log_print is - # creatively named "log". - TARGET_LINK_LIBRARIES(miniglog log) - +IF (MINIGLOG) + ADD_LIBRARY(miniglog STATIC miniglog/glog/logging.cc) INSTALL(TARGETS miniglog EXPORT CeresExport RUNTIME DESTINATION bin LIBRARY DESTINATION lib${LIB_SUFFIX} ARCHIVE DESTINATION lib${LIB_SUFFIX}) -ENDIF (BUILD_ANDROID) +ENDIF (MINIGLOG) SET(CERES_LIBRARY_DEPENDENCIES ${GLOG_LIB}) @@ -179,11 +173,8 @@ ENDIF (CXSPARSE_FOUND) IF (BLAS_AND_LAPACK_FOUND) - LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${LAPACK_LIB}) - - IF (EXISTS ${BLAS_LIB}) - LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${BLAS_LIB}) - ENDIF (EXISTS ${BLAS_LIB}) + LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${LAPACK_LIBRARIES}) + LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${BLAS_LIBRARIES}) ENDIF (BLAS_AND_LAPACK_FOUND) IF (CXSPARSE_FOUND) @@ -201,7 +192,7 @@ ${CERES_INTERNAL_HDRS} ${CERES_INTERNAL_SCHUR_FILES}) -ADD_LIBRARY(ceres STATIC ${CERES_LIBRARY_SOURCE}) +ADD_LIBRARY(ceres ${CERES_LIBRARY_SOURCE}) TARGET_LINK_LIBRARIES(ceres ${CERES_LIBRARY_DEPENDENCIES}) INSTALL(TARGETS ceres @@ -210,23 +201,6 @@ LIBRARY DESTINATION lib${LIB_SUFFIX} ARCHIVE DESTINATION lib${LIB_SUFFIX}) -# Don't build a DLL on MSVC. Supporting Ceres as a DLL on Windows involves -# nontrivial changes that we haven't made yet. -IF (NOT MSVC AND NOT BUILD_ANDROID AND BUILD_SHARED) - ADD_LIBRARY(ceres_shared SHARED ${CERES_LIBRARY_SOURCE}) - TARGET_LINK_LIBRARIES(ceres_shared ${CERES_LIBRARY_DEPENDENCIES}) - SET_TARGET_PROPERTIES(ceres_shared PROPERTIES - VERSION ${CERES_VERSION} - SOVERSION ${CERES_ABI_VERSION}) - - INSTALL(TARGETS ceres_shared - EXPORT CeresExport - RUNTIME DESTINATION bin - LIBRARY DESTINATION lib${LIB_SUFFIX} - ARCHIVE DESTINATION lib${LIB_SUFFIX}) - -ENDIF (NOT MSVC AND NOT BUILD_ANDROID AND BUILD_SHARED) - IF (BUILD_TESTING AND GFLAGS) ADD_LIBRARY(gtest gmock_gtest_all.cc gmock_main.cc) ADD_LIBRARY(test_util @@ -235,6 +209,7 @@ test_util.cc) TARGET_LINK_LIBRARIES(gtest ${GFLAGS_LIB} ${GLOG_LIB}) + TARGET_LINK_LIBRARIES(test_util ceres gtest ${GLOG_LIB}) MACRO (CERES_TEST NAME) ADD_EXECUTABLE(${NAME}_test ${NAME}_test.cc)
diff --git a/internal/ceres/c_api.cc b/internal/ceres/c_api.cc index 02bc129..1fd01c9 100644 --- a/internal/ceres/c_api.cc +++ b/internal/ceres/c_api.cc
@@ -49,7 +49,8 @@ void ceres_init() { // This is not ideal, but it's not clear what to do if there is no gflags and // no access to command line arguments. - google::InitGoogleLogging("<unknown>"); + char message[] = "<unknown>"; + google::InitGoogleLogging(message); } ceres_problem_t* ceres_create_problem() { @@ -172,7 +173,7 @@ void ceres_solve(ceres_problem_t* c_problem) { Problem* problem = reinterpret_cast<Problem*>(c_problem); - + // TODO(keir): Obviously, this way of setting options won't scale or last. // Instead, figure out a way to specify some of the options without // duplicating everything.
diff --git a/internal/ceres/miniglog/glog/logging.h b/internal/ceres/miniglog/glog/logging.h index 1fc137b..13e8e2d 100644 --- a/internal/ceres/miniglog/glog/logging.h +++ b/internal/ceres/miniglog/glog/logging.h
@@ -97,11 +97,12 @@ #endif // ANDROID #include <algorithm> -#include <iostream> -#include <string> +#include <ctime> #include <fstream> +#include <iostream> #include <set> #include <sstream> +#include <string> #include <vector> // Log severity level constants.