diff options
Diffstat (limited to 'python/servo/bootstrap_commands.py')
-rw-r--r-- | python/servo/bootstrap_commands.py | 99 |
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', |