servo: Merge #11911 - Fix dylib relinking issue (from cbrewster:app_packaging); r=larsbergstrom

<!-- Please describe your changes on the following line: -->
I had to run `install_name_tool` on some dylibs for their deps and not just on the servo binary itself. I have checked and Servo.app runs on machines without extra things installed (ex. harfbuzz).

---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #11907 (github issue number if applicable).

<!-- Either: -->
- [ ] There are tests for these changes OR
- [X] These changes do not require tests because fixing mac packaging.

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->

Source-Repo: https://github.com/servo/servo
Source-Revision: f6db3518ca9d81ea8fd938586252e690755d7445
This commit is contained in:
Connor Brewster 2016-06-28 20:05:12 -05:00
Родитель c399260cd8
Коммит b75d41f744
1 изменённых файлов: 25 добавлений и 18 удалений

Просмотреть файл

@ -43,7 +43,10 @@ def otool(s):
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
@ -108,23 +111,27 @@ class PackageCommands(CommandBase):
shutil.copy2(dir_to_resources + 'package-prefs.json', dir_to_resources + 'prefs.json')
delete(dir_to_resources + '/package-prefs.json')
print("Finding dylibs to be copied")
need = set([dir_to_app + '/Contents/MacOS/servo'])
done = set()
while need:
needed = set(need)
need = set()
for f in needed:
need.update(otool(f))
done.update(needed)
need.difference_update(done)
print("Copying dylibs")
for f in sorted(done):
if '/System/Library' not in f and '/usr/lib' not in f and 'servo' not in f:
shutil.copyfile(f, dir_to_app + '/Contents/MacOS/' + f.split('/')[-1])
install_name_tool(f, f.split('/')[-1], dir_to_app + '/Contents/MacOS/servo')
print("Finding dylibs and relinking")
need_checked = set([dir_to_app + '/Contents/MacOS/servo'])
checked = set()
while need_checked:
checking = set(need_checked)
need_checked = set()
for f in checking:
# No need to check these for their dylibs
if '/System/Library' in f or '/usr/lib' in f:
continue
need_relinked = set(otool(f))
new_path = dir_to_app + '/Contents/MacOS/' + f.split('/')[-1]
if not os.path.exists(new_path):
shutil.copyfile(f, new_path)
for dylib in need_relinked:
if '/System/Library' in dylib or '/usr/lib' in dylib or 'servo' in dylib:
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")
bhtml_path = path.join('${0%/*}/../Resources', browserhtml_path.split('/')[-1], 'out', 'index.html')