1 # Ceres Solver - A fast non-linear least squares minimizer 2 # Copyright 2010, 2011, 2012 Google Inc. All rights reserved. 3 # http://code.google.com/p/ceres-solver/ 4 # 5 # Redistribution and use in source and binary forms, with or without 6 # modification, are permitted provided that the following conditions are met: 7 # 8 # * Redistributions of source code must retain the above copyright notice, 9 # this list of conditions and the following disclaimer. 10 # * Redistributions in binary form must reproduce the above copyright notice, 11 # this list of conditions and the following disclaimer in the documentation 12 # and/or other materials provided with the distribution. 13 # * Neither the name of Google Inc. nor the names of its contributors may be 14 # used to endorse or promote products derived from this software without 15 # specific prior written permission. 16 # 17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 21 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27 # POSSIBILITY OF SUCH DAMAGE. 28 # 29 # Author: keir (a] google.com (Keir Mierle) 30 31 SET(CERES_INTERNAL_SRC 32 array_utils.cc 33 blas.cc 34 block_evaluate_preparer.cc 35 block_jacobi_preconditioner.cc 36 block_jacobian_writer.cc 37 block_random_access_crs_matrix.cc 38 block_random_access_dense_matrix.cc 39 block_random_access_matrix.cc 40 block_random_access_sparse_matrix.cc 41 block_sparse_matrix.cc 42 block_structure.cc 43 c_api.cc 44 canonical_views_clustering.cc 45 cgnr_solver.cc 46 compressed_col_sparse_matrix_utils.cc 47 compressed_row_jacobian_writer.cc 48 compressed_row_sparse_matrix.cc 49 conditioned_cost_function.cc 50 conjugate_gradients_solver.cc 51 coordinate_descent_minimizer.cc 52 corrector.cc 53 covariance.cc 54 covariance_impl.cc 55 cxsparse.cc 56 dense_normal_cholesky_solver.cc 57 dense_qr_solver.cc 58 dense_sparse_matrix.cc 59 detect_structure.cc 60 dogleg_strategy.cc 61 evaluator.cc 62 file.cc 63 gradient_checking_cost_function.cc 64 implicit_schur_complement.cc 65 incomplete_lq_factorization.cc 66 iterative_schur_complement_solver.cc 67 levenberg_marquardt_strategy.cc 68 lapack.cc 69 line_search.cc 70 line_search_direction.cc 71 line_search_minimizer.cc 72 linear_least_squares_problems.cc 73 linear_operator.cc 74 linear_solver.cc 75 local_parameterization.cc 76 loss_function.cc 77 low_rank_inverse_hessian.cc 78 minimizer.cc 79 normal_prior.cc 80 parameter_block_ordering.cc 81 partitioned_matrix_view.cc 82 polynomial.cc 83 preconditioner.cc 84 problem.cc 85 problem_impl.cc 86 program.cc 87 residual_block.cc 88 residual_block_utils.cc 89 runtime_numeric_diff_cost_function.cc 90 schur_complement_solver.cc 91 schur_eliminator.cc 92 schur_jacobi_preconditioner.cc 93 scratch_evaluate_preparer.cc 94 solver.cc 95 solver_impl.cc 96 sparse_matrix.cc 97 sparse_normal_cholesky_solver.cc 98 split.cc 99 stringprintf.cc 100 suitesparse.cc 101 triplet_sparse_matrix.cc 102 trust_region_minimizer.cc 103 trust_region_strategy.cc 104 types.cc 105 visibility.cc 106 visibility_based_preconditioner.cc 107 wall_time.cc 108 ) 109 110 # Heuristic for determining LIB_SUFFIX. FHS recommends that 64-bit systems 111 # install native libraries to lib64 rather than lib. Most distros seem to 112 # follow this convention with a couple notable exceptions (Debian-based and 113 # Arch-based distros) which we try to detect here. 114 IF (CMAKE_SYSTEM_NAME MATCHES "Linux" AND 115 NOT DEFINED LIB_SUFFIX AND 116 NOT CMAKE_CROSSCOMPILING AND 117 CMAKE_SIZEOF_VOID_P EQUAL "8" AND 118 NOT EXISTS "/etc/debian_version" AND 119 NOT EXISTS "/etc/arch-release") 120 SET(LIB_SUFFIX "64") 121 ENDIF () 122 123 # Also depend on the header files so that they appear in IDEs. 124 FILE(GLOB CERES_INTERNAL_HDRS *.h) 125 126 # Include the specialized schur solvers. 127 IF (SCHUR_SPECIALIZATIONS) 128 FILE(GLOB CERES_INTERNAL_SCHUR_FILES generated/*.cc) 129 ELSE (SCHUR_SPECIALIZATIONS) 130 # Only the fully dynamic solver. The build is much faster this way. 131 FILE(GLOB CERES_INTERNAL_SCHUR_FILES generated/schur_eliminator_d_d_d.cc) 132 ENDIF (SCHUR_SPECIALIZATIONS) 133 134 # For Android, use the internal Glog implementation. 135 IF (MINIGLOG) 136 ADD_LIBRARY(miniglog STATIC miniglog/glog/logging.cc) 137 INSTALL(TARGETS miniglog 138 EXPORT CeresExport 139 RUNTIME DESTINATION bin 140 LIBRARY DESTINATION lib${LIB_SUFFIX} 141 ARCHIVE DESTINATION lib${LIB_SUFFIX}) 142 ENDIF (MINIGLOG) 143 144 SET(CERES_LIBRARY_DEPENDENCIES ${GLOG_LIB}) 145 146 IF (GFLAGS) 147 LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${GFLAGS_LIB}) 148 ENDIF (GFLAGS) 149 150 IF (SUITESPARSE_FOUND) 151 LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${SUITESPARSEQR_LIB}) 152 LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${CHOLMOD_LIB}) 153 LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${CCOLAMD_LIB}) 154 LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${CAMD_LIB}) 155 LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${COLAMD_LIB}) 156 LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${AMD_LIB}) 157 IF (EXISTS ${SUITESPARSE_CONFIG_LIB}) 158 LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${SUITESPARSE_CONFIG_LIB}) 159 ENDIF (EXISTS ${SUITESPARSE_CONFIG_LIB}) 160 161 IF (EXISTS ${METIS_LIB}) 162 LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${METIS_LIB}) 163 ENDIF (EXISTS ${METIS_LIB}) 164 165 IF (TBB_FOUND) 166 LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${TBB_LIB}) 167 LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${TBB_MALLOC_LIB}) 168 ENDIF (TBB_FOUND) 169 ENDIF (SUITESPARSE_FOUND) 170 171 IF (CXSPARSE_FOUND) 172 LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${CXSPARSE_LIB}) 173 ENDIF (CXSPARSE_FOUND) 174 175 IF (BLAS_AND_LAPACK_FOUND) 176 LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${LAPACK_LIBRARIES}) 177 LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${BLAS_LIBRARIES}) 178 ENDIF (BLAS_AND_LAPACK_FOUND) 179 180 IF (CXSPARSE_FOUND) 181 LIST(APPEND CERES_LIBRARY_DEPENDENCIES ${CXSPARSE_LIB}) 182 ENDIF (CXSPARSE_FOUND) 183 184 IF (OPENMP_FOUND) 185 IF (NOT MSVC) 186 LIST(APPEND CERES_LIBRARY_DEPENDENCIES gomp) 187 ENDIF (NOT MSVC) 188 ENDIF (OPENMP_FOUND) 189 190 SET(CERES_LIBRARY_SOURCE 191 ${CERES_INTERNAL_SRC} 192 ${CERES_INTERNAL_HDRS} 193 ${CERES_INTERNAL_SCHUR_FILES}) 194 195 ADD_LIBRARY(ceres ${CERES_LIBRARY_SOURCE}) 196 SET_TARGET_PROPERTIES(ceres PROPERTIES 197 VERSION ${CERES_VERSION} 198 SOVERSION ${CERES_VERSION_MAJOR} 199 ) 200 TARGET_LINK_LIBRARIES(ceres ${CERES_LIBRARY_DEPENDENCIES}) 201 202 INSTALL(TARGETS ceres 203 EXPORT CeresExport 204 RUNTIME DESTINATION bin 205 LIBRARY DESTINATION lib${LIB_SUFFIX} 206 ARCHIVE DESTINATION lib${LIB_SUFFIX}) 207 208 IF (BUILD_TESTING AND GFLAGS) 209 ADD_LIBRARY(gtest gmock_gtest_all.cc gmock_main.cc) 210 ADD_LIBRARY(test_util 211 evaluator_test_utils.cc 212 numeric_diff_test_utils.cc 213 test_util.cc) 214 215 TARGET_LINK_LIBRARIES(gtest ${GFLAGS_LIB} ${GLOG_LIB}) 216 TARGET_LINK_LIBRARIES(test_util ceres gtest ${GLOG_LIB}) 217 218 MACRO (CERES_TEST NAME) 219 ADD_EXECUTABLE(${NAME}_test ${NAME}_test.cc) 220 TARGET_LINK_LIBRARIES(${NAME}_test test_util ceres gtest) 221 ADD_TEST(NAME ${NAME}_test 222 COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${NAME}_test 223 --test_srcdir 224 ${CMAKE_SOURCE_DIR}/data) 225 ENDMACRO (CERES_TEST) 226 227 CERES_TEST(array_utils) 228 CERES_TEST(autodiff) 229 CERES_TEST(autodiff_cost_function) 230 CERES_TEST(autodiff_local_parameterization) 231 CERES_TEST(block_random_access_crs_matrix) 232 CERES_TEST(block_random_access_dense_matrix) 233 CERES_TEST(block_random_access_sparse_matrix) 234 CERES_TEST(block_sparse_matrix) 235 CERES_TEST(c_api) 236 CERES_TEST(canonical_views_clustering) 237 CERES_TEST(compressed_row_sparse_matrix) 238 CERES_TEST(conditioned_cost_function) 239 CERES_TEST(corrector) 240 CERES_TEST(cost_function_to_functor) 241 CERES_TEST(covariance) 242 CERES_TEST(dense_sparse_matrix) 243 CERES_TEST(dynamic_autodiff_cost_function) 244 CERES_TEST(evaluator) 245 CERES_TEST(gradient_checker) 246 CERES_TEST(gradient_checking_cost_function) 247 CERES_TEST(graph) 248 CERES_TEST(graph_algorithms) 249 CERES_TEST(implicit_schur_complement) 250 CERES_TEST(incomplete_lq_factorization) 251 CERES_TEST(iterative_schur_complement_solver) 252 CERES_TEST(jet) 253 CERES_TEST(levenberg_marquardt_strategy) 254 CERES_TEST(dogleg_strategy) 255 CERES_TEST(local_parameterization) 256 CERES_TEST(loss_function) 257 CERES_TEST(minimizer) 258 CERES_TEST(normal_prior) 259 CERES_TEST(numeric_diff_cost_function) 260 CERES_TEST(numeric_diff_functor) 261 CERES_TEST(ordered_groups) 262 CERES_TEST(parameter_block) 263 CERES_TEST(parameter_block_ordering) 264 CERES_TEST(partitioned_matrix_view) 265 CERES_TEST(polynomial) 266 CERES_TEST(problem) 267 CERES_TEST(residual_block) 268 CERES_TEST(residual_block_utils) 269 CERES_TEST(rotation) 270 CERES_TEST(runtime_numeric_diff_cost_function) 271 CERES_TEST(schur_complement_solver) 272 CERES_TEST(schur_eliminator) 273 CERES_TEST(small_blas) 274 CERES_TEST(solver_impl) 275 276 # TODO(sameeragarwal): This test should ultimately be made 277 # independent of SuiteSparse. 278 IF (SUITESPARSE_FOUND) 279 CERES_TEST(compressed_col_sparse_matrix_utils) 280 ENDIF (SUITESPARSE_FOUND) 281 282 CERES_TEST(symmetric_linear_solver) 283 CERES_TEST(triplet_sparse_matrix) 284 CERES_TEST(trust_region_minimizer) 285 CERES_TEST(unsymmetric_linear_solver) 286 CERES_TEST(visibility) 287 CERES_TEST(visibility_based_preconditioner) 288 289 # Put the large end to end test last. 290 CERES_TEST(system) 291 ENDIF (BUILD_TESTING AND GFLAGS) 292