blob: 20ac076feef38d65a02d30825ea0d65b66cbed79 [file] [log] [blame]
Keir Mierle8ebb0732012-04-30 23:09:08 -07001# 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@google.com (Keir Mierle)
30
Sameer Agarwald1146902012-05-30 01:40:22 -070031CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0)
Keir Mierle8ebb0732012-04-30 23:09:08 -070032
33IF (COMMAND cmake_policy)
34 CMAKE_POLICY(SET CMP0003 NEW)
35ENDIF (COMMAND cmake_policy)
36
37PROJECT(CERES C CXX)
38
Sameer Agarwal30c5f932012-05-03 10:44:43 -070039ENABLE_TESTING()
Keir Mierle8ebb0732012-04-30 23:09:08 -070040
Sameer Agarwalaa9526d2012-05-08 21:22:09 -070041OPTION(BUILD_TESTING
42 "Enable tests"
43 ON)
44
Sameer Agarwalaa9526d2012-05-08 21:22:09 -070045# To get a more static build, try the following line on Mac and Linux:
46# SET(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
47
Sameer Agarwaldaa98242012-05-11 11:26:38 -070048# Default locations to search for on various platforms.
49LIST(APPEND SEARCH_LIBS /usr/lib)
50LIST(APPEND SEARCH_LIBS /usr/local/lib)
51LIST(APPEND SEARCH_LIBS /usr/local/homebrew/lib) # Mac OS X
52LIST(APPEND SEARCH_LIBS /opt/local/lib)
Keir Mierle8ebb0732012-04-30 23:09:08 -070053
Sameer Agarwaldaa98242012-05-11 11:26:38 -070054LIST(APPEND SEARCH_HEADERS /usr/include)
55LIST(APPEND SEARCH_HEADERS /usr/local/include)
56LIST(APPEND SEARCH_HEADERS /usr/local/homebrew/include) # Mac OS X
57LIST(APPEND SEARCH_HEADERS /opt/local/include)
Keir Mierle8ebb0732012-04-30 23:09:08 -070058
Sameer Agarwaldaa98242012-05-11 11:26:38 -070059# Locations to search for Eigen
60SET(EIGEN_SEARCH_HEADERS ${SEARCH_HEADERS})
61LIST(APPEND EIGEN_SEARCH_HEADERS /usr/include/eigen3) # Ubuntu 10.04's default location.
Sameer Agarwalb0518732012-05-29 00:27:57 -070062LIST(APPEND EIGEN_SEARCH_HEADERS /usr/local/include/eigen3)
Sameer Agarwaldaa98242012-05-11 11:26:38 -070063LIST(APPEND EIGEN_SEARCH_HEADERS /usr/local/homebrew/include/eigen3) # Mac OS X
64LIST(APPEND EIGEN_SEARCH_HEADERS /opt/local/var/macports/software/eigen3/opt/local/include/eigen3) # Mac OS X
65
66# Locations to search for SuiteSparse
67SET(SUITESPARSE_SEARCH_LIBS ${SEARCH_LIBS})
68LIST(APPEND SUITESPARSE_SEARCH_LIBS /usr/lib/suitesparse) # Ubuntu
Sameer Agarwalb0518732012-05-29 00:27:57 -070069LIST(APPEND SUITESPARSE_SEARCH_LIBS /usr/local/lib/suitesparse)
Sameer Agarwaldaa98242012-05-11 11:26:38 -070070LIST(APPEND SUITESPARSE_SEARCH_LIBS /opt/local/lib/ufsparse) # Mac OS X
71
72SET(SUITESPARSE_SEARCH_HEADERS ${SEARCH_HEADERS})
73LIST(APPEND SUITESPARSE_SEARCH_HEADERS /usr/include/suitesparse) # Ubuntu
Sameer Agarwalb0518732012-05-29 00:27:57 -070074LIST(APPEND SUITESPARSE_SEARCH_HEADERS /usr/local/include/suitesparse)
Sameer Agarwaldaa98242012-05-11 11:26:38 -070075LIST(APPEND SUITESPARSE_SEARCH_HEADERS /opt/local/include/ufsparse) # Mac OS X
76
Sameer Agarwalb0518732012-05-29 00:27:57 -070077SET(CXSPARSE_SEARCH_LIBS ${SEARCH_LIBS})
78SET(CXSPARSE_SEARCH_HEADERS ${SEARCH_HEADERS})
79LIST(APPEND CXSPARSE_SEARCH_HEADERS /usr/include/suitesparse) # Ubuntu
80
Sameer Agarwaldaa98242012-05-11 11:26:38 -070081# Check for SuiteSparse dependencies
82MESSAGE("-- Check for AMD")
83SET(AMD_FOUND TRUE)
84
85FIND_LIBRARY(AMD_LIB NAMES amd PATHS ${SUITESPARSE_SEARCH_LIBS})
Sameer Agarwalb0518732012-05-29 00:27:57 -070086IF (EXISTS ${AMD_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -070087 MESSAGE("-- Found AMD library: ${AMD_LIB}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -070088ELSE (EXISTS ${AMD_LIB})
89 MESSAGE("-- Did not find AMD library")
90 SET(AMD_FOUND FALSE)
91ENDIF (EXISTS ${AMD_LIB})
92
93FIND_PATH(AMD_INCLUDE NAMES amd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
Sameer Agarwalb0518732012-05-29 00:27:57 -070094IF (EXISTS ${AMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -070095 MESSAGE("-- Found AMD header in: ${AMD_INCLUDE}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -070096ELSE (EXISTS ${AMD_INCLUDE})
97 MESSAGE("-- Did not find AMD header")
98 SET(AMD_FOUND FALSE)
99ENDIF (EXISTS ${AMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700100
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700101MESSAGE("-- Check for CAMD")
102SET(CAMD_FOUND TRUE)
103
104FIND_LIBRARY(CAMD_LIB NAMES camd PATHS ${SUITESPARSE_SEARCH_LIBS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700105IF (EXISTS ${CAMD_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700106 MESSAGE("-- Found CAMD library: ${CAMD_LIB}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700107ELSE (EXISTS ${CAMD_LIB})
108 MESSAGE("-- Did not find CAMD library")
109 SET(CAMD_FOUND FALSE)
110ENDIF (EXISTS ${CAMD_LIB})
111
112FIND_PATH(CAMD_INCLUDE NAMES camd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700113IF (EXISTS ${CAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700114 MESSAGE("-- Found CAMD header in: ${CAMD_INCLUDE}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700115ELSE (EXISTS ${CAMD_INCLUDE})
116 MESSAGE("-- Did not find CAMD header")
117 SET(CAMD_FOUND FALSE)
118ENDIF (EXISTS ${CAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700119
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700120MESSAGE("-- Check for COLAMD")
121SET(COLAMD_FOUND TRUE)
122
123FIND_LIBRARY(COLAMD_LIB NAMES colamd PATHS ${SUITESPARSE_SEARCH_LIBS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700124IF (EXISTS ${COLAMD_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700125 MESSAGE("-- Found COLAMD library: ${COLAMD_LIB}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700126ELSE (EXISTS ${COLAMD_LIB})
127 MESSAGE("-- Did not find COLAMD library")
128 SET(COLAMD_FOUND FALSE)
129ENDIF (EXISTS ${COLAMD_LIB})
130
131FIND_PATH(COLAMD_INCLUDE NAMES colamd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700132IF (EXISTS ${COLAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700133 MESSAGE("-- Found COLAMD header in: ${COLAMD_INCLUDE}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700134ELSE (EXISTS ${COLAMD_INCLUDE})
135 MESSAGE("-- Did not find COLAMD header")
136 SET(COLAMD_FOUND FALSE)
137ENDIF (EXISTS ${COLAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700138
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700139MESSAGE("-- Check for CCOLAMD")
140SET(CCOLAMD_FOUND TRUE)
141
142FIND_LIBRARY(CCOLAMD_LIB NAMES ccolamd PATHS ${SUITESPARSE_SEARCH_LIBS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700143IF (EXISTS ${CCOLAMD_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700144 MESSAGE("-- Found CCOLAMD library: ${CCOLAMD_LIB}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700145ELSE (EXISTS ${CCOLAMD_LIB})
146 MESSAGE("-- Did not find CCOLAMD library")
147 SET(CCOLAMD_FOUND FALSE)
148ENDIF (EXISTS ${CCOLAMD_LIB})
149
150FIND_PATH(CCOLAMD_INCLUDE NAMES ccolamd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700151IF (EXISTS ${CCOLAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700152 MESSAGE("-- Found CCOLAMD header in: ${CCOLAMD_INCLUDE}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700153ELSE (EXISTS ${CCOLAMD_INCLUDE})
154 MESSAGE("-- Did not find CCOLAMD header")
155 SET(CCOLAMD_FOUND FALSE)
156ENDIF (EXISTS ${CCOLAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700157
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700158MESSAGE("-- Check for CHOLMOD")
159SET(CHOLMOD_FOUND TRUE)
160
161FIND_LIBRARY(CHOLMOD_LIB NAMES cholmod PATHS ${SUITESPARSE_SEARCH_LIBS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700162IF (EXISTS ${CHOLMOD_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700163 MESSAGE("-- Found CHOLMOD library: ${CHOLMOD_LIB}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700164ELSE (EXISTS ${CHOLMOD_LIB})
165 MESSAGE("-- Did not find CHOLMOD library")
166 SET(CHOLMOD_FOUND FALSE)
167ENDIF (EXISTS ${CHOLMOD_LIB})
168
169FIND_PATH(CHOLMOD_INCLUDE NAMES cholmod.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700170IF (EXISTS ${CHOLMOD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700171 MESSAGE("-- Found CHOLMOD header in: ${CHOLMOD_INCLUDE}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700172ELSE (EXISTS ${CHOLMOD_INCLUDE})
173 MESSAGE("-- Did not find CHOLMOD header")
174 SET(CHOLMOD_FOUND FALSE)
175ENDIF (EXISTS ${CHOLMOD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700176
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700177MESSAGE("-- Check for METIS (optional)")
178FIND_LIBRARY(METIS_LIB NAMES metis PATHS ${SUITESPARSE_SEARCH_LIBS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700179
Sameer Agarwalb0518732012-05-29 00:27:57 -0700180IF (EXISTS ${METIS_LIB})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700181 MESSAGE("-- Found METIS library: ${METIS_LIB}")
182ELSE (EXISTS ${METIS_LIB})
183 MESSAGE("-- Did not find METIS library")
184ENDIF (EXISTS ${METIS_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700185
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700186SET(BLAS_AND_LAPACK_FOUND TRUE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700187IF (${APPLE})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700188 # Mac OS X has LAPACK/BLAS bundled in a framework called
189 # "vecLib". Search for that instead of for the normal "lapack"
190 # library.
191 FIND_LIBRARY(LAPACK_LIB NAMES vecLib)
Sameer Agarwald1146902012-05-30 01:40:22 -0700192ELSE (${APPLE})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700193 FIND_LIBRARY(BLAS_LIB NAMES blas)
Sameer Agarwalb0518732012-05-29 00:27:57 -0700194 IF (EXISTS ${BLAS_LIB})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700195 MESSAGE("-- Found BLAS library: ${BLAS_LIB}")
196 ELSE (EXISTS ${BLAS_LIB})
197 MESSAGE("-- Did not find BLAS library")
198 SET(BLAS_AND_LAPACK_FOUND FALSE)
199 ENDIF (EXISTS ${BLAS_LIB})
200 FIND_LIBRARY(LAPACK_LIB NAMES lapack)
Sameer Agarwald1146902012-05-30 01:40:22 -0700201ENDIF (${APPLE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700202
Sameer Agarwalb0518732012-05-29 00:27:57 -0700203IF (EXISTS ${LAPACK_LIB})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700204 MESSAGE("-- Found LAPACK library: ${LAPACK_LIB}")
205ELSE (EXISTS ${LAPACK_LIB})
206 SET(BLAS_AND_LAPACK_FOUND FALSE)
207 MESSAGE("-- Did not find LAPACK library")
208ENDIF (EXISTS ${LAPACK_LIB})
Keir Mierle92d5ab52012-05-01 18:33:08 -0700209
Sameer Agarwalb0518732012-05-29 00:27:57 -0700210SET(SUITESPARSE_FOUND
Sameer Agarwald1146902012-05-30 01:40:22 -0700211 ${AMD_FOUND} AND
212 ${CAMD_FOUND} AND
213 ${COLAMD_FOUND} AND
214 ${CCOLAMD_FOUND} AND
215 ${CHOLMOD_FOUND} AND
216 ${BLAS_AND_LAPACK_FOUND})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700217
218# By default, if all of SuiteSparse's dependencies are found, Ceres is
219# built with SuiteSparse support. -DSUITESPARSE=ON/OFF can be used to
220# enable/disable SuiteSparse explicitly.
221IF (DEFINED SUITESPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700222 IF (${SUITESPARSE})
223 IF (NOT ${SUITESPARSE_FOUND})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700224 MESSAGE(FATAL_ERROR "One or more of SuiteSparse's dependencies was not found")
Sameer Agarwald1146902012-05-30 01:40:22 -0700225 ENDIF (NOT ${SUITESPARSE_FOUND})
226 ELSE (${SUITESPARSE})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700227 ADD_DEFINITIONS(-DCERES_NO_SUITESPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700228 ENDIF (${SUITESPARSE})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700229ELSE (DEFINED SUITESPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700230 IF (${SUITESPARSE_FOUND})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700231 MESSAGE("-- Found all SuiteSparse dependencies. Building with SuiteSparse")
232 SET(SUITESPARSE ON)
Sameer Agarwald1146902012-05-30 01:40:22 -0700233 ELSE (${SUITESPARSE_FOUND})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700234 MESSAGE("-- Did not find all SuiteSparse dependencies. Building without SuiteSparse")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700235 SET(SUITESPARSE OFF)
236 ADD_DEFINITIONS(-DCERES_NO_SUITESPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700237 ENDIF (${SUITESPARSE_FOUND})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700238ENDIF (DEFINED SUITESPARSE)
Keir Mierle8ebb0732012-04-30 23:09:08 -0700239
Sameer Agarwalb0518732012-05-29 00:27:57 -0700240# By default, if all of CXSparse's dependencies are found, Ceres is
241# built with CXSparse support. -DCXSPARSE=ON/OFF can be used to
242# enable/disable CXSparse explicitly.
243MESSAGE("-- Check for CXSparse")
244SET(CXSPARSE_FOUND ON)
245
246FIND_LIBRARY(CXSPARSE_LIB NAMES cxsparse PATHS ${CXSPARSE_SEARCH_LIBS})
247IF (EXISTS ${CXSPARSE_LIB})
248 MESSAGE("-- Found CXSparse library in: ${CXSPARSE_LIB}")
249ELSE (EXISTS ${CXSPARSE_LIB})
250 MESSAGE("-- Did not find CXSparse header")
251 SET(CXSPARSE_FOUND FALSE)
252ENDIF (EXISTS ${CXSPARSE_LIB})
253
254FIND_PATH(CXSPARSE_INCLUDE NAMES cs.h PATHS ${CXSPARSE_SEARCH_HEADERS})
255IF (EXISTS ${CXSPARSE_INCLUDE})
256 MESSAGE("-- Found CXSparse header in: ${CXSPARSE_INCLUDE}")
257ELSE (EXISTS ${CXSPARSE_INCLUDE})
258 MESSAGE("-- Did not find CXSparse header")
259 SET(CXSPARSE_FOUND FALSE)
260ENDIF (EXISTS ${CXSPARSE_INCLUDE})
261
262IF (DEFINED CXSPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700263 IF (${CXSPARSE})
264 IF (NOT ${CXSPARSE_FOUND})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700265 MESSAGE(FATAL_ERROR "-- CXSparse not found.")
Sameer Agarwald1146902012-05-30 01:40:22 -0700266 ENDIF (NOT ${CXSPARSE_FOUND})
267 ELSE (${CXSPARSE})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700268 ADD_DEFINITIONS(-DCERES_NO_CXSPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700269 ENDIF (${CXSPARSE})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700270ELSE (DEFINED CXSPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700271 IF (${CXSPARSE_FOUND})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700272 MESSAGE("-- Building with CXSparse support.")
273 SET(CXSPARSE ON)
Sameer Agarwald1146902012-05-30 01:40:22 -0700274 ELSE (${CXSPARSE_FOUND})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700275 MESSAGE("-- Building without CXSparse.")
276 SET(CXSPARSE OFF)
277 ADD_DEFINITIONS(-DCERES_NO_CXSPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700278 ENDIF (${CXSPARSE_FOUND})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700279ENDIF (DEFINED CXSPARSE)
280
Keir Mierle8ebb0732012-04-30 23:09:08 -0700281# Google Flags
282OPTION(GFLAGS
283 "Enable Google Flags."
284 ON)
285
Sameer Agarwald1146902012-05-30 01:40:22 -0700286IF (${GFLAGS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700287 MESSAGE("-- Check for Google Flags")
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700288 FIND_LIBRARY(GFLAGS_LIB NAMES gflags PATHS ${SEARCH_LIBS})
289 IF (NOT EXISTS ${GFLAGS_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700290 MESSAGE(FATAL_ERROR
291 "Can't find Google Flags. Please specify: "
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700292 "-DGFLAGS_LIB=...")
293 ENDIF (NOT EXISTS ${GFLAGS_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700294 MESSAGE("-- Found Google Flags library: ${GFLAGS_LIB}")
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700295 FIND_PATH(GFLAGS_INCLUDE NAMES gflags/gflags.h PATHS ${SEARCH_HEADERS})
296 IF (NOT EXISTS ${GFLAGS_INCLUDE})
297 MESSAGE(FATAL_ERROR
298 "Can't find Google Flags. Please specify: "
299 "-DGFLAGS_INCLUDE=...")
300 ENDIF (NOT EXISTS ${GFLAGS_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700301 MESSAGE("-- Found Google Flags header in: ${GFLAGS_INCLUDE}")
Sameer Agarwald1146902012-05-30 01:40:22 -0700302ELSE (${GFLAGS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700303 MESSAGE("-- Google Flags disabled; no tests or tools will be built!")
304 ADD_DEFINITIONS(-DCERES_NO_GFLAGS)
Sameer Agarwald1146902012-05-30 01:40:22 -0700305ENDIF (${GFLAGS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700306
307# Google Logging
Sameer Agarwal30c5f932012-05-03 10:44:43 -0700308MESSAGE("-- Check for Google Log")
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700309FIND_LIBRARY(GLOG_LIB NAMES glog PATHS ${SEARCH_LIBS})
310IF (NOT EXISTS ${GLOG_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700311 MESSAGE(FATAL_ERROR
312 "Can't find Google Log. Please specify: "
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700313 "-DGLOG_LIB=...")
314ENDIF (NOT EXISTS ${GLOG_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700315MESSAGE("-- Found Google Log library: ${GLOG_LIB}")
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700316
317FIND_PATH(GLOG_INCLUDE NAMES glog/logging.h PATHS ${SEARCH_HEADERS})
318IF (NOT EXISTS ${GLOG_INCLUDE})
319 MESSAGE(FATAL_ERROR
320 "Can't find Google Log. Please specify: "
321 "-DGLOG_INCLUDE=...")
322ENDIF (NOT EXISTS ${GLOG_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700323MESSAGE("-- Found Google Log header in: ${GLOG_INCLUDE}")
324
325# Eigen
326MESSAGE("-- Check for Eigen 3.0")
Keir Mierlef477a382012-05-01 18:10:48 -0700327FIND_PATH(EIGEN_INCLUDE NAMES Eigen/Core PATHS ${EIGEN_SEARCH_HEADERS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700328IF (NOT EXISTS ${EIGEN_INCLUDE})
Keir Mierlef477a382012-05-01 18:10:48 -0700329 MESSAGE(FATAL_ERROR "Can't find Eigen. Try passing -DEIGEN_INCLUDE=...")
Keir Mierle8ebb0732012-04-30 23:09:08 -0700330ENDIF (NOT EXISTS ${EIGEN_INCLUDE})
331MESSAGE("-- Found Eigen 3.0: ${EIGEN_INCLUDE}")
332
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700333# Template specializations for the Schur complement based solvers. If
334# compile time, binary size or compiler performance is an issue, you
335# may consider disabling this.
Keir Mierle8ebb0732012-04-30 23:09:08 -0700336OPTION(SCHUR_SPECIALIZATIONS
337 "Enable fixed-size schur specializations."
338 ON)
339
Sameer Agarwald1146902012-05-30 01:40:22 -0700340IF (NOT ${SCHUR_SPECIALIZATIONS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700341 ADD_DEFINITIONS(-DCERES_RESTRICT_SCHUR_SPECIALIZATION)
Keir Mierlef10163a2012-05-04 21:33:53 -0700342 MESSAGE("-- Disabling Schur specializations (faster compiles)")
Sameer Agarwald1146902012-05-30 01:40:22 -0700343ENDIF (NOT ${SCHUR_SPECIALIZATIONS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700344
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700345# Multithreading using OpenMP
Keir Mierle8ebb0732012-04-30 23:09:08 -0700346OPTION(OPENMP
347 "Enable threaded solving in Ceres (requires OpenMP)"
348 ON)
349
Sameer Agarwald1146902012-05-30 01:40:22 -0700350IF (${OPENMP})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700351 FIND_PACKAGE(OpenMP)
Sameer Agarwald1146902012-05-30 01:40:22 -0700352 IF(${OPENMP_FOUND})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700353 MESSAGE("-- Found OpenMP.")
354 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
355 ADD_DEFINITIONS(-DCERES_USE_OPENMP)
Sameer Agarwald1146902012-05-30 01:40:22 -0700356 ELSE(${OPENMP_FOUND})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700357 MESSAGE("-- Can't find OpenMP. Continuing without it.")
Sameer Agarwald1146902012-05-30 01:40:22 -0700358 ENDIF(${OPENMP_FOUND})
359ENDIF (${OPENMP})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700360
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700361# Protocol buffers
Keir Mierle8ebb0732012-04-30 23:09:08 -0700362OPTION(PROTOBUF
363 "Enable protocol buffers support."
364 ON)
365
Sameer Agarwald1146902012-05-30 01:40:22 -0700366IF (${PROTOBUF})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700367 FIND_PACKAGE(Protobuf)
Sameer Agarwald1146902012-05-30 01:40:22 -0700368 IF (${PROTOBUF_FOUND})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700369 INCLUDE_DIRECTORIES(${PROTOBUF_INCLUDE_DIRS})
370 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/internal)
Sameer Agarwald1146902012-05-30 01:40:22 -0700371 ELSE (${PROTOBUF_FOUND})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700372 ADD_DEFINITIONS(-DCERES_DONT_HAVE_PROTOCOL_BUFFERS)
Sameer Agarwald1146902012-05-30 01:40:22 -0700373 ENDIF (${PROTOBUF_FOUND})
374ELSE (${PROTOBUF})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700375 ADD_DEFINITIONS(-DCERES_DONT_HAVE_PROTOCOL_BUFFERS)
Sameer Agarwald1146902012-05-30 01:40:22 -0700376ENDIF (${PROTOBUF})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700377
Sameer Agarwald1146902012-05-30 01:40:22 -0700378IF (${UNIX})
379 # At least on linux, we need pthreads to be enabled for mutex to
Keir Mierle8ebb0732012-04-30 23:09:08 -0700380 # compile. This may not work on windows or android.
381 FIND_PACKAGE(Threads REQUIRED)
382 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_THREAD_LIBS_INIT}")
383 ADD_DEFINITIONS(-DCERES_HAVE_PTHREAD)
384 ADD_DEFINITIONS(-DCERES_HAVE_RWLOCK)
Sameer Agarwald1146902012-05-30 01:40:22 -0700385ENDIF (${UNIX})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700386
Keir Mierle8ebb0732012-04-30 23:09:08 -0700387# Use the std namespace for the hash<> and related templates. This may vary by
388# system.
389ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_START=namespace std { namespace tr1 {\"")
390ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_END=}}\"")
391
392INCLUDE_DIRECTORIES(
393 include
394 internal
395 internal/ceres
Keir Mierle8ebb0732012-04-30 23:09:08 -0700396 ${GLOG_INCLUDE}
Keir Mierle8ebb0732012-04-30 23:09:08 -0700397 ${EIGEN_INCLUDE}
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700398 )
399
Sameer Agarwald1146902012-05-30 01:40:22 -0700400IF (${SUITESPARSE})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700401 INCLUDE_DIRECTORIES(${CHOLMOD_INCLUDE})
Sameer Agarwald1146902012-05-30 01:40:22 -0700402ENDIF(${SUITESPARSE})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700403
Sameer Agarwald1146902012-05-30 01:40:22 -0700404IF (${CXSPARSE})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700405 INCLUDE_DIRECTORIES(${CXSPARSE_INCLUDE})
Sameer Agarwald1146902012-05-30 01:40:22 -0700406ENDIF(${CXSPARSE})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700407
Sameer Agarwald1146902012-05-30 01:40:22 -0700408IF (${GFLAGS})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700409 INCLUDE_DIRECTORIES(${GFLAGS_INCLUDE})
Sameer Agarwald1146902012-05-30 01:40:22 -0700410ENDIF (${GFLAGS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700411
412# Change the default build type from Debug to Release, while still
413# supporting overriding the build type.
Sameer Agarwald1146902012-05-30 01:40:22 -0700414IF (NOT ${CMAKE_BUILD_TYPE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700415 SET(CMAKE_BUILD_TYPE Release)
Sameer Agarwald1146902012-05-30 01:40:22 -0700416ENDIF (NOT ${CMAKE_BUILD_TYPE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700417
418ADD_SUBDIRECTORY(internal/ceres)
419ADD_SUBDIRECTORY(examples)
420
421# TODO(sameeragarwal): The following flags break the old gcc that
422# ships on Mac OS X. Make this conditional on operating system and
423# compiler.
424#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=native -march=native")