From efc0800fa3a96681e4d37b35a7de3f266891f396 Mon Sep 17 00:00:00 2001 From: Guillaume Paran Date: Thu, 21 Jan 2021 10:33:23 +0100 Subject: [PATCH 1/5] [CMake] Simplify RPATH management --- CMake/SofaPython3Tools.cmake | 75 ++++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 24 deletions(-) diff --git a/CMake/SofaPython3Tools.cmake b/CMake/SofaPython3Tools.cmake index 257b8dd9..355824d8 100644 --- a/CMake/SofaPython3Tools.cmake +++ b/CMake/SofaPython3Tools.cmake @@ -189,6 +189,7 @@ function(SP3_add_python_module) OUTPUT_NAME ${MODULE_NAME} LIBRARY_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" ) + get_target_property(TARGET_LIBRARY_OUTPUT_DIRECTORY ${A_TARGET} LIBRARY_OUTPUT_DIRECTORY) sofa_get_target_dependencies(DEPENDS_ALL ${A_TARGET}) @@ -201,7 +202,15 @@ function(SP3_add_python_module) # We compute its path relative to this target output file # Ex: ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/site-packages/Sofa --> $ORIGIN/../Sofa # 3. Add the relative path computed in 2 to the list of RPATHS - get_target_property(${A_TARGET}_DEPENDENCIES_RPATH ${A_TARGET} "INSTALL_RPATH") + get_target_property(TARGET_DEPENDENCIES_RPATH ${A_TARGET} "INSTALL_RPATH") + message("${A_TARGET}: DEPENDENCIES_RPATH = ${TARGET_DEPENDENCIES_RPATH}") + + # Get the relative path from this binding module to the install lib directory + # For example, for lib/python3/site-packages/Sofa/Core.***.so, the relative path will be + # "../../.." + file(RELATIVE_PATH from_target_to_lib "${TARGET_LIBRARY_OUTPUT_DIRECTORY}" "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") + file(TO_CMAKE_PATH "${from_target_to_lib}" from_target_to_lib) # prettify this path + foreach(DEPENDENCY ${DEPENDS_ALL}) if(NOT TARGET ${DEPENDENCY}) continue() @@ -211,24 +220,45 @@ function(SP3_add_python_module) set(DEPENDENCY ${aliased_dep}) endif() get_target_property(DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY "${DEPENDENCY}" LIBRARY_OUTPUT_DIRECTORY) - if (DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY) - file(RELATIVE_PATH dependency_path_from_packages "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}" "${DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY}") - if (NOT "${dependency_path_from_packages}" STREQUAL "" AND NOT "${dependency_path_from_packages}" STREQUAL "../") - list(APPEND ${A_TARGET}_DEPENDENCIES_RPATH "$ORIGIN/../${dependency_path_from_packages}") - list(APPEND ${A_TARGET}_DEPENDENCIES_RPATH "$$ORIGIN/../${dependency_path_from_packages}") - list(APPEND ${A_TARGET}_DEPENDENCIES_RPATH "@loader_path/../${dependency_path_from_packages}") - list(APPEND ${A_TARGET}_DEPENDENCIES_RPATH "@executable_path/../${dependency_path_from_packages}") + if(DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY) + file(RELATIVE_PATH from_sitepackages_to_lib "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}" "${DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY}") + file(TO_CMAKE_PATH "${from_sitepackages_to_lib}" from_sitepackages_to_lib) # prettify this path + + message("${A_TARGET}: CMAKE_LIBRARY_OUTPUT_DIRECTORY/SP3_PYTHON_PACKAGES_DIRECTORY = ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}") + message("${A_TARGET}: DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY = ${DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY}") + message("${A_TARGET}: from_sitepackages_to_lib = ${from_sitepackages_to_lib}") + + if (NOT "${from_sitepackages_to_lib}" STREQUAL "" AND NOT "${from_sitepackages_to_lib}" STREQUAL "../") + # RPATH needed to find libs in /lib + list(APPEND TARGET_DEPENDENCIES_RPATH + "$ORIGIN/../${from_sitepackages_to_lib}" + "$$ORIGIN/../${from_sitepackages_to_lib}" + "@loader_path/../${from_sitepackages_to_lib}" + "@executable_path/../${from_sitepackages_to_lib}" + ) endif() endif() endforeach() + message("${A_TARGET}: DEPENDENCIES_RPATH = ${TARGET_DEPENDENCIES_RPATH}") + + # RPATH needed to find libs in /lib + list(APPEND TARGET_DEPENDENCIES_RPATH + "$ORIGIN/${from_target_to_lib}/../../../${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" + "$$ORIGIN/${from_target_to_lib}/../../../${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" + "@loader_path/${from_target_to_lib}/../../../${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" + "@executable_path/${from_target_to_lib}/../../../${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" + ) + message("${A_TARGET}: DEPENDENCIES_RPATH = ${TARGET_DEPENDENCIES_RPATH}") if (APPLE) # In MacOS, the target dependency name is RPATH/site-packages/PackageName, so we need to add # an RPATH to the directory that contains "site-packages" - list(APPEND ${A_TARGET}_DEPENDENCIES_RPATH "$ORIGIN/../..") - list(APPEND ${A_TARGET}_DEPENDENCIES_RPATH "$$ORIGIN/../..") - list(APPEND ${A_TARGET}_DEPENDENCIES_RPATH "@loader_path/../..") - list(APPEND ${A_TARGET}_DEPENDENCIES_RPATH "@executable_path/../..") + list(APPEND TARGET_DEPENDENCIES_RPATH + "$ORIGIN/../.." + "$$ORIGIN/../.." + "@loader_path/../.." + "@executable_path/../.." + ) endif() # Compute the installation RPATHs from the target's SOFA relocatable dependencies @@ -245,25 +275,22 @@ function(SP3_add_python_module) endif() get_target_property(DEPENDENCY_RELOCATABLE_INSTALL_DIR "${DEPENDENCY}" RELOCATABLE_INSTALL_DIR) if (DEPENDENCY_RELOCATABLE_INSTALL_DIR) - # Get the relative path from this binding module to the install lib directory - # For example, for lib/python3/site-packages/Sofa/Core.***.so, the relative path will be - # "../../.." - file(RELATIVE_PATH relative_towards_plugins_dir "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}/${DESTINATION}" "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") # Here, we assume that the SP3 plugin will be installed in the SOFA plugins directory (i.e. $SOFA_ROOT/plugins) # Hence, we need to compute the relative path from this plugins directory to the current binding # modules, for example, plugins/SofaPython3/lib/python3/site-packages/Sofa/Core.***.so # will become "../../../../../.." (three levels upper than the previous computed relative path) - set(relative_towards_plugins_dir "${relative_towards_plugins_dir}../../..") - + # Alright, now we have the path from the current target towards the "plugins" relocatable directory of SOFA # We can compute the relative path from the current target towards the dependency relocatable path. - set(relative_towards_dependency_dir "${relative_towards_plugins_dir}/${DEPENDENCY_RELOCATABLE_INSTALL_DIR}") - list(APPEND ${A_TARGET}_DEPENDENCIES_RPATH "$ORIGIN/${relative_towards_dependency_dir}/lib") - list(APPEND ${A_TARGET}_DEPENDENCIES_RPATH "$$ORIGIN/${relative_towards_dependency_dir}/lib") - list(APPEND ${A_TARGET}_DEPENDENCIES_RPATH "@loader_path/${relative_towards_dependency_dir}/lib") - list(APPEND ${A_TARGET}_DEPENDENCIES_RPATH "@executable_path/${relative_towards_dependency_dir}/lib") + list(APPEND TARGET_DEPENDENCIES_RPATH + "$ORIGIN/${from_target_to_lib}/../../../${DEPENDENCY_RELOCATABLE_INSTALL_DIR}/lib" + "$$ORIGIN/${from_target_to_lib}/../../../${DEPENDENCY_RELOCATABLE_INSTALL_DIR}/lib" + "@loader_path/${from_target_to_lib}/../../../${DEPENDENCY_RELOCATABLE_INSTALL_DIR}/lib" + "@executable_path/${from_target_to_lib}/../../../${DEPENDENCY_RELOCATABLE_INSTALL_DIR}/lib" + ) endif() endforeach() + message("${A_TARGET}: DEPENDENCIES_RPATH = ${TARGET_DEPENDENCIES_RPATH}") set_target_properties( ${A_TARGET} @@ -274,7 +301,7 @@ function(SP3_add_python_module) INSTALL_RPATH_USE_LINK_PATH TRUE # This will set the remaining RPATHs from our Bindings targets dependencies (install/lib/site-packages/*) - INSTALL_RPATH "${${A_TARGET}_DEPENDENCIES_RPATH}" + INSTALL_RPATH "${TARGET_DEPENDENCIES_RPATH}" # Don't use the installation RPATH for built files BUILD_WITH_INSTALL_RPATH FALSE From e6b3785219cbcd8f5033cbcbdf237cfe5b0ba148 Mon Sep 17 00:00:00 2001 From: Guillaume Paran Date: Thu, 21 Jan 2021 10:45:32 +0100 Subject: [PATCH 2/5] [CMake] Simplify RPATH management (2) --- CMake/SofaPython3Tools.cmake | 72 ++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 32 deletions(-) diff --git a/CMake/SofaPython3Tools.cmake b/CMake/SofaPython3Tools.cmake index 355824d8..54d7ba52 100644 --- a/CMake/SofaPython3Tools.cmake +++ b/CMake/SofaPython3Tools.cmake @@ -211,42 +211,50 @@ function(SP3_add_python_module) file(RELATIVE_PATH from_target_to_lib "${TARGET_LIBRARY_OUTPUT_DIRECTORY}" "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") file(TO_CMAKE_PATH "${from_target_to_lib}" from_target_to_lib) # prettify this path - foreach(DEPENDENCY ${DEPENDS_ALL}) - if(NOT TARGET ${DEPENDENCY}) - continue() - endif() - get_target_property(aliased_dep ${DEPENDENCY} ALIASED_TARGET) - if(aliased_dep) - set(DEPENDENCY ${aliased_dep}) - endif() - get_target_property(DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY "${DEPENDENCY}" LIBRARY_OUTPUT_DIRECTORY) - if(DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY) - file(RELATIVE_PATH from_sitepackages_to_lib "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}" "${DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY}") - file(TO_CMAKE_PATH "${from_sitepackages_to_lib}" from_sitepackages_to_lib) # prettify this path - - message("${A_TARGET}: CMAKE_LIBRARY_OUTPUT_DIRECTORY/SP3_PYTHON_PACKAGES_DIRECTORY = ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}") - message("${A_TARGET}: DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY = ${DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY}") - message("${A_TARGET}: from_sitepackages_to_lib = ${from_sitepackages_to_lib}") - - if (NOT "${from_sitepackages_to_lib}" STREQUAL "" AND NOT "${from_sitepackages_to_lib}" STREQUAL "../") - # RPATH needed to find libs in /lib - list(APPEND TARGET_DEPENDENCIES_RPATH - "$ORIGIN/../${from_sitepackages_to_lib}" - "$$ORIGIN/../${from_sitepackages_to_lib}" - "@loader_path/../${from_sitepackages_to_lib}" - "@executable_path/../${from_sitepackages_to_lib}" - ) - endif() - endif() - endforeach() + #foreach(DEPENDENCY ${DEPENDS_ALL}) + # if(NOT TARGET ${DEPENDENCY}) + # continue() + # endif() + # get_target_property(aliased_dep ${DEPENDENCY} ALIASED_TARGET) + # if(aliased_dep) + # set(DEPENDENCY ${aliased_dep}) + # endif() + # get_target_property(DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY "${DEPENDENCY}" LIBRARY_OUTPUT_DIRECTORY) + # if(DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY) + # file(RELATIVE_PATH from_sitepackages_to_lib "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}" "${DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY}") + # file(TO_CMAKE_PATH "${from_sitepackages_to_lib}" from_sitepackages_to_lib) # prettify this path + # + # message("${A_TARGET}: CMAKE_LIBRARY_OUTPUT_DIRECTORY/SP3_PYTHON_PACKAGES_DIRECTORY = ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}") + # message("${A_TARGET}: DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY = ${DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY}") + # message("${A_TARGET}: from_sitepackages_to_lib = ${from_sitepackages_to_lib}") + # + # if (NOT "${from_sitepackages_to_lib}" STREQUAL "" AND NOT "${from_sitepackages_to_lib}" STREQUAL "../") + # # RPATH needed to find libs in /lib + # list(APPEND TARGET_DEPENDENCIES_RPATH + # "$ORIGIN/../${from_sitepackages_to_lib}" + # "$$ORIGIN/../${from_sitepackages_to_lib}" + # "@loader_path/../${from_sitepackages_to_lib}" + # "@executable_path/../${from_sitepackages_to_lib}" + # ) + # endif() + # endif() + #endforeach() + + # RPATH needed to find libs in /lib + list(APPEND TARGET_DEPENDENCIES_RPATH + "$ORIGIN/${from_target_to_lib}" + "$$ORIGIN/${from_target_to_lib}" + "@loader_path/${from_target_to_lib}" + "@executable_path/${from_target_to_lib}" + ) message("${A_TARGET}: DEPENDENCIES_RPATH = ${TARGET_DEPENDENCIES_RPATH}") # RPATH needed to find libs in /lib list(APPEND TARGET_DEPENDENCIES_RPATH - "$ORIGIN/${from_target_to_lib}/../../../${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" - "$$ORIGIN/${from_target_to_lib}/../../../${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" - "@loader_path/${from_target_to_lib}/../../../${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" - "@executable_path/${from_target_to_lib}/../../../${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" + "$ORIGIN/${from_target_to_lib}/../../../${LIBRARY_OUTPUT_DIRECTORY}" + "$$ORIGIN/${from_target_to_lib}/../../../${LIBRARY_OUTPUT_DIRECTORY}" + "@loader_path/${from_target_to_lib}/../../../${LIBRARY_OUTPUT_DIRECTORY}" + "@executable_path/${from_target_to_lib}/../../../${LIBRARY_OUTPUT_DIRECTORY}" ) message("${A_TARGET}: DEPENDENCIES_RPATH = ${TARGET_DEPENDENCIES_RPATH}") From 59d16fd33341d0e2243829883c75b7c5914fe3c4 Mon Sep 17 00:00:00 2001 From: Guillaume Paran Date: Thu, 21 Jan 2021 12:01:59 +0100 Subject: [PATCH 3/5] [CMake] Simplify RPATH management (3) --- CMake/SofaPython3Tools.cmake | 57 ++++++++---------------------------- 1 file changed, 13 insertions(+), 44 deletions(-) diff --git a/CMake/SofaPython3Tools.cmake b/CMake/SofaPython3Tools.cmake index 54d7ba52..85acb77e 100644 --- a/CMake/SofaPython3Tools.cmake +++ b/CMake/SofaPython3Tools.cmake @@ -203,60 +203,28 @@ function(SP3_add_python_module) # Ex: ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/site-packages/Sofa --> $ORIGIN/../Sofa # 3. Add the relative path computed in 2 to the list of RPATHS get_target_property(TARGET_DEPENDENCIES_RPATH ${A_TARGET} "INSTALL_RPATH") - message("${A_TARGET}: DEPENDENCIES_RPATH = ${TARGET_DEPENDENCIES_RPATH}") - + # Get the relative path from this binding module to the install lib directory # For example, for lib/python3/site-packages/Sofa/Core.***.so, the relative path will be # "../../.." file(RELATIVE_PATH from_target_to_lib "${TARGET_LIBRARY_OUTPUT_DIRECTORY}" "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") file(TO_CMAKE_PATH "${from_target_to_lib}" from_target_to_lib) # prettify this path - - #foreach(DEPENDENCY ${DEPENDS_ALL}) - # if(NOT TARGET ${DEPENDENCY}) - # continue() - # endif() - # get_target_property(aliased_dep ${DEPENDENCY} ALIASED_TARGET) - # if(aliased_dep) - # set(DEPENDENCY ${aliased_dep}) - # endif() - # get_target_property(DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY "${DEPENDENCY}" LIBRARY_OUTPUT_DIRECTORY) - # if(DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY) - # file(RELATIVE_PATH from_sitepackages_to_lib "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}" "${DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY}") - # file(TO_CMAKE_PATH "${from_sitepackages_to_lib}" from_sitepackages_to_lib) # prettify this path - # - # message("${A_TARGET}: CMAKE_LIBRARY_OUTPUT_DIRECTORY/SP3_PYTHON_PACKAGES_DIRECTORY = ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${SP3_PYTHON_PACKAGES_DIRECTORY}") - # message("${A_TARGET}: DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY = ${DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY}") - # message("${A_TARGET}: from_sitepackages_to_lib = ${from_sitepackages_to_lib}") - # - # if (NOT "${from_sitepackages_to_lib}" STREQUAL "" AND NOT "${from_sitepackages_to_lib}" STREQUAL "../") - # # RPATH needed to find libs in /lib - # list(APPEND TARGET_DEPENDENCIES_RPATH - # "$ORIGIN/../${from_sitepackages_to_lib}" - # "$$ORIGIN/../${from_sitepackages_to_lib}" - # "@loader_path/../${from_sitepackages_to_lib}" - # "@executable_path/../${from_sitepackages_to_lib}" - # ) - # endif() - # endif() - #endforeach() - + # RPATH needed to find libs in /lib - list(APPEND TARGET_DEPENDENCIES_RPATH - "$ORIGIN/${from_target_to_lib}" - "$$ORIGIN/${from_target_to_lib}" - "@loader_path/${from_target_to_lib}" - "@executable_path/${from_target_to_lib}" + list(APPEND TARGET_DEPENDENCIES_RPATH + "$ORIGIN/${from_target_to_lib}/../lib" + "$$ORIGIN/${from_target_to_lib}/../lib" + "@loader_path/${from_target_to_lib}/../lib" + "@executable_path/${from_target_to_lib}/../lib" ) - message("${A_TARGET}: DEPENDENCIES_RPATH = ${TARGET_DEPENDENCIES_RPATH}") # RPATH needed to find libs in /lib - list(APPEND TARGET_DEPENDENCIES_RPATH - "$ORIGIN/${from_target_to_lib}/../../../${LIBRARY_OUTPUT_DIRECTORY}" - "$$ORIGIN/${from_target_to_lib}/../../../${LIBRARY_OUTPUT_DIRECTORY}" - "@loader_path/${from_target_to_lib}/../../../${LIBRARY_OUTPUT_DIRECTORY}" - "@executable_path/${from_target_to_lib}/../../../${LIBRARY_OUTPUT_DIRECTORY}" + list(APPEND TARGET_DEPENDENCIES_RPATH + "$ORIGIN/${from_target_to_lib}/../../../lib" + "$$ORIGIN/${from_target_to_lib}/../../../lib" + "@loader_path/${from_target_to_lib}/../../../lib" + "@executable_path/${from_target_to_lib}/../../../lib" ) - message("${A_TARGET}: DEPENDENCIES_RPATH = ${TARGET_DEPENDENCIES_RPATH}") if (APPLE) # In MacOS, the target dependency name is RPATH/site-packages/PackageName, so we need to add @@ -298,6 +266,7 @@ function(SP3_add_python_module) ) endif() endforeach() + message("${A_TARGET}: DEPENDENCIES_RPATH = ${TARGET_DEPENDENCIES_RPATH}") set_target_properties( From adc62290ffab5b9320aabd22707205d4f29263d7 Mon Sep 17 00:00:00 2001 From: Guillaume Paran Date: Thu, 21 Jan 2021 16:31:12 +0100 Subject: [PATCH 4/5] [CMake] Handle dep. to other python modules in RPATH --- CMake/SofaPython3Tools.cmake | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/CMake/SofaPython3Tools.cmake b/CMake/SofaPython3Tools.cmake index 85acb77e..6cae4de2 100644 --- a/CMake/SofaPython3Tools.cmake +++ b/CMake/SofaPython3Tools.cmake @@ -210,7 +210,7 @@ function(SP3_add_python_module) file(RELATIVE_PATH from_target_to_lib "${TARGET_LIBRARY_OUTPUT_DIRECTORY}" "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}") file(TO_CMAKE_PATH "${from_target_to_lib}" from_target_to_lib) # prettify this path - # RPATH needed to find libs in /lib + # RPATH needed to find dependencies in /lib list(APPEND TARGET_DEPENDENCIES_RPATH "$ORIGIN/${from_target_to_lib}/../lib" "$$ORIGIN/${from_target_to_lib}/../lib" @@ -218,7 +218,7 @@ function(SP3_add_python_module) "@executable_path/${from_target_to_lib}/../lib" ) - # RPATH needed to find libs in /lib + # RPATH needed to find dependencies in /lib list(APPEND TARGET_DEPENDENCIES_RPATH "$ORIGIN/${from_target_to_lib}/../../../lib" "$$ORIGIN/${from_target_to_lib}/../../../lib" @@ -237,6 +237,35 @@ function(SP3_add_python_module) ) endif() + # RPATH needed to find dependencies in /lib/python3/site-packages + foreach(DEPENDENCY ${DEPENDS_ALL}) + if(NOT TARGET ${DEPENDENCY}) + continue() + endif() + get_target_property(aliased_dep ${DEPENDENCY} ALIASED_TARGET) + if(aliased_dep) + set(DEPENDENCY ${aliased_dep}) + endif() + get_target_property(DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY "${DEPENDENCY}" LIBRARY_OUTPUT_DIRECTORY) + # if dependency is also a python module + if(DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY MATCHES ".*${SP3_PYTHON_PACKAGES_DIRECTORY}.*") + file(RELATIVE_PATH from_target_to_dependency "${TARGET_LIBRARY_OUTPUT_DIRECTORY}" "${DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY}") + file(TO_CMAKE_PATH "${from_target_to_dependency}" from_target_to_dependency) # prettify this path + + if(from_target_to_dependency) + if(NOT "@loader_path/${from_target_to_dependency}" IN_LIST TARGET_DEPENDENCIES_RPATH) + # RPATH needed to find libs in /lib + list(APPEND TARGET_DEPENDENCIES_RPATH + "$ORIGIN/${from_target_to_dependency}" + "$$ORIGIN/${from_target_to_dependency}" + "@loader_path/${from_target_to_dependency}" + "@executable_path/${from_target_to_dependency}" + ) + endif() + endif() + endif() + endforeach() + # Compute the installation RPATHs from the target's SOFA relocatable dependencies # 1. First, compute the relative path from the current target towards the "plugins" relocatable directory of SOFA # 2. Append to the previous computed path the RELOCATABLE_INSTALL_DIR target property of the dependency since the From 5d7c59eaccad6441362c8c384f50fe2f53298aaf Mon Sep 17 00:00:00 2001 From: Guillaume Paran Date: Thu, 21 Jan 2021 16:44:21 +0100 Subject: [PATCH 5/5] [CMake] CLEAN SofaPython3Tools.cmake --- CMake/SofaPython3Tools.cmake | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/CMake/SofaPython3Tools.cmake b/CMake/SofaPython3Tools.cmake index 6cae4de2..75ea3592 100644 --- a/CMake/SofaPython3Tools.cmake +++ b/CMake/SofaPython3Tools.cmake @@ -217,7 +217,7 @@ function(SP3_add_python_module) "@loader_path/${from_target_to_lib}/../lib" "@executable_path/${from_target_to_lib}/../lib" ) - + # RPATH needed to find dependencies in /lib list(APPEND TARGET_DEPENDENCIES_RPATH "$ORIGIN/${from_target_to_lib}/../../../lib" @@ -229,7 +229,7 @@ function(SP3_add_python_module) if (APPLE) # In MacOS, the target dependency name is RPATH/site-packages/PackageName, so we need to add # an RPATH to the directory that contains "site-packages" - list(APPEND TARGET_DEPENDENCIES_RPATH + list(APPEND TARGET_DEPENDENCIES_RPATH "$ORIGIN/../.." "$$ORIGIN/../.." "@loader_path/../.." @@ -251,11 +251,10 @@ function(SP3_add_python_module) if(DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY MATCHES ".*${SP3_PYTHON_PACKAGES_DIRECTORY}.*") file(RELATIVE_PATH from_target_to_dependency "${TARGET_LIBRARY_OUTPUT_DIRECTORY}" "${DEPENDENCY_LIBRARY_OUTPUT_DIRECTORY}") file(TO_CMAKE_PATH "${from_target_to_dependency}" from_target_to_dependency) # prettify this path - + if(from_target_to_dependency) if(NOT "@loader_path/${from_target_to_dependency}" IN_LIST TARGET_DEPENDENCIES_RPATH) - # RPATH needed to find libs in /lib - list(APPEND TARGET_DEPENDENCIES_RPATH + list(APPEND TARGET_DEPENDENCIES_RPATH "$ORIGIN/${from_target_to_dependency}" "$$ORIGIN/${from_target_to_dependency}" "@loader_path/${from_target_to_dependency}" @@ -284,10 +283,10 @@ function(SP3_add_python_module) # Hence, we need to compute the relative path from this plugins directory to the current binding # modules, for example, plugins/SofaPython3/lib/python3/site-packages/Sofa/Core.***.so # will become "../../../../../.." (three levels upper than the previous computed relative path) - + # Alright, now we have the path from the current target towards the "plugins" relocatable directory of SOFA # We can compute the relative path from the current target towards the dependency relocatable path. - list(APPEND TARGET_DEPENDENCIES_RPATH + list(APPEND TARGET_DEPENDENCIES_RPATH "$ORIGIN/${from_target_to_lib}/../../../${DEPENDENCY_RELOCATABLE_INSTALL_DIR}/lib" "$$ORIGIN/${from_target_to_lib}/../../../${DEPENDENCY_RELOCATABLE_INSTALL_DIR}/lib" "@loader_path/${from_target_to_lib}/../../../${DEPENDENCY_RELOCATABLE_INSTALL_DIR}/lib" @@ -297,7 +296,7 @@ function(SP3_add_python_module) endforeach() message("${A_TARGET}: DEPENDENCIES_RPATH = ${TARGET_DEPENDENCIES_RPATH}") - + set_target_properties( ${A_TARGET} PROPERTIES