fix dylib relinking issue for mac packaging

This commit is contained in:
Connor Brewster 2016-06-28 16:18:28 -06:00
parent 96b7a19ca0
commit 694b930891

View file

@ -43,7 +43,10 @@ def otool(s):
def install_name_tool(old, new, binary): def install_name_tool(old, new, binary):
subprocess.call(['install_name_tool', '-change', old, '@executable_path/' + new, binary]) try:
subprocess.check_call(['install_name_tool', '-change', old, '@executable_path/' + new, binary])
except subprocess.CalledProcessError as e:
print("install_name_tool exited with return value %d" % e.returncode)
@CommandProvider @CommandProvider
@ -108,23 +111,27 @@ class PackageCommands(CommandBase):
shutil.copy2(dir_to_resources + 'package-prefs.json', dir_to_resources + 'prefs.json') shutil.copy2(dir_to_resources + 'package-prefs.json', dir_to_resources + 'prefs.json')
delete(dir_to_resources + '/package-prefs.json') delete(dir_to_resources + '/package-prefs.json')
print("Finding dylibs to be copied") print("Finding dylibs and relinking")
need = set([dir_to_app + '/Contents/MacOS/servo']) need_checked = set([dir_to_app + '/Contents/MacOS/servo'])
done = set() checked = set()
while need_checked:
while need: checking = set(need_checked)
needed = set(need) need_checked = set()
need = set() for f in checking:
for f in needed: # No need to check these for their dylibs
need.update(otool(f)) if '/System/Library' in f or '/usr/lib' in f:
done.update(needed) continue
need.difference_update(done) need_relinked = set(otool(f))
new_path = dir_to_app + '/Contents/MacOS/' + f.split('/')[-1]
print("Copying dylibs") if not os.path.exists(new_path):
for f in sorted(done): shutil.copyfile(f, new_path)
if '/System/Library' not in f and '/usr/lib' not in f and 'servo' not in f: for dylib in need_relinked:
shutil.copyfile(f, dir_to_app + '/Contents/MacOS/' + f.split('/')[-1]) if '/System/Library' in dylib or '/usr/lib' in dylib or 'servo' in dylib:
install_name_tool(f, f.split('/')[-1], dir_to_app + '/Contents/MacOS/servo') continue
install_name_tool(dylib, dylib.split('/')[-1], new_path)
need_checked.update(need_relinked)
checked.update(checking)
need_checked.difference_update(checked)
print("Writing run-servo") print("Writing run-servo")
bhtml_path = path.join('${0%/*}/../Resources', browserhtml_path.split('/')[-1], 'out', 'index.html') bhtml_path = path.join('${0%/*}/../Resources', browserhtml_path.split('/')[-1], 'out', 'index.html')