diff --git a/CMakeLists.txt b/CMakeLists.txt index ec57bb7..03b3380 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,94 +1,142 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.0.2) +project(data_convert 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 data_convert with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building data_convert with Standalone CMake") endif() -project(data_convert) - +# C++ Standard - must be set before find_package set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) -# ======================================================== -# Find dependencies -# ======================================================== +if (NOT BUILDING_WITH_CATKIN) -if(BUILDING_WITH_CATKIN) - find_package(catkin REQUIRED COMPONENTS + # 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_geometry_msgs ) -endif() + +else() # ======================================================== # Catkin specific configuration # ======================================================== + find_package(catkin REQUIRED COMPONENTS + robot_geometry_msgs + ) -if(BUILDING_WITH_CATKIN) catkin_package( INCLUDE_DIRS include - # Header-only library; keep LIBRARIES for visibility when exporting - LIBRARIES data_convert + # LIBRARIES không cần vì đây là header-only library CATKIN_DEPENDS robot_geometry_msgs ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} + ) endif() -add_library(data_convert INTERFACE) +# Tìm tất cả header files +file(GLOB_RECURSE HEADERS "include/data_convert/*.h") + +# Tạo INTERFACE library (header-only) +add_library(${PROJECT_NAME} INTERFACE) -# Link libraries if(BUILDING_WITH_CATKIN) - target_link_libraries(data_convert INTERFACE + add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + + # Set include directories + target_include_directories(${PROJECT_NAME} + INTERFACE + $ + $ + ) + + # Link dependencies (header-only, chỉ cần include paths) + target_link_libraries(${PROJECT_NAME} + INTERFACE ${catkin_LIBRARIES} ) + else() - target_link_libraries(data_convert INTERFACE - robot_geometry_msgs + + # Set include directories + target_include_directories(${PROJECT_NAME} + INTERFACE + $ + $ ) + + # Link dependencies (header-only, chỉ cần include paths) + target_link_libraries(${PROJECT_NAME} + INTERFACE + ${PACKAGES_DIR} + ) + endif() if(BUILDING_WITH_CATKIN) - add_dependencies(data_convert ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -endif() - -target_include_directories(data_convert - INTERFACE - $ - $ -) - -# ======================================================== -# Installation -# ======================================================== - -# --- Cài đặt thư viện vào hệ thống khi chạy make install --- -install(TARGETS data_convert - EXPORT data_convert-targets - INCLUDES DESTINATION include # Cài đặt include -) - -if(NOT BUILDING_WITH_CATKIN) - # Cài đặt headers (standalone) - install(DIRECTORY include/ - DESTINATION include - FILES_MATCHING PATTERN "*.h" + ## 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 ".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 ".svn" EXCLUDE + ) + + # Print configuration info + message(STATUS "=================================") + message(STATUS "Project: ${PROJECT_NAME} (Header-Only)") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Headers found:") + foreach(hdr ${HEADERS}) + message(STATUS " - ${hdr}") + endforeach() + message(STATUS "Dependencies: robot_geometry_msgs") + message(STATUS "=================================") endif() - -# --- Xuất export set data_convert-targets thành file CMake module --- -# --- Tạo file lib/cmake/data_convert/data_convert-targets.cmake --- -# --- File này chứa cấu hình giúp project khác có thể dùng --- -# --- Find_package(data_convert REQUIRED) --- -# --- Target_link_libraries(my_app PRIVATE data_convert::data_convert) --- -install(EXPORT data_convert-targets - FILE data_convert-targets.cmake - NAMESPACE data_convert:: - DESTINATION lib/cmake/data_convert -) -