Add ./mach bootstrap-android

This commit is contained in:
Simon Sapin 2018-06-21 16:52:33 +02:00
parent c71c55e542
commit b9d5f11b20
3 changed files with 66 additions and 1 deletions

1
.gitignore vendored
View file

@ -2,6 +2,7 @@
/.cargo/* /.cargo/*
!/.cargo/config.* !/.cargo/config.*
/.servobuild /.servobuild
/android-toolchains
/target /target
/ports/android/bin /ports/android/bin
/ports/android/libs /ports/android/libs

View file

@ -13,6 +13,7 @@ import base64
import json import json
import os import os
import os.path as path import os.path as path
import platform
import re import re
import subprocess import subprocess
import sys import sys
@ -28,7 +29,7 @@ from mach.decorators import (
import servo.bootstrap as bootstrap import servo.bootstrap as bootstrap
from servo.command_base import CommandBase, cd, check_call from servo.command_base import CommandBase, cd, check_call
from servo.util import delete, download_bytes from servo.util import delete, download_bytes, download_file, check_hash, extract
@CommandProvider @CommandProvider
@ -54,6 +55,56 @@ class MachCommands(CommandBase):
def bootstrap(self, force=False): def bootstrap(self, force=False):
return bootstrap.bootstrap(self.context, force=force) return bootstrap.bootstrap(self.context, force=force)
@Command('bootstrap-android',
description='Install the Android SDK and NDK.',
category='bootstrap')
def bootstrap_android(self):
ndk_version = "r12b"
ndk_sha512 = "2d85b476436ca50896e4b7c5d0f15547fd14a6ebec7e0081022b28f791709af7" \
"8ea5ebddcdf4722b5e94daeac288d509bd5f240b0280167edef8e199da3d0501"
sdk_version = "r25.2.3"
sdk_sha512 = "dfc30ee3e2714cf8008ab1f99757deded002d21b23a8d2ab07952e1afd1c9312" \
"4ddec06660babf6a46c54e5e7e135c8c0cb4cc512378a8509da074dbf7e253d7"
sdk_platform = "25"
sdk_build_tools = "25.0.2"
def download(kind, name, sha512):
toolchains = path.join(self.context.topdir, "android-toolchains")
directory = path.join(toolchains, kind)
final = path.join(directory, name)
if path.isdir(final):
return final
base_url = "https://dl.google.com/android/repository/"
filename = name + ".zip"
url = base_url + filename
archive = path.join(directory, filename)
extract_to = final + ".tmp"
if not path.isdir(directory):
os.makedirs(directory)
download_file(filename, url, archive)
check_hash(archive, sha512, "sha512")
print("Extracting " + filename)
extract(archive, extract_to)
contents = os.listdir(extract_to)
assert len(contents) == 1
extracted_dir = path.join(extract_to, contents[0])
assert path.isdir(extracted_dir)
os.rename(extracted_dir, final)
os.rmdir(extract_to)
return final
system = platform.system().lower()
machine = platform.machine().lower()
os_ = {"darwin": "macosx"}.get(system, system)
arch = {"i386": "x86"}.get(machine, machine)
ndk = download("ndk", "android-ndk-%s-%s-%s" % (ndk_version, system, arch), ndk_sha512)
sdk = download("sdk", "tools_%s-%s" % (sdk_version, os_), sdk_sha512)
@Command('update-hsts-preload', @Command('update-hsts-preload',
description='Download the HSTS preload list', description='Download the HSTS preload list',
category='bootstrap') category='bootstrap')

View file

@ -9,6 +9,7 @@
from __future__ import absolute_import, print_function, unicode_literals from __future__ import absolute_import, print_function, unicode_literals
import hashlib
import os import os
import os.path import os.path
import platform import platform
@ -165,3 +166,15 @@ def extract(src, dst, movedir=None):
os.rmdir(movedir) os.rmdir(movedir)
os.remove(src) os.remove(src)
def check_hash(filename, expected, algorithm):
hasher = hashlib.new(algorithm)
with open(filename, "rb") as f:
while True:
block = f.read(16 * 1024)
if len(block) == 0:
break
hasher.update(block)
if hasher.hexdigest() != expected:
print("Incorrect {} hash for {}".format(algorithm, filename))
sys.exit(1)