mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-10-31 06:31:20 +00:00
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:
parent
f2bb67c806
commit
589c2c2870
@ -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";
|
||||||
|
@ -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";
|
|
||||||
ndkGCCLibDir =
|
|
||||||
"${androidndk}/libexec/android-sdk/ndk-bundle/toolchains/${targetInfo.triple}-${targetInfo.gccVer}/prebuilt/${hostInfo.double}/lib/gcc/${targetInfo.triple}/4.9.x";
|
|
||||||
|
|
||||||
in runCommand "ndk-gcc-binutils" {
|
|
||||||
isGNU = true; # for cc-wrapper
|
|
||||||
nativeBuildInputs = [ makeWrapper ];
|
nativeBuildInputs = [ makeWrapper ];
|
||||||
propgatedBuildInputs = [ androidndk ];
|
propgatedBuildInputs = [ androidndk ];
|
||||||
} ''
|
} ''
|
||||||
mkdir -p $out/bin
|
mkdir -p $out/bin
|
||||||
for prog in ${ndkBinDir}/${targetInfo.triple}-*; do
|
|
||||||
prog_suffix=$(basename $prog | sed 's/${targetInfo.triple}-//')
|
# llvm toolchain
|
||||||
cat > $out/bin/${stdenv.targetPlatform.config}-$prog_suffix <<EOF
|
for prog in ${androidndk}/libexec/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/${hostInfo.double}/bin/*; do
|
||||||
#! ${stdenv.shell} -e
|
ln -s $prog $out/bin/$(basename $prog)
|
||||||
$prog "\$@"
|
ln -s $prog $out/bin/${prefix}$(basename $prog)
|
||||||
EOF
|
|
||||||
chmod +x $out/bin/${stdenv.targetPlatform.config}-$prog_suffix
|
|
||||||
done
|
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
|
|
||||||
includePath = "${buildAndroidndk}/libexec/android-sdk/ndk-bundle/sysroot/usr/include";
|
|
||||||
asmIncludePath = "${buildAndroidndk}/libexec/android-sdk/ndk-bundle/sysroot/usr/include/${targetInfo.triple}";
|
|
||||||
libPath = "${buildAndroidndk}/libexec/android-sdk/ndk-bundle/platforms/android-${stdenv.hostPlatform.sdkVer}/arch-${hostInfo.arch}/usr/lib/";
|
|
||||||
in
|
|
||||||
runCommand "bionic-prebuilt" {} ''
|
|
||||||
mkdir -p $out
|
mkdir -p $out
|
||||||
cp -r ${includePath} $out/include
|
cp -r ${buildAndroidndk}/libexec/android-sdk/ndk-bundle/sysroot/usr/include $out/include
|
||||||
chmod +w $out/include
|
chmod +w $out/include
|
||||||
cp -r ${asmIncludePath}/* $out/include
|
cp -r ${buildAndroidndk}/libexec/android-sdk/ndk-bundle/sysroot/usr/include/${targetInfo.triple}/* $out/include
|
||||||
ln -s ${libPath} $out/lib
|
ln -s ${buildAndroidndk}/libexec/android-sdk/ndk-bundle/platforms/android-${stdenv.hostPlatform.sdkVer}/arch-${hostInfo.arch}/usr/lib $out/lib
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user