From fc9714809d13b4012c0d4b4b747d3876ee6fa90e Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Mon, 16 May 2022 15:22:17 -0300 Subject: [PATCH 1/5] Don't export the generated libraries as targets anymore, as nothing should depend on them (they are meant only to be loaded as python extensions) Signed-off-by: Ivan Santiago Paunovic --- .../cmake/rosidl_generator_py_generate_interfaces.cmake | 5 ----- 1 file changed, 5 deletions(-) diff --git a/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake b/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake index e3bb6ac4..5eb1e65d 100644 --- a/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake +++ b/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake @@ -273,14 +273,9 @@ if(WIN32) endif() if(NOT rosidl_generate_interfaces_SKIP_INSTALL) install(TARGETS ${_target_name_lib} - EXPORT export_${_target_name_lib} ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin) - - # Export this target so downstream interface packages can depend on it - rosidl_export_typesupport_targets("${rosidl_generator_py_suffix}" "${_target_name_lib}") - ament_export_targets(export_${_target_name_lib}) endif() if(BUILD_TESTING AND rosidl_generate_interfaces_ADD_LINTER_TESTS) From 349bb44f090169b31b7bd034463532bcb4340062 Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Mon, 16 May 2022 16:35:08 -0300 Subject: [PATCH 2/5] Don't link against targets that are not needed Signed-off-by: Ivan Santiago Paunovic --- .../cmake/rosidl_generator_py_generate_interfaces.cmake | 5 ----- 1 file changed, 5 deletions(-) diff --git a/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake b/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake index 5eb1e65d..2ab2354a 100644 --- a/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake +++ b/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake @@ -259,11 +259,6 @@ endforeach() set(PYTHON_EXECUTABLE ${_PYTHON_EXECUTABLE}) -# Depend on rosidl_generator_py generated targets from our dependencies -foreach(_pkg_name ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES}) - target_link_libraries(${_target_name_lib} PRIVATE ${${_pkg_name}_TARGETS${rosidl_generator_py_suffix}}) -endforeach() - set_lib_properties("") if(WIN32) set_lib_properties("_DEBUG") From 58d48bb12828457309bb413b624f0dfb0c14c887 Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Mon, 16 May 2022 16:44:40 -0300 Subject: [PATCH 3/5] Only remove the 'ament_export_targets()' call, keep the other stuff as that's needed when messages depend on each other Signed-off-by: Ivan Santiago Paunovic --- .../cmake/rosidl_generator_py_generate_interfaces.cmake | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake b/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake index 2ab2354a..73144188 100644 --- a/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake +++ b/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake @@ -259,6 +259,11 @@ endforeach() set(PYTHON_EXECUTABLE ${_PYTHON_EXECUTABLE}) +# Depend on rosidl_generator_py generated targets from our dependencies +foreach(_pkg_name ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES}) + target_link_libraries(${_target_name_lib} PRIVATE ${${_pkg_name}_TARGETS${rosidl_generator_py_suffix}}) +endforeach() + set_lib_properties("") if(WIN32) set_lib_properties("_DEBUG") @@ -268,9 +273,13 @@ if(WIN32) endif() if(NOT rosidl_generate_interfaces_SKIP_INSTALL) install(TARGETS ${_target_name_lib} + EXPORT export_${_target_name_lib} ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin) + + # Export this target so downstream interface packages can depend on it + rosidl_export_typesupport_targets("${rosidl_generator_py_suffix}" "${_target_name_lib}") endif() if(BUILD_TESTING AND rosidl_generate_interfaces_ADD_LINTER_TESTS) From 69dfd510cb90bc8646d19d7eaae8ae98f8f6f438 Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Mon, 16 May 2022 17:16:35 -0300 Subject: [PATCH 4/5] Try a different approach Signed-off-by: Ivan Santiago Paunovic --- ...nerator_py_generate_interfaces-extra.cmake | 25 +++++++++++++++++++ ...idl_generator_py_generate_interfaces.cmake | 19 +++++++------- 2 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces-extra.cmake diff --git a/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces-extra.cmake b/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces-extra.cmake new file mode 100644 index 00000000..9c43a2dc --- /dev/null +++ b/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces-extra.cmake @@ -0,0 +1,25 @@ +# Copyright 2022 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. + +# This is needed as ament_export_dependencies doesn't work with cmake components. + +# Figure out Python3 debug/release before anything else can find_package it +if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug") + find_package(python_cmake_module REQUIRED) + find_package(PythonExtra REQUIRED) + + # Force FindPython3 to use the debug interpreter where ROS 2 expects it + set(Python3_EXECUTABLE "${PYTHON_EXECUTABLE_DEBUG}") +endif() +find_package(Python3 REQUIRED COMPONENTS Development NumPy) diff --git a/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake b/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake index 73144188..6fabd7ff 100644 --- a/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake +++ b/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake @@ -166,7 +166,6 @@ set(rosidl_generator_py_suffix "__rosidl_generator_py") set(_target_name_lib "${rosidl_generate_interfaces_TARGET}${rosidl_generator_py_suffix}") add_library(${_target_name_lib} SHARED ${_generated_c_files}) target_link_libraries(${_target_name_lib} - PRIVATE ${rosidl_generate_interfaces_TARGET}__rosidl_generator_c) add_dependencies( ${_target_name_lib} @@ -179,10 +178,10 @@ target_include_directories(${_target_name_lib} ${CMAKE_CURRENT_BINARY_DIR}/rosidl_generator_py ) -target_link_libraries(${_target_name_lib} PRIVATE Python3::NumPy Python3::Module) +target_link_libraries(${_target_name_lib} Python3::NumPy Python3::Module) rosidl_get_typesupport_target(c_typesupport_target "${rosidl_generate_interfaces_TARGET}" "rosidl_typesupport_c") -target_link_libraries(${_target_name_lib} PRIVATE ${c_typesupport_target}) +target_link_libraries(${_target_name_lib} ${c_typesupport_target}) foreach(_typesupport_impl ${_typesupport_impls}) find_package(${_typesupport_impl} REQUIRED) @@ -217,7 +216,6 @@ foreach(_typesupport_impl ${_typesupport_impls}) endif() target_link_libraries( ${_target_name} - PRIVATE ${_target_name_lib} ${rosidl_generate_interfaces_TARGET}__${_typesupport_impl} Python3::Module @@ -229,16 +227,15 @@ foreach(_typesupport_impl ${_typesupport_impls}) ${CMAKE_CURRENT_BINARY_DIR}/rosidl_generator_py ) - target_link_libraries(${_target_name} PRIVATE ${c_typesupport_target}) + target_link_libraries(${_target_name} ${c_typesupport_target}) ament_target_dependencies(${_target_name} - PUBLIC "rosidl_runtime_c" "rosidl_typesupport_c" "rosidl_typesupport_interface" ) foreach(_pkg_name ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES}) - ament_target_dependencies(${_target_name} PUBLIC + ament_target_dependencies(${_target_name} ${_pkg_name} ) endforeach() @@ -246,7 +243,7 @@ foreach(_typesupport_impl ${_typesupport_impls}) add_dependencies(${_target_name} ${rosidl_generate_interfaces_TARGET}__${_typesupport_impl} ) - ament_target_dependencies(${_target_name} PUBLIC + ament_target_dependencies(${_target_name} "rosidl_runtime_c" "rosidl_generator_py" ) @@ -261,7 +258,7 @@ set(PYTHON_EXECUTABLE ${_PYTHON_EXECUTABLE}) # Depend on rosidl_generator_py generated targets from our dependencies foreach(_pkg_name ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES}) - target_link_libraries(${_target_name_lib} PRIVATE ${${_pkg_name}_TARGETS${rosidl_generator_py_suffix}}) + target_link_libraries(${_target_name_lib} ${${_pkg_name}_TARGETS${rosidl_generator_py_suffix}}) endforeach() set_lib_properties("") @@ -280,6 +277,10 @@ if(NOT rosidl_generate_interfaces_SKIP_INSTALL) # Export this target so downstream interface packages can depend on it rosidl_export_typesupport_targets("${rosidl_generator_py_suffix}" "${_target_name_lib}") + ament_export_targets(export_${_target_name_lib}) + + # This is needed as ament_export_dependencies doesn't work with cmake components. + list(APPEND ${PROJECT_NAME}_CONFIG_EXTRAS ${CMAKE_CURRENT_LIST_DIR}/rosidl_generator_py_generate_interfaces-extra.cmake) endif() if(BUILD_TESTING AND rosidl_generate_interfaces_ADD_LINTER_TESTS) From 39e52ec206734335872bc5ded711685aab7cc1ea Mon Sep 17 00:00:00 2001 From: Ivan Santiago Paunovic Date: Mon, 16 May 2022 17:23:22 -0300 Subject: [PATCH 5/5] Fix windows debug support Signed-off-by: Ivan Santiago Paunovic --- ...osidl_generator_py_generate_interfaces.cmake | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake b/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake index 6fabd7ff..cfa5c50c 100644 --- a/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake +++ b/rosidl_generator_py/cmake/rosidl_generator_py_generate_interfaces.cmake @@ -18,9 +18,14 @@ find_package(rosidl_typesupport_c REQUIRED) find_package(rosidl_typesupport_interface REQUIRED) find_package(PythonInterp 3.6 REQUIRED) - find_package(python_cmake_module REQUIRED) -find_package(PythonExtra MODULE REQUIRED) +find_package(PythonExtra REQUIRED) +set(_Python3_EXECUTABLE ${Python3_EXECUTABLE}) +if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Debug") + + # Force FindPython3 to use the debug interpreter where ROS 2 expects it + set(Python3_EXECUTABLE "${PYTHON_EXECUTABLE_DEBUG}") +endif() find_package(Python3 REQUIRED COMPONENTS Development NumPy) # Get a list of typesupport implementations from valid rmw implementations. @@ -127,11 +132,6 @@ endif() set(_target_suffix "__py") -set(_PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE}) -if(WIN32 AND "${CMAKE_BUILD_TYPE}" STREQUAL "Debug") - set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE_DEBUG}) -endif() - # move custom command into a subdirectory to avoid multiple invocations on Windows set(_subdir "${CMAKE_CURRENT_BINARY_DIR}/${rosidl_generate_interfaces_TARGET}${_target_suffix}") file(MAKE_DIRECTORY "${_subdir}") @@ -254,7 +254,8 @@ foreach(_typesupport_impl ${_typesupport_impls}) endif() endforeach() -set(PYTHON_EXECUTABLE ${_PYTHON_EXECUTABLE}) +set(Python3_EXECUTABLE ${_Python3_EXECUTABLE}) +unset(_Python3_EXECUTABLE) # Depend on rosidl_generator_py generated targets from our dependencies foreach(_pkg_name ${rosidl_generate_interfaces_DEPENDENCY_PACKAGE_NAMES})