Browse Source

makewheel: fix picking up libssl/libcrypto for _hashlib on macOS

rdb 7 years ago
parent
commit
e12ff1140b
1 changed files with 25 additions and 13 deletions
  1. 25 13
      makepanda/makewheel.py

+ 25 - 13
makepanda/makewheel.py

@@ -343,20 +343,12 @@ class WheelFile(object):
         if ext in ('.so', '.dylib') or '.so.' in os.path.basename(source_path) or \
             (not ext and is_executable(source_path)):
 
-            # Scan and add Unix dependencies.
+            # Scan Unix dependencies.
             if target_path not in IGNORE_UNIX_DEPS_OF:
                 deps = scan_dependencies(source_path)
             else:
                 deps = []
 
-            for dep in deps:
-                # Only include dependencies with relative path.  Otherwise we
-                # end up overwriting system files like /lib/ld-linux.so.2!
-                # Yes, it happened to me.
-                if '/' not in dep:
-                    target_dep = os.path.dirname(target_path) + '/' + dep
-                    self.consider_add_dependency(target_dep, dep)
-
             suffix = ''
             if '.so' in os.path.basename(source_path):
                 suffix = '.so'
@@ -382,7 +374,7 @@ class WheelFile(object):
             os.fchmod(temp.fileno(), os.fstat(temp.fileno()).st_mode | 0o111)
             temp.close()
 
-            # Fix things like @loader_path/../lib references
+            # Now add dependencies.  On macOS, fix @loader_path references.
             if sys.platform == "darwin":
                 if source_path.endswith('deploy-stubw'):
                     deps_path = '@executable_path/../Frameworks'
@@ -394,10 +386,8 @@ class WheelFile(object):
                         # If this references the Python framework, change it
                         # to reference libpython instead.
                         new_dep = deps_path + '/libpython{0}.{1}.dylib'.format(*sys.version_info)
-                    else:
-                        if '@loader_path' not in dep:
-                            continue
 
+                    elif '@loader_path' in dep:
                         dep_path = dep.replace('@loader_path', '.')
                         target_dep = os.path.dirname(target_path) + '/' + os.path.basename(dep)
                         target_dep = self.consider_add_dependency(target_dep, dep_path, loader_path)
@@ -406,8 +396,30 @@ class WheelFile(object):
                             continue
                         new_dep = os.path.join(deps_path, os.path.relpath(target_dep, os.path.dirname(target_path)))
 
+                    elif dep.startswith('/Library/Frameworks/Python.framework/'):
+                        # Add this dependency if it's in the Python directory.
+                        target_dep = os.path.dirname(target_path) + '/' + os.path.basename(dep)
+                        target_dep = self.consider_add_dependency(target_dep, dep, loader_path)
+                        if not target_dep:
+                            # It won't be included, so no use adjusting the path.
+                            continue
+                        new_dep = os.path.join(deps_path, os.path.relpath(target_dep, os.path.dirname(target_path)))
+
+                    else:
+                        if '/' in dep:
+                            if GetVerbose():
+                                print("Ignoring dependency %s" % (dep))
+                        continue
+
                     subprocess.call(["install_name_tool", "-change", dep, new_dep, temp.name])
             else:
+                # On other unixes, we just add dependencies normally.
+                for dep in deps:
+                    # Only include dependencies with relative path, for now.
+                    if '/' not in dep:
+                        target_dep = os.path.dirname(target_path) + '/' + dep
+                        self.consider_add_dependency(target_dep, dep)
+
                 subprocess.call(["strip", "-s", temp.name])
                 subprocess.call(["patchelf", "--set-rpath", "$ORIGIN", temp.name])