Merge pull request #117591 from s1341/android_non_prebuilt

treewide: Support aarch64-android using minimal prebuilt components
This commit is contained in:
John Ericson
2021-05-11 12:49:53 -04:00
committed by GitHub
8 changed files with 222 additions and 12 deletions
@@ -0,0 +1,113 @@
{ stdenvNoCC, lib, fetchurl, 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 = fetchurl {
url = "https://android.googlesource.com/kernel/common/+archive/48ffcbf0b9e7f0280bfb8c32c68da0aaf0fdfef6.tar.gz";
sha256 = "0ksm1243zm9hsv0a6q9v15jabf2rivsn14kmnm2qw6zk3mjd4jvv";
};
};
in
stdenvNoCC.mkDerivation rec {
pname = "bionic-prebuilt";
version = "ndk-release-r23";
src = fetchurl {
url = "https://android.googlesource.com/platform/bionic/+archive/00e8ce1142d8823b0d2fc8a98b40119b0f1f02cd.tar.gz";
sha256 = "0cfkwdcb2c9nnlmkx0inbsja3cyiha71nj92lm66m5an70zc3b8q";
};
sourceRoot = ".";
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 ];
};
}
@@ -0,0 +1,42 @@
--- a/libc/include/android/ndk-version.h 2021-04-01 16:08:03.109183965 +0300
+++ b/libc/include/android/ndk-version.h 2021-04-01 16:07:19.811424641 +0300
@@ -0,0 +1,39 @@
+#pragma once
+
+/**
+ * Set to 1 if this is an NDK, unset otherwise. See
+ * https://android.googlesource.com/platform/bionic/+/master/docs/defines.md.
+ */
+#define __ANDROID_NDK__ 1
+
+/**
+ * Major version of this NDK.
+ *
+ * For example: 16 for r16.
+ */
+#define __NDK_MAJOR__ 22
+
+/**
+ * Minor version of this NDK.
+ *
+ * For example: 0 for r16 and 1 for r16b.
+ */
+#define __NDK_MINOR__ 0
+
+/**
+ * Set to 0 if this is a release build, or 1 for beta 1,
+ * 2 for beta 2, and so on.
+ */
+#define __NDK_BETA__ 0
+
+/**
+ * Build number for this NDK.
+ *
+ * For a local development build of the NDK, this is -1.
+ */
+#define __NDK_BUILD__ 7026061
+
+/**
+ * Set to 1 if this is a canary build, 0 if not.
+ */
+#define __NDK_CANARY__ 0
@@ -1,4 +1,9 @@
{ stdenvNoCC, lib, buildPackages, fetchurl, perl, elf-header }:
{ stdenvNoCC, lib, buildPackages, fetchurl, perl, elf-header
, bison ? null, flex ? null, python ? null, rsync ? null
}:
assert stdenvNoCC.hostPlatform.isAndroid ->
(flex != null && bison != null && python != null && rsync != null);
let
makeLinuxHeaders = { src, version, patches ? [] }: stdenvNoCC.mkDerivation {
@@ -13,7 +18,11 @@ let
# We do this so we have a build->build, not build->host, C compiler.
depsBuildBuild = [ buildPackages.stdenv.cc ];
# `elf-header` is null when libc provides `elf.h`.
nativeBuildInputs = [ perl elf-header ];
nativeBuildInputs = [
perl elf-header
] ++ lib.optionals stdenvNoCC.hostPlatform.isAndroid [
flex bison python rsync
];
extraIncludeDirs = lib.optional stdenvNoCC.hostPlatform.isPowerPC ["ppc"];
@@ -21,6 +30,8 @@ let
hardeningDisable = lib.optional stdenvNoCC.buildPlatform.isDarwin "format";
sourceRoot = lib.optionalString stdenvNoCC.hostPlatform.isAndroid ".";
makeFlags = [
"SHELL=bash"
# Avoid use of runtime build->host compilers for checks. These
@@ -36,9 +47,12 @@ let
# Skip clean on darwin, case-sensitivity issues.
buildPhase = lib.optionalString (!stdenvNoCC.buildPlatform.isDarwin) ''
make mrproper $makeFlags
'' + ''
'' + (if stdenvNoCC.hostPlatform.isAndroid then ''
make defconfig
make headers_install
'' else ''
make headers $makeFlags
'';
'');
checkPhase = ''
make headers_check $makeFlags