diff --git a/pkgs/development/compilers/ghc/8.10.2-binary.nix b/pkgs/development/compilers/ghc/8.10.2-binary.nix index baa1d879b53ec8..37238bb13bdafe 100644 --- a/pkgs/development/compilers/ghc/8.10.2-binary.nix +++ b/pkgs/development/compilers/ghc/8.10.2-binary.nix @@ -82,7 +82,6 @@ stdenv.mkDerivation rec { patchShebangs ghc-${version}/utils/ patchShebangs ghc-${version}/configure '' + - # We have to patch the GMP paths for the integer-gmp package. '' find . -name integer-gmp.buildinfo \ @@ -91,6 +90,12 @@ stdenv.mkDerivation rec { find . -name base.buildinfo \ -exec sed -i "s@extra-lib-dirs: @extra-lib-dirs: ${libiconv}/lib@" {} \; '' + + # aarch64 does HAVE_NUMA so -lnuma requires it in library-dirs in rts/package.conf.in + # FFI_LIB_DIR is a good indication of places it must be needed. + stdenv.lib.optionalString stdenv.hostPlatform.isAarch64 '' + find . -name package.conf.in \ + -exec sed -i "s@FFI_LIB_DIR@FFI_LIB_DIR ${numactl.out}/lib@g" {} \; + '' + # Rename needed libraries and binaries, fix interpreter stdenv.lib.optionalString stdenv.isLinux '' find . -type f -perm -0100 -exec patchelf \ @@ -128,14 +133,35 @@ stdenv.mkDerivation rec { # On Linux, use patchelf to modify the executables so that they can # find editline/gmp. - postFixup = stdenv.lib.optionalString stdenv.isLinux '' - for p in $(find "$out" -type f -executable); do - if isELF "$p"; then - echo "Patchelfing $p" - patchelf --set-rpath "${libPath}:$(patchelf --print-rpath $p)" $p - fi - done - '' + stdenv.lib.optionalString stdenv.isDarwin '' + postFixup = stdenv.lib.optionalString stdenv.isLinux + (if stdenv.hostPlatform.isAarch64 then + # Keep rpath as small as possible on aarch64 for patchelf#244. All Elfs + # are 2 directories deep from $out/lib, so pooling symlinks there makes + # a short rpath. + '' + (cd $out/lib; ln -s ${ncurses6.out}/lib/libtinfo.so.6) + (cd $out/lib; ln -s ${gmp.out}/lib/libgmp.so.10) + (cd $out/lib; ln -s ${numactl.out}/lib/libnuma.so.1) + for p in $(find "$out/lib" -type f -name "*\.so*"); do + (cd $out/lib; ln -s $p) + done + + for p in $(find "$out/lib" -type f -executable); do + if isELF "$p"; then + echo "Patchelfing $p" + patchelf --set-rpath "\$ORIGIN:\$ORIGIN/../.." $p + fi + done + '' + else + '' + for p in $(find "$out" -type f -executable); do + if isELF "$p"; then + echo "Patchelfing $p" + patchelf --set-rpath "${libPath}:$(patchelf --print-rpath $p)" $p + fi + done + '') + stdenv.lib.optionalString stdenv.isDarwin '' # not enough room in the object files for the full path to libiconv :( for exe in $(find "$out" -type f -executable); do isScript $exe && continue @@ -169,6 +195,11 @@ stdenv.mkDerivation rec { enableShared = true; }; - meta.license = stdenv.lib.licenses.bsd3; - meta.platforms = ["x86_64-linux" "armv7l-linux" "aarch64-linux" "i686-linux" "x86_64-darwin"]; + meta = { + homepage = "http://haskell.org/ghc"; + description = "The Glasgow Haskell Compiler"; + license = stdenv.lib.licenses.bsd3; + platforms = ["x86_64-linux" "armv7l-linux" "aarch64-linux" "i686-linux" "x86_64-darwin"]; + maintainers = with stdenv.lib.maintainers; [ lostnet ]; + }; } diff --git a/pkgs/development/compilers/ghc/8.8.4.nix b/pkgs/development/compilers/ghc/8.8.4.nix index 22a9e6e25f9ffb..cd579c05ec5407 100644 --- a/pkgs/development/compilers/ghc/8.8.4.nix +++ b/pkgs/development/compilers/ghc/8.8.4.nix @@ -119,7 +119,11 @@ stdenv.mkDerivation (rec { postPatch = "patchShebangs ."; # GHC is a bit confused on its cross terminology. - preConfigure = '' + preConfigure = stdenv.lib.optionalString stdenv.isAarch64 '' + # Aarch64 allow backward bootstrapping since earlier versions are unstable. + find . -name \*\.cabal\* -exec sed -i -e 's/\(base.*\)4.14/\14.16/' {} \; \ + -exec sed -i -e 's/\(prim.*\)0.6/\10.8/' {} \; + '' + '' for env in $(env | grep '^TARGET_' | sed -E 's|\+?=.*||'); do export "''${env#TARGET_}=''${!env}" done diff --git a/pkgs/top-level/haskell-packages.nix b/pkgs/top-level/haskell-packages.nix index 7a4ed9755188ea..faa7e9bc91b232 100644 --- a/pkgs/top-level/haskell-packages.nix +++ b/pkgs/top-level/haskell-packages.nix @@ -1,4 +1,4 @@ -{ buildPackages, pkgs, newScope }: +{ buildPackages, pkgs, newScope, stdenv }: let # These are attributes in compiler and packages that don't support integer-simple. @@ -72,7 +72,11 @@ in { llvmPackages = pkgs.llvmPackages_7; }; ghc884 = callPackage ../development/compilers/ghc/8.8.4.nix { - bootPkgs = packages.ghc865Binary; + # aarch64 ghc865Binary gets SEGVs due to haskell#15449 or similar + bootPkgs = if stdenv.isAarch64 then + packages.ghc8102Binary + else + packages.ghc865Binary; inherit (buildPackages.python3Packages) sphinx; buildLlvmPackages = buildPackages.llvmPackages_7; llvmPackages = pkgs.llvmPackages_7; @@ -84,7 +88,11 @@ in { llvmPackages = pkgs.llvmPackages_9; }; ghc8102 = callPackage ../development/compilers/ghc/8.10.2.nix { - bootPkgs = packages.ghc865Binary; + # aarch64 ghc865Binary gets SEGVs due to haskell#15449 or similar + bootPkgs = if stdenv.isAarch64 then + packages.ghc8102Binary + else + packages.ghc865Binary; inherit (buildPackages.python3Packages) sphinx; buildLlvmPackages = buildPackages.llvmPackages_9; llvmPackages = pkgs.llvmPackages_9;