[lldb] fix RPATH when linking against Python3.framework
authorJonas Devlieghere <jonas@devlieghere.com>
Thu, 30 Apr 2020 17:34:03 +0000 (10:34 -0700)
committerJonas Devlieghere <jonas@devlieghere.com>
Thu, 30 Apr 2020 17:42:03 +0000 (10:42 -0700)
The install name for the Python 3 framework in Xcode is relative to
the framework's location and not the dylib itself.

  @rpath/Python3.framework/Versions/3.x/Python3

This means that we need to compute the path to the Python3.framework
and use that as the RPATH instead of the usual dylib's directory.

lldb/cmake/modules/FindPythonInterpAndLibs.cmake
lldb/source/API/CMakeLists.txt
lldb/tools/lldb-test/CMakeLists.txt

index fa7a391..5ea7aab 100644 (file)
@@ -17,10 +17,27 @@ else()
         set(PYTHON_LIBRARIES ${Python3_LIBRARIES})
         set(PYTHON_INCLUDE_DIRS ${Python3_INCLUDE_DIRS})
         set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE})
+
+        # The install name for the Python 3 framework in Xcode is relative to
+        # the framework's location and not the dylib itself.
+        #
+        #   @rpath/Python3.framework/Versions/3.x/Python3
+        #
+        # This means that we need to compute the path to the Python3.framework
+        # and use that as the RPATH instead of the usual dylib's directory.
+        #
+        # The check below shouldn't match Homebrew's Python framework as it is
+        # called Python.framework instead of Python3.framework.
+        if (APPLE AND Python3_LIBRARIES MATCHES "Python3.framework")
+          string(FIND "${Python3_LIBRARIES}" "Python3.framework" python_framework_pos)
+          string(SUBSTRING "${Python3_LIBRARIES}" "0" ${python_framework_pos} PYTHON_RPATH)
+        endif()
+
         mark_as_advanced(
           PYTHON_LIBRARIES
           PYTHON_INCLUDE_DIRS
           PYTHON_EXECUTABLE
+          PYTHON_RPATH
           SWIG_EXECUTABLE)
       elseif(NOT CMAKE_SYSTEM_NAME STREQUAL Windows)
         # Use PYTHON_HOME as a hint to find Python 2.
@@ -34,6 +51,7 @@ else()
             PYTHON_LIBRARIES
             PYTHON_INCLUDE_DIRS
             PYTHON_EXECUTABLE
+            PYTHON_RPATH
             SWIG_EXECUTABLE)
         endif()
       endif()
@@ -54,6 +72,7 @@ else()
               PYTHON_LIBRARIES
               PYTHON_INCLUDE_DIRS
               PYTHON_EXECUTABLE
+              PYTHON_RPATH
               SWIG_EXECUTABLE)
           endif()
         endif()
@@ -63,6 +82,7 @@ else()
     message(STATUS "SWIG 2 or later is required for Python support in LLDB but could not be found")
   endif()
 
+
   include(FindPackageHandleStandardArgs)
   find_package_handle_standard_args(PythonInterpAndLibs
                                     FOUND_VAR
@@ -71,5 +91,6 @@ else()
                                       PYTHON_LIBRARIES
                                       PYTHON_INCLUDE_DIRS
                                       PYTHON_EXECUTABLE
+                                      PYTHON_RPATH
                                       SWIG_EXECUTABLE)
 endif()
index f8ed1b3..ae6f2e8 100644 (file)
@@ -120,6 +120,10 @@ if(LLDB_ENABLE_PYTHON AND (BUILD_SHARED_LIBS OR LLVM_LINK_LLVM_DYLIB) AND UNIX A
   set_property(TARGET liblldb APPEND PROPERTY INSTALL_RPATH "\$ORIGIN/../../../../lib${LLVM_LIBDIR_SUFFIX}")
 endif()
 
+if(PYTHON_RPATH)
+  set_property(TARGET liblldb APPEND PROPERTY INSTALL_RPATH "${PYTHON_RPATH}")
+endif()
+
 if (MSVC)
   set_source_files_properties(SBReproducer.cpp PROPERTIES COMPILE_FLAGS /bigobj)
 endif()
index f3530fd..60b4a7c 100644 (file)
@@ -24,5 +24,9 @@ add_lldb_tool(lldb-test
     Support
   )
 
+if(PYTHON_RPATH)
+  set_property(TARGET lldb-test APPEND PROPERTY INSTALL_RPATH "${PYTHON_RPATH}")
+endif()
+
 target_include_directories(lldb-test PRIVATE ${LLDB_SOURCE_DIR}/source)
 target_include_directories(lldb-test PRIVATE ${LLDB_BINARY_DIR}/source)