Make Android build optional on Nix (#31231)

* Make Android build optional on Nix

I want to build Servo without also installing the entire Android SDK.
This makes it so Android support is only built if `buildAndroid` is
true.

Signed-off-by: syvb <me@iter.ca>

* Add Android support to nix-shell if SERVO_ANDROID_BUILD set

---------

Signed-off-by: syvb <me@iter.ca>
This commit is contained in:
Smitty 2024-02-01 21:13:24 -05:00 committed by GitHub
parent 92af41cfeb
commit f27227b1db
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 19 additions and 13 deletions

View file

@ -1,6 +1,9 @@
# This provides a shell with all the necesarry packages required to run mach and build servo
# NOTE: This does not work offline or for nix-build
{
buildAndroid ? false
}:
with import (builtins.fetchTarball {
url = "https://github.com/NixOS/nixpkgs/archive/46ae0210ce163b3cba6c7da08840c1d63de9c701.tar.gz";
}) {
@ -11,8 +14,8 @@ with import (builtins.fetchTarball {
}))
];
config = {
android_sdk.accept_license = true;
allowUnfree = true;
android_sdk.accept_license = buildAndroid;
allowUnfree = buildAndroid;
};
};
let
@ -134,22 +137,16 @@ stdenv.mkDerivation rec {
RUSTC_BOOTSTRAP = "crown";
}))
# for android builds
# TODO: make this optional
openjdk17_headless
androidSdk
] ++ (lib.optionals stdenv.isDarwin [
darwin.apple_sdk.frameworks.AppKit
]) ++ (lib.optionals buildAndroid [
# for android builds
openjdk17_headless
androidSdk
]);
LIBCLANG_PATH = llvmPackages.clang-unwrapped.lib + "/lib/";
# Required by ./mach build --android
ANDROID_SDK_ROOT = "${androidSdk}/libexec/android-sdk";
ANDROID_NDK_ROOT = "${ANDROID_SDK_ROOT}/ndk-bundle";
GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_SDK_ROOT}/build-tools/${buildToolsVersion}/aapt2";
# Allow cargo to download crates
SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
@ -217,4 +214,9 @@ stdenv.mkDerivation rec {
export RUSTUP_HOME=$repo_root/.rustup
fi
'';
} // lib.optionalAttrs buildAndroid {
# Required by ./mach build --android
ANDROID_SDK_ROOT = "${androidSdk}/libexec/android-sdk";
ANDROID_NDK_ROOT = "${ANDROID_SDK_ROOT}/ndk-bundle";
GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_SDK_ROOT}/build-tools/${buildToolsVersion}/aapt2";
}

3
mach
View file

@ -36,10 +36,11 @@ if __name__ == '__main__':
import subprocess
from shlex import quote
mach_dir = os.path.abspath(os.path.dirname(__file__))
build_android_args = ['--arg', 'buildAndroid', 'true'] if 'SERVO_ANDROID_BUILD' in os.environ else []
print('NOTE: Entering nix-shell etc/shell.nix')
try:
# sys argv already contains the ./mach part, so we just need to pass it as-is
result = subprocess.run(['nix-shell', mach_dir + '/etc/shell.nix', '--run', ' '.join(map(quote, sys.argv))])
result = subprocess.run(['nix-shell', mach_dir + '/etc/shell.nix'] + build_android_args + ['--run', ' '.join(map(quote, sys.argv))])
sys.exit(result.returncode)
except KeyboardInterrupt:
sys.exit(0)

View file

@ -537,6 +537,9 @@ class CommandBase(object):
if os.path.isdir(default):
env.setdefault(f"ANDROID_{kind.upper()}_ROOT", default)
if "IN_NIX_SHELL" in env and ("ANDROID_NDK_ROOT" not in env or "ANDROID_SDK_ROOT" not in env):
print("Please set SERVO_ANDROID_BUILD=1 when starting the Nix shell to include the Android SDK/NDK.")
sys.exit(1)
if "ANDROID_NDK_ROOT" not in env:
print("Please set the ANDROID_NDK_ROOT environment variable.")
sys.exit(1)