2013-10-04 03:51:56 +08:00
project ( GTSAM CXX C )
2019-01-15 07:38:14 +08:00
cmake_minimum_required ( VERSION 3.0 )
2013-10-04 03:51:56 +08:00
2014-10-23 11:27:01 +08:00
# new feature to Cmake Version > 2.8.12
2014-10-23 11:42:35 +08:00
# Mac ONLY. Define Relative Path on Mac OS
if ( NOT DEFINED CMAKE_MACOSX_RPATH )
set ( CMAKE_MACOSX_RPATH 0 )
endif ( )
2014-10-23 11:27:01 +08:00
2013-10-04 03:51:56 +08:00
# Set the version number for the library
2014-11-14 09:27:04 +08:00
set ( GTSAM_VERSION_MAJOR 4 )
set ( GTSAM_VERSION_MINOR 0 )
2020-07-22 06:15:00 +08:00
set ( GTSAM_VERSION_PATCH 3 )
2013-10-04 03:51:56 +08:00
math ( EXPR GTSAM_VERSION_NUMERIC "10000 * ${GTSAM_VERSION_MAJOR} + 100 * ${GTSAM_VERSION_MINOR} + ${GTSAM_VERSION_PATCH}" )
set ( GTSAM_VERSION_STRING "${GTSAM_VERSION_MAJOR}.${GTSAM_VERSION_MINOR}.${GTSAM_VERSION_PATCH}" )
###############################################################################
# Gather information, perform checks, set defaults
# Set the default install path to home
#set (CMAKE_INSTALL_PREFIX ${HOME} CACHE PATH "Install prefix for library")
set ( CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" "${CMAKE_CURRENT_SOURCE_DIR}/cmake" )
include ( GtsamMakeConfigFile )
2020-05-29 06:09:31 +08:00
include ( GNUInstallDirs )
2013-10-04 03:51:56 +08:00
# Record the root dir for gtsam - needed during external builds, e.g., ROS
set ( GTSAM_SOURCE_ROOT_DIR ${ CMAKE_CURRENT_SOURCE_DIR } )
message ( STATUS "GTSAM_SOURCE_ROOT_DIR: [${GTSAM_SOURCE_ROOT_DIR}]" )
# Load build type flags and default to Debug mode
include ( GtsamBuildTypes )
# Use macros for creating tests/timing scripts
include ( GtsamTesting )
include ( GtsamPrinting )
# guard against in-source builds
if ( ${ CMAKE_SOURCE_DIR } STREQUAL ${ CMAKE_BINARY_DIR } )
message ( FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt. " )
endif ( )
2014-06-13 02:40:24 +08:00
# See whether gtsam_unstable is available (it will be present only if we're using a git checkout)
2013-10-04 03:51:56 +08:00
if ( EXISTS "${PROJECT_SOURCE_DIR}/gtsam_unstable" AND IS_DIRECTORY "${PROJECT_SOURCE_DIR}/gtsam_unstable" )
set ( GTSAM_UNSTABLE_AVAILABLE 1 )
else ( )
set ( GTSAM_UNSTABLE_AVAILABLE 0 )
endif ( )
2019-06-10 18:41:27 +08:00
# ----------------------------------------------------------------------------
# Uninstall target, for "make uninstall"
# ----------------------------------------------------------------------------
configure_file (
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / c m a k e / c m a k e _ u n i n s t a l l . c m a k e . i n "
" $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / c m a k e _ u n i n s t a l l . c m a k e "
I M M E D I A T E @ O N L Y )
add_custom_target ( uninstall
" $ { C M A K E _ C O M M A N D } " - P " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / c m a k e _ u n i n s t a l l . c m a k e " )
2013-10-04 03:51:56 +08:00
###############################################################################
# Set up options
# Configurable Options
if ( GTSAM_UNSTABLE_AVAILABLE )
option ( GTSAM_BUILD_UNSTABLE "Enable/Disable libgtsam_unstable" ON )
2020-08-18 05:13:10 +08:00
option ( GTSAM_UNSTABLE_BUILD_PYTHON "Enable/Disable Python wrapper for libgtsam_unstable" ON )
2020-08-18 23:17:00 +08:00
option ( GTSAM_UNSTABLE_INSTALL_MATLAB_TOOLBOX "Enable/Disable MATLAB wrapper for libgtsam_unstable" OFF )
2013-10-04 03:51:56 +08:00
endif ( )
2018-12-21 20:04:15 +08:00
option ( BUILD_SHARED_LIBS "Build shared gtsam library, instead of static" ON )
2013-10-04 03:51:56 +08:00
option ( GTSAM_USE_QUATERNIONS "Enable/Disable using an internal Quaternion representation for rotations instead of rotation matrices. If enable, Rot3::EXPMAP is enforced by default." OFF )
2020-07-22 06:15:00 +08:00
option ( GTSAM_POSE3_EXPMAP "Enable/Disable using Pose3::EXPMAP as the default mode. If disabled, Pose3::FIRST_ORDER will be used." ON )
option ( GTSAM_ROT3_EXPMAP "Ignore if GTSAM_USE_QUATERNIONS is OFF (Rot3::EXPMAP by default). Otherwise, enable Rot3::EXPMAP, or if disabled, use Rot3::CAYLEY." ON )
2014-10-15 07:14:59 +08:00
option ( GTSAM_ENABLE_CONSISTENCY_CHECKS "Enable/Disable expensive consistency checks" OFF )
2013-10-04 03:51:56 +08:00
option ( GTSAM_WITH_TBB "Use Intel Threaded Building Blocks (TBB) if available" ON )
2019-03-13 00:22:09 +08:00
option ( GTSAM_WITH_EIGEN_MKL "Eigen will use Intel MKL if available" OFF )
option ( GTSAM_WITH_EIGEN_MKL_OPENMP "Eigen, when using Intel MKL, will also use OpenMP for multithreading if available" OFF )
2020-02-07 12:56:07 +08:00
option ( GTSAM_THROW_CHEIRALITY_EXCEPTION "Throw exception when a triangulated point is behind a camera" ON )
2020-08-18 05:13:10 +08:00
option ( GTSAM_BUILD_PYTHON "Enable/Disable building & installation of Python module with pybind11" OFF )
2020-07-23 05:32:07 +08:00
option ( GTSAM_ALLOW_DEPRECATED_SINCE_V41 "Allow use of methods/functions deprecated in GTSAM 4.1" ON )
2019-06-13 03:01:45 +08:00
option ( GTSAM_TYPEDEF_POINTS_TO_VECTORS "Typedef Point2 and Point3 to Eigen::Vector equivalents" OFF )
2016-02-25 03:01:19 +08:00
option ( GTSAM_SUPPORT_NESTED_DISSECTION "Support Metis-based nested dissection" ON )
2016-05-16 04:15:37 +08:00
option ( GTSAM_TANGENT_PREINTEGRATION "Use new ImuFactor with integration on tangent space" ON )
2018-12-19 07:03:33 +08:00
if ( NOT MSVC AND NOT XCODE_VERSION )
option ( GTSAM_BUILD_WITH_CCACHE "Use ccache compiler cache" ON )
endif ( )
2013-10-04 03:51:56 +08:00
2019-06-21 03:18:55 +08:00
if ( NOT MSVC AND NOT XCODE_VERSION )
# Set the build type to upper case for downstream use
string ( TOUPPER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_UPPER )
# Set the GTSAM_BUILD_TAG variable.
# If build type is Release, set to blank (""), else set to the build type.
2019-12-29 02:22:36 +08:00
if ( ${ CMAKE_BUILD_TYPE_UPPER } STREQUAL "RELEASE" )
2019-06-21 03:18:55 +08:00
set ( GTSAM_BUILD_TAG "" ) # Don't create release mode tag on installed directory
else ( )
set ( GTSAM_BUILD_TAG "${CMAKE_BUILD_TYPE}" )
endif ( )
2019-06-13 03:01:45 +08:00
endif ( )
2013-10-04 03:51:56 +08:00
# Options relating to MATLAB wrapper
# TODO: Check for matlab mex binary before handling building of binaries
option ( GTSAM_INSTALL_MATLAB_TOOLBOX "Enable/Disable installation of matlab toolbox" OFF )
2020-08-18 05:13:10 +08:00
set ( GTSAM_PYTHON_VERSION "Default" CACHE STRING "The version of Python to build the wrappers against." )
2013-10-04 03:51:56 +08:00
# Check / set dependent variables for MATLAB wrapper
2020-08-18 05:13:10 +08:00
if ( GTSAM_INSTALL_MATLAB_TOOLBOX AND GTSAM_BUILD_TYPE_POSTFIXES )
2019-06-13 03:01:45 +08:00
set ( CURRENT_POSTFIX ${ CMAKE_${CMAKE_BUILD_TYPE_UPPER } _POSTFIX} )
2019-05-17 21:54:12 +08:00
endif ( )
2013-10-04 03:51:56 +08:00
2018-12-21 20:04:15 +08:00
if ( GTSAM_INSTALL_MATLAB_TOOLBOX AND NOT BUILD_SHARED_LIBS )
message ( FATAL_ERROR "GTSAM_INSTALL_MATLAB_TOOLBOX and BUILD_SHARED_LIBS=OFF. The MATLAB wrapper cannot be compiled with a static GTSAM library because mex modules are themselves shared libraries. If you want a self-contained mex module, enable GTSAM_MEX_BUILD_STATIC_MODULE instead of BUILD_SHARED_LIBS=OFF." )
2014-01-31 03:41:25 +08:00
endif ( )
2020-08-18 05:13:10 +08:00
if ( GTSAM_BUILD_PYTHON )
if ( NOT GTSAM_TYPEDEF_POINTS_TO_VECTORS )
message ( FATAL_ERROR "GTSAM_BUILD_PYTHON requires GTSAM_TYPEDEF_POINTS_TO_VECTORS to be enabled but it is not." )
endif ( )
2016-02-02 14:34:13 +08:00
2020-08-18 05:13:10 +08:00
if ( GTSAM_UNSTABLE_BUILD_PYTHON )
if ( NOT GTSAM_BUILD_UNSTABLE )
message ( WARNING "GTSAM_UNSTABLE_BUILD_PYTHON requires the unstable module to be enabled." )
set ( GTSAM_UNSTABLE_BUILD_PYTHON OFF )
endif ( )
endif ( )
set ( GTSAM_PY_INSTALL_PATH "${CMAKE_INSTALL_PREFIX}/python" )
2017-08-17 19:03:35 +08:00
endif ( )
2013-10-04 03:51:56 +08:00
# Flags for choosing default packaging tools
set ( CPACK_SOURCE_GENERATOR "TGZ" CACHE STRING "CPack Default Source Generator" )
set ( CPACK_GENERATOR "TGZ" CACHE STRING "CPack Default Binary Generator" )
2020-08-18 05:13:10 +08:00
if ( CMAKE_GENERATOR STREQUAL "Ninja" AND
( ( C M A K E _ C X X _ C O M P I L E R _ I D S T R E Q U A L " G N U " A N D N O T C M A K E _ C X X _ C O M P I L E R _ V E R S I O N V E R S I O N _ L E S S 4 . 9 ) O R
( C M A K E _ C X X _ C O M P I L E R _ I D S T R E Q U A L " C l a n g " A N D N O T C M A K E _ C X X _ C O M P I L E R _ V E R S I O N V E R S I O N _ L E S S 3 . 5 ) ) )
# Force colored warnings in Ninja's output, if the compiler has -fdiagnostics-color support.
# Rationale in https://github.com/ninja-build/ninja/issues/814
set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color=always" )
endif ( )
2013-10-04 03:51:56 +08:00
###############################################################################
# Find boost
# To change the path for boost, you will need to set:
# BOOST_ROOT: path to install prefix for boost
# Boost_NO_SYSTEM_PATHS: set to true to keep the find script from ignoring BOOST_ROOT
if ( MSVC )
2018-11-08 22:52:12 +08:00
# By default, boost only builds static libraries on windows
set ( Boost_USE_STATIC_LIBS ON ) # only find static libs
# If we ever reset above on windows and, ...
# If we use Boost shared libs, disable auto linking.
# Some libraries, at least Boost Program Options, rely on this to export DLL symbols.
2013-10-04 03:51:56 +08:00
if ( NOT Boost_USE_STATIC_LIBS )
2019-05-29 17:02:10 +08:00
list_append_cache ( GTSAM_COMPILE_DEFINITIONS_PUBLIC BOOST_ALL_NO_LIB BOOST_ALL_DYN_LINK )
2013-10-04 03:51:56 +08:00
endif ( )
2018-12-01 04:48:16 +08:00
# Virtual memory range for PCH exceeded on VS2015
if ( MSVC_VERSION LESS 1910 ) # older than VS2017
2019-05-29 17:02:10 +08:00
list_append_cache ( GTSAM_COMPILE_OPTIONS_PRIVATE -Zm295 )
2018-12-01 04:48:16 +08:00
endif ( )
2013-10-04 03:51:56 +08:00
endif ( )
2019-06-10 18:41:27 +08:00
# If building DLLs in MSVC, we need to avoid EIGEN_STATIC_ASSERT()
# or explicit instantiation will generate build errors.
2019-04-19 02:25:55 +08:00
# See: https://bitbucket.org/gtborg/gtsam/issues/417/fail-to-build-on-msvc-2017
#
if ( MSVC AND BUILD_SHARED_LIBS )
2019-05-29 17:02:10 +08:00
list_append_cache ( GTSAM_COMPILE_DEFINITIONS_PUBLIC EIGEN_NO_STATIC_ASSERT )
2019-04-19 02:25:55 +08:00
endif ( )
2019-02-09 05:18:21 +08:00
# Store these in variables so they are automatically replicated in GTSAMConfig.cmake and such.
set ( BOOST_FIND_MINIMUM_VERSION 1.43 )
set ( BOOST_FIND_MINIMUM_COMPONENTS serialization system filesystem thread program_options date_time timer chrono regex )
find_package ( Boost ${ BOOST_FIND_MINIMUM_VERSION } COMPONENTS ${ BOOST_FIND_MINIMUM_COMPONENTS } )
2013-10-04 03:51:56 +08:00
# Required components
if ( NOT Boost_SERIALIZATION_LIBRARY OR NOT Boost_SYSTEM_LIBRARY OR NOT Boost_FILESYSTEM_LIBRARY OR
2016-08-29 05:07:03 +08:00
N O T B o o s t _ T H R E A D _ L I B R A R Y O R N O T B o o s t _ D A T E _ T I M E _ L I B R A R Y )
2013-10-04 03:51:56 +08:00
message ( FATAL_ERROR "Missing required Boost components >= v1.43, please install/upgrade Boost or configure your search paths." )
endif ( )
2019-04-08 16:22:59 +08:00
option ( GTSAM_DISABLE_NEW_TIMERS "Disables using Boost.chrono for timing" OFF )
2019-10-07 17:21:22 +08:00
# Allow for not using the timer libraries on boost < 1.48 (GTSAM timing code falls back to old timer library)
2013-10-04 03:51:56 +08:00
set ( GTSAM_BOOST_LIBRARIES
2019-10-07 17:21:22 +08:00
B o o s t : : s e r i a l i z a t i o n
B o o s t : : s y s t e m
B o o s t : : f i l e s y s t e m
B o o s t : : t h r e a d
B o o s t : : d a t e _ t i m e
B o o s t : : r e g e x
2019-01-15 07:38:14 +08:00
)
2013-10-04 03:51:56 +08:00
if ( GTSAM_DISABLE_NEW_TIMERS )
message ( "WARNING: GTSAM timing instrumentation manually disabled" )
2019-05-29 17:02:10 +08:00
list_append_cache ( GTSAM_COMPILE_DEFINITIONS_PUBLIC DGTSAM_DISABLE_NEW_TIMERS )
2013-10-04 03:51:56 +08:00
else ( )
if ( Boost_TIMER_LIBRARY )
2019-10-07 17:21:22 +08:00
list ( APPEND GTSAM_BOOST_LIBRARIES Boost::timer Boost::chrono )
2013-10-04 03:51:56 +08:00
else ( )
2014-02-14 03:20:25 +08:00
list ( APPEND GTSAM_BOOST_LIBRARIES rt ) # When using the header-only boost timer library, need -lrt
2013-10-04 03:51:56 +08:00
message ( "WARNING: GTSAM timing instrumentation will use the older, less accurate, Boost timer library because boost older than 1.48 was found." )
endif ( )
endif ( )
###############################################################################
# Find TBB
2019-05-27 03:15:31 +08:00
find_package ( TBB 4.4 COMPONENTS tbb tbbmalloc )
2013-10-04 03:51:56 +08:00
# Set up variables if we're using TBB
if ( TBB_FOUND AND GTSAM_WITH_TBB )
2020-03-27 01:46:30 +08:00
set ( GTSAM_USE_TBB 1 ) # This will go into config.h
2020-04-02 04:52:57 +08:00
if ( ( ${ TBB_VERSION_MAJOR } GREATER 2020 ) OR ( ${ TBB_VERSION_MAJOR } EQUAL 2020 ) )
2020-03-27 01:46:30 +08:00
set ( TBB_GREATER_EQUAL_2020 1 )
else ( )
set ( TBB_GREATER_EQUAL_2020 0 )
endif ( )
# all definitions and link requisites will go via imported targets:
# tbb & tbbmalloc
list ( APPEND GTSAM_ADDITIONAL_LIBRARIES tbb tbbmalloc )
2013-10-14 06:21:07 +08:00
else ( )
2020-03-27 01:46:30 +08:00
set ( GTSAM_USE_TBB 0 ) # This will go into config.h
2013-10-04 03:51:56 +08:00
endif ( )
2015-06-18 04:23:27 +08:00
###############################################################################
# Prohibit Timing build mode in combination with TBB
if ( GTSAM_USE_TBB AND ( CMAKE_BUILD_TYPE STREQUAL "Timing" ) )
message ( FATAL_ERROR "Timing build mode cannot be used together with TBB. Use a sampling profiler such as Instruments or Intel VTune Amplifier instead." )
endif ( )
2013-10-04 03:51:56 +08:00
2013-10-14 06:21:07 +08:00
###############################################################################
# Find Google perftools
find_package ( GooglePerfTools )
2018-11-09 11:09:05 +08:00
###############################################################################
# Support ccache, if installed
2018-12-19 07:03:33 +08:00
if ( NOT MSVC AND NOT XCODE_VERSION )
find_program ( CCACHE_FOUND ccache )
if ( CCACHE_FOUND )
if ( GTSAM_BUILD_WITH_CCACHE )
set_property ( GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache )
set_property ( GLOBAL PROPERTY RULE_LAUNCH_LINK ccache )
else ( )
set_property ( GLOBAL PROPERTY RULE_LAUNCH_COMPILE "" )
set_property ( GLOBAL PROPERTY RULE_LAUNCH_LINK "" )
endif ( )
endif ( CCACHE_FOUND )
endif ( )
2013-10-14 06:21:07 +08:00
2013-11-19 03:23:23 +08:00
###############################################################################
# Find MKL
2014-06-05 02:08:24 +08:00
find_package ( MKL )
2013-11-19 03:23:23 +08:00
2014-06-05 02:08:24 +08:00
if ( MKL_FOUND AND GTSAM_WITH_EIGEN_MKL )
set ( GTSAM_USE_EIGEN_MKL 1 ) # This will go into config.h
set ( EIGEN_USE_MKL_ALL 1 ) # This will go into config.h - it makes Eigen use MKL
list ( APPEND GTSAM_ADDITIONAL_LIBRARIES ${ MKL_LIBRARIES } )
2016-02-25 03:01:19 +08:00
2015-06-22 23:43:30 +08:00
# --no-as-needed is required with gcc according to the MKL link advisor
if ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
2016-02-25 03:01:19 +08:00
set ( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-as-needed" )
2015-06-22 23:43:30 +08:00
endif ( )
2014-06-05 02:08:24 +08:00
else ( )
set ( GTSAM_USE_EIGEN_MKL 0 )
set ( EIGEN_USE_MKL_ALL 0 )
endif ( )
2013-11-19 03:23:23 +08:00
###############################################################################
2014-02-09 03:09:50 +08:00
# Find OpenMP (if we're also using MKL)
2014-10-01 04:13:15 +08:00
find_package ( OpenMP ) # do this here to generate correct message if disabled
2013-11-19 03:23:23 +08:00
2014-10-01 04:13:15 +08:00
if ( GTSAM_WITH_EIGEN_MKL AND GTSAM_WITH_EIGEN_MKL_OPENMP AND GTSAM_USE_EIGEN_MKL )
2014-02-08 23:37:24 +08:00
if ( OPENMP_FOUND AND GTSAM_USE_EIGEN_MKL AND GTSAM_WITH_EIGEN_MKL_OPENMP )
set ( GTSAM_USE_EIGEN_MKL_OPENMP 1 ) # This will go into config.h
2019-05-29 17:02:10 +08:00
list_append_cache ( GTSAM_COMPILE_OPTIONS_PUBLIC ${ OpenMP_CXX_FLAGS } )
2014-02-08 23:37:24 +08:00
endif ( )
2013-11-19 03:23:23 +08:00
endif ( )
2013-10-04 03:51:56 +08:00
###############################################################################
# Option for using system Eigen or GTSAM-bundled Eigen
2015-05-21 01:58:58 +08:00
### These patches only affect usage of MKL. If you want to enable MKL, you *must*
### use our patched version of Eigen
2013-12-23 02:21:08 +08:00
### See: http://eigen.tuxfamily.org/bz/show_bug.cgi?id=704 (Householder QR MKL selection)
### http://eigen.tuxfamily.org/bz/show_bug.cgi?id=705 (Fix MKL LLT return code)
2015-03-10 08:01:47 +08:00
option ( GTSAM_USE_SYSTEM_EIGEN "Find and use system-installed Eigen. If 'off', use the one bundled with GTSAM" OFF )
2019-09-13 03:01:01 +08:00
option ( GTSAM_WITH_EIGEN_UNSUPPORTED "Install Eigen's unsupported modules" OFF )
2013-10-04 03:51:56 +08:00
# Switch for using system Eigen or GTSAM-bundled Eigen
if ( GTSAM_USE_SYSTEM_EIGEN )
find_package ( Eigen3 REQUIRED )
2016-02-25 03:01:19 +08:00
2015-03-19 02:20:45 +08:00
# Use generic Eigen include paths e.g. <Eigen/Core>
2019-02-17 07:58:35 +08:00
set ( GTSAM_EIGEN_INCLUDE_FOR_INSTALL "${EIGEN3_INCLUDE_DIR}" )
2016-02-25 03:01:19 +08:00
2015-03-11 01:00:28 +08:00
# check if MKL is also enabled - can have one or the other, but not both!
2016-02-14 04:08:54 +08:00
# Note: Eigen >= v3.2.5 includes our patches
if ( EIGEN_USE_MKL_ALL AND ( EIGEN3_VERSION VERSION_LESS 3.2.5 ) )
2016-02-14 05:34:27 +08:00
message ( FATAL_ERROR "MKL requires at least Eigen 3.2.5, and your system appears to have an older version. Disable GTSAM_USE_SYSTEM_EIGEN to use GTSAM's copy of Eigen, or disable GTSAM_WITH_EIGEN_MKL" )
2015-03-11 01:00:28 +08:00
endif ( )
2018-12-12 02:56:56 +08:00
# Check for Eigen version which doesn't work with MKL
# See http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1527 for details.
if ( EIGEN_USE_MKL_ALL AND ( EIGEN3_VERSION VERSION_EQUAL 3.3.4 ) )
message ( FATAL_ERROR "MKL does not work with Eigen 3.3.4 because of a bug in Eigen. See http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1527. Disable GTSAM_USE_SYSTEM_EIGEN to use GTSAM's copy of Eigen, disable GTSAM_WITH_EIGEN_MKL, or upgrade/patch your installation of Eigen." )
endif ( )
2019-02-17 07:58:35 +08:00
# The actual include directory (for BUILD cmake target interface):
set ( GTSAM_EIGEN_INCLUDE_FOR_BUILD "${EIGEN3_INCLUDE_DIR}" )
2013-10-04 03:51:56 +08:00
else ( )
2016-02-25 03:01:19 +08:00
# Use bundled Eigen include path.
2013-10-04 03:51:56 +08:00
# Clear any variables set by FindEigen3
if ( EIGEN3_INCLUDE_DIR )
set ( EIGEN3_INCLUDE_DIR NOTFOUND CACHE STRING "" FORCE )
endif ( )
2016-02-25 03:01:19 +08:00
2015-03-19 09:46:12 +08:00
# set full path to be used by external projects
# this will be added to GTSAM_INCLUDE_DIR by gtsam_extra.cmake.in
2019-02-17 07:58:35 +08:00
set ( GTSAM_EIGEN_INCLUDE_FOR_INSTALL "include/gtsam/3rdparty/Eigen/" )
2016-02-25 03:01:19 +08:00
2019-02-17 07:58:35 +08:00
# The actual include directory (for BUILD cmake target interface):
set ( GTSAM_EIGEN_INCLUDE_FOR_BUILD "${CMAKE_SOURCE_DIR}/gtsam/3rdparty/Eigen/" )
2013-10-04 03:51:56 +08:00
endif ( )
2019-05-29 16:43:56 +08:00
# Detect Eigen version:
set ( EIGEN_VER_H "${GTSAM_EIGEN_INCLUDE_FOR_BUILD}/Eigen/src/Core/util/Macros.h" )
if ( EXISTS ${ EIGEN_VER_H } )
file ( READ "${EIGEN_VER_H}" STR_EIGEN_VERSION )
# Extract the Eigen version from the Macros.h file, lines "#define EIGEN_WORLD_VERSION XX", etc...
string ( REGEX MATCH "EIGEN_WORLD_VERSION[ ]+[0-9]+" GTSAM_EIGEN_VERSION_WORLD "${STR_EIGEN_VERSION}" )
string ( REGEX MATCH "[0-9]+" GTSAM_EIGEN_VERSION_WORLD "${GTSAM_EIGEN_VERSION_WORLD}" )
string ( REGEX MATCH "EIGEN_MAJOR_VERSION[ ]+[0-9]+" GTSAM_EIGEN_VERSION_MAJOR "${STR_EIGEN_VERSION}" )
string ( REGEX MATCH "[0-9]+" GTSAM_EIGEN_VERSION_MAJOR "${GTSAM_EIGEN_VERSION_MAJOR}" )
string ( REGEX MATCH "EIGEN_MINOR_VERSION[ ]+[0-9]+" GTSAM_EIGEN_VERSION_MINOR "${STR_EIGEN_VERSION}" )
string ( REGEX MATCH "[0-9]+" GTSAM_EIGEN_VERSION_MINOR "${GTSAM_EIGEN_VERSION_MINOR}" )
set ( GTSAM_EIGEN_VERSION "${GTSAM_EIGEN_VERSION_WORLD}.${GTSAM_EIGEN_VERSION_MAJOR}.${GTSAM_EIGEN_VERSION_MINOR}" )
message ( STATUS "Found Eigen version: ${GTSAM_EIGEN_VERSION}" )
else ( )
message ( WARNING "Cannot determine Eigen version, missing file: `${EIGEN_VER_H}`" )
endif ( )
2018-11-08 22:52:12 +08:00
if ( MSVC )
2018-12-21 20:04:15 +08:00
if ( BUILD_SHARED_LIBS )
2018-11-08 22:52:12 +08:00
# mute eigen static assert to avoid errors in shared lib
2019-05-29 17:02:10 +08:00
list_append_cache ( GTSAM_COMPILE_DEFINITIONS_PUBLIC EIGEN_NO_STATIC_ASSERT )
2018-11-08 22:52:12 +08:00
endif ( )
2019-05-29 17:02:10 +08:00
list_append_cache ( GTSAM_COMPILE_OPTIONS_PRIVATE "/wd4244" ) # Disable loss of precision which is thrown all over our Eigen
2018-11-08 22:52:12 +08:00
endif ( )
2017-05-18 05:30:17 +08:00
2019-12-21 23:41:29 +08:00
if ( APPLE AND BUILD_SHARED_LIBS )
2019-12-22 23:13:23 +08:00
# Set the default install directory on macOS
set ( CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib" )
2019-12-21 23:41:29 +08:00
endif ( )
2013-10-04 03:51:56 +08:00
###############################################################################
# Global compile options
2013-10-14 06:21:07 +08:00
# Build list of possible allocators
set ( possible_allocators "" )
if ( GTSAM_USE_TBB )
list ( APPEND possible_allocators TBB )
set ( preferred_allocator TBB )
else ( )
list ( APPEND possible_allocators BoostPool STL )
2013-11-19 03:23:23 +08:00
set ( preferred_allocator STL )
2013-10-14 06:55:59 +08:00
endif ( )
if ( GOOGLE_PERFTOOLS_FOUND )
list ( APPEND possible_allocators tcmalloc )
2013-10-14 06:21:07 +08:00
endif ( )
2013-10-14 06:55:59 +08:00
# Check if current allocator choice is valid and set cache option
2013-10-14 06:21:07 +08:00
list ( FIND possible_allocators "${GTSAM_DEFAULT_ALLOCATOR}" allocator_valid )
if ( allocator_valid EQUAL -1 )
set ( GTSAM_DEFAULT_ALLOCATOR ${ preferred_allocator } CACHE STRING "Default allocator" FORCE )
else ( )
set ( GTSAM_DEFAULT_ALLOCATOR ${ preferred_allocator } CACHE STRING "Default allocator" )
endif ( )
set_property ( CACHE GTSAM_DEFAULT_ALLOCATOR PROPERTY STRINGS ${ possible_allocators } )
mark_as_advanced ( GTSAM_DEFAULT_ALLOCATOR )
# Define compile flags depending on allocator
if ( "${GTSAM_DEFAULT_ALLOCATOR}" STREQUAL "BoostPool" )
set ( GTSAM_ALLOCATOR_BOOSTPOOL 1 )
elseif ( "${GTSAM_DEFAULT_ALLOCATOR}" STREQUAL "STL" )
set ( GTSAM_ALLOCATOR_STL 1 )
elseif ( "${GTSAM_DEFAULT_ALLOCATOR}" STREQUAL "TBB" )
set ( GTSAM_ALLOCATOR_TBB 1 )
elseif ( "${GTSAM_DEFAULT_ALLOCATOR}" STREQUAL "tcmalloc" )
set ( GTSAM_ALLOCATOR_STL 1 ) # tcmalloc replaces malloc, so to use it we use the STL allocator
list ( APPEND GTSAM_ADDITIONAL_LIBRARIES "tcmalloc" )
endif ( )
2013-10-04 03:51:56 +08:00
if ( MSVC )
2019-05-29 17:02:10 +08:00
list_append_cache ( GTSAM_COMPILE_DEFINITIONS_PRIVATE _CRT_SECURE_NO_WARNINGS _SCL_SECURE_NO_WARNINGS )
list_append_cache ( GTSAM_COMPILE_OPTIONS_PRIVATE /wd4251 /wd4275 /wd4251 /wd4661 /wd4344 /wd4503 ) # Disable non-DLL-exported base class and other warnings
list_append_cache ( GTSAM_COMPILE_OPTIONS_PRIVATE /bigobj ) # Allow large object files for template-based code
2013-10-04 03:51:56 +08:00
endif ( )
2014-05-31 05:07:09 +08:00
# GCC 4.8+ complains about local typedefs which we use for shared_ptr etc.
if ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
if ( NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8 )
2019-05-29 17:02:10 +08:00
list_append_cache ( GTSAM_COMPILE_OPTIONS_PRIVATE -Wno-unused-local-typedefs )
2014-05-31 05:07:09 +08:00
endif ( )
endif ( )
2015-10-09 03:35:12 +08:00
# As of XCode 7, clang also complains about this
if ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" )
if ( NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0 )
2019-05-29 17:02:10 +08:00
list_append_cache ( GTSAM_COMPILE_OPTIONS_PRIVATE -Wno-unused-local-typedefs )
2015-10-09 03:35:12 +08:00
endif ( )
endif ( )
2013-10-04 03:51:56 +08:00
if ( GTSAM_ENABLE_CONSISTENCY_CHECKS )
2019-02-09 05:18:21 +08:00
# This should be made PUBLIC if GTSAM_EXTRA_CONSISTENCY_CHECKS is someday used in a public .h
2019-05-29 17:02:10 +08:00
list_append_cache ( GTSAM_COMPILE_DEFINITIONS_PRIVATE GTSAM_EXTRA_CONSISTENCY_CHECKS )
2014-01-31 03:41:25 +08:00
endif ( )
2013-10-04 03:51:56 +08:00
###############################################################################
# Add components
# Build CppUnitLite
add_subdirectory ( CppUnitLite )
2020-08-18 05:13:10 +08:00
# This is the new wrapper
if ( GTSAM_BUILD_PYTHON )
list ( APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/wrap/cmake" )
add_subdirectory ( python )
endif ( )
2013-10-04 03:51:56 +08:00
# Build GTSAM library
add_subdirectory ( gtsam )
# Build Tests
add_subdirectory ( tests )
# Build examples
2014-02-23 06:13:13 +08:00
add_subdirectory ( examples )
2013-10-04 03:51:56 +08:00
2014-06-08 10:02:11 +08:00
# Build timing
add_subdirectory ( timing )
2017-07-24 02:55:23 +08:00
# Build gtsam_unstable
if ( GTSAM_BUILD_UNSTABLE )
add_subdirectory ( gtsam_unstable )
2019-12-11 23:31:43 +08:00
endif ( )
2017-07-24 02:55:23 +08:00
2013-10-04 03:51:56 +08:00
# Matlab toolbox
if ( GTSAM_INSTALL_MATLAB_TOOLBOX )
add_subdirectory ( matlab )
endif ( )
# Install config and export files
GtsamMakeConfigFile ( GTSAM "${CMAKE_CURRENT_SOURCE_DIR}/gtsam_extra.cmake.in" )
export ( TARGETS ${ GTSAM_EXPORTED_TARGETS } FILE GTSAM-exports.cmake )
2014-10-15 07:14:59 +08:00
2013-10-04 03:51:56 +08:00
# Check for doxygen availability - optional dependency
find_package ( Doxygen )
# Doxygen documentation - enabling options in subfolder
if ( DOXYGEN_FOUND )
add_subdirectory ( doc )
endif ( )
2014-02-20 02:10:37 +08:00
# CMake Tools
add_subdirectory ( cmake )
2013-10-04 03:51:56 +08:00
###############################################################################
# Set up CPack
set ( CPACK_PACKAGE_DESCRIPTION_SUMMARY "GTSAM" )
set ( CPACK_PACKAGE_VENDOR "Frank Dellaert, Georgia Institute of Technology" )
set ( CPACK_PACKAGE_CONTACT "Frank Dellaert, dellaert@cc.gatech.edu" )
2014-01-31 03:42:23 +08:00
set ( CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md" )
2013-10-04 03:51:56 +08:00
set ( CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE" )
set ( CPACK_PACKAGE_VERSION_MAJOR ${ GTSAM_VERSION_MAJOR } )
set ( CPACK_PACKAGE_VERSION_MINOR ${ GTSAM_VERSION_MINOR } )
set ( CPACK_PACKAGE_VERSION_PATCH ${ GTSAM_VERSION_PATCH } )
set ( CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}" )
#set(CPACK_INSTALLED_DIRECTORIES "doc;.") # Include doc directory
#set(CPACK_INSTALLED_DIRECTORIES ".") # FIXME: throws error
set ( CPACK_SOURCE_IGNORE_FILES "/build*;/\\\\.;/makestats.sh$" )
set ( CPACK_SOURCE_IGNORE_FILES "${CPACK_SOURCE_IGNORE_FILES}" "/gtsam_unstable/" )
set ( CPACK_SOURCE_IGNORE_FILES "${CPACK_SOURCE_IGNORE_FILES}" "/package_scripts/" )
set ( CPACK_SOURCE_PACKAGE_FILE_NAME "gtsam-${GTSAM_VERSION_MAJOR}.${GTSAM_VERSION_MINOR}.${GTSAM_VERSION_PATCH}" )
#set(CPACK_SOURCE_PACKAGE_FILE_NAME "gtsam-aspn${GTSAM_VERSION_PATCH}") # Used for creating ASPN tarballs
# Deb-package specific cpack
set ( CPACK_DEBIAN_PACKAGE_NAME "libgtsam-dev" )
set ( CPACK_DEBIAN_PACKAGE_DEPENDS "libboost-dev (>= 1.43)" ) #Example: "libc6 (>= 2.3.1-6), libgcc1 (>= 1:3.4.2-12)")
###############################################################################
# Print configuration variables
message ( STATUS "===============================================================" )
message ( STATUS "================ Configuration Options ======================" )
2020-08-08 05:11:05 +08:00
print_config ( "CMAKE_CXX_COMPILER_ID type" "${CMAKE_CXX_COMPILER_ID}" )
print_config ( "CMAKE_CXX_COMPILER_VERSION" "${CMAKE_CXX_COMPILER_VERSION}" )
print_config ( "CMake version" "${CMAKE_VERSION}" )
print_config ( "CMake generator" "${CMAKE_GENERATOR}" )
print_config ( "CMake build tool" "${CMAKE_BUILD_TOOL}" )
2013-10-04 03:51:56 +08:00
message ( STATUS "Build flags " )
2020-08-08 05:11:05 +08:00
print_enabled_config ( ${ GTSAM_BUILD_TESTS } "Build Tests" )
print_enabled_config ( ${ GTSAM_BUILD_EXAMPLES_ALWAYS } "Build examples with 'make all'" )
print_enabled_config ( ${ GTSAM_BUILD_TIMING_ALWAYS } "Build timing scripts with 'make all'" )
2013-10-04 03:51:56 +08:00
if ( DOXYGEN_FOUND )
2020-08-08 05:11:05 +08:00
print_enabled_config ( ${ GTSAM_BUILD_DOCS } "Build Docs" )
2013-10-04 03:51:56 +08:00
endif ( )
2020-08-08 05:11:05 +08:00
print_enabled_config ( ${ BUILD_SHARED_LIBS } "Build shared GTSAM libraries" )
print_enabled_config ( ${ GTSAM_BUILD_TYPE_POSTFIXES } "Put build type in library name" )
2013-10-04 03:51:56 +08:00
if ( GTSAM_UNSTABLE_AVAILABLE )
2020-08-18 05:13:10 +08:00
print_enabled_config ( ${ GTSAM_BUILD_UNSTABLE } "Build libgtsam_unstable " )
print_enabled_config ( ${ GTSAM_UNSTABLE_BUILD_PYTHON } "Build GTSAM unstable Python " )
2020-08-18 07:21:06 +08:00
print_enabled_config ( ${ GTSAM_UNSTABLE_INSTALL_MATLAB_TOOLBOX } "Build MATLAB Toolbox for unstable" )
2013-10-04 03:51:56 +08:00
endif ( )
2019-06-13 03:01:45 +08:00
2014-02-09 00:14:43 +08:00
if ( NOT MSVC AND NOT XCODE_VERSION )
2020-08-08 05:11:05 +08:00
print_enabled_config ( ${ GTSAM_BUILD_WITH_MARCH_NATIVE } "Build for native architecture " )
print_config ( "Build type" "${CMAKE_BUILD_TYPE}" )
print_config ( "C compilation flags" "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UPPER}}" )
print_config ( "C++ compilation flags" "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE_UPPER}}" )
2014-02-09 00:14:43 +08:00
endif ( )
2019-05-29 17:02:10 +08:00
print_build_options_for_target ( gtsam )
2020-08-08 05:11:05 +08:00
print_config ( "Use System Eigen" "${GTSAM_USE_SYSTEM_EIGEN} (Using version: ${GTSAM_EIGEN_VERSION})" )
2019-05-29 17:02:10 +08:00
2013-10-04 03:51:56 +08:00
if ( GTSAM_USE_TBB )
2020-08-08 05:11:05 +08:00
print_config ( "Use Intel TBB" "Yes" )
2013-10-04 03:51:56 +08:00
elseif ( TBB_FOUND )
2020-08-08 05:11:05 +08:00
print_config ( "Use Intel TBB" "TBB found but GTSAM_WITH_TBB is disabled" )
2013-10-04 03:51:56 +08:00
else ( )
2020-08-08 05:11:05 +08:00
print_config ( "Use Intel TBB" "TBB not found" )
2013-10-04 03:51:56 +08:00
endif ( )
2013-11-19 03:23:23 +08:00
if ( GTSAM_USE_EIGEN_MKL )
2020-08-08 05:11:05 +08:00
print_config ( "Eigen will use MKL" "Yes" )
2013-11-19 03:23:23 +08:00
elseif ( MKL_FOUND )
2020-08-08 05:11:05 +08:00
print_config ( "Eigen will use MKL" "MKL found but GTSAM_WITH_EIGEN_MKL is disabled" )
2013-11-19 03:23:23 +08:00
else ( )
2020-08-08 05:11:05 +08:00
print_config ( "Eigen will use MKL" "MKL not found" )
2013-11-19 03:23:23 +08:00
endif ( )
if ( GTSAM_USE_EIGEN_MKL_OPENMP )
2020-08-08 05:11:05 +08:00
print_config ( "Eigen will use MKL and OpenMP" "Yes" )
2013-11-28 03:04:11 +08:00
elseif ( OPENMP_FOUND AND NOT GTSAM_WITH_EIGEN_MKL )
2020-08-08 05:11:05 +08:00
print_config ( "Eigen will use MKL and OpenMP" "OpenMP found but GTSAM_WITH_EIGEN_MKL is disabled" )
2013-11-28 03:04:11 +08:00
elseif ( OPENMP_FOUND AND NOT MKL_FOUND )
2020-08-08 05:11:05 +08:00
print_config ( "Eigen will use MKL and OpenMP" "OpenMP found but MKL not found" )
2013-11-19 03:23:23 +08:00
elseif ( OPENMP_FOUND )
2020-08-08 05:11:05 +08:00
print_config ( "Eigen will use MKL and OpenMP" "OpenMP found but GTSAM_WITH_EIGEN_MKL_OPENMP is disabled" )
2013-11-19 03:23:23 +08:00
else ( )
2020-08-08 05:11:05 +08:00
print_config ( "Eigen will use MKL and OpenMP" "OpenMP not found" )
2013-11-19 03:23:23 +08:00
endif ( )
2020-08-08 05:11:05 +08:00
print_config ( "Default allocator" "${GTSAM_DEFAULT_ALLOCATOR}" )
2013-10-04 03:51:56 +08:00
2020-02-07 12:56:07 +08:00
if ( GTSAM_THROW_CHEIRALITY_EXCEPTION )
2020-08-08 05:11:05 +08:00
print_config ( "Cheirality exceptions enabled" "YES" )
2020-02-07 12:56:07 +08:00
else ( )
2020-08-08 05:11:05 +08:00
print_config ( "Cheirality exceptions enabled" "NO" )
2020-02-07 12:56:07 +08:00
endif ( )
2018-12-19 07:03:33 +08:00
if ( NOT MSVC AND NOT XCODE_VERSION )
if ( CCACHE_FOUND AND GTSAM_BUILD_WITH_CCACHE )
2020-08-08 05:11:05 +08:00
print_config ( "Build with ccache" "Yes" )
2018-12-19 07:03:33 +08:00
elseif ( CCACHE_FOUND )
2020-08-08 05:11:05 +08:00
print_config ( "Build with ccache" "ccache found but GTSAM_BUILD_WITH_CCACHE is disabled" )
2018-12-19 07:03:33 +08:00
else ( )
2020-08-08 05:11:05 +08:00
print_config ( "Build with ccache" "No" )
2018-12-19 07:03:33 +08:00
endif ( )
endif ( )
2013-10-04 03:51:56 +08:00
2020-08-08 05:11:05 +08:00
message ( STATUS "Packaging flags" )
print_config ( "CPack Source Generator" "${CPACK_SOURCE_GENERATOR}" )
print_config ( "CPack Generator" "${CPACK_GENERATOR}" )
2013-10-04 03:51:56 +08:00
message ( STATUS "GTSAM flags " )
2020-08-08 05:11:05 +08:00
print_enabled_config ( ${ GTSAM_USE_QUATERNIONS } "Quaternions as default Rot3 " )
print_enabled_config ( ${ GTSAM_ENABLE_CONSISTENCY_CHECKS } "Runtime consistency checking " )
print_enabled_config ( ${ GTSAM_ROT3_EXPMAP } "Rot3 retract is full ExpMap " )
print_enabled_config ( ${ GTSAM_POSE3_EXPMAP } "Pose3 retract is full ExpMap " )
print_enabled_config ( ${ GTSAM_ALLOW_DEPRECATED_SINCE_V41 } "Allow features deprecated in GTSAM 4.1" )
print_enabled_config ( ${ GTSAM_TYPEDEF_POINTS_TO_VECTORS } "Point3 is typedef to Vector3 " )
print_enabled_config ( ${ GTSAM_SUPPORT_NESTED_DISSECTION } "Metis-based Nested Dissection " )
print_enabled_config ( ${ GTSAM_TANGENT_PREINTEGRATION } "Use tangent-space preintegration" )
message ( STATUS "MATLAB toolbox flags" )
print_enabled_config ( ${ GTSAM_INSTALL_MATLAB_TOOLBOX } "Install MATLAB toolbox " )
2020-08-18 05:13:10 +08:00
message ( STATUS "Python toolbox flags " )
print_enabled_config ( ${ GTSAM_BUILD_PYTHON } "Build Python module with pybind " )
if ( GTSAM_BUILD_PYTHON )
print_config ( "Python version" ${ GTSAM_PYTHON_VERSION } )
2020-07-10 12:15:12 +08:00
endif ( )
2016-11-25 15:27:12 +08:00
2013-10-04 03:51:56 +08:00
message ( STATUS "===============================================================" )
2013-11-19 03:23:23 +08:00
# Print warnings at the end
2013-10-04 03:51:56 +08:00
if ( GTSAM_WITH_TBB AND NOT TBB_FOUND )
2019-05-27 03:15:31 +08:00
message ( WARNING "TBB 4.4 or newer was not found - this is ok, but note that GTSAM parallelization will be disabled. Set GTSAM_WITH_TBB to 'Off' to avoid this warning." )
2013-11-19 03:23:23 +08:00
endif ( )
2019-03-13 02:16:32 +08:00
if ( GTSAM_WITH_EIGEN_MKL AND NOT MKL_FOUND )
message ( WARNING "MKL was not found - this is ok, but note that MKL will be disabled. Set GTSAM_WITH_EIGEN_MKL to 'Off' to disable this warning. See INSTALL.md for notes on performance." )
endif ( )
if ( GTSAM_WITH_EIGEN_MKL_OPENMP AND NOT OPENMP_FOUND AND MKL_FOUND )
message ( WARNING "Your compiler does not support OpenMP. Set GTSAM_WITH_EIGEN_MKL_OPENMP to 'Off' to avoid this warning. See INSTALL.md for notes on performance." )
endif ( )
2013-10-04 03:51:56 +08:00
# Include CPack *after* all flags
include ( CPack )