diff --git a/fix-rpaths.py b/fix-rpaths.py index f3731bf..584cc2a 100644 --- a/fix-rpaths.py +++ b/fix-rpaths.py @@ -9,13 +9,21 @@ dry_run = '--dry' in sys.argv app_binary = join(app_bundle, 'Contents/MacOS', basename(app_bundle).split(".")[0]) app_frameworks = join(app_bundle, 'Contents/Frameworks') -binaries = [app_binary] + [join(app_frameworks, library) for library in os.listdir(app_frameworks)] +binaries_unfiltered = [app_binary] + [join(app_frameworks, library) for library in os.listdir(app_frameworks)] +binaries = [] +# Extend .framework paths to the actual binary +for binary in binaries_unfiltered: + if binary.endswith('.framework'): + binaries.append(join(binary, 'Versions/A/' + basename(binary).split(".")[0])) + else: + binaries.append(binary) dependency_map = {binary:subprocess.check_output(["otool", "-L", binary], text=True).splitlines()[1:] for binary in binaries} for binary, dependencies in dependency_map.items(): print(binary) + is_framework = '.framework' in binary if binary == app_binary: print('\tAdding rpath: @loader_path/../Frameworks') if not dry_run: @@ -25,6 +33,10 @@ for binary, dependencies in dependency_map.items(): dep = dependency[0:end_index].strip() dep_short_name = dep[dep.rfind('/')+1:] + if '.framework' in dep: + index = dep.find('.framework') + dep_short_name = dep[dep.rfind('/', 0, index)+1:] + if dep == binary: continue for key in dependency_map: @@ -34,7 +46,10 @@ for binary, dependencies in dependency_map.items(): if not dry_run: print('\t' + subprocess.check_output(['install_name_tool', '-change', dep, f'@rpath/{dep_short_name}', binary], text=True)) else: - print(f'\t{dep} -> @loader_path/{dep_short_name}') + new_path = f'@loader_path/{dep_short_name}' + if is_framework: + new_path = f'@loader_path/../../../{dep_short_name}' + print(f'\t{dep} -> {new_path}') if not dry_run: - print('\t' + subprocess.check_output(['install_name_tool', '-change', dep, f'@loader_path/{dep_short_name}', binary], text=True)) + print('\t' + subprocess.check_output(['install_name_tool', '-change', dep, new_path, binary], text=True)) break \ No newline at end of file