cmake_minimum_required(VERSION 3.1) project(PLPSLAM LANGUAGES CXX C) if(POLICY CMP0042) cmake_policy(SET CMP0042 NEW) endif() if(POLICY CMP0074) cmake_policy(SET CMP0074 OLD) endif() # digging into the root directory of PLPSLAM get_filename_component(DEFAULT_PLPSLAM_DIR ${PROJECT_SOURCE_DIR} DIRECTORY) get_filename_component(DEFAULT_PLPSLAM_DIR ${DEFAULT_PLPSLAM_DIR} DIRECTORY) get_filename_component(DEFAULT_PLPSLAM_DIR ${DEFAULT_PLPSLAM_DIR} DIRECTORY) set(PLPSLAM_ROOT ${DEFAULT_PLPSLAM_DIR} CACHE STRING "Root directory of PLPSLAM") message(STATUS "Root directory of PLPSLAM: ${PLPSLAM_ROOT}") set(PLPSLAM_SRC_DIR ${PLPSLAM_ROOT}/src) message(STATUS "Source directory of PLPSLAM: ${PLPSLAM_SRC_DIR}") set(PLPSLAM_LIB_DIR ${PLPSLAM_ROOT}/build/lib CACHE STRING "Directory which contains the shared library of PLPSLAM") message(STATUS "Library directory of PLPSLAM: ${PLPSLAM_LIB_DIR}") list(APPEND CMAKE_MODULE_PATH ${PLPSLAM_ROOT}/cmake) # ################# # Set build type # # ################# if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set(CMAKE_BUILD_TYPE "Release") set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif() message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") # ########################## # Set application options # # ########################## set(USE_SANITIZER OFF CACHE BOOL "Enable Address/Memory sanitizer (set env as ASAN_OPTIONS=detect_leaks=1)") if(USE_SANITIZER) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer -fsanitize=address") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer -fsanitize=address") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fno-omit-frame-pointer -fsanitize=address") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fno-omit-frame-pointer -fsanitize=address") message(STATUS "Address/Memory sanitizer: ENABLED") else() message(STATUS "Address/Memory sanitizer: DISABLED") endif() set(USE_STACK_TRACE_LOGGER OFF CACHE BOOL "Enable automatic stack trace logger of google-glog") if(USE_STACK_TRACE_LOGGER) message(STATUS "Stack trace logger: ENABLED") # Glog find_package(Glog REQUIRED) include_directories(${GLOG_INCLUDE_DIR}) else() message(STATUS "Stack trace logger: DISABLED") endif() set(USE_GOOGLE_PERFTOOLS OFF CACHE BOOL "Enable profiler of google-perftools") if(USE_GOOGLE_PERFTOOLS) message(STATUS "Google Perftools: ENABLED") # Gperftools find_package(Gperftools REQUIRED) include_directories(${GPERFTOOLS_INCLUDE_DIRS}) else() message(STATUS "Google Perftools: DISABLED") endif() # ####################### # Set compiler options # # ####################### set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Og") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -ffast-math") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -ffast-math") set(BUILD_WITH_MARCH_NATIVE OFF CACHE BOOL "Enable architecture-aware optimization (-march=native)") if(BUILD_WITH_MARCH_NATIVE) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mtune=native -march=native") set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -mtune=native -march=native") message(STATUS "Architecture-aware optimization (-march=native): ENABLED") else() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mtune=native") set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -mtune=native") message(STATUS "Architecture-aware optimization (-march=native): DISABLED") endif() # ###################### # Check C++11 support # # ###################### include(CheckCXXCompilerFlag) check_cxx_compiler_flag("-std=c++17" COMPILER_SUPPORTS_CXX17) check_cxx_compiler_flag("-std=c++14" COMPILER_SUPPORTS_CXX14) check_cxx_compiler_flag("-std=c++11" COMPILER_SUPPORTS_CXX11) check_cxx_compiler_flag("-std=c++0x" COMPILER_SUPPORTS_CXX0X) if(COMPILER_SUPPORTS_CXX17) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") message(STATUS "C++11 support: OK (-std=c++17)") elseif(COMPILER_SUPPORTS_CXX14) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") message(STATUS "C++11 support: OK (-std=c++14)") elseif(COMPILER_SUPPORTS_CXX11) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") message(STATUS "C++11 support: OK (-std=c++11)") elseif(COMPILER_SUPPORTS_CXX0X) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") message(STATUS "C++11 support: OK (-std=c++0x)") else() message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") endif() # ################ # Find packages # # ################ find_package(catkin REQUIRED COMPONENTS cv_bridge image_transport) # thread library find_package(Threads REQUIRED) # PLPSLAM find_library(PLPSLAM_LIB PLPSLAM HINTS ${PLPSLAM_LIB_DIR}) # OpenCV find_package(OpenCV 3.3.1 QUIET) if(NOT OpenCV_FOUND) find_package(OpenCV 4.0) if(NOT OpenCV_FOUND) message(FATAL_ERROR "OpenCV >= 3.3.1 not found") endif() endif() message(STATUS "Use OpenCV ${OpenCV_VERSION}") include_directories(${OpenCV_INCLUDE_DIRS}) # Eigen find_package(Eigen3 3.2 REQUIRED) include_directories(${EIGEN3_INCLUDE_DIR}) # spdlog set(spdlog_INCLUDE_DIR ${PLPSLAM_ROOT}/3rd/spdlog/include) include_directories(${spdlog_INCLUDE_DIR}) # popl set(popl_INCLUDE_DIR ${PLPSLAM_ROOT}/3rd/popl/include) include_directories(${popl_INCLUDE_DIR}) # json set(json_INCLUDE_DIR ${PLPSLAM_ROOT}/3rd/json/include) include_directories(${json_INCLUDE_DIR}) # pangolin viewer set(USE_PANGOLIN_VIEWER ON CACHE BOOL "Enable Pangolin Viewer") if(USE_PANGOLIN_VIEWER) find_library(Pangolin_Viewer_LIB pangolin_viewer HINTS ${PLPSLAM_LIB_DIR}) find_package(Pangolin REQUIRED) endif() # socket publisher set(USE_SOCKET_PUBLISHER OFF CACHE BOOL "Enable Socket Publisher") if(USE_SOCKET_PUBLISHER) find_package(sioclient REQUIRED) find_package(Protobuf REQUIRED) find_library(Socket_Publisher_LIB socket_publisher HINTS ${PLPSLAM_LIB_DIR}) if(NOT PROTOBUF_PROTOC_EXECUTABLE) message(FATAL_ERROR "Could not find protoc executable (PROTOBUF_PROTOC_EXECUTABLE)") endif() message(STATUS "Found protoc executable: ${PROTOBUF_PROTOC_EXECUTABLE}") include_directories(${SIOCLIENT_INCLUDE_DIR} ${PROTOBUF_INCLUDE_DIRS}) endif() # ################################ # catkin specific configuration # # ################################ catkin_package(CATKIN_DEPENDS cv_bridge image_transport) # ################ # BoW framework # # ################ set(BOW_FRAMEWORK "DBoW2" CACHE STRING "DBoW2 or FBoW") set_property(CACHE BOW_FRAMEWORK PROPERTY STRINGS "DBoW2" "FBoW") if(BOW_FRAMEWORK MATCHES "DBoW2") find_package(DBoW2 REQUIRED) set(BOW_INCLUDE_DIRS ${DBoW2_INCLUDE_DIRS}) set(BOW_LIBS ${DBoW2_LIBS}) add_definitions(-DUSE_DBOW2) elseif(BOW_FRAMEWORK MATCHES "FBoW") find_package(fbow REQUIRED) set(BOW_INCLUDE_DIRS ${fbow_INCLUDE_DIRS}) set(BOW_LIBS ${fbow_LIBS}) else() message(FATAL_ERROR "Invalid BoW framework: ${BOW_FRAMEWORK}") endif() include_directories(${BOW_INCLUDE_DIRS}) message(STATUS "BoW framework: ${BOW_FRAMEWORK} (found in ${BOW_INCLUDE_DIRS})") # ######## # Build # # ######## include_directories( ${catkin_INCLUDE_DIRS} ${PLPSLAM_SRC_DIR}) link_libraries( ${catkin_LIBRARIES} ${PLPSLAM_LIB}) add_subdirectory(src)