diff options
Diffstat (limited to 'nixpkgs/pkgs/development/mobile/androidenv/compose-android-packages.nix')
-rw-r--r-- | nixpkgs/pkgs/development/mobile/androidenv/compose-android-packages.nix | 197 |
1 files changed, 120 insertions, 77 deletions
diff --git a/nixpkgs/pkgs/development/mobile/androidenv/compose-android-packages.nix b/nixpkgs/pkgs/development/mobile/androidenv/compose-android-packages.nix index 794de2276645..fd78fa9ac0f8 100644 --- a/nixpkgs/pkgs/development/mobile/androidenv/compose-android-packages.nix +++ b/nixpkgs/pkgs/development/mobile/androidenv/compose-android-packages.nix @@ -1,23 +1,26 @@ -{requireFile, autoPatchelfHook, pkgs, pkgsHostHost, pkgs_i686, licenseAccepted ? false}: +{ requireFile, autoPatchelfHook, pkgs, pkgsHostHost, pkgs_i686 +, licenseAccepted ? false +}: -{ toolsVersion ? "25.2.5" -, platformToolsVersion ? "29.0.6" -, buildToolsVersions ? [ "28.0.3" ] +{ toolsVersion ? "26.1.1" +, platformToolsVersion ? "30.0.5" +, buildToolsVersions ? [ "30.0.3" ] , includeEmulator ? false -, emulatorVersion ? "30.0.3" +, emulatorVersion ? "30.3.4" , platformVersions ? [] , includeSources ? false -, includeDocs ? false , includeSystemImages ? false -, systemImageTypes ? [ "default" ] +, systemImageTypes ? [ "google_apis_playstore" ] , abiVersions ? [ "armeabi-v7a" ] -, lldbVersions ? [ ] , cmakeVersions ? [ ] , includeNDK ? false -, ndkVersion ? "21.0.6113669" +, ndkVersion ? "22.0.7026061" , useGoogleAPIs ? false , useGoogleTVAddOns ? false , includeExtras ? [] +, repoJson ? ./repo.json +, repoXmls ? null +, extraLicenses ? [] }: let @@ -28,48 +31,86 @@ let else if stdenv.system == "x86_64-darwin" then "macosx" else throw "No Android SDK tarballs are available for system architecture: ${stdenv.system}"; - # Generated Nix packages - packages = import ./generated/packages.nix { - inherit fetchurl; - }; - - # Generated system images - system-images-packages-android = import ./generated/system-images-android.nix { - inherit fetchurl; - }; - - system-images-packages-android-tv = import ./generated/system-images-android-tv.nix { - inherit fetchurl; - }; - - system-images-packages-android-wear = import ./generated/system-images-android-wear.nix { - inherit fetchurl; - }; - - system-images-packages-android-wear-cn = import ./generated/system-images-android-wear-cn.nix { - inherit fetchurl; - }; - - system-images-packages-google_apis = import ./generated/system-images-google_apis.nix { - inherit fetchurl; + # Uses mkrepo.rb to create a repo spec. + mkRepoJson = { packages ? [], images ? [], addons ? [] }: let + mkRepoRuby = (pkgs.ruby.withPackages (pkgs: with pkgs; [ slop nokogiri ])); + mkRepoRubyArguments = lib.lists.flatten [ + (builtins.map (package: ["--packages" "${package}"]) packages) + (builtins.map (image: ["--images" "${image}"]) images) + (builtins.map (addon: ["--addons" "${addon}"]) addons) + ]; + in + stdenv.mkDerivation { + name = "androidenv-repo-json"; + buildInputs = [ mkRepoRuby ]; + preferLocalBuild = true; + unpackPhase = "true"; + buildPhase = '' + ruby ${./mkrepo.rb} ${lib.escapeShellArgs mkRepoRubyArguments} > repo.json + ''; + installPhase = '' + mv repo.json $out + ''; }; - system-images-packages-google_apis_playstore = import ./generated/system-images-google_apis_playstore.nix { - inherit fetchurl; + # Reads the repo JSON. If repoXmls is provided, will build a repo JSON into the Nix store. + repo = if repoXmls != null then + let + repoXmlSpec = { + packages = repoXmls.packages or []; + images = repoXmls.images or []; + addons = repoXmls.addons or []; + }; + in + builtins.fromJSON (builtins.readFile "${mkRepoJson repoXmlSpec}") + else + builtins.fromJSON (builtins.readFile repoJson); + + # Converts all 'archives' keys in a repo spec to fetchurl calls. + fetchArchives = attrSet: + lib.attrsets.mapAttrsRecursive + (path: value: + if (builtins.elemAt path ((builtins.length path) - 1)) == "archives" then + (builtins.listToAttrs + (builtins.map + (archive: lib.attrsets.nameValuePair archive.os (fetchurl { inherit (archive) url sha1; })) value)) + else value + ) + attrSet; + + # Converts the repo attrset into fetch calls + packages = fetchArchives repo.packages; + system-images-packages = fetchArchives repo.images; + addons = { + addons = fetchArchives repo.addons; + extras = fetchArchives repo.extras; }; - system-images-packages = - lib.recursiveUpdate - system-images-packages-android - (lib.recursiveUpdate system-images-packages-android-tv - (lib.recursiveUpdate system-images-packages-android-wear - (lib.recursiveUpdate system-images-packages-android-wear-cn - (lib.recursiveUpdate system-images-packages-google_apis system-images-packages-google_apis_playstore)))); - - # Generated addons - addons = import ./generated/addons.nix { - inherit fetchurl; - }; + # Converts a license name to a list of license texts. + mkLicenses = licenseName: repo.licenses.${licenseName}; + + # Converts a list of license names to a flattened list of license texts. + # Just used for displaying licenses. + mkLicenseTexts = licenseNames: + lib.lists.flatten + (builtins.map + (licenseName: + builtins.map + (licenseText: "--- ${licenseName} ---\n${licenseText}") + (mkLicenses licenseName)) + licenseNames); + + # Converts a license name to a list of license hashes. + mkLicenseHashes = licenseName: + builtins.map + (licenseText: builtins.hashString "sha1" licenseText) + (mkLicenses licenseName); + + # The list of all license names we're accepting. Put android-sdk-license there + # by default. + licenseNames = lib.lists.unique ([ + "android-sdk-license" + ] ++ extraLicenses); in rec { deployAndroidPackage = import ./deploy-androidpackage.nix { @@ -88,14 +129,9 @@ rec { } ) buildToolsVersions; - docs = deployAndroidPackage { - inherit os; - package = packages.docs."1"; - }; - emulator = import ./emulator.nix { inherit deployAndroidPackage os autoPatchelfHook makeWrapper pkgs pkgs_i686 lib; - package = packages.emulator.${emulatorVersion}.${os}; + package = packages.emulator.${emulatorVersion}; }; platforms = map (version: @@ -115,27 +151,22 @@ rec { system-images = lib.flatten (map (apiVersion: map (type: map (abiVersion: - deployAndroidPackage { - inherit os; - package = system-images-packages.${apiVersion}.${type}.${abiVersion}; - # Patch 'google_apis' system images so they're recognized by the sdk. - # Without this, `android list targets` shows 'Tag/ABIs : no ABIs' instead - # of 'Tag/ABIs : google_apis*/*' and the emulator fails with an ABI-related error. - patchInstructions = lib.optionalString (lib.hasPrefix "google_apis" type) '' - sed -i '/^Addon.Vendor/d' source.properties - ''; - } + if lib.hasAttrByPath [apiVersion type abiVersion] system-images-packages then + deployAndroidPackage { + inherit os; + package = system-images-packages.${apiVersion}.${type}.${abiVersion}; + # Patch 'google_apis' system images so they're recognized by the sdk. + # Without this, `android list targets` shows 'Tag/ABIs : no ABIs' instead + # of 'Tag/ABIs : google_apis*/*' and the emulator fails with an ABI-related error. + patchInstructions = lib.optionalString (lib.hasPrefix "google_apis" type) '' + sed -i '/^Addon.Vendor/d' source.properties + ''; + } + else [] ) abiVersions ) systemImageTypes ) platformVersions); - lldb = map (version: - import ./lldb.nix { - inherit deployAndroidPackage os autoPatchelfHook pkgs lib; - package = packages.lldb.${version}; - } - ) lldbVersions; - cmake = map (version: import ./cmake.nix { inherit deployAndroidPackage os autoPatchelfHook pkgs lib; @@ -187,12 +218,15 @@ rec { ''; # */ # This derivation deploys the tools package and symlinks all the desired - # plugins that we want to use. - + # plugins that we want to use. If the license isn't accepted, prints all the licenses + # requested and throws. androidsdk = if !licenseAccepted then throw '' - You must accept the Android Software Development Kit License Agreement at - https://developer.android.com/studio/terms - by setting nixpkgs config option 'android_sdk.accept_license = true;' + ${builtins.concatStringsSep "\n\n" (mkLicenseTexts licenseNames)} + + You must accept the following licenses: + ${lib.concatMapStringsSep "\n" (str: " - ${str}") licenseNames} + + by setting nixpkgs config option 'android_sdk.accept_license = true;'. '' else import ./tools.nix { inherit deployAndroidPackage requireFile packages toolsVersion autoPatchelfHook makeWrapper os pkgs pkgs_i686 lib; @@ -202,10 +236,8 @@ rec { ${linkPlugin { name = "platform-tools"; plugin = platform-tools; }} ${linkPlugins { name = "build-tools"; plugins = build-tools; }} ${linkPlugin { name = "emulator"; plugin = emulator; check = includeEmulator; }} - ${linkPlugin { name = "docs"; plugin = docs; check = includeDocs; }} ${linkPlugins { name = "platforms"; plugins = platforms; }} ${linkPlatformPlugins { name = "sources"; plugins = sources; check = includeSources; }} - ${linkPlugins { name = "lldb"; plugins = lldb; }} ${linkPlugins { name = "cmake"; plugins = cmake; }} ${linkPlugin { name = "ndk-bundle"; plugin = ndk-bundle; check = includeNDK; }} @@ -253,6 +285,17 @@ rec { do ln -s $i $out/bin done + + # Write licenses + mkdir -p licenses + ${lib.concatMapStrings (licenseName: + let + licenseHashes = builtins.concatStringsSep "\n" (mkLicenseHashes licenseName); + licenseHashFile = pkgs.writeText "androidenv-${licenseName}" licenseHashes; + in + '' + ln -s ${licenseHashFile} licenses/${licenseName} + '') licenseNames} ''; }; } |