diff --git a/CMakeLists.txt b/CMakeLists.txt index a2f7e9a..ec6b38c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,99 +1,152 @@ -cmake_minimum_required(VERSION 3.10.2) -project(robot_time) - -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSIONS OFF) -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}") - -# ======================================================== -# Find Packages -# ======================================================== +cmake_minimum_required(VERSION 3.0.2) +project(robot_time VERSION 1.0.0 LANGUAGES CXX) if(DEFINED CATKIN_DEVEL_PREFIX OR DEFINED CATKIN_TOPLEVEL) set(BUILDING_WITH_CATKIN TRUE) message(STATUS "Building robot_time with Catkin") + else() set(BUILDING_WITH_CATKIN FALSE) message(STATUS "Building robot_time with Standalone CMake") endif() -if(BUILDING_WITH_CATKIN) - find_package(catkin REQUIRED) -endif() +# 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(GTest 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) -if(BUILDING_WITH_CATKIN) - ## The catkin_package macro generates cmake config files for your package catkin_package( INCLUDE_DIRS include - LIBRARIES robot_time + LIBRARIES ${PROJECT_NAME} + ) + + include_directories( + include + ${catkin_INCLUDE_DIRS} ) endif() -include_directories(${GTEST_INCLUDE_DIRS}) - -if(BUILDING_WITH_CATKIN) - include_directories(${catkin_INCLUDE_DIRS}) -endif() - -add_library(robot_time +# Libraries +add_library(${PROJECT_NAME} SHARED src/duration.cpp src/rate.cpp - src/time.cpp) - -target_include_directories(robot_time PUBLIC - $ - $) - -set_target_properties(robot_time PROPERTIES - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} - BUILD_RPATH "${CMAKE_BINARY_DIR}" - INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" + src/time.cpp ) -## Add cmake target dependencies if(BUILDING_WITH_CATKIN) - add_dependencies(robot_time ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ + ) + + target_link_libraries(${PROJECT_NAME} + PUBLIC ${catkin_LIBRARIES} + ) + +else() + + target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ + ) + + set_target_properties(${PROJECT_NAME} PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} + BUILD_RPATH "${CMAKE_BINARY_DIR}" + INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib" + ) + endif() -# 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_time - EXPORT robot_timeTargets - ARCHIVE DESTINATION lib - LIBRARY DESTINATION lib - RUNTIME DESTINATION bin) +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} + ) -if(NOT BUILDING_WITH_CATKIN) + ## Mark cpp header files for installation + install(DIRECTORY include/ + 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/ DESTINATION include - FILES_MATCHING PATTERN "*.h") + 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: GTest") + message(STATUS "=================================") endif() -# Export targets - cần trong mọi trường hợp -install(EXPORT robot_timeTargets - NAMESPACE robot:: - DESTINATION lib/cmake/robot_time) +# ======================================================== +# Test executables +# ======================================================== +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test/time.cpp) + add_executable(${PROJECT_NAME}_test test/time.cpp) + target_link_libraries(${PROJECT_NAME}_test PRIVATE + ${PROJECT_NAME} + GTest::GTest + GTest::Main + ) +endif() -add_executable(robot_time_test test/time.cpp) -add_executable(robot_duration_test test/duration.cpp) -target_link_libraries(robot_time_test PRIVATE - robot_time - ${GTEST_LIBRARIES} - GTest::GTest - GTest::Main) - target_link_libraries(robot_duration_test PRIVATE - robot_time - ${GTEST_LIBRARIES} - GTest::GTest - GTest::Main) +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/test/duration.cpp) + add_executable(${PROJECT_NAME}_duration_test test/duration.cpp) + target_link_libraries(${PROJECT_NAME}_duration_test PRIVATE + ${PROJECT_NAME} + GTest::GTest + GTest::Main + ) +endif()