From c909f1b18e9c5deecdfe6d46c7e9901fe3e6cf83 Mon Sep 17 00:00:00 2001 From: Tuomas Tynkkynen Date: Sat, 5 Mar 2016 02:28:23 +0200 Subject: [PATCH] stdenv: Add updateAutoconfGnuConfigScriptsHook for aarch64 This is required for Aarch64 since a lot of source tarballs ship with outdated configure scripts that don't recognize aarch64. Simply replacing the config.guess and config.sub with new versions from upstream makes them build again. This same approach is used by at least Buildroot and Fedora. In principle this could be enabled for all architectures but conditionalizing this on aarch64 avoids a mass rebuild on x86. --- .../update-autotools-gnu-config-scripts.sh | 12 ++++++++++++ pkgs/stdenv/adapters.nix | 1 + pkgs/stdenv/linux/default.nix | 14 ++++++++++---- pkgs/top-level/all-packages.nix | 4 ++++ 4 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 pkgs/build-support/setup-hooks/update-autotools-gnu-config-scripts.sh diff --git a/pkgs/build-support/setup-hooks/update-autotools-gnu-config-scripts.sh b/pkgs/build-support/setup-hooks/update-autotools-gnu-config-scripts.sh new file mode 100644 index 00000000000..5e33ace42b3 --- /dev/null +++ b/pkgs/build-support/setup-hooks/update-autotools-gnu-config-scripts.sh @@ -0,0 +1,12 @@ +preConfigurePhases+=" updateAutotoolsGnuConfigScriptsPhase" + +updateAutotoolsGnuConfigScriptsPhase() { + if [ -n "$dontUpdateAutotoolsGnuConfigScripts" ]; then return; fi + + for script in config.sub config.guess; do + for f in $(find . -name "$script"); do + echo "Updating Autotools / GNU config script to a newer upstream version: $f" + cp -f "@gnu_config@/$script" "$f" + done + done +} diff --git a/pkgs/stdenv/adapters.nix b/pkgs/stdenv/adapters.nix index 7e0eaeddd2c..90a55188f09 100644 --- a/pkgs/stdenv/adapters.nix +++ b/pkgs/stdenv/adapters.nix @@ -92,6 +92,7 @@ rec { # without proper `file` command, libtool sometimes fails # to recognize 64-bit DLLs ++ stdenv.lib.optional (cross.config == "x86_64-w64-mingw32") pkgs.file + ++ stdenv.lib.optional (cross.config == "aarch64-linux-gnu") pkgs.updateAutotoolsGnuConfigScriptsHook ; # Cross-linking dynamic libraries, every buildInput should diff --git a/pkgs/stdenv/linux/default.nix b/pkgs/stdenv/linux/default.nix index 41695b5c36b..fe685a1e77c 100644 --- a/pkgs/stdenv/linux/default.nix +++ b/pkgs/stdenv/linux/default.nix @@ -214,7 +214,9 @@ in isl = isl_0_14; }; }; - extraBuildInputs = [ prevStage.patchelf prevStage.paxctl ]; + extraBuildInputs = [ prevStage.patchelf prevStage.paxctl ] ++ + # Many tarballs come with obsolete config.sub/config.guess that don't recognize aarch64. + lib.optional (system == "aarch64-linux") prevStage.updateAutotoolsGnuConfigScriptsHook; }) @@ -241,7 +243,9 @@ in shell = self.bash + "/bin/bash"; }; }; - extraBuildInputs = [ prevStage.patchelf prevStage.xz ]; + extraBuildInputs = [ prevStage.patchelf prevStage.xz ] ++ + # Many tarballs come with obsolete config.sub/config.guess that don't recognize aarch64. + lib.optional (system == "aarch64-linux") prevStage.updateAutotoolsGnuConfigScriptsHook; }) # Construct the final stdenv. It uses the Glibc and GCC, and adds @@ -269,7 +273,9 @@ in initialPath = ((import ../common-path.nix) {pkgs = prevStage;}); - extraBuildInputs = [ prevStage.patchelf prevStage.paxctl ]; + extraBuildInputs = [ prevStage.patchelf prevStage.paxctl ] ++ + # Many tarballs come with obsolete config.sub/config.guess that don't recognize aarch64. + lib.optional (system == "aarch64-linux") prevStage.updateAutotoolsGnuConfigScriptsHook; cc = prevStage.gcc; @@ -288,7 +294,7 @@ in [ gzip bzip2 xz bash binutils coreutils diffutils findutils gawk glibc gnumake gnused gnutar gnugrep gnupatch patchelf attr acl paxctl zlib pcre linuxHeaders ed gcc gcc.cc libsigsegv - ]; + ] ++ lib.optional (system == "aarch64-linux") prevStage.updateAutotoolsGnuConfigScriptsHook; */ overrides = self: super: { diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 70e269ff87c..f9959801f3b 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -79,6 +79,10 @@ with pkgs; } ''); + updateAutotoolsGnuConfigScriptsHook = makeSetupHook + { substitutions = { gnu_config = gnu-config;}; } + ../build-support/setup-hooks/update-autotools-gnu-config-scripts.sh; + buildEnv = callPackage ../build-support/buildenv { }; # not actually a package buildFHSUserEnv = callPackage ../build-support/build-fhs-userenv { };