# ---------------------------------------------------------------------------- # Master CMake file for the MRPT library and applications # # Run with "cmake ." at the root directory to build the makefiles for # the MRPT C++ library, the samples, and the applications. Some scripts # for generating the documentation, etc... are also updated. # # October 2007, Jose Luis Blanco # # NOTE: CMake can be obtained at http://www.cmake.org/ # ---------------------------------------------------------------------------- PROJECT(MRPT) CMAKE_MINIMUM_REQUIRED(VERSION 2.4) # -------------------------------------------------------------- # Indicate CMake 2.7 and above that we don't want to mix relative # and absolute paths in linker lib lists. # Run "cmake --help-policy CMP0003" for more information. # -------------------------------------------------------------- if(COMMAND cmake_policy) cmake_policy(SET CMP0003 NEW) endif(COMMAND cmake_policy) # ---------------------------------------------------------------------------- # Loads the current version number: # ---------------------------------------------------------------------------- FILE(READ "${CMAKE_CURRENT_SOURCE_DIR}/version_prefix.txt" CMAKE_MRPT_VERSION_NUMBER) # For example: "0.5.1" STRING(REGEX MATCHALL "[0-9]+" CMAKE_MRPT_VERSION_PARTS "${CMAKE_MRPT_VERSION_NUMBER}") LIST(GET CMAKE_MRPT_VERSION_PARTS 0 CMAKE_MRPT_VERSION_NUMBER_MAJOR) LIST(GET CMAKE_MRPT_VERSION_PARTS 1 CMAKE_MRPT_VERSION_NUMBER_MINOR) LIST(GET CMAKE_MRPT_VERSION_PARTS 2 CMAKE_MRPT_VERSION_NUMBER_PATCH) # ---------------------------------------------------------------------------- # Autodetect if we are in a SVN repository # ---------------------------------------------------------------------------- FIND_PROGRAM(SVNVERSION_PATH svnversion) MARK_AS_ADVANCED(force SVNVERSION_PATH) IF(SVNVERSION_PATH) MESSAGE(STATUS "Extracting svn version, please wait...") execute_process(COMMAND ${SVNVERSION_PATH} -n ${MRPT_SOURCE_DIR} OUTPUT_VARIABLE SVNVERSION_RESULT) IF(SVNVERSION_RESULT MATCHES "exported") # This is NOT a svn repository: SET(CMAKE_MRPT_SVNVERSION "") ELSE(SVNVERSION_RESULT MATCHES "exported") SET(CMAKE_MRPT_SVNVERSION " svn:${SVNVERSION_RESULT}") ENDIF(SVNVERSION_RESULT MATCHES "exported") MESSAGE(STATUS "SVNVERSION: ${CMAKE_MRPT_SVNVERSION}") ELSE(SVNVERSION_PATH) # We don't have svnversion: SET(CMAKE_MRPT_SVNVERSION "") ENDIF(SVNVERSION_PATH) # ---------------------------------------------------------------------------- # Detect GNU version: # ---------------------------------------------------------------------------- IF(CMAKE_COMPILER_IS_GNUCXX) execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version OUTPUT_VARIABLE CMAKE_MRPT_GCC_VERSION_FULL OUTPUT_STRIP_TRAILING_WHITESPACE) # Typical output in CMAKE_MRPT_GCC_VERSION_FULL: "c++ (whatever) 4.2.3 (...)" # Look for the version number STRING(REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" CMAKE_GCC_REGEX_VERSION "${CMAKE_MRPT_GCC_VERSION_FULL}") #MESSAGE(STATUS "match: ${CMAKE_GCC_REGEX_VERSION}") # Split the three parts: STRING(REGEX MATCHALL "[0-9]+" CMAKE_MRPT_GCC_VERSIONS "${CMAKE_GCC_REGEX_VERSION}") LIST(GET CMAKE_MRPT_GCC_VERSIONS 0 CMAKE_MRPT_GCC_VERSION_MAJOR) LIST(GET CMAKE_MRPT_GCC_VERSIONS 1 CMAKE_MRPT_GCC_VERSION_MINOR) SET(CMAKE_MRPT_GCC_VERSION ${CMAKE_MRPT_GCC_VERSION_MAJOR}${CMAKE_MRPT_GCC_VERSION_MINOR}) MESSAGE(STATUS "Detected version of GNU GCC: ${CMAKE_MRPT_GCC_VERSION}") ENDIF(CMAKE_COMPILER_IS_GNUCXX) # ---------------------------------------------------------------------------- # Include the "CPack" package generator # ---------------------------------------------------------------------------- INCLUDE(InstallRequiredSystemLibraries) SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Mobile Robot Programming Toolkit (MRPT)") SET(CPACK_PACKAGE_VENDOR "Jose Luis Blanco Claraco") SET(CPACK_PACKAGE_CONTACT "Jose Luis Blanco Claraco ") SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.txt") SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "MRPT is a set of C++ libraries and applications for mobile robot software development.") FILE(READ ${CPACK_PACKAGE_DESCRIPTION_FILE} CPACK_DESCRIPTION_TEXT) SET(CPACK_PACKAGE_VERSION_MAJOR "${CMAKE_MRPT_VERSION_NUMBER_MAJOR}") SET(CPACK_PACKAGE_VERSION_MINOR "${CMAKE_MRPT_VERSION_NUMBER_MINOR}") SET(CPACK_PACKAGE_VERSION_PATCH "${CMAKE_MRPT_VERSION_NUMBER_PATCH}") SET(CPACK_DEBIAN_PACKAGE_VERSION "${CMAKE_MRPT_VERSION_NUMBER_MAJOR}.${CMAKE_MRPT_VERSION_NUMBER_MINOR}.${CMAKE_MRPT_VERSION_NUMBER_PATCH}") SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}\r\rThe Mobile Robot Programming Toolkit (MRPT) is an extensive, cross-platform, and open source C++ library aimed to help robotics researchers to design and implement algorithms (mainly) in the fields of Simultaneous Localization and Mapping (SLAM) and computer vision (e.g. MonoSLAM).\rThe library allows an easy interface to many common sensors like laser scanners or cameras, and defines a versatile rawlog file format, used to store data sets gathered by a robot for posterior processing. The MRPT's format for rawlogs is Bayesian filter-friendly: sequences of action-observations, in a generic form that allows 2D/3D(6D) movements and any number of (extensible) observations.\r\r MRPT website: http://mrpt.sourceforge.net\r") SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/doc/LICENSE.txt") SET(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.txt") SET(CPACK_SOURCE_GENERATOR "TGZ") SET(CPACK_PACKAGE_INSTALL_DIRECTORY "MRPT-${CMAKE_MRPT_VERSION_NUMBER_MAJOR}.${CMAKE_MRPT_VERSION_NUMBER_MINOR}.${CMAKE_MRPT_VERSION_NUMBER_PATCH}") IF(WIN32) # -------------------------------- # Packages for Windows # -------------------------------- SET(CPACK_SOURCE_IGNORE_FILES ".svn/;.*~;build;CMakeCache.txt;_CPack_Pakages/;CMakeFiles/;install/;Makefile;*.cmake") # There is a bug in NSI that does not handle full unix paths properly. Make # sure there is at least one set of four (4) backlasshes. #SET(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}/src/gui/icons\\\\aten.ico") #SET(CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}/src/gui/icons\\\\uninstall.ico") #SET(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/src/gui/icons\\\\aten.bmp") #SET(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\aten.ico") SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\mrpt.sourceforge.net") SET(CPACK_NSIS_URL_INFO_ABOUT "http:\\\\\\\\www.isa.uma.es\\\\jlblanco") SET(CPACK_NSIS_CONTACT "jlblanco@ctima.uma.es") SET(CPACK_NSIS_MODIFY_PATH ON) # Install header and source files: # --------------------------------------------- INSTALL(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/" DESTINATION include PATTERN ".svn" EXCLUDE PATTERN "*~" EXCLUDE) INSTALL(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/src/" DESTINATION src PATTERN ".svn" EXCLUDE PATTERN "*~" EXCLUDE) SET(CPACK_NSIS_CREATE_ICONS_EXTRA "CreateShortCut \\\"$SMPROGRAMS\\\\$STARTMENU_FOLDER\\\\RawLogViewer.lnk\\\" \\\"$INSTDIR\\\\bin\\\\RawLogViewer.exe\\\" \\\"\\\" \\\"$INSTDIR\\\\bin\\\\RawLogViewer.exe\\\" StrCmp $INSTALL_DESKTOP \\\"1\\\" 0 +2 CreateShortCut \\\"$DESKTOP\\\\RawLogViewer.lnk\\\" \\\"$INSTDIR\\\\bin\\\\RawLogViewer.exe\\\" \\\"\\\" \\\"$INSTDIR\\\\bin\\\\RawLogViewer.exe\\\" " ) ENDIF(WIN32) IF(UNIX) # -------------------------------- # Packages for linux # -------------------------------- SET(CPACK_OUTPUT_FILE_PATH "MRPT-${CMAKE_MRPT_VERSION_NUMBER_MAJOR}.${CMAKE_MRPT_VERSION_NUMBER_MINOR}.${CMAKE_MRPT_VERSION_NUMBER_PATCH}-Linux-${CMAKE_SYSTEM_PROCESSOR}.deb") SET(CPACK_DEBIAN_PACKAGE_NAME "libmrpt") SET(CPACK_PACKAGING_INSTALL_PREFIX "/usr/local") SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libcv1,libglu1-mesa,libwxgtk2.8-0") SET(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${CMAKE_SYSTEM_PROCESSOR}") SET(CPACK_SOURCE_IGNORE_FILES ".svn;CMakeFiles;CMakeCache.txt;CPack*;progress.make;install_manifest.txt;cmake_install.cmake;cmake_psdk.cmake$;Makefile;.swp$;.*~;tags;cmake_uninstall.cmake$") SET(CPACK_GENERATOR DEB) ENDIF(UNIX) IF(APPLE) SET(CPACK_GENERATOR "TGZ;TBZ2;OSXX11") Endif(APPLE) INCLUDE(CPack) # ---------------------------------------------------------------------------- # CHECK FOR SYSTEM LIBRARIES, OPTIONS, ETC.. # ---------------------------------------------------------------------------- # Build static or dynamic libs? # =================================================== #IF ($ENV{MRPT_CONFIGURE_SHARED_LIBS}) # Default: dynamic libraries in Linux, static otherwise: IF(UNIX) SET(MRPT_DEFAULT_SHARED_LIB ON) ELSE(UNIX) SET(MRPT_DEFAULT_SHARED_LIB OFF) ENDIF(UNIX) SET(BUILD_SHARED_LIBS ${MRPT_DEFAULT_SHARED_LIB} CACHE BOOL "Build shared libraries (.dll/.so) instead of static ones (.lib/.a)") IF(BUILD_SHARED_LIBS) SET(CMAKE_MRPT_BUILD_SHARED_LIB "#define MRPT_BUILT_AS_DLL") SET(CMAKE_MRPT_BUILD_SHARED_LIB_ONOFF 1) ELSE(BUILD_SHARED_LIBS) SET(CMAKE_MRPT_BUILD_SHARED_LIB "/* #define MRPT_BUILT_AS_DLL */") SET(CMAKE_MRPT_BUILD_SHARED_LIB_ONOFF 0) ENDIF(BUILD_SHARED_LIBS) # Only for Unix: use pkg-config to find libraries # =================================================== INCLUDE(FindPkgConfig OPTIONAL) IF(PKG_CONFIG_FOUND) INCLUDE(FindPkgConfig) ENDIF(PKG_CONFIG_FOUND) # Build the ARIA library # =================================================== SET(BUILD_ARIA ON CACHE BOOL "Build an embedded version of ActivMedia ARIA library (interface to mobile robots)") IF(BUILD_ARIA) SET(CMAKE_MRPT_HAS_ARIA 1) ELSE(BUILD_ARIA) SET(CMAKE_MRPT_HAS_ARIA 0) ENDIF(BUILD_ARIA) # Build the xSENS library # =================================================== SET(BUILD_xSENS OFF CACHE BOOL "Build an external copy of xSens library (interface to xSens MTi device)") IF(BUILD_xSENS) SET(ROOT_xSENS "" CACHE PATH "Path to CMT source directory of xSens library (The CMTSrc directory)") IF(EXISTS "${ROOT_xSENS}/xsens_std.h") SET(CMAKE_MRPT_HAS_xSENS 1) ELSE(EXISTS "${ROOT_xSENS}/xsens_std.h") MESSAGE("Please, set the ROOT_xSENS variable to the CMT source directory of the xSens library (The CMTSrc directory)") ENDIF(EXISTS "${ROOT_xSENS}/xsens_std.h") ELSE(BUILD_xSENS) SET(CMAKE_MRPT_HAS_xSENS 0) ENDIF(BUILD_xSENS) # Visual Leak Detector (Windows only!) # =================================================== SET(CMAKE_MRPT_HAS_VLD 0) IF(WIN32) SET(ROOT_VISUAL_LEAK_DETECTOR "" CACHE PATH "Path to root directory of Visual Leadk Detector") IF(EXISTS "${ROOT_VISUAL_LEAK_DETECTOR}/include/vld.h") SET(CMAKE_MRPT_HAS_VLD 1) ENDIF(EXISTS "${ROOT_VISUAL_LEAK_DETECTOR}/include/vld.h") ENDIF(WIN32) # Enable GCC profiling (GCC only) # =================================================== IF(CMAKE_COMPILER_IS_GNUCXX) SET(MRPT_ENABLE_PROFILING OFF CACHE BOOL "Enable profiling in the GCC compiler (Add flags: -g -pg)") ENDIF(CMAKE_COMPILER_IS_GNUCXX) # Enable precompiled headers: # =================================================== IF(CMAKE_COMPILER_IS_GNUCXX) # Precompiled headers were introduced with GCC 3.4 # IF(CMAKE_MRPT_GCC_VERSION GREATER 34) # SET(DEFAULT_PRECOMP_HDRS ON) # ELSE(CMAKE_MRPT_GCC_VERSION GREATER 34) SET(DEFAULT_PRECOMP_HDRS OFF) # ENDIF (CMAKE_MRPT_GCC_VERSION GREATER 34) ELSE(CMAKE_COMPILER_IS_GNUCXX) # Rest of compilers: Default=ON SET(DEFAULT_PRECOMP_HDRS ON) ENDIF(CMAKE_COMPILER_IS_GNUCXX) SET(MRPT_ENABLE_PRECOMPILED_HDRS ${DEFAULT_PRECOMP_HDRS} CACHE BOOL "Enable precompiled headers (thru 'mrpt/core.h')") # MRPT_TRY_START/END blocks # =================================================== SET(MRPT_HAS_STACKED_EXCEPTIONS ON CACHE BOOL "Enable MRPT_TRY_START/END blocks (disable it for speed up).") # ASSERT_ blocks # =================================================== SET(MRPT_HAS_ASSERT ON CACHE BOOL "Enable ASSERT_ statements (disable it for speed up).") # Enable libstdc++ parallel mode (GCC only) # =================================================== IF(CMAKE_COMPILER_IS_GNUCXX) SET(MRPT_ENABLE_LIBSTD_PARALLEL_MODE OFF CACHE BOOL "Enable parallel mode in libstdc++ (requires GCC 4.2.2+)") ENDIF(CMAKE_COMPILER_IS_GNUCXX) # Occupancy grid cellsize in bits: 8 or 16 # =================================================== SET(MRPT_OCCUPANCY_GRID_CELLSIZE 8 CACHE STRING "Cell size for mrpt::slam::COccupancyGridMap2D (either 8 or 16 bits)") IF(NOT MRPT_OCCUPANCY_GRID_CELLSIZE EQUAL 8 AND NOT MRPT_OCCUPANCY_GRID_CELLSIZE EQUAL 16) MESSAGE("MRPT_OCCUPANCY_GRID_CELLSIZE can have the values 8 or 16 only.") ENDIF(NOT MRPT_OCCUPANCY_GRID_CELLSIZE EQUAL 8 AND NOT MRPT_OCCUPANCY_GRID_CELLSIZE EQUAL 16) # Support for Bumblebee stereo camera: # =================================================== SET( MRPT_HAS_BUMBLEBEE OFF CACHE BOOL "Add support for Bumblebee Stereo Camera?") IF(MRPT_HAS_BUMBLEBEE) SET( BUMBLEBEE_DIGICLOPS_ROOT_DIR "" CACHE PATH "Path to digiclops library root directory") SET( BUMBLEBEE_TRICLOPS_ROOT_DIR "" CACHE PATH "Path to triclops library root directory") IF(UNIX) MESSAGE("Sorry! Bumblebee camera is supported only for Windows yet. Set MRPT_HAS_BUMBLEBEE to OFF") SET(CMAKE_MRPT_HAS_BUMBLEBEE 0) ELSE(UNIX) # Set to 1, next check for missing things and set to 0 on any error & report message: SET(CMAKE_MRPT_HAS_BUMBLEBEE 1) IF(NOT EXISTS ${BUMBLEBEE_DIGICLOPS_ROOT_DIR}) SET(CMAKE_MRPT_HAS_BUMBLEBEE 0) MESSAGE("The directory 'BUMBLEBEE_DIGICLOPS_ROOT_DIR' does not exists. Turn off BUMBLEBEE support or provide the correct path.") ENDIF(NOT EXISTS ${BUMBLEBEE_DIGICLOPS_ROOT_DIR}) IF(NOT EXISTS ${BUMBLEBEE_DIGICLOPS_ROOT_DIR}/include/digiclops.h) SET(CMAKE_MRPT_HAS_BUMBLEBEE 0) MESSAGE("The directory 'BUMBLEBEE_DIGICLOPS_ROOT_DIR' does not contain include/digiclops.h. Turn off BUMBLEBEE support or provide the correct path.") ENDIF(NOT EXISTS ${BUMBLEBEE_DIGICLOPS_ROOT_DIR}/include/digiclops.h) IF(NOT EXISTS ${BUMBLEBEE_DIGICLOPS_ROOT_DIR}/lib/digiclops.lib) SET(CMAKE_MRPT_HAS_BUMBLEBEE 0) MESSAGE("The directory 'BUMBLEBEE_DIGICLOPS_ROOT_DIR' does not contain lib/digiclops.h. Turn off BUMBLEBEE support or provide the correct path.") ENDIF(NOT EXISTS ${BUMBLEBEE_DIGICLOPS_ROOT_DIR}/lib/digiclops.lib) # ---- IF(NOT EXISTS ${BUMBLEBEE_TRICLOPS_ROOT_DIR}) SET(CMAKE_MRPT_HAS_BUMBLEBEE 0) MESSAGE("The directory 'BUMBLEBEE_TRICLOPS_ROOT_DIR' does not exists. Turn off BUMBLEBEE support or provide the correct path.") ENDIF(NOT EXISTS ${BUMBLEBEE_TRICLOPS_ROOT_DIR}) IF(NOT EXISTS ${BUMBLEBEE_TRICLOPS_ROOT_DIR}/include/triclops.h) SET(CMAKE_MRPT_HAS_BUMBLEBEE 0) MESSAGE("The directory 'BUMBLEBEE_TRICLOPS_ROOT_DIR' does not contain include/triclops.h. Turn off BUMBLEBEE support or provide the correct path.") ENDIF(NOT EXISTS ${BUMBLEBEE_TRICLOPS_ROOT_DIR}/include/triclops.h) IF(NOT EXISTS ${BUMBLEBEE_TRICLOPS_ROOT_DIR}/lib/triclops.lib) SET(CMAKE_MRPT_HAS_BUMBLEBEE 0) MESSAGE("The directory 'BUMBLEBEE_TRICLOPS_ROOT_DIR' does not contain lib/triclops.lib. Turn off BUMBLEBEE support or provide the correct path.") ENDIF(NOT EXISTS ${BUMBLEBEE_TRICLOPS_ROOT_DIR}/lib/triclops.lib) ENDIF(UNIX) ENDIF(MRPT_HAS_BUMBLEBEE) # Check for Boost: # =================================================== FIND_PACKAGE( Boost ) # 1.34.1 COMPONENTS date_time filesystem iostreams ... ) IF(Boost_FOUND) INCLUDE_DIRECTORIES(Boost_INCLUDE_DIRS) LINK_DIRECTORIES(Boost_LIBRARY_DIRS) SET(CMAKE_MRPT_HAS_BOOST 1) ELSE(Boost_FOUND) SET(CMAKE_MRPT_HAS_BOOST 0) MARK_AS_ADVANCED(CLEAR Boost_INCLUDE_DIR) ENDIF(Boost_FOUND) # Check for STXXL: (Not yet) # ===================================== SET(CMAKE_MRPT_HAS_STXXL 0) # Check for the FTDI headers (Linux only, in win32 # we use built-in header & dynamic DLL load): # =================================================== IF(UNIX) FIND_FILE(FTDI_CONFIG_FILE libftdi-config) IF(FTDI_CONFIG_FILE) SET(CMAKE_MRPT_HAS_FTDI 1) # Get the config params: EXECUTE_PROCESS(COMMAND ${FTDI_CONFIG_FILE} --libs RESULT_VARIABLE CMAKE_FTDI_CONFIG_RES OUTPUT_VARIABLE CMAKE_FTDI_LIBS OUTPUT_STRIP_TRAILING_WHITESPACE ) IF(${CMAKE_FTDI_CONFIG_RES}) MESSAGE("Error invoking FTDI config file:\n ${FTDI_CONFIG_FILE} --libs") ENDIF(${CMAKE_FTDI_CONFIG_RES}) EXECUTE_PROCESS(COMMAND ${FTDI_CONFIG_FILE} --cflags RESULT_VARIABLE CMAKE_FTDI_CONFIG_RES OUTPUT_VARIABLE CMAKE_FTDI_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE ) IF(${CMAKE_FTDI_CONFIG_RES}) MESSAGE("Error invoking FTDI config file:\n ${FTDI_CONFIG_FILE} --cflags") ENDIF(${CMAKE_FTDI_CONFIG_RES}) ADD_DEFINITIONS(${CMAKE_FTDI_CFLAGS}) ELSE(FTDI_CONFIG_FILE) SET(CMAKE_MRPT_HAS_FTDI 0) ENDIF(FTDI_CONFIG_FILE) # This option will be available only on Linux, hence it's declared here: OPTION(DISABLE_FTDI "Do not use the USB driver for FTDI chips" 0) ELSE(UNIX) # In windows we always have FTDI support (at compile time at least...) SET(CMAKE_MRPT_HAS_FTDI 1) ENDIF(UNIX) # Check for the sys/inotify headers (Linux only, in win32 # we use the equivalent API for file system monitoring): # ======================================================= IF(UNIX) FIND_FILE(INOTIFY_HEADER_FILE sys/inotify.h) IF(INOTIFY_HEADER_FILE) SET(CMAKE_MRPT_HAS_INOTIFY 1) ELSE(INOTIFY_HEADER_FILE) SET(CMAKE_MRPT_HAS_INOTIFY 0) ENDIF(INOTIFY_HEADER_FILE) ELSE(UNIX) # In windows there is no INOTIFY api. SET(CMAKE_MRPT_HAS_INOTIFY 0) ENDIF(UNIX) # Check for the GL,GLUT libraries (Linux only, in # Windows use the build in .h & .lib): # =================================================== #IF(CMAKE_COMPILER_IS_GNUCXX) IF(UNIX) FIND_FILE(GLUT_INCLUDE_FILE GL/glut.h) IF(NOT GLUT_INCLUDE_FILE) MESSAGE(STATUS "**Warning**: glut.h not found! OpenGL capabilities will be disabled.") ENDIF(NOT GLUT_INCLUDE_FILE) FIND_LIBRARY(GL_LIB_FILE GL) IF(NOT GL_LIB_FILE) MESSAGE(STATUS "**Warning**: Library GL not found! OpenGL capabilities will be disabled.") ENDIF(NOT GL_LIB_FILE) FIND_LIBRARY(GLU_LIB_FILE GLU) IF(NOT GLU_LIB_FILE) MESSAGE(STATUS "**Warning**: Library GLU not found! OpenGL capabilities will be disabled.") ENDIF(NOT GLU_LIB_FILE) IF(GLUT_INCLUDE_FILE AND GL_LIB_FILE AND GLU_LIB_FILE) SET(CMAKE_MRPT_HAS_OPENGL_GLUT 1) ELSE(GLUT_INCLUDE_FILE AND GL_LIB_FILE AND GLU_LIB_FILE) SET(CMAKE_MRPT_HAS_OPENGL_GLUT 0) ENDIF(GLUT_INCLUDE_FILE AND GL_LIB_FILE AND GLU_LIB_FILE) ELSE(UNIX) SET(CMAKE_MRPT_HAS_OPENGL_GLUT 1) ENDIF(UNIX) # Check for the OpenCV libraries (Linux only, in # Windows use the build in .h & .lib): # =================================================== IF(UNIX) FIND_LIBRARY(CV_LIB_FILE cv) FIND_LIBRARY(HIGHGUI_LIB_FILE highgui) IF(CV_LIB_FILE AND HIGHGUI_LIB_FILE) SET(CMAKE_MRPT_HAS_OPENCV 1) SET(MRPT_OPENCV_POSTFIX "") ELSE(CV_LIB_FILE AND HIGHGUI_LIB_FILE) # Old version (Debian 4.0) FIND_LIBRARY(CV_LIB_FILE2 cv0.9.7) FIND_LIBRARY(HIGHGUI_LIB_FILE2 highgui0.9.7) IF(CV_LIB_FILE2 AND HIGHGUI_LIB_FILE2) SET(CMAKE_MRPT_HAS_OPENCV 1) SET(MRPT_OPENCV_POSTFIX "0.9.7") ELSE(CV_LIB_FILE2 AND HIGHGUI_LIB_FILE2) SET(CMAKE_MRPT_HAS_OPENCV 0) ENDIF(CV_LIB_FILE2 AND HIGHGUI_LIB_FILE2) ENDIF(CV_LIB_FILE AND HIGHGUI_LIB_FILE) ELSE(UNIX) SET(CMAKE_MRPT_HAS_OPENCV 1) ENDIF(UNIX) # Check for system lib3ds: # =================================================== SET(CMAKE_MRPT_HAS_LIB3DS 1) # Always present: system or built-in # Check for wxWidgets + GL # If it is found, will set CMAKE_MRPT_HAS_WXWIDGETS=1 # =================================================== # Here you can define what libraries of wxWidgets you need for your application. You can figure out what libraries you need here; http://www.wxwidgets.org/manuals/2.8/wx_librarieslist.html SET(wxWidgets_USE_LIBS base core gl) IF(UNIX) # Linux: IF(CMAKE_BUILD_TYPE MATCHES "Debug") SET(wxWidgets_USE_DEBUG ON) ENDIF(CMAKE_BUILD_TYPE MATCHES "Debug") ELSE(UNIX) # Windows configuration of wxWidgets: SET(wxWidgets_USE_REL_AND_DBG ON) ENDIF(UNIX) # We need the Find package for wxWidgets to work FIND_PACKAGE(wxWidgets) # Did we find wxWidgets ? This condition will fail for as long as the internal vars do not point to the proper wxWidgets configuration IF(wxWidgets_FOUND) # Check for non-found debug libs: IF(UNIX) IF(CMAKE_BUILD_TYPE MATCHES "Debug") IF(NOT wxWidgets_USE_DEBUG) MESSAGE("Warning: The debug libraries for wxWidgets couldn't be found by CMake. Please install them (libwxbase2.8-dev) or build in release.") ENDIF(NOT wxWidgets_USE_DEBUG) ENDIF(CMAKE_BUILD_TYPE MATCHES "Debug") ENDIF(UNIX) # Include wxWidgets macros INCLUDE(${wxWidgets_USE_FILE}) # ${wxWidgets_LIBRARIES} will contain the libraries that should be added through TARGET_LINK_LIBRARIES(...) #MESSAGE(STATUS "wxWidgets_LIBRARIES: ${wxWidgets_LIBRARIES}") #MESSAGE(STATUS "wxWidgets_CXX_FLAGS: ${wxWidgets_CXX_FLAGS}") LINK_DIRECTORIES(${wxWidgets_LIBRARY_DIRS}) IF(MSVC) ADD_DEFINITIONS(-DwxUSE_NO_MANIFEST=1) ENDIF(MSVC) # For use in the MRPTconfig.cmake SET(CMAKE_MRPT_WX_ROOT_DIR ${wxWidgets_ROOT_DIR}) SET(CMAKE_MRPT_HAS_WXWIDGETS 1) ELSE(wxWidgets_FOUND) MESSAGE("wxWidgets was not found automatically. Please, set wxWidgets_ROOT_DIR to the lib directory to enable it in MRPT.") SET(CMAKE_MRPT_HAS_WXWIDGETS 0) ENDIF(wxWidgets_FOUND) # DISABLE_WXWIDGETS # --------------------- SET( DISABLE_WXWIDGETS OFF CACHE BOOL "Forces compilation WITHOUT wxWidgets") IF(DISABLE_WXWIDGETS) SET(CMAKE_MRPT_HAS_WXWIDGETS 0) SET(wxWidgets_LIBRARIES "") ENDIF(DISABLE_WXWIDGETS) # --------------------------------------------------------------------------- # OPTIONS #The options for the user when using "cmakesetup" or "ccmake": # --------------------------------------------------------------------------- OPTION(MRPT_ALWAYS_CHECKS_DEBUG "Additional checks even in Release" "ON") OPTION(DISABLE_OPENCV "Disable the OpenCV library" "OFF") # --------------------------------------------------------------------------- # Parse the value of options to disable stuff: # --------------------------------------------------------------------------- IF(DISABLE_OPENCV) SET(${CMAKE_MRPT_HAS_OPENCV} 0) ENDIF(DISABLE_OPENCV) # --------------------------------------------------------------------------- # Create the minimum list of libraries required by an application that # uses the MRPT C++ library. This must be passed to "TARGET_LINK_LIBRARIES" # NOTE: For the compilers MSVC* & Borland most of the libraries are # automatically included through "#pragma"'s ;-) # --------------------------------------------------------------------------- IF(MSVC OR BORLAND) SET(MRPT_LINKER_LIBS "") SET(MRPTd_LINKER_LIBS "") SET(MRPT_LINKER_LIBS_FOR_PKGCONFIG "") IF(CMAKE_MRPT_HAS_OPENCV) INCLUDE_DIRECTORIES("${MRPT_SOURCE_DIR}/include/mrpt/otherlibs/opencv/") SET(CMAKE_MRPT_HAS_OPENCV_SYSTEM 0) ENDIF(CMAKE_MRPT_HAS_OPENCV) IF(CMAKE_MRPT_HAS_LIB3DS) INCLUDE_DIRECTORIES("${MRPT_SOURCE_DIR}/include/mrpt/otherlibs/lib3ds/") SET(CMAKE_MRPT_HAS_LIB3DS_SYSTEM 0) ENDIF(CMAKE_MRPT_HAS_LIB3DS) # glut (for windows): INCLUDE_DIRECTORIES("${MRPT_SOURCE_DIR}/include/mrpt/otherlibs/glut/") ELSE(MSVC OR BORLAND) # OpenCV: cv highgui IF(CMAKE_MRPT_HAS_OPENCV) # Invoke pkg-config for getting the configuration: IF(PKG_CONFIG_FOUND) PKG_CHECK_MODULES(OPENCV opencv) INCLUDE_DIRECTORIES("${OPENCV_INCLUDEDIR}") LINK_DIRECTORIES("${OPENCV_LIBDIR}") LIST(APPEND MRPT_LINKER_LIBS ${OPENCV_LIBRARIES}) LIST(APPEND MRPTd_LINKER_LIBS ${OPENCV_LIBRARIES}) MESSAGE(STATUS " opencv include: ${OPENCV_INCLUDE_DIRS}") INCLUDE_DIRECTORIES(${OPENCV_INCLUDE_DIRS}) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OPENCV_CFLAGS}") SET(MRPT_LINKER_LIBS_FOR_PKGCONFIG "${MRPT_LINKER_LIBS_FOR_PKGCONFIG} ${opencv_LDFLAGS}") ELSE(PKG_CONFIG_FOUND) # Manual config: INCLUDE_DIRECTORIES(/usr/include/opencv) LIST(APPEND MRPT_LINKER_LIBS "cv${MRPT_OPENCV_POSTFIX};highgui${MRPT_OPENCV_POSTFIX}") LIST(APPEND MRPTd_LINKER_LIBS "cv${MRPT_OPENCV_POSTFIX};highgui${MRPT_OPENCV_POSTFIX}") SET(MRPT_LINKER_LIBS_FOR_PKGCONFIG "${MRPT_LINKER_LIBS_FOR_PKGCONFIG} -lcv${MRPT_OPENCV_POSTFIX} -lhighgui${MRPT_OPENCV_POSTFIX}") ENDIF(PKG_CONFIG_FOUND) SET(CMAKE_MRPT_HAS_OPENCV_SYSTEM 1) ENDIF(CMAKE_MRPT_HAS_OPENCV) # GL, GLU, glut: IF(CMAKE_MRPT_HAS_OPENGL_GLUT) IF (UNIX) SET(MRPT_LINKER_LIBS ${MRPT_LINKER_LIBS} GL GLU glut) SET(MRPTd_LINKER_LIBS ${MRPTd_LINKER_LIBS} GL GLU glut) SET(MRPT_LINKER_LIBS_FOR_PKGCONFIG "${MRPT_LINKER_LIBS_FOR_PKGCONFIG} -lGL -lGLU -lglut") ELSE(UNIX) SET(MRPT_LINKER_LIBS ${MRPT_LINKER_LIBS} glut32.lib) ENDIF(UNIX) ENDIF(CMAKE_MRPT_HAS_OPENGL_GLUT) # FTDI: IF(CMAKE_MRPT_HAS_FTDI) IF (UNIX) # ${CMAKE_FTDI_LIBS} SET(MRPT_LINKER_LIBS ${MRPT_LINKER_LIBS} ftdi usb) SET(MRPTd_LINKER_LIBS ${MRPTd_LINKER_LIBS} ftdi usb) SET(MRPT_LINKER_LIBS_FOR_PKGCONFIG "${MRPT_LINKER_LIBS_FOR_PKGCONFIG} -lftdi -lusb") ELSE(UNIX) # Nothing... ENDIF(UNIX) ENDIF(CMAKE_MRPT_HAS_FTDI) # 3ds: IF(CMAKE_MRPT_HAS_LIB3DS) FIND_FILE(LIB3DS_CONFIG_FILE lib3ds-config) IF(LIB3DS_CONFIG_FILE) # Get the config params: EXECUTE_PROCESS(COMMAND ${LIB3DS_CONFIG_FILE} --prefix RESULT_VARIABLE CMAKE_LIB3DS_CONFIG_RES OUTPUT_VARIABLE CMAKE_LIB3DS_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE ) IF(${CMAKE_LIB3DS_CONFIG_RES}) MESSAGE("Error invoking lib3ds config file:\n ${LIB3DS_CONFIG_FILE} --prefix") ENDIF(${CMAKE_LIB3DS_CONFIG_RES}) MESSAGE(STATUS "Found library: lib3ds") MESSAGE(STATUS " lib3ds include: ${CMAKE_LIB3DS_PREFIX}/include") INCLUDE_DIRECTORIES("${CMAKE_LIB3DS_PREFIX}/include") LINK_DIRECTORIES("${CMAKE_LIB3DS_PREFIX}/lib") SET(MRPT_LINKER_LIBS ${MRPT_LINKER_LIBS} 3ds) SET(MRPTd_LINKER_LIBS ${MRPTd_LINKER_LIBS} 3ds) SET(MRPT_LINKER_LIBS_FOR_PKGCONFIG "${MRPT_LINKER_LIBS_FOR_PKGCONFIG} -l3ds") SET(CMAKE_MRPT_HAS_LIB3DS_SYSTEM 1) ELSE(LIB3DS_CONFIG_FILE) INCLUDE_DIRECTORIES("${MRPT_SOURCE_DIR}/include/mrpt/otherlibs/lib3ds/") SET(MRPT_LINKER_LIBS ${MRPT_LINKER_LIBS} mrpt-3ds) SET(MRPTd_LINKER_LIBS ${MRPTd_LINKER_LIBS} mrpt-3ds-dbg) SET(MRPT_LINKER_LIBS_FOR_PKGCONFIG "${MRPT_LINKER_LIBS_FOR_PKGCONFIG} -lmrpt-3ds") SET(CMAKE_MRPT_HAS_LIB3DS_SYSTEM 0) ENDIF(LIB3DS_CONFIG_FILE) ENDIF(CMAKE_MRPT_HAS_LIB3DS) # In Linux, link against librt & libz IF(UNIX) SET(MRPT_LINKER_LIBS ${MRPT_LINKER_LIBS} rt z) SET(MRPTd_LINKER_LIBS ${MRPT_LINKER_LIBS} rt z) SET(MRPT_LINKER_LIBS_FOR_PKGCONFIG "${MRPT_LINKER_LIBS_FOR_PKGCONFIG} -lrt -lz -pthread") ENDIF(UNIX) # ANN: SET(MRPT_LINKER_LIBS ${MRPT_LINKER_LIBS} mrpt-ann) SET(MRPTd_LINKER_LIBS ${MRPTd_LINKER_LIBS} mrpt-ann-dbg) SET(MRPT_LINKER_LIBS_FOR_PKGCONFIG "${MRPT_LINKER_LIBS_FOR_PKGCONFIG} -lmrpt-ann") ENDIF(MSVC OR BORLAND) # Boost: Add libraries # ---------------------------------- IF(CMAKE_MRPT_HAS_BOOST) SET(MRPT_LINKER_LIBS ${MRPT_LINKER_LIBS} ${Boost_LIBRARIES}) SET(MRPTd_LINKER_LIBS ${MRPTd_LINKER_LIBS} ${Boost_LIBRARIES}) FOREACH(BLIB ${Boost_LIBRARIES}) SET(MRPT_LINKER_LIBS_FOR_PKGCONFIG "${MRPT_LINKER_LIBS_FOR_PKGCONFIG} ${BLIB}") ENDFOREACH(BLIB) ENDIF(CMAKE_MRPT_HAS_BOOST) # WXWIDGETS+GL: Add libraries # ------------------------------------------- IF(CMAKE_MRPT_HAS_WXWIDGETS) LIST(APPEND MRPT_LINKER_LIBS ${wxWidgets_LIBRARIES}) LIST(APPEND MRPTd_LINKER_LIBS ${wxWidgets_LIBRARIES}) FOREACH(WXLIB ${wxWidgets_LIBRARIES}) SET(MRPT_LINKER_LIBS_FOR_PKGCONFIG "${MRPT_LINKER_LIBS_FOR_PKGCONFIG} ${WXLIB}") ENDFOREACH(WXLIB) ENDIF(CMAKE_MRPT_HAS_WXWIDGETS) # Save the basic list of libraries (without MRPT-libs): # ------------------------------------------------------------------------------------- SET(MRPTLIB_LINKER_LIBS ${MRPT_LINKER_LIBS}) IF(NOT MSVC AND NOT BORLAND) # Core SET(MRPT_LINKER_LIBS ${MRPT_LINKER_LIBS} mrpt-core) SET(MRPTd_LINKER_LIBS ${MRPTd_LINKER_LIBS} mrpt-core-dbg) SET(MRPT_LINKER_LIBS_FOR_PKGCONFIG "${MRPT_LINKER_LIBS_FOR_PKGCONFIG} -lmrpt-core") # ARIA: IF (BUILD_ARIA) SET(MRPT_LINKER_LIBS ${MRPT_LINKER_LIBS} mrpt-aria) SET(MRPTd_LINKER_LIBS ${MRPTd_LINKER_LIBS} mrpt-aria-dbg) SET(MRPT_LINKER_LIBS_FOR_PKGCONFIG "${MRPT_LINKER_LIBS_FOR_PKGCONFIG} -lmrpt-aria") ENDIF(BUILD_ARIA) # xSens: IF (CMAKE_MRPT_HAS_xSENS) SET(MRPT_LINKER_LIBS ${MRPT_LINKER_LIBS} mrpt-xsens) SET(MRPTd_LINKER_LIBS ${MRPTd_LINKER_LIBS} mrpt-xsens-dbg) SET(MRPT_LINKER_LIBS_FOR_PKGCONFIG "${MRPT_LINKER_LIBS_FOR_PKGCONFIG} -lmrpt-xsens") ENDIF(CMAKE_MRPT_HAS_xSENS) ENDIF(NOT MSVC AND NOT BORLAND) # Save the list of libraries according to the current debug/release build (gcc only) # ------------------------------------------------------------------------------------- IF(CMAKE_BUILD_TYPE STREQUAL "Debug") SET(MRPT_LINKER_LIBS_POSTFIX "-dbg") SET(MRPT_LINKER_LIBS_RELorDEB ${MRPTd_LINKER_LIBS}) ELSE(CMAKE_BUILD_TYPE STREQUAL "Debug") SET(MRPT_LINKER_LIBS_POSTFIX "") SET(MRPT_LINKER_LIBS_RELorDEB ${MRPT_LINKER_LIBS}) ENDIF(CMAKE_BUILD_TYPE STREQUAL "Debug") #MESSAGE(STATUS "MRPT_LINKER_LIBS_RELorDEB: ${MRPT_LINKER_LIBS_RELorDEB} ${MRPT_OPENCV_POSTFIX}") # Detect wordsize: # ------------------------------------------- IF(CMAKE_SIZEOF_VOID_P EQUAL 8) # Size in bytes! SET(CMAKE_MRPT_WORD_SIZE 64) ELSE(CMAKE_SIZEOF_VOID_P EQUAL 8) # Size in bytes! SET(CMAKE_MRPT_WORD_SIZE 32) ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8) # ---------------------------------------------------------------------------- # Transform the variables MRPT_XXX="ON/OFF" to CMAKE_MRPT_XXX="1/0" # ---------------------------------------------------------------------------- MACRO(CREATE_CMAKE_MRPT_DEFINE defName) IF(${defName} MATCHES "ON") SET(CMAKE_${defName} "1") ELSE(${defName} MATCHES "ON") SET(CMAKE_${defName} "0") ENDIF(${defName} MATCHES "ON") ENDMACRO(CREATE_CMAKE_MRPT_DEFINE) CREATE_CMAKE_MRPT_DEFINE(MRPT_ALWAYS_CHECKS_DEBUG) CREATE_CMAKE_MRPT_DEFINE(MRPT_HAS_BUMBLEBEE) CREATE_CMAKE_MRPT_DEFINE(MRPT_HAS_ASSERT) CREATE_CMAKE_MRPT_DEFINE(MRPT_HAS_STACKED_EXCEPTIONS) CREATE_CMAKE_MRPT_DEFINE(MRPT_HAS_ASIAN_FONTS) CREATE_CMAKE_MRPT_DEFINE(CMAKE_MRPT_HAS_INOTIFY) # ---------------------------------------------------------------------------- # UPDATE CONFIG FILES & SCRIPTS: # # CONFIGURE_FILE(InputFile OutputFile [COPYONLY] [ESCAPE_QUOTES] [@ONLY]) # If @ONLY is specified, only variables of the form @VAR@ will be # replaces and ${VAR} will be ignored. # # A directory will be created for each platform so the "config.h" file is # not overwritten if cmake generates code in the same path. # ---------------------------------------------------------------------------- SET(MRPT_CONFIG_FILE_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/mrpt-config/" CACHE PATH "Where to create the platform-dependant config.h") IF(UNIX) SET(MRPT_CONFIG_FILE_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/mrpt-config/unix/" ) ENDIF(UNIX) IF (WIN32) SET(MRPT_CONFIG_FILE_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/mrpt-config/win32/") ENDIF(WIN32) FILE(MAKE_DIRECTORY "${MRPT_CONFIG_FILE_INCLUDE_DIR}") FILE(MAKE_DIRECTORY "${MRPT_CONFIG_FILE_INCLUDE_DIR}/mrpt") MESSAGE(STATUS "Parsing 'config.h.in'") CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/include/mrpt/config.h.in" "${MRPT_CONFIG_FILE_INCLUDE_DIR}/mrpt/config.h") # Configure Makefile for building latex documentation: CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/doc/mrpt-tutorial/tex/Makefile.in" "${CMAKE_SOURCE_DIR}/doc/mrpt-tutorial/tex/Makefile") # ---------------------------------------------------------------------------- # Update the library version header file # FILE_TO_PARSE="SRC/include/mrpt/MRPT_version.h.in" # TARGET_FILE ="MRPT_version.h" # ---------------------------------------------------------------------------- SET(CMAKE_MRPT_COMPLETE_NAME "MRPT ${CMAKE_MRPT_VERSION_NUMBER_MAJOR}.${CMAKE_MRPT_VERSION_NUMBER_MINOR}.${CMAKE_MRPT_VERSION_NUMBER_PATCH} ${CMAKE_MRPT_SVNVERSION}") # Build a three digits version code, eg. 0.5.1 -> 051, 1.2.0 -> 120 SET(CMAKE_MRPT_VERSION_CODE "0x${CMAKE_MRPT_VERSION_NUMBER_MAJOR}${CMAKE_MRPT_VERSION_NUMBER_MINOR}${CMAKE_MRPT_VERSION_NUMBER_PATCH}") MESSAGE(STATUS "Parsing 'version.h.in'") CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/include/mrpt/version.h.in "${MRPT_CONFIG_FILE_INCLUDE_DIR}/mrpt/version.h") # --------------------------------------------------------------------------- # The C++ include & link directories: # --------------------------------------------------------------------------- INCLUDE_DIRECTORIES(".") INCLUDE_DIRECTORIES("${MRPT_CONFIG_FILE_INCLUDE_DIR}") INCLUDE_DIRECTORIES("${MRPT_SOURCE_DIR}/include") #INCLUDE_DIRECTORIES("${MRPT_SOURCE_DIR}/apps") LINK_DIRECTORIES("${CMAKE_SOURCE_DIR}/lib" "${CMAKE_SOURCE_DIR}/lib/otherlibs") LINK_DIRECTORIES("${CMAKE_BINARY_DIR}/lib") IF(CMAKE_MRPT_HAS_BUMBLEBEE) INCLUDE_DIRECTORIES("${BUMBLEBEE_DIGICLOPS_ROOT_DIR}/include") INCLUDE_DIRECTORIES("${BUMBLEBEE_TRICLOPS_ROOT_DIR}/include") LINK_DIRECTORIES("${BUMBLEBEE_DIGICLOPS_ROOT_DIR}/lib") LINK_DIRECTORIES("${BUMBLEBEE_TRICLOPS_ROOT_DIR}/lib") ENDIF(CMAKE_MRPT_HAS_BUMBLEBEE) IF(CMAKE_MRPT_HAS_VLD) INCLUDE_DIRECTORIES("${ROOT_VISUAL_LEAK_DETECTOR}/include") LINK_DIRECTORIES("${ROOT_VISUAL_LEAK_DETECTOR}/lib") ENDIF(CMAKE_MRPT_HAS_VLD) IF(CMAKE_MRPT_HAS_xSENS) INCLUDE_DIRECTORIES("${ROOT_xSENS}") ENDIF(CMAKE_MRPT_HAS_xSENS) # ---------------------------------------------------------------------------- # Set the maximum level of warnings: # ---------------------------------------------------------------------------- SET( MRPT_EXTRA_WARNINGS OFF CACHE BOOL "Enable extra warnings apart from -Wall") # Should be set to true for development SET( MRPT_WARNINGS_ARE_ERRORS OFF CACHE BOOL "Treat warnings as errors") # Whole program optimization? SET( MRPT_WHOLE_PROGRAM_OPTIMIZATION OFF CACHE BOOL "Flags for whole program optimization.") # Include Asian fonts in utils::CMRPTCanvas ? SET( MRPT_HAS_ASIAN_FONTS OFF CACHE BOOL "Enable Asian fonts in utils::CMRPTCanvas (increases library size).") IF(MSVC) SET(EXTRA_CPP_FLAGS "/W3 /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE") # 64-bit portability warnings, in MSVC8+ IF(MSVC80) SET(EXTRA_CPP_FLAGS "${EXTRA_CPP_FLAGS} /Wp64 ") ENDIF(MSVC80) # Whole program optimization IF(MRPT_WHOLE_PROGRAM_OPTIMIZATION AND MSVC80) SET(EXTRA_CPP_FLAGS "${EXTRA_CPP_FLAGS} /GL") SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LTCG ") SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG ") SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /LTCG ") SET(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS_RELEASE} /LTCG ") ENDIF(MRPT_WHOLE_PROGRAM_OPTIMIZATION AND MSVC80) # Remove unreferenced functions: function level linking SET(EXTRA_CPP_FLAGS "${EXTRA_CPP_FLAGS} /Gy") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 ") ENDIF(MSVC) IF(CMAKE_COMPILER_IS_GNUCXX) # High level of warnings. The -Wno-long-long is required in 64bit systems when including sytem headers. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CONFIGURE_CFLAGS} -Wall -pedantic -Wno-long-long -Wno-write-strings") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_CONFIGURE_CFLAGS} -Wall -pedantic -Wno-long-long -Wno-write-strings") # We need pthread's IF (UNIX) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") ENDIF(UNIX) IF(MRPT_WARNINGS_ARE_ERRORS) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") ENDIF(MRPT_WARNINGS_ARE_ERRORS) # Whole program optimization IF(MRPT_WHOLE_PROGRAM_OPTIMIZATION) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --combine") SET(MRPT_EXES_CXX_FLAGS "${MRPT_EXES_CXX_FLAGS} -fwhole-program --combine") ENDIF(MRPT_WHOLE_PROGRAM_OPTIMIZATION) # "-mtune=native" generates code optimized for the detected current processor. IF (CMAKE_MRPT_GCC_VERSION GREATER 41) SET( MRPT_OPTIMIZE_NATIVE ON CACHE BOOL "GCC optimizations for current processor (-mtune=native). Requires GCC 4.2+") ELSE (CMAKE_MRPT_GCC_VERSION GREATER 41) SET( MRPT_OPTIMIZE_NATIVE OFF CACHE BOOL "GCC optimizations for current processor (-mtune=native). Requires GCC 4.2+") ENDIF (CMAKE_MRPT_GCC_VERSION GREATER 41) IF(CMAKE_BUILD_TYPE STREQUAL "Debug") # Not in debug! SET(MRPT_OPTIMIZE_NATIVE OFF) ENDIF(CMAKE_BUILD_TYPE STREQUAL "Debug") IF(MRPT_OPTIMIZE_NATIVE AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug") SET(EXTRA_CPP_FLAGS "-O3 -mtune=native") ENDIF(MRPT_OPTIMIZE_NATIVE AND NOT CMAKE_BUILD_TYPE STREQUAL "Debug") # "-ffast-math" SET( MRPT_OPTIMIZE_FFAST-MATH OFF CACHE BOOL "GCC optimization for floating math (-ffast-math).") IF(MRPT_OPTIMIZE_FFAST-MATH) SET(EXTRA_CPP_FLAGS "${EXTRA_CPP_FLAGS} -ffast-math") ENDIF(MRPT_OPTIMIZE_FFAST-MATH) # Profiling? IF(MRPT_ENABLE_PROFILING) SET(EXTRA_CPP_FLAGS "${EXTRA_CPP_FLAGS} -pg -g") ELSEIF(MRPT_ENABLE_PROFILING) # Remove unreferenced functions: function level linking SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections") ENDIF(MRPT_ENABLE_PROFILING) # Parallel stdlibc++? IF(MRPT_ENABLE_LIBSTD_PARALLEL_MODE) SET(EXTRA_CPP_FLAGS "${EXTRA_CPP_FLAGS} -D_GLIBCXX_PARALLEL -fopenmp") ENDIF(MRPT_ENABLE_LIBSTD_PARALLEL_MODE) IF(CMAKE_BUILD_TYPE MATCHES "Debug") # This is to enable stack walker: SET(EXTRA_CPP_FLAGS "${EXTRA_CPP_FLAGS} -g") ADD_DEFINITIONS( -D_DEBUG) ADD_DEFINITIONS( -DDEBUG) ENDIF(CMAKE_BUILD_TYPE MATCHES "Debug") # Cross compiling Linux 64bits -> 32 bits? IF(UNIX) # Are we in a 64 bit Linux? IF(CMAKE_SIZEOF_VOID_P EQUAL 8) # Size in bytes! SET( MRPT_CROSS_COMPILE_64_TO_32 OFF CACHE BOOL "Build 32 bit executables (Default=OFF, native 64 bit)") IF(MRPT_CROSS_COMPILE_64_TO_32) SET(EXTRA_CPP_FLAGS "${EXTRA_CPP_FLAGS} -m32") SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32") SET(CMAKE_MRPT_64BIT_COMPILE_MODE "32 bit cross-compiling") SET(CMAKE_MRPT_WORD_SIZE 32) # Fake wordsize ELSE(MRPT_CROSS_COMPILE_64_TO_32) SET(CMAKE_MRPT_64BIT_COMPILE_MODE "64 bit native") ENDIF(MRPT_CROSS_COMPILE_64_TO_32) ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8) ENDIF(UNIX) ENDIF(CMAKE_COMPILER_IS_GNUCXX) # Even more warnings: "Scott Meyers' Effective C++ book" IF(MRPT_EXTRA_WARNINGS) IF(CMAKE_COMPILER_IS_GNUCXX) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weffc++") # -Wold-style-cast -Woverloaded-virtual ENDIF(CMAKE_COMPILER_IS_GNUCXX) ENDIF(MRPT_EXTRA_WARNINGS) # Add user supplied extra options (optimization, etc...) # ========================================================== SET(USER_EXTRA_CPP_FLAGS "" CACHE STRING "Put extra compiler options here if desired") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CPP_FLAGS} ${USER_EXTRA_CPP_FLAGS}") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CPP_FLAGS} ${USER_EXTRA_CPP_FLAGS}") SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${EXTRA_CPP_FLAGS} ${USER_EXTRA_CPP_FLAGS}") IF (${CMAKE_CONFIGURE_LDFLAGS}) SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_CONFIGURE_LDFLAGS}") ENDIF (${CMAKE_CONFIGURE_LDFLAGS}) # ---------------------------------------------------------------------------- # PROCESS SUBDIRECTORIES: # ---------------------------------------------------------------------------- #MESSAGE(STATUS "CMAKE_CONFIGURATION_TYPES: ${CMAKE_CONFIGURATION_TYPES}") # Save libs and executables in the same place SET( LIBRARY_OUTPUT_PATH ${MRPT_BINARY_DIR}/lib CACHE PATH "Output directory for libraries" ) SET( EXECUTABLE_OUTPUT_PATH ${MRPT_BINARY_DIR}/bin CACHE PATH "Output directory for applications" ) #----------------------------------- # Build the hardware drivers? #----------------------------------- SET( BUILD_HWDRIVERS ON CACHE BOOL "Build hardware drivers (library apps/lib_hwdrivers)?.") #-------------------------------------------------------------- # If we are building the final step of the Debian package, # save each library files in the corresponding directories: #-------------------------------------------------------------- IF(CMAKE_MRPT_USE_DEB_POSTFIXS) MESSAGE(STATUS "mrpt cmake: Using Debian post-fix for install directories.") SET(libmrpt_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/libmrpt-core${CMAKE_MRPT_VERSION_NUMBER_MAJOR}/usr/") SET(libmrpt_hwdrivers_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/libmrpt-hwdrivers${CMAKE_MRPT_VERSION_NUMBER_MAJOR}/usr/") SET(libmrpt_reactivenav_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/libmrpt-reactivenav${CMAKE_MRPT_VERSION_NUMBER_MAJOR}/usr/") SET(libmrpt_dev_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/libmrpt-dev/usr/") SET(mrpt_apps_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/mrpt-apps/usr/") SET(mrpt_doc_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/mrpt-doc/usr/") ELSE(CMAKE_MRPT_USE_DEB_POSTFIXS) SET(libmrpt_INSTALL_PREFIX "") SET(libmrpt_hwdrivers_INSTALL_PREFIX "") SET(libmrpt_reactivenav_INSTALL_PREFIX "") SET(libmrpt_dev_INSTALL_PREFIX "") SET(mrpt_apps_INSTALL_PREFIX "") SET(mrpt_doc_INSTALL_PREFIX "") ENDIF(CMAKE_MRPT_USE_DEB_POSTFIXS) # ========================================================== # RPath handling (UNIX only) # http://www.cmake.org/Wiki/CMake_RPATH_handling # ========================================================== #IF(UNIX) # use, i.e. don't skip the full RPATH for the build tree # SET(CMAKE_SKIP_BUILD_RPATH FALSE) # when building, don't use the install RPATH already # (but later on when installing) # SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) # the RPATH to be used when installing # IF (${libmrpt_INSTALL_PREFIX}) # SET(CMAKE_INSTALL_RPATH "${libmrpt_INSTALL_PREFIX}/lib") # ELSE (${libmrpt_INSTALL_PREFIX}) # SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") # ENDIF(${libmrpt_INSTALL_PREFIX}) # add the automatically determined parts of the RPATH # which point to directories outside the build tree to the install RPATH # SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) #ENDIF(UNIX) #----------------------------------- # The third-party libraries #----------------------------------- add_subdirectory(otherlibs) #----------------------------------- # The MRPT C++ libraries: #----------------------------------- add_subdirectory(src) #----------------------------------- # The samples: #----------------------------------- SET( BUILD_EXAMPLES OFF CACHE BOOL "Build examples?") IF(BUILD_EXAMPLES) SET(CMAKE_MRPT_EXAMPLES_BASE_DIRECTORY "${CMAKE_SOURCE_DIR}/samples/") # Fix "\" --> "\\" for windows: string(REPLACE "\\" "\\\\" CMAKE_MRPT_EXAMPLES_BASE_DIRECTORY ${CMAKE_MRPT_EXAMPLES_BASE_DIRECTORY}) MESSAGE(STATUS "Parsing 'examples_config.h.in'") CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/include/mrpt/examples_config.h.in "${MRPT_CONFIG_FILE_INCLUDE_DIR}/MRPT/examples_config.h") # Generate CMakeLists.txt from the template project file for examples: MESSAGE(STATUS "Generating CMakefiles.txt for examples...") # --------------------------------------------------------------- # MACRO for samples directories # --------------------------------------------------------------- MACRO(GENERATE_CMAKE_FILES_SAMPLES_DIRECTORY) #CURRENT_SAMPLES_DIR) FOREACH(CMAKE_MRPT_EXAMPLE_NAME ${LIST_EXAMPLES_IN_THIS_DIR}) #MESSAGE(STATUS "Example: ${CMAKE_MRPT_EXAMPLE_NAME}") # Generate project file: CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/samples/CMakeLists_template.txt.in ${CMAKE_SOURCE_DIR}/samples/${CMAKE_MRPT_EXAMPLE_NAME}/CMakeLists.txt @ONLY) SET(CMAKE_COMMANDS_INCLUDE_EXAMPLE_DIRS_ROOT "${CMAKE_COMMANDS_INCLUDE_EXAMPLE_DIRS_ROOT}\nadd_subdirectory(${CMAKE_MRPT_EXAMPLE_NAME})") ENDFOREACH(CMAKE_MRPT_EXAMPLE_NAME) ENDMACRO(GENERATE_CMAKE_FILES_SAMPLES_DIRECTORY) # --------------------------------------------------------------- # END OF MACRO for samples directories # --------------------------------------------------------------- # ----------------------------------------------------------------- # This loop is generic, do not modify it... # modify the above variable and/or the list_examples.txt files! # ----------------------------------------------------------------- SET(CMAKE_COMMANDS_INCLUDE_EXAMPLE_DIRS_ROOT "") # === UTILS === # list of examples for each directory: SET(LIST_EXAMPLES_IN_THIS_DIR db display3D imageBasics imageCorrelation random SocketsTest times directoryExplorer imageConvolutionFFT imageFFT matrix rejectionSampling stringList exceptionDemo benchmark-matrix bayesianTracking displayPlots threadsTest critSectionDeadLock textFonts fileSystemWatcher optimize-lm geometry3D icp poses landmarkRawlogSimulator RangeOnlyLocalization_RejectionSampling grid-matching beaconRawlogSimulator consistent_global_optimization benchmark-gridmaps gridMapLikelihoodCharacterization gridmaps pathPlanning gridRawlogSimulator captureVideo gauss_and_DOG_convolution trackVideoFeatures test-compress spline_interpolation ) SET(CMAKE_EXAMPLE_DEPS mrpt-core) SET(CMAKE_EXAMPLE_LINK_LIBS ${MRPT_LINKER_LIBS}) GENERATE_CMAKE_FILES_SAMPLES_DIRECTORY() # === HWDRIVERS === IF(BUILD_HWDRIVERS) # list of examples for each directory: SET(LIST_EXAMPLES_IN_THIS_DIR GPS_test sonar_SRF10_test eNoses_test SerialPort_test FTDI_USB_enumerate_test SICK_laser_test HOKUYO_laser_test joystick ) SET(CMAKE_EXAMPLE_DEPS mrpt-core mrpt-hwdrivers) SET(CMAKE_EXAMPLE_LINK_LIBS ${MRPT_LINKER_LIBS} mrpt-hwdrivers) GENERATE_CMAKE_FILES_SAMPLES_DIRECTORY() ENDIF(BUILD_HWDRIVERS) # Generate the CMakeLists.txt in the "/samples" directory SET(CMAKE_COMMANDS_INCLUDE_EXAMPLE_DIRS ${CMAKE_COMMANDS_INCLUDE_EXAMPLE_DIRS_ROOT}) CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/samples/CMakeLists_list_template.txt.in "${CMAKE_SOURCE_DIR}/samples/CMakeLists.txt" ) add_subdirectory(samples) ENDIF(BUILD_EXAMPLES) #----------------------------------- # The applications: #----------------------------------- add_subdirectory(apps) #----------------------------------- # Documentation targets: #----------------------------------- add_subdirectory(doc) # ---------------------------------------------------------------------------- # Generate the .pc file(s) for pkg-config # ---------------------------------------------------------------------------- IF(UNIX) MESSAGE(STATUS "Generating libmrpt.pc file for pkg-config...") CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/pkgconfig/libmrpt.pc.in "${CMAKE_BINARY_DIR}/pkgconfig/libmrpt.pc" @ONLY) ENDIF(UNIX) # ---------------------------------------------------------------------------- # Generate the MRPTConfig.cmake file # ---------------------------------------------------------------------------- SET(THE_MRPT_SOURCE_DIR "${MRPT_SOURCE_DIR}") SET(THE_CMAKE_BINARY_DIR "${CMAKE_BINARY_DIR}") SET(THE_MRPT_CONFIG_FILE_INCLUDE_DIR "${MRPT_CONFIG_FILE_INCLUDE_DIR}") CONFIGURE_FILE("${MRPT_SOURCE_DIR}/MRPTConfig.cmake.in" "${MRPT_BINARY_DIR}/MRPTConfig.cmake" @ONLY IMMEDIATE ) # ---------------------------------------------------------------------------- # Generate the MRPTConfig.cmake file for unix # installation in CMAKE_INSTALL_PREFIX # ---------------------------------------------------------------------------- SET(THE_MRPT_SOURCE_DIR "${CMAKE_INSTALL_PREFIX}") SET(THE_CMAKE_BINARY_DIR "${CMAKE_INSTALL_PREFIX}") SET(THE_MRPT_CONFIG_FILE_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/include/mrpt/") CONFIGURE_FILE("${MRPT_SOURCE_DIR}/MRPTConfig.cmake.in" "${MRPT_BINARY_DIR}/unix-install/MRPTConfig.cmake" @ONLY IMMEDIATE ) # ---------------------------------------------------------------------------- # Hide some variables to the user, just show the important variables: # ---------------------------------------------------------------------------- MARK_AS_ADVANCED(FORCE CMAKE_BACKWARDS_COMPATIBILITY wxWidgets_CONFIGURATION wxWidgets_LIB_DIR # wxWidgets_ROOT_DIR wxWidgets_USE_REL_AND_DBG wxWidgets_wxrc_EXECUTABLE ) # ---------------------------------------------------------------------------- # An auxiliary function to show messages: # ---------------------------------------------------------------------------- MACRO(SHOW_CONFIG_LINE MSG_TEXT VALUE_BOOL) IF(${VALUE_BOOL}) SET(VAL_TEXT "Yes") ELSE(${VALUE_BOOL}) SET(VAL_TEXT " No") ENDIF(${VALUE_BOOL}) MESSAGE(STATUS " ${MSG_TEXT} : ${VAL_TEXT}") ENDMACRO(SHOW_CONFIG_LINE) MACRO(SHOW_CONFIG_LINE_SYSTEM MSG_TEXT VALUE_BOOL) IF(${VALUE_BOOL}) IF(${VALUE_BOOL}_SYSTEM) SET(VAL_TEXT "Yes (System)") ELSE(${VALUE_BOOL}_SYSTEM) SET(VAL_TEXT "Yes (Built-in)") ENDIF(${VALUE_BOOL}_SYSTEM) ELSE(${VALUE_BOOL}) SET(VAL_TEXT " No") ENDIF(${VALUE_BOOL}) MESSAGE(STATUS " ${MSG_TEXT} : ${VAL_TEXT}") ENDMACRO(SHOW_CONFIG_LINE_SYSTEM) # ---------------------------------------------------------------------------- # Sumary: # ---------------------------------------------------------------------------- MESSAGE(STATUS "") MESSAGE(STATUS "Resulting configuration for ${CMAKE_MRPT_COMPLETE_NAME}:") MESSAGE(STATUS "-----------------------------------------------------------------") SHOW_CONFIG_LINE("Will MRPT be built as a shared library? " CMAKE_MRPT_BUILD_SHARED_LIB_ONOFF) MESSAGE(STATUS "") SHOW_CONFIG_LINE("Additional checks even in Release " CMAKE_MRPT_ALWAYS_CHECKS_DEBUG) SHOW_CONFIG_LINE("Use Bumblebee stereo camera " CMAKE_MRPT_HAS_BUMBLEBEE) SHOW_CONFIG_LINE("Has wxWidgets incl. OpenGL classes " CMAKE_MRPT_HAS_WXWIDGETS) SHOW_CONFIG_LINE("Has OpenGL & GLUT: " CMAKE_MRPT_HAS_OPENGL_GLUT) SHOW_CONFIG_LINE("Has xSENS MTi library (inertial sensor) " CMAKE_MRPT_HAS_xSENS) SHOW_CONFIG_LINE_SYSTEM("Has OpenCV (Image manipulation) " CMAKE_MRPT_HAS_OPENCV) SHOW_CONFIG_LINE_SYSTEM("Has lib3ds (3DStudio scenes) " CMAKE_MRPT_HAS_LIB3DS) IF(UNIX) SHOW_CONFIG_LINE("Has libftdi (USB) " CMAKE_MRPT_HAS_FTDI) ENDIF(UNIX) IF(CMAKE_MRPT_64BIT_COMPILE_MODE) MESSAGE(STATUS " 64 bit compilation mode : ${CMAKE_MRPT_64BIT_COMPILE_MODE}") ENDIF(CMAKE_MRPT_64BIT_COMPILE_MODE) MESSAGE(STATUS "") MESSAGE(STATUS " C++ config header : ${MRPT_CONFIG_FILE_INCLUDE_DIR}") MESSAGE(STATUS "-----------------------------------------------------------------") MESSAGE(STATUS "")