diff --git a/makepanda/makewheel.py b/makepanda/makewheel.py index d53a51bc44..3e2cc0c06f 100644 --- a/makepanda/makewheel.py +++ b/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])