2021-08-23 15:21:32 +00:00
{ lib , stdenv
, fetchurl , perl , gcc
, ncurses5
, ncurses6 , gmp , libiconv , numactl
, llvmPackages
2021-11-25 12:52:57 +00:00
, coreutils
2024-07-28 02:55:17 +00:00
, rcodesign
2021-11-25 12:52:57 +00:00
, targetPackages
2021-08-23 15:21:32 +00:00
# minimal = true; will remove files that aren't strictly necessary for
# regular builds and GHC bootstrapping.
# This is "useful" for staying within hydra's output limits for at least the
# aarch64-linux architecture.
, minimal ? false
} :
# Prebuilt only does native
assert stdenv . targetPlatform == stdenv . hostPlatform ;
let
downloadsUrl = " h t t p s : / / d o w n l o a d s . h a s k e l l . o r g / g h c " ;
2021-08-29 13:29:27 +00:00
# Copy sha256 from https://downloads.haskell.org/~ghc/8.10.7/SHA256SUMS
version = " 8 . 1 0 . 7 " ;
2021-08-23 15:21:32 +00:00
# Information about available bindists that we use in the build.
#
# # Bindist library checking
#
# The field `archSpecificLibraries` also provides a way for us get notified
# early when the upstream bindist changes its dependencies (e.g. because a
# newer Debian version is used that uses a new `ncurses` version).
#
# Usage:
#
# * You can find the `fileToCheckFor` of libraries by running `readelf -d`
# on the compiler binary (`exePathForLibraryCheck`).
# * To skip library checking for an architecture,
# set `exePathForLibraryCheck = null`.
# * To skip file checking for a specific arch specfic library,
# set `fileToCheckFor = null`.
ghcBinDists = {
# Binary distributions for the default libc (e.g. glibc, or libSystem on Darwin)
# nixpkgs uses for the respective system.
defaultLibc = {
i686-linux = {
2021-09-19 12:51:45 +00:00
variantSuffix = " " ;
2021-08-23 15:21:32 +00:00
src = {
url = " ${ downloadsUrl } / ${ version } / g h c - ${ version } - i 3 8 6 - d e b 9 - l i n u x . t a r . x z " ;
2021-08-29 13:29:27 +00:00
sha256 = " f b f c 1 e f 1 9 4 f 4 e 7 a 4 c 0 d a 8 c 1 1 c c 6 9 b 1 7 4 5 8 a 4 b 9 2 8 b 6 0 9 b 3 6 2 2 c 9 7 a c c 4 a c d 5 c 5 a b " ;
2021-08-23 15:21:32 +00:00
} ;
exePathForLibraryCheck = " g h c / s t a g e 2 / b u i l d / t m p / g h c - s t a g e 2 " ;
archSpecificLibraries = [
2021-09-19 12:16:59 +00:00
{ nixPackage = gmp ; fileToCheckFor = null ; }
2021-08-23 15:21:32 +00:00
# The i686-linux bindist provided by GHC HQ is currently built on Debian 9,
# which link it against `libtinfo.so.5` (ncurses 5).
# Other bindists are linked `libtinfo.so.6` (ncurses 6).
{ nixPackage = ncurses5 ; fileToCheckFor = " l i b t i n f o . s o . 5 " ; }
] ;
} ;
x86_64-linux = {
2021-09-19 12:51:45 +00:00
variantSuffix = " " ;
2021-08-23 15:21:32 +00:00
src = {
url = " ${ downloadsUrl } / ${ version } / g h c - ${ version } - x 8 6 _ 6 4 - d e b 1 0 - l i n u x . t a r . x z " ;
2021-08-29 13:29:27 +00:00
sha256 = " a 1 3 7 1 9 b c a 8 7 a 0 d 3 a c 0 c 7 d 4 1 5 7 a 4 e 6 0 8 8 7 0 0 9 a 7 f 1 a 8 d b e 9 5 c 4 7 5 9 e c 4 1 3 e 0 8 6 d 3 0 " ;
2021-08-23 15:21:32 +00:00
} ;
exePathForLibraryCheck = " g h c / s t a g e 2 / b u i l d / t m p / g h c - s t a g e 2 " ;
archSpecificLibraries = [
2021-09-19 12:16:59 +00:00
{ nixPackage = gmp ; fileToCheckFor = null ; }
2021-08-23 15:21:32 +00:00
{ nixPackage = ncurses6 ; fileToCheckFor = " l i b t i n f o . s o . 6 " ; }
] ;
} ;
armv7l-linux = {
2021-09-19 12:51:45 +00:00
variantSuffix = " " ;
2021-08-23 15:21:32 +00:00
src = {
url = " ${ downloadsUrl } / ${ version } / g h c - ${ version } - a r m v 7 - d e b 1 0 - l i n u x . t a r . x z " ;
2021-08-29 13:29:27 +00:00
sha256 = " 3 9 4 9 c 3 1 b d f 7 d 3 b 4 a f b 7 6 5 e a 8 2 4 6 b c a 4 c a 9 7 0 7 c 5 d 9 8 8 d 9 9 6 1 a 2 4 4 f 0 d a 1 0 0 9 5 6 a 2 " ;
2021-08-23 15:21:32 +00:00
} ;
exePathForLibraryCheck = " g h c / s t a g e 2 / b u i l d / t m p / g h c - s t a g e 2 " ;
archSpecificLibraries = [
2021-09-19 12:16:59 +00:00
{ nixPackage = gmp ; fileToCheckFor = null ; }
2021-08-23 15:21:32 +00:00
{ nixPackage = ncurses6 ; fileToCheckFor = " l i b t i n f o . s o . 6 " ; }
] ;
} ;
aarch64-linux = {
2021-09-19 12:51:45 +00:00
variantSuffix = " " ;
2021-08-23 15:21:32 +00:00
src = {
url = " ${ downloadsUrl } / ${ version } / g h c - ${ version } - a a r c h 6 4 - d e b 1 0 - l i n u x . t a r . x z " ;
2021-08-29 13:29:27 +00:00
sha256 = " f a d 2 4 1 7 f 9 b 2 9 5 2 3 3 b f 8 a d e 7 9 c 0 e 6 1 4 0 8 9 6 3 5 9 e 8 7 b e 4 6 c b 6 1 c d 1 d 3 5 8 6 3 d 9 d 0 e 5 5 " ;
2021-08-23 15:21:32 +00:00
} ;
exePathForLibraryCheck = " g h c / s t a g e 2 / b u i l d / t m p / g h c - s t a g e 2 " ;
archSpecificLibraries = [
2021-09-19 12:16:59 +00:00
{ nixPackage = gmp ; fileToCheckFor = null ; }
2021-08-23 15:21:32 +00:00
{ nixPackage = ncurses6 ; fileToCheckFor = " l i b t i n f o . s o . 6 " ; }
{ nixPackage = numactl ; fileToCheckFor = null ; }
] ;
} ;
x86_64-darwin = {
2021-09-19 12:51:45 +00:00
variantSuffix = " " ;
2021-08-23 15:21:32 +00:00
src = {
url = " ${ downloadsUrl } / ${ version } / g h c - ${ version } - x 8 6 _ 6 4 - a p p l e - d a r w i n . t a r . x z " ;
2021-08-29 13:29:27 +00:00
sha256 = " 2 8 7 d b 0 f 9 c 3 3 8 c 9 f 5 3 1 2 3 b f a 8 7 3 1 b 0 9 9 6 8 0 3 e e 5 0 f 6 e e 8 4 7 f e 3 8 8 0 9 2 e 5 e 5 1 3 2 0 4 7 " ;
2021-08-23 15:21:32 +00:00
} ;
exePathForLibraryCheck = null ; # we don't have a library check for darwin yet
archSpecificLibraries = [
2021-09-19 12:16:59 +00:00
{ nixPackage = gmp ; fileToCheckFor = null ; }
2021-08-23 15:21:32 +00:00
{ nixPackage = ncurses6 ; fileToCheckFor = null ; }
{ nixPackage = libiconv ; fileToCheckFor = null ; }
] ;
} ;
aarch64-darwin = {
2021-09-19 12:51:45 +00:00
variantSuffix = " " ;
2021-08-23 15:21:32 +00:00
src = {
url = " ${ downloadsUrl } / ${ version } / g h c - ${ version } - a a r c h 6 4 - a p p l e - d a r w i n . t a r . x z " ;
2021-08-29 13:29:27 +00:00
sha256 = " d c 4 6 9 f c 3 c 3 5 f d 2 a 3 3 a 5 a 5 7 5 f f c e 8 7 f 1 3 d e 7 b 9 8 c 2 d 3 4 9 a 4 1 0 0 2 e 2 0 0 a 5 6 d 9 b b a 1 c " ;
2021-08-23 15:21:32 +00:00
} ;
exePathForLibraryCheck = null ; # we don't have a library check for darwin yet
archSpecificLibraries = [
2021-09-19 12:16:59 +00:00
{ nixPackage = gmp ; fileToCheckFor = null ; }
2021-08-23 15:21:32 +00:00
{ nixPackage = ncurses6 ; fileToCheckFor = null ; }
{ nixPackage = libiconv ; fileToCheckFor = null ; }
] ;
} ;
} ;
# Binary distributions for the musl libc for the respective system.
musl = {
x86_64-linux = {
2021-09-19 12:51:45 +00:00
variantSuffix = " - m u s l - i n t e g e r - s i m p l e " ;
2021-08-23 15:21:32 +00:00
src = {
url = " ${ downloadsUrl } / ${ version } / g h c - ${ version } - x 8 6 _ 6 4 - a l p i n e 3 . 1 0 - l i n u x - i n t e g e r - s i m p l e . t a r . x z " ;
2021-08-29 13:29:27 +00:00
sha256 = " 1 6 9 0 3 d f 8 5 0 e f 7 3 d 5 2 4 6 f 2 f f 1 6 9 c b f 5 7 e c a b 7 6 c 2 a c 5 a c f a 9 9 2 8 9 3 4 2 8 2 c f a d 5 7 5 c " ;
2021-08-23 15:21:32 +00:00
} ;
exePathForLibraryCheck = " b i n / g h c " ;
archSpecificLibraries = [
2021-09-19 12:16:59 +00:00
# No `gmp` here, since this is an `integer-simple` bindist.
2021-08-23 15:21:32 +00:00
# In contrast to glibc builds, the musl-bindist uses `libncursesw.so.*`
# instead of `libtinfo.so.*.`
{ nixPackage = ncurses6 ; fileToCheckFor = " l i b n c u r s e s w . s o . 6 " ; }
] ;
2023-01-22 13:12:00 +00:00
isHadrian = true ;
2021-08-23 15:21:32 +00:00
} ;
} ;
} ;
distSetName = if stdenv . hostPlatform . isMusl then " m u s l " else " d e f a u l t L i b c " ;
binDistUsed = ghcBinDists . ${ distSetName } . ${ stdenv . hostPlatform . system }
or ( throw " c a n n o t b o o t s t r a p G H C o n t h i s p l a t f o r m ( ' ${ stdenv . hostPlatform . system } ' w i t h l i b c ' ${ distSetName } ' ) " ) ;
useLLVM = ! stdenv . targetPlatform . isx86 ;
libPath =
lib . makeLibraryPath (
# Add arch-specific libraries.
2021-09-19 12:16:59 +00:00
map ( { nixPackage , . . . }: nixPackage ) binDistUsed . archSpecificLibraries
2021-08-23 15:21:32 +00:00
) ;
libEnvVar = lib . optionalString stdenv . hostPlatform . isDarwin " D Y "
+ " L D _ L I B R A R Y _ P A T H " ;
2021-11-25 12:52:57 +00:00
runtimeDeps = [
targetPackages . stdenv . cc
targetPackages . stdenv . cc . bintools
coreutils # for cat
]
++ lib . optionals useLLVM [
2021-11-25 12:44:50 +00:00
( lib . getBin llvmPackages . llvm )
2021-11-25 12:52:57 +00:00
]
# On darwin, we need unwrapped bintools as well (for otool)
++ lib . optionals ( stdenv . targetPlatform . linker == " c c t o o l s " ) [
targetPackages . stdenv . cc . bintools . bintools
2021-11-25 12:44:50 +00:00
] ;
2021-08-23 15:21:32 +00:00
in
stdenv . mkDerivation rec {
inherit version ;
2021-09-19 12:51:45 +00:00
pname = " g h c - b i n a r y ${ binDistUsed . variantSuffix } " ;
2021-08-23 15:21:32 +00:00
src = fetchurl binDistUsed . src ;
2021-09-19 12:16:59 +00:00
# Note that for GHC 8.10 versions >= 8.10.6, the GHC HQ musl bindist
# uses `integer-simple` and has no `gmp` dependency:
# https://gitlab.haskell.org/ghc/ghc/-/commit/8306501020cd66f683ad9c215fa8e16c2d62357d
# Related nixpkgs issues:
# * https://github.com/NixOS/nixpkgs/pull/130441#issuecomment-922452843
# TODO: When this file is copied to `ghc-9.*-binary.nix`, determine whether
# the GHC 9 branch also switched from `gmp` to `integer-simple` via the
# currently-open issue:
# https://gitlab.haskell.org/ghc/ghc/-/issues/20059
# and update this comment accordingly.
2024-07-28 02:55:17 +00:00
nativeBuildInputs = [ perl ]
# Upstream binaries may not be linker-signed, which invalidates their signatures
# because `install_name_tool` will only replace a signature if it is both
# an ad hoc signature and the signature is flagged as linker-signed.
#
# rcodesign is used to replace the signature instead of sigtool because it
# supports setting the linker-signed flag, which will ensure future processing
# of the binaries does not invalidate their signatures.
++ lib . optionals ( stdenv . isDarwin && stdenv . isAarch64 ) [ rcodesign ] ;
2021-08-23 15:21:32 +00:00
# Set LD_LIBRARY_PATH or equivalent so that the programs running as part
# of the bindist installer can find the libraries they expect.
# Cannot patchelf beforehand due to relative RPATHs that anticipate
# the final install location.
$ { libEnvVar } = libPath ;
postUnpack =
# Verify our assumptions of which `libtinfo.so` (ncurses) version is used,
# so that we know when ghc bindists upgrade that and we need to update the
# version used in `libPath`.
lib . optionalString
( binDistUsed . exePathForLibraryCheck != null )
# Note the `*` glob because some GHCs have a suffix when unpacked, e.g.
# the musl bindist has dir `ghc-VERSION-x86_64-unknown-linux/`.
# As a result, don't shell-quote this glob when splicing the string.
( let buildExeGlob = '' g h c - ${ version } * / " ${ binDistUsed . exePathForLibraryCheck } " '' ; in
lib . concatStringsSep " \n " [
( ''
2023-10-11 10:34:04 +00:00
shopt - u nullglob
2021-08-23 15:21:32 +00:00
echo " C h e c k i n g t h a t g h c b i n a r y e x i s t s i n b i n d i s t a t ${ buildExeGlob } "
if ! test - e $ { buildExeGlob } ; then
echo > & 2 " G H C b i n a r y ${ binDistUsed . exePathForLibraryCheck } c o u l d n o t b e f o u n d i n t h e b i n d i s t b u i l d d i r e c t o r y ( a t ${ buildExeGlob } ) f o r a r c h ${ stdenv . hostPlatform . system } , p l e a s e c h e c k t h a t g h c B i n D i s t s c o r r e c t l y r e f l e c t t h e b i n d i s t d e p e n d e n c i e s ! " ; exit 1 ;
fi
'' )
( lib . concatMapStringsSep
" \n "
( { fileToCheckFor , nixPackage }:
lib . optionalString ( fileToCheckFor != null ) ''
echo " C h e c k i n g b i n d i s t f o r ${ fileToCheckFor } t o e n s u r e t h a t i s s t i l l u s e d "
if ! readelf - d $ { buildExeGlob } | grep " ${ fileToCheckFor } " ; then
echo > & 2 " F i l e ${ fileToCheckFor } c o u l d n o t b e f o u n d i n ${ binDistUsed . exePathForLibraryCheck } f o r a r c h ${ stdenv . hostPlatform . system } , p l e a s e c h e c k t h a t g h c B i n D i s t s c o r r e c t l y r e f l e c t t h e b i n d i s t d e p e n d e n c i e s ! " ; exit 1 ;
fi
echo " C h e c k i n g t h a t t h e n i x p a c k a g e ${ nixPackage } c o n t a i n s ${ fileToCheckFor } "
if ! test - e " ${ lib . getLib nixPackage } / l i b / ${ fileToCheckFor } " ; then
echo > & 2 " N i x p a c k a g e ${ nixPackage } d i d n o t c o n t a i n ${ fileToCheckFor } f o r a r c h ${ stdenv . hostPlatform . system } , p l e a s e c h e c k t h a t g h c B i n D i s t s c o r r e c t l y r e f l e c t t h e b i n d i s t d e p e n d e n c i e s ! " ; exit 1 ;
fi
''
)
binDistUsed . archSpecificLibraries
)
] )
# GHC has dtrace probes, which causes ld to try to open /usr/lib/libdtrace.dylib
# during linking
2024-07-28 02:55:17 +00:00
+ lib . optionalString stdenv . isDarwin ( ''
2021-08-23 15:21:32 +00:00
export NIX_LDFLAGS + = " - n o _ d t r a c e _ d o f "
# not enough room in the object files for the full path to libiconv :(
for exe in $ ( find . - type f - executable ) ; do
isScript $ exe && continue
ln - fs $ { libiconv } /lib/libiconv.dylib $ ( dirname $ exe ) /libiconv.dylib
install_name_tool - change /usr/lib/libiconv.2.dylib @ executable_path/libiconv.dylib - change /usr/local/lib/gcc/6/libgcc_s.1.dylib $ { gcc . cc . lib } /lib/libgcc_s.1.dylib $ exe
2024-07-28 02:55:17 +00:00
'' + l i b . o p t i o n a l S t r i n g s t d e n v . i s A a r c h 6 4 ''
# Resign the binary and set the linker-signed flag. Ignore failures when the file is an object file.
# Object files don’ t have signatures, so ignoring the failures is harmless.
rcodesign sign - - code-signature-flags linker-signed $ exe || true
'' + ''
2021-08-23 15:21:32 +00:00
done
2024-07-28 02:55:17 +00:00
'' ) +
2021-08-23 15:21:32 +00:00
# Some scripts used during the build need to have their shebangs patched
''
patchShebangs ghc- $ { version } /utils /
patchShebangs ghc- $ { version } /configure
2023-12-18 17:54:46 +00:00
test - d ghc- $ { version } /inplace/bin && \
patchShebangs ghc- $ { version } /inplace/bin
2021-08-23 15:21:32 +00:00
'' +
# We have to patch the GMP paths for the integer-gmp package.
2021-09-19 12:16:59 +00:00
# Note that musl bindists do not contain them,
2021-08-23 15:21:32 +00:00
# see: https://gitlab.haskell.org/ghc/ghc/-/issues/20073#note_363231
2021-09-19 12:16:59 +00:00
# However, musl bindists >= 8.10.6 use `integer-simple`, not `gmp`.
2021-08-23 15:21:32 +00:00
''
find . - name integer-gmp . buildinfo \
- exec sed - i " s @ e x t r a - l i b - d i r s : @ e x t r a - l i b - d i r s : ${ gmp . out } / l i b @ " { } \ ;
'' + l i b . o p t i o n a l S t r i n g s t d e n v . i s D a r w i n ''
find . - name base . buildinfo \
- exec sed - i " s @ e x t r a - l i b - d i r s : @ e x t r a - l i b - d i r s : ${ libiconv } / l i b @ " { } \ ;
'' +
# 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.
lib . optionalString ( stdenv . hostPlatform . isLinux && stdenv . hostPlatform . isAarch64 ) ''
find . - name package . conf . in \
- exec sed - i " s @ F F I _ L I B _ D I R @ F F I _ L I B _ D I R ${ numactl . out } / l i b @ g " { } \ ;
'' +
# Rename needed libraries and binaries, fix interpreter
lib . optionalString stdenv . isLinux ''
find . - type f - executable - exec patchelf \
- - interpreter $ { stdenv . cc . bintools . dynamicLinker } { } \ ;
2022-04-18 20:21:21 +00:00
'' +
# The hadrian install Makefile uses 'xxx' as a temporary placeholder in path
# substitution. Which can break the build if the store path / prefix happens
# to contain this string. This will be fixed with 9.4 bindists.
# https://gitlab.haskell.org/ghc/ghc/-/issues/21402
''
# Detect hadrian Makefile by checking for the target that has the problem
if grep ' ^ update_package_db' ghc- $ { version } * /Makefile > /dev/null ; then
echo Hadrian bindist , applying workaround for xxx path substitution .
# based on https://gitlab.haskell.org/ghc/ghc/-/commit/dd5fecb0e2990b192d92f4dfd7519ecb33164fad.patch
substituteInPlace ghc- $ { version } * /Makefile - - replace ' xxx' ' \ 0 xxx \ 0 '
else
echo Not a hadrian bindist , not applying xxx path workaround .
fi
2021-08-23 15:21:32 +00:00
'' ;
# fix for `configure: error: Your linker is affected by binutils #16177`
preConfigure = lib . optionalString
stdenv . targetPlatform . isAarch32
" L D = l d . g o l d " ;
configurePlatforms = [ ] ;
configureFlags = [
" - - w i t h - g m p - i n c l u d e s = ${ lib . getDev gmp } / i n c l u d e "
# Note `--with-gmp-libraries` does nothing for GHC bindists:
# https://gitlab.haskell.org/ghc/ghc/-/merge_requests/6124
] ++ lib . optional stdenv . isDarwin " - - w i t h - g c c = ${ ./gcc-clang-wrapper.sh } "
# From: https://github.com/NixOS/nixpkgs/pull/43369/commits
++ lib . optional stdenv . hostPlatform . isMusl " - - d i s a b l e - l d - o v e r r i d e " ;
# No building is necessary, but calling make without flags ironically
# calls install-strip ...
dontBuild = true ;
2021-11-25 12:44:50 +00:00
# Patch scripts to include runtime dependencies in $PATH.
postInstall = ''
for i in " $ o u t / b i n / " * ; do
test ! - h " $ i " || continue
isScript " $ i " || continue
sed - i - e ' 2 i export PATH = " ${ lib . makeBinPath runtimeDeps } : $ P A T H " ' " $ i "
done
'' ;
2021-08-23 15:21:32 +00:00
# Apparently necessary for the ghc Alpine (musl) bindist:
# When we strip, and then run the
# patchelf --set-rpath "${libPath}:$(patchelf --print-rpath $p)" $p
# below, running ghc (e.g. during `installCheckPhase)` gives some apparently
# corrupted rpath or whatever makes the loader work on nonsensical strings:
# running install tests
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: : symbol not found
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: ir6zf6c9f86pfx8sr30n2vjy-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/../lib/x86_64-linux-ghc-8.10.5/libHSexceptions-0.10.4-ghc8.10.5.so: symbol not found
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: y/lib/ghc-8.10.5/bin/../lib/x86_64-linux-ghc-8.10.5/libHStemplate-haskell-2.16.0.0-ghc8.10.5.so: symbol not found
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: 8.10.5/libHStemplate-haskell-2.16.0.0-ghc8.10.5.so: symbol not found
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: <20> : symbol not found
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: <20> ?: symbol not found
# Error relocating /nix/store/...-ghc-8.10.2-binary/lib/ghc-8.10.5/bin/ghc: 64-linux-ghc-8.10.5/libHSexceptions-0.10.4-ghc8.10.5.so: symbol not found
# This is extremely bogus and should be investigated.
dontStrip = if stdenv . hostPlatform . isMusl then true else false ; # `if` for explicitness
# On Linux, use patchelf to modify the executables so that they can
# find editline/gmp.
postFixup = 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 " $ o u t / l i b " - type f - name " * \. s o * " ) ; do
( cd $ out/lib ; ln - s $ p )
done
for p in $ ( find " $ o u t / l i b " - type f - executable ) ; do
if isELF " $ p " ; then
echo " P a t c h e l f i n g $ p "
patchelf - - set-rpath " \$ O R I G I N : \$ O R I G I N / . . / . . " $ p
fi
done
''
else
''
for p in $ ( find " $ o u t " - type f - executable ) ; do
if isELF " $ p " ; then
echo " P a t c h e l f i n g $ p "
patchelf - - set-rpath " ${ libPath } : $ ( p a t c h e l f - - p r i n t - r p a t h $ p ) " $ p
fi
done
'' ) + l i b . o p t i o n a l S t r i n g s t d e n v . i s D a r w i n ''
# not enough room in the object files for the full path to libiconv :(
for exe in $ ( find " $ o u t " - type f - executable ) ; do
isScript $ exe && continue
ln - fs $ { libiconv } /lib/libiconv.dylib $ ( dirname $ exe ) /libiconv.dylib
install_name_tool - change /usr/lib/libiconv.2.dylib @ executable_path/libiconv.dylib - change /usr/local/lib/gcc/6/libgcc_s.1.dylib $ { gcc . cc . lib } /lib/libgcc_s.1.dylib $ exe
done
for file in $ ( find " $ o u t " - name setup-config ) ; do
substituteInPlace $ file - - replace /usr/bin/ranlib " $ ( t y p e - P r a n l i b ) "
done
'' +
lib . optionalString minimal ''
# Remove profiling files
find $ out - type f - name ' * . p_o' - delete
find $ out - type f - name ' * . p_hi' - delete
find $ out - type f - name ' * _p . a' - delete
# `-f` because e.g. musl bindist does not have this file.
rm - f $ out/lib/ghc- * /bin/ghc-iserv-prof
# Hydra will redistribute this derivation, so we have to keep the docs for
# legal reasons (retaining the legal notices etc)
# As a last resort we could unpack the docs separately and symlink them in.
# They're in $out/share/{doc,man}.
'' ;
# In nixpkgs, musl based builds currently enable `pie` hardening by default
# (see `defaultHardeningFlags` in `make-derivation.nix`).
# But GHC cannot currently produce outputs that are ready for `-pie` linking.
# Thus, disable `pie` hardening, otherwise `recompile with -fPIE` errors appear.
# See:
# * https://github.com/NixOS/nixpkgs/issues/129247
# * https://gitlab.haskell.org/ghc/ghc/-/issues/19580
hardeningDisable = lib . optional stdenv . targetPlatform . isMusl " p i e " ;
doInstallCheck = true ;
installCheckPhase = ''
# Sanity check, can ghc create executables?
cd $ TMP
mkdir test-ghc ; cd test-ghc
cat > main . hs < < EOF
{ - # LANGUAGE TemplateHaskell #-}
module Main where
main = putStrLn \ $ ( [ | " y e s " | ] )
EOF
2021-11-25 12:52:57 +00:00
env - i $ out/bin/ghc - - make main . hs || exit 1
2021-08-23 15:21:32 +00:00
echo compilation ok
[ $ ( ./main ) == " y e s " ]
'' ;
passthru = {
targetPrefix = " " ;
enableShared = true ;
2021-11-23 15:11:37 +00:00
inherit llvmPackages ;
2021-08-23 15:21:32 +00:00
# Our Cabal compiler name
haskellCompilerName = " g h c - ${ version } " ;
2023-08-02 10:30:10 +00:00
}
# We duplicate binDistUsed here since we have a sensible default even if no bindist is avaible,
# this makes sure that getting the `meta` attribute doesn't throw even on unsupported platforms.
// lib . optionalAttrs ( ghcBinDists . ${ distSetName } . ${ stdenv . hostPlatform . system } . isHadrian or false ) {
2023-01-22 13:12:00 +00:00
# Normal GHC derivations expose the hadrian derivation used to build them
# here. In the case of bindists we just make sure that the attribute exists,
# as it is used for checking if a GHC derivation has been built with hadrian.
# The isHadrian mechanism will become obsolete with GHCs that use hadrian
# exclusively, i.e. 9.6 (and 9.4?).
hadrian = null ;
2021-08-23 15:21:32 +00:00
} ;
meta = rec {
homepage = " h t t p : / / h a s k e l l . o r g / g h c " ;
description = " G l a s g o w H a s k e l l C o m p i l e r " ;
license = lib . licenses . bsd3 ;
# HACK: since we can't encode the libc / abi in platforms, we need
# to make the platform list dependent on the evaluation platform
# in order to avoid eval errors with musl which supports less
# platforms than the default libcs (i. e. glibc / libSystem).
# This is done for the benefit of Hydra, so `packagePlatforms`
# won't return any platforms that would cause an evaluation
2024-01-25 13:32:55 +00:00
# failure for `pkgsMusl.haskell.compiler.ghc8107Binary`, as
2021-08-23 15:21:32 +00:00
# long as the evaluator runs on a platform that supports
# `pkgsMusl`.
platforms = builtins . attrNames ghcBinDists . ${ distSetName } ;
2021-09-01 12:35:27 +00:00
maintainers = with lib . maintainers ; [
prusnak
domenkozar
] ++ lib . teams . haskell . members ;
2021-08-23 15:21:32 +00:00
} ;
}