49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
#!/usr/bin/env python3
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
# macOS utility to remove all `rpaths` and add a new one.
|
|
|
|
import os
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
|
|
|
|
# Strip version numbers from dependenciesm macOS notarizatiom fails
|
|
# with version symlinks.
|
|
def strip_lib_version(name):
|
|
name = re.sub(r'(\.[0-9]+)+.dylib', '.dylib', name)
|
|
name = re.sub(r'(\.[0-9]+)+.so', '.so', name)
|
|
name = re.sub(r'(\.[0-9]+)+.cpython', '.cpython', name)
|
|
return name
|
|
|
|
|
|
rpath = sys.argv[1]
|
|
file = sys.argv[2]
|
|
|
|
# Find existing rpaths and delete them one by one.
|
|
p = subprocess.run(['otool', '-l', file], capture_output=True)
|
|
tokens = p.stdout.split()
|
|
|
|
for i, token in enumerate(tokens):
|
|
if token == b'LC_RPATH':
|
|
old_rpath = tokens[i + 4]
|
|
subprocess.run(['install_name_tool', '-delete_rpath', old_rpath, file])
|
|
|
|
subprocess.run(['install_name_tool', '-add_rpath', rpath, file])
|
|
|
|
# Strip version from dependencies.
|
|
p = subprocess.run(['otool', '-L', file], capture_output=True)
|
|
tokens = p.stdout.split()
|
|
for i, token in enumerate(tokens):
|
|
token = token.decode("utf-8")
|
|
if token.startswith("@rpath"):
|
|
new_token = strip_lib_version(token)
|
|
subprocess.run(['install_name_tool', '-change', token, new_token, file])
|
|
|
|
# Strip version from library itself.
|
|
new_file = strip_lib_version(file)
|
|
new_id = '@rpath/' + os.path.basename(new_file)
|
|
os.rename(file, new_file)
|
|
subprocess.run(['install_name_tool', '-id', new_id, new_file])
|