aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rwxr-xr-xetc/ci/bootstrap-android-and-accept-licences.sh17
-rw-r--r--etc/ci/buildbot_steps.yml8
-rw-r--r--etc/taskcluster/decision_task.py2
-rw-r--r--python/servo/bootstrap_commands.py99
5 files changed, 76 insertions, 52 deletions
diff --git a/README.md b/README.md
index bcc2459ca12..436d76cb19a 100644
--- a/README.md
+++ b/README.md
@@ -249,7 +249,7 @@ linker = "lld-link.exe"
#### Cross-compilation for Android
-Run `./mach bootstrap-android` to get Android-specific tools. See wiki for
+Run `./mach bootstrap-android --build` to get Android-specific tools. See wiki for
[details](https://github.com/servo/servo/wiki/Building-for-Android).
## The Rust compiler
diff --git a/etc/ci/bootstrap-android-and-accept-licences.sh b/etc/ci/bootstrap-android-and-accept-licences.sh
deleted file mode 100755
index dde62438efa..00000000000
--- a/etc/ci/bootstrap-android-and-accept-licences.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/env bash
-
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-set -o errexit
-set -o nounset
-set -o pipefail
-
-# We enable pipefail above to satisfy servo-tidy, but disable it again here.
-# In the case of the 'yes' program,
-# exiting when the stdout pipe is broken is expected.
-set +o pipefail
-
-cd $(dirname ${0})/../..
-yes | ./mach bootstrap-android
diff --git a/etc/ci/buildbot_steps.yml b/etc/ci/buildbot_steps.yml
index da27cb4db1f..6e895d30597 100644
--- a/etc/ci/buildbot_steps.yml
+++ b/etc/ci/buildbot_steps.yml
@@ -180,7 +180,7 @@ android:
- ./mach clean-nightlies --keep 3 --force
- ./mach clean-cargo-cache --keep 3 --force
- ./etc/ci/clean_build_artifacts.sh
- - ./etc/ci/bootstrap-android-and-accept-licences.sh
+ - ./mach bootstrap-android --accept-all-licences --build
- env --unset ANDROID_NDK --unset ANDROID_SDK ./mach build --android --dev
- env --unset ANDROID_NDK --unset ANDROID_SDK ./mach package --android --dev
- bash ./etc/ci/lockfile_changed.sh
@@ -191,7 +191,7 @@ android-mac:
commands:
- ./mach clean-nightlies --keep 3 --force
- ./mach clean-cargo-cache --keep 3 --force
- - ./etc/ci/bootstrap-android-and-accept-licences.sh
+ - ./mach bootstrap-android --accept-all-licences --build
- ./mach build --android --dev
- ./mach package --android --dev
- bash ./etc/ci/lockfile_changed.sh
@@ -205,7 +205,7 @@ android-x86:
- ./mach clean-nightlies --keep 3 --force
- ./mach clean-cargo-cache --keep 3 --force
- ./etc/ci/clean_build_artifacts.sh
- - ./etc/ci/bootstrap-android-and-accept-licences.sh
+ - ./mach bootstrap-android --accept-all-licences --build --emulator-x86
- env --unset ANDROID_NDK --unset ANDROID_SDK ./mach build --target i686-linux-android --release
- env --unset ANDROID_NDK --unset ANDROID_SDK ./mach test-android-startup --release
- env --unset ANDROID_NDK --unset ANDROID_SDK ./mach test-wpt-android --release /_mozilla/mozilla/DOMParser.html /_mozilla/mozilla/webgl/context_creation_error.html
@@ -220,7 +220,7 @@ android-nightly:
- ./mach clean-nightlies --keep 3 --force
- ./mach clean-cargo-cache --keep 3 --force
- ./etc/ci/clean_build_artifacts.sh
- - ./etc/ci/bootstrap-android-and-accept-licences.sh
+ - ./mach bootstrap-android --accept-all-licences --build
- env --unset ANDROID_NDK --unset ANDROID_SDK ./mach build --android --release
- env --unset ANDROID_NDK --unset ANDROID_SDK ./mach package --android --release --maven
- env --unset ANDROID_NDK --unset ANDROID_SDK ./mach build --target=i686-linux-android --release
diff --git a/etc/taskcluster/decision_task.py b/etc/taskcluster/decision_task.py
index aa3c5d0723f..dcbb0aecda1 100644
--- a/etc/taskcluster/decision_task.py
+++ b/etc/taskcluster/decision_task.py
@@ -87,7 +87,7 @@ def android_arm32():
# wget: servo-media-gstreamer’s build script
.with_script("""
apt-get install -y --no-install-recommends openjdk-8-jdk-headless file wget
- ./etc/ci/bootstrap-android-and-accept-licences.sh
+ ./mach bootstrap-android --accept-all-licences --build
./mach build --android --release
""")
.with_artifacts(
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',