aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--python/mach_bootstrap.py6
-rw-r--r--python/servo/package_commands.py138
-rw-r--r--python/servo/post_build_commands.py63
3 files changed, 145 insertions, 62 deletions
diff --git a/python/mach_bootstrap.py b/python/mach_bootstrap.py
index a22d2aea9af..3314a83d08c 100644
--- a/python/mach_bootstrap.py
+++ b/python/mach_bootstrap.py
@@ -23,6 +23,7 @@ MACH_MODULES = [
os.path.join('python', 'servo', 'build_commands.py'),
os.path.join('python', 'servo', 'testing_commands.py'),
os.path.join('python', 'servo', 'post_build_commands.py'),
+ os.path.join('python', 'servo', 'package_commands.py'),
os.path.join('python', 'servo', 'devenv_commands.py'),
]
@@ -58,6 +59,11 @@ CATEGORIES = {
'long': 'Interact with specific parts of the build system.',
'priority': 20,
},
+ 'package': {
+ 'short': 'Package',
+ 'long': 'Create objects to distribute',
+ 'priority': 15,
+ },
'misc': {
'short': 'Potpourri',
'long': 'Potent potables and assorted snacks.',
diff --git a/python/servo/package_commands.py b/python/servo/package_commands.py
new file mode 100644
index 00000000000..972fa484e8b
--- /dev/null
+++ b/python/servo/package_commands.py
@@ -0,0 +1,138 @@
+# Copyright 2013 The Servo Project Developers. See the COPYRIGHT
+# file at the top-level directory of this distribution.
+#
+# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+# option. This file may not be copied, modified, or distributed
+# except according to those terms.
+
+from __future__ import print_function, unicode_literals
+
+import os
+import os.path as path
+import shutil
+import subprocess
+import tarfile
+
+from mach.registrar import Registrar
+from datetime import datetime
+
+from mach.decorators import (
+ CommandArgument,
+ CommandProvider,
+ Command,
+)
+
+from servo.command_base import CommandBase, cd, BuildNotFound
+from servo.post_build_commands import find_dep_path_newest
+
+
+def delete(path):
+ try:
+ os.remove(path) # Succeeds if path was a file
+ except OSError: # Or, if path was a directory...
+ shutil.rmtree(path) # Remove it and all its contents.
+
+
+@CommandProvider
+class PackageCommands(CommandBase):
+ @Command('package',
+ description='Package Servo',
+ category='package')
+ @CommandArgument('--release', '-r', action='store_true',
+ help='Package the release build')
+ @CommandArgument('--dev', '-d', action='store_true',
+ help='Package the dev build')
+ @CommandArgument('--android',
+ default=None,
+ action='store_true',
+ help='Package Android')
+ def package(self, release=False, dev=False, android=None, debug=False, debugger=None):
+ env = self.build_env()
+ if android is None:
+ android = self.config["build"]["android"]
+ binary_path = self.get_binary_path(release, dev, android=android)
+ if android:
+ if dev:
+ env["NDK_DEBUG"] = "1"
+ env["ANT_FLAVOR"] = "debug"
+ dev_flag = "-d"
+ else:
+ env["ANT_FLAVOR"] = "release"
+ dev_flag = ""
+
+ target_dir = os.path.dirname(binary_path)
+ output_apk = "{}.apk".format(binary_path)
+ try:
+ with cd(path.join("support", "android", "build-apk")):
+ subprocess.check_call(["cargo", "run", "--", dev_flag, "-o", output_apk, "-t", target_dir,
+ "-r", self.get_top_dir()], env=env)
+ except subprocess.CalledProcessError as e:
+ print("Packaging Android exited with return value %d" % e.returncode)
+ return e.returncode
+ else:
+ dir_to_package = '/'.join(binary_path.split('/')[:-1])
+ browserhtml_path = find_dep_path_newest('browserhtml', binary_path)
+ if browserhtml_path is None:
+ print("Could not find browserhtml package; perhaps you haven't built Servo.")
+ return 1
+ print("Deleting unused files")
+ keep = ['servo', 'resources', 'build']
+ for f in os.listdir(dir_to_package + '/'):
+ if f not in keep:
+ delete(dir_to_package + '/' + f)
+ for f in os.listdir(dir_to_package + '/build/'):
+ if 'browserhtml' not in f:
+ delete(dir_to_package + '/build/' + f)
+ print("Writing runservo.sh")
+ # TODO: deduplicate this arg list from post_build_commands
+ servo_args = ['-w', '-b',
+ '--pref', 'dom.mozbrowser.enabled',
+ '--pref', 'dom.forcetouch.enabled',
+ '--pref', 'shell.quit-on-escape.enabled=false',
+ path.join(browserhtml_path, 'out', 'index.html')]
+
+ runservo = os.open(dir_to_package + 'runservo.sh', os.O_WRONLY | os.O_CREAT, int("0755", 8))
+ os.write(runservo, "./servo " + ' '.join(servo_args))
+ os.close(runservo)
+ print("Creating tarball")
+ tar_path = '/'.join(dir_to_package.split('/')[:-1]) + '/'
+ tar_path += datetime.utcnow().replace(microsecond=0).isoformat()
+ tar_path += "-servo-tech-demo.tar.gz"
+ with tarfile.open(tar_path, "w:gz") as tar:
+ # arcname is to add by relative rather than absolute path
+ tar.add(dir_to_package, arcname='servo/')
+ print("Packaged Servo into " + tar_path)
+
+ @Command('install',
+ description='Install Servo (currently, Android only)',
+ category='package')
+ @CommandArgument('--release', '-r', action='store_true',
+ help='Install the release build')
+ @CommandArgument('--dev', '-d', action='store_true',
+ help='Install the dev build')
+ def install(self, release=False, dev=False):
+ try:
+ binary_path = self.get_binary_path(release, dev, android=True)
+ except BuildNotFound:
+ print("Servo build not found. Building servo...")
+ result = Registrar.dispatch(
+ "build", context=self.context, release=release, dev=dev
+ )
+ if result:
+ return result
+ try:
+ binary_path = self.get_binary_path(release, dev, android=True)
+ except BuildNotFound:
+ print("Rebuilding Servo did not solve the missing build problem.")
+ return 1
+
+ apk_path = binary_path + ".apk"
+ if not path.exists(apk_path):
+ result = Registrar.dispatch("package", context=self.context, release=release, dev=dev)
+ if result != 0:
+ return result
+
+ print(["adb", "install", "-r", apk_path])
+ return subprocess.call(["adb", "install", "-r", apk_path], env=self.build_env())
diff --git a/python/servo/post_build_commands.py b/python/servo/post_build_commands.py
index 693fbfdde0c..7781689d32b 100644
--- a/python/servo/post_build_commands.py
+++ b/python/servo/post_build_commands.py
@@ -23,7 +23,7 @@ from mach.decorators import (
Command,
)
-from servo.command_base import CommandBase, cd, call, check_call, BuildNotFound
+from servo.command_base import CommandBase, cd, call, check_call
def read_file(filename, if_exists=False):
@@ -229,64 +229,3 @@ class PostBuildCommands(CommandBase):
import webbrowser
webbrowser.open("file://" + path.abspath(path.join(
self.get_target_dir(), "doc", "servo", "index.html")))
-
- @Command('package',
- description='Package Servo (currently, Android APK only)',
- category='post-build')
- @CommandArgument('--release', '-r', action='store_true',
- help='Package the release build')
- @CommandArgument('--dev', '-d', action='store_true',
- help='Package the dev build')
- def package(self, release=False, dev=False, debug=False, debugger=None):
- env = self.build_env()
- binary_path = self.get_binary_path(release, dev, android=True)
-
- if dev:
- env["NDK_DEBUG"] = "1"
- env["ANT_FLAVOR"] = "debug"
- dev_flag = "-d"
- else:
- env["ANT_FLAVOR"] = "release"
- dev_flag = ""
-
- target_dir = os.path.dirname(binary_path)
- output_apk = "{}.apk".format(binary_path)
- try:
- with cd(path.join("support", "android", "build-apk")):
- subprocess.check_call(["cargo", "run", "--", dev_flag, "-o", output_apk, "-t", target_dir,
- "-r", self.get_top_dir()], env=env)
- except subprocess.CalledProcessError as e:
- print("Packaging Android exited with return value %d" % e.returncode)
- return e.returncode
-
- @Command('install',
- description='Install Servo (currently, Android only)',
- category='post-build')
- @CommandArgument('--release', '-r', action='store_true',
- help='Package the release build')
- @CommandArgument('--dev', '-d', action='store_true',
- help='Package the dev build')
- def install(self, release=False, dev=False):
- try:
- binary_path = self.get_binary_path(release, dev, android=True)
- except BuildNotFound:
- print("Servo build not found. Building servo...")
- result = Registrar.dispatch(
- "build", context=self.context, release=release, dev=dev
- )
- if result:
- return result
- try:
- binary_path = self.get_binary_path(release, dev, android=True)
- except BuildNotFound:
- print("Rebuilding Servo did not solve the missing build problem.")
- return 1
-
- apk_path = binary_path + ".apk"
- if not path.exists(apk_path):
- result = Registrar.dispatch("package", context=self.context, release=release, dev=dev)
- if result is not 0:
- return result
-
- print(["adb", "install", "-r", apk_path])
- return subprocess.call(["adb", "install", "-r", apk_path], env=self.build_env())