From 4fb3fdc28cc8fdd58fa3ab2d60857feb228948be Mon Sep 17 00:00:00 2001 From: HiepLM Date: Wed, 7 Jan 2026 16:56:03 +0700 Subject: [PATCH] update for ROS --- CMakeLists.txt | 213 ++++++++++++++++++++++++++++--------------------- 1 file changed, 123 insertions(+), 90 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1eb6073..9fe4869 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,148 +1,181 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.0.2) +project(robot_laser_geometry VERSION 1.0.0 LANGUAGES CXX) -# ======================================================== -# Dual-mode CMakeLists.txt: Supports both Catkin and Standalone CMake -# ======================================================== - -# Detect if building with Catkin if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building robot_laser_geometry with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building robot_laser_geometry with Standalone CMake") endif() -project(robot_laser_geometry) - +# C++ Standard - must be set before find_package set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) -include(CTest) +set(CMAKE_CXX_EXTENSIONS OFF) -# ======================================================== # Find dependencies -# ======================================================== - -# Find system dependencies find_package(Eigen3 REQUIRED) find_package(GTest REQUIRED) -if(BUILDING_WITH_CATKIN) - find_package(catkin REQUIRED COMPONENTS +if (NOT BUILDING_WITH_CATKIN) + + # Enable Position Independent Code + set(CMAKE_POSITION_INDEPENDENT_CODE ON) + + # Cấu hình RPATH để tránh cycle trong runtime search path + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + set(CMAKE_BUILD_RPATH "${CMAKE_BINARY_DIR}") + + set(PACKAGES_DIR robot_sensor_msgs geometry_msgs robot_time tf3 data_convert ) -endif() + +else() # ======================================================== # Catkin specific configuration # ======================================================== + find_package(catkin REQUIRED COMPONENTS + robot_sensor_msgs + geometry_msgs + robot_time + tf3 + data_convert + ) -if(BUILDING_WITH_CATKIN) catkin_package( INCLUDE_DIRS include - LIBRARIES robot_laser_geometry + LIBRARIES ${PROJECT_NAME} CATKIN_DEPENDS robot_sensor_msgs geometry_msgs robot_time tf3 data_convert DEPENDS Eigen3 ) -endif() -# Include directories -include_directories( + include_directories( include + ${catkin_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIRS} - ${GTEST_INCLUDE_DIRS} + ) +endif() + +# Libraries +add_library(${PROJECT_NAME} SHARED + src/laser_geometry.cpp ) if(BUILDING_WITH_CATKIN) - include_directories(${catkin_INCLUDE_DIRS}) -endif() + add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -# Create library -add_library(robot_laser_geometry SHARED src/laser_geometry.cpp) - -target_include_directories(robot_laser_geometry + target_include_directories(${PROJECT_NAME} PUBLIC - $ - $ -) - -# Link libraries -if(BUILDING_WITH_CATKIN) - target_link_libraries(robot_laser_geometry PUBLIC - ${catkin_LIBRARIES} + $ + $ ) + + target_link_libraries(${PROJECT_NAME} + PUBLIC ${catkin_LIBRARIES} + ) + else() - target_link_libraries(robot_laser_geometry PUBLIC - robot_sensor_msgs - geometry_msgs - robot_time - tf3 - data_convert + + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ ) + + target_link_libraries(${PROJECT_NAME} + PUBLIC + ${PACKAGES_DIR} + ) + + set_target_properties(${PROJECT_NAME} PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + BUILD_RPATH "${CMAKE_BINARY_DIR}" + INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" + ) + endif() -if(BUILDING_WITH_CATKIN) - add_dependencies(robot_laser_geometry ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -endif() - +# Link Eigen3 if(TARGET Eigen3::Eigen) - target_link_libraries(robot_laser_geometry PUBLIC Eigen3::Eigen) + target_link_libraries(${PROJECT_NAME} PUBLIC Eigen3::Eigen) else() - target_include_directories(robot_laser_geometry PUBLIC ${EIGEN3_INCLUDE_DIRS}) + target_include_directories(${PROJECT_NAME} PUBLIC ${EIGEN3_INCLUDE_DIRS}) endif() # Causes the visibility macros to use dllexport rather than dllimport, # which is appropriate when building the dll but not consuming it. -target_compile_definitions(robot_laser_geometry PRIVATE "ROBOT_LASER_GEOMETRY_BUILDING_LIBRARY") +target_compile_definitions(${PROJECT_NAME} PRIVATE "ROBOT_LASER_GEOMETRY_BUILDING_LIBRARY") -# ======================================================== -# Installation -# ======================================================== - -# --- Cài đặt thư viện vào hệ thống khi chạy make install --- -install(TARGETS robot_laser_geometry - EXPORT robot_laser_geometry-targets - ARCHIVE DESTINATION lib # Thư viện tĩnh .a - LIBRARY DESTINATION lib # Thư viện động .so - RUNTIME DESTINATION bin # File thực thi (nếu có) - INCLUDES DESTINATION include # Cài đặt include -) - -if(NOT BUILDING_WITH_CATKIN) - # Cài đặt headers (standalone) - install( - DIRECTORY include/ - DESTINATION include/${PROJECT_NAME} +if(BUILDING_WITH_CATKIN) + ## Mark libraries for installation + ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html + install(TARGETS ${PROJECT_NAME} + ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} + RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} + FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" + PATTERN ".svn" EXCLUDE + ) + +else() + + install(TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}-targets + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + ) + + # Export targets + install(EXPORT ${PROJECT_NAME}-targets + FILE ${PROJECT_NAME}-targets.cmake + NAMESPACE ${PROJECT_NAME}:: + DESTINATION lib/cmake/${PROJECT_NAME} + ) + + ## Mark cpp header files for installation + install(DIRECTORY include/${PROJECT_NAME}/ + DESTINATION include + FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" + PATTERN ".svn" EXCLUDE + ) + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME}") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Dependencies: robot_sensor_msgs, geometry_msgs, robot_time, tf3, data_convert, Eigen3") + message(STATUS "=================================") endif() -# --- Xuất export set robot_laser_geometry-targets thành file CMake module --- -# --- Tạo file lib/cmake/robot_laser_geometry/laser_geometry-targets.cmake --- -# --- File này chứa cấu hình giúp project khác có thể dùng --- -# --- Find_package(robot_laser_geometry REQUIRED) --- -# --- Target_link_libraries(my_app PRIVATE robot_laser_geometry::robot_laser_geometry) --- -install(EXPORT robot_laser_geometry-targets - FILE robot_laser_geometry-targets.cmake - NAMESPACE robot_laser_geometry:: - DESTINATION lib/cmake/robot_laser_geometry -) - - -# Tests +# ======================================================== +# Test executables +# ======================================================== if(BUILD_TESTING) - enable_testing() - - add_executable(projection_test test/projection_test.cpp) - target_link_libraries(projection_test - robot_laser_geometry - GTest::GTest - GTest::Main - pthread + enable_testing() + + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test/projection_test.cpp) + add_executable(${PROJECT_NAME}_test test/projection_test.cpp) + target_link_libraries(${PROJECT_NAME}_test PRIVATE + ${PROJECT_NAME} + GTest::GTest + GTest::Main + pthread ) - add_test(NAME projection_test COMMAND projection_test) + add_test(NAME ${PROJECT_NAME}_test COMMAND ${PROJECT_NAME}_test) + endif() endif()