Skip to content

Commit

Permalink
ghc:8.10.2Binary bootstrap for 8.8 on aarch64 (#97407)
Browse files Browse the repository at this point in the history
  • Loading branch information
lostnet committed Oct 21, 2020
1 parent b50ef4e commit 1c2ee21
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 15 deletions.
53 changes: 42 additions & 11 deletions pkgs/development/compilers/ghc/8.10.2-binary.nix
Expand Up @@ -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 \
Expand All @@ -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 \
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 ];
};
}
6 changes: 5 additions & 1 deletion pkgs/development/compilers/ghc/8.8.4.nix
Expand Up @@ -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
Expand Down
14 changes: 11 additions & 3 deletions 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.
Expand Down Expand Up @@ -73,7 +73,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;
Expand All @@ -85,7 +89,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;
Expand Down

0 comments on commit 1c2ee21

Please sign in to comment.