blob: 348f71945fd2a8ecf40955410eac938ebf09210e [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)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -040032CMAKE_POLICY(VERSION 2.8)
Keir Mierle8ebb0732012-04-30 23:09:08 -070033
34IF (COMMAND cmake_policy)
35 CMAKE_POLICY(SET CMP0003 NEW)
36ENDIF (COMMAND cmake_policy)
37
38PROJECT(CERES C CXX)
39
Arnaud Gelasd2fb5ad2012-08-17 10:11:02 +020040# Set up the git hook to make Gerrit Change-Id: lines in commit messages.
41SET (LOCAL_GIT_DIRECTORY)
42IF (EXISTS ${CMAKE_SOURCE_DIR}/.git)
43 # .git directory can be found on Unix based system, or on Windows with
44 # Git Bash (shipped with msysgit)
45 SET (LOCAL_GIT_DIRECTORY ${CMAKE_SOURCE_DIR}/.git)
46ELSE (EXISTS ${CMAKE_SOURCE_DIR}/.git)
Sameer Agarwal36f4cd22013-04-21 09:42:26 -070047 # TODO(keir) Add proper Windows support
Arnaud Gelasd2fb5ad2012-08-17 10:11:02 +020048ENDIF (EXISTS ${CMAKE_SOURCE_DIR}/.git)
49
50IF (EXISTS ${LOCAL_GIT_DIRECTORY})
51 IF (NOT EXISTS ${LOCAL_GIT_DIRECTORY}/hooks/commit-msg)
52 # Download the hook only if it is not already present
53 FILE(DOWNLOAD https://ceres-solver-review.googlesource.com/tools/hooks/commit-msg
54 ${CMAKE_BINARY_DIR}/commit-msg)
55
56 # Make the downloaded file executable, since it is not by default.
57 FILE(COPY ${CMAKE_BINARY_DIR}/commit-msg
58 DESTINATION ${LOCAL_GIT_DIRECTORY}/hooks/
59 FILE_PERMISSIONS
60 OWNER_READ OWNER_WRITE OWNER_EXECUTE
61 GROUP_READ GROUP_WRITE GROUP_EXECUTE
62 WORLD_READ WORLD_EXECUTE)
63 ENDIF (NOT EXISTS ${LOCAL_GIT_DIRECTORY}/hooks/commit-msg)
64ENDIF (EXISTS ${LOCAL_GIT_DIRECTORY})
65
Arnaud Gelasb3fa0092012-08-17 10:31:41 +020066SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
67SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
68SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
69
Keir Mierle05107ba2012-07-18 13:50:12 -070070# Important: Always bump the second number (e.g. 1.3.x to 1.4.0) for any
71# release that changes the ABI. The ABI changes for almost any modification to
72# include/ceres (e.g. the public API). If you are unsure about whether
73# something is an ABI change, please ask on the list.
74#
75# For versions without ABI changes, bump the smallest number in CERES_VERSION,
76# but leave the CERES_ABI_VERSION unchanged.
Pablo Specialec51b11c2013-03-12 00:56:56 -070077SET(CERES_VERSION_MAJOR 1)
Sameer Agarwal937777a2013-04-29 13:57:28 -070078SET(CERES_VERSION_MINOR 6)
Pablo Specialec51b11c2013-03-12 00:56:56 -070079SET(CERES_VERSION_PATCH 0)
80SET(CERES_VERSION
81 ${CERES_VERSION_MAJOR}.${CERES_VERSION_MINOR}.${CERES_VERSION_PATCH})
Sameer Agarwal937777a2013-04-29 13:57:28 -070082SET(CERES_ABI_VERSION 1.6.0)
Keir Mierle05107ba2012-07-18 13:50:12 -070083
Sameer Agarwal30c5f932012-05-03 10:44:43 -070084ENABLE_TESTING()
Keir Mierle8ebb0732012-04-30 23:09:08 -070085
Sameer Agarwalaa9526d2012-05-08 21:22:09 -070086OPTION(BUILD_TESTING
87 "Enable tests"
88 ON)
89
Keir Mierleaefb8a82012-07-28 13:23:55 -070090OPTION(BUILD_ANDROID
91 "Build for Android. Use build_android.sh instead of setting this."
92 OFF)
93
Sameer Agarwalaa9526d2012-05-08 21:22:09 -070094# To get a more static build, try the following line on Mac and Linux:
95# SET(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
96
Sameer Agarwaldaa98242012-05-11 11:26:38 -070097# Default locations to search for on various platforms.
98LIST(APPEND SEARCH_LIBS /usr/lib)
99LIST(APPEND SEARCH_LIBS /usr/local/lib)
100LIST(APPEND SEARCH_LIBS /usr/local/homebrew/lib) # Mac OS X
101LIST(APPEND SEARCH_LIBS /opt/local/lib)
Keir Mierle8ebb0732012-04-30 23:09:08 -0700102
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700103LIST(APPEND SEARCH_HEADERS /usr/include)
104LIST(APPEND SEARCH_HEADERS /usr/local/include)
105LIST(APPEND SEARCH_HEADERS /usr/local/homebrew/include) # Mac OS X
106LIST(APPEND SEARCH_HEADERS /opt/local/include)
Keir Mierle8ebb0732012-04-30 23:09:08 -0700107
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700108# Locations to search for Eigen
109SET(EIGEN_SEARCH_HEADERS ${SEARCH_HEADERS})
110LIST(APPEND EIGEN_SEARCH_HEADERS /usr/include/eigen3) # Ubuntu 10.04's default location.
Sameer Agarwalb0518732012-05-29 00:27:57 -0700111LIST(APPEND EIGEN_SEARCH_HEADERS /usr/local/include/eigen3)
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700112LIST(APPEND EIGEN_SEARCH_HEADERS /usr/local/homebrew/include/eigen3) # Mac OS X
113LIST(APPEND EIGEN_SEARCH_HEADERS /opt/local/var/macports/software/eigen3/opt/local/include/eigen3) # Mac OS X
114
115# Locations to search for SuiteSparse
116SET(SUITESPARSE_SEARCH_LIBS ${SEARCH_LIBS})
117LIST(APPEND SUITESPARSE_SEARCH_LIBS /usr/lib/suitesparse) # Ubuntu
Sameer Agarwalb0518732012-05-29 00:27:57 -0700118LIST(APPEND SUITESPARSE_SEARCH_LIBS /usr/local/lib/suitesparse)
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700119LIST(APPEND SUITESPARSE_SEARCH_LIBS /opt/local/lib/ufsparse) # Mac OS X
120
121SET(SUITESPARSE_SEARCH_HEADERS ${SEARCH_HEADERS})
122LIST(APPEND SUITESPARSE_SEARCH_HEADERS /usr/include/suitesparse) # Ubuntu
Sameer Agarwalb0518732012-05-29 00:27:57 -0700123LIST(APPEND SUITESPARSE_SEARCH_HEADERS /usr/local/include/suitesparse)
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700124LIST(APPEND SUITESPARSE_SEARCH_HEADERS /opt/local/include/ufsparse) # Mac OS X
125
Sameer Agarwalb0518732012-05-29 00:27:57 -0700126SET(CXSPARSE_SEARCH_LIBS ${SEARCH_LIBS})
127SET(CXSPARSE_SEARCH_HEADERS ${SEARCH_HEADERS})
128LIST(APPEND CXSPARSE_SEARCH_HEADERS /usr/include/suitesparse) # Ubuntu
129
Sameer Agarwal8140f0f2013-03-12 09:45:08 -0700130IF ((NOT DEFINED SUITESPARSE) OR (DEFINED SUITESPARSE AND SUITESPARSE))
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700131# Check for SuiteSparse dependencies
132MESSAGE("-- Check for AMD")
133SET(AMD_FOUND TRUE)
134
135FIND_LIBRARY(AMD_LIB NAMES amd PATHS ${SUITESPARSE_SEARCH_LIBS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700136IF (EXISTS ${AMD_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700137 MESSAGE("-- Found AMD library: ${AMD_LIB}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700138ELSE (EXISTS ${AMD_LIB})
139 MESSAGE("-- Did not find AMD library")
140 SET(AMD_FOUND FALSE)
141ENDIF (EXISTS ${AMD_LIB})
142
143FIND_PATH(AMD_INCLUDE NAMES amd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700144IF (EXISTS ${AMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700145 MESSAGE("-- Found AMD header in: ${AMD_INCLUDE}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700146ELSE (EXISTS ${AMD_INCLUDE})
147 MESSAGE("-- Did not find AMD header")
148 SET(AMD_FOUND FALSE)
149ENDIF (EXISTS ${AMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700150
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700151MESSAGE("-- Check for CAMD")
152SET(CAMD_FOUND TRUE)
153
154FIND_LIBRARY(CAMD_LIB NAMES camd PATHS ${SUITESPARSE_SEARCH_LIBS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700155IF (EXISTS ${CAMD_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700156 MESSAGE("-- Found CAMD library: ${CAMD_LIB}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700157ELSE (EXISTS ${CAMD_LIB})
158 MESSAGE("-- Did not find CAMD library")
159 SET(CAMD_FOUND FALSE)
160ENDIF (EXISTS ${CAMD_LIB})
161
162FIND_PATH(CAMD_INCLUDE NAMES camd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700163IF (EXISTS ${CAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700164 MESSAGE("-- Found CAMD header in: ${CAMD_INCLUDE}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700165ELSE (EXISTS ${CAMD_INCLUDE})
166 MESSAGE("-- Did not find CAMD header")
167 SET(CAMD_FOUND FALSE)
168ENDIF (EXISTS ${CAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700169
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700170MESSAGE("-- Check for COLAMD")
171SET(COLAMD_FOUND TRUE)
172
173FIND_LIBRARY(COLAMD_LIB NAMES colamd PATHS ${SUITESPARSE_SEARCH_LIBS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700174IF (EXISTS ${COLAMD_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700175 MESSAGE("-- Found COLAMD library: ${COLAMD_LIB}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700176ELSE (EXISTS ${COLAMD_LIB})
177 MESSAGE("-- Did not find COLAMD library")
178 SET(COLAMD_FOUND FALSE)
179ENDIF (EXISTS ${COLAMD_LIB})
180
181FIND_PATH(COLAMD_INCLUDE NAMES colamd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700182IF (EXISTS ${COLAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700183 MESSAGE("-- Found COLAMD header in: ${COLAMD_INCLUDE}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700184ELSE (EXISTS ${COLAMD_INCLUDE})
185 MESSAGE("-- Did not find COLAMD header")
186 SET(COLAMD_FOUND FALSE)
187ENDIF (EXISTS ${COLAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700188
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700189MESSAGE("-- Check for CCOLAMD")
190SET(CCOLAMD_FOUND TRUE)
191
192FIND_LIBRARY(CCOLAMD_LIB NAMES ccolamd PATHS ${SUITESPARSE_SEARCH_LIBS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700193IF (EXISTS ${CCOLAMD_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700194 MESSAGE("-- Found CCOLAMD library: ${CCOLAMD_LIB}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700195ELSE (EXISTS ${CCOLAMD_LIB})
196 MESSAGE("-- Did not find CCOLAMD library")
197 SET(CCOLAMD_FOUND FALSE)
198ENDIF (EXISTS ${CCOLAMD_LIB})
199
200FIND_PATH(CCOLAMD_INCLUDE NAMES ccolamd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700201IF (EXISTS ${CCOLAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700202 MESSAGE("-- Found CCOLAMD header in: ${CCOLAMD_INCLUDE}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700203ELSE (EXISTS ${CCOLAMD_INCLUDE})
204 MESSAGE("-- Did not find CCOLAMD header")
205 SET(CCOLAMD_FOUND FALSE)
206ENDIF (EXISTS ${CCOLAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700207
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700208MESSAGE("-- Check for CHOLMOD")
209SET(CHOLMOD_FOUND TRUE)
210
211FIND_LIBRARY(CHOLMOD_LIB NAMES cholmod PATHS ${SUITESPARSE_SEARCH_LIBS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700212IF (EXISTS ${CHOLMOD_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700213 MESSAGE("-- Found CHOLMOD library: ${CHOLMOD_LIB}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700214ELSE (EXISTS ${CHOLMOD_LIB})
215 MESSAGE("-- Did not find CHOLMOD library")
216 SET(CHOLMOD_FOUND FALSE)
217ENDIF (EXISTS ${CHOLMOD_LIB})
218
219FIND_PATH(CHOLMOD_INCLUDE NAMES cholmod.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700220IF (EXISTS ${CHOLMOD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700221 MESSAGE("-- Found CHOLMOD header in: ${CHOLMOD_INCLUDE}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700222ELSE (EXISTS ${CHOLMOD_INCLUDE})
223 MESSAGE("-- Did not find CHOLMOD header")
224 SET(CHOLMOD_FOUND FALSE)
225ENDIF (EXISTS ${CHOLMOD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700226
Markus Mollc497bd62012-08-17 14:40:13 +0200227# If SuiteSparse version is >= 4 then SuiteSparse_config is required.
228# For SuiteSparse 3, UFconfig.h is required.
229MESSAGE("-- Check for SuiteSparse_config (SuiteSparse v4)")
230SET(SUITESPARSE_CONFIG_FOUND TRUE)
231
232FIND_LIBRARY(SUITESPARSE_CONFIG_LIB
233 NAMES suitesparseconfig
234 PATHS ${SUITESPARSE_SEARCH_LIBS})
235IF (EXISTS ${SUITESPARSE_CONFIG_LIB})
236 MESSAGE("-- Found SuiteSparse_config library: ${SUITESPARSE_CONFIG_LIB}")
237ELSE (EXISTS ${SUITESPARSE_CONFIG_LIB})
238 MESSAGE("-- Did not find SuiteSparse_config library")
239ENDIF (EXISTS ${SUITESPARSE_CONFIG_LIB})
240
241FIND_PATH(SUITESPARSE_CONFIG_INCLUDE
242 NAMES SuiteSparse_config.h
Sameer Agarwal96f25dc2012-08-17 15:34:42 -0700243 PATHS ${SUITESPARSE_SEARCH_HEADERS})
Markus Mollc497bd62012-08-17 14:40:13 +0200244IF (EXISTS ${SUITESPARSE_CONFIG_INCLUDE})
245 MESSAGE("-- Found SuiteSparse_config header in: ${SUITESPARSE_CONFIG_INCLUDE}")
246ELSE (EXISTS ${SUITESPARSE_CONFIG_INCLUDE})
247 MESSAGE("-- Did not find SuiteSparse_config header")
248ENDIF (EXISTS ${SUITESPARSE_CONFIG_INCLUDE})
249
250IF (NOT EXISTS ${SUITESPARSE_CONFIG_LIB} OR NOT EXISTS ${SUITESPARSE_CONFIG_INCLUDE})
251 SET(SUITESPARSE_CONFIG_FOUND FALSE)
252ENDIF (NOT EXISTS ${SUITESPARSE_CONFIG_LIB} OR NOT EXISTS ${SUITESPARSE_CONFIG_INCLUDE})
253
254MESSAGE("-- Check for UFconfig (SuiteSparse v3)")
255SET(UFCONFIG_FOUND TRUE)
256
257FIND_PATH(UFCONFIG_INCLUDE
258 NAMES UFconfig.h
Sameer Agarwale83f7872012-08-17 15:34:42 -0700259 PATHS ${SUITESPARSE_SEARCH_HEADERS})
Markus Mollc497bd62012-08-17 14:40:13 +0200260IF (EXISTS ${UFCONFIG_INCLUDE})
261 MESSAGE("-- Found UFconfig header in: ${UFCONFIG_INCLUDE}")
262ELSE (EXISTS ${UFCONFIG_INCLUDE})
263 MESSAGE("-- Did not find UFconfig header")
264 SET(UFCONFIG_FOUND FALSE)
265ENDIF (EXISTS ${UFCONFIG_INCLUDE})
266
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700267MESSAGE("-- Check for METIS (optional)")
268FIND_LIBRARY(METIS_LIB NAMES metis PATHS ${SUITESPARSE_SEARCH_LIBS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700269
Sameer Agarwalb0518732012-05-29 00:27:57 -0700270IF (EXISTS ${METIS_LIB})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700271 MESSAGE("-- Found METIS library: ${METIS_LIB}")
272ELSE (EXISTS ${METIS_LIB})
273 MESSAGE("-- Did not find METIS library")
274ENDIF (EXISTS ${METIS_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700275
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700276SET(BLAS_AND_LAPACK_FOUND TRUE)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400277IF (APPLE)
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700278 # Mac OS X has LAPACK/BLAS bundled in a framework called
279 # "vecLib". Search for that instead of for the normal "lapack"
280 # library.
281 FIND_LIBRARY(LAPACK_LIB NAMES vecLib)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400282ELSE (APPLE)
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700283 FIND_LIBRARY(BLAS_LIB NAMES blas)
Sameer Agarwalb0518732012-05-29 00:27:57 -0700284 IF (EXISTS ${BLAS_LIB})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700285 MESSAGE("-- Found BLAS library: ${BLAS_LIB}")
286 ELSE (EXISTS ${BLAS_LIB})
287 MESSAGE("-- Did not find BLAS library")
288 SET(BLAS_AND_LAPACK_FOUND FALSE)
289 ENDIF (EXISTS ${BLAS_LIB})
290 FIND_LIBRARY(LAPACK_LIB NAMES lapack)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400291ENDIF (APPLE)
Keir Mierle8ebb0732012-04-30 23:09:08 -0700292
Sameer Agarwalb0518732012-05-29 00:27:57 -0700293IF (EXISTS ${LAPACK_LIB})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700294 MESSAGE("-- Found LAPACK library: ${LAPACK_LIB}")
295ELSE (EXISTS ${LAPACK_LIB})
296 SET(BLAS_AND_LAPACK_FOUND FALSE)
297 MESSAGE("-- Did not find LAPACK library")
298ENDIF (EXISTS ${LAPACK_LIB})
Keir Mierle92d5ab52012-05-01 18:33:08 -0700299
Sameer Agarwalb0518732012-05-29 00:27:57 -0700300SET(SUITESPARSE_FOUND
Keir Mierleefe7ac62012-06-24 22:25:28 -0700301 ${AMD_FOUND} AND
302 ${CAMD_FOUND} AND
303 ${COLAMD_FOUND} AND
304 ${CCOLAMD_FOUND} AND
305 ${CHOLMOD_FOUND} AND
Markus Mollc497bd62012-08-17 14:40:13 +0200306 (${SUITESPARSE_CONFIG_FOUND} OR ${UFCONFIG_FOUND}) AND
Keir Mierleefe7ac62012-06-24 22:25:28 -0700307 ${BLAS_AND_LAPACK_FOUND})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700308
Sameer Agarwal8140f0f2013-03-12 09:45:08 -0700309ENDIF ((NOT DEFINED SUITESPARSE) OR (DEFINED SUITESPARSE AND SUITESPARSE))
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700310# By default, if all of SuiteSparse's dependencies are found, Ceres is
311# built with SuiteSparse support. -DSUITESPARSE=ON/OFF can be used to
312# enable/disable SuiteSparse explicitly.
313IF (DEFINED SUITESPARSE)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400314 IF (SUITESPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700315 IF (NOT ${SUITESPARSE_FOUND})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700316 MESSAGE(FATAL_ERROR "One or more of SuiteSparse's dependencies was not found")
Sameer Agarwald1146902012-05-30 01:40:22 -0700317 ENDIF (NOT ${SUITESPARSE_FOUND})
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400318 ELSE (SUITESPARSE)
Sameer Agarwalb0518732012-05-29 00:27:57 -0700319 ADD_DEFINITIONS(-DCERES_NO_SUITESPARSE)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400320 ENDIF (SUITESPARSE)
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700321ELSE (DEFINED SUITESPARSE)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400322 IF (SUITESPARSE_FOUND)
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700323 MESSAGE("-- Found all SuiteSparse dependencies. Building with SuiteSparse")
324 SET(SUITESPARSE ON)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400325 ELSE (SUITESPARSE_FOUND)
Sameer Agarwalb0518732012-05-29 00:27:57 -0700326 MESSAGE("-- Did not find all SuiteSparse dependencies. Building without SuiteSparse")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700327 SET(SUITESPARSE OFF)
328 ADD_DEFINITIONS(-DCERES_NO_SUITESPARSE)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400329 ENDIF (SUITESPARSE_FOUND)
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700330ENDIF (DEFINED SUITESPARSE)
Keir Mierle8ebb0732012-04-30 23:09:08 -0700331
Sameer Agarwalb0518732012-05-29 00:27:57 -0700332# By default, if all of CXSparse's dependencies are found, Ceres is
333# built with CXSparse support. -DCXSPARSE=ON/OFF can be used to
334# enable/disable CXSparse explicitly.
Sameer Agarwal8140f0f2013-03-12 09:45:08 -0700335IF ((NOT DEFINED CXSPARSE) OR (DEFINED CXSPARSE AND CXSPARSE))
Sameer Agarwalb0518732012-05-29 00:27:57 -0700336MESSAGE("-- Check for CXSparse")
337SET(CXSPARSE_FOUND ON)
338
339FIND_LIBRARY(CXSPARSE_LIB NAMES cxsparse PATHS ${CXSPARSE_SEARCH_LIBS})
340IF (EXISTS ${CXSPARSE_LIB})
341 MESSAGE("-- Found CXSparse library in: ${CXSPARSE_LIB}")
342ELSE (EXISTS ${CXSPARSE_LIB})
343 MESSAGE("-- Did not find CXSparse header")
344 SET(CXSPARSE_FOUND FALSE)
345ENDIF (EXISTS ${CXSPARSE_LIB})
346
347FIND_PATH(CXSPARSE_INCLUDE NAMES cs.h PATHS ${CXSPARSE_SEARCH_HEADERS})
348IF (EXISTS ${CXSPARSE_INCLUDE})
349 MESSAGE("-- Found CXSparse header in: ${CXSPARSE_INCLUDE}")
350ELSE (EXISTS ${CXSPARSE_INCLUDE})
351 MESSAGE("-- Did not find CXSparse header")
352 SET(CXSPARSE_FOUND FALSE)
353ENDIF (EXISTS ${CXSPARSE_INCLUDE})
Sameer Agarwal8140f0f2013-03-12 09:45:08 -0700354ENDIF ((NOT DEFINED CXSPARSE) OR (DEFINED CXSPARSE AND CXSPARSE))
Sameer Agarwalb0518732012-05-29 00:27:57 -0700355
356IF (DEFINED CXSPARSE)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400357 IF (CXSPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700358 IF (NOT ${CXSPARSE_FOUND})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700359 MESSAGE(FATAL_ERROR "-- CXSparse not found.")
Sameer Agarwald1146902012-05-30 01:40:22 -0700360 ENDIF (NOT ${CXSPARSE_FOUND})
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400361 ELSE (CXSPARSE)
Sameer Agarwalb0518732012-05-29 00:27:57 -0700362 ADD_DEFINITIONS(-DCERES_NO_CXSPARSE)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400363 ENDIF (CXSPARSE)
Sameer Agarwalb0518732012-05-29 00:27:57 -0700364ELSE (DEFINED CXSPARSE)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400365 IF (CXSPARSE_FOUND)
Sameer Agarwalb0518732012-05-29 00:27:57 -0700366 MESSAGE("-- Building with CXSparse support.")
367 SET(CXSPARSE ON)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400368 ELSE (CXSPARSE_FOUND)
Sameer Agarwalb0518732012-05-29 00:27:57 -0700369 MESSAGE("-- Building without CXSparse.")
370 SET(CXSPARSE OFF)
371 ADD_DEFINITIONS(-DCERES_NO_CXSPARSE)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400372 ENDIF (CXSPARSE_FOUND)
Sameer Agarwalb0518732012-05-29 00:27:57 -0700373ENDIF (DEFINED CXSPARSE)
374
Keir Mierle8ebb0732012-04-30 23:09:08 -0700375# Google Flags
376OPTION(GFLAGS
377 "Enable Google Flags."
378 ON)
379
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400380IF (GFLAGS)
Keir Mierle8ebb0732012-04-30 23:09:08 -0700381 MESSAGE("-- Check for Google Flags")
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700382 FIND_LIBRARY(GFLAGS_LIB NAMES gflags PATHS ${SEARCH_LIBS})
383 IF (NOT EXISTS ${GFLAGS_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700384 MESSAGE(FATAL_ERROR
385 "Can't find Google Flags. Please specify: "
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700386 "-DGFLAGS_LIB=...")
387 ENDIF (NOT EXISTS ${GFLAGS_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700388 MESSAGE("-- Found Google Flags library: ${GFLAGS_LIB}")
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700389 FIND_PATH(GFLAGS_INCLUDE NAMES gflags/gflags.h PATHS ${SEARCH_HEADERS})
390 IF (NOT EXISTS ${GFLAGS_INCLUDE})
391 MESSAGE(FATAL_ERROR
392 "Can't find Google Flags. Please specify: "
393 "-DGFLAGS_INCLUDE=...")
394 ENDIF (NOT EXISTS ${GFLAGS_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700395 MESSAGE("-- Found Google Flags header in: ${GFLAGS_INCLUDE}")
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400396ELSE (GFLAGS)
Keir Mierle8ebb0732012-04-30 23:09:08 -0700397 MESSAGE("-- Google Flags disabled; no tests or tools will be built!")
398 ADD_DEFINITIONS(-DCERES_NO_GFLAGS)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400399ENDIF (GFLAGS)
Keir Mierle8ebb0732012-04-30 23:09:08 -0700400
401# Google Logging
Keir Mierleaefb8a82012-07-28 13:23:55 -0700402IF (NOT ${BUILD_ANDROID})
403 MESSAGE("-- Check for Google Log")
404 FIND_LIBRARY(GLOG_LIB NAMES glog PATHS ${SEARCH_LIBS})
405 IF (NOT EXISTS ${GLOG_LIB})
406 MESSAGE(FATAL_ERROR
407 "Can't find Google Log. Please specify: "
408 "-DGLOG_LIB=...")
409 ENDIF (NOT EXISTS ${GLOG_LIB})
410 MESSAGE("-- Found Google Log library: ${GLOG_LIB}")
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700411
Keir Mierleaefb8a82012-07-28 13:23:55 -0700412 FIND_PATH(GLOG_INCLUDE NAMES glog/logging.h PATHS ${SEARCH_HEADERS})
413 IF (NOT EXISTS ${GLOG_INCLUDE})
414 MESSAGE(FATAL_ERROR
415 "Can't find Google Log. Please specify: "
416 "-DGLOG_INCLUDE=...")
417 ENDIF (NOT EXISTS ${GLOG_INCLUDE})
418 MESSAGE("-- Found Google Log header in: ${GLOG_INCLUDE}")
419ELSE (NOT ${BUILD_ANDROID})
420 SET(GLOG_LIB miniglog)
421 MESSAGE("-- Using minimal Glog substitute for Android (library): ${GLOG_LIB}")
422 SET(GLOG_INCLUDE internal/ceres/miniglog)
423 MESSAGE("-- Using minimal Glog substitute for Android (include): ${GLOG_INCLUDE}")
424ENDIF (NOT ${BUILD_ANDROID})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700425
426# Eigen
Pablo Speciale16dbf112013-03-11 14:44:02 -0700427MESSAGE("-- Check for Eigen 3.x")
Keir Mierlef477a382012-05-01 18:10:48 -0700428FIND_PATH(EIGEN_INCLUDE NAMES Eigen/Core PATHS ${EIGEN_SEARCH_HEADERS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700429IF (NOT EXISTS ${EIGEN_INCLUDE})
Keir Mierlef477a382012-05-01 18:10:48 -0700430 MESSAGE(FATAL_ERROR "Can't find Eigen. Try passing -DEIGEN_INCLUDE=...")
Keir Mierle8ebb0732012-04-30 23:09:08 -0700431ENDIF (NOT EXISTS ${EIGEN_INCLUDE})
Pablo Speciale16dbf112013-03-11 14:44:02 -0700432MESSAGE("-- Found Eigen 3.x: ${EIGEN_INCLUDE}")
Keir Mierle8ebb0732012-04-30 23:09:08 -0700433
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700434# Template specializations for the Schur complement based solvers. If
435# compile time, binary size or compiler performance is an issue, you
436# may consider disabling this.
Keir Mierle8ebb0732012-04-30 23:09:08 -0700437OPTION(SCHUR_SPECIALIZATIONS
438 "Enable fixed-size schur specializations."
439 ON)
440
Sameer Agarwald1146902012-05-30 01:40:22 -0700441IF (NOT ${SCHUR_SPECIALIZATIONS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700442 ADD_DEFINITIONS(-DCERES_RESTRICT_SCHUR_SPECIALIZATION)
Keir Mierlef10163a2012-05-04 21:33:53 -0700443 MESSAGE("-- Disabling Schur specializations (faster compiles)")
Sameer Agarwald1146902012-05-30 01:40:22 -0700444ENDIF (NOT ${SCHUR_SPECIALIZATIONS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700445
Sameer Agarwal8140f0f2013-03-12 09:45:08 -0700446# Line search minimizer is useful for large scale problems or when
447# sparse linear algebra libraries are not available. If compile time,
448# binary size or compiler performance is an issue, consider disabling
449# this.
450OPTION(LINE_SEARCH_MINIMIZER
451 "Enable the line search minimizer."
452 ON)
453
454IF (NOT ${LINE_SEARCH_MINIMIZER})
Sameer Agarwal296fa9b2013-04-02 09:44:15 -0700455 ADD_DEFINITIONS(-DCERES_NO_LINE_SEARCH_MINIMIZER)
456 MESSAGE("-- Disabling line search minimizer")
Sameer Agarwal8140f0f2013-03-12 09:45:08 -0700457ENDIF (NOT ${LINE_SEARCH_MINIMIZER})
458
Sameer Agarwal296fa9b2013-04-02 09:44:15 -0700459OPTION(CUSTOM_BLAS
460 "Use handcoded BLAS routines (usually faster) instead of Eigen."
461 ON)
462
463IF (NOT ${CUSTOM_BLAS})
464 ADD_DEFINITIONS(-DCERES_NO_CUSTOM_BLAS)
465 MESSAGE("-- Disabling custom blas")
466ENDIF (NOT ${CUSTOM_BLAS})
467
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700468# Multithreading using OpenMP
Keir Mierle8ebb0732012-04-30 23:09:08 -0700469OPTION(OPENMP
470 "Enable threaded solving in Ceres (requires OpenMP)"
471 ON)
472
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400473IF (OPENMP)
Keir Mierle8ebb0732012-04-30 23:09:08 -0700474 FIND_PACKAGE(OpenMP)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400475ENDIF (OPENMP)
Keir Mierle8ebb0732012-04-30 23:09:08 -0700476
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400477IF (OPENMP_FOUND)
Sameer Agarwal36f4cd22013-04-21 09:42:26 -0700478 MESSAGE("-- Found OpenMP.")
479 ADD_DEFINITIONS(-DCERES_USE_OPENMP)
480 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
481 IF ("${UNIX}")
482 # At least on Linux, we need pthreads to be enabled for mutex to
483 # compile. This may not work on Windows or Android.
484 FIND_PACKAGE(Threads REQUIRED)
485 SET(STATIC_LIBRARY_FLAGS
486 "${STATIC_LIBRARY_FLAGS} ${CMAKE_THREAD_LIBS_INIT}")
487 SET(CMAKE_SHARED_LINKER_FLAGS
488 "${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_THREAD_LIBS_INIT}")
489 ADD_DEFINITIONS(-DCERES_HAVE_PTHREAD)
490 ADD_DEFINITIONS(-DCERES_HAVE_RWLOCK)
491 ENDIF ("${UNIX}")
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400492ELSE (OPENMP_FOUND)
Sameer Agarwal36f4cd22013-04-21 09:42:26 -0700493 MESSAGE("-- Can't find OpenMP. Disabling multithreading.")
494 ADD_DEFINITIONS(-DCERES_NO_THREADS)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400495ENDIF (OPENMP_FOUND)
Sameer Agarwal36f4cd22013-04-21 09:42:26 -0700496
497# Disable threads in mutex.h. Someday, after there is OpenMP support in
498# Android, this can get removed. Also turn on a workaround for an NDK bug.
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400499IF (BUILD_ANDROID)
Sameer Agarwal36f4cd22013-04-21 09:42:26 -0700500 ADD_DEFINITIONS(-DCERES_NO_THREADS)
501 ADD_DEFINITIONS(-DCERES_WORK_AROUND_ANDROID_NDK_COMPILER_BUG)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400502ENDIF (BUILD_ANDROID)
Sameer Agarwal36f4cd22013-04-21 09:42:26 -0700503
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700504# Protocol buffers
Keir Mierle8ebb0732012-04-30 23:09:08 -0700505OPTION(PROTOBUF
506 "Enable protocol buffers support."
507 ON)
508
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400509IF (PROTOBUF)
Keir Mierle8ebb0732012-04-30 23:09:08 -0700510 FIND_PACKAGE(Protobuf)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400511 IF (PROTOBUF_FOUND)
Keir Mierle8ebb0732012-04-30 23:09:08 -0700512 INCLUDE_DIRECTORIES(${PROTOBUF_INCLUDE_DIRS})
513 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/internal)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400514 ELSE (PROTOBUF_FOUND)
Sameer Agarwaldd2b17d2012-08-16 19:34:57 -0700515 ADD_DEFINITIONS(-DCERES_NO_PROTOCOL_BUFFERS)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400516 ENDIF (PROTOBUF_FOUND)
517ELSE (PROTOBUF)
Sameer Agarwaldd2b17d2012-08-16 19:34:57 -0700518 ADD_DEFINITIONS(-DCERES_NO_PROTOCOL_BUFFERS)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400519ENDIF (PROTOBUF)
Keir Mierle8ebb0732012-04-30 23:09:08 -0700520
Keir Mierled2164902012-08-15 19:04:50 -0700521OPTION(DISABLE_TR1
522 "Don't use TR1. This replaces some hash tables with sets. Slower."
523 OFF)
524
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400525IF (DISABLE_TR1)
Keir Mierled2164902012-08-15 19:04:50 -0700526 MESSAGE("-- Replacing unordered_map/set with map/set (warning: slower!)")
527 ADD_DEFINITIONS(-DCERES_NO_TR1)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400528ELSE (DISABLE_TR1)
Keir Mierled2164902012-08-15 19:04:50 -0700529 MESSAGE("-- Using normal TR1 unordered_map/set")
530 # Use the std namespace for the hash<> and related templates. This may vary by
531 # system.
532 IF (MSVC)
533 # This is known to work with Visual Studio 2010 Express.
534 ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_START=namespace std {\"")
535 ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_END=}\"")
536 ELSE (MSVC)
537 # This is known to work with recent versions of Linux and Mac OS X.
538 ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_START=namespace std { namespace tr1 {\"")
539 ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_END=}}\"")
540 ENDIF (MSVC)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400541ENDIF (DISABLE_TR1)
Keir Mierle8ebb0732012-04-30 23:09:08 -0700542
543INCLUDE_DIRECTORIES(
544 include
545 internal
546 internal/ceres
Keir Mierle8ebb0732012-04-30 23:09:08 -0700547 ${GLOG_INCLUDE}
Keir Mierle8ebb0732012-04-30 23:09:08 -0700548 ${EIGEN_INCLUDE}
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700549 )
550
Arnaud Gelas3d644b72012-08-16 17:33:21 +0200551FILE(GLOB CERES_HDRS ${CMAKE_SOURCE_DIR}/include/ceres/*.h)
552INSTALL(FILES ${CERES_HDRS} DESTINATION include/ceres)
553
554FILE(GLOB CERES_PUBLIC_INTERNAL_HDRS ${CMAKE_SOURCE_DIR}/include/ceres/internal/*.h)
555INSTALL(FILES ${CERES_PUBLIC_INTERNAL_HDRS} DESTINATION include/ceres/internal)
556
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400557IF (SUITESPARSE)
Markus Mollc497bd62012-08-17 14:40:13 +0200558 INCLUDE_DIRECTORIES(${AMD_INCLUDE})
559 INCLUDE_DIRECTORIES(${CAMD_INCLUDE})
560 INCLUDE_DIRECTORIES(${COLAMD_INCLUDE})
561 INCLUDE_DIRECTORIES(${CCOLAMD_INCLUDE})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700562 INCLUDE_DIRECTORIES(${CHOLMOD_INCLUDE})
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400563 IF (SUITESPARSE_CONFIG_FOUND)
Markus Mollc497bd62012-08-17 14:40:13 +0200564 INCLUDE_DIRECTORIES(${SUITESPARSE_CONFIG_INCLUDE})
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400565 ENDIF (SUITESPARSE_CONFIG_FOUND)
566 IF (UFCONFIG_FOUND)
Markus Mollc497bd62012-08-17 14:40:13 +0200567 INCLUDE_DIRECTORIES(${UFCONFIG_INCLUDE})
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400568 ENDIF (UFCONFIG_FOUND)
569ENDIF (SUITESPARSE)
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700570
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400571IF (CXSPARSE)
Sameer Agarwalb0518732012-05-29 00:27:57 -0700572 INCLUDE_DIRECTORIES(${CXSPARSE_INCLUDE})
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400573ENDIF (CXSPARSE)
Sameer Agarwalb0518732012-05-29 00:27:57 -0700574
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400575IF (GFLAGS)
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700576 INCLUDE_DIRECTORIES(${GFLAGS_INCLUDE})
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400577ENDIF (GFLAGS)
Keir Mierle8ebb0732012-04-30 23:09:08 -0700578
Sameer Agarwal8e2420e2012-05-31 17:00:58 -0700579# Change the default build type from Debug to Release, while still
580# supporting overriding the build type.
Sameer Agarwal4845bc42012-06-05 21:32:57 -0700581#
582# The CACHE STRING logic here and elsewhere is needed to force CMake
583# to pay attention to the value of these variables.
584IF (NOT CMAKE_BUILD_TYPE)
585 MESSAGE("-- No build type specified; defaulting to CMAKE_BUILD_TYPE=Release.")
586 SET(CMAKE_BUILD_TYPE Release CACHE STRING
587 "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
588 FORCE)
589ELSE (NOT CMAKE_BUILD_TYPE)
Sameer Agarwal8e2420e2012-05-31 17:00:58 -0700590 IF (CMAKE_BUILD_TYPE STREQUAL "Debug")
591 MESSAGE("\n=================================================================================")
592 MESSAGE("\n-- Build type: Debug. Performance will be terrible!")
593 MESSAGE("-- Add -DCMAKE_BUILD_TYPE=Release to the CMake command line to get an optimized build.")
594 MESSAGE("\n=================================================================================")
Sameer Agarwal8e2420e2012-05-31 17:00:58 -0700595 ENDIF (CMAKE_BUILD_TYPE STREQUAL "Debug")
Sameer Agarwal4845bc42012-06-05 21:32:57 -0700596ENDIF (NOT CMAKE_BUILD_TYPE)
597
598# Set the default Ceres flags to an empty string.
599SET (CERES_CXX_FLAGS)
600
601IF (CMAKE_BUILD_TYPE STREQUAL "Release")
602 IF (CMAKE_COMPILER_IS_GNUCXX)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400603 IF (BUILD_ANDROID)
Keir Mierleaefb8a82012-07-28 13:23:55 -0700604 # TODO(keir): Figure out what flags should go here to make an optimized
605 # native ARM binary for Android.
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400606 ELSE (BUILD_ANDROID)
Keir Mierleaefb8a82012-07-28 13:23:55 -0700607 # Linux
608 IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
609 SET (CERES_CXX_FLAGS "${CERES_CXX_FLAGS} -march=native -mtune=native")
610 ENDIF (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
611 # Mac OS X
612 IF (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
613 SET (CERES_CXX_FLAGS "${CERES_CXX_FLAGS} -fast -msse3")
614 ENDIF (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400615 ENDIF (BUILD_ANDROID)
Sameer Agarwal4845bc42012-06-05 21:32:57 -0700616 ENDIF (CMAKE_COMPILER_IS_GNUCXX)
Sameer Agarwal24fb32b2013-04-20 09:02:06 -0700617 IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
Alex Stewart37020682013-05-12 20:06:04 +0100618 # Use of -O4 requires use of gold linker & LLVM-gold plugin, which might
619 # well not be present / in use and without which files will compile, but
620 # not link ('file not recognized') so explicitly check for support
621 INCLUDE(CheckCXXCompilerFlag)
622 CHECK_CXX_COMPILER_FLAG("-O4" HAVE_LTO_SUPPORT)
623 IF (HAVE_LTO_SUPPORT)
624 MESSAGE(STATUS "Enabling link-time optimization (-O4)")
625 SET(CERES_CXX_FLAGS "${CERES_CXX_FLAGS} -O4")
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400626 ELSE ()
Alex Stewart37020682013-05-12 20:06:04 +0100627 MESSAGE(STATUS "Compiler/linker does not support link-time optimization (-O4), disabling.")
628 ENDIF (HAVE_LTO_SUPPORT)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400629 ENDIF ()
Sameer Agarwal4845bc42012-06-05 21:32:57 -0700630ENDIF (CMAKE_BUILD_TYPE STREQUAL "Release")
Keir Mierleefe7ac62012-06-24 22:25:28 -0700631
Sameer Agarwal24fb32b2013-04-20 09:02:06 -0700632SET (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${CERES_CXX_FLAGS}")
633
Keir Mierleefe7ac62012-06-24 22:25:28 -0700634# After the tweaks for the compile settings, disable some warnings on MSVC.
635IF (MSVC)
636 # Disable signed/unsigned int conversion warnings.
Keir Mierleaefb8a82012-07-28 13:23:55 -0700637 ADD_DEFINITIONS("/wd4018")
Keir Mierleefe7ac62012-06-24 22:25:28 -0700638 # Disable warning about using struct/class for the same symobl.
Keir Mierleaefb8a82012-07-28 13:23:55 -0700639 ADD_DEFINITIONS("/wd4099")
Keir Mierleefe7ac62012-06-24 22:25:28 -0700640 # Disable warning about the insecurity of using "std::copy".
641 ADD_DEFINITIONS("/wd4996")
642 # Disable performance warning about int-to-bool conversion.
643 ADD_DEFINITIONS("/wd4800")
644 # Disable performance warning about fopen insecurity.
645 ADD_DEFINITIONS("/wd4996")
646 # Disable warning about int64 to int32 conversion. Disabling
647 # this warning may not be correct; needs investigation.
648 # TODO(keir): Investigate these warnings in more detail.
649 ADD_DEFINITIONS("/wd4244")
650 # It's not possible to use STL types in DLL interfaces in a portable and
651 # reliable way. However, that's what happens with Google Log and Google Flags
652 # on Windows. MSVC gets upset about this and throws warnings that we can't do
653 # much about. The real solution is to link static versions of Google Log and
654 # Google Test, but that seems tricky on Windows. So, disable the warning.
655 ADD_DEFINITIONS("/wd4251")
656
657 # Google Flags doesn't have their DLL import/export stuff set up correctly,
658 # which results in linker warnings. This is irrelevant for Ceres, so ignore
659 # the warnings.
660 SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ignore:4049")
Petter Strandmarkb7ba9342013-02-19 12:52:58 +0100661
662 # Tuple sizes of 10 are used by Gtest.
663 ADD_DEFINITIONS("-D_VARIADIC_MAX=10")
Keir Mierleefe7ac62012-06-24 22:25:28 -0700664ENDIF (MSVC)
665
Keir Mierle97ca0fb2012-09-18 15:52:36 -0700666# GCC is not strict enough by default, so enable most of the warnings.
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400667IF (UNIX)
Keir Mierle97ca0fb2012-09-18 15:52:36 -0700668 SET(CMAKE_CXX_FLAGS
Taylor Braun-Jonesb73148b2013-02-25 02:34:00 -0500669 "${CMAKE_CXX_FLAGS} -Werror -Wall -Wextra -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter")
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400670ENDIF (UNIX)
Keir Mierle97ca0fb2012-09-18 15:52:36 -0700671
Sameer Agarwal3d6eceb2013-04-02 21:45:48 -0700672# Use a larger inlining threshold for Clang, since it hobbles Eigen,
673# resulting in an unreasonably slow version of the blas routines. The
674# -Qunused-arguments is needed because CMake passes the inline
675# threshold to the linker and clang complains about it and dies.
Taylor Braun-Jonesb73148b2013-02-25 02:34:00 -0500676IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
Sameer Agarwal3d6eceb2013-04-02 21:45:48 -0700677 SET(CMAKE_CXX_FLAGS
678 "${CMAKE_CXX_FLAGS} -Qunused-arguments -mllvm -inline-threshold=600 -Wno-return-type-c-linkage")
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400679ENDIF ()
Taylor Braun-Jonesb73148b2013-02-25 02:34:00 -0500680
Keir Mierleefe7ac62012-06-24 22:25:28 -0700681ADD_SUBDIRECTORY(internal/ceres)
Arnaud Gelasb12b9062012-08-15 16:27:38 +0200682
683OPTION(BUILD_DOCUMENTATION
Pablo Specialec51b11c2013-03-12 00:56:56 -0700684 "Build User's Guide (html)"
Arnaud Gelasb12b9062012-08-15 16:27:38 +0200685 OFF)
686
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400687IF (BUILD_DOCUMENTATION)
Arnaud Gelasb12b9062012-08-15 16:27:38 +0200688 MESSAGE("-- Documentation building is enabled")
689
Pablo Specialec51b11c2013-03-12 00:56:56 -0700690 # Make CMake aware of the cmake folder, in order to find 'FindSphinx.cmake'
691 SET (CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
692
693 # Generate the User's Guide (html).
Arnaud Gelasb12b9062012-08-15 16:27:38 +0200694 # The corresponding target is UserGuide, but is included in ALL.
695 ADD_SUBDIRECTORY(docs)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400696ENDIF (BUILD_DOCUMENTATION)
Arnaud Gelas73166092012-08-20 15:40:41 +0200697
698OPTION(BUILD_EXAMPLES "Build examples" ON)
699
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400700IF (BUILD_EXAMPLES)
Arnaud Gelas73166092012-08-20 15:40:41 +0200701 MESSAGE("-- Build the examples.")
702 ADD_SUBDIRECTORY(examples)
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400703ELSE (BUILD_EXAMPLES)
Arnaud Gelas73166092012-08-20 15:40:41 +0200704 MESSAGE("-- Do not build any example.")
Joydeep Biswasaa20a6d2013-05-15 09:38:03 -0400705ENDIF (BUILD_EXAMPLES)
Arnaud Gelas9ad27e82012-08-21 09:56:30 +0200706
707# Add an uninstall target to remove all installed files.
708CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/cmake/uninstall.cmake.in"
709 "${CMAKE_BINARY_DIR}/cmake/uninstall.cmake"
710 IMMEDIATE @ONLY)
711
712ADD_CUSTOM_TARGET(uninstall
713 COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/cmake/uninstall.cmake)
Pablo Speciale16dbf112013-03-11 14:44:02 -0700714
715# Set up install directories. INCLUDE_INSTALL_DIR and LIB_INSTALL_DIR
716# must not be absolute paths.
717SET(LIB_INSTALL_DIR_SUFFIX "" CACHE
718 STRING "The directories where to install libraries to")
719SET(LIB_INSTALL_DIR lib${LIB_INSTALL_DIR_SUFFIX} )
720SET(CMAKECONFIG_INSTALL_DIR ${LIB_INSTALL_DIR}/cmake/Ceres)
721SET(INCLUDE_INSTALL_DIR include)
722
723# This "exports" all targets which have been put into the export set
724# "CeresExport". This means that CMake generates a file with the given
725# filename, which can later on be loaded by projects using this package.
726# This file contains ADD_LIBRARY(bar IMPORTED) statements for each target
727# in the export set, so when loaded later on CMake will create "imported"
728# library targets from these, which can be used in many ways in the same way
729# as a normal library target created via a normal ADD_LIBRARY().
730INSTALL(EXPORT CeresExport
731 DESTINATION ${CMAKECONFIG_INSTALL_DIR} FILE CeresTargets.cmake)
732
733# Figure out the relative path from the installed Config.cmake file to the
734# install prefix (which may be at runtime different from the chosen
735# CMAKE_INSTALL_PREFIX if under Windows the package was installed anywhere)
736# This relative path will be configured into the CeresConfig.cmake.
737FILE(RELATIVE_PATH relInstallDir
738 ${CMAKE_INSTALL_PREFIX}/${CMAKECONFIG_INSTALL_DIR} ${CMAKE_INSTALL_PREFIX})
739
740# Create a CeresConfig.cmake file. <name>Config.cmake files are searched by
741# FIND_PACKAGE() automatically. We configure that file so that we can put any
742# information we want in it, e.g. version numbers, include directories, etc.
743CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/cmake/CeresConfig.cmake.in"
744 "${CMAKE_CURRENT_BINARY_DIR}/CeresConfig.cmake" @ONLY)
745
746# Additionally, when CMake has found a CeresConfig.cmake, it can check for a
747# CeresConfigVersion.cmake in the same directory when figuring out the version
748# of the package when a version has been specified in the FIND_PACKAGE() call,
749# e.g. FIND_PACKAGE(Ceres [1.4.2] REQUIRED). The version argument is optional.
750CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/cmake/CeresConfigVersion.cmake.in"
751 "${CMAKE_CURRENT_BINARY_DIR}/CeresConfigVersion.cmake" @ONLY)
752
753# Install these two files into the same directory as the generated exports-file.
754INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/CeresConfig.cmake"
755 "${CMAKE_CURRENT_BINARY_DIR}/CeresConfigVersion.cmake"
756 "${CMAKE_SOURCE_DIR}/cmake/depend.cmake"
757 DESTINATION ${CMAKECONFIG_INSTALL_DIR})