summary refs log tree commit diff
path: root/pkgs/development/androidndk-pkgs/androidndk-pkgs.nix
diff options
context:
space:
mode:
authorMatthew Bauer <mjbauer95@gmail.com>2019-04-10 01:23:02 -0400
committerMatthew Bauer <mjbauer95@gmail.com>2019-04-10 01:30:34 -0400
commit589c2c2870340c21b799795f6ed3b09608676499 (patch)
tree60ce4bb6f5f57c8f0466f2bb6f4b46588340a9a0 /pkgs/development/androidndk-pkgs/androidndk-pkgs.nix
parentf2bb67c8067e40d58630d628607674826fc98735 (diff)
downloadnixpkgs-589c2c2870340c21b799795f6ed3b09608676499.tar
nixpkgs-589c2c2870340c21b799795f6ed3b09608676499.tar.gz
nixpkgs-589c2c2870340c21b799795f6ed3b09608676499.tar.bz2
nixpkgs-589c2c2870340c21b799795f6ed3b09608676499.tar.lz
nixpkgs-589c2c2870340c21b799795f6ed3b09608676499.tar.xz
nixpkgs-589c2c2870340c21b799795f6ed3b09608676499.tar.zst
nixpkgs-589c2c2870340c21b799795f6ed3b09608676499.zip
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.
Diffstat (limited to 'pkgs/development/androidndk-pkgs/androidndk-pkgs.nix')
-rw-r--r--pkgs/development/androidndk-pkgs/androidndk-pkgs.nix101
1 files changed, 49 insertions, 52 deletions
diff --git a/pkgs/development/androidndk-pkgs/androidndk-pkgs.nix b/pkgs/development/androidndk-pkgs/androidndk-pkgs.nix
index aa266eb97fe..ab206158959 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
+  '';
 }