Skip to content

Commit

Permalink
Rework dynamic RMW
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
rotu committed Sep 5, 2019
1 parent cf709e8 commit 541815e
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 91 deletions.
45 changes: 10 additions & 35 deletions rmw_implementation/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,65 +15,42 @@ 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)
find_package(ament_lint_auto REQUIRED)
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}
"Poco"
"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})
Expand All @@ -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"
)
84 changes: 28 additions & 56 deletions rmw_implementation/rmw_implementation-extras.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -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()

0 comments on commit 541815e

Please sign in to comment.