blob: 0002fbf02ed934beafbfa3bc43d289d92bdd0e0e [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
Keir Mierle8ebb0732012-04-30 23:09:08 -070031CMAKE_MINIMUM_REQUIRED(VERSION 2.2)
32
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
45# Default locations to search for on various platforms.
46SET(SEARCH_LIBS
47 ${SEARCH_LIBS}
48 /usr/lib
49 /usr/local/lib
50 /usr/local/homebrew/lib # Mac OS X
51 /opt/local/lib
52 )
53
54SET(SEARCH_HEADERS
55 ${SEARCH_HEADERS}
56 /usr/include
57 /usr/local/include
58 /usr/local/homebrew/include # Mac OS X
59 /opt/local/include/
60 )
61
62# To get a more static build, try the following line on Mac and Linux:
63# SET(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
64
Keir Mierle8ebb0732012-04-30 23:09:08 -070065# SuiteSparse
66OPTION(SUITESPARSE
67 "Enable SuiteSparse. Needed for efficient solutions of large problems."
68 ON)
69
Keir Mierle8ebb0732012-04-30 23:09:08 -070070IF (SUITESPARSE)
71 SET(SUITESPARSE_SEARCH_LIBS
72 ${SEARCH_LIBS}
Keir Mierle8ebb0732012-04-30 23:09:08 -070073 /usr/lib/suitesparse # Ubuntu
Keir Mierle8ebb0732012-04-30 23:09:08 -070074 /usr/local/lib/suitesparse
75 /opt/local/lib/ufsparse # Mac OS X
76 )
Keir Mierle8ebb0732012-04-30 23:09:08 -070077 SET(SUITESPARSE_SEARCH_HEADERS
78 ${SEARCH_HEADERS}
Keir Mierle8ebb0732012-04-30 23:09:08 -070079 /usr/include/suitesparse # Ubuntu
Keir Mierle8ebb0732012-04-30 23:09:08 -070080 /usr/local/include/suitesparse,
81 /opt/local/include/ufsparse # Mac os X
82 )
83
84 FIND_LIBRARY(AMD_LIB NAMES amd PATHS ${SUITESPARSE_SEARCH_LIBS})
85 FIND_PATH(AMD_INCLUDE NAMES amd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
86 IF (NOT EXISTS ${AMD_LIB} OR NOT EXISTS ${AMD_INCLUDE})
87 MESSAGE(FATAL_ERROR
88 "Can't find AMD (part of suitesparse.) "
89 "Please specify -DAMD_INCLUDE=... and -DAMD_LIB=...")
90 ENDIF (NOT EXISTS ${AMD_LIB} OR NOT EXISTS ${AMD_INCLUDE})
91 MESSAGE("-- Found AMD library: ${AMD_LIB}")
92 MESSAGE("-- Found AMD header in: ${AMD_INCLUDE}")
93
94 MESSAGE("-- Check for CAMD")
95 FIND_LIBRARY(CAMD_LIB NAMES camd PATHS ${SUITESPARSE_SEARCH_LIBS})
96 FIND_PATH(CAMD_INCLUDE NAMES camd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
97 IF (NOT EXISTS ${CAMD_LIB} OR NOT EXISTS ${CAMD_INCLUDE})
98 MESSAGE(FATAL_ERROR
99 "Can't find CAMD (part of suitesparse.) "
100 "Please specify -DCAMD_INCLUDE=... and -DCAMD_LIB=...")
101 ENDIF (NOT EXISTS ${CAMD_LIB} OR NOT EXISTS ${CAMD_INCLUDE})
102 MESSAGE("-- Found CAMD library: ${CAMD_LIB}")
103 MESSAGE("-- Found CAMD header in: ${CAMD_INCLUDE}")
104
105 # Note: Even though Ceres doesn't directly depend on COLAMD,
106 # some symbols from COLAMD that are needed for linking.
107 MESSAGE("-- Check for COLAMD")
108 FIND_LIBRARY(COLAMD_LIB NAMES colamd PATHS ${SUITESPARSE_SEARCH_LIBS})
109 FIND_PATH(COLAMD_INCLUDE NAMES colamd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
110 IF (NOT EXISTS ${COLAMD_LIB} OR NOT EXISTS ${COLAMD_INCLUDE})
111 MESSAGE(FATAL_ERROR
112 "Can't find COLAMD (part of suitesparse.)"
113 "Please specify -DCOLAMD_INCLUDE=... and -DCOLAMD_LIB=...")
114 ENDIF (NOT EXISTS ${COLAMD_LIB} OR NOT EXISTS ${COLAMD_INCLUDE})
115 MESSAGE("-- Found COLAMD library: ${COLAMD_LIB}")
116 MESSAGE("-- Found COLAMD header in: ${COLAMD_INCLUDE}")
117
118 MESSAGE("-- Check for CCOLAMD")
119 FIND_LIBRARY(CCOLAMD_LIB NAMES ccolamd PATHS ${SUITESPARSE_SEARCH_LIBS})
120 FIND_PATH(CCOLAMD_INCLUDE NAMES ccolamd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
121 IF (NOT EXISTS ${CCOLAMD_LIB} OR NOT EXISTS ${CCOLAMD_INCLUDE})
122 MESSAGE(FATAL_ERROR
123 "Can't find CCOLAMD (part of suitesparse.)"
124 "Please specify -DCOLAMD_INCLUDE=... and -DCOLAMD_LIB=...")
125 ENDIF (NOT EXISTS ${CCOLAMD_LIB} OR NOT EXISTS ${CCOLAMD_INCLUDE})
126 MESSAGE("-- Found CCOLAMD library: ${CCOLAMD_LIB}")
127 MESSAGE("-- Found CCOLAMD header in: ${CCOLAMD_INCLUDE}")
128
129 MESSAGE("-- Check for CHOLMOD")
130 FIND_LIBRARY(CHOLMOD_LIB NAMES cholmod PATHS ${SUITESPARSE_SEARCH_LIBS})
131 FIND_PATH(CHOLMOD_INCLUDE NAMES cholmod.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
132 IF (NOT EXISTS ${CHOLMOD_LIB} OR NOT EXISTS ${CHOLMOD_INCLUDE})
133 MESSAGE(FATAL_ERROR
134 "Can't find CHOLMOD (part of suitesparse.)"
135 "Please specify -DCHOLMOD_INCLUDE=... and -DCHOLMOD_LIB=...")
136 ENDIF (NOT EXISTS ${CHOLMOD_LIB} OR NOT EXISTS ${CHOLMOD_INCLUDE})
137 MESSAGE("-- Found CHOLMOD library: ${CHOLMOD_LIB}")
138 MESSAGE("-- Found CHOLMOD header in: ${CHOLMOD_INCLUDE}")
139
140 MESSAGE("-- Check for METIS (optional)")
141 FIND_LIBRARY(METIS_LIB NAMES metis PATHS ${SUITESPARSE_SEARCH_LIBS})
142 IF (NOT EXISTS ${METIS_LIB})
143 MESSAGE(" Can't find METIS; disabling. (part of suitesparse.)")
144 ELSE (NOT EXISTS ${METIS_LIB})
145 MESSAGE("-- Found METIS library: ${METIS_LIB}")
146 ENDIF (NOT EXISTS ${METIS_LIB})
147
148 MESSAGE("-- Check for LAPACK")
149 IF (APPLE)
150 # Mac OS X has LAPACK/BLAS bundled in a framework called "vecLib". Search for
151 # that instead of for the normal "lapack" library.
152 FIND_LIBRARY(LAPACK_LIB NAMES vecLib)
153 ELSE (APPLE)
154 FIND_LIBRARY(LAPACK_LIB NAMES lapack)
155 ENDIF (APPLE)
156
157 IF (NOT EXISTS ${LAPACK_LIB})
158 MESSAGE(FATAL_ERROR
159 "Can't find LAPACK "
160 "Please specify -DLAPACK_LIB=...")
161 ENDIF (NOT EXISTS ${LAPACK_LIB})
162 MESSAGE ("-- Found LAPACK library: ${LAPACK_LIB}")
163
Keir Mierle92d5ab52012-05-01 18:33:08 -0700164 # On Apple BLAS is linked with vecLib, so don't add it separately.
165 IF (NOT APPLE)
166 MESSAGE("-- Check for BLAS")
167 FIND_LIBRARY(BLAS_LIB NAMES blas)
168 IF (NOT EXISTS ${BLAS_LIB})
169 MESSAGE(FATAL_ERROR
170 "Can't find BLAS (needed for LAPACK and SuiteSparse.)"
171 "Please specify -DBLAS_LIB=...")
172 ENDIF (NOT EXISTS ${BLAS_LIB})
173 MESSAGE ("-- Found BLAS library: ${BLAS_LIB}")
174 ENDIF (NOT APPLE)
175
Keir Mierle8ebb0732012-04-30 23:09:08 -0700176ELSE (SUITESPARSE)
177 ADD_DEFINITIONS(-DCERES_NO_SUITESPARSE)
178ENDIF (SUITESPARSE)
179
180# Google Flags
181OPTION(GFLAGS
182 "Enable Google Flags."
183 ON)
184
185IF (GFLAGS)
186 MESSAGE("-- Check for Google Flags")
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700187 FIND_LIBRARY(GFLAGS_LIB NAMES gflags PATHS ${SEARCH_LIBS})
188 IF (NOT EXISTS ${GFLAGS_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700189 MESSAGE(FATAL_ERROR
190 "Can't find Google Flags. Please specify: "
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700191 "-DGFLAGS_LIB=...")
192 ENDIF (NOT EXISTS ${GFLAGS_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700193 MESSAGE("-- Found Google Flags library: ${GFLAGS_LIB}")
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700194 FIND_PATH(GFLAGS_INCLUDE NAMES gflags/gflags.h PATHS ${SEARCH_HEADERS})
195 IF (NOT EXISTS ${GFLAGS_INCLUDE})
196 MESSAGE(FATAL_ERROR
197 "Can't find Google Flags. Please specify: "
198 "-DGFLAGS_INCLUDE=...")
199 ENDIF (NOT EXISTS ${GFLAGS_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700200 MESSAGE("-- Found Google Flags header in: ${GFLAGS_INCLUDE}")
201ELSE (GFLAGS)
202 MESSAGE("-- Google Flags disabled; no tests or tools will be built!")
203 ADD_DEFINITIONS(-DCERES_NO_GFLAGS)
204ENDIF (GFLAGS)
205
206# Google Logging
Sameer Agarwal30c5f932012-05-03 10:44:43 -0700207MESSAGE("-- Check for Google Log")
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700208FIND_LIBRARY(GLOG_LIB NAMES glog PATHS ${SEARCH_LIBS})
209IF (NOT EXISTS ${GLOG_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700210 MESSAGE(FATAL_ERROR
211 "Can't find Google Log. Please specify: "
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700212 "-DGLOG_LIB=...")
213ENDIF (NOT EXISTS ${GLOG_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700214MESSAGE("-- Found Google Log library: ${GLOG_LIB}")
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700215
216FIND_PATH(GLOG_INCLUDE NAMES glog/logging.h PATHS ${SEARCH_HEADERS})
217IF (NOT EXISTS ${GLOG_INCLUDE})
218 MESSAGE(FATAL_ERROR
219 "Can't find Google Log. Please specify: "
220 "-DGLOG_INCLUDE=...")
221ENDIF (NOT EXISTS ${GLOG_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700222MESSAGE("-- Found Google Log header in: ${GLOG_INCLUDE}")
223
224# Eigen
225MESSAGE("-- Check for Eigen 3.0")
226SET(EIGEN_SEARCH_HEADERS
227 ${SEARCH_HEADERS}
Keir Mierle8ebb0732012-04-30 23:09:08 -0700228 /usr/include/eigen3 # Ubuntu 10.04's default location.
Keir Mierlef477a382012-05-01 18:10:48 -0700229 /usr/local/include/eigen3
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700230 /usr/local/homebrew/include/eigen3 # Mac OS X
231 /opt/local/var/macports/software/eigen3/opt/local/include/eigen3/
232 )
Keir Mierlef477a382012-05-01 18:10:48 -0700233FIND_PATH(EIGEN_INCLUDE NAMES Eigen/Core PATHS ${EIGEN_SEARCH_HEADERS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700234IF (NOT EXISTS ${EIGEN_INCLUDE})
Keir Mierlef477a382012-05-01 18:10:48 -0700235 MESSAGE(FATAL_ERROR "Can't find Eigen. Try passing -DEIGEN_INCLUDE=...")
Keir Mierle8ebb0732012-04-30 23:09:08 -0700236ENDIF (NOT EXISTS ${EIGEN_INCLUDE})
237MESSAGE("-- Found Eigen 3.0: ${EIGEN_INCLUDE}")
238
239OPTION(SCHUR_SPECIALIZATIONS
240 "Enable fixed-size schur specializations."
241 ON)
242
243IF (NOT SCHUR_SPECIALIZATIONS)
244 # Disable fixed-size specializations of the schur complement solver, which
245 # requires multiple gigabytes of memory to compile.
246 ADD_DEFINITIONS(-DCERES_RESTRICT_SCHUR_SPECIALIZATION)
Keir Mierlef10163a2012-05-04 21:33:53 -0700247 MESSAGE("-- Disabling Schur specializations (faster compiles)")
Keir Mierle8ebb0732012-04-30 23:09:08 -0700248ENDIF (NOT SCHUR_SPECIALIZATIONS)
249
250OPTION(OPENMP
251 "Enable threaded solving in Ceres (requires OpenMP)"
252 ON)
253
254IF (OPENMP)
255 FIND_PACKAGE(OpenMP)
256 IF(OPENMP_FOUND)
257 MESSAGE("-- Found OpenMP.")
258 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
259 ADD_DEFINITIONS(-DCERES_USE_OPENMP)
260 ELSE(OPENMP_FOUND)
261 MESSAGE("-- Can't find OpenMP. Continuing without it.")
262 ENDIF(OPENMP_FOUND)
263ENDIF (OPENMP)
264
265OPTION(PROTOBUF
266 "Enable protocol buffers support."
267 ON)
268
269# Protocol buffers support.
270IF (PROTOBUF)
271 FIND_PACKAGE(Protobuf)
272 IF (PROTOBUF_FOUND)
273 INCLUDE_DIRECTORIES(${PROTOBUF_INCLUDE_DIRS})
274 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/internal)
275 ELSE (PROTOBUF_FOUND)
276 ADD_DEFINITIONS(-DCERES_DONT_HAVE_PROTOCOL_BUFFERS)
277 ENDIF (PROTOBUF_FOUND)
278ELSE (PROTOBUF)
279 ADD_DEFINITIONS(-DCERES_DONT_HAVE_PROTOCOL_BUFFERS)
280ENDIF (PROTOBUF)
281
282IF (UNIX)
283 # Atleast on linux, we need pthreads to be enabled for mutex to
284 # compile. This may not work on windows or android.
285 FIND_PACKAGE(Threads REQUIRED)
286 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_THREAD_LIBS_INIT}")
287 ADD_DEFINITIONS(-DCERES_HAVE_PTHREAD)
288 ADD_DEFINITIONS(-DCERES_HAVE_RWLOCK)
289ENDIF (UNIX)
290
Keir Mierle8ebb0732012-04-30 23:09:08 -0700291# Use the std namespace for the hash<> and related templates. This may vary by
292# system.
293ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_START=namespace std { namespace tr1 {\"")
294ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_END=}}\"")
295
296INCLUDE_DIRECTORIES(
297 include
298 internal
299 internal/ceres
300 ${AMD_INCLUDE}
301 ${COLAMD_INCLUDE}
302 ${CHOLMOD_INCLUDE}
303 ${GLOG_INCLUDE}
304 ${GFLAGS_INCLUDE}
305 ${EIGEN_INCLUDE}
306)
307
308# Change the default build type from Debug to Release, while still
309# supporting overriding the build type.
310IF (NOT CMAKE_BUILD_TYPE)
311 SET(CMAKE_BUILD_TYPE Release)
312ENDIF (NOT CMAKE_BUILD_TYPE)
313
314ADD_SUBDIRECTORY(internal/ceres)
315ADD_SUBDIRECTORY(examples)
316
317# TODO(sameeragarwal): The following flags break the old gcc that
318# ships on Mac OS X. Make this conditional on operating system and
319# compiler.
320#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=native -march=native")