diff --git a/rcl/CMakeLists.txt b/rcl/CMakeLists.txt index cee1035e82..e1b7172ad7 100644 --- a/rcl/CMakeLists.txt +++ b/rcl/CMakeLists.txt @@ -12,7 +12,7 @@ find_package(rosidl_generator_c REQUIRED) find_package(tinydir_vendor REQUIRED) include_directories(include) - +include(cmake/configure_rcl.cmake) include(cmake/get_default_rcl_logging_implementation.cmake) get_default_rcl_logging_implementation(RCL_LOGGING_IMPL) @@ -70,9 +70,7 @@ ament_target_dependencies(${PROJECT_NAME} "tinydir_vendor" ) -# Causes the visibility macros to use dllexport rather than dllimport, -# which is appropriate when building the dll but not consuming it. -target_compile_definitions(${PROJECT_NAME} PRIVATE "RCL_BUILDING_DLL") +configure_rcl(${PROJECT_NAME} LANGUAGE "C") install( TARGETS ${PROJECT_NAME} @@ -105,8 +103,12 @@ if(BUILD_TESTING) add_subdirectory(test) endif() -ament_package() +ament_package(CONFIG_EXTRAS "rcl-extras.cmake") +install( + DIRECTORY cmake + DESTINATION share/${PROJECT_NAME} +) install( DIRECTORY include/ DESTINATION include diff --git a/rcl/cmake/configure_rcl.cmake b/rcl/cmake/configure_rcl.cmake new file mode 100644 index 0000000000..bf0cc1c406 --- /dev/null +++ b/rcl/cmake/configure_rcl.cmake @@ -0,0 +1,73 @@ +# Copyright 2019 Open Source Robotics Foundation, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Configures ros client library with custom settings. +# The custom settings are all related to library symbol visibility, see: +# https://gcc.gnu.org/wiki/Visibility +# http://www.ibm.com/developerworks/aix/library/au-aix-symbol-visibility/ +# +# Below code is heavily referenced from a similar functionality in rmw: +# https://github.com/ros2/rmw/blob/master/rmw/cmake/configure_rmw_library.cmake +# +# :param library_target: the library target +# :type library_target: string +# :param LANGUAGE: Optional flag for the language of the library. +# Allowed values are "C" and "CXX". The default is "CXX". +# :type LANGUAGE: string +# +# @public +# +macro(configure_rcl library_target) + cmake_parse_arguments(_ARG "" "LANGUAGE" "" ${ARGN}) + if(_ARG_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "configure_rcl() called with unused arguments: ${_ARG_UNPARSED_ARGUMENTS}") + endif() + + if(NOT _ARG_LANGUAGE) + set(_ARG_LANGUAGE "CXX") + endif() + + if(_ARG_LANGUAGE STREQUAL "C") + # Set the visibility to hidden by default if possible + if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang") + # Set the visibility of symbols to hidden by default for gcc and clang + # (this is already the default on Windows) + set_target_properties(${library_target} + PROPERTIES + COMPILE_FLAGS "-fvisibility=hidden" + ) + endif() + + elseif(_ARG_LANGUAGE STREQUAL "CXX") + # Set the visibility to hidden by default if possible + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + # Set the visibility of symbols to hidden by default for gcc and clang + # (this is already the default on Windows) + set_target_properties(${library_target} + PROPERTIES + COMPILE_FLAGS "-fvisibility=hidden -fvisibility-inlines-hidden" + ) + endif() + + else() + message(FATAL_ERROR "configure_rcl() called with unsupported LANGUAGE: '${_ARG_LANGUAGE}'") + endif() + + if(WIN32) + # Causes the visibility macros to use dllexport rather than dllimport + # which is appropriate when building the dll but not consuming it. + target_compile_definitions(${library_target} + PRIVATE "RCL_BUILDING_DLL") + endif() +endmacro() diff --git a/rcl/rcl-extras.cmake b/rcl/rcl-extras.cmake new file mode 100644 index 0000000000..c6fac3d5b1 --- /dev/null +++ b/rcl/rcl-extras.cmake @@ -0,0 +1,15 @@ +# Copyright 2019 Open Source Robotics Foundation, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +include("${rcl_DIR}/configure_rcl.cmake") diff --git a/rcl_action/CMakeLists.txt b/rcl_action/CMakeLists.txt index aa2c0a3dc9..7387cd8476 100644 --- a/rcl_action/CMakeLists.txt +++ b/rcl_action/CMakeLists.txt @@ -56,6 +56,8 @@ ament_target_dependencies(${PROJECT_NAME} "rmw" "rosidl_generator_c" ) + +configure_rcl(${PROJECT_NAME} LANGUAGE "C") # Causes the visibility macros to use dllexport rather than dllimport, # which is appropriate when building the dll but not consuming it. target_compile_definitions(${PROJECT_NAME} PRIVATE "RCL_ACTION_BUILDING_DLL") diff --git a/rcl_lifecycle/CMakeLists.txt b/rcl_lifecycle/CMakeLists.txt index 1c82a501e1..3c04dcffe0 100644 --- a/rcl_lifecycle/CMakeLists.txt +++ b/rcl_lifecycle/CMakeLists.txt @@ -48,6 +48,7 @@ ament_target_dependencies(rcl_lifecycle "rcutils" ) +configure_rcl(${PROJECT_NAME} LANGUAGE "C") # Causes the visibility macros to use dllexport rather than dllimport, # which is appropriate when building the dll but not consuming it. target_compile_definitions(rcl_lifecycle PRIVATE "RCL_LIFECYCLE_BUILDING_DLL") diff --git a/rcl_yaml_param_parser/CMakeLists.txt b/rcl_yaml_param_parser/CMakeLists.txt index 0e7b863598..ca433395eb 100644 --- a/rcl_yaml_param_parser/CMakeLists.txt +++ b/rcl_yaml_param_parser/CMakeLists.txt @@ -28,6 +28,7 @@ add_library( ${rcl_yaml_parser_sources}) ament_target_dependencies(${PROJECT_NAME} "yaml" "rcutils" "rcl") +configure_rcl(${PROJECT_NAME} LANGUAGE "C") # Causes the visibility macros to use dllexport rather than dllimport, # which is appropriate when building the dll but not consuming it. target_compile_definitions(${PROJECT_NAME} PRIVATE "RCL_YAML_PARAM_PARSER_BUILDING_DLL")