From 3c13841124db4c1c29df0680aa02b3cd5f5b5cbf Mon Sep 17 00:00:00 2001 From: Morgan Jones Date: Sun, 23 Feb 2025 19:48:31 -0800 Subject: [PATCH] androidenv: nixfmt --- .../mobile/androidenv/build-tools.nix | 67 +- pkgs/development/mobile/androidenv/cmake.nix | 18 +- .../androidenv/compose-android-packages.nix | 789 ++++++++++++------ .../development/mobile/androidenv/default.nix | 3 +- .../androidenv/deploy-androidpackages.nix | 206 +++-- .../mobile/androidenv/emulator.nix | 72 +- .../examples/shell-with-emulator.nix | 31 +- .../mobile/androidenv/examples/shell.nix | 196 +++-- .../mobile/androidenv/ndk-bundle/default.nix | 49 +- .../mobile/androidenv/platform-tools.nix | 44 +- pkgs/development/mobile/androidenv/tools.nix | 59 +- 11 files changed, 996 insertions(+), 538 deletions(-) diff --git a/pkgs/development/mobile/androidenv/build-tools.nix b/pkgs/development/mobile/androidenv/build-tools.nix index f286fb3e85c4..9a38383f4ad1 100644 --- a/pkgs/development/mobile/androidenv/build-tools.nix +++ b/pkgs/development/mobile/androidenv/build-tools.nix @@ -1,28 +1,55 @@ -{deployAndroidPackage, lib, stdenv, package, os, arch, autoPatchelfHook, makeWrapper, pkgs, pkgsi686Linux, postInstall, meta}: +{ + deployAndroidPackage, + lib, + stdenv, + package, + os, + arch, + autoPatchelfHook, + makeWrapper, + pkgs, + pkgsi686Linux, + postInstall, + meta, +}: deployAndroidPackage { inherit package os arch; - nativeBuildInputs = [ makeWrapper ] - ++ lib.optionals (os == "linux") [ autoPatchelfHook ]; - buildInputs = lib.optionals (os == "linux") [ pkgs.glibc pkgs.zlib pkgs.ncurses5 pkgs.libcxx ] - ++ lib.optionals (os == "linux" && stdenv.isx86_64) (with pkgsi686Linux; [ glibc zlib ncurses5 ]); - patchInstructions = '' - ${lib.optionalString (os == "linux") '' - addAutoPatchelfSearchPath $packageBaseDir/lib - if [[ -d $packageBaseDir/lib64 ]]; then - addAutoPatchelfSearchPath $packageBaseDir/lib64 - autoPatchelf --no-recurse $packageBaseDir/lib64 - fi - autoPatchelf --no-recurse $packageBaseDir - ''} + nativeBuildInputs = [ makeWrapper ] ++ lib.optionals (os == "linux") [ autoPatchelfHook ]; + buildInputs = + lib.optionals (os == "linux") [ + pkgs.glibc + pkgs.zlib + pkgs.ncurses5 + pkgs.libcxx + ] + ++ lib.optionals (os == "linux" && stdenv.isx86_64) ( + with pkgsi686Linux; + [ + glibc + zlib + ncurses5 + ] + ); + patchInstructions = + '' + ${lib.optionalString (os == "linux") '' + addAutoPatchelfSearchPath $packageBaseDir/lib + if [[ -d $packageBaseDir/lib64 ]]; then + addAutoPatchelfSearchPath $packageBaseDir/lib64 + autoPatchelf --no-recurse $packageBaseDir/lib64 + fi + autoPatchelf --no-recurse $packageBaseDir + ''} - ${lib.optionalString (lib.toInt (lib.versions.major package.revision) < 33) '' - wrapProgram $PWD/mainDexClasses \ - --prefix PATH : ${pkgs.jdk8}/bin - ''} + ${lib.optionalString (lib.toInt (lib.versions.major package.revision) < 33) '' + wrapProgram $PWD/mainDexClasses \ + --prefix PATH : ${pkgs.jdk8}/bin + ''} - cd $out/libexec/android-sdk - '' + postInstall; + cd $out/libexec/android-sdk + '' + + postInstall; noAuditTmpdir = true; # The checker script gets confused by the build-tools path that is incorrectly identified as a reference to /build inherit meta; diff --git a/pkgs/development/mobile/androidenv/cmake.nix b/pkgs/development/mobile/androidenv/cmake.nix index 4123fa74a33b..d5f54ac4d102 100644 --- a/pkgs/development/mobile/androidenv/cmake.nix +++ b/pkgs/development/mobile/androidenv/cmake.nix @@ -1,9 +1,23 @@ -{deployAndroidPackage, lib, package, os, arch, autoPatchelfHook, pkgs, stdenv, meta}: +{ + deployAndroidPackage, + lib, + package, + os, + arch, + autoPatchelfHook, + pkgs, + stdenv, + meta, +}: deployAndroidPackage { inherit package os arch; nativeBuildInputs = lib.optionals stdenv.hostPlatform.isLinux [ autoPatchelfHook ]; - buildInputs = lib.optionals (os == "linux") [ pkgs.stdenv.cc.libc pkgs.stdenv.cc.cc pkgs.ncurses5 ]; + buildInputs = lib.optionals (os == "linux") [ + pkgs.stdenv.cc.libc + pkgs.stdenv.cc.cc + pkgs.ncurses5 + ]; patchInstructions = lib.optionalString (os == "linux") '' autoPatchelf $packageBaseDir/bin ''; diff --git a/pkgs/development/mobile/androidenv/compose-android-packages.nix b/pkgs/development/mobile/androidenv/compose-android-packages.nix index c44050ab05de..59c6cbaed054 100644 --- a/pkgs/development/mobile/androidenv/compose-android-packages.nix +++ b/pkgs/development/mobile/androidenv/compose-android-packages.nix @@ -1,112 +1,162 @@ -{ callPackage, stdenv, stdenvNoCC, lib, fetchurl, ruby, writeText -, licenseAccepted ? false, meta +{ + callPackage, + stdenv, + stdenvNoCC, + lib, + fetchurl, + ruby, + writeText, + licenseAccepted ? false, + meta, }: -{ repoJson ? ./repo.json -, repoXmls ? null -, repo ? ( - # Reads the repo JSON. If repoXmls is provided, will build a repo JSON into the Nix store. - if repoXmls != null then - let - # Uses mkrepo.rb to create a repo spec. - mkRepoJson = { packages ? [], images ? [], addons ? [] }: let - mkRepoRuby = (ruby.withPackages (pkgs: with pkgs; [ slop nokogiri ])); - mkRepoRubyArguments = lib.lists.flatten [ - (map (package: ["--packages" "${package}"]) packages) - (map (image: ["--images" "${image}"]) images) - (map (addon: ["--addons" "${addon}"]) addons) - ]; +{ + repoJson ? ./repo.json, + repoXmls ? null, + repo ? ( + # Reads the repo JSON. If repoXmls is provided, will build a repo JSON into the Nix store. + if repoXmls != null then + let + # Uses mkrepo.rb to create a repo spec. + mkRepoJson = + { + packages ? [ ], + images ? [ ], + addons ? [ ], + }: + let + mkRepoRuby = ( + ruby.withPackages ( + pkgs: with pkgs; [ + slop + nokogiri + ] + ) + ); + mkRepoRubyArguments = lib.lists.flatten [ + (map (package: [ + "--packages" + "${package}" + ]) packages) + (map (image: [ + "--images" + "${image}" + ]) images) + (map (addon: [ + "--addons" + "${addon}" + ]) addons) + ]; + in + stdenvNoCC.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 + ''; + }; + repoXmlSpec = { + packages = repoXmls.packages or [ ]; + images = repoXmls.images or [ ]; + addons = repoXmls.addons or [ ]; + }; in - stdenvNoCC.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 - ''; - }; - repoXmlSpec = { - packages = repoXmls.packages or []; - images = repoXmls.images or []; - addons = repoXmls.addons or []; - }; - in lib.importJSON "${mkRepoJson repoXmlSpec}" - else - lib.importJSON repoJson - ) -, cmdLineToolsVersion ? repo.latest.cmdline-tools -, toolsVersion ? repo.latest.tools -, platformToolsVersion ? repo.latest.platform-tools -, buildToolsVersions ? [ repo.latest.build-tools ] -, includeEmulator ? false -, emulatorVersion ? repo.latest.emulator -, platformVersions ? [ repo.latest.platforms ] -, includeSources ? false -, includeSystemImages ? false -, systemImageTypes ? [ "google_apis" "google_apis_playstore" ] -, abiVersions ? [ "x86" "x86_64" "armeabi-v7a" "arm64-v8a" ] + else + lib.importJSON repoJson + ), + cmdLineToolsVersion ? repo.latest.cmdline-tools, + toolsVersion ? repo.latest.tools, + platformToolsVersion ? repo.latest.platform-tools, + buildToolsVersions ? [ repo.latest.build-tools ], + includeEmulator ? false, + emulatorVersion ? repo.latest.emulator, + platformVersions ? [ repo.latest.platforms ], + includeSources ? false, + includeSystemImages ? false, + systemImageTypes ? [ + "google_apis" + "google_apis_playstore" + ], + abiVersions ? [ + "x86" + "x86_64" + "armeabi-v7a" + "arm64-v8a" + ], # cmake has precompiles on x86_64 and Darwin platforms. Default to true there for compatibility. -, includeCmake ? stdenv.hostPlatform.isx86_64 || stdenv.hostPlatform.isDarwin -, cmakeVersions ? [ repo.latest.cmake ] -, includeNDK ? false -, ndkVersion ? repo.latest.ndk -, ndkVersions ? [ ndkVersion ] -, useGoogleAPIs ? false -, useGoogleTVAddOns ? false -, includeExtras ? [] -, extraLicenses ? [] + includeCmake ? stdenv.hostPlatform.isx86_64 || stdenv.hostPlatform.isDarwin, + cmakeVersions ? [ repo.latest.cmake ], + includeNDK ? false, + ndkVersion ? repo.latest.ndk, + ndkVersions ? [ ndkVersion ], + useGoogleAPIs ? false, + useGoogleTVAddOns ? false, + includeExtras ? [ ], + extraLicenses ? [ ], }: let # Determine the Android os identifier from Nix's system identifier - os = { + os = + { x86_64-linux = "linux"; x86_64-darwin = "macosx"; aarch64-linux = "linux"; aarch64-darwin = "macosx"; - }.${stdenv.hostPlatform.system} or "all"; + } + .${stdenv.hostPlatform.system} or "all"; # Determine the Android arch identifier from Nix's system identifier - arch = { + arch = + { x86_64-linux = "x64"; x86_64-darwin = "x64"; aarch64-linux = "aarch64"; aarch64-darwin = "aarch64"; - }.${stdenv.hostPlatform.system} or "all"; + } + .${stdenv.hostPlatform.system} or "all"; # 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 - let - validArchives = builtins.filter (archive: - let - isTargetOs = if builtins.hasAttr "os" archive then - archive.os == os || archive.os == "all" else true; - isTargetArch = if builtins.hasAttr "arch" archive then - archive.arch == arch || archive.arch == "all" else true; - in - isTargetOs && isTargetArch - ) value; - packageInfo = lib.attrByPath (lib.sublist 0 (builtins.length path - 1) path) null attrSet; - in - lib.optionals (builtins.length validArchives > 0) - (lib.last (map (archive: + fetchArchives = + attrSet: + lib.attrsets.mapAttrsRecursive ( + path: value: + if (builtins.elemAt path (builtins.length path - 1)) == "archives" then + let + validArchives = builtins.filter ( + archive: + let + isTargetOs = + if builtins.hasAttr "os" archive then archive.os == os || archive.os == "all" else true; + isTargetArch = + if builtins.hasAttr "arch" archive then archive.arch == arch || archive.arch == "all" else true; + in + isTargetOs && isTargetArch + ) value; + packageInfo = lib.attrByPath (lib.sublist 0 (builtins.length path - 1) path) null attrSet; + in + lib.optionals (builtins.length validArchives > 0) ( + lib.last ( + map ( + archive: (fetchurl { inherit (archive) url sha1; passthru = { info = packageInfo; }; }) - ) validArchives)) - else value - ) attrSet; + ) validArchives + ) + ) + else + value + ) attrSet; # Converts the repo attrset into fetch calls. allArchives = { @@ -120,28 +170,28 @@ let # and add recurseIntoAttrs to all of them. allPackages = let - liftedArchives = lib.attrsets.mapAttrsRecursiveCond - (value: !(builtins.hasAttr "archives" value)) - (path: value: - if (value.archives or null) != null && (value.archives or [ ]) != [ ] then - lib.dontRecurseIntoAttrs value.archives - else - null - ) allArchives; + liftedArchives = lib.attrsets.mapAttrsRecursiveCond (value: !(builtins.hasAttr "archives" value)) ( + path: value: + if (value.archives or null) != null && (value.archives or [ ]) != [ ] then + lib.dontRecurseIntoAttrs value.archives + else + null + ) allArchives; # Creates a version key from a name. # Converts things like 'extras;google;auto' to 'extras-google-auto' - toVersionKey = name: + toVersionKey = + name: lib.optionalString (lib.match "^[0-9].*" name != null) "v" - + lib.concatStringsSep "_" (lib.splitVersion (lib.replaceStrings [ ";" ] [ "-" ] name)); + + lib.concatStringsSep "_" (lib.splitVersion (lib.replaceStrings [ ";" ] [ "-" ] name)); - recurse = lib.mapAttrs' - (name: value: - if builtins.isAttrs value && (value.recurseForDerivations or true) then - lib.nameValuePair (toVersionKey name) (lib.recurseIntoAttrs (recurse value)) - else - lib.nameValuePair (toVersionKey name) value - ); + recurse = lib.mapAttrs' ( + name: value: + if builtins.isAttrs value && (value.recurseForDerivations or true) then + lib.nameValuePair (toVersionKey name) (lib.recurseIntoAttrs (recurse value)) + else + lib.nameValuePair (toVersionKey name) value + ); in lib.recurseIntoAttrs (recurse liftedArchives); @@ -150,39 +200,45 @@ let # 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); + 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); + 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); + licenseNames = lib.lists.unique ( + [ + "android-sdk-license" + ] + ++ extraLicenses + ); # put a much nicer error message that includes the available options. - check-version = packages: package: version: + check-version = + packages: package: version: if lib.hasAttrByPath [ package version ] packages then packages.${package}.${version} else throw '' The version ${version} is missing in package ${package}. - The only available versions are ${builtins.concatStringsSep ", " (builtins.attrNames packages.${package})}. + The only available versions are ${ + builtins.concatStringsSep ", " (builtins.attrNames packages.${package}) + }. ''; # Returns true if we should link the specified plugins. - shouldLink = check: packages: + shouldLink = + check: packages: assert builtins.isList packages; if check == true then true @@ -190,14 +246,20 @@ let false else if check == null || check == "if-supported" then let - hasSrc = package: package.src != null && (builtins.isList package.src -> builtins.length package.src > 0); + hasSrc = + package: package.src != null && (builtins.isList package.src -> builtins.length package.src > 0); in - packages != [] && lib.all hasSrc packages + packages != [ ] && lib.all hasSrc packages else throw "Invalid argument ${toString check}; use true, false, or null/if-supported"; # Function that automatically links all plugins for which multiple versions can coexist - linkPlugins = {name, plugins, check ? true}: + linkPlugins = + { + name, + plugins, + check ? true, + }: lib.optionalString (shouldLink check plugins) '' mkdir -p ${name} ${lib.concatMapStrings (plugin: '' @@ -206,7 +268,13 @@ let ''; # Function that automatically links all NDK plugins. - linkNdkPlugins = {name, plugins, rootName ? name, check ? true}: + linkNdkPlugins = + { + name, + plugins, + rootName ? name, + check ? true, + }: lib.optionalString (shouldLink check plugins) '' mkdir -p ${rootName} ${lib.concatMapStrings (plugin: '' @@ -215,29 +283,46 @@ let ''; # Function that automatically links the default NDK plugin. - linkNdkPlugin = {name, plugin, check}: - lib.optionalString (shouldLink check [plugin]) '' + linkNdkPlugin = + { + name, + plugin, + check, + }: + lib.optionalString (shouldLink check [ plugin ]) '' ln -s ${plugin}/libexec/android-sdk/${name} ${name} ''; # Function that automatically links a plugin for which only one version exists - linkPlugin = {name, plugin, check ? true}: - lib.optionalString (shouldLink check [plugin]) '' + linkPlugin = + { + name, + plugin, + check ? true, + }: + lib.optionalString (shouldLink check [ plugin ]) '' ln -s ${plugin}/libexec/android-sdk/${name} ${name} ''; - linkSystemImages = { images, check }: lib.optionalString (shouldLink check images) '' - mkdir -p system-images - ${lib.concatMapStrings (system-image: '' - apiVersion=$(basename $(echo ${system-image}/libexec/android-sdk/system-images/*)) - type=$(basename $(echo ${system-image}/libexec/android-sdk/system-images/*/*)) - mkdir -p system-images/$apiVersion - ln -s ${system-image}/libexec/android-sdk/system-images/$apiVersion/$type system-images/$apiVersion/$type - '') images} - ''; + linkSystemImages = + { images, check }: + lib.optionalString (shouldLink check images) '' + mkdir -p system-images + ${lib.concatMapStrings (system-image: '' + apiVersion=$(basename $(echo ${system-image}/libexec/android-sdk/system-images/*)) + type=$(basename $(echo ${system-image}/libexec/android-sdk/system-images/*/*)) + mkdir -p system-images/$apiVersion + ln -s ${system-image}/libexec/android-sdk/system-images/$apiVersion/$type system-images/$apiVersion/$type + '') images} + ''; # Links all plugins related to a requested platform - linkPlatformPlugins = {name, plugins, check}: + linkPlatformPlugins = + { + name, + plugins, + check, + }: lib.optionalString (shouldLink check plugins) '' mkdir -p ${name} ${lib.concatMapStrings (plugin: '' @@ -248,140 +333,228 @@ let in lib.recurseIntoAttrs rec { deployAndroidPackages = callPackage ./deploy-androidpackages.nix { - inherit stdenv lib mkLicenses meta os arch; + inherit + stdenv + lib + mkLicenses + meta + os + arch + ; }; - deployAndroidPackage = ({package, buildInputs ? [], patchInstructions ? "", meta ? {}, ...}@args: + deployAndroidPackage = ( + { + package, + buildInputs ? [ ], + patchInstructions ? "", + meta ? { }, + ... + }@args: let - extraParams = removeAttrs args [ "package" "os" "arch" "buildInputs" "patchInstructions" ]; + extraParams = removeAttrs args [ + "package" + "os" + "arch" + "buildInputs" + "patchInstructions" + ]; in - deployAndroidPackages ({ - inherit buildInputs; - packages = [ package ]; - patchesInstructions = { "${package.name}" = patchInstructions; }; - } // extraParams - )); + deployAndroidPackages ( + { + inherit buildInputs; + packages = [ package ]; + patchesInstructions = { + "${package.name}" = patchInstructions; + }; + } + // extraParams + ) + ); all = allPackages; platform-tools = callPackage ./platform-tools.nix { - inherit deployAndroidPackage os arch meta; + inherit + deployAndroidPackage + os + arch + meta + ; package = check-version allArchives.packages "platform-tools" platformToolsVersion; }; tools = callPackage ./tools.nix { - inherit deployAndroidPackage os arch meta; + inherit + deployAndroidPackage + os + arch + meta + ; package = check-version allArchives.packages "tools" toolsVersion; postInstall = '' - ${linkPlugin { name = "platform-tools"; plugin = platform-tools; }} - ${linkPlugin { name = "emulator"; plugin = emulator; check = includeEmulator; }} + ${linkPlugin { + name = "platform-tools"; + plugin = platform-tools; + }} + ${linkPlugin { + name = "emulator"; + plugin = emulator; + check = includeEmulator; + }} ''; }; - build-tools = map (version: + build-tools = map ( + version: callPackage ./build-tools.nix { - inherit deployAndroidPackage os arch meta; + inherit + deployAndroidPackage + os + arch + meta + ; package = check-version allArchives.packages "build-tools" version; postInstall = '' - ${linkPlugin { name = "tools"; plugin = tools; check = toolsVersion != null; }} + ${linkPlugin { + name = "tools"; + plugin = tools; + check = toolsVersion != null; + }} ''; } ) buildToolsVersions; - emulator = - callPackage ./emulator.nix { - inherit deployAndroidPackage os arch meta; - package = check-version allArchives.packages "emulator" emulatorVersion; + emulator = callPackage ./emulator.nix { + inherit + deployAndroidPackage + os + arch + meta + ; + package = check-version allArchives.packages "emulator" emulatorVersion; - postInstall = '' - ${linkSystemImages { images = system-images; check = includeSystemImages; }} - ''; - }; + postInstall = '' + ${linkSystemImages { + images = system-images; + check = includeSystemImages; + }} + ''; + }; - platforms = map (version: + platforms = map ( + version: deployAndroidPackage { package = check-version allArchives.packages "platforms" version; } ) platformVersions; - sources = map (version: + sources = map ( + version: deployAndroidPackage { package = check-version allArchives.packages "sources" version; } ) platformVersions; - system-images = lib.flatten (map (apiVersion: - map (type: - # Deploy all system images with the same systemImageType in one derivation to avoid the `null` problem below - # with avdmanager when trying to create an avd! - # - # ``` - # $ yes "" | avdmanager create avd --force --name testAVD --package 'system-images;android-33;google_apis;x86_64' - # Error: Package path is not valid. Valid system image paths are: - # null - # ``` - let - availablePackages = map (abiVersion: - allArchives.system-images.${apiVersion}.${type}.${abiVersion} - ) (builtins.filter (abiVersion: - lib.hasAttrByPath [apiVersion type abiVersion] allArchives.system-images - ) abiVersions); + system-images = lib.flatten ( + map ( + apiVersion: + map ( + type: + # Deploy all system images with the same systemImageType in one derivation to avoid the `null` problem below + # with avdmanager when trying to create an avd! + # + # ``` + # $ yes "" | avdmanager create avd --force --name testAVD --package 'system-images;android-33;google_apis;x86_64' + # Error: Package path is not valid. Valid system image paths are: + # null + # ``` + let + availablePackages = + map (abiVersion: allArchives.system-images.${apiVersion}.${type}.${abiVersion}) + ( + builtins.filter ( + abiVersion: lib.hasAttrByPath [ apiVersion type abiVersion ] allArchives.system-images + ) abiVersions + ); - instructions = builtins.listToAttrs (map (package: { - name = package.name; - value = lib.optionalString (lib.hasPrefix "google_apis" type) '' - # 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. - sed -i '/^Addon.Vendor/d' source.properties - ''; - }) availablePackages - ); - in - lib.optionals (availablePackages != []) - (deployAndroidPackages { + instructions = builtins.listToAttrs ( + map (package: { + name = package.name; + value = lib.optionalString (lib.hasPrefix "google_apis" type) '' + # 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. + sed -i '/^Addon.Vendor/d' source.properties + ''; + }) availablePackages + ); + in + lib.optionals (availablePackages != [ ]) (deployAndroidPackages { packages = availablePackages; patchesInstructions = instructions; }) - ) systemImageTypes - ) platformVersions); + ) systemImageTypes + ) platformVersions + ); - cmake = map (version: + cmake = map ( + version: callPackage ./cmake.nix { - inherit deployAndroidPackage os arch meta; + inherit + deployAndroidPackage + os + arch + meta + ; package = check-version allArchives.packages "cmake" version; } ) cmakeVersions; # All NDK bundles. - ndk-bundles = let - # Creates a NDK bundle. - makeNdkBundle = package: - callPackage ./ndk-bundle { - inherit deployAndroidPackage os arch platform-tools meta package; - }; - in lib.flatten ( - map (version: - let - package = makeNdkBundle (allArchives.packages.ndk-bundle.${ndkVersion} or allArchives.packages.ndk.${ndkVersion}); - in - lib.optional (shouldLink includeNDK [package]) package - ) ndkVersions - ); + ndk-bundles = + let + # Creates a NDK bundle. + makeNdkBundle = + package: + callPackage ./ndk-bundle { + inherit + deployAndroidPackage + os + arch + platform-tools + meta + package + ; + }; + in + lib.flatten ( + map ( + version: + let + package = makeNdkBundle ( + allArchives.packages.ndk-bundle.${ndkVersion} or allArchives.packages.ndk.${ndkVersion} + ); + in + lib.optional (shouldLink includeNDK [ package ]) package + ) ndkVersions + ); # The "default" NDK bundle. - ndk-bundle = if ndk-bundles == [] then null else lib.head ndk-bundles; + ndk-bundle = if ndk-bundles == [ ] then null else lib.head ndk-bundles; # Makes a Google API bundle. - google-apis = map (version: + google-apis = map ( + version: deployAndroidPackage { package = (check-version allArchives "addons" version).google_apis; } ) (builtins.filter (platformVersion: lib.versionOlder platformVersion "26") platformVersions); # API level 26 and higher include Google APIs by default - google-tv-addons = map (version: + google-tv-addons = map ( + version: deployAndroidPackage { package = (check-version allArchives "addons" version).google_tv_addon; } @@ -392,79 +565,143 @@ lib.recurseIntoAttrs rec { # This derivation deploys the tools package and symlinks all the desired # plugins that we want to use. If the license isn't accepted, prints all the licenses # requested and throws. - androidsdk = if !licenseAccepted then throw '' - ${builtins.concatStringsSep "\n\n" (mkLicenseTexts licenseNames)} + androidsdk = + if !licenseAccepted then + throw '' + ${builtins.concatStringsSep "\n\n" (mkLicenseTexts licenseNames)} - You must accept the following licenses: - ${lib.concatMapStringsSep "\n" (str: " - ${str}") licenseNames} + You must accept the following licenses: + ${lib.concatMapStringsSep "\n" (str: " - ${str}") licenseNames} - a) - by setting nixpkgs config option 'android_sdk.accept_license = true;'. - b) - by an environment variable for a single invocation of the nix tools. - $ export NIXPKGS_ACCEPT_ANDROID_SDK_LICENSE=1 - '' else callPackage ./cmdline-tools.nix { - inherit deployAndroidPackage os arch meta; + a) + by setting nixpkgs config option 'android_sdk.accept_license = true;'. + b) + by an environment variable for a single invocation of the nix tools. + $ export NIXPKGS_ACCEPT_ANDROID_SDK_LICENSE=1 + '' + else + callPackage ./cmdline-tools.nix { + inherit + deployAndroidPackage + os + arch + meta + ; - package = cmdline-tools-package; + package = cmdline-tools-package; - postInstall = '' - # Symlink all requested plugins - ${linkPlugin { name = "platform-tools"; plugin = platform-tools; }} - ${linkPlugin { name = "tools"; plugin = tools; check = toolsVersion != null; }} - ${linkPlugins { name = "build-tools"; plugins = build-tools; }} - ${linkPlugin { name = "emulator"; plugin = emulator; check = includeEmulator; }} - ${linkPlugins { name = "platforms"; plugins = platforms; }} - ${linkPlatformPlugins { name = "sources"; plugins = sources; check = includeSources; }} - ${linkPlugins { name = "cmake"; plugins = cmake; check = includeCmake; }} - ${linkNdkPlugins { name = "ndk-bundle"; rootName = "ndk"; plugins = ndk-bundles; check = includeNDK; }} - ${linkNdkPlugin { name = "ndk-bundle"; plugin = ndk-bundle; check = includeNDK; }} - ${linkSystemImages { images = system-images; check = includeSystemImages; }} - ${linkPlatformPlugins { name = "add-ons"; plugins = google-apis; check = useGoogleAPIs; }} - ${linkPlatformPlugins { name = "add-ons"; plugins = google-tv-addons; check = useGoogleTVAddOns; }} + postInstall = '' + # Symlink all requested plugins + ${linkPlugin { + name = "platform-tools"; + plugin = platform-tools; + }} + ${linkPlugin { + name = "tools"; + plugin = tools; + check = toolsVersion != null; + }} + ${linkPlugins { + name = "build-tools"; + plugins = build-tools; + }} + ${linkPlugin { + name = "emulator"; + plugin = emulator; + check = includeEmulator; + }} + ${linkPlugins { + name = "platforms"; + plugins = platforms; + }} + ${linkPlatformPlugins { + name = "sources"; + plugins = sources; + check = includeSources; + }} + ${linkPlugins { + name = "cmake"; + plugins = cmake; + check = includeCmake; + }} + ${linkNdkPlugins { + name = "ndk-bundle"; + rootName = "ndk"; + plugins = ndk-bundles; + check = includeNDK; + }} + ${linkNdkPlugin { + name = "ndk-bundle"; + plugin = ndk-bundle; + check = includeNDK; + }} + ${linkSystemImages { + images = system-images; + check = includeSystemImages; + }} + ${linkPlatformPlugins { + name = "add-ons"; + plugins = google-apis; + check = useGoogleAPIs; + }} + ${linkPlatformPlugins { + name = "add-ons"; + plugins = google-tv-addons; + check = useGoogleTVAddOns; + }} - # Link extras - ${lib.concatMapStrings (identifier: - let - package = allArchives.extras.${identifier}; - path = package.path; - extras = callPackage ./extras.nix { - inherit deployAndroidPackage package os arch meta; - }; - in - '' - targetDir=$(dirname ${path}) - mkdir -p $targetDir - ln -s ${extras}/libexec/android-sdk/${path} $targetDir - '') includeExtras} + # Link extras + ${lib.concatMapStrings ( + identifier: + let + package = allArchives.extras.${identifier}; + path = package.path; + extras = callPackage ./extras.nix { + inherit + deployAndroidPackage + package + os + arch + meta + ; + }; + in + '' + targetDir=$(dirname ${path}) + mkdir -p $targetDir + ln -s ${extras}/libexec/android-sdk/${path} $targetDir + '' + ) includeExtras} - # Expose common executables in bin/ - mkdir -p $out/bin + # Expose common executables in bin/ + mkdir -p $out/bin - for i in ${platform-tools}/bin/*; do - ln -s $i $out/bin - done + for i in ${platform-tools}/bin/*; do + ln -s $i $out/bin + done - ${lib.optionalString (shouldLink includeEmulator [emulator]) '' - for i in ${emulator}/bin/*; do - ln -s $i $out/bin - done - ''} + ${lib.optionalString (shouldLink includeEmulator [ emulator ]) '' + for i in ${emulator}/bin/*; do + ln -s $i $out/bin + done + ''} - find $ANDROID_SDK_ROOT/${cmdline-tools-package.path}/bin -type f -executable | while read i; do - ln -s $i $out/bin - done + find $ANDROID_SDK_ROOT/${cmdline-tools-package.path}/bin -type f -executable | while read i; do + ln -s $i $out/bin + done - # Write licenses - mkdir -p licenses - ${lib.concatMapStrings (licenseName: - let - licenseHashes = builtins.concatStringsSep "\n" (mkLicenseHashes licenseName); - licenseHashFile = writeText "androidenv-${licenseName}" licenseHashes; - in - '' - ln -s ${licenseHashFile} licenses/${licenseName} - '') licenseNames} - ''; - }; + # Write licenses + mkdir -p licenses + ${lib.concatMapStrings ( + licenseName: + let + licenseHashes = builtins.concatStringsSep "\n" (mkLicenseHashes licenseName); + licenseHashFile = writeText "androidenv-${licenseName}" licenseHashes; + in + '' + ln -s ${licenseHashFile} licenses/${licenseName} + '' + ) licenseNames} + ''; + }; } diff --git a/pkgs/development/mobile/androidenv/default.nix b/pkgs/development/mobile/androidenv/default.nix index 70178c15dc3f..ddcc3219d037 100644 --- a/pkgs/development/mobile/androidenv/default.nix +++ b/pkgs/development/mobile/androidenv/default.nix @@ -2,7 +2,8 @@ lib, config, pkgs ? import { }, - licenseAccepted ? config.android_sdk.accept_license or (builtins.getEnv "NIXPKGS_ACCEPT_ANDROID_SDK_LICENSE" == "1"), + licenseAccepted ? + config.android_sdk.accept_license or (builtins.getEnv "NIXPKGS_ACCEPT_ANDROID_SDK_LICENSE" == "1"), }: lib.recurseIntoAttrs rec { diff --git a/pkgs/development/mobile/androidenv/deploy-androidpackages.nix b/pkgs/development/mobile/androidenv/deploy-androidpackages.nix index 4c2e8df611d6..1a4e8b9fb780 100644 --- a/pkgs/development/mobile/androidenv/deploy-androidpackages.nix +++ b/pkgs/development/mobile/androidenv/deploy-androidpackages.nix @@ -1,30 +1,59 @@ -{stdenv, lib, unzip, mkLicenses, os, arch, meta}: -{packages, nativeBuildInputs ? [], buildInputs ? [], patchesInstructions ? {}, ...}@args: +{ + stdenv, + lib, + unzip, + mkLicenses, + os, + arch, + meta, +}: +{ + packages, + nativeBuildInputs ? [ ], + buildInputs ? [ ], + patchesInstructions ? { }, + ... +}@args: let - extraParams = removeAttrs args [ "packages" "os" "buildInputs" "nativeBuildInputs" "patchesInstructions" ]; + extraParams = removeAttrs args [ + "packages" + "os" + "buildInputs" + "nativeBuildInputs" + "patchesInstructions" + ]; sortedPackages = builtins.sort (x: y: builtins.lessThan x.name y.name) packages; - mkXmlAttrs = attrs: - lib.concatStrings (lib.mapAttrsToList (name: value: " ${name}=\"${value}\"") attrs); - mkXmlValues = attrs: - lib.concatStrings (lib.mapAttrsToList (name: value: - let - tag = builtins.head (builtins.match "([^:]+).*" name); - in + mkXmlAttrs = + attrs: lib.concatStrings (lib.mapAttrsToList (name: value: " ${name}=\"${value}\"") attrs); + mkXmlValues = + attrs: + lib.concatStrings ( + lib.mapAttrsToList ( + name: value: + let + tag = builtins.head (builtins.match "([^:]+).*" name); + in if builtins.typeOf value == "string" then "<${tag}>${value}" else mkXmlDoc name value - ) attrs); - mkXmlDoc = name: doc: - let - tag = builtins.head (builtins.match "([^:]+).*" name); - hasXmlAttrs = builtins.hasAttr "element-attributes" doc; - xmlValues = removeAttrs doc [ "element-attributes" ]; - hasXmlValues = builtins.length (builtins.attrNames xmlValues) > 0; - in - if hasXmlAttrs && hasXmlValues then "<${tag}${mkXmlAttrs doc.element-attributes}>${mkXmlValues xmlValues }" - else if hasXmlAttrs && !hasXmlValues then "<${tag}${mkXmlAttrs doc.element-attributes}/>" - else if !hasXmlAttrs && hasXmlValues then "<${tag}>${mkXmlValues xmlValues}" - else "<${tag}/>"; + ) attrs + ); + mkXmlDoc = + name: doc: + let + tag = builtins.head (builtins.match "([^:]+).*" name); + hasXmlAttrs = builtins.hasAttr "element-attributes" doc; + xmlValues = removeAttrs doc [ "element-attributes" ]; + hasXmlValues = builtins.length (builtins.attrNames xmlValues) > 0; + in + if hasXmlAttrs && hasXmlValues then + "<${tag}${mkXmlAttrs doc.element-attributes}>${mkXmlValues xmlValues}" + else if hasXmlAttrs && !hasXmlValues then + "<${tag}${mkXmlAttrs doc.element-attributes}/>" + else if !hasXmlAttrs && hasXmlValues then + "<${tag}>${mkXmlValues xmlValues}" + else + "<${tag}/>"; mkXmlPackage = package: '' ${lib.concatStringsSep "---" (mkLicenses package.license)} + if (lib.hasAttrByPath [ "obsolete" ] package) then package.obsolete else "false" + }"> ${mkXmlDoc "type-details" package.type-details} ${mkXmlDoc "revision" package.revision-details} - ${lib.optionalString (lib.hasAttrByPath [ "dependencies" ] package) - (mkXmlDoc "dependencies" package.dependencies) - } + ${lib.optionalString (lib.hasAttrByPath [ "dependencies" ] package) ( + mkXmlDoc "dependencies" package.dependencies + )} ${package.displayName} ''; in -stdenv.mkDerivation ({ - inherit buildInputs; - pname = "android-sdk-${lib.concatMapStringsSep "-" (package: package.name) sortedPackages}"; - version = lib.concatMapStringsSep "-" (package: package.revision) sortedPackages; - src = lib.flatten (map (package: package.archives) packages); - inherit os arch; - nativeBuildInputs = [ unzip ] ++ nativeBuildInputs; - preferLocalBuild = true; +stdenv.mkDerivation ( + { + inherit buildInputs; + pname = "android-sdk-${lib.concatMapStringsSep "-" (package: package.name) sortedPackages}"; + version = lib.concatMapStringsSep "-" (package: package.revision) sortedPackages; + src = lib.flatten (map (package: package.archives) packages); + inherit os arch; + nativeBuildInputs = [ unzip ] ++ nativeBuildInputs; + preferLocalBuild = true; - unpackPhase = '' - runHook preUnpack - if [ -z "$src" ]; then - echo "$pname did not have any sources available for os=$os, arch=$arch." >&2 - echo "Are packages available for this architecture?" >&2 - exit 1 - fi - buildDir=$PWD - i=0 - for srcArchive in $src; do - extractedZip="extractedzip-$i" - i=$((i+1)) - cd "$buildDir" - mkdir "$extractedZip" - cd "$extractedZip" - unpackFile "$srcArchive" - done - runHook postUnpack - ''; + unpackPhase = '' + runHook preUnpack + if [ -z "$src" ]; then + echo "$pname did not have any sources available for os=$os, arch=$arch." >&2 + echo "Are packages available for this architecture?" >&2 + exit 1 + fi + buildDir=$PWD + i=0 + for srcArchive in $src; do + extractedZip="extractedzip-$i" + i=$((i+1)) + cd "$buildDir" + mkdir "$extractedZip" + cd "$extractedZip" + unpackFile "$srcArchive" + done + runHook postUnpack + ''; - installPhase = '' - runHook preInstall - '' + lib.concatStrings (lib.imap0 (i: package: '' - cd $buildDir/extractedzip-${toString i} + installPhase = + '' + runHook preInstall + '' + + lib.concatStrings ( + lib.imap0 (i: package: '' + cd $buildDir/extractedzip-${toString i} - # Most Android Zip packages have a root folder, but some don't. We unpack - # the zip file in a folder and we try to discover whether it has a single root - # folder. If this is the case, we adjust the current working folder. - if [ "$(find . -mindepth 1 -maxdepth 1 -type d | wc -l)" -eq 1 ]; then - cd "$(find . -mindepth 1 -maxdepth 1 -type d)" - fi - extractedZip="$PWD" + # Most Android Zip packages have a root folder, but some don't. We unpack + # the zip file in a folder and we try to discover whether it has a single root + # folder. If this is the case, we adjust the current working folder. + if [ "$(find . -mindepth 1 -maxdepth 1 -type d | wc -l)" -eq 1 ]; then + cd "$(find . -mindepth 1 -maxdepth 1 -type d)" + fi + extractedZip="$PWD" - packageBaseDir=$out/libexec/android-sdk/${package.path} - mkdir -p $packageBaseDir - cd $packageBaseDir - cp -a $extractedZip/* . - ${patchesInstructions.${package.name}} + packageBaseDir=$out/libexec/android-sdk/${package.path} + mkdir -p $packageBaseDir + cd $packageBaseDir + cp -a $extractedZip/* . + ${patchesInstructions.${package.name}} - if [ ! -f $packageBaseDir/package.xml ]; then - cat << EOF > $packageBaseDir/package.xml - ${mkXmlPackage package} - EOF - fi - '') packages) + '' - runHook postInstall - ''; + if [ ! -f $packageBaseDir/package.xml ]; then + cat << EOF > $packageBaseDir/package.xml + ${mkXmlPackage package} + EOF + fi + '') packages + ) + + '' + runHook postInstall + ''; - # Some executables that have been patched with patchelf may not work any longer after they have been stripped. - dontStrip = true; - dontPatchELF = true; - dontAutoPatchelf = true; + # Some executables that have been patched with patchelf may not work any longer after they have been stripped. + dontStrip = true; + dontPatchELF = true; + dontAutoPatchelf = true; - inherit meta; -} // extraParams) + inherit meta; + } + // extraParams +) diff --git a/pkgs/development/mobile/androidenv/emulator.nix b/pkgs/development/mobile/androidenv/emulator.nix index 542435845497..e513b7df1b0d 100644 --- a/pkgs/development/mobile/androidenv/emulator.nix +++ b/pkgs/development/mobile/androidenv/emulator.nix @@ -1,27 +1,44 @@ -{ deployAndroidPackage, lib, stdenv, package, os, arch, autoPatchelfHook, makeWrapper, pkgs, pkgsi686Linux, postInstall, meta }: +{ + deployAndroidPackage, + lib, + stdenv, + package, + os, + arch, + autoPatchelfHook, + makeWrapper, + pkgs, + pkgsi686Linux, + postInstall, + meta, +}: deployAndroidPackage { inherit package os arch; - nativeBuildInputs = [ makeWrapper ] - ++ lib.optionals (os == "linux") [ autoPatchelfHook ]; - buildInputs = lib.optionals (os == "linux") (with pkgs; [ - glibc - libcxx - libGL - libpulseaudio - libtiff - libuuid - zlib - libbsd - ncurses5 - libdrm - stdenv.cc.cc - expat - freetype - nss - nspr - alsa-lib - ]) ++ (with pkgs.xorg; [ + nativeBuildInputs = [ makeWrapper ] ++ lib.optionals (os == "linux") [ autoPatchelfHook ]; + buildInputs = + lib.optionals (os == "linux") ( + with pkgs; + [ + glibc + libcxx + libGL + libpulseaudio + libtiff + libuuid + zlib + libbsd + ncurses5 + libdrm + stdenv.cc.cc + expat + freetype + nss + nspr + alsa-lib + ] + ) + ++ (with pkgs.xorg; [ libX11 libXext libXdamage @@ -35,7 +52,8 @@ deployAndroidPackage { libICE libSM libxkbfile - ]) ++ lib.optional (os == "linux" && stdenv.isx86_64) pkgsi686Linux.glibc; + ]) + ++ lib.optional (os == "linux" && stdenv.isx86_64) pkgsi686Linux.glibc; patchInstructions = lib.optionalString (os == "linux") '' addAutoPatchelfSearchPath $packageBaseDir/lib addAutoPatchelfSearchPath $packageBaseDir/lib64 @@ -52,10 +70,12 @@ deployAndroidPackage { # Wrap emulator so that it can load required libraries at runtime wrapProgram $out/libexec/android-sdk/emulator/emulator \ - --prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath [ - pkgs.dbus - pkgs.systemd - ]} \ + --prefix LD_LIBRARY_PATH : ${ + lib.makeLibraryPath [ + pkgs.dbus + pkgs.systemd + ] + } \ --set QT_XKB_CONFIG_ROOT ${pkgs.xkeyboard_config}/share/X11/xkb \ --set QTCOMPOSE ${pkgs.xorg.libX11.out}/share/X11/locale diff --git a/pkgs/development/mobile/androidenv/examples/shell-with-emulator.nix b/pkgs/development/mobile/androidenv/examples/shell-with-emulator.nix index 1de99c6a0f9b..d99f62572b29 100644 --- a/pkgs/development/mobile/androidenv/examples/shell-with-emulator.nix +++ b/pkgs/development/mobile/androidenv/examples/shell-with-emulator.nix @@ -186,22 +186,25 @@ pkgs.mkShell rec { jdk ]; } - (pkgs.lib.optionalString emulatorSupported '' - export ANDROID_USER_HOME=$PWD/.android - mkdir -p $ANDROID_USER_HOME + ( + pkgs.lib.optionalString emulatorSupported '' + export ANDROID_USER_HOME=$PWD/.android + mkdir -p $ANDROID_USER_HOME - avdmanager delete avd -n testAVD || true - echo "" | avdmanager create avd --force --name testAVD --package 'system-images;android-35;google_apis;x86_64' - result=$(avdmanager list avd) + avdmanager delete avd -n testAVD || true + echo "" | avdmanager create avd --force --name testAVD --package 'system-images;android-35;google_apis;x86_64' + result=$(avdmanager list avd) - if [[ ! $result =~ "Name: testAVD" ]]; then - echo "avdmanager couldn't create the avd! The output is :''${result}" - exit 1 - fi + if [[ ! $result =~ "Name: testAVD" ]]; then + echo "avdmanager couldn't create the avd! The output is :''${result}" + exit 1 + fi - avdmanager delete avd -n testAVD || true - '' + '' - touch $out - ''); + avdmanager delete avd -n testAVD || true + '' + + '' + touch $out + '' + ); }; } diff --git a/pkgs/development/mobile/androidenv/examples/shell.nix b/pkgs/development/mobile/androidenv/examples/shell.nix index 9cda34c2cb48..254e421848ea 100644 --- a/pkgs/development/mobile/androidenv/examples/shell.nix +++ b/pkgs/development/mobile/androidenv/examples/shell.nix @@ -1,14 +1,15 @@ { # If you copy this example out of nixpkgs, use these lines instead of the next. # This example pins nixpkgs: https://nix.dev/tutorials/first-steps/towards-reproducibility-pinning-nixpkgs.html - /*nixpkgsSource ? (builtins.fetchTarball { - name = "nixpkgs-20.09"; - url = "https://github.com/NixOS/nixpkgs/archive/20.09.tar.gz"; - sha256 = "1wg61h4gndm3vcprdcg7rc4s1v3jkm5xd7lw8r2f67w502y94gcy"; - }), - pkgs ? import nixpkgsSource { - config.allowUnfree = true; - }, + /* + nixpkgsSource ? (builtins.fetchTarball { + name = "nixpkgs-20.09"; + url = "https://github.com/NixOS/nixpkgs/archive/20.09.tar.gz"; + sha256 = "1wg61h4gndm3vcprdcg7rc4s1v3jkm5xd7lw8r2f67w502y94gcy"; + }), + pkgs ? import nixpkgsSource { + config.allowUnfree = true; + }, */ # If you want to use the in-tree version of nixpkgs: @@ -25,16 +26,18 @@ # Copy this file to your Android project. let # If you copy this example out of nixpkgs, something like this will work: - /*androidEnvNixpkgs = fetchTarball { - name = "androidenv"; - url = "https://github.com/NixOS/nixpkgs/archive/.tar.gz"; - sha256 = ""; - }; + /* + androidEnvNixpkgs = fetchTarball { + name = "androidenv"; + url = "https://github.com/NixOS/nixpkgs/archive/.tar.gz"; + sha256 = ""; + }; - androidEnv = pkgs.callPackage "${androidEnvNixpkgs}/pkgs/development/mobile/androidenv" { - inherit config pkgs; - licenseAccepted = true; - };*/ + androidEnv = pkgs.callPackage "${androidEnvNixpkgs}/pkgs/development/mobile/androidenv" { + inherit config pkgs; + licenseAccepted = true; + }; + */ # Otherwise, just use the in-tree androidenv: androidEnv = pkgs.callPackage ./.. { @@ -51,30 +54,48 @@ let includeNDK = "if-supported"; useGoogleAPIs = true; - platformVersions = [ "23" "24" "25" "26" "27" "28" "29" "30" "31" "32" "33" "34" "35" ]; + platformVersions = [ + "23" + "24" + "25" + "26" + "27" + "28" + "29" + "30" + "31" + "32" + "33" + "34" + "35" + ]; # If you want to use a custom repo JSON: # repoJson = ../repo.json; # If you want to use custom repo XMLs: - /*repoXmls = { - packages = [ ../xml/repository2-1.xml ]; - images = [ - ../xml/android-sys-img2-1.xml - ../xml/android-tv-sys-img2-1.xml - ../xml/android-wear-sys-img2-1.xml - ../xml/android-wear-cn-sys-img2-1.xml - ../xml/google_apis-sys-img2-1.xml - ../xml/google_apis_playstore-sys-img2-1.xml - ]; - addons = [ ../xml/addon2-1.xml ]; - };*/ + /* + repoXmls = { + packages = [ ../xml/repository2-1.xml ]; + images = [ + ../xml/android-sys-img2-1.xml + ../xml/android-tv-sys-img2-1.xml + ../xml/android-wear-sys-img2-1.xml + ../xml/android-wear-cn-sys-img2-1.xml + ../xml/google_apis-sys-img2-1.xml + ../xml/google_apis_playstore-sys-img2-1.xml + ]; + addons = [ ../xml/addon2-1.xml ]; + }; + */ - includeExtras = [ - "extras;google;gcm" - ] ++ pkgs.lib.optionals includeAuto [ - "extras;google;auto" - ]; + includeExtras = + [ + "extras;google;gcm" + ] + ++ pkgs.lib.optionals includeAuto [ + "extras;google;auto" + ]; # Accepting more licenses declaratively: extraLicenses = [ @@ -99,7 +120,11 @@ let in pkgs.mkShell rec { name = "androidenv-demo"; - packages = [ androidSdk platformTools jdk ]; + packages = [ + androidSdk + platformTools + jdk + ]; LANG = "C.UTF-8"; LC_ALL = "C.UTF-8"; @@ -128,53 +153,64 @@ pkgs.mkShell rec { passthru.tests = { - shell-sdkmanager-licenses-test = pkgs.runCommand "shell-sdkmanager-licenses-test" { - nativeBuildInputs = [ androidSdk jdk ]; - } '' - if [[ ! "$(sdkmanager --licenses)" =~ "All SDK package licenses accepted." ]]; then - echo "At least one of SDK package licenses are not accepted." - exit 1 - fi - touch $out - ''; + shell-sdkmanager-licenses-test = + pkgs.runCommand "shell-sdkmanager-licenses-test" + { + nativeBuildInputs = [ + androidSdk + jdk + ]; + } + '' + if [[ ! "$(sdkmanager --licenses)" =~ "All SDK package licenses accepted." ]]; then + echo "At least one of SDK package licenses are not accepted." + exit 1 + fi + touch $out + ''; - shell-sdkmanager-packages-test = pkgs.runCommand "shell-sdkmanager-packages-test" { - nativeBuildInputs = [ androidSdk jdk ]; - } '' - output="$(sdkmanager --list)" - installed_packages_section=$(echo "''${output%%Available Packages*}" | awk 'NR>4 {print $1}') + shell-sdkmanager-packages-test = + pkgs.runCommand "shell-sdkmanager-packages-test" + { + nativeBuildInputs = [ + androidSdk + jdk + ]; + } + '' + output="$(sdkmanager --list)" + installed_packages_section=$(echo "''${output%%Available Packages*}" | awk 'NR>4 {print $1}') - # FIXME couldn't find platforms;android-34, even though it's in the correct directory!! sdkmanager's bug?! - packages=( - "build-tools" "platform-tools" \ - "platforms;android-23" "platforms;android-24" "platforms;android-25" "platforms;android-26" \ - "platforms;android-27" "platforms;android-28" "platforms;android-29" "platforms;android-30" \ - "platforms;android-31" "platforms;android-32" "platforms;android-33" "platforms;android-35" \ - "sources;android-23" "sources;android-24" "sources;android-25" "sources;android-26" \ - "sources;android-27" "sources;android-28" "sources;android-29" "sources;android-30" \ - "sources;android-31" "sources;android-32" "sources;android-33" "sources;android-34" \ - "sources;android-35" \ - "system-images;android-28;google_apis_playstore;x86_64" \ - "system-images;android-29;google_apis_playstore;x86_64" \ - "system-images;android-30;google_apis_playstore;x86_64" \ - "system-images;android-31;google_apis_playstore;x86_64" \ - "system-images;android-32;google_apis_playstore;x86_64" \ - "system-images;android-33;google_apis_playstore;x86_64" \ - "system-images;android-34;google_apis;x86_64" \ - "system-images;android-35;google_apis;x86_64" \ - "extras;google;gcm" - ) - ${pkgs.lib.optionalString includeAuto ''packages+=("extras;google;auto")''} + # FIXME couldn't find platforms;android-34, even though it's in the correct directory!! sdkmanager's bug?! + packages=( + "build-tools" "platform-tools" \ + "platforms;android-23" "platforms;android-24" "platforms;android-25" "platforms;android-26" \ + "platforms;android-27" "platforms;android-28" "platforms;android-29" "platforms;android-30" \ + "platforms;android-31" "platforms;android-32" "platforms;android-33" "platforms;android-35" \ + "sources;android-23" "sources;android-24" "sources;android-25" "sources;android-26" \ + "sources;android-27" "sources;android-28" "sources;android-29" "sources;android-30" \ + "sources;android-31" "sources;android-32" "sources;android-33" "sources;android-34" \ + "sources;android-35" \ + "system-images;android-28;google_apis_playstore;x86_64" \ + "system-images;android-29;google_apis_playstore;x86_64" \ + "system-images;android-30;google_apis_playstore;x86_64" \ + "system-images;android-31;google_apis_playstore;x86_64" \ + "system-images;android-32;google_apis_playstore;x86_64" \ + "system-images;android-33;google_apis_playstore;x86_64" \ + "system-images;android-34;google_apis;x86_64" \ + "system-images;android-35;google_apis;x86_64" \ + "extras;google;gcm" + ) + ${pkgs.lib.optionalString includeAuto ''packages+=("extras;google;auto")''} - for package in "''${packages[@]}"; do - if [[ ! $installed_packages_section =~ "$package" ]]; then - echo "$package package was not installed." - exit 1 - fi - done + for package in "''${packages[@]}"; do + if [[ ! $installed_packages_section =~ "$package" ]]; then + echo "$package package was not installed." + exit 1 + fi + done - touch "$out" - ''; + touch "$out" + ''; }; } - diff --git a/pkgs/development/mobile/androidenv/ndk-bundle/default.nix b/pkgs/development/mobile/androidenv/ndk-bundle/default.nix index dd5f0e0b2b47..ba1d9ea3e81b 100644 --- a/pkgs/development/mobile/androidenv/ndk-bundle/default.nix +++ b/pkgs/development/mobile/androidenv/ndk-bundle/default.nix @@ -1,18 +1,47 @@ -{ stdenv, lib, pkgs, pkgsHostHost, makeWrapper, autoPatchelfHook -, deployAndroidPackage, package, os, arch, platform-tools, meta +{ + stdenv, + lib, + pkgs, + pkgsHostHost, + makeWrapper, + autoPatchelfHook, + deployAndroidPackage, + package, + os, + arch, + platform-tools, + meta, }: let - runtime_paths = lib.makeBinPath (with pkgsHostHost; [ - coreutils file findutils gawk gnugrep gnused jdk python3 which - ]) + ":${platform-tools}/platform-tools"; + runtime_paths = + lib.makeBinPath ( + with pkgsHostHost; + [ + coreutils + file + findutils + gawk + gnugrep + gnused + jdk + python3 + which + ] + ) + + ":${platform-tools}/platform-tools"; in deployAndroidPackage rec { inherit package os arch; - nativeBuildInputs = [ makeWrapper ] - ++ lib.optionals stdenv.hostPlatform.isLinux [ autoPatchelfHook ]; + nativeBuildInputs = [ + makeWrapper + ] ++ lib.optionals stdenv.hostPlatform.isLinux [ autoPatchelfHook ]; autoPatchelfIgnoreMissingDeps = [ "*" ]; - buildInputs = lib.optionals (os == "linux") [ pkgs.zlib pkgs.libcxx (lib.getLib stdenv.cc.cc) ]; + buildInputs = lib.optionals (os == "linux") [ + pkgs.zlib + pkgs.libcxx + (lib.getLib stdenv.cc.cc) + ]; patchElfBnaries = '' # Patch the executables of the toolchains, but not the libraries -- they are needed for crosscompiling @@ -70,8 +99,8 @@ deployAndroidPackage rec { done ''; - patchInstructions = patchOsAgnostic - + lib.optionalString stdenv.hostPlatform.isLinux patchElfBnaries; + patchInstructions = + patchOsAgnostic + lib.optionalString stdenv.hostPlatform.isLinux patchElfBnaries; noAuditTmpdir = true; # Audit script gets invoked by the build/ component in the path for the make standalone script diff --git a/pkgs/development/mobile/androidenv/platform-tools.nix b/pkgs/development/mobile/androidenv/platform-tools.nix index 171f12a67c33..f1fab2e5eb2e 100644 --- a/pkgs/development/mobile/androidenv/platform-tools.nix +++ b/pkgs/development/mobile/androidenv/platform-tools.nix @@ -1,21 +1,37 @@ -{deployAndroidPackage, lib, package, os, arch, autoPatchelfHook, pkgs, meta}: +{ + deployAndroidPackage, + lib, + package, + os, + arch, + autoPatchelfHook, + pkgs, + meta, +}: deployAndroidPackage { inherit package os arch; nativeBuildInputs = lib.optionals (os == "linux") [ autoPatchelfHook ]; - buildInputs = lib.optionals (os == "linux") [ pkgs.glibc (lib.getLib pkgs.stdenv.cc.cc) pkgs.zlib pkgs.ncurses5 ]; + buildInputs = lib.optionals (os == "linux") [ + pkgs.glibc + (lib.getLib pkgs.stdenv.cc.cc) + pkgs.zlib + pkgs.ncurses5 + ]; - patchInstructions = lib.optionalString (os == "linux") '' - addAutoPatchelfSearchPath $packageBaseDir/lib64 - autoPatchelf --no-recurse $packageBaseDir/lib64 - autoPatchelf --no-recurse $packageBaseDir - '' + '' - mkdir -p $out/bin - cd $out/bin - find $out/libexec/android-sdk/platform-tools -type f -executable -mindepth 1 -maxdepth 1 -not -name sqlite3 | while read i - do - ln -s $i - done - ''; + patchInstructions = + lib.optionalString (os == "linux") '' + addAutoPatchelfSearchPath $packageBaseDir/lib64 + autoPatchelf --no-recurse $packageBaseDir/lib64 + autoPatchelf --no-recurse $packageBaseDir + '' + + '' + mkdir -p $out/bin + cd $out/bin + find $out/libexec/android-sdk/platform-tools -type f -executable -mindepth 1 -maxdepth 1 -not -name sqlite3 | while read i + do + ln -s $i + done + ''; inherit meta; } diff --git a/pkgs/development/mobile/androidenv/tools.nix b/pkgs/development/mobile/androidenv/tools.nix index 443f82f6a098..0ed6bc86b544 100644 --- a/pkgs/development/mobile/androidenv/tools.nix +++ b/pkgs/development/mobile/androidenv/tools.nix @@ -1,17 +1,48 @@ -{deployAndroidPackage, lib, stdenv, package, os, arch, autoPatchelfHook, makeWrapper, pkgs, pkgsi686Linux, postInstall, meta}: +{ + deployAndroidPackage, + lib, + stdenv, + package, + os, + arch, + autoPatchelfHook, + makeWrapper, + pkgs, + pkgsi686Linux, + postInstall, + meta, +}: deployAndroidPackage { name = "androidsdk-tools"; inherit package os arch; - nativeBuildInputs = [ makeWrapper ] - ++ lib.optionals (os == "linux") [ autoPatchelfHook ]; + nativeBuildInputs = [ makeWrapper ] ++ lib.optionals (os == "linux") [ autoPatchelfHook ]; buildInputs = lib.optional (os == "linux") ( - (with pkgs; [ glibc freetype fontconfig fontconfig.lib - stdenv.cc.cc.libgcc or null # fix for https://github.com/NixOS/nixpkgs/issues/226357 - ]) - ++ (with pkgs.xorg; [ libX11 libXrender libXext ]) - ++ lib.optionals (os == "linux" && stdenv.isx86_64) (with pkgsi686Linux; [ glibc xorg.libX11 xorg.libXrender xorg.libXext fontconfig.lib freetype zlib ]) - ); + (with pkgs; [ + glibc + freetype + fontconfig + fontconfig.lib + stdenv.cc.cc.libgcc or null # fix for https://github.com/NixOS/nixpkgs/issues/226357 + ]) + ++ (with pkgs.xorg; [ + libX11 + libXrender + libXext + ]) + ++ lib.optionals (os == "linux" && stdenv.isx86_64) ( + with pkgsi686Linux; + [ + glibc + xorg.libX11 + xorg.libXrender + xorg.libXext + fontconfig.lib + freetype + zlib + ] + ) + ); patchInstructions = '' ${lib.optionalString (os == "linux") '' @@ -31,7 +62,15 @@ deployAndroidPackage { # Wrap monitor script wrapProgram $PWD/monitor \ --prefix PATH : ${pkgs.jdk8}/bin \ - --prefix LD_LIBRARY_PATH : ${lib.makeLibraryPath (with pkgs; [ xorg.libX11 xorg.libXtst ])} + --prefix LD_LIBRARY_PATH : ${ + lib.makeLibraryPath ( + with pkgs; + [ + xorg.libX11 + xorg.libXtst + ] + ) + } # Patch all script shebangs patchShebangs .