summary refs log tree commit diff
path: root/pkgs/development/mobile/androidenv/deploy-androidpackage.nix
blob: 839a14f7033c39e1807796fb35d0ce5f59db55bc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
{stdenv, unzip}:
{package, os ? null, buildInputs ? [], patchInstructions ? "", meta ? {}, ...}@args:

let
  extraParams = removeAttrs args [ "package" "os" "buildInputs" "patchInstructions" ];
in
stdenv.mkDerivation ({
  name = package.name + "-" + package.revision;
  src = if os != null && builtins.hasAttr os package.archives then package.archives.${os} else package.archives.all;
  buildInputs = [ unzip ] ++ buildInputs;
  preferLocalBuild = true;

  # 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.
  unpackPhase = ''
    mkdir extractedzip
    cd extractedzip
    unpackFile "$src"
    if [ "$(find . -mindepth 1 -maxdepth 1 -type d | wc -l)" -eq 1 ]
    then
        cd "$(find . -mindepth 1 -maxdepth 1 -type d)"
    fi
    sourceRoot="$PWD"
  '';

  installPhase = ''
    packageBaseDir=$out/libexec/android-sdk/${package.path}
    mkdir -p $packageBaseDir
    cd $packageBaseDir
    cp -av $sourceRoot/* .
    ${patchInstructions}
  '';

  # We never attempt to strip. This is not required since we're doing binary
  # deployments. Moreover, some executables that have been patched with patchelf
  # may not work any longer after they have been stripped.
  dontStrip = true;
  dontPatchELF = true;
  dontAutoPatchelf = true;

  meta = {
    description = package.displayName;
  } // meta;
} // extraParams)