summary refs log tree commit diff
path: root/pkgs/os-specific/linux/bionic-prebuilt/default.nix
blob: da5011e67373476fc709fd9fcd271a664c949a61 (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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
{ stdenv, stdenvNoCC, lib, fetchzip, pkgs
, enableStatic ? stdenv.hostPlatform.isStatic
, enableShared ? !stdenv.hostPlatform.isStatic
}:
let

  choosePlatform =
    let pname = stdenv.targetPlatform.parsed.cpu.name; in
    pset: pset.${pname} or (throw "bionic-prebuilt: unsupported platform ${pname}");

  prebuilt_crt = choosePlatform {
    aarch64 = fetchzip {
      url =  "https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/+archive/98dce673ad97a9640c5d90bbb1c718e75c21e071/lib/gcc/aarch64-linux-android/4.9.x.tar.gz";
      sha256 = "sha256-LLD2OJi78sNN5NulOsJZl7Ei4F1EUYItGG6eUsKWULc=";
      stripRoot = false;
    };
    x86_64 = fetchzip {
      url = "https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.9/+archive/7e8507d2a2d4df3bced561b894576de70f065be4/lib/gcc/x86_64-linux-android/4.9.x.tar.gz";
      sha256 = "sha256-y7CFLF76pTlj+oYev9taBnL2nlT3+Tx8c6wmicWmKEw=";
      stripRoot = false;
    };
  };

  prebuilt_libs = choosePlatform {
    aarch64 = fetchzip {
      url = "https://android.googlesource.com/platform/prebuilts/ndk/+archive/f2c77d8ba8a7f5c2d91771e31164f29be0b8ff98/platform/platforms/android-30/arch-arm64/usr/lib.tar.gz";
      sha256 = "sha256-TZBV7+D1QvKOCEi+VNGT5SStkgj0xRbyWoLH65zSrjw=";
      stripRoot = false;
    };
    x86_64 = fetchzip {
      url = "https://android.googlesource.com/platform/prebuilts/ndk/+archive/f2c77d8ba8a7f5c2d91771e31164f29be0b8ff98/platform/platforms/android-30/arch-x86_64/usr/lib64.tar.gz";
      sha256 = "sha256-n2EuOKy3RGKmEYofNlm+vDDBuiQRuAJEJT6wq6NEJQs=";
      stripRoot = false;
    };
  };

  prebuilt_ndk_crt = choosePlatform {
    aarch64 = fetchzip {
      url = "https://android.googlesource.com/toolchain/prebuilts/ndk/r23/+archive/6c5fa4c0d3999b9ee932f6acbd430eb2f31f3151/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/30.tar.gz";
      sha256 = "sha256-KHw+cCwAwlm+5Nwp1o8WONqdi4BBDhFaVVr+7GxQ5uE=";
      stripRoot = false;
    };
    x86_64 = fetchzip {
      url = "https://android.googlesource.com/toolchain/prebuilts/ndk/r23/+archive/6c5fa4c0d3999b9ee932f6acbd430eb2f31f3151/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/x86_64-linux-android/30.tar.gz";
      sha256 = "sha256-XEd7L3cBzn+1pKfji40V92G/uZhHSMMuZcRZaiKkLnk=";
      stripRoot = false;
    };
  };

  ndk_support_headers = fetchzip {
    url ="https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/+archive/0e7f808fa26cce046f444c9616d9167dafbfb272/clang-r416183b/include/c++/v1/support.tar.gz";
    sha256 = "sha256-NBv7Pk1CEaz8ns9moleEERr3x/rFmVmG33LgFSeO6fY=";
    stripRoot = false;
  };

  kernelHeaders = pkgs.makeLinuxHeaders {
    version = "android-common-11-5.4";
    src = fetchzip {
      url = "https://android.googlesource.com/kernel/common/+archive/48ffcbf0b9e7f0280bfb8c32c68da0aaf0fdfef6.tar.gz";
      sha256 = "1y7cmlmcr5vdqydd9n785s139yc4aylc3zhqa59xsylmkaf5habk";
      stripRoot = false;
    };
  };

in
stdenvNoCC.mkDerivation rec {
  pname = "bionic-prebuilt";
  version = "ndk-release-r23";
  name = "${stdenv.targetPlatform.parsed.cpu.name}-${pname}-${version}";

  src = fetchzip {
    url = "https://android.googlesource.com/platform/bionic/+archive/00e8ce1142d8823b0d2fc8a98b40119b0f1f02cd.tar.gz";
    sha256 = "10z5mp4w0acvjvgxv7wlqa7m70hcyarmjdlfxbd9rwzf4mrsr8d1";
    stripRoot = false;
  };

  NIX_DONT_SET_RPATH = true;

  dontConfigure = true;
  dontBuild = true;

  patches = [
    ./ndk-version.patch
  ];

  postPatch = ''
    substituteInPlace libc/include/sys/cdefs.h --replace \
      "__has_builtin(__builtin_umul_overflow)" "1"
    substituteInPlace libc/include/bits/ioctl.h --replace \
      "!defined(BIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD)" "0"
  '';

  installPhase= ''
    # copy the bionic headers
    mkdir -p $out/include/support $out/include/android
    cp -vr libc/include/* $out/include
    # copy the kernel headers
    cp -vr ${kernelHeaders}/include/*  $out/include/

    chmod -R +w $out/include/linux

    # fix a bunch of kernel headers so that things can actually be found
    sed -i 's,struct epoll_event {,#include <bits/epoll_event.h>\nstruct Xepoll_event {,' $out/include/linux/eventpoll.h
    sed -i 's,struct in_addr {,typedef unsigned int in_addr_t;\nstruct in_addr {,' $out/include/linux/in.h
    sed -i 's,struct udphdr {,struct Xudphdr {,' $out/include/linux/udp.h
    sed -i 's,union semun {,union Xsemun {,' $out/include/linux/sem.h
    sed -i 's,struct __kernel_sockaddr_storage,#define sockaddr_storage __kernel_sockaddr_storage\nstruct __kernel_sockaddr_storage,' $out/include/linux/socket.h
    sed -i 's,#ifndef __UAPI_DEF_.*$,#if 1,' $out/include/linux/libc-compat.h
    substituteInPlace $out/include/linux/in.h --replace "__be32		imr_" "struct in_addr		imr_"
    substituteInPlace $out/include/linux/in.h --replace "__be32		imsf_" "struct in_addr		imsf_"
    substituteInPlace $out/include/linux/sysctl.h --replace "__unused" "_unused"

    # what could possibly live in <linux/compiler.h>
    touch $out/include/linux/compiler.h

    # copy the support headers
    cp -vr ${ndk_support_headers}* $out/include/support/

    mkdir $out/lib
    cp -v ${prebuilt_crt.out}/*.o $out/lib/
    cp -v ${prebuilt_crt.out}/libgcc.a $out/lib/
    cp -v ${prebuilt_ndk_crt.out}/*.o $out/lib/
  '' + lib.optionalString enableShared ''
    for i in libc.so libm.so libdl.so liblog.so; do
      cp -v ${prebuilt_libs.out}/$i $out/lib/
    done
  '' + lib.optionalString enableStatic ''
    # no liblog.a; while it's also part of the base libraries,
    # it's only available as shared object in the prebuilts.
    for i in libc.a libm.a libdl.a; do
      cp -v ${prebuilt_ndk_crt.out}/$i $out/lib/
    done
  '' + ''
    mkdir -p $dev/include
    cp -v $out/include/*.h $dev/include/
  '';

  outputs = [ "out" "dev" ];
  passthru.linuxHeaders = kernelHeaders;

  meta = with lib; {
    description = "The Android libc implementation";
    homepage    = "https://android.googlesource.com/platform/bionic/";
    license     = licenses.mit;
    platforms   = platforms.linux;
    maintainers = with maintainers; [ s1341 ];
  };
}