From 9662bf6b1177cc360f86bb7eb02d7bedf35c1e92 Mon Sep 17 00:00:00 2001 From: Alec Leamas Date: Fri, 25 Sep 2020 20:32:31 +0200 Subject: [PATCH] cmake: Make catkin package optional --- CMakeLists.txt | 79 +++++++++++++++++++++++++++----------------- FindRt.cmake | 19 +++++++++++ serial.pc.in | 12 +++++++ tests/CMakeLists.txt | 37 +++++++++++++++++++-- 4 files changed, 113 insertions(+), 34 deletions(-) create mode 100644 FindRt.cmake create mode 100644 serial.pc.in diff --git a/CMakeLists.txt b/CMakeLists.txt index f69aa1f..d67488b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,49 +9,54 @@ else () endif () message(STATUS "Building package ${PKG_NAME}") -# Find catkin -find_package(catkin REQUIRED) +option(DISABLE_CATKIN "Disable build of catkin package and tests" OFF) +if (DISABLE_CATKIN AND "${CATKIN_ENABLE_TESTING}" STREQUAL "" ) + set(CATKIN_ENABLE_TESTING OFF) +endif () set(PROJ_SOVERSION 1) - project(${PKG_NAME} VERSION 1.2.1 DESCRIPTION "Cross-platform, Serial Port library written in C++" HOMEPAGE_URL "http://wjwwood.io/serial/" ) +include(GNUInstallDirs) +if (NOT DISABLE_CATKIN) + find_package(catkin REQUIRED) +endif () configure_file(package.xml.in ${PROJECT_SOURCE_DIR}/package.xml @ONLY) -if(APPLE) - find_library(IOKIT_LIBRARY IOKit) - find_library(FOUNDATION_LIBRARY Foundation) -endif() # Public options and command line configuration option(ENABLE_TEST_PROGRAM "Build test program" OFF) option(CATKIN_ENABLE_TESTING "Enable catkin unit tests" ON) + set(SERIAL_DOCDIR ${CMAKE_INSTALL_PREFIX}/share/doc/${PROJECT_NAME} CACHE STRING "Installation root for doxygen docs." ) find_path(HAVE_STDINT_H NAMES stdint.h) -if(UNIX AND NOT APPLE) - # If Linux, add rt and pthread - set(rt_LIBRARIES rt) - set(pthread_LIBRARIES pthread) +if (NOT DISABLE_CATKIN) + find_library(PTHREAD_LIB NAMES pthread REQUIRED) + if (PTHREAD_LIB) + set(PTHREAD_LIBRARIES ${PTHREAD_LIB}) + endif () + find_package(Rt) + if (RT_FOUND) + set(_RT RT) + endif () + configure_file(package.xml.in ${PROJECT_SOURCE_DIR}/package.xml @ONLY) catkin_package( LIBRARIES ${PROJECT_NAME} INCLUDE_DIRS include - DEPENDS rt pthread + DEPENDS ${_RT} PTHREAD ) -else() - # Otherwise normal call - catkin_package( - LIBRARIES ${PROJECT_NAME} - INCLUDE_DIRS include - ) -endif() + set(CMAKE_INSTALL_LIBDIR ${CATKIN_PACKAGE_LIB_DESTINATION}) + set(CMAKE_INSTALL_BINDIR ${CATKIN_GLOBAL_BIN_DESTINATION}) + set(CMAKE_INSTALL_INCLUDEDIR ${CATKIN_GLOBAL_INCLUDE_DESTINATION}) +endif () ## Sources set(serial_SRCS src/serial.cc include/serial/serial.h) @@ -91,13 +96,15 @@ if (HAVE_STDINT_H) target_compile_definitions(${PROJECT_NAME} PRIVATE -DHAVE_STDINT_H) endif () -if(APPLE) - target_link_libraries(${PROJECT_NAME} ${FOUNDATION_LIBRARY} ${IOKIT_LIBRARY}) -elseif(UNIX) - target_link_libraries(${PROJECT_NAME} rt pthread) -else() +if (APPLE) + find_library(IOKIT_LIB IOKit) + find_library(FOUNDATION_LIB Foundation) + target_link_libraries(${PROJECT_NAME} ${FOUNDATION_LIB} ${IOKIT_LIB}) +elseif (UNIX) + target_link_libraries(${PROJECT_NAME} ${RT_LIBRARIES} ${PTHREAD_LIBRARIES}) +else () target_link_libraries(${PROJECT_NAME} setupapi) -endif() +endif () ## Include headers @@ -105,19 +112,29 @@ include_directories(include) ## Install executable install(TARGETS ${PROJECT_NAME} - ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} - LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} - RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} - PUBLIC_HEADER DESTINATION - ${CATKIN_GLOBAL_INCLUDE_DESTINATION}/${PROJECT_NAME} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} ) # Other targets: test program, pkg-config and tests. -if(CATKIN_ENABLE_TESTING) +if (CATKIN_ENABLE_TESTING) + include(CTest) + find_package(GTest REQUIRED) + enable_testing() add_subdirectory(tests) endif() +if (DISABLE_CATKIN) + configure_file(serial.pc.in ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.pc @ONLY) + install( + FILES ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig + ) +endif() + if (ENABLE_TEST_PROGRAM) add_executable(serial_example examples/serial_example.cc) add_dependencies(serial_example ${PROJECT_NAME}) diff --git a/FindRt.cmake b/FindRt.cmake new file mode 100644 index 0000000..05a6ed4 --- /dev/null +++ b/FindRt.cmake @@ -0,0 +1,19 @@ +# Try to find real time libraries +# Once done, this will define +# +# RT_FOUND - system has rt library +# RT_LIBRARIES - rt libraries directory + +if(RT_LIBRARIES) + set(RT_FIND_QUIETLY TRUE) +endif(RT_LIBRARIES) + +find_library(RT_LIBRARY rt) +set(RT_LIBRARIES ${RT_LIBRARY}) + +# handle the QUIETLY and REQUIRED arguments and set +# RT_FOUND to TRUE if all listed variables are TRUE +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Rt DEFAULT_MSG RT_LIBRARY) + +mark_as_advanced(RT_LIBRARY) diff --git a/serial.pc.in b/serial.pc.in new file mode 100644 index 0000000..ca6f25f --- /dev/null +++ b/serial.pc.in @@ -0,0 +1,12 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=@CMAKE_INSTALL_PREFIX@ +libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@ +includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ + +Name: @PROJECT_NAME@ +Description: C++ portable serial ports communication library +Version: @PROJECT_VERSION@ + +Requires: +Libs: -L${libdir} -l@PROJECT_NAME@ +Cflags: -I${includedir} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e52a4d3..187f254 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,4 +1,4 @@ -if(UNIX) +if (UNIX AND NOT DISABLE_CATKIN) catkin_add_gtest(${PROJECT_NAME}-test unix_serial_tests.cc) target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME} ${Boost_LIBRARIES}) if(NOT APPLE) @@ -6,7 +6,38 @@ if(UNIX) endif() if(NOT APPLE) # these tests are unreliable on macOS - catkin_add_gtest(${PROJECT_NAME}-test-timer unit/unix_timer_tests.cc) - target_link_libraries(${PROJECT_NAME}-test-timer ${PROJECT_NAME}) + catkin_add_gtest(${PROJECT_NAME}-test-timer unit/unix_timer_tests.cc) + target_link_libraries(${PROJECT_NAME}-test-timer ${PROJECT_NAME}) endif() +elseif (UNIX) + + add_executable(serial_test + unix_serial_tests.cc + ) + target_link_libraries(serial_test + ${PROJECT_NAME} gtest gtest_main pthread + ) + set_target_properties(serial_test + PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED YES + ) + if (NOT APPLE) + target_link_libraries(serial_test util) + endif () + + add_executable(timer_test + unit/unix_timer_tests.cc + ) + target_link_libraries(timer_test + ${PROJECT_NAME} gtest gtest_main pthread + ) + set_target_properties(timer_test + PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED YES + ) + + add_test(NAME serial_test COMMAND serial_test) + add_test(NAME timer_test COMMAND timer_test) endif()