~ubuntu-branches/ubuntu/raring/ceres-solver/raring

« back to all changes in this revision

Viewing changes to CMakeLists.txt

  • Committer: Package Import Robot
  • Author(s): Koichi Akabe
  • Date: 2012-06-04 07:15:43 UTC
  • Revision ID: package-import@ubuntu.com-20120604071543-zx6uthupvmtqn3k2
Tags: upstream-1.1.1
ImportĀ upstreamĀ versionĀ 1.1.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Ceres Solver - A fast non-linear least squares minimizer
 
2
# Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
 
3
# http://code.google.com/p/ceres-solver/
 
4
#
 
5
# Redistribution and use in source and binary forms, with or without
 
6
# modification, are permitted provided that the following conditions are met:
 
7
#
 
8
# * Redistributions of source code must retain the above copyright notice,
 
9
#   this list of conditions and the following disclaimer.
 
10
# * Redistributions in binary form must reproduce the above copyright notice,
 
11
#   this list of conditions and the following disclaimer in the documentation
 
12
#   and/or other materials provided with the distribution.
 
13
# * Neither the name of Google Inc. nor the names of its contributors may be
 
14
#   used to endorse or promote products derived from this software without
 
15
#   specific prior written permission.
 
16
#
 
17
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 
18
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
19
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 
20
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 
21
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 
22
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 
23
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 
24
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 
25
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 
26
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 
27
# POSSIBILITY OF SUCH DAMAGE.
 
28
#
 
29
# Author: keir@google.com (Keir Mierle)
 
30
 
 
31
CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
 
32
 
 
33
IF (COMMAND cmake_policy)
 
34
  CMAKE_POLICY(SET CMP0003 NEW)
 
35
ENDIF (COMMAND cmake_policy)
 
36
 
 
37
PROJECT(CERES C CXX)
 
38
 
 
39
ENABLE_TESTING()
 
40
 
 
41
OPTION(BUILD_TESTING
 
42
       "Enable tests"
 
43
       ON)
 
44
 
 
45
# To get a more static build, try the following line on Mac and Linux:
 
46
# SET(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
 
47
 
 
48
# Default locations to search for on various platforms.
 
49
LIST(APPEND SEARCH_LIBS /usr/lib)
 
50
LIST(APPEND SEARCH_LIBS /usr/local/lib)
 
51
LIST(APPEND SEARCH_LIBS /usr/local/homebrew/lib) # Mac OS X
 
52
LIST(APPEND SEARCH_LIBS /opt/local/lib)
 
53
 
 
54
LIST(APPEND SEARCH_HEADERS /usr/include)
 
55
LIST(APPEND SEARCH_HEADERS /usr/local/include)
 
56
LIST(APPEND SEARCH_HEADERS /usr/local/homebrew/include) # Mac OS X
 
57
LIST(APPEND SEARCH_HEADERS /opt/local/include)
 
58
 
 
59
# Locations to search for Eigen
 
60
SET(EIGEN_SEARCH_HEADERS ${SEARCH_HEADERS})
 
61
LIST(APPEND EIGEN_SEARCH_HEADERS /usr/include/eigen3) # Ubuntu 10.04's default location.
 
62
LIST(APPEND EIGEN_SEARCH_HEADERS /usr/local/include/eigen3) 
 
63
LIST(APPEND EIGEN_SEARCH_HEADERS /usr/local/homebrew/include/eigen3)  # Mac OS X
 
64
LIST(APPEND EIGEN_SEARCH_HEADERS /opt/local/var/macports/software/eigen3/opt/local/include/eigen3) # Mac OS X
 
65
 
 
66
# Locations to search for SuiteSparse
 
67
SET(SUITESPARSE_SEARCH_LIBS ${SEARCH_LIBS})
 
68
LIST(APPEND SUITESPARSE_SEARCH_LIBS /usr/lib/suitesparse) # Ubuntu
 
69
LIST(APPEND SUITESPARSE_SEARCH_LIBS /usr/local/lib/suitesparse) 
 
70
LIST(APPEND SUITESPARSE_SEARCH_LIBS /opt/local/lib/ufsparse) # Mac OS X
 
71
 
 
72
SET(SUITESPARSE_SEARCH_HEADERS ${SEARCH_HEADERS})
 
73
LIST(APPEND SUITESPARSE_SEARCH_HEADERS /usr/include/suitesparse) # Ubuntu
 
74
LIST(APPEND SUITESPARSE_SEARCH_HEADERS /usr/local/include/suitesparse) 
 
75
LIST(APPEND SUITESPARSE_SEARCH_HEADERS /opt/local/include/ufsparse) # Mac OS X
 
76
 
 
77
# Check for SuiteSparse dependencies
 
78
MESSAGE("-- Check for AMD")
 
79
SET(AMD_FOUND TRUE)
 
80
 
 
81
FIND_LIBRARY(AMD_LIB NAMES amd PATHS ${SUITESPARSE_SEARCH_LIBS})
 
82
IF (EXISTS ${AMD_LIB}) 
 
83
  MESSAGE("-- Found AMD library: ${AMD_LIB}")
 
84
ELSE (EXISTS ${AMD_LIB})
 
85
  MESSAGE("-- Did not find AMD library")
 
86
  SET(AMD_FOUND FALSE)
 
87
ENDIF (EXISTS ${AMD_LIB})
 
88
 
 
89
FIND_PATH(AMD_INCLUDE NAMES amd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
 
90
IF (EXISTS ${AMD_INCLUDE}) 
 
91
  MESSAGE("-- Found AMD header in: ${AMD_INCLUDE}")
 
92
ELSE (EXISTS ${AMD_INCLUDE})
 
93
  MESSAGE("-- Did not find AMD header")
 
94
  SET(AMD_FOUND FALSE)
 
95
ENDIF (EXISTS ${AMD_INCLUDE})
 
96
 
 
97
MESSAGE("-- Check for CAMD")
 
98
SET(CAMD_FOUND TRUE)
 
99
 
 
100
FIND_LIBRARY(CAMD_LIB NAMES camd PATHS ${SUITESPARSE_SEARCH_LIBS})
 
101
IF (EXISTS ${CAMD_LIB}) 
 
102
  MESSAGE("-- Found CAMD library: ${CAMD_LIB}")
 
103
ELSE (EXISTS ${CAMD_LIB})
 
104
  MESSAGE("-- Did not find CAMD library")
 
105
  SET(CAMD_FOUND FALSE)
 
106
ENDIF (EXISTS ${CAMD_LIB})
 
107
 
 
108
FIND_PATH(CAMD_INCLUDE NAMES camd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
 
109
IF (EXISTS ${CAMD_INCLUDE}) 
 
110
  MESSAGE("-- Found CAMD header in: ${CAMD_INCLUDE}")
 
111
ELSE (EXISTS ${CAMD_INCLUDE})
 
112
  MESSAGE("-- Did not find CAMD header")
 
113
  SET(CAMD_FOUND FALSE)
 
114
ENDIF (EXISTS ${CAMD_INCLUDE})
 
115
 
 
116
MESSAGE("-- Check for COLAMD")
 
117
SET(COLAMD_FOUND TRUE)
 
118
 
 
119
FIND_LIBRARY(COLAMD_LIB NAMES colamd PATHS ${SUITESPARSE_SEARCH_LIBS})
 
120
IF (EXISTS ${COLAMD_LIB}) 
 
121
  MESSAGE("-- Found COLAMD library: ${COLAMD_LIB}")
 
122
ELSE (EXISTS ${COLAMD_LIB})
 
123
  MESSAGE("-- Did not find COLAMD library")
 
124
  SET(COLAMD_FOUND FALSE)
 
125
ENDIF (EXISTS ${COLAMD_LIB})
 
126
 
 
127
FIND_PATH(COLAMD_INCLUDE NAMES colamd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
 
128
IF (EXISTS ${COLAMD_INCLUDE}) 
 
129
  MESSAGE("-- Found COLAMD header in: ${COLAMD_INCLUDE}")
 
130
ELSE (EXISTS ${COLAMD_INCLUDE})
 
131
  MESSAGE("-- Did not find COLAMD header")
 
132
  SET(COLAMD_FOUND FALSE)
 
133
ENDIF (EXISTS ${COLAMD_INCLUDE})
 
134
 
 
135
MESSAGE("-- Check for CCOLAMD")
 
136
SET(CCOLAMD_FOUND TRUE)
 
137
 
 
138
FIND_LIBRARY(CCOLAMD_LIB NAMES ccolamd PATHS ${SUITESPARSE_SEARCH_LIBS})
 
139
IF (EXISTS ${CCOLAMD_LIB}) 
 
140
  MESSAGE("-- Found CCOLAMD library: ${CCOLAMD_LIB}")
 
141
ELSE (EXISTS ${CCOLAMD_LIB})
 
142
  MESSAGE("-- Did not find CCOLAMD library")
 
143
  SET(CCOLAMD_FOUND FALSE)
 
144
ENDIF (EXISTS ${CCOLAMD_LIB})
 
145
 
 
146
FIND_PATH(CCOLAMD_INCLUDE NAMES ccolamd.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
 
147
IF (EXISTS ${CCOLAMD_INCLUDE}) 
 
148
  MESSAGE("-- Found CCOLAMD header in: ${CCOLAMD_INCLUDE}")
 
149
ELSE (EXISTS ${CCOLAMD_INCLUDE})
 
150
  MESSAGE("-- Did not find CCOLAMD header")
 
151
  SET(CCOLAMD_FOUND FALSE)
 
152
ENDIF (EXISTS ${CCOLAMD_INCLUDE})
 
153
 
 
154
MESSAGE("-- Check for CHOLMOD")
 
155
SET(CHOLMOD_FOUND TRUE)
 
156
 
 
157
FIND_LIBRARY(CHOLMOD_LIB NAMES cholmod PATHS ${SUITESPARSE_SEARCH_LIBS})
 
158
IF (EXISTS ${CHOLMOD_LIB}) 
 
159
  MESSAGE("-- Found CHOLMOD library: ${CHOLMOD_LIB}")
 
160
ELSE (EXISTS ${CHOLMOD_LIB})
 
161
  MESSAGE("-- Did not find CHOLMOD library")
 
162
  SET(CHOLMOD_FOUND FALSE)
 
163
ENDIF (EXISTS ${CHOLMOD_LIB})
 
164
 
 
165
FIND_PATH(CHOLMOD_INCLUDE NAMES cholmod.h PATHS ${SUITESPARSE_SEARCH_HEADERS})
 
166
IF (EXISTS ${CHOLMOD_INCLUDE}) 
 
167
  MESSAGE("-- Found CHOLMOD header in: ${CHOLMOD_INCLUDE}")
 
168
ELSE (EXISTS ${CHOLMOD_INCLUDE})
 
169
  MESSAGE("-- Did not find CHOLMOD header")
 
170
  SET(CHOLMOD_FOUND FALSE)
 
171
ENDIF (EXISTS ${CHOLMOD_INCLUDE})
 
172
 
 
173
MESSAGE("-- Check for METIS (optional)")
 
174
FIND_LIBRARY(METIS_LIB NAMES metis PATHS ${SUITESPARSE_SEARCH_LIBS})
 
175
 
 
176
IF (EXISTS ${METIS_LIB}) 
 
177
  MESSAGE("-- Found METIS library: ${METIS_LIB}")
 
178
ELSE (EXISTS ${METIS_LIB})
 
179
  MESSAGE("-- Did not find METIS library")
 
180
ENDIF (EXISTS ${METIS_LIB})
 
181
 
 
182
SET(BLAS_AND_LAPACK_FOUND TRUE)
 
183
IF (APPLE)
 
184
  # Mac OS X has LAPACK/BLAS bundled in a framework called
 
185
  # "vecLib". Search for that instead of for the normal "lapack"
 
186
  # library.
 
187
  FIND_LIBRARY(LAPACK_LIB NAMES vecLib)
 
188
ELSE (APPLE)
 
189
  FIND_LIBRARY(BLAS_LIB NAMES blas)
 
190
  IF (EXISTS ${BLAS_LIB}) 
 
191
    MESSAGE("-- Found BLAS library: ${BLAS_LIB}")
 
192
  ELSE (EXISTS ${BLAS_LIB})
 
193
    MESSAGE("-- Did not find BLAS library")
 
194
    SET(BLAS_AND_LAPACK_FOUND FALSE)
 
195
  ENDIF (EXISTS ${BLAS_LIB})
 
196
  FIND_LIBRARY(LAPACK_LIB NAMES lapack)
 
197
ENDIF (APPLE)
 
198
 
 
199
IF (EXISTS ${LAPACK_LIB}) 
 
200
  MESSAGE("-- Found LAPACK library: ${LAPACK_LIB}")
 
201
ELSE (EXISTS ${LAPACK_LIB})
 
202
  SET(BLAS_AND_LAPACK_FOUND FALSE)
 
203
  MESSAGE("-- Did not find LAPACK library")
 
204
ENDIF (EXISTS ${LAPACK_LIB})
 
205
 
 
206
SET(SUITESPARSE_FOUND 
 
207
    AMD_FOUND AND
 
208
    CAMD_FOUND AND
 
209
    COLAMD_FOUND AND
 
210
    CCOLAMD_FOUND AND
 
211
    CHOLMOD_FOUND AND
 
212
    BLAS_AND_LAPACK_FOUND)
 
213
 
 
214
# By default, if all of SuiteSparse's dependencies are found, Ceres is
 
215
# built with SuiteSparse support. -DSUITESPARSE=ON/OFF can be used to
 
216
# enable/disable SuiteSparse explicitly.
 
217
IF (DEFINED SUITESPARSE)
 
218
  IF (SUITESPARSE AND NOT SUITESPARSE_FOUND)
 
219
    MESSAGE(FATAL_ERROR "One or more of SuiteSparse's dependencies was not found")
 
220
  ENDIF (SUITESPARSE AND NOT SUITESPARSE_FOUND)
 
221
ELSE (DEFINED SUITESPARSE)
 
222
  IF (SUITESPARSE_FOUND)
 
223
    MESSAGE("-- Found all SuiteSparse dependencies. Building with SuiteSparse")
 
224
    SET(SUITESPARSE ON)
 
225
  ELSE (SUITESPARSE_FOUND)
 
226
    MESSAGE("-- Did not find all SuiteSparse dependencies. Building without SuiteSparse")       
 
227
    SET(SUITESPARSE OFF)
 
228
    ADD_DEFINITIONS(-DCERES_NO_SUITESPARSE)
 
229
  ENDIF (SUITESPARSE_FOUND)
 
230
ENDIF (DEFINED SUITESPARSE)
 
231
 
 
232
# Google Flags
 
233
OPTION(GFLAGS
 
234
       "Enable Google Flags."
 
235
       ON)
 
236
 
 
237
IF (GFLAGS)
 
238
  MESSAGE("-- Check for Google Flags")
 
239
  FIND_LIBRARY(GFLAGS_LIB NAMES gflags PATHS ${SEARCH_LIBS})
 
240
  IF (NOT EXISTS ${GFLAGS_LIB})
 
241
    MESSAGE(FATAL_ERROR
 
242
            "Can't find Google Flags. Please specify: "
 
243
            "-DGFLAGS_LIB=...")
 
244
  ENDIF (NOT EXISTS ${GFLAGS_LIB})
 
245
  MESSAGE("-- Found Google Flags library: ${GFLAGS_LIB}")
 
246
  FIND_PATH(GFLAGS_INCLUDE NAMES gflags/gflags.h PATHS ${SEARCH_HEADERS})
 
247
  IF (NOT EXISTS ${GFLAGS_INCLUDE})
 
248
    MESSAGE(FATAL_ERROR
 
249
            "Can't find Google Flags. Please specify: "
 
250
            "-DGFLAGS_INCLUDE=...")
 
251
  ENDIF (NOT EXISTS ${GFLAGS_INCLUDE})
 
252
  MESSAGE("-- Found Google Flags header in: ${GFLAGS_INCLUDE}")
 
253
ELSE (GFLAGS)
 
254
  MESSAGE("-- Google Flags disabled; no tests or tools will be built!")
 
255
  ADD_DEFINITIONS(-DCERES_NO_GFLAGS)
 
256
ENDIF (GFLAGS)
 
257
 
 
258
# Google Logging
 
259
MESSAGE("-- Check for Google Log")
 
260
FIND_LIBRARY(GLOG_LIB NAMES glog PATHS ${SEARCH_LIBS})
 
261
IF (NOT EXISTS ${GLOG_LIB})
 
262
  MESSAGE(FATAL_ERROR
 
263
          "Can't find Google Log. Please specify: "
 
264
          "-DGLOG_LIB=...")
 
265
ENDIF (NOT EXISTS ${GLOG_LIB})
 
266
MESSAGE("-- Found Google Log library: ${GLOG_LIB}")
 
267
 
 
268
FIND_PATH(GLOG_INCLUDE NAMES glog/logging.h PATHS ${SEARCH_HEADERS})
 
269
IF (NOT EXISTS ${GLOG_INCLUDE})
 
270
  MESSAGE(FATAL_ERROR
 
271
          "Can't find Google Log. Please specify: "
 
272
          "-DGLOG_INCLUDE=...")
 
273
ENDIF (NOT EXISTS ${GLOG_INCLUDE})
 
274
MESSAGE("-- Found Google Log header in: ${GLOG_INCLUDE}")
 
275
 
 
276
# Eigen
 
277
MESSAGE("-- Check for Eigen 3.0")
 
278
FIND_PATH(EIGEN_INCLUDE NAMES Eigen/Core PATHS ${EIGEN_SEARCH_HEADERS})
 
279
IF (NOT EXISTS ${EIGEN_INCLUDE})
 
280
  MESSAGE(FATAL_ERROR "Can't find Eigen. Try passing -DEIGEN_INCLUDE=...")
 
281
ENDIF (NOT EXISTS ${EIGEN_INCLUDE})
 
282
MESSAGE("-- Found Eigen 3.0: ${EIGEN_INCLUDE}")
 
283
 
 
284
# Template specializations for the Schur complement based solvers. If
 
285
# compile time, binary size or compiler performance is an issue, you
 
286
# may consider disabling this.
 
287
OPTION(SCHUR_SPECIALIZATIONS
 
288
       "Enable fixed-size schur specializations."
 
289
       ON)
 
290
 
 
291
IF (NOT SCHUR_SPECIALIZATIONS)
 
292
  ADD_DEFINITIONS(-DCERES_RESTRICT_SCHUR_SPECIALIZATION)
 
293
  MESSAGE("-- Disabling Schur specializations (faster compiles)")
 
294
ENDIF (NOT SCHUR_SPECIALIZATIONS)
 
295
 
 
296
# Multithreading using OpenMP
 
297
OPTION(OPENMP
 
298
       "Enable threaded solving in Ceres (requires OpenMP)"
 
299
       ON)
 
300
 
 
301
IF (OPENMP)
 
302
  FIND_PACKAGE(OpenMP)
 
303
  IF(OPENMP_FOUND)
 
304
    MESSAGE("-- Found OpenMP.")
 
305
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
 
306
    ADD_DEFINITIONS(-DCERES_USE_OPENMP)
 
307
  ELSE(OPENMP_FOUND)
 
308
    MESSAGE("-- Can't find OpenMP. Continuing without it.")
 
309
  ENDIF(OPENMP_FOUND)
 
310
ENDIF (OPENMP)
 
311
 
 
312
# Protocol buffers
 
313
OPTION(PROTOBUF
 
314
       "Enable protocol buffers support."
 
315
       ON)
 
316
 
 
317
IF (PROTOBUF)
 
318
  FIND_PACKAGE(Protobuf)
 
319
  IF (PROTOBUF_FOUND)
 
320
    INCLUDE_DIRECTORIES(${PROTOBUF_INCLUDE_DIRS})
 
321
    INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/internal)
 
322
  ELSE (PROTOBUF_FOUND)
 
323
    ADD_DEFINITIONS(-DCERES_DONT_HAVE_PROTOCOL_BUFFERS)
 
324
  ENDIF (PROTOBUF_FOUND)
 
325
ELSE (PROTOBUF)
 
326
  ADD_DEFINITIONS(-DCERES_DONT_HAVE_PROTOCOL_BUFFERS)
 
327
ENDIF (PROTOBUF)
 
328
 
 
329
IF (UNIX)
 
330
  # Atleast on linux, we need pthreads to be enabled for mutex to
 
331
  # compile. This may not work on windows or android.
 
332
  FIND_PACKAGE(Threads REQUIRED)
 
333
  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_THREAD_LIBS_INIT}")
 
334
  ADD_DEFINITIONS(-DCERES_HAVE_PTHREAD)
 
335
  ADD_DEFINITIONS(-DCERES_HAVE_RWLOCK)
 
336
ENDIF (UNIX)
 
337
 
 
338
# Use the std namespace for the hash<> and related templates. This may vary by
 
339
# system.
 
340
ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_START=namespace std { namespace tr1 {\"")
 
341
ADD_DEFINITIONS("\"-DCERES_HASH_NAMESPACE_END=}}\"")
 
342
 
 
343
INCLUDE_DIRECTORIES(
 
344
  include
 
345
  internal
 
346
  internal/ceres
 
347
  ${GLOG_INCLUDE}
 
348
  ${EIGEN_INCLUDE}
 
349
  )
 
350
 
 
351
IF (SUITESPARSE)
 
352
  INCLUDE_DIRECTORIES(${CHOLMOD_INCLUDE})
 
353
ENDIF(SUITESPARSE)
 
354
 
 
355
IF (GFLAGS)
 
356
  INCLUDE_DIRECTORIES(${GFLAGS_INCLUDE})
 
357
ENDIF (GFLAGS)
 
358
 
 
359
# Change the default build type from Debug to Release, while still
 
360
# supporting overriding the build type.
 
361
IF (NOT CMAKE_BUILD_TYPE)
 
362
  SET(CMAKE_BUILD_TYPE Release)
 
363
ENDIF (NOT CMAKE_BUILD_TYPE)
 
364
 
 
365
ADD_SUBDIRECTORY(internal/ceres)
 
366
ADD_SUBDIRECTORY(examples)
 
367
 
 
368
# TODO(sameeragarwal): The following flags break the old gcc that
 
369
# ships on Mac OS X. Make this conditional on operating system and
 
370
# compiler.
 
371
#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mtune=native -march=native")