diff --git a/CMakeLists.txt b/CMakeLists.txt index 31b5d48..66a5543 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,49 +1,55 @@ cmake_minimum_required(VERSION 3.0.2) -project(robot_xmlrpcpp) - -## Compile as C++17 -add_compile_options(-std=c++17) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) - -# ======================================================== -# Find Packages -# ======================================================== +project(robot_xmlrpcpp VERSION 1.0.0 LANGUAGES CXX) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building robot_xmlrpcpp with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building robot_xmlrpcpp with Standalone CMake") endif() -if(BUILDING_WITH_CATKIN) - ## Find catkin macros and libraries +# 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 +find_package(console_bridge REQUIRED) + +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}") + +else() + +# ======================================================== +# Catkin specific configuration +# ======================================================== find_package(catkin REQUIRED) + catkin_package( INCLUDE_DIRS include - LIBRARIES robot_xmlrpcpp - # CATKIN_DEPENDS + LIBRARIES ${PROJECT_NAME} + DEPENDS console_bridge ) -endif() -########### -## Build ## -########### - -## Specify additional locations of header files -if(BUILDING_WITH_CATKIN) - include_directories(${catkin_INCLUDE_DIRS}) -else() include_directories( include + ${catkin_INCLUDE_DIRS} + ${console_bridge_INCLUDE_DIRS} ) endif() -## Declare a C++ library -add_library(robot_xmlrpcpp +# Libraries +add_library(${PROJECT_NAME} SHARED src/XmlRpcClient.cpp src/XmlRpcDispatch.cpp src/XmlRpcServer.cpp @@ -55,62 +61,90 @@ add_library(robot_xmlrpcpp src/XmlRpcValue.cpp ) -## Target include directories -target_include_directories(robot_xmlrpcpp - PUBLIC - $ - $ -) - -## Add cmake target dependencies of the library if(BUILDING_WITH_CATKIN) - add_dependencies(robot_xmlrpcpp ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -endif() + add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -## Specify libraries to link a library or executable target against -target_link_libraries(robot_xmlrpcpp - ${console_bridge_LIBRARIES} -) - -if(BUILDING_WITH_CATKIN) - target_link_libraries(robot_xmlrpcpp ${catkin_LIBRARIES}) -endif() - -## Compiler flags -if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") - target_compile_options(robot_xmlrpcpp PRIVATE -Wall -Wextra -Wpedantic -fPIC -Wno-unused-parameter) -endif() - -# ======================================================== -# Installation (Standalone CMake only) -# ======================================================== - -# Export target trong mọi trường hợp để các target khác có thể export và phụ thuộc vào nó -install(TARGETS robot_xmlrpcpp - EXPORT robot_xmlrpcpp-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) - install( - DIRECTORY include/ - DESTINATION include/ + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ ) - # --- Xuất export set robot_xmlrpcpp-targets thành file CMake module --- - install(EXPORT robot_xmlrpcpp-targets - FILE robot_xmlrpcpp-targets.cmake - NAMESPACE robot_xmlrpcpp:: - DESTINATION lib/cmake/robot_xmlrpcpp + target_link_libraries(${PROJECT_NAME} + PUBLIC ${catkin_LIBRARIES} + PRIVATE console_bridge::console_bridge ) + else() - # Khi build với Catkin, vẫn cần export để các target khác có thể export - install(EXPORT robot_xmlrpcpp-targets - FILE robot_xmlrpcpp-targets.cmake - NAMESPACE robot_xmlrpcpp:: - DESTINATION lib/cmake/robot_xmlrpcpp + + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ ) + + target_link_libraries(${PROJECT_NAME} + PUBLIC + console_bridge::console_bridge + ) + + set_target_properties(${PROJECT_NAME} PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + BUILD_RPATH "${CMAKE_BINARY_DIR}" + INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" + ) + +endif() + +# Compiler flags +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -Wpedantic -fPIC -Wno-unused-parameter) +endif() + +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 ".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}") + message(STATUS "Version: ${PROJECT_VERSION}") + message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") + message(STATUS "Dependencies: console_bridge") + message(STATUS "=================================") endif()