Skip to content

Commit a354f02

Browse files
committed
Support Flann and Cereal from external dependencies
1 parent 51038c9 commit a354f02

File tree

5 files changed

+180
-57
lines changed

5 files changed

+180
-57
lines changed

CMakeLists.txt

Lines changed: 80 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -218,24 +218,71 @@ include_directories(
218218
# as system headers.
219219
include_directories(SYSTEM ${EIGEN_INCLUDE_DIRS})
220220

221+
222+
set(THEIA_USE_EXTERNAL_CEREAL OFF CACHE BOOL "Use a system Cereal library")
223+
set(THEIA_USE_EXTERNAL_FLANN OFF CACHE BOOL "Use a system Flann library")
224+
221225
# build Third party libraries included in distro.
222-
add_subdirectory(libraries)
223-
include_directories(
224-
libraries
225-
libraries/spectra
226-
${akaze_SOURCE_DIR}
227-
${akaze_INCLUDE_DIR}
228-
${cereal_SOURCE_DIR}
229-
${cereal_SOURCE_DIR}/include
230-
${flann_SOURCE_DIR}
231-
${flann_SOURCE_DIR}/src/cpp
232-
${gtest_SOURCE_DIR}/include
233-
${gtest_SOURCE_DIR}
234-
${optimo_SOURCE_DIR}
235-
${statx_SOURCE_DIR}
236-
${stlplus3_SOURCE_DIR}
237-
${vlfeat_SOURCE_DIR}
238-
${visual_sfm_SOURCE_DIR})
226+
if (${BUILD_TESTING})
227+
add_subdirectory(libraries/gtest)
228+
include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})
229+
endif (${BUILD_TESTING})
230+
231+
# AKAZE feature extractor.
232+
add_subdirectory(libraries/akaze)
233+
include_directories(${akaze_SOURCE_DIR} ${akaze_INCLUDE_DIR})
234+
235+
# Cereal for portable IO.
236+
if(NOT THEIA_USE_EXTERNAL_CEREAL)
237+
add_subdirectory(libraries/cereal)
238+
239+
include_directories(${cereal_SOURCE_DIR} ${cereal_SOURCE_DIR}/include)
240+
set(THEIA_INTERNAL_CEREAL_LIB ${THEIA_INTERNAL_LIB_PREFIX}/cereal ${THEIA_INTERNAL_LIB_PREFIX}/cereal/include)
241+
else()
242+
find_package(cereal REQUIRED)
243+
244+
set(_THEIA_CEREAL_LIBRARIES cereal)
245+
endif()
246+
247+
# Flann for fast approximate nearest neighbor searches.
248+
if(NOT THEIA_USE_EXTERNAL_FLANN)
249+
add_subdirectory(libraries/flann)
250+
251+
include_directories(${flann_SOURCE_DIR} ${flann_SOURCE_DIR}/src/cpp)
252+
set(_THEIA_FLANN_LIBRARIES flann_cpp)
253+
set(THEIA_INTERNAL_FLANN_LIB ${THEIA_INTERNAL_LIB_PREFIX}/flann)
254+
else()
255+
find_package(Flann REQUIRED)
256+
257+
include_directories(${FLANN_INCLUDE_DIR})
258+
set(_THEIA_FLANN_LIBRARIES ${FLANN_LIBRARY})
259+
endif()
260+
261+
# Add Optimo.
262+
add_subdirectory(libraries/optimo)
263+
include_directories(${optimo_SOURCE_DIR})
264+
265+
# Add Spectra.
266+
include_directories(libraries/spectra)
267+
268+
# Add Statx.
269+
add_subdirectory(libraries/statx)
270+
include_directories(${statx_SOURCE_DIR})
271+
272+
# STLPlus for filepath tools.
273+
add_subdirectory(libraries/stlplus3)
274+
include_directories(${stlplus3_SOURCE_DIR})
275+
276+
# Add VLFeat.
277+
add_subdirectory(libraries/vlfeat)
278+
include_directories(${vlfeat_SOURCE_DIR})
279+
280+
# Add VisualSfM files.
281+
add_subdirectory(libraries/visual_sfm)
282+
include_directories(${visual_sfm_SOURCE_DIR})
283+
284+
include_directories(libraries)
285+
239286

240287
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
241288
include(OptimizeTheiaCompilerFlags)
@@ -260,7 +307,19 @@ install(FILES ${THEIA_HDRS} DESTINATION include/theia)
260307
file(GLOB_RECURSE THEIA_INTERNAL_HDRS ${CMAKE_SOURCE_DIR}/src/theia/*.h)
261308
install(DIRECTORY src/theia/ DESTINATION include/theia FILES_MATCHING PATTERN "*.h")
262309

263-
install(DIRECTORY libraries/ DESTINATION include/theia/libraries FILES_MATCHING PATTERN "*.h*")
310+
install(DIRECTORY libraries/akaze/ DESTINATION include/theia/libraries/akaze FILES_MATCHING PATTERN "*.h*")
311+
if(NOT THEIA_USE_EXTERNAL_CEREAL)
312+
install(DIRECTORY libraries/cereal/ DESTINATION include/theia/libraries/cereal FILES_MATCHING PATTERN "*.h*")
313+
endif()
314+
if(NOT THEIA_USE_EXTERNAL_FLANN)
315+
install(DIRECTORY libraries/flann/ DESTINATION include/theia/libraries/flann FILES_MATCHING PATTERN "*.h*")
316+
endif()
317+
install(DIRECTORY libraries/optimo/ DESTINATION include/theia/libraries/optimo FILES_MATCHING PATTERN "*.h*")
318+
install(DIRECTORY libraries/spectra/ DESTINATION include/theia/libraries/spectra FILES_MATCHING PATTERN "*.h*")
319+
install(DIRECTORY libraries/statx/ DESTINATION include/theia/libraries/statx FILES_MATCHING PATTERN "*.h*")
320+
install(DIRECTORY libraries/stlplus3/ DESTINATION include/theia/libraries/stlplus3 FILES_MATCHING PATTERN "*.h*")
321+
install(DIRECTORY libraries/visual_sfm/ DESTINATION include/theia/libraries/visual_sfm FILES_MATCHING PATTERN "*.h*")
322+
install(DIRECTORY libraries/vlfeat/ DESTINATION include/theia/libraries/vlfeat FILES_MATCHING PATTERN "*.h*")
264323

265324
# Add an uninstall target to remove all installed files.
266325
configure_file("${CMAKE_SOURCE_DIR}/cmake/uninstall.cmake.in"
@@ -320,8 +379,9 @@ configure_file("${CMAKE_SOURCE_DIR}/cmake/TheiaConfigVersion.cmake.in"
320379
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/TheiaConfig.cmake"
321380
"${CMAKE_CURRENT_BINARY_DIR}/TheiaConfigVersion.cmake"
322381
"${CMAKE_SOURCE_DIR}/cmake/FindEigen.cmake"
323-
"${CMAKE_SOURCE_DIR}/cmake/FindGlog.cmake"
382+
"${CMAKE_SOURCE_DIR}/cmake/FindFlann.cmake"
324383
"${CMAKE_SOURCE_DIR}/cmake/FindGflags.cmake"
325-
"${CMAKE_SOURCE_DIR}/cmake/FindOpenImageIO.cmake"
384+
"${CMAKE_SOURCE_DIR}/cmake/FindGlog.cmake"
385+
"${CMAKE_SOURCE_DIR}/cmake/FindOpenImageIO.cmake"
326386
"${CMAKE_SOURCE_DIR}/cmake/FindSuiteSparse.cmake"
327387
DESTINATION ${CMAKECONFIG_INSTALL_DIR})

cmake/FindFlann.cmake

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
###############################################################################
2+
# Find FLANN
3+
#
4+
# This sets the following variables:
5+
# FLANN_FOUND - True if FLANN was found.
6+
# FLANN_INCLUDE_DIRS - Directories containing the FLANN include files.
7+
# FLANN_LIBRARIES - Libraries needed to use FLANN.
8+
# FLANN_DEFINITIONS - Compiler flags for FLANN.
9+
# If FLANN_USE_STATIC is specified and then look for static libraries ONLY else
10+
# look for shared ones
11+
12+
if(FLANN_USE_STATIC)
13+
set(FLANN_RELEASE_NAME flann_cpp_s flann_cpp)
14+
set(FLANN_DEBUG_NAME flann_cpp_s-gd flann_cpp-gd)
15+
else(FLANN_USE_STATIC)
16+
set(FLANN_RELEASE_NAME flann_cpp)
17+
set(FLANN_DEBUG_NAME flann_cpp-gd)
18+
endif(FLANN_USE_STATIC)
19+
20+
find_package(PkgConfig QUIET)
21+
if (FLANN_FIND_VERSION)
22+
pkg_check_modules(PC_FLANN flann>=${FLANN_FIND_VERSION})
23+
else(FLANN_FIND_VERSION)
24+
pkg_check_modules(PC_FLANN flann)
25+
endif(FLANN_FIND_VERSION)
26+
27+
set(FLANN_DEFINITIONS ${PC_FLANN_CFLAGS_OTHER})
28+
29+
find_path(FLANN_INCLUDE_DIR flann/flann.hpp
30+
HINTS ${PC_FLANN_INCLUDEDIR} ${PC_FLANN_INCLUDE_DIRS} "${FLANN_ROOT}" "$ENV{FLANN_ROOT}"
31+
PATHS "$ENV{PROGRAMFILES}/Flann" "$ENV{PROGRAMW6432}/Flann"
32+
PATH_SUFFIXES include)
33+
34+
find_library(FLANN_LIBRARY
35+
NAMES ${FLANN_RELEASE_NAME}
36+
HINTS ${PC_FLANN_LIBDIR} ${PC_FLANN_LIBRARY_DIRS} "${FLANN_ROOT}" "$ENV{FLANN_ROOT}"
37+
PATHS "$ENV{PROGRAMFILES}/Flann" "$ENV{PROGRAMW6432}/Flann"
38+
PATH_SUFFIXES lib)
39+
40+
find_library(FLANN_LIBRARY_DEBUG
41+
NAMES ${FLANN_DEBUG_NAME} ${FLANN_RELEASE_NAME}
42+
HINTS ${PC_FLANN_LIBDIR} ${PC_FLANN_LIBRARY_DIRS} "${FLANN_ROOT}" "$ENV{FLANN_ROOT}"
43+
PATHS "$ENV{PROGRAMFILES}/Flann" "$ENV{PROGRAMW6432}/Flann"
44+
PATH_SUFFIXES lib)
45+
46+
if(NOT FLANN_LIBRARY_DEBUG)
47+
set(FLANN_LIBRARY_DEBUG ${FLANN_LIBRARY})
48+
endif(NOT FLANN_LIBRARY_DEBUG)
49+
50+
set(FLANN_INCLUDE_DIRS ${FLANN_INCLUDE_DIR})
51+
set(FLANN_LIBRARIES optimized ${FLANN_LIBRARY} debug ${FLANN_LIBRARY_DEBUG})
52+
53+
include(FindPackageHandleStandardArgs)
54+
find_package_handle_standard_args(FLANN DEFAULT_MSG FLANN_LIBRARY FLANN_INCLUDE_DIR)
55+
56+
mark_as_advanced(FLANN_LIBRARY FLANN_LIBRARY_DEBUG FLANN_INCLUDE_DIR)
57+
58+
if(FLANN_FOUND)
59+
message(STATUS "Flann found (include: ${FLANN_INCLUDE_DIRS}, lib: ${FLANN_LIBRARIES})")
60+
if(FLANN_USE_STATIC)
61+
add_definitions(-DFLANN_STATIC)
62+
endif(FLANN_USE_STATIC)
63+
endif(FLANN_FOUND)

cmake/TheiaConfig.cmake.in

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ else (GFLAGS_FOUND)
163163
endif (GFLAGS_FOUND)
164164
list(APPEND THEIA_INCLUDE_DIRS ${GFLAGS_INCLUDE_DIRS})
165165

166-
# OpenImageIO
166+
# OpenImageIO.
167167
find_package(OpenImageIO QUIET)
168168
if (OPENIMAGEIO_FOUND)
169169
message(STATUS "Found Theia dependency: OpenImageIO in ${OPENIMAGEIO_INCLUDE_DIRS}")
@@ -173,6 +173,7 @@ else (OPENIMAGEIO_FOUND)
173173
endif (OPENIMAGEIO_FOUND)
174174
list(APPEND THEIA_INCLUDE_DIRS ${OPENIMAGEIO_INCLUDE_DIRS})
175175

176+
# SuiteSparse.
176177
find_package(SuiteSparse QUIET)
177178
if (SUITESPARSE_FOUND)
178179
# On Ubuntu the system install of SuiteSparse (v3.4.0) up to at least
@@ -207,22 +208,47 @@ endif (NOT TARGET theia AND NOT Theia_BINARY_DIR)
207208
# Set the expected XX_LIBRARIES variable for FindPackage().
208209
set(THEIA_LIBRARIES theia)
209210

211+
set(THEIA_USE_EXTERNAL_CEREAL @THEIA_USE_EXTERNAL_CEREAL@)
212+
set(THEIA_USE_EXTERNAL_FLANN @THEIA_USE_EXTERNAL_FLANN@)
213+
214+
# Cereal.
215+
if (THEIA_USE_EXTERNAL_CEREAL)
216+
find_package(cereal QUIET)
217+
if (CEREAL_FOUND)
218+
message(STATUS "Found required Theia dependency: Cereal")
219+
else (CEREAL_FOUND)
220+
theia_report_not_found("Missing required Theia dependency: Cereal.")
221+
endif (CEREAL_FOUND)
222+
list(APPEND THEIA_LIBRARIES cereal)
223+
endif (THEIA_USE_EXTERNAL_CEREAL)
224+
225+
# Flann.
226+
if (THEIA_USE_EXTERNAL_FLANN)
227+
find_package(Flann QUIET)
228+
if (FLANN_FOUND)
229+
message(STATUS "Found required Theia dependency: Flann")
230+
else (FLANN_FOUND)
231+
theia_report_not_found("Missing required Theia dependency: Flann.")
232+
endif (FLANN_FOUND)
233+
list(APPEND THEIA_INCLUDE_DIRS ${FLANN_INCLUDE_DIR})
234+
list(APPEND THEIA_LIBRARIES ${FLANN_LIBRARY})
235+
endif (THEIA_USE_EXTERNAL_FLANN)
236+
210237
# Add the libraries included with the distribution.
211238
set(THEIA_INTERNAL_LIB_PREFIX ${THEIA_INCLUDE_DIR}/theia/libraries)
212239
set(THEIA_INTERNAL_LIBS_INCLUDES
213240
${THEIA_INTERNAL_LIB_PREFIX}
214241
${THEIA_INTERNAL_LIB_PREFIX}/akaze
215-
${THEIA_INTERNAL_LIB_PREFIX}/cereal
216-
${THEIA_INTERNAL_LIB_PREFIX}/cereal/include
217-
${THEIA_INTERNAL_LIB_PREFIX}/flann
242+
@THEIA_INTERNAL_CEREAL_LIB@
243+
@THEIA_INTERNAL_FLANN_LIB@
218244
${THEIA_INTERNAL_LIB_PREFIX}/gtest
219245
${THEIA_INTERNAL_LIB_PREFIX}/gtest/include
220246
${THEIA_INTERNAL_LIB_PREFIX}/optimo
221247
${THEIA_INTERNAL_LIB_PREFIX}/spectra
222248
${THEIA_INTERNAL_LIB_PREFIX}/statx
223249
${THEIA_INTERNAL_LIB_PREFIX}/stlplus3
224-
${THEIA_INTERNAL_LIB_PREFIX}/vlfeat
225-
${THEIA_INTERNAL_LIB_PREFIX}/visual_sfm)
250+
${THEIA_INTERNAL_LIB_PREFIX}/visual_sfm
251+
${THEIA_INTERNAL_LIB_PREFIX}/vlfeat)
226252

227253
list(APPEND THEIA_INCLUDE_DIRS ${THEIA_INTERNAL_LIBS_INCLUDES})
228254

libraries/CMakeLists.txt

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/theia/CMakeLists.txt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,14 +174,15 @@ set(THEIA_LIBRARY_DEPENDENCIES
174174
${CERES_LIBRARIES}
175175
${GFLAGS_LIBRARIES}
176176
${GLOG_LIBRARIES}
177-
${SUITESPARSE_LIBRARIES}
178177
${OPENIMAGEIO_LIBRARIES}
178+
${SUITESPARSE_LIBRARIES}
179+
${_THEIA_CEREAL_LIBRARIES}
180+
${_THEIA_FLANN_LIBRARIES}
179181
akaze
180-
flann_cpp
181182
statx
182183
stlplus3
183-
vlfeat
184-
visual_sfm)
184+
visual_sfm
185+
vlfeat)
185186

186187
set(THEIA_LIBRARY_SOURCE
187188
${THEIA_SRC}

0 commit comments

Comments
 (0)