nixpkgs mirror (for testing) github.com/NixOS/nixpkgs
nix
at 20.03 258 lines 8.7 kB view raw
1{requireFile, autoPatchelfHook, pkgs, pkgs_i686, licenseAccepted ? false}: 2 3{ toolsVersion ? "25.2.5" 4, platformToolsVersion ? "28.0.1" 5, buildToolsVersions ? [ "28.0.3" ] 6, includeEmulator ? false 7, emulatorVersion ? "28.0.14" 8, platformVersions ? [] 9, includeSources ? false 10, includeDocs ? false 11, includeSystemImages ? false 12, systemImageTypes ? [ "default" ] 13, abiVersions ? [ "armeabi-v7a" ] 14, lldbVersions ? [ ] 15, cmakeVersions ? [ ] 16, includeNDK ? false 17, ndkVersion ? "18.1.5063045" 18, useGoogleAPIs ? false 19, useGoogleTVAddOns ? false 20, includeExtras ? [] 21}: 22 23let 24 inherit (pkgs) stdenv lib fetchurl makeWrapper unzip; 25 26 # Determine the Android os identifier from Nix's system identifier 27 os = if stdenv.system == "x86_64-linux" then "linux" 28 else if stdenv.system == "x86_64-darwin" then "macosx" 29 else throw "No Android SDK tarballs are available for system architecture: ${stdenv.system}"; 30 31 # Generated Nix packages 32 packages = import ./generated/packages.nix { 33 inherit fetchurl; 34 }; 35 36 # Generated system images 37 system-images-packages-android = import ./generated/system-images-android.nix { 38 inherit fetchurl; 39 }; 40 41 system-images-packages-android-tv = import ./generated/system-images-android-tv.nix { 42 inherit fetchurl; 43 }; 44 45 system-images-packages-android-wear = import ./generated/system-images-android-wear.nix { 46 inherit fetchurl; 47 }; 48 49 system-images-packages-android-wear-cn = import ./generated/system-images-android-wear-cn.nix { 50 inherit fetchurl; 51 }; 52 53 system-images-packages-google_apis = import ./generated/system-images-google_apis.nix { 54 inherit fetchurl; 55 }; 56 57 system-images-packages-google_apis_playstore = import ./generated/system-images-google_apis_playstore.nix { 58 inherit fetchurl; 59 }; 60 61 system-images-packages = 62 lib.recursiveUpdate 63 system-images-packages-android 64 (lib.recursiveUpdate system-images-packages-android-tv 65 (lib.recursiveUpdate system-images-packages-android-wear 66 (lib.recursiveUpdate system-images-packages-android-wear-cn 67 (lib.recursiveUpdate system-images-packages-google_apis system-images-packages-google_apis_playstore)))); 68 69 # Generated addons 70 addons = import ./generated/addons.nix { 71 inherit fetchurl; 72 }; 73in 74rec { 75 deployAndroidPackage = import ./deploy-androidpackage.nix { 76 inherit stdenv unzip; 77 }; 78 79 platform-tools = import ./platform-tools.nix { 80 inherit deployAndroidPackage os autoPatchelfHook pkgs lib; 81 package = packages.platform-tools.${platformToolsVersion}; 82 }; 83 84 build-tools = map (version: 85 import ./build-tools.nix { 86 inherit deployAndroidPackage os autoPatchelfHook makeWrapper pkgs pkgs_i686 lib; 87 package = packages.build-tools.${version}; 88 } 89 ) buildToolsVersions; 90 91 docs = deployAndroidPackage { 92 inherit os; 93 package = packages.docs."1"; 94 }; 95 96 emulator = import ./emulator.nix { 97 inherit deployAndroidPackage os autoPatchelfHook makeWrapper pkgs pkgs_i686 lib; 98 package = packages.emulator.${emulatorVersion}.${os}; 99 }; 100 101 platforms = map (version: 102 deployAndroidPackage { 103 inherit os; 104 package = packages.platforms.${version}; 105 } 106 ) platformVersions; 107 108 sources = map (version: 109 deployAndroidPackage { 110 inherit os; 111 package = packages.sources.${version}; 112 } 113 ) platformVersions; 114 115 system-images = lib.flatten (map (apiVersion: 116 map (type: 117 map (abiVersion: 118 deployAndroidPackage { 119 inherit os; 120 package = system-images-packages.${apiVersion}.${type}.${abiVersion}; 121 # Patch 'google_apis' system images so they're recognized by the sdk. 122 # Without this, `android list targets` shows 'Tag/ABIs : no ABIs' instead 123 # of 'Tag/ABIs : google_apis*/*' and the emulator fails with an ABI-related error. 124 patchInstructions = lib.optionalString (lib.hasPrefix "google_apis" type) '' 125 sed -i '/^Addon.Vendor/d' source.properties 126 ''; 127 } 128 ) abiVersions 129 ) systemImageTypes 130 ) platformVersions); 131 132 lldb = map (version: 133 import ./lldb.nix { 134 inherit deployAndroidPackage os autoPatchelfHook pkgs lib; 135 package = packages.lldb.${version}; 136 } 137 ) lldbVersions; 138 139 cmake = map (version: 140 import ./cmake.nix { 141 inherit deployAndroidPackage os autoPatchelfHook pkgs lib; 142 package = packages.cmake.${version}; 143 } 144 ) cmakeVersions; 145 146 ndk-bundle = import ./ndk-bundle { 147 inherit deployAndroidPackage os autoPatchelfHook makeWrapper pkgs lib platform-tools; 148 package = packages.ndk-bundle.${ndkVersion}; 149 }; 150 151 google-apis = map (version: 152 deployAndroidPackage { 153 inherit os; 154 package = addons.addons.${version}.google_apis; 155 } 156 ) (builtins.filter (platformVersion: platformVersion < "26") platformVersions); # API level 26 and higher include Google APIs by default 157 158 google-tv-addons = map (version: 159 deployAndroidPackage { 160 inherit os; 161 package = addons.addons.${version}.google_tv_addon; 162 } 163 ) platformVersions; 164 165 # Function that automatically links all plugins for which multiple versions can coexist 166 linkPlugins = {name, plugins}: 167 lib.optionalString (plugins != []) '' 168 mkdir -p ${name} 169 ${lib.concatMapStrings (plugin: '' 170 ln -s ${plugin}/libexec/android-sdk/${name}/* ${name} 171 '') plugins} 172 ''; 173 174 # Function that automatically links a plugin for which only one version exists 175 linkPlugin = {name, plugin, check ? true}: 176 lib.optionalString check '' 177 ln -s ${plugin}/libexec/android-sdk/* ${name} 178 ''; 179 180 # Links all plugins related to a requested platform 181 linkPlatformPlugins = {name, plugins, check}: 182 lib.optionalString check '' 183 mkdir -p ${name} 184 ${lib.concatMapStrings (plugin: '' 185 ln -s ${plugin}/libexec/android-sdk/${name}/* ${name} 186 '') plugins} 187 ''; # */ 188 189 # This derivation deploys the tools package and symlinks all the desired 190 # plugins that we want to use. 191 192 androidsdk = if !licenseAccepted then throw '' 193 You must accept the Android Software Development Kit License Agreement at 194 https://developer.android.com/studio/terms 195 by setting nixpkgs config option 'android_sdk.accept_license = true;' 196 '' else import ./tools.nix { 197 inherit deployAndroidPackage requireFile packages toolsVersion autoPatchelfHook makeWrapper os pkgs pkgs_i686 lib; 198 199 postInstall = '' 200 # Symlink all requested plugins 201 202 ${linkPlugin { name = "platform-tools"; plugin = platform-tools; }} 203 ${linkPlugins { name = "build-tools"; plugins = build-tools; }} 204 ${linkPlugin { name = "emulator"; plugin = emulator; check = includeEmulator; }} 205 ${linkPlugin { name = "docs"; plugin = docs; check = includeDocs; }} 206 ${linkPlugins { name = "platforms"; plugins = platforms; }} 207 ${linkPlatformPlugins { name = "sources"; plugins = sources; check = includeSources; }} 208 ${linkPlugins { name = "lldb"; plugins = lldb; }} 209 ${linkPlugins { name = "cmake"; plugins = cmake; }} 210 ${linkPlugin { name = "ndk-bundle"; plugin = ndk-bundle; check = includeNDK; }} 211 212 ${lib.optionalString includeSystemImages '' 213 mkdir -p system-images 214 ${lib.concatMapStrings (system-image: '' 215 apiVersion=$(basename $(echo ${system-image}/libexec/android-sdk/system-images/*)) 216 type=$(basename $(echo ${system-image}/libexec/android-sdk/system-images/*/*)) 217 mkdir -p system-images/$apiVersion/$type 218 ln -s ${system-image}/libexec/android-sdk/system-images/$apiVersion/$type/* system-images/$apiVersion/$type 219 '') system-images} 220 ''} 221 222 ${linkPlatformPlugins { name = "add-ons"; plugins = google-apis; check = useGoogleAPIs; }} 223 ${linkPlatformPlugins { name = "add-ons"; plugins = google-apis; check = useGoogleTVAddOns; }} 224 225 # Link extras 226 ${lib.concatMapStrings (identifier: 227 let 228 path = addons.extras.${identifier}.path; 229 addon = deployAndroidPackage { 230 inherit os; 231 package = addons.extras.${identifier}; 232 }; 233 in 234 '' 235 targetDir=$(dirname ${path}) 236 mkdir -p $targetDir 237 ln -s ${addon}/libexec/android-sdk/${path} $targetDir 238 '') includeExtras} 239 240 # Expose common executables in bin/ 241 mkdir -p $out/bin 242 find $PWD/tools -not -path '*/\.*' -type f -executable -mindepth 1 -maxdepth 1 | while read i 243 do 244 ln -s $i $out/bin 245 done 246 247 find $PWD/tools/bin -not -path '*/\.*' -type f -executable -mindepth 1 -maxdepth 1 | while read i 248 do 249 ln -s $i $out/bin 250 done 251 252 for i in ${platform-tools}/bin/* 253 do 254 ln -s $i $out/bin 255 done 256 ''; 257 }; 258}