Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Start on Mach package #11210

Merged
merged 1 commit into from Jun 6, 2016
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

@@ -23,6 +23,7 @@
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 @@
'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.',
@@ -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])

This comment has been minimized.

@aneeshusa

aneeshusa Jun 3, 2016

Member

Looks like a debugging print that can be removed.

This comment has been minimized.

@edunham

edunham Jun 3, 2016

Author Contributor

I believe this is still used frequently when debugging the Android builder

return subprocess.call(["adb", "install", "-r", apk_path], env=self.build_env())
@@ -23,7 +23,7 @@
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 @@ def serve_docs(self):
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())
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.