From 93e9aac7dc26af7bde133dc1861bfabfd597c577 Mon Sep 17 00:00:00 2001 From: Jakub Sokołowski Date: Mon, 13 Feb 2023 10:50:04 +0100 Subject: androidenv: fix autopatching toolchains MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use of binaries from NDK `toolchains` has been broken by following PR: * https://github.com/NixOS/nixpkgs/pull/195752 I'm splitting the patchInstructions to run the ELF patching only on Linux. Signed-off-by: Jakub Sokołowski --- .../mobile/androidenv/ndk-bundle/default.nix | 61 ++++++++++++---------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/pkgs/development/mobile/androidenv/ndk-bundle/default.nix b/pkgs/development/mobile/androidenv/ndk-bundle/default.nix index cc99dfb2971c..a9e1aaca5508 100644 --- a/pkgs/development/mobile/androidenv/ndk-bundle/default.nix +++ b/pkgs/development/mobile/androidenv/ndk-bundle/default.nix @@ -7,13 +7,34 @@ let coreutils file findutils gawk gnugrep gnused jdk python3 which ]) + ":${platform-tools}/platform-tools"; in -deployAndroidPackage { +deployAndroidPackage rec { inherit package os; nativeBuildInputs = [ makeWrapper ] ++ lib.optionals stdenv.isLinux [ autoPatchelfHook ]; autoPatchelfIgnoreMissingDeps = true; buildInputs = lib.optionals (os == "linux") [ pkgs.zlib ]; - patchInstructions = '' + + patchElfBnaries = '' + # Patch the executables of the toolchains, but not the libraries -- they are needed for crosscompiling + if [ -d $out/libexec/android-sdk/ndk-bundle/toolchains/renderscript/prebuilt/linux-x86_64/lib64 ]; then + addAutoPatchelfSearchPath $out/libexec/android-sdk/ndk-bundle/toolchains/renderscript/prebuilt/linux-x86_64/lib64 + fi + + if [ -d $out/libexec/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/lib64 ]; then + addAutoPatchelfSearchPath $out/libexec/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/lib64 + fi + + find toolchains -type d -name bin -or -name lib64 | while read dir; do + autoPatchelf "$dir" + done + + # Patch executables + if [ -d prebuilt/linux-x86_64 ]; then + autoPatchelf prebuilt/linux-x86_64 + fi + ''; + + patchOsAgnostic = '' patchShebangs . # TODO: allow this stuff @@ -22,47 +43,31 @@ deployAndroidPackage { # Ndk now has a prebuilt toolchains inside, the file layout has changed, we do a symlink # to still support the old standalone toolchains builds. if [ -d $out/libexec/android-sdk/ndk ] && [ ! -d $out/libexec/android-sdk/ndk-bundle ]; then - ln -sf $out/libexec/android-sdk/ndk/${package.revision} $out/libexec/android-sdk/ndk-bundle + ln -sf $out/libexec/android-sdk/ndk/${package.revision} $out/libexec/android-sdk/ndk-bundle elif [ ! -d $out/libexec/android-sdk/ndk-bundle ]; then - echo "The ndk-bundle layout has changed. The nix expressions have to be updated!" - exit 1 - fi - - # Patch the executables of the toolchains, but not the libraries -- they are needed for crosscompiling - if [ -d $out/libexec/android-sdk/ndk-bundle/toolchains/renderscript/prebuilt/linux-x86_64/lib64 ]; then - addAutoPatchelfSearchPath $out/libexec/android-sdk/ndk-bundle/toolchains/renderscript/prebuilt/linux-x86_64/lib64 - fi - - if [ -d $out/libexec/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/lib64 ]; then - addAutoPatchelfSearchPath $out/libexec/android-sdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/lib64 - fi - - if [ -d toolchains/llvm/prebuilt/linux-x86_64 ]; then - find toolchains/llvm/prebuilt/linux-x86_64 -type d -name bin -or -name lib64 | while read dir; do - autoPatchelf "$dir" - done + echo "The ndk-bundle layout has changed. The nix expressions have to be updated!" + exit 1 fi # fix ineffective PROGDIR / MYNDKDIR determination for progname in ndk-build; do - sed -i -e 's|^PROGDIR=`dirname $0`|PROGDIR=`dirname $(readlink -f $(which $0))`|' $progname + sed -i -e 's|^PROGDIR=`dirname $0`|PROGDIR=`dirname $(readlink -f $(which $0))`|' $progname done - # Patch executables - if [ -d prebuilt/linux-x86_64 ]; then - autoPatchelf prebuilt/linux-x86_64 - fi - # wrap for progname in ndk-build; do - wrapProgram "$(pwd)/$progname" --prefix PATH : "${runtime_paths}" + wrapProgram "$(pwd)/$progname" --prefix PATH : "${runtime_paths}" done # make some executables available in PATH mkdir -p $out/bin for progname in ndk-build; do - ln -sf ../libexec/android-sdk/ndk-bundle/$progname $out/bin/$progname + ln -sf ../libexec/android-sdk/ndk-bundle/$progname $out/bin/$progname done ''; + + patchInstructions = patchOsAgnostic + + lib.optionalString stdenv.isLinux patchElfBnaries; + noAuditTmpdir = true; # Audit script gets invoked by the build/ component in the path for the make standalone script } -- cgit 1.4.1