From 541815e61e168f02668ef0f07ac1240fa584c0fd Mon Sep 17 00:00:00 2001 From: Dan Rose Date: Thu, 5 Sep 2019 12:49:56 -0500 Subject: [PATCH] Rework dynamic RMW Build with dynamic runtime middleware by default, even if only a single (or no) middleware is present at compile time. Allow building without dynamic middleware even if multiple are present at compile time. --- rmw_implementation/CMakeLists.txt | 45 +++------- .../rmw_implementation-extras.cmake.in | 84 +++++++------------ 2 files changed, 38 insertions(+), 91 deletions(-) diff --git a/rmw_implementation/CMakeLists.txt b/rmw_implementation/CMakeLists.txt index da0da9fc..1f69a8bb 100644 --- a/rmw_implementation/CMakeLists.txt +++ b/rmw_implementation/CMakeLists.txt @@ -15,9 +15,6 @@ find_package(ament_cmake REQUIRED) find_package(rcutils REQUIRED) -# provides FindPoco.cmake and Poco on platforms without it -find_package(poco_vendor) -find_package(Poco COMPONENTS Foundation) find_package(rmw_implementation_cmake REQUIRED) if(BUILD_TESTING) @@ -25,47 +22,28 @@ if(BUILD_TESTING) ament_lint_auto_find_test_dependencies() endif() +find_package(rmw REQUIRED) get_default_rmw_implementation(RMW_IMPLEMENTATION) -get_available_rmw_implementations(RMW_IMPLEMENTATIONS) -message(STATUS "") -message(STATUS "Found these rmw implementations:") -foreach(impl IN LISTS RMW_IMPLEMENTATIONS) - message(STATUS " '${impl}'") -endforeach() - message(STATUS "") message(STATUS "Default rmw implementation: '${RMW_IMPLEMENTATION}'") message(STATUS "") -option(RMW_IMPLEMENTATION_FORCE_DYNAMIC_LOADING - "Force use of dynamic loading (via poco), even if there is only one implementation available" +option(RMW_IMPLEMENTATION_BAKED "\ + Use only the RMW implementation specified at build time, \ + ignoring runtime value of the 'RMW_IMPLEMENTATION' environment variable \ + and the 'RMW_IMPLEMENTATION' CMake option" OFF) -# Nominally use dynamic loading if poco is available. -set(RMW_IMPLEMENTATION_SUPPORTS_POCO ${Poco_FOUND}) -# Determine if we're going to actually support dynamic loading. -if(RMW_IMPLEMENTATION_FORCE_DYNAMIC_LOADING) - # Force usage. - if(NOT Poco_FOUND) - message(FATAL_ERROR "Dynamic loading forced, but poco is not found!") - endif() - set(RMW_IMPLEMENTATION_SUPPORTS_POCO TRUE) -elseif(NOT RMW_IMPLEMENTATIONS MATCHES ";") - set(RMW_IMPLEMENTATION_SUPPORTS_POCO FALSE) -endif() - -if(NOT RMW_IMPLEMENTATION_SUPPORTS_POCO) +if(RMW_IMPLEMENTATION_BAKED) message(STATUS "Dynamic loading disabled; directly referencing '${RMW_IMPLEMENTATION}'") - message(STATUS "") - else() - message(STATUS "Dynamic loading enabled with any of the available rmw implementations") - message(STATUS "") + # provides FindPoco.cmake and Poco on platforms without it + find_package(poco_vendor REQUIRED) + find_package(Poco REQUIRED COMPONENTS Foundation) - find_package(rmw REQUIRED) + message(STATUS "Dynamic loading enabled") - link_directories(${Poco_LIBRARY_DIR}) add_library(${PROJECT_NAME} SHARED src/functions.cpp) ament_target_dependencies(${PROJECT_NAME} @@ -73,7 +51,6 @@ else() "rmw") target_compile_definitions(${PROJECT_NAME} PUBLIC "DEFAULT_RMW_IMPLEMENTATION=${RMW_IMPLEMENTATION}") - target_link_libraries(${PROJECT_NAME}) configure_rmw_library(${PROJECT_NAME}) ament_export_libraries(${PROJECT_NAME}) @@ -91,8 +68,6 @@ register_rmw_implementation( "cpp:rosidl_typesupport_cpp" ) -# necessary since get_available_rmw_implementations excludes rmw_implementation -list(APPEND RMW_IMPLEMENTATIONS "rmw_implementation") ament_package( CONFIG_EXTRAS "rmw_implementation-extras.cmake.in" ) diff --git a/rmw_implementation/rmw_implementation-extras.cmake.in b/rmw_implementation/rmw_implementation-extras.cmake.in index 372e2613..c38a8622 100644 --- a/rmw_implementation/rmw_implementation-extras.cmake.in +++ b/rmw_implementation/rmw_implementation-extras.cmake.in @@ -15,69 +15,41 @@ # generated from rmw_implementation/rmw_implementation-extras.cmake.in find_package(rmw_implementation_cmake REQUIRED) -set(default_rmw_implementation "@RMW_IMPLEMENTATION@") -set(available_rmw_implementations "@RMW_IMPLEMENTATIONS@") -if(NOT "${RMW_IMPLEMENTATION}" STREQUAL "") - set(requested_rmw_implementation ${RMW_IMPLEMENTATION}) - if(@RMW_IMPLEMENTATION_SUPPORTS_POCO@) - if(NOT requested_rmw_implementation IN_LIST available_rmw_implementations) - message(FATAL_ERROR - "The RMW implementation has been specified as " - "'${requested_rmw_implementation}' through CMake, " - "however it is not in the list of supported rmw implementations, " - "which was specified when the 'rmw_implementation' package was built.") - endif() +if(RMW_IMPLEMENTATION_BAKED) + message(STATUS "Using RMW implementation '@RMW_IMPLEMENTATION@'") + find_package("@RMW_IMPLEMENTATION@" REQUIRED) + + # TODO should never need definitions and include dirs? + list(APPEND rmw_implementation_DEFINITIONS ${@RMW_IMPLEMENTATION@_DEFINITIONS}) + list(APPEND rmw_implementation_INCLUDE_DIRS ${@RMW_IMPLEMENTATION@_INCLUDE_DIRS}) + list(APPEND rmw_implementation_LIBRARIES ${@RMW_IMPLEMENTATION@_LIBRARIES}) +else() + if(NOT "${RMW_IMPLEMENTATION}" STREQUAL "") + set(requested_rmw_implementation "${RMW_IMPLEMENTATION}") + set(requested_rmw_implementation_from "CMake") + elseif(NOT "$ENV{RMW_IMPLEMENTATION}" STREQUAL "") + set(requested_rmw_implementation "$ENV{RMW_IMPLEMENTATION}") + set(requested_rmw_implementation_from "environment variable 'RMW_IMPLEMENTATION'") else() - if(NOT requested_rmw_implementation STREQUAL default_rmw_implementation) - message(FATAL_ERROR - "The RMW implementation has been specified as " - "'${requested_rmw_implementation}' through CMake, " - "however this needs to match the RMW implementation " - "'${default_rmw_implementation}', " - "which was specified when the 'rmw_implementation' package was built.") - endif() + set(requested_rmw_implementation "@RMW_IMPLEMENTATION@") + set(requested_rmw_implementation_from "the default when @PROJECT_NAME@ was built") endif() -endif() -if(NOT "$ENV{RMW_IMPLEMENTATION}" STREQUAL "") - set(requested_rmw_implementation $ENV{RMW_IMPLEMENTATION}) - if(@RMW_IMPLEMENTATION_SUPPORTS_POCO@) - if(NOT requested_rmw_implementation IN_LIST available_rmw_implementations) - message(FATAL_ERROR - "The RMW implementation has been specified as " - "'${requested_rmw_implementation}' through the environment variable " - "'RMW_IMPLEMENTATION', " - "however it is not in the list of supported rmw implementations, " - "which was specified when the 'rmw_implementation' package was built.") - endif() - else() - if(NOT requested_rmw_implementation STREQUAL default_rmw_implementation) - message(FATAL_ERROR - "The RMW implementation has been specified as " - "'${requested_rmw_implementation}' " - "through the environment variable 'RMW_IMPLEMENTATION', " - "however this needs to match the RMW implementation " - "'${default_rmw_implementation}', " - "which was specified when the 'rmw_implementation' package was built.") - endif() + get_available_rmw_implementations(available_rmw_implementations) + + if(NOT requested_rmw_implementation IN_LIST available_rmw_implementations) + message(FATAL_ERROR + "The RMW implementation has been specified as " + "'${requested_rmw_implementation}' via ${requested_rmw_implementation_from}, " + "however it is not in the list of supported rmw implementations, " + "'${available_rmw_implementations}'") endif() -endif() -if(@RMW_IMPLEMENTATION_SUPPORTS_POCO@) set(selected_rmw_implementation "@PROJECT_NAME@") # no need to find_package @PROJECT_NAME@ # since this code is already part of a find_package call of that package -else() - set(selected_rmw_implementation "${default_rmw_implementation}") - message(STATUS "Using RMW implementation '${selected_rmw_implementation}' as default") - find_package("${selected_rmw_implementation}" REQUIRED) - - # TODO should never need definitions and include dirs? - list(APPEND rmw_implementation_DEFINITIONS ${${selected_rmw_implementation}_DEFINITIONS}) - list(APPEND rmw_implementation_INCLUDE_DIRS ${${selected_rmw_implementation}_INCLUDE_DIRS}) - list(APPEND rmw_implementation_LIBRARIES ${${selected_rmw_implementation}_LIBRARIES}) -endif() -find_package(Threads REQUIRED) -list(APPEND rmw_implementation_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}") + find_package(Threads REQUIRED) + list(APPEND rmw_implementation_LIBRARIES "${CMAKE_THREAD_LIBS_INIT}") +endif() \ No newline at end of file