aboutsummaryrefslogtreecommitdiffstats
path: root/python/servo/bootstrap_commands.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/servo/bootstrap_commands.py')
-rw-r--r--python/servo/bootstrap_commands.py99
1 files changed, 70 insertions, 29 deletions
diff --git a/python/servo/bootstrap_commands.py b/python/servo/bootstrap_commands.py
index 0650f943278..6361fa8189a 100644
--- a/python/servo/bootstrap_commands.py
+++ b/python/servo/bootstrap_commands.py
@@ -79,16 +79,24 @@ class MachCommands(CommandBase):
@Command('bootstrap-android',
description='Install the Android SDK and NDK.',
category='bootstrap')
- def bootstrap_android(self):
+ @CommandArgument('--build',
+ action='store_true',
+ help='Install Android-specific dependencies for building')
+ @CommandArgument('--emulator-x86',
+ action='store_true',
+ help='Install Android x86 emulator and system image')
+ @CommandArgument('--accept-all-licences',
+ action='store_true',
+ help='For non-interactive use')
+ def bootstrap_android(self, build=False, emulator_x86=False, accept_all_licences=False):
+ if not (build or emulator_x86):
+ print("Must specify `--build` or `--emulator-x86` or both.")
ndk = "android-ndk-r12b-{system}-{arch}"
tools = "sdk-tools-{system}-4333796"
- sdk_build_tools = "27.0.3"
- emulator_images = [
- ("servo-arm", "25", "google_apis;armeabi-v7a"),
- ("servo-x86", "28", "google_apis;x86"),
- ]
+ emulator_platform = "android-28"
+ emulator_image = "system-images;%s;google_apis;x86" % emulator_platform
known_sha1 = {
# https://dl.google.com/android/repository/repository2-1.xml
@@ -135,38 +143,71 @@ class MachCommands(CommandBase):
system = platform.system().lower()
machine = platform.machine().lower()
arch = {"i386": "x86"}.get(machine, machine)
- download("ndk", ndk.format(system=system, arch=arch), flatten=True)
+ if build:
+ download("ndk", ndk.format(system=system, arch=arch), flatten=True)
download("sdk", tools.format(system=system))
- subprocess.check_call([
- path.join(toolchains, "sdk", "tools", "bin", "sdkmanager"),
- "platform-tools",
- "build-tools;" + sdk_build_tools,
- "emulator",
- ] + [
- arg
- for avd_name, api_level, system_image in emulator_images
- for arg in [
- "platforms;android-" + api_level,
- "system-images;android-%s;%s" % (api_level, system_image),
+ components = []
+ if emulator_x86:
+ components += [
+ "platform-tools",
+ "emulator",
+ "platforms;" + emulator_platform,
+ emulator_image,
]
- ])
- for avd_name, api_level, system_image in emulator_images:
+ if build:
+ components += [
+ "platforms;android-18",
+ ]
+
+ sdkmanager = [path.join(toolchains, "sdk", "tools", "bin", "sdkmanager")] + components
+ if accept_all_licences:
+ yes = subprocess.Popen(["yes"], stdout=subprocess.PIPE)
+ process = subprocess.Popen(
+ sdkmanager, stdin=yes.stdout, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
+ )
+ # Reduce progress bar spam by removing duplicate lines.
+ # Printing the same line again with \r is a no-op in a real terminal,
+ # but each line is shown individually in Taskcluster's log viewer.
+ previous_line = None
+ line = b""
+ while 1:
+ # Read one byte at a time because in Python:
+ # * readline() blocks until "\n", which doesn't come before the prompt
+ # * read() blocks until EOF, which doesn't come before the prompt
+ # * read(n) keeps reading until it gets n bytes or EOF,
+ # but we don't know reliably how many bytes to read until the prompt
+ byte = process.stdout.read(1)
+ if len(byte) == 0:
+ print(line)
+ break
+ line += byte
+ if byte == b'\n' or byte == b'\r':
+ if line != previous_line:
+ print(line.decode("utf-8", "replace"), end="")
+ sys.stdout.flush()
+ previous_line = line
+ line = b""
+ exit_code = process.wait()
+ yes.terminate()
+ if exit_code:
+ return exit_code
+ else:
+ subprocess.check_call(sdkmanager)
+
+ if emulator_x86:
+ avd_path = path.join(toolchains, "avd", "servo-x86")
process = subprocess.Popen(stdin=subprocess.PIPE, stdout=subprocess.PIPE, args=[
path.join(toolchains, "sdk", "tools", "bin", "avdmanager"),
"create", "avd",
- "--path", path.join(toolchains, "avd", avd_name),
- "--name", avd_name,
- "--package", "system-images;android-%s;%s" % (api_level, system_image),
+ "--path", avd_path,
+ "--name", "servo-x86",
+ "--package", emulator_image,
"--force",
])
output = b""
while 1:
- # Read one byte at a time because in Python:
- # * readline() blocks until "\n", which doesn't come before the prompt
- # * read() blocks until EOF, which doesn't come before the prompt
- # * read(n) keeps reading until it gets n bytes or EOF,
- # but we don't know reliably how many bytes to read until the prompt
+ # Read one byte at a time, see comment above.
byte = process.stdout.read(1)
if len(byte) == 0:
break
@@ -175,7 +216,7 @@ class MachCommands(CommandBase):
if output.endswith(b"Do you wish to create a custom hardware profile? [no]"):
process.stdin.write("no\n")
assert process.wait() == 0
- with open(path.join(toolchains, "avd", avd_name, "config.ini"), "a") as f:
+ with open(path.join(avd_path, "config.ini"), "a") as f:
f.write("disk.dataPartition.size=2G\n")
@Command('update-hsts-preload',