summary refs log tree commit diff
path: root/pkgs/os-specific/linux/bionic-prebuilt/default.nix
blob: 920732a2020d2ec9ba44ee9cdc417df9333b1422 (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
{ stdenvNoCC, lib, fetchzip, pkgs
}:
let

  prebuilt_crt = 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;
  };

  prebuilt_libs = 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;
  };

  prebuilt_ndk_crt = 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;
  };

  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";

  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/
    for i in libc.so libm.so libdl.so liblog.so; do
      cp -v ${prebuilt_libs.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 ];
  };
}