diff options
author | Matthew Bauer <mjbauer95@gmail.com> | 2019-04-10 01:23:02 -0400 |
---|---|---|
committer | Matthew Bauer <mjbauer95@gmail.com> | 2019-04-10 01:30:34 -0400 |
commit | 589c2c2870340c21b799795f6ed3b09608676499 (patch) | |
tree | 60ce4bb6f5f57c8f0466f2bb6f4b46588340a9a0 | |
parent | f2bb67c8067e40d58630d628607674826fc98735 (diff) |
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.
-rw-r--r-- | lib/systems/examples.nix | 8 | ||||
-rw-r--r-- | pkgs/development/androidndk-pkgs/androidndk-pkgs.nix | 101 | ||||
-rw-r--r-- | pkgs/stdenv/cross/default.nix | 2 |
3 files changed, 50 insertions, 61 deletions
diff --git a/lib/systems/examples.nix b/lib/systems/examples.nix index 28a8d3cb9eb9..3e90c5ec2273 100644 --- a/lib/systems/examples.nix +++ b/lib/systems/examples.nix @@ -44,14 +44,6 @@ rec { 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 { config = "armv7a-unknown-linux-androideabi"; sdkVer = "24"; diff --git a/pkgs/development/androidndk-pkgs/androidndk-pkgs.nix b/pkgs/development/androidndk-pkgs/androidndk-pkgs.nix index aa266eb97feb..ab206158959d 100644 --- a/pkgs/development/androidndk-pkgs/androidndk-pkgs.nix +++ b/pkgs/development/androidndk-pkgs/androidndk-pkgs.nix @@ -18,19 +18,28 @@ let "x86_64-unknown-linux-gnu" = { double = "linux-x86_64"; }; - "armv5tel-unknown-linux-androideabi" = { - arch = "arm"; - triple = "arm-linux-androideabi"; - gccVer = "4.8"; + "i686-unknown-linux-android" = { + triple = "i686-linux-android"; + arch = "x86"; + 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" = { arch = "arm"; triple = "arm-linux-androideabi"; + toolchain = "arm-linux-androideabi"; gccVer = "4.9"; }; "aarch64-unknown-linux-android" = { arch = "arm64"; triple = "aarch64-linux-android"; + toolchain = "aarch64-linux-android"; gccVer = "4.9"; }; }.${config} or @@ -38,49 +47,49 @@ let hostInfo = ndkInfoFun stdenv.hostPlatform; targetInfo = ndkInfoFun stdenv.targetPlatform; + + prefix = stdenv.lib.optionalString (stdenv.targetPlatform != stdenv.hostPlatform) (stdenv.targetPlatform.config + "-"); in rec { # Misc tools - binaries = let - ndkBinDir = - "${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"; + binaries = runCommand "ndk-gcc-binutils" { + isClang = true; # clang based cc, but bintools ld + nativeBuildInputs = [ makeWrapper ]; + propgatedBuildInputs = [ androidndk ]; + } '' + mkdir -p $out/bin - in runCommand "ndk-gcc-binutils" { - isGNU = true; # for cc-wrapper - nativeBuildInputs = [ makeWrapper ]; - propgatedBuildInputs = [ androidndk ]; - } '' - 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 + # llvm toolchain + for prog in ${androidndk}/libexec/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/${hostInfo.double}/bin/*; do + ln -s $prog $out/bin/$(basename $prog) + ln -s $prog $out/bin/${prefix}$(basename $prog) + done - ln -s $out/bin/${stdenv.targetPlatform.config}-ld $out/bin/ld - ln -s ${ndkGCCLibDir} $out/lib - ''; + # bintools toolchain + 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 { bintools = binaries; libc = targetAndroidndkPkgs.libraries; - extraBuildCommands = '' - echo "--build-id" >> $out/nix-support/libc-ldflags - ''; }; - gcc = wrapCCWith { + clang = wrapCCWith { cc = binaries; bintools = binutils; libc = targetAndroidndkPkgs.libraries; extraBuildCommands = '' 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 p = stdenv.targetPlatform.platform.gcc or {} @@ -98,16 +107,10 @@ rec { sed -E -i \ $out/bin/${stdenv.targetPlatform.config}-cc \ $out/bin/${stdenv.targetPlatform.config}-c++ \ - $out/bin/${stdenv.targetPlatform.config}-gcc \ - $out/bin/${stdenv.targetPlatform.config}-g++ \ + $out/bin/${stdenv.targetPlatform.config}-clang \ + $out/bin/${stdenv.targetPlatform.config}-clang++ \ -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. @@ -115,17 +118,11 @@ rec { # 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 # anyways. - libraries = - 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 - cp -r ${includePath} $out/include - chmod +w $out/include - cp -r ${asmIncludePath}/* $out/include - ln -s ${libPath} $out/lib - ''; + libraries = runCommand "bionic-prebuilt" {} '' + mkdir -p $out + cp -r ${buildAndroidndk}/libexec/android-sdk/ndk-bundle/sysroot/usr/include $out/include + chmod +w $out/include + cp -r ${buildAndroidndk}/libexec/android-sdk/ndk-bundle/sysroot/usr/include/${targetInfo.triple}/* $out/include + ln -s ${buildAndroidndk}/libexec/android-sdk/ndk-bundle/platforms/android-${stdenv.hostPlatform.sdkVer}/arch-${hostInfo.arch}/usr/lib $out/lib + ''; } diff --git a/pkgs/stdenv/cross/default.nix b/pkgs/stdenv/cross/default.nix index 7b4f8adc82f3..43198f4e913a 100644 --- a/pkgs/stdenv/cross/default.nix +++ b/pkgs/stdenv/cross/default.nix @@ -53,7 +53,7 @@ in lib.init bootStages ++ [ cc = if crossSystem.useiOSPrebuilt or false then buildPackages.darwin.iosSdkPkgs.clang else if crossSystem.useAndroidPrebuilt or false - then buildPackages."androidndkPkgs_${crossSystem.ndkVer}".gcc + then buildPackages."androidndkPkgs_${crossSystem.ndkVer}".clang else if crossSystem.useLLVM or false then buildPackages.llvmPackages_7.lldClang else buildPackages.gcc; |