cmake_minimum_required(VERSION 3.5) project(stella_vslam_ros LANGUAGES CXX C) if(POLICY CMP0042) cmake_policy(SET CMP0042 NEW) endif() if(POLICY CMP0072) set(OpenGL_GL_PREFERENCE LEGACY) endif() if(POLICY CMP0074) cmake_policy(SET CMP0074 OLD) endif() list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/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 backward-cpp") if(USE_STACK_TRACE_LOGGER) find_package(Backward REQUIRED) message(STATUS "Stack trace logger: ENABLED") 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(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(rclcpp_components REQUIRED) find_package(cv_bridge REQUIRED) find_package(image_transport REQUIRED) find_package(message_filters REQUIRED) find_package(geometry_msgs REQUIRED) find_package(nav_msgs REQUIRED) find_package(sensor_msgs REQUIRED) find_package(tf2 REQUIRED) find_package(tf2_eigen REQUIRED) find_package(tf2_geometry_msgs REQUIRED) find_package(tf2_msgs REQUIRED) find_package(tf2_ros REQUIRED) find_package(rosbag2_cpp REQUIRED) # thread library find_package(Threads REQUIRED) # stella_vslam find_package(stella_vslam REQUIRED) # 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.3 REQUIRED) include_directories(${EIGEN3_INCLUDE_DIR}) # yaml-cpp find_package(yaml-cpp REQUIRED) # spdlog find_package(spdlog QUIET) if(spdlog_FOUND) message(STATUS "Use spdlog on system: ${spdlog_VERSION}") else() set(spdlog_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/3rd/spdlog/include) include_directories(${spdlog_INCLUDE_DIR}) endif() # filesystem set(filesystem_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/3rd/filesystem/include) include_directories(${filesystem_INCLUDE_DIR}) # popl set(popl_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/3rd/popl/include) include_directories(${popl_INCLUDE_DIR}) # json set(json_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/3rd/json/include) include_directories(${json_INCLUDE_DIR}) find_package(pangolin_viewer QUIET) if(pangolin_viewer_FOUND) message(STATUS "Viewer for examples: PangolinViewer") endif() find_package(socket_publisher QUIET) if(socket_publisher_FOUND) message(STATUS "Viewer for examples: SocketPublisher") endif() find_package(iridescence_viewer QUIET) if(iridescence_viewer_FOUND) message(STATUS "Viewer for examples: IridescenceViewer") endif() ######### # Build # ######### add_subdirectory(src) add_library(stella_vslam_ros_system SHARED src/system.cc src/stella_vslam_ros.cc ) if(pangolin_viewer_FOUND) # set macro flag target_compile_definitions(stella_vslam_ros_system PRIVATE HAVE_PANGOLIN_VIEWER) # link viewer target_link_libraries(stella_vslam_ros_system PRIVATE pangolin_viewer::pangolin_viewer) endif() if(socket_publisher_FOUND) # set macro flag target_compile_definitions(stella_vslam_ros_system PRIVATE HAVE_SOCKET_PUBLISHER) # link viewer target_link_libraries(stella_vslam_ros_system PRIVATE socket_publisher::socket_publisher ${SIOCLIENT_LIBRARY} ${PROTOBUF_LIBRARIES}) endif() if(iridescence_viewer_FOUND) # Set macro flag target_compile_definitions(stella_vslam_ros_system PRIVATE HAVE_IRIDESCENCE_VIEWER) # Link viewer target_link_libraries(stella_vslam_ros_system PRIVATE iridescence_viewer::iridescence_viewer) endif() # TODO: Move heder files to include directory target_include_directories(stella_vslam_ros_system PRIVATE $ $) rclcpp_components_register_node(stella_vslam_ros_system PLUGIN "stella_vslam_ros::System" EXECUTABLE system) ament_export_targets(export_${PROJECT_NAME} HAS_LIBRARY_TARGET) ament_target_dependencies(stella_vslam_ros_system PUBLIC rclcpp rclcpp_components cv_bridge image_transport message_filters rcutils geometry_msgs nav_msgs sensor_msgs tf2 tf2_eigen tf2_geometry_msgs tf2_msgs tf2_ros) target_link_libraries(stella_vslam_ros_system PRIVATE yaml-cpp stella_vslam::stella_vslam) if(spdlog_FOUND) target_link_libraries(stella_vslam_ros_system PRIVATE spdlog::spdlog) endif() if(NOT WIN32) ament_environment_hooks( "${ament_cmake_package_templates_ENVIRONMENT_HOOK_LIBRARY_PATH}") endif() install(TARGETS stella_vslam_ros_system EXPORT export_${PROJECT_NAME} ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin ) ament_package()