androidndk: fixup mess

New android ndk (18) now uses clang. We were going through the wrapper
that are provided. This lead to surprising errors when building.
Ideally we could use the llvm linker as well, but this leads to errors
as many packages don’t support the llvm linker.
This commit is contained in:
Matthew Bauer 2019-04-10 01:23:02 -04:00
parent f2bb67c806
commit 589c2c2870
3 changed files with 50 additions and 61 deletions

View File

@ -44,14 +44,6 @@ rec {
platform = platforms.aarch64-multiplatform; platform = platforms.aarch64-multiplatform;
}; };
armv5te-android-prebuilt = rec {
config = "armv5tel-unknown-linux-androideabi";
sdkVer = "21";
ndkVer = "18b";
platform = platforms.armv5te-android;
useAndroidPrebuilt = true;
};
armv7a-android-prebuilt = rec { armv7a-android-prebuilt = rec {
config = "armv7a-unknown-linux-androideabi"; config = "armv7a-unknown-linux-androideabi";
sdkVer = "24"; sdkVer = "24";

View File

@ -18,19 +18,28 @@ let
"x86_64-unknown-linux-gnu" = { "x86_64-unknown-linux-gnu" = {
double = "linux-x86_64"; double = "linux-x86_64";
}; };
"armv5tel-unknown-linux-androideabi" = { "i686-unknown-linux-android" = {
arch = "arm"; triple = "i686-linux-android";
triple = "arm-linux-androideabi"; arch = "x86";
gccVer = "4.8"; toolchain = "x86";
gccVer = "4.9";
};
"x86_64-unknown-linux-android" = {
triple = "x86_64-linux-android";
arch = "x86_64";
toolchain = "x86";
gccVer = "4.9";
}; };
"armv7a-unknown-linux-androideabi" = { "armv7a-unknown-linux-androideabi" = {
arch = "arm"; arch = "arm";
triple = "arm-linux-androideabi"; triple = "arm-linux-androideabi";
toolchain = "arm-linux-androideabi";
gccVer = "4.9"; gccVer = "4.9";
}; };
"aarch64-unknown-linux-android" = { "aarch64-unknown-linux-android" = {
arch = "arm64"; arch = "arm64";
triple = "aarch64-linux-android"; triple = "aarch64-linux-android";
toolchain = "aarch64-linux-android";
gccVer = "4.9"; gccVer = "4.9";
}; };
}.${config} or }.${config} or
@ -38,49 +47,49 @@ let
hostInfo = ndkInfoFun stdenv.hostPlatform; hostInfo = ndkInfoFun stdenv.hostPlatform;
targetInfo = ndkInfoFun stdenv.targetPlatform; targetInfo = ndkInfoFun stdenv.targetPlatform;
prefix = stdenv.lib.optionalString (stdenv.targetPlatform != stdenv.hostPlatform) (stdenv.targetPlatform.config + "-");
in in
rec { rec {
# Misc tools # Misc tools
binaries = let binaries = runCommand "ndk-gcc-binutils" {
ndkBinDir = isClang = true; # clang based cc, but bintools ld
"${androidndk}/libexec/android-sdk/ndk-bundle/toolchains/${targetInfo.triple}-${targetInfo.gccVer}/prebuilt/${hostInfo.double}/bin"; nativeBuildInputs = [ makeWrapper ];
ndkGCCLibDir = propgatedBuildInputs = [ androidndk ];
"${androidndk}/libexec/android-sdk/ndk-bundle/toolchains/${targetInfo.triple}-${targetInfo.gccVer}/prebuilt/${hostInfo.double}/lib/gcc/${targetInfo.triple}/4.9.x"; } ''
mkdir -p $out/bin
in runCommand "ndk-gcc-binutils" { # llvm toolchain
isGNU = true; # for cc-wrapper for prog in ${androidndk}/libexec/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/${hostInfo.double}/bin/*; do
nativeBuildInputs = [ makeWrapper ]; ln -s $prog $out/bin/$(basename $prog)
propgatedBuildInputs = [ androidndk ]; ln -s $prog $out/bin/${prefix}$(basename $prog)
} '' done
mkdir -p $out/bin
for prog in ${ndkBinDir}/${targetInfo.triple}-*; do
prog_suffix=$(basename $prog | sed 's/${targetInfo.triple}-//')
cat > $out/bin/${stdenv.targetPlatform.config}-$prog_suffix <<EOF
#! ${stdenv.shell} -e
$prog "\$@"
EOF
chmod +x $out/bin/${stdenv.targetPlatform.config}-$prog_suffix
done
ln -s $out/bin/${stdenv.targetPlatform.config}-ld $out/bin/ld # bintools toolchain
ln -s ${ndkGCCLibDir} $out/lib for prog in ${androidndk}/libexec/android-sdk/ndk-bundle/toolchains/${targetInfo.toolchain}-${targetInfo.gccVer}/prebuilt/${hostInfo.double}/bin/*; do
''; prog_suffix=$(basename $prog | sed 's/${targetInfo.triple}-//')
ln -s $prog $out/bin/${stdenv.targetPlatform.config}-$prog_suffix
done
# shitty googly wrappers
rm -f $out/bin/${stdenv.targetPlatform.config}-gcc $out/bin/${stdenv.targetPlatform.config}-g++
'';
binutils = wrapBintoolsWith { binutils = wrapBintoolsWith {
bintools = binaries; bintools = binaries;
libc = targetAndroidndkPkgs.libraries; libc = targetAndroidndkPkgs.libraries;
extraBuildCommands = ''
echo "--build-id" >> $out/nix-support/libc-ldflags
'';
}; };
gcc = wrapCCWith { clang = wrapCCWith {
cc = binaries; cc = binaries;
bintools = binutils; bintools = binutils;
libc = targetAndroidndkPkgs.libraries; libc = targetAndroidndkPkgs.libraries;
extraBuildCommands = '' extraBuildCommands = ''
echo "-D__ANDROID_API__=${stdenv.targetPlatform.sdkVer}" >> $out/nix-support/cc-cflags echo "-D__ANDROID_API__=${stdenv.targetPlatform.sdkVer}" >> $out/nix-support/cc-cflags
echo "-target ${stdenv.targetPlatform.config}" >> $out/nix-support/cc-cflags
echo "-resource-dir=$(echo ${androidndk}/libexec/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/${hostInfo.double}/lib*/clang/*)" >> $out/nix-support/cc-cflags
echo "--gcc-toolchain=${androidndk}/libexec/android-sdk/ndk-bundle/toolchains/${targetInfo.toolchain}-${targetInfo.gccVer}/prebuilt/${hostInfo.double}" >> $out/nix-support/cc-cflags
'' ''
+ lib.optionalString stdenv.targetPlatform.isAarch32 (let + lib.optionalString stdenv.targetPlatform.isAarch32 (let
p = stdenv.targetPlatform.platform.gcc or {} p = stdenv.targetPlatform.platform.gcc or {}
@ -98,16 +107,10 @@ rec {
sed -E -i \ sed -E -i \
$out/bin/${stdenv.targetPlatform.config}-cc \ $out/bin/${stdenv.targetPlatform.config}-cc \
$out/bin/${stdenv.targetPlatform.config}-c++ \ $out/bin/${stdenv.targetPlatform.config}-c++ \
$out/bin/${stdenv.targetPlatform.config}-gcc \ $out/bin/${stdenv.targetPlatform.config}-clang \
$out/bin/${stdenv.targetPlatform.config}-g++ \ $out/bin/${stdenv.targetPlatform.config}-clang++ \
-e 's|^(extraBefore=)\((.*)\)$|\1(\2 -Wl,--fix-cortex-a8 ${builtins.toString flags})|' -e 's|^(extraBefore=)\((.*)\)$|\1(\2 -Wl,--fix-cortex-a8 ${builtins.toString flags})|'
'') '');
# GCC 4.9 is the first relase with "-fstack-protector"
+ lib.optionalString (lib.versionOlder targetInfo.gccVer "4.9") ''
sed -E \
-i $out/nix-support/add-hardening.sh \
-e 's|(-fstack-protector)-strong|\1|g'
'';
}; };
# Bionic lib C and other libraries. # Bionic lib C and other libraries.
@ -115,17 +118,11 @@ rec {
# We use androidndk from the previous stage, else we waste time or get cycles # We use androidndk from the previous stage, else we waste time or get cycles
# cross-compiling packages to wrap incorrectly wrap binaries we don't include # cross-compiling packages to wrap incorrectly wrap binaries we don't include
# anyways. # anyways.
libraries = libraries = runCommand "bionic-prebuilt" {} ''
let mkdir -p $out
includePath = "${buildAndroidndk}/libexec/android-sdk/ndk-bundle/sysroot/usr/include"; cp -r ${buildAndroidndk}/libexec/android-sdk/ndk-bundle/sysroot/usr/include $out/include
asmIncludePath = "${buildAndroidndk}/libexec/android-sdk/ndk-bundle/sysroot/usr/include/${targetInfo.triple}"; chmod +w $out/include
libPath = "${buildAndroidndk}/libexec/android-sdk/ndk-bundle/platforms/android-${stdenv.hostPlatform.sdkVer}/arch-${hostInfo.arch}/usr/lib/"; cp -r ${buildAndroidndk}/libexec/android-sdk/ndk-bundle/sysroot/usr/include/${targetInfo.triple}/* $out/include
in ln -s ${buildAndroidndk}/libexec/android-sdk/ndk-bundle/platforms/android-${stdenv.hostPlatform.sdkVer}/arch-${hostInfo.arch}/usr/lib $out/lib
runCommand "bionic-prebuilt" {} '' '';
mkdir -p $out
cp -r ${includePath} $out/include
chmod +w $out/include
cp -r ${asmIncludePath}/* $out/include
ln -s ${libPath} $out/lib
'';
} }

View File

@ -53,7 +53,7 @@ in lib.init bootStages ++ [
cc = if crossSystem.useiOSPrebuilt or false cc = if crossSystem.useiOSPrebuilt or false
then buildPackages.darwin.iosSdkPkgs.clang then buildPackages.darwin.iosSdkPkgs.clang
else if crossSystem.useAndroidPrebuilt or false else if crossSystem.useAndroidPrebuilt or false
then buildPackages."androidndkPkgs_${crossSystem.ndkVer}".gcc then buildPackages."androidndkPkgs_${crossSystem.ndkVer}".clang
else if crossSystem.useLLVM or false else if crossSystem.useLLVM or false
then buildPackages.llvmPackages_7.lldClang then buildPackages.llvmPackages_7.lldClang
else buildPackages.gcc; else buildPackages.gcc;