aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-08-14 15:25:25 -0500
committerGitHub <noreply@github.com>2016-08-14 15:25:25 -0500
commita2ce4aa8525c3c83388c5401016a79ffe0444c03 (patch)
treeecb2069b5b5dcb1956da57ee72941489f696df02 /python
parent41296d20b962cc95bde813b13617aba022615796 (diff)
parent79812971f17f55dcfce2d68804143ecc8b233d84 (diff)
downloadservo-a2ce4aa8525c3c83388c5401016a79ffe0444c03.tar.gz
servo-a2ce4aa8525c3c83388c5401016a79ffe0444c03.zip
Auto merge of #12688 - paulrouget:brew, r=larsbergstrom
brew package Addressed #12600 This is just a WIP PR to see if this approach is right. The same way night builds are uploaded every day, we'd like to offer a brew binary package as well. Step 1 is to package a tarball along the dmg. This is done in `package_commands.py`. Step 2 is to upload the package. Done is `update_brew.sh`. Step 3 is to update the brew Formula. [servo-bin.rb](https://github.com/paulrouget/homebrew-servo/blob/master/servo-bin.rb.in) is updated in `update_brew.sh`. Step 4 is to trigger `update_brew.sh` along `update_nightly.sh`. https://github.com/servo/saltfs/blob/master/buildbot/master/files/config/steps.yml <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/12688) <!-- Reviewable:end -->
Diffstat (limited to 'python')
-rw-r--r--python/servo/package_commands.py93
1 files changed, 71 insertions, 22 deletions
diff --git a/python/servo/package_commands.py b/python/servo/package_commands.py
index fd7520fb10b..c5f55264ad1 100644
--- a/python/servo/package_commands.py
+++ b/python/servo/package_commands.py
@@ -65,6 +65,46 @@ def install_name_tool(old, new, binary):
print("install_name_tool exited with return value %d" % e.returncode)
+def is_system_library(lib):
+ return lib.startswith("/System/Library") or lib.startswith("/usr/lib")
+
+
+def change_non_system_libraries_path(libraries, relative_path, binary):
+ for lib in libraries:
+ if is_system_library(lib):
+ continue
+ new_path = path.join(relative_path, path.basename(lib))
+ install_name_tool(lib, new_path, binary)
+
+
+def copy_dependencies(binary_path, lib_path):
+
+ relative_path = path.relpath(lib_path, path.dirname(binary_path)) + "/"
+
+ # Update binary libraries
+ binary_dependencies = set(otool(binary_path))
+ change_non_system_libraries_path(binary_dependencies, relative_path, binary_path)
+
+ # Update dependencies libraries
+ need_checked = binary_dependencies
+ 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 is_system_library(f):
+ continue
+ need_relinked = set(otool(f))
+ new_path = path.join(lib_path, path.basename(f))
+ if not path.exists(new_path):
+ shutil.copyfile(f, new_path)
+ change_non_system_libraries_path(need_relinked, relative_path, new_path)
+ need_checked.update(need_relinked)
+ checked.update(checking)
+ need_checked.difference_update(checked)
+
+
@CommandProvider
class PackageCommands(CommandBase):
@Command('package',
@@ -102,11 +142,15 @@ class PackageCommands(CommandBase):
print("Packaging Android exited with return value %d" % e.returncode)
return e.returncode
elif is_macosx():
+
dir_to_build = '/'.join(binary_path.split('/')[:-1])
+ dir_to_root = '/'.join(binary_path.split('/')[:-3])
+ now = datetime.utcnow()
+
+ print("Creating Servo.app")
dir_to_dmg = '/'.join(binary_path.split('/')[:-2]) + '/dmg'
dir_to_app = dir_to_dmg + '/Servo.app'
dir_to_resources = dir_to_app + '/Contents/Resources/'
- dir_to_root = '/'.join(binary_path.split('/')[:-3])
if path.exists(dir_to_dmg):
print("Cleaning up from previous packaging")
delete(dir_to_dmg)
@@ -128,26 +172,7 @@ class PackageCommands(CommandBase):
delete(dir_to_resources + '/package-prefs.json')
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 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)
+ copy_dependencies(dir_to_app + '/Contents/MacOS/servo', dir_to_app + '/Contents/MacOS/')
print("Writing run-servo")
bhtml_path = path.join('${0%/*}/../Resources', browserhtml_path.split('/')[-1], 'out', 'index.html')
@@ -158,7 +183,7 @@ class PackageCommands(CommandBase):
print("Creating dmg")
os.symlink('/Applications', dir_to_dmg + '/Applications')
dmg_path = '/'.join(dir_to_build.split('/')[:-1]) + '/'
- time = datetime.utcnow().replace(microsecond=0).isoformat()
+ time = now.replace(microsecond=0).isoformat()
time = time.replace(':', '-')
dmg_path += time + "-servo-tech-demo.dmg"
try:
@@ -169,6 +194,30 @@ class PackageCommands(CommandBase):
print("Cleaning up")
delete(dir_to_dmg)
print("Packaged Servo into " + dmg_path)
+
+ print("Creating brew package")
+ dir_to_brew = '/'.join(binary_path.split('/')[:-2]) + '/brew_tmp/'
+ dir_to_tar = '/'.join(dir_to_build.split('/')[:-1]) + '/brew/'
+ if not path.exists(dir_to_tar):
+ os.makedirs(dir_to_tar)
+ tar_path = dir_to_tar + now.strftime("servo-%Y-%m-%d.tar.gz")
+ if path.exists(dir_to_brew):
+ print("Cleaning up from previous packaging")
+ delete(dir_to_brew)
+ if path.exists(tar_path):
+ print("Deleting existing package")
+ os.remove(tar_path)
+ shutil.copytree(dir_to_root + '/resources', dir_to_brew + "/resources/")
+ os.makedirs(dir_to_brew + '/bin/')
+ shutil.copy2(dir_to_build + '/servo', dir_to_brew + '/bin/servo')
+ # Note that in the context of Homebrew, libexec is reserved for private use by the formula
+ # and therefore is not symlinked into HOMEBREW_PREFIX.
+ os.makedirs(dir_to_brew + '/libexec/')
+ copy_dependencies(dir_to_brew + '/bin/servo', dir_to_brew + '/libexec/')
+ archive_deterministically(dir_to_brew, tar_path, prepend_path='servo/')
+ delete(dir_to_brew)
+ print("Packaged Servo into " + tar_path)
+
elif is_windows():
dir_to_package = path.dirname(binary_path)
dir_to_root = self.get_top_dir()