blob: ad67e253dc0929f518064a438aeeed5bef1e8202 [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
Arnaud Gelasd2fb5ad2012-08-17 10:11:02 +020039# Set up the git hook to make Gerrit Change-Id: lines in commit messages.
40SET (LOCAL_GIT_DIRECTORY)
41IF (EXISTS ${CMAKE_SOURCE_DIR}/.git)
42 # .git directory can be found on Unix based system, or on Windows with
43 # Git Bash (shipped with msysgit)
44 SET (LOCAL_GIT_DIRECTORY ${CMAKE_SOURCE_DIR}/.git)
45ELSE (EXISTS ${CMAKE_SOURCE_DIR}/.git)
46 # TODO(keir) Add proper windows support
47ENDIF (EXISTS ${CMAKE_SOURCE_DIR}/.git)
48
49IF (EXISTS ${LOCAL_GIT_DIRECTORY})
50 IF (NOT EXISTS ${LOCAL_GIT_DIRECTORY}/hooks/commit-msg)
51 # Download the hook only if it is not already present
52 FILE(DOWNLOAD https://ceres-solver-review.googlesource.com/tools/hooks/commit-msg
53 ${CMAKE_BINARY_DIR}/commit-msg)
54
55 # Make the downloaded file executable, since it is not by default.
56 FILE(COPY ${CMAKE_BINARY_DIR}/commit-msg
57 DESTINATION ${LOCAL_GIT_DIRECTORY}/hooks/
58 FILE_PERMISSIONS
59 OWNER_READ OWNER_WRITE OWNER_EXECUTE
60 GROUP_READ GROUP_WRITE GROUP_EXECUTE
61 WORLD_READ WORLD_EXECUTE)
62 ENDIF (NOT EXISTS ${LOCAL_GIT_DIRECTORY}/hooks/commit-msg)
63ENDIF (EXISTS ${LOCAL_GIT_DIRECTORY})
64
Arnaud Gelasb3fa0092012-08-17 10:31:41 +020065SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
66SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
67SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
68
Keir Mierle05107ba2012-07-18 13:50:12 -070069# Important: Always bump the second number (e.g. 1.3.x to 1.4.0) for any
70# release that changes the ABI. The ABI changes for almost any modification to
71# include/ceres (e.g. the public API). If you are unsure about whether
72# something is an ABI change, please ask on the list.
73#
74# For versions without ABI changes, bump the smallest number in CERES_VERSION,
75# but leave the CERES_ABI_VERSION unchanged.
Sameer Agarwalb13e42d2012-09-26 16:52:19 -070076SET(CERES_VERSION 1.4.0)
77SET(CERES_ABI_VERSION 1.4.0)
Keir Mierle05107ba2012-07-18 13:50:12 -070078
Sameer Agarwal30c5f932012-05-03 10:44:43 -070079ENABLE_TESTING()
Keir Mierle8ebb0732012-04-30 23:09:08 -070080
Sameer Agarwalaa9526d2012-05-08 21:22:09 -070081OPTION(BUILD_TESTING
82 "Enable tests"
83 ON)
84
Keir Mierleaefb8a82012-07-28 13:23:55 -070085OPTION(BUILD_ANDROID
86 "Build for Android. Use build_android.sh instead of setting this."
87 OFF)
88
Sameer Agarwalaa9526d2012-05-08 21:22:09 -070089# To get a more static build, try the following line on Mac and Linux:
90# SET(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
91
Sameer Agarwaldaa98242012-05-11 11:26:38 -070092# Default locations to search for on various platforms.
93LIST(APPEND SEARCH_LIBS /usr/lib)
94LIST(APPEND SEARCH_LIBS /usr/local/lib)
95LIST(APPEND SEARCH_LIBS /usr/local/homebrew/lib) # Mac OS X
96LIST(APPEND SEARCH_LIBS /opt/local/lib)
Keir Mierle8ebb0732012-04-30 23:09:08 -070097
Sameer Agarwaldaa98242012-05-11 11:26:38 -070098LIST(APPEND SEARCH_HEADERS /usr/include)
99LIST(APPEND SEARCH_HEADERS /usr/local/include)
100LIST(APPEND SEARCH_HEADERS /usr/local/homebrew/include) # Mac OS X
101LIST(APPEND SEARCH_HEADERS /opt/local/include)
Keir Mierle8ebb0732012-04-30 23:09:08 -0700102
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700103# Locations to search for Eigen
104SET(EIGEN_SEARCH_HEADERS ${SEARCH_HEADERS})
105LIST(APPEND EIGEN_SEARCH_HEADERS /usr/include/eigen3) # Ubuntu 10.04's default location.
Sameer Agarwalb0518732012-05-29 00:27:57 -0700106LIST(APPEND EIGEN_SEARCH_HEADERS /usr/local/include/eigen3)
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700107LIST(APPEND EIGEN_SEARCH_HEADERS /usr/local/homebrew/include/eigen3) # Mac OS X
108LIST(APPEND EIGEN_SEARCH_HEADERS /opt/local/var/macports/software/eigen3/opt/local/include/eigen3) # Mac OS X
109
110# Locations to search for SuiteSparse
111SET(SUITESPARSE_SEARCH_LIBS ${SEARCH_LIBS})
112LIST(APPEND SUITESPARSE_SEARCH_LIBS /usr/lib/suitesparse) # Ubuntu
Sameer Agarwalb0518732012-05-29 00:27:57 -0700113LIST(APPEND SUITESPARSE_SEARCH_LIBS /usr/local/lib/suitesparse)
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700114LIST(APPEND SUITESPARSE_SEARCH_LIBS /opt/local/lib/ufsparse) # Mac OS X
115
116SET(SUITESPARSE_SEARCH_HEADERS ${SEARCH_HEADERS})
117LIST(APPEND SUITESPARSE_SEARCH_HEADERS /usr/include/suitesparse) # Ubuntu
Sameer Agarwalb0518732012-05-29 00:27:57 -0700118LIST(APPEND SUITESPARSE_SEARCH_HEADERS /usr/local/include/suitesparse)
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700119LIST(APPEND SUITESPARSE_SEARCH_HEADERS /opt/local/include/ufsparse) # Mac OS X
120
Sameer Agarwalb0518732012-05-29 00:27:57 -0700121SET(CXSPARSE_SEARCH_LIBS ${SEARCH_LIBS})
122SET(CXSPARSE_SEARCH_HEADERS ${SEARCH_HEADERS})
123LIST(APPEND CXSPARSE_SEARCH_HEADERS /usr/include/suitesparse) # Ubuntu
124
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700125# Check for SuiteSparse dependencies
126MESSAGE("-- Check for AMD")
127SET(AMD_FOUND TRUE)
128
129FIND_LIBRARY(AMD_LIB NAMES amd PATHS ${SUITESPARSE_SEARCH_LIBS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700130IF (EXISTS ${AMD_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700131 MESSAGE("-- Found AMD library: ${AMD_LIB}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700132ELSE (EXISTS ${AMD_LIB})
133 MESSAGE("-- Did not find AMD library")
134 SET(AMD_FOUND FALSE)
135ENDIF (EXISTS ${AMD_LIB})
136
137FIND_PATH(AMD_INCLUDE NAMES amd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700138IF (EXISTS ${AMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700139 MESSAGE("-- Found AMD header in: ${AMD_INCLUDE}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700140ELSE (EXISTS ${AMD_INCLUDE})
141 MESSAGE("-- Did not find AMD header")
142 SET(AMD_FOUND FALSE)
143ENDIF (EXISTS ${AMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700144
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700145MESSAGE("-- Check for CAMD")
146SET(CAMD_FOUND TRUE)
147
148FIND_LIBRARY(CAMD_LIB NAMES camd PATHS ${SUITESPARSE_SEARCH_LIBS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700149IF (EXISTS ${CAMD_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700150 MESSAGE("-- Found CAMD library: ${CAMD_LIB}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700151ELSE (EXISTS ${CAMD_LIB})
152 MESSAGE("-- Did not find CAMD library")
153 SET(CAMD_FOUND FALSE)
154ENDIF (EXISTS ${CAMD_LIB})
155
156FIND_PATH(CAMD_INCLUDE NAMES camd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700157IF (EXISTS ${CAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700158 MESSAGE("-- Found CAMD header in: ${CAMD_INCLUDE}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700159ELSE (EXISTS ${CAMD_INCLUDE})
160 MESSAGE("-- Did not find CAMD header")
161 SET(CAMD_FOUND FALSE)
162ENDIF (EXISTS ${CAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700163
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700164MESSAGE("-- Check for COLAMD")
165SET(COLAMD_FOUND TRUE)
166
167FIND_LIBRARY(COLAMD_LIB NAMES colamd PATHS ${SUITESPARSE_SEARCH_LIBS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700168IF (EXISTS ${COLAMD_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700169 MESSAGE("-- Found COLAMD library: ${COLAMD_LIB}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700170ELSE (EXISTS ${COLAMD_LIB})
171 MESSAGE("-- Did not find COLAMD library")
172 SET(COLAMD_FOUND FALSE)
173ENDIF (EXISTS ${COLAMD_LIB})
174
175FIND_PATH(COLAMD_INCLUDE NAMES colamd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700176IF (EXISTS ${COLAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700177 MESSAGE("-- Found COLAMD header in: ${COLAMD_INCLUDE}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700178ELSE (EXISTS ${COLAMD_INCLUDE})
179 MESSAGE("-- Did not find COLAMD header")
180 SET(COLAMD_FOUND FALSE)
181ENDIF (EXISTS ${COLAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700182
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700183MESSAGE("-- Check for CCOLAMD")
184SET(CCOLAMD_FOUND TRUE)
185
186FIND_LIBRARY(CCOLAMD_LIB NAMES ccolamd PATHS ${SUITESPARSE_SEARCH_LIBS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700187IF (EXISTS ${CCOLAMD_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700188 MESSAGE("-- Found CCOLAMD library: ${CCOLAMD_LIB}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700189ELSE (EXISTS ${CCOLAMD_LIB})
190 MESSAGE("-- Did not find CCOLAMD library")
191 SET(CCOLAMD_FOUND FALSE)
192ENDIF (EXISTS ${CCOLAMD_LIB})
193
194FIND_PATH(CCOLAMD_INCLUDE NAMES ccolamd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700195IF (EXISTS ${CCOLAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700196 MESSAGE("-- Found CCOLAMD header in: ${CCOLAMD_INCLUDE}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700197ELSE (EXISTS ${CCOLAMD_INCLUDE})
198 MESSAGE("-- Did not find CCOLAMD header")
199 SET(CCOLAMD_FOUND FALSE)
200ENDIF (EXISTS ${CCOLAMD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700201
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700202MESSAGE("-- Check for CHOLMOD")
203SET(CHOLMOD_FOUND TRUE)
204
205FIND_LIBRARY(CHOLMOD_LIB NAMES cholmod PATHS ${SUITESPARSE_SEARCH_LIBS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700206IF (EXISTS ${CHOLMOD_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700207 MESSAGE("-- Found CHOLMOD library: ${CHOLMOD_LIB}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700208ELSE (EXISTS ${CHOLMOD_LIB})
209 MESSAGE("-- Did not find CHOLMOD library")
210 SET(CHOLMOD_FOUND FALSE)
211ENDIF (EXISTS ${CHOLMOD_LIB})
212
213FIND_PATH(CHOLMOD_INCLUDE NAMES cholmod.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700214IF (EXISTS ${CHOLMOD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700215 MESSAGE("-- Found CHOLMOD header in: ${CHOLMOD_INCLUDE}")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700216ELSE (EXISTS ${CHOLMOD_INCLUDE})
217 MESSAGE("-- Did not find CHOLMOD header")
218 SET(CHOLMOD_FOUND FALSE)
219ENDIF (EXISTS ${CHOLMOD_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700220
Markus Mollc497bd62012-08-17 14:40:13 +0200221# If SuiteSparse version is >= 4 then SuiteSparse_config is required.
222# For SuiteSparse 3, UFconfig.h is required.
223MESSAGE("-- Check for SuiteSparse_config (SuiteSparse v4)")
224SET(SUITESPARSE_CONFIG_FOUND TRUE)
225
226FIND_LIBRARY(SUITESPARSE_CONFIG_LIB
227 NAMES suitesparseconfig
228 PATHS ${SUITESPARSE_SEARCH_LIBS})
229IF (EXISTS ${SUITESPARSE_CONFIG_LIB})
230 MESSAGE("-- Found SuiteSparse_config library: ${SUITESPARSE_CONFIG_LIB}")
231ELSE (EXISTS ${SUITESPARSE_CONFIG_LIB})
232 MESSAGE("-- Did not find SuiteSparse_config library")
233ENDIF (EXISTS ${SUITESPARSE_CONFIG_LIB})
234
235FIND_PATH(SUITESPARSE_CONFIG_INCLUDE
236 NAMES SuiteSparse_config.h
Sameer Agarwal96f25dc2012-08-17 15:34:42 -0700237 PATHS ${SUITESPARSE_SEARCH_HEADERS})
Markus Mollc497bd62012-08-17 14:40:13 +0200238IF (EXISTS ${SUITESPARSE_CONFIG_INCLUDE})
239 MESSAGE("-- Found SuiteSparse_config header in: ${SUITESPARSE_CONFIG_INCLUDE}")
240ELSE (EXISTS ${SUITESPARSE_CONFIG_INCLUDE})
241 MESSAGE("-- Did not find SuiteSparse_config header")
242ENDIF (EXISTS ${SUITESPARSE_CONFIG_INCLUDE})
243
244IF (NOT EXISTS ${SUITESPARSE_CONFIG_LIB} OR NOT EXISTS ${SUITESPARSE_CONFIG_INCLUDE})
245 SET(SUITESPARSE_CONFIG_FOUND FALSE)
246ENDIF (NOT EXISTS ${SUITESPARSE_CONFIG_LIB} OR NOT EXISTS ${SUITESPARSE_CONFIG_INCLUDE})
247
248MESSAGE("-- Check for UFconfig (SuiteSparse v3)")
249SET(UFCONFIG_FOUND TRUE)
250
251FIND_PATH(UFCONFIG_INCLUDE
252 NAMES UFconfig.h
Sameer Agarwale83f7872012-08-17 15:34:42 -0700253 PATHS ${SUITESPARSE_SEARCH_HEADERS})
Markus Mollc497bd62012-08-17 14:40:13 +0200254IF (EXISTS ${UFCONFIG_INCLUDE})
255 MESSAGE("-- Found UFconfig header in: ${UFCONFIG_INCLUDE}")
256ELSE (EXISTS ${UFCONFIG_INCLUDE})
257 MESSAGE("-- Did not find UFconfig header")
258 SET(UFCONFIG_FOUND FALSE)
259ENDIF (EXISTS ${UFCONFIG_INCLUDE})
260
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700261MESSAGE("-- Check for METIS (optional)")
262FIND_LIBRARY(METIS_LIB NAMES metis PATHS ${SUITESPARSE_SEARCH_LIBS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700263
Sameer Agarwalb0518732012-05-29 00:27:57 -0700264IF (EXISTS ${METIS_LIB})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700265 MESSAGE("-- Found METIS library: ${METIS_LIB}")
266ELSE (EXISTS ${METIS_LIB})
267 MESSAGE("-- Did not find METIS library")
268ENDIF (EXISTS ${METIS_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700269
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700270SET(BLAS_AND_LAPACK_FOUND TRUE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700271IF (${APPLE})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700272 # Mac OS X has LAPACK/BLAS bundled in a framework called
273 # "vecLib". Search for that instead of for the normal "lapack"
274 # library.
275 FIND_LIBRARY(LAPACK_LIB NAMES vecLib)
Sameer Agarwald1146902012-05-30 01:40:22 -0700276ELSE (${APPLE})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700277 FIND_LIBRARY(BLAS_LIB NAMES blas)
Sameer Agarwalb0518732012-05-29 00:27:57 -0700278 IF (EXISTS ${BLAS_LIB})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700279 MESSAGE("-- Found BLAS library: ${BLAS_LIB}")
280 ELSE (EXISTS ${BLAS_LIB})
281 MESSAGE("-- Did not find BLAS library")
282 SET(BLAS_AND_LAPACK_FOUND FALSE)
283 ENDIF (EXISTS ${BLAS_LIB})
284 FIND_LIBRARY(LAPACK_LIB NAMES lapack)
Sameer Agarwald1146902012-05-30 01:40:22 -0700285ENDIF (${APPLE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700286
Sameer Agarwalb0518732012-05-29 00:27:57 -0700287IF (EXISTS ${LAPACK_LIB})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700288 MESSAGE("-- Found LAPACK library: ${LAPACK_LIB}")
289ELSE (EXISTS ${LAPACK_LIB})
290 SET(BLAS_AND_LAPACK_FOUND FALSE)
291 MESSAGE("-- Did not find LAPACK library")
292ENDIF (EXISTS ${LAPACK_LIB})
Keir Mierle92d5ab52012-05-01 18:33:08 -0700293
Sameer Agarwalb0518732012-05-29 00:27:57 -0700294SET(SUITESPARSE_FOUND
Keir Mierleefe7ac62012-06-24 22:25:28 -0700295 ${AMD_FOUND} AND
296 ${CAMD_FOUND} AND
297 ${COLAMD_FOUND} AND
298 ${CCOLAMD_FOUND} AND
299 ${CHOLMOD_FOUND} AND
Markus Mollc497bd62012-08-17 14:40:13 +0200300 (${SUITESPARSE_CONFIG_FOUND} OR ${UFCONFIG_FOUND}) AND
Keir Mierleefe7ac62012-06-24 22:25:28 -0700301 ${BLAS_AND_LAPACK_FOUND})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700302
303# By default, if all of SuiteSparse's dependencies are found, Ceres is
304# built with SuiteSparse support. -DSUITESPARSE=ON/OFF can be used to
305# enable/disable SuiteSparse explicitly.
306IF (DEFINED SUITESPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700307 IF (${SUITESPARSE})
308 IF (NOT ${SUITESPARSE_FOUND})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700309 MESSAGE(FATAL_ERROR "One or more of SuiteSparse's dependencies was not found")
Sameer Agarwald1146902012-05-30 01:40:22 -0700310 ENDIF (NOT ${SUITESPARSE_FOUND})
311 ELSE (${SUITESPARSE})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700312 ADD_DEFINITIONS(-DCERES_NO_SUITESPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700313 ENDIF (${SUITESPARSE})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700314ELSE (DEFINED SUITESPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700315 IF (${SUITESPARSE_FOUND})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700316 MESSAGE("-- Found all SuiteSparse dependencies. Building with SuiteSparse")
317 SET(SUITESPARSE ON)
Sameer Agarwald1146902012-05-30 01:40:22 -0700318 ELSE (${SUITESPARSE_FOUND})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700319 MESSAGE("-- Did not find all SuiteSparse dependencies. Building without SuiteSparse")
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700320 SET(SUITESPARSE OFF)
321 ADD_DEFINITIONS(-DCERES_NO_SUITESPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700322 ENDIF (${SUITESPARSE_FOUND})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700323ENDIF (DEFINED SUITESPARSE)
Keir Mierle8ebb0732012-04-30 23:09:08 -0700324
Sameer Agarwalb0518732012-05-29 00:27:57 -0700325# By default, if all of CXSparse's dependencies are found, Ceres is
326# built with CXSparse support. -DCXSPARSE=ON/OFF can be used to
327# enable/disable CXSparse explicitly.
328MESSAGE("-- Check for CXSparse")
329SET(CXSPARSE_FOUND ON)
330
331FIND_LIBRARY(CXSPARSE_LIB NAMES cxsparse PATHS ${CXSPARSE_SEARCH_LIBS})
332IF (EXISTS ${CXSPARSE_LIB})
333 MESSAGE("-- Found CXSparse library in: ${CXSPARSE_LIB}")
334ELSE (EXISTS ${CXSPARSE_LIB})
335 MESSAGE("-- Did not find CXSparse header")
336 SET(CXSPARSE_FOUND FALSE)
337ENDIF (EXISTS ${CXSPARSE_LIB})
338
339FIND_PATH(CXSPARSE_INCLUDE NAMES cs.h PATHS ${CXSPARSE_SEARCH_HEADERS})
340IF (EXISTS ${CXSPARSE_INCLUDE})
341 MESSAGE("-- Found CXSparse header in: ${CXSPARSE_INCLUDE}")
342ELSE (EXISTS ${CXSPARSE_INCLUDE})
343 MESSAGE("-- Did not find CXSparse header")
344 SET(CXSPARSE_FOUND FALSE)
345ENDIF (EXISTS ${CXSPARSE_INCLUDE})
346
347IF (DEFINED CXSPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700348 IF (${CXSPARSE})
349 IF (NOT ${CXSPARSE_FOUND})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700350 MESSAGE(FATAL_ERROR "-- CXSparse not found.")
Sameer Agarwald1146902012-05-30 01:40:22 -0700351 ENDIF (NOT ${CXSPARSE_FOUND})
352 ELSE (${CXSPARSE})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700353 ADD_DEFINITIONS(-DCERES_NO_CXSPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700354 ENDIF (${CXSPARSE})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700355ELSE (DEFINED CXSPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700356 IF (${CXSPARSE_FOUND})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700357 MESSAGE("-- Building with CXSparse support.")
358 SET(CXSPARSE ON)
Sameer Agarwald1146902012-05-30 01:40:22 -0700359 ELSE (${CXSPARSE_FOUND})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700360 MESSAGE("-- Building without CXSparse.")
361 SET(CXSPARSE OFF)
362 ADD_DEFINITIONS(-DCERES_NO_CXSPARSE)
Sameer Agarwald1146902012-05-30 01:40:22 -0700363 ENDIF (${CXSPARSE_FOUND})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700364ENDIF (DEFINED CXSPARSE)
365
Keir Mierle8ebb0732012-04-30 23:09:08 -0700366# Google Flags
367OPTION(GFLAGS
368 "Enable Google Flags."
369 ON)
370
Sameer Agarwald1146902012-05-30 01:40:22 -0700371IF (${GFLAGS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700372 MESSAGE("-- Check for Google Flags")
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700373 FIND_LIBRARY(GFLAGS_LIB NAMES gflags PATHS ${SEARCH_LIBS})
374 IF (NOT EXISTS ${GFLAGS_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700375 MESSAGE(FATAL_ERROR
376 "Can't find Google Flags. Please specify: "
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700377 "-DGFLAGS_LIB=...")
378 ENDIF (NOT EXISTS ${GFLAGS_LIB})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700379 MESSAGE("-- Found Google Flags library: ${GFLAGS_LIB}")
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700380 FIND_PATH(GFLAGS_INCLUDE NAMES gflags/gflags.h PATHS ${SEARCH_HEADERS})
381 IF (NOT EXISTS ${GFLAGS_INCLUDE})
382 MESSAGE(FATAL_ERROR
383 "Can't find Google Flags. Please specify: "
384 "-DGFLAGS_INCLUDE=...")
385 ENDIF (NOT EXISTS ${GFLAGS_INCLUDE})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700386 MESSAGE("-- Found Google Flags header in: ${GFLAGS_INCLUDE}")
Sameer Agarwald1146902012-05-30 01:40:22 -0700387ELSE (${GFLAGS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700388 MESSAGE("-- Google Flags disabled; no tests or tools will be built!")
389 ADD_DEFINITIONS(-DCERES_NO_GFLAGS)
Sameer Agarwald1146902012-05-30 01:40:22 -0700390ENDIF (${GFLAGS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700391
392# Google Logging
Keir Mierleaefb8a82012-07-28 13:23:55 -0700393IF (NOT ${BUILD_ANDROID})
394 MESSAGE("-- Check for Google Log")
395 FIND_LIBRARY(GLOG_LIB NAMES glog PATHS ${SEARCH_LIBS})
396 IF (NOT EXISTS ${GLOG_LIB})
397 MESSAGE(FATAL_ERROR
398 "Can't find Google Log. Please specify: "
399 "-DGLOG_LIB=...")
400 ENDIF (NOT EXISTS ${GLOG_LIB})
401 MESSAGE("-- Found Google Log library: ${GLOG_LIB}")
Sameer Agarwalaa9526d2012-05-08 21:22:09 -0700402
Keir Mierleaefb8a82012-07-28 13:23:55 -0700403 FIND_PATH(GLOG_INCLUDE NAMES glog/logging.h PATHS ${SEARCH_HEADERS})
404 IF (NOT EXISTS ${GLOG_INCLUDE})
405 MESSAGE(FATAL_ERROR
406 "Can't find Google Log. Please specify: "
407 "-DGLOG_INCLUDE=...")
408 ENDIF (NOT EXISTS ${GLOG_INCLUDE})
409 MESSAGE("-- Found Google Log header in: ${GLOG_INCLUDE}")
410ELSE (NOT ${BUILD_ANDROID})
411 SET(GLOG_LIB miniglog)
412 MESSAGE("-- Using minimal Glog substitute for Android (library): ${GLOG_LIB}")
413 SET(GLOG_INCLUDE internal/ceres/miniglog)
414 MESSAGE("-- Using minimal Glog substitute for Android (include): ${GLOG_INCLUDE}")
415ENDIF (NOT ${BUILD_ANDROID})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700416
417# Eigen
418MESSAGE("-- Check for Eigen 3.0")
Keir Mierlef477a382012-05-01 18:10:48 -0700419FIND_PATH(EIGEN_INCLUDE NAMES Eigen/Core PATHS ${EIGEN_SEARCH_HEADERS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700420IF (NOT EXISTS ${EIGEN_INCLUDE})
Keir Mierlef477a382012-05-01 18:10:48 -0700421 MESSAGE(FATAL_ERROR "Can't find Eigen. Try passing -DEIGEN_INCLUDE=...")
Keir Mierle8ebb0732012-04-30 23:09:08 -0700422ENDIF (NOT EXISTS ${EIGEN_INCLUDE})
423MESSAGE("-- Found Eigen 3.0: ${EIGEN_INCLUDE}")
424
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700425# Template specializations for the Schur complement based solvers. If
426# compile time, binary size or compiler performance is an issue, you
427# may consider disabling this.
Keir Mierle8ebb0732012-04-30 23:09:08 -0700428OPTION(SCHUR_SPECIALIZATIONS
429 "Enable fixed-size schur specializations."
430 ON)
431
Sameer Agarwald1146902012-05-30 01:40:22 -0700432IF (NOT ${SCHUR_SPECIALIZATIONS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700433 ADD_DEFINITIONS(-DCERES_RESTRICT_SCHUR_SPECIALIZATION)
Keir Mierlef10163a2012-05-04 21:33:53 -0700434 MESSAGE("-- Disabling Schur specializations (faster compiles)")
Sameer Agarwald1146902012-05-30 01:40:22 -0700435ENDIF (NOT ${SCHUR_SPECIALIZATIONS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700436
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700437# Multithreading using OpenMP
Keir Mierle8ebb0732012-04-30 23:09:08 -0700438OPTION(OPENMP
439 "Enable threaded solving in Ceres (requires OpenMP)"
440 ON)
441
Sameer Agarwald1146902012-05-30 01:40:22 -0700442IF (${OPENMP})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700443 FIND_PACKAGE(OpenMP)
Sameer Agarwald1146902012-05-30 01:40:22 -0700444 IF(${OPENMP_FOUND})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700445 MESSAGE("-- Found OpenMP.")
446 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
447 ADD_DEFINITIONS(-DCERES_USE_OPENMP)
Sameer Agarwald1146902012-05-30 01:40:22 -0700448 ELSE(${OPENMP_FOUND})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700449 MESSAGE("-- Can't find OpenMP. Continuing without it.")
Sameer Agarwald1146902012-05-30 01:40:22 -0700450 ENDIF(${OPENMP_FOUND})
451ENDIF (${OPENMP})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700452
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700453# Protocol buffers
Keir Mierle8ebb0732012-04-30 23:09:08 -0700454OPTION(PROTOBUF
455 "Enable protocol buffers support."
456 ON)
457
Sameer Agarwald1146902012-05-30 01:40:22 -0700458IF (${PROTOBUF})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700459 FIND_PACKAGE(Protobuf)
Sameer Agarwald1146902012-05-30 01:40:22 -0700460 IF (${PROTOBUF_FOUND})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700461 INCLUDE_DIRECTORIES(${PROTOBUF_INCLUDE_DIRS})
462 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/internal)
Sameer Agarwald1146902012-05-30 01:40:22 -0700463 ELSE (${PROTOBUF_FOUND})
Sameer Agarwaldd2b17d2012-08-16 19:34:57 -0700464 ADD_DEFINITIONS(-DCERES_NO_PROTOCOL_BUFFERS)
Sameer Agarwald1146902012-05-30 01:40:22 -0700465 ENDIF (${PROTOBUF_FOUND})
466ELSE (${PROTOBUF})
Sameer Agarwaldd2b17d2012-08-16 19:34:57 -0700467 ADD_DEFINITIONS(-DCERES_NO_PROTOCOL_BUFFERS)
Sameer Agarwald1146902012-05-30 01:40:22 -0700468ENDIF (${PROTOBUF})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700469
Keir Mierleaefb8a82012-07-28 13:23:55 -0700470
471# Use threads but not on Android, where there is no support for OpenMP yet.
Keir Mierle254f9d32012-08-02 21:18:49 -0700472IF ("${UNIX}" AND NOT ${BUILD_ANDROID})
Keir Mierleaefb8a82012-07-28 13:23:55 -0700473 # At least on Linux, we need pthreads to be enabled for mutex to compile.
474 # This may not work on windows or android.
Keir Mierle8ebb0732012-04-30 23:09:08 -0700475 FIND_PACKAGE(Threads REQUIRED)
476 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_THREAD_LIBS_INIT}")
477 ADD_DEFINITIONS(-DCERES_HAVE_PTHREAD)
478 ADD_DEFINITIONS(-DCERES_HAVE_RWLOCK)
Keir Mierle254f9d32012-08-02 21:18:49 -0700479ENDIF ("${UNIX}" AND NOT ${BUILD_ANDROID})
Keir Mierleaefb8a82012-07-28 13:23:55 -0700480
481# Disable threads in mutex.h. Someday, after there is OpenMP support in
Keir Mierle6ad62572012-08-22 11:10:31 -0700482# Android, this can get removed. Also turn on a workaround for an NDK bug.
Keir Mierleaefb8a82012-07-28 13:23:55 -0700483IF (${BUILD_ANDROID})
Keir Mierleff71d742012-08-10 17:05:15 -0700484 ADD_DEFINITIONS(-DCERES_NO_THREADS)
Keir Mierle6ad62572012-08-22 11:10:31 -0700485 ADD_DEFINITIONS(-DCERES_WORK_AROUND_ANDROID_NDK_COMPILER_BUG)
Keir Mierleaefb8a82012-07-28 13:23:55 -0700486ENDIF (${BUILD_ANDROID})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700487
Keir Mierled2164902012-08-15 19:04:50 -0700488OPTION(DISABLE_TR1
489 "Don't use TR1. This replaces some hash tables with sets. Slower."
490 OFF)
491
492IF (${DISABLE_TR1})
493 MESSAGE("-- Replacing unordered_map/set with map/set (warning: slower!)")
494 ADD_DEFINITIONS(-DCERES_NO_TR1)
495ELSE (${DISABLE_TR1})
496 MESSAGE("-- Using normal TR1 unordered_map/set")
497 # Use the std namespace for the hash<> and related templates. This may vary by
498 # system.
499 IF (MSVC)
500 # This is known to work with Visual Studio 2010 Express.
501 ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_START=namespace std {\"")
502 ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_END=}\"")
503 ELSE (MSVC)
504 # This is known to work with recent versions of Linux and Mac OS X.
505 ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_START=namespace std { namespace tr1 {\"")
506 ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_END=}}\"")
507 ENDIF (MSVC)
508ENDIF (${DISABLE_TR1})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700509
510INCLUDE_DIRECTORIES(
511 include
512 internal
513 internal/ceres
Keir Mierle8ebb0732012-04-30 23:09:08 -0700514 ${GLOG_INCLUDE}
Keir Mierle8ebb0732012-04-30 23:09:08 -0700515 ${EIGEN_INCLUDE}
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700516 )
517
Arnaud Gelas3d644b72012-08-16 17:33:21 +0200518FILE(GLOB CERES_HDRS ${CMAKE_SOURCE_DIR}/include/ceres/*.h)
519INSTALL(FILES ${CERES_HDRS} DESTINATION include/ceres)
520
521FILE(GLOB CERES_PUBLIC_INTERNAL_HDRS ${CMAKE_SOURCE_DIR}/include/ceres/internal/*.h)
522INSTALL(FILES ${CERES_PUBLIC_INTERNAL_HDRS} DESTINATION include/ceres/internal)
523
Sameer Agarwald1146902012-05-30 01:40:22 -0700524IF (${SUITESPARSE})
Markus Mollc497bd62012-08-17 14:40:13 +0200525 INCLUDE_DIRECTORIES(${AMD_INCLUDE})
526 INCLUDE_DIRECTORIES(${CAMD_INCLUDE})
527 INCLUDE_DIRECTORIES(${COLAMD_INCLUDE})
528 INCLUDE_DIRECTORIES(${CCOLAMD_INCLUDE})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700529 INCLUDE_DIRECTORIES(${CHOLMOD_INCLUDE})
Markus Mollc497bd62012-08-17 14:40:13 +0200530 IF (${SUITESPARSE_CONFIG_FOUND})
531 INCLUDE_DIRECTORIES(${SUITESPARSE_CONFIG_INCLUDE})
532 ENDIF (${SUITESPARSE_CONFIG_FOUND})
533 IF (${UFCONFIG_FOUND})
534 INCLUDE_DIRECTORIES(${UFCONFIG_INCLUDE})
535 ENDIF (${UFCONFIG_FOUND})
Sameer Agarwald1146902012-05-30 01:40:22 -0700536ENDIF(${SUITESPARSE})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700537
Sameer Agarwald1146902012-05-30 01:40:22 -0700538IF (${CXSPARSE})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700539 INCLUDE_DIRECTORIES(${CXSPARSE_INCLUDE})
Sameer Agarwald1146902012-05-30 01:40:22 -0700540ENDIF(${CXSPARSE})
Sameer Agarwalb0518732012-05-29 00:27:57 -0700541
Sameer Agarwald1146902012-05-30 01:40:22 -0700542IF (${GFLAGS})
Sameer Agarwaldaa98242012-05-11 11:26:38 -0700543 INCLUDE_DIRECTORIES(${GFLAGS_INCLUDE})
Sameer Agarwald1146902012-05-30 01:40:22 -0700544ENDIF (${GFLAGS})
Keir Mierle8ebb0732012-04-30 23:09:08 -0700545
Sameer Agarwal8e2420e2012-05-31 17:00:58 -0700546# Change the default build type from Debug to Release, while still
547# supporting overriding the build type.
Sameer Agarwal4845bc42012-06-05 21:32:57 -0700548#
549# The CACHE STRING logic here and elsewhere is needed to force CMake
550# to pay attention to the value of these variables.
551IF (NOT CMAKE_BUILD_TYPE)
552 MESSAGE("-- No build type specified; defaulting to CMAKE_BUILD_TYPE=Release.")
553 SET(CMAKE_BUILD_TYPE Release CACHE STRING
554 "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
555 FORCE)
556ELSE (NOT CMAKE_BUILD_TYPE)
Sameer Agarwal8e2420e2012-05-31 17:00:58 -0700557 IF (CMAKE_BUILD_TYPE STREQUAL "Debug")
558 MESSAGE("\n=================================================================================")
559 MESSAGE("\n-- Build type: Debug. Performance will be terrible!")
560 MESSAGE("-- Add -DCMAKE_BUILD_TYPE=Release to the CMake command line to get an optimized build.")
561 MESSAGE("\n=================================================================================")
Sameer Agarwal8e2420e2012-05-31 17:00:58 -0700562 ENDIF (CMAKE_BUILD_TYPE STREQUAL "Debug")
Sameer Agarwal4845bc42012-06-05 21:32:57 -0700563ENDIF (NOT CMAKE_BUILD_TYPE)
564
565# Set the default Ceres flags to an empty string.
566SET (CERES_CXX_FLAGS)
567
568IF (CMAKE_BUILD_TYPE STREQUAL "Release")
569 IF (CMAKE_COMPILER_IS_GNUCXX)
Keir Mierleaefb8a82012-07-28 13:23:55 -0700570 IF (${BUILD_ANDROID})
571 # TODO(keir): Figure out what flags should go here to make an optimized
572 # native ARM binary for Android.
573 ELSE (${BUILD_ANDROID})
574 # Linux
575 IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
576 SET (CERES_CXX_FLAGS "${CERES_CXX_FLAGS} -march=native -mtune=native")
577 ENDIF (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
578 # Mac OS X
579 IF (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
580 SET (CERES_CXX_FLAGS "${CERES_CXX_FLAGS} -fast -msse3")
581 ENDIF (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
582 ENDIF (${BUILD_ANDROID})
Sameer Agarwal4845bc42012-06-05 21:32:57 -0700583 ENDIF (CMAKE_COMPILER_IS_GNUCXX)
584 SET (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${CERES_CXX_FLAGS}"
585 CACHE STRING "Release mode flags to the C++ Compiler" FORCE)
586ENDIF (CMAKE_BUILD_TYPE STREQUAL "Release")
Keir Mierleefe7ac62012-06-24 22:25:28 -0700587
588# After the tweaks for the compile settings, disable some warnings on MSVC.
589IF (MSVC)
590 # Disable signed/unsigned int conversion warnings.
Keir Mierleaefb8a82012-07-28 13:23:55 -0700591 ADD_DEFINITIONS("/wd4018")
Keir Mierleefe7ac62012-06-24 22:25:28 -0700592 # Disable warning about using struct/class for the same symobl.
Keir Mierleaefb8a82012-07-28 13:23:55 -0700593 ADD_DEFINITIONS("/wd4099")
Keir Mierleefe7ac62012-06-24 22:25:28 -0700594 # Disable warning about the insecurity of using "std::copy".
595 ADD_DEFINITIONS("/wd4996")
596 # Disable performance warning about int-to-bool conversion.
597 ADD_DEFINITIONS("/wd4800")
598 # Disable performance warning about fopen insecurity.
599 ADD_DEFINITIONS("/wd4996")
600 # Disable warning about int64 to int32 conversion. Disabling
601 # this warning may not be correct; needs investigation.
602 # TODO(keir): Investigate these warnings in more detail.
603 ADD_DEFINITIONS("/wd4244")
604 # It's not possible to use STL types in DLL interfaces in a portable and
605 # reliable way. However, that's what happens with Google Log and Google Flags
606 # on Windows. MSVC gets upset about this and throws warnings that we can't do
607 # much about. The real solution is to link static versions of Google Log and
608 # Google Test, but that seems tricky on Windows. So, disable the warning.
609 ADD_DEFINITIONS("/wd4251")
610
611 # Google Flags doesn't have their DLL import/export stuff set up correctly,
612 # which results in linker warnings. This is irrelevant for Ceres, so ignore
613 # the warnings.
614 SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ignore:4049")
615ENDIF (MSVC)
616
Keir Mierle97ca0fb2012-09-18 15:52:36 -0700617# GCC is not strict enough by default, so enable most of the warnings.
618IF ("${UNIX}")
619 SET(CMAKE_CXX_FLAGS
Sameer Agarwald3ace022012-09-23 18:19:49 -0700620 "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused -Wno-unused-parameter")
Keir Mierle97ca0fb2012-09-18 15:52:36 -0700621ENDIF ("${UNIX}")
622
Keir Mierleefe7ac62012-06-24 22:25:28 -0700623ADD_SUBDIRECTORY(internal/ceres)
Arnaud Gelasb12b9062012-08-15 16:27:38 +0200624
625OPTION(BUILD_DOCUMENTATION
626 "Build User's Guide (pdf)"
627 OFF)
628
629IF (${BUILD_DOCUMENTATION})
630 MESSAGE("-- Documentation building is enabled")
631
632 # Generate the User's Guide (pdf).
633 # The corresponding target is UserGuide, but is included in ALL.
634 ADD_SUBDIRECTORY(docs)
635ENDIF (${BUILD_DOCUMENTATION})
Arnaud Gelas73166092012-08-20 15:40:41 +0200636
637OPTION(BUILD_EXAMPLES "Build examples" ON)
638
639IF (${BUILD_EXAMPLES})
640 MESSAGE("-- Build the examples.")
641 ADD_SUBDIRECTORY(examples)
642ELSE (${BUILD_EXAMPLES})
643 MESSAGE("-- Do not build any example.")
644ENDIF (${BUILD_EXAMPLES})
Arnaud Gelas9ad27e82012-08-21 09:56:30 +0200645
646# Add an uninstall target to remove all installed files.
647CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/cmake/uninstall.cmake.in"
648 "${CMAKE_BINARY_DIR}/cmake/uninstall.cmake"
649 IMMEDIATE @ONLY)
650
651ADD_CUSTOM_TARGET(uninstall
652 COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/cmake/uninstall.cmake)