cmake_minimum_required(VERSION 3.0.2) project(robot_grid_map_core VERSION 1.0.0 LANGUAGES CXX) # ======================================================== # Detect Catkin or Standalone # ======================================================== if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building robot_grid_map_core with Catkin") else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building robot_grid_map_core with Standalone CMake") endif() # ======================================================== # C++ Standard # ======================================================== set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # ======================================================== # Compiler warnings # ======================================================== add_compile_options(-Wall -Wextra -Wpedantic) # ======================================================== # Eigen # ======================================================== find_package(Eigen3 QUIET) if(NOT EIGEN3_FOUND) find_package(PkgConfig REQUIRED) pkg_check_modules(EIGEN3 REQUIRED eigen3) set(EIGEN3_INCLUDE_DIR ${EIGEN3_INCLUDE_DIRS}) endif() # ======================================================== # Extras # ======================================================== include(cmake/${PROJECT_NAME}-extras.cmake) # ======================================================== # Dependencies # ======================================================== if(BUILDING_WITH_CATKIN) find_package(catkin REQUIRED) catkin_package( INCLUDE_DIRS include ${EIGEN3_INCLUDE_DIR} LIBRARIES ${PROJECT_NAME} CATKIN_DEPENDS DEPENDS CFG_EXTRAS ${PROJECT_NAME}-extras.cmake ) include_directories( include ${catkin_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIR} ) else() # Standalone build settings set(CMAKE_POSITION_INDEPENDENT_CODE ON) # RPATH (quan trọng cho plugin / shared lib) set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") endif() # ======================================================== # Library # ======================================================== add_library(${PROJECT_NAME} SHARED src/GridMap.cpp src/GridMapMath.cpp src/SubmapGeometry.cpp src/BufferRegion.cpp src/Polygon.cpp src/CubicInterpolation.cpp src/iterators/GridMapIterator.cpp src/iterators/SubmapIterator.cpp src/iterators/CircleIterator.cpp src/iterators/EllipseIterator.cpp src/iterators/SpiralIterator.cpp src/iterators/PolygonIterator.cpp src/iterators/LineIterator.cpp src/iterators/SlidingWindowIterator.cpp ) # ======================================================== # Includes # ======================================================== target_include_directories(${PROJECT_NAME} PUBLIC $ $ ${EIGEN3_INCLUDE_DIR} ) # ======================================================== # Link libraries # ======================================================== if(BUILDING_WITH_CATKIN) add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS} ) target_link_libraries(${PROJECT_NAME} PUBLIC ${catkin_LIBRARIES} ) else() set_target_properties(${PROJECT_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} BUILD_RPATH "${CMAKE_BINARY_DIR}" INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" ) endif() # ======================================================== # Install # ======================================================== if(BUILDING_WITH_CATKIN) install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} ) install(DIRECTORY include/${PROJECT_NAME}/ DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} FILES_MATCHING PATTERN "*.hpp" ) install(DIRECTORY doc DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} ) else() install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}-targets ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin ) install(EXPORT ${PROJECT_NAME}-targets FILE ${PROJECT_NAME}-targets.cmake NAMESPACE ${PROJECT_NAME}:: DESTINATION lib/cmake/${PROJECT_NAME} ) install(DIRECTORY include/${PROJECT_NAME}/ DESTINATION include FILES_MATCHING PATTERN "*.hpp" ) install(DIRECTORY doc DESTINATION share/${PROJECT_NAME} ) message(STATUS "=================================") message(STATUS "Project: ${PROJECT_NAME}") message(STATUS "Version: ${PROJECT_VERSION}") message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") message(STATUS "Library: ${PROJECT_NAME}") message(STATUS "Eigen include: ${EIGEN3_INCLUDE_DIR}") message(STATUS "=================================") endif()