From e191321866b1d754eed23a577837f183c76581f7 Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Tue, 23 Nov 2021 16:12:48 +0100 Subject: [PATCH 01/17] haskell.compiler.ghc865Binary: build with correct LLVM version See https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/compiler/backends/llvm/installing#llvm-support --- pkgs/top-level/haskell-packages.nix | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pkgs/top-level/haskell-packages.nix b/pkgs/top-level/haskell-packages.nix index bf340c10cb3b..b5d214c579ce 100644 --- a/pkgs/top-level/haskell-packages.nix +++ b/pkgs/top-level/haskell-packages.nix @@ -50,7 +50,9 @@ in { compiler = { - ghc865Binary = callPackage ../development/compilers/ghc/8.6.5-binary.nix { }; + ghc865Binary = callPackage ../development/compilers/ghc/8.6.5-binary.nix { + llvmPackages = pkgs.llvmPackages_6; + }; ghc8102Binary = callPackage ../development/compilers/ghc/8.10.2-binary.nix { llvmPackages = pkgs.llvmPackages_9; From d7ff8061beed6ce1c141066fd268cdbb5acc0dd1 Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Tue, 23 Nov 2021 16:11:37 +0100 Subject: [PATCH 02/17] haskellPackages: always inherit llvmPackages from ghc's passthru This means we only have to update the llvmPackages attribute in one place now and should prevent situations like with 8.6.5 where different versions would be used in the package set compared to the compiler build. Drop comments in the configuration-ghc-X.Y.x.nix files as well, since LLVM version isn't tied to the compiler minor version at all (e. g. 8.10.2 and 8.10.7 have different support ranges). --- pkgs/development/compilers/ghc/8.10.2-binary.nix | 2 ++ pkgs/development/compilers/ghc/8.10.7-binary.nix | 2 ++ pkgs/development/compilers/ghc/8.6.5-binary.nix | 2 ++ pkgs/development/haskell-modules/configuration-ghc-8.10.x.nix | 3 +-- pkgs/development/haskell-modules/configuration-ghc-8.6.x.nix | 3 +-- pkgs/development/haskell-modules/configuration-ghc-8.8.x.nix | 3 +-- pkgs/development/haskell-modules/configuration-ghc-9.0.x.nix | 3 +-- pkgs/development/haskell-modules/configuration-ghc-9.2.x.nix | 3 +-- pkgs/development/haskell-modules/configuration-ghc-head.nix | 2 +- 9 files changed, 12 insertions(+), 11 deletions(-) diff --git a/pkgs/development/compilers/ghc/8.10.2-binary.nix b/pkgs/development/compilers/ghc/8.10.2-binary.nix index bf909016ac22..93ebca2b6c4a 100644 --- a/pkgs/development/compilers/ghc/8.10.2-binary.nix +++ b/pkgs/development/compilers/ghc/8.10.2-binary.nix @@ -378,6 +378,8 @@ stdenv.mkDerivation rec { targetPrefix = ""; enableShared = true; + inherit llvmPackages; + # Our Cabal compiler name haskellCompilerName = "ghc-${version}"; }; diff --git a/pkgs/development/compilers/ghc/8.10.7-binary.nix b/pkgs/development/compilers/ghc/8.10.7-binary.nix index 58be16dc5693..a8ec751d2d24 100644 --- a/pkgs/development/compilers/ghc/8.10.7-binary.nix +++ b/pkgs/development/compilers/ghc/8.10.7-binary.nix @@ -378,6 +378,8 @@ stdenv.mkDerivation rec { targetPrefix = ""; enableShared = true; + inherit llvmPackages; + # Our Cabal compiler name haskellCompilerName = "ghc-${version}"; }; diff --git a/pkgs/development/compilers/ghc/8.6.5-binary.nix b/pkgs/development/compilers/ghc/8.6.5-binary.nix index b1126fda7d26..5b52f0e4cdd9 100644 --- a/pkgs/development/compilers/ghc/8.6.5-binary.nix +++ b/pkgs/development/compilers/ghc/8.6.5-binary.nix @@ -181,6 +181,8 @@ stdenv.mkDerivation rec { targetPrefix = ""; enableShared = true; + inherit llvmPackages; + # Our Cabal compiler name haskellCompilerName = "ghc-${version}"; }; diff --git a/pkgs/development/haskell-modules/configuration-ghc-8.10.x.nix b/pkgs/development/haskell-modules/configuration-ghc-8.10.x.nix index 5e42a7c1131c..ec5515659309 100644 --- a/pkgs/development/haskell-modules/configuration-ghc-8.10.x.nix +++ b/pkgs/development/haskell-modules/configuration-ghc-8.10.x.nix @@ -4,8 +4,7 @@ with haskellLib; self: super: { - # This compiler version needs llvm 9.x. - llvmPackages = pkgs.lib.dontRecurseIntoAttrs pkgs.llvmPackages_9; + llvmPackages = pkgs.lib.dontRecurseIntoAttrs self.ghc.llvmPackages; # Disable GHC 8.10.x core libraries. array = null; diff --git a/pkgs/development/haskell-modules/configuration-ghc-8.6.x.nix b/pkgs/development/haskell-modules/configuration-ghc-8.6.x.nix index db202735f893..ce7bf88d1da8 100644 --- a/pkgs/development/haskell-modules/configuration-ghc-8.6.x.nix +++ b/pkgs/development/haskell-modules/configuration-ghc-8.6.x.nix @@ -4,8 +4,7 @@ with haskellLib; self: super: { - # This compiler version needs llvm 6.x. - llvmPackages = pkgs.lib.dontRecurseIntoAttrs pkgs.llvmPackages_6; + llvmPackages = pkgs.lib.dontRecurseIntoAttrs self.ghc.llvmPackages; # Disable GHC 8.6.x core libraries. array = null; diff --git a/pkgs/development/haskell-modules/configuration-ghc-8.8.x.nix b/pkgs/development/haskell-modules/configuration-ghc-8.8.x.nix index a27a7c522098..94e9a32ce05a 100644 --- a/pkgs/development/haskell-modules/configuration-ghc-8.8.x.nix +++ b/pkgs/development/haskell-modules/configuration-ghc-8.8.x.nix @@ -4,8 +4,7 @@ with haskellLib; self: super: { - # This compiler version needs llvm 7.x. - llvmPackages = pkgs.lib.dontRecurseIntoAttrs pkgs.llvmPackages_7; + llvmPackages = pkgs.lib.dontRecurseIntoAttrs self.ghc.llvmPackages; # Disable GHC 8.8.x core libraries. array = null; diff --git a/pkgs/development/haskell-modules/configuration-ghc-9.0.x.nix b/pkgs/development/haskell-modules/configuration-ghc-9.0.x.nix index 08d1ba3b2107..7999e228c748 100644 --- a/pkgs/development/haskell-modules/configuration-ghc-9.0.x.nix +++ b/pkgs/development/haskell-modules/configuration-ghc-9.0.x.nix @@ -4,8 +4,7 @@ with haskellLib; self: super: { - # This compiler version needs llvm 10.x. - llvmPackages = pkgs.lib.dontRecurseIntoAttrs pkgs.llvmPackages_10; + llvmPackages = pkgs.lib.dontRecurseIntoAttrs self.ghc.llvmPackages; # Disable GHC 9.0.x core libraries. array = null; diff --git a/pkgs/development/haskell-modules/configuration-ghc-9.2.x.nix b/pkgs/development/haskell-modules/configuration-ghc-9.2.x.nix index 7dc5e70b90c7..c8488453fdcb 100644 --- a/pkgs/development/haskell-modules/configuration-ghc-9.2.x.nix +++ b/pkgs/development/haskell-modules/configuration-ghc-9.2.x.nix @@ -4,8 +4,7 @@ with haskellLib; self: super: { - # This compiler version needs llvm 10.x. - llvmPackages = pkgs.lib.dontRecurseIntoAttrs pkgs.llvmPackages_10; + llvmPackages = pkgs.lib.dontRecurseIntoAttrs self.ghc.llvmPackages; # Disable GHC 9.2.x core libraries. array = null; diff --git a/pkgs/development/haskell-modules/configuration-ghc-head.nix b/pkgs/development/haskell-modules/configuration-ghc-head.nix index f2fa17d9c46b..e1e3f2c99884 100644 --- a/pkgs/development/haskell-modules/configuration-ghc-head.nix +++ b/pkgs/development/haskell-modules/configuration-ghc-head.nix @@ -11,7 +11,7 @@ with haskellLib; self: super: { - llvmPackages = pkgs.lib.dontRecurseIntoAttrs pkgs.llvmPackages_10; + llvmPackages = pkgs.lib.dontRecurseIntoAttrs self.ghc.llvmPackages; # Disable GHC 8.7.x core libraries. array = null; From 5a568ea36fc596b349ac088418c627d4a1488ce0 Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Sun, 21 Nov 2021 23:33:39 +0100 Subject: [PATCH 03/17] haskell.compiler.ghc901: drop LLVM version to 9 GHC 9.0.1 only supports LLVM 9 and spews a lot of warnings about LLVM 10 when using the LLVM backend atm. See also: https://www.haskell.org/ghc/download_ghc_9_0_1.html --- pkgs/top-level/haskell-packages.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/top-level/haskell-packages.nix b/pkgs/top-level/haskell-packages.nix index b5d214c579ce..c96c166d5eaf 100644 --- a/pkgs/top-level/haskell-packages.nix +++ b/pkgs/top-level/haskell-packages.nix @@ -111,8 +111,8 @@ in { packages.ghc8107Binary; inherit (buildPackages.python3Packages) sphinx; inherit (buildPackages.darwin) autoSignDarwinBinariesHook; - buildLlvmPackages = buildPackages.llvmPackages_10; - llvmPackages = pkgs.llvmPackages_10; + buildLlvmPackages = buildPackages.llvmPackages_9; + llvmPackages = pkgs.llvmPackages_9; }; ghc921 = callPackage ../development/compilers/ghc/9.2.1.nix { bootPkgs = From 9e1f438a7656b5ab2247eca914902525207f12cc Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Tue, 23 Nov 2021 16:21:32 +0100 Subject: [PATCH 04/17] haskell.compiler.*: upgrade to latest supported LLVM version Source: * (8.6.5: https://www.haskell.org/ghc/download_ghc_8_6_5.html) * (8.8.4: https://www.haskell.org/ghc/download_ghc_8_8_4.html) * (8.10.2: https://www.haskell.org/ghc/download_ghc_8_10_2.html) * 8.10.7: https://www.haskell.org/ghc/download_ghc_8_10_7.html * (9.0.1: https://www.haskell.org/ghc/download_ghc_9_0_1.html) * 9.2.1: https://www.haskell.org/ghc/download_ghc_9_2_1.html * HEAD: https://gitlab.haskell.org/ghc/ghc/-/blob/3ab3631f41efe9a1ae32a5b1f709152228edb09a/configure.ac#L674 --- pkgs/top-level/haskell-packages.nix | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pkgs/top-level/haskell-packages.nix b/pkgs/top-level/haskell-packages.nix index c96c166d5eaf..87a2778fdf85 100644 --- a/pkgs/top-level/haskell-packages.nix +++ b/pkgs/top-level/haskell-packages.nix @@ -64,11 +64,11 @@ in { }; ghc8107Binary = callPackage ../development/compilers/ghc/8.10.7-binary.nix { - llvmPackages = pkgs.llvmPackages_11; + llvmPackages = pkgs.llvmPackages_12; }; ghc8107BinaryMinimal = callPackage ../development/compilers/ghc/8.10.7-binary.nix { - llvmPackages = pkgs.llvmPackages_11; + llvmPackages = pkgs.llvmPackages_12; minimal = true; }; @@ -98,8 +98,8 @@ in { # https://github.com/xattr/xattr/issues/44 and # https://github.com/xattr/xattr/issues/55 are solved. inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook; - buildLlvmPackages = buildPackages.llvmPackages_9; - llvmPackages = pkgs.llvmPackages_9; + buildLlvmPackages = buildPackages.llvmPackages_12; + llvmPackages = pkgs.llvmPackages_12; }; ghc901 = callPackage ../development/compilers/ghc/9.0.1.nix { bootPkgs = @@ -126,8 +126,8 @@ in { # https://github.com/xattr/xattr/issues/44 and # https://github.com/xattr/xattr/issues/55 are solved. inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook; - buildLlvmPackages = buildPackages.llvmPackages_10; - llvmPackages = pkgs.llvmPackages_10; + buildLlvmPackages = buildPackages.llvmPackages_12; + llvmPackages = pkgs.llvmPackages_12; }; ghcHEAD = callPackage ../development/compilers/ghc/head.nix { bootPkgs = packages.ghc8107Binary; @@ -136,8 +136,8 @@ in { # https://github.com/xattr/xattr/issues/44 and # https://github.com/xattr/xattr/issues/55 are solved. inherit (buildPackages.darwin) xattr autoSignDarwinBinariesHook; - buildLlvmPackages = buildPackages.llvmPackages_10; - llvmPackages = pkgs.llvmPackages_10; + buildLlvmPackages = buildPackages.llvmPackages_12; + llvmPackages = pkgs.llvmPackages_12; libffi = pkgs.libffi; }; From b9f15821064edcb61d9c5e06285fbbde775edeb9 Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Wed, 24 Nov 2021 13:28:28 +0100 Subject: [PATCH 05/17] haskell.compiler.ghc865Binary: remove aarch64-linux from platforms GHC 8.6.5 will always segfault on aarch64-linux and at this point it's not realistic we'll ever fix this. --- pkgs/development/compilers/ghc/8.6.5-binary.nix | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkgs/development/compilers/ghc/8.6.5-binary.nix b/pkgs/development/compilers/ghc/8.6.5-binary.nix index 5b52f0e4cdd9..e8ae6761be8d 100644 --- a/pkgs/development/compilers/ghc/8.6.5-binary.nix +++ b/pkgs/development/compilers/ghc/8.6.5-binary.nix @@ -189,8 +189,7 @@ stdenv.mkDerivation rec { meta = rec { license = lib.licenses.bsd3; - platforms = ["x86_64-linux" "aarch64-linux" "i686-linux" "x86_64-darwin"]; - hydraPlatforms = builtins.filter (p: p != "aarch64-linux") platforms; + platforms = ["x86_64-linux" "i686-linux" "x86_64-darwin"]; # build segfaults, use ghc8102Binary which has proper musl support instead broken = stdenv.hostPlatform.isMusl; maintainers = with lib.maintainers; [ From 55b8d8c1bfd055f7efecf175fb7e528b193d2762 Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Wed, 24 Nov 2021 15:12:36 +0100 Subject: [PATCH 06/17] haskell.compiler.ghc884: re-enable aarch64-linux Since we inherit the platform list from the bootstrap GHC, we get differing lists depending on which platform we evaluate the platform list on (depending on whether 8.10.2 or 8.6.5 is used). This leads to Hydra thinking aarch64-linux is not supported as it evaluates on x86_64-linux usually. --- pkgs/development/compilers/ghc/8.8.4.nix | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkgs/development/compilers/ghc/8.8.4.nix b/pkgs/development/compilers/ghc/8.8.4.nix index 1d31ffba4111..c5be8bb84376 100644 --- a/pkgs/development/compilers/ghc/8.8.4.nix +++ b/pkgs/development/compilers/ghc/8.8.4.nix @@ -345,7 +345,10 @@ stdenv.mkDerivation (rec { guibou ] ++ lib.teams.haskell.members; timeout = 24 * 3600; - inherit (ghc.meta) license platforms; + inherit (ghc.meta) license; + # hardcode platforms because the bootstrap GHC differs depending on the platform, + # with differing platforms available for each of them + platforms = ["x86_64-linux" "aarch64-linux" "i686-linux" "x86_64-darwin"]; # integer-simple builds are broken with musl when bootstrapping using # GHC 8.10.2 and below, however it is not possible to reverse bootstrap # GHC 8.8.4 with GHC 8.10.7. From b2c2215f606426a8bc8368b344f14a5123f14f3c Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Wed, 24 Nov 2021 17:07:57 +0100 Subject: [PATCH 07/17] pkgsMusl.haskell.compiler.ghc884: return accurate platforms --- pkgs/development/compilers/ghc/8.8.4.nix | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pkgs/development/compilers/ghc/8.8.4.nix b/pkgs/development/compilers/ghc/8.8.4.nix index c5be8bb84376..3903b414b09c 100644 --- a/pkgs/development/compilers/ghc/8.8.4.nix +++ b/pkgs/development/compilers/ghc/8.8.4.nix @@ -347,8 +347,15 @@ stdenv.mkDerivation (rec { timeout = 24 * 3600; inherit (ghc.meta) license; # hardcode platforms because the bootstrap GHC differs depending on the platform, - # with differing platforms available for each of them - platforms = ["x86_64-linux" "aarch64-linux" "i686-linux" "x86_64-darwin"]; + # with differing platforms available for each of them; See HACK comment in + # 8.10.2-binary.nix for an explanation of the musl special casing. + platforms = [ + "x86_64-linux" + ] ++ lib.optionals (!hostPlatform.isMusl) [ + "i686-linux" + "aarch64-linux" + "x86_64-darwin" + ]; # integer-simple builds are broken with musl when bootstrapping using # GHC 8.10.2 and below, however it is not possible to reverse bootstrap # GHC 8.8.4 with GHC 8.10.7. From 579bc49e9485b337b0b13671fc3e368c6c93483b Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Thu, 25 Nov 2021 13:44:50 +0100 Subject: [PATCH 08/17] haskell.compiler.ghc*Binary: don't propagate LLVM, use wrapper Copy the approach from the normal GHC derivations for adding an `export PATH` into the scripts in `$out/bin` and use it to put the specific LLVM version of the binary GHC into its PATH. This will prevent the LLVM version of the GHC we are building later to take precedence over the LLVM version this GHC needs. --- pkgs/development/compilers/ghc/8.10.2-binary.nix | 16 ++++++++++++++-- pkgs/development/compilers/ghc/8.10.7-binary.nix | 16 +++++++++++++--- pkgs/development/compilers/ghc/8.6.5-binary.nix | 14 +++++++++++++- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/pkgs/development/compilers/ghc/8.10.2-binary.nix b/pkgs/development/compilers/ghc/8.10.2-binary.nix index 93ebca2b6c4a..d610e4bcd8cb 100644 --- a/pkgs/development/compilers/ghc/8.10.2-binary.nix +++ b/pkgs/development/compilers/ghc/8.10.2-binary.nix @@ -140,6 +140,10 @@ let libEnvVar = lib.optionalString stdenv.hostPlatform.isDarwin "DY" + "LD_LIBRARY_PATH"; + runtimeDeps = lib.optionals useLLVM [ + (lib.getBin llvmPackages.llvm) + ]; + in stdenv.mkDerivation rec { @@ -156,7 +160,6 @@ stdenv.mkDerivation rec { nativeBuildInputs = [ perl ]; propagatedBuildInputs = - lib.optionals useLLVM [ llvmPackages.llvm ] # Because musl bindists currently provide no way to tell where # libgmp is (see not [musl bindists have no .buildinfo]), we need # to propagate `gmp`, otherwise programs built by this ghc will @@ -177,7 +180,7 @@ stdenv.mkDerivation rec { # fixing the above-mentioned release issue, # and for GHC >= 9.* it is not clear as of writing whether that switch # will be made there too. - ++ lib.optionals stdenv.hostPlatform.isMusl [ gmp ]; # musl bindist needs this + lib.optionals stdenv.hostPlatform.isMusl [ gmp ]; # musl bindist needs this # Set LD_LIBRARY_PATH or equivalent so that the programs running as part # of the bindist installer can find the libraries they expect. @@ -278,6 +281,15 @@ stdenv.mkDerivation rec { # calls install-strip ... dontBuild = true; + # Patch scripts to include runtime dependencies in $PATH. + postInstall = '' + for i in "$out/bin/"*; do + test ! -h "$i" || continue + isScript "$i" || continue + sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' "$i" + done + ''; + # Apparently necessary for the ghc Alpine (musl) bindist: # When we strip, and then run the # patchelf --set-rpath "${libPath}:$(patchelf --print-rpath $p)" $p diff --git a/pkgs/development/compilers/ghc/8.10.7-binary.nix b/pkgs/development/compilers/ghc/8.10.7-binary.nix index a8ec751d2d24..b8164ae9f6f3 100644 --- a/pkgs/development/compilers/ghc/8.10.7-binary.nix +++ b/pkgs/development/compilers/ghc/8.10.7-binary.nix @@ -155,6 +155,10 @@ let libEnvVar = lib.optionalString stdenv.hostPlatform.isDarwin "DY" + "LD_LIBRARY_PATH"; + runtimeDeps = lib.optionals useLLVM [ + (lib.getBin llvmPackages.llvm) + ]; + in stdenv.mkDerivation rec { @@ -175,9 +179,6 @@ stdenv.mkDerivation rec { # and update this comment accordingly. nativeBuildInputs = [ perl ]; - propagatedBuildInputs = - lib.optionals useLLVM [ llvmPackages.llvm ] - ; # Set LD_LIBRARY_PATH or equivalent so that the programs running as part # of the bindist installer can find the libraries they expect. @@ -278,6 +279,15 @@ stdenv.mkDerivation rec { # calls install-strip ... dontBuild = true; + # Patch scripts to include runtime dependencies in $PATH. + postInstall = '' + for i in "$out/bin/"*; do + test ! -h "$i" || continue + isScript "$i" || continue + sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' "$i" + done + ''; + # Apparently necessary for the ghc Alpine (musl) bindist: # When we strip, and then run the # patchelf --set-rpath "${libPath}:$(patchelf --print-rpath $p)" $p diff --git a/pkgs/development/compilers/ghc/8.6.5-binary.nix b/pkgs/development/compilers/ghc/8.6.5-binary.nix index e8ae6761be8d..95b381b955fd 100644 --- a/pkgs/development/compilers/ghc/8.6.5-binary.nix +++ b/pkgs/development/compilers/ghc/8.6.5-binary.nix @@ -30,6 +30,10 @@ let downloadsUrl = "https://downloads.haskell.org/ghc"; + runtimeDeps = lib.optionals useLLVM [ + (lib.getBin llvmPackages.llvm) + ]; + in stdenv.mkDerivation rec { @@ -62,7 +66,6 @@ stdenv.mkDerivation rec { or (throw "cannot bootstrap GHC on this platform")); nativeBuildInputs = [ perl ]; - propagatedBuildInputs = lib.optionals useLLVM [ llvmPackages.llvm ]; # Cannot patchelf beforehand due to relative RPATHs that anticipate # the final install location/ @@ -130,6 +133,15 @@ stdenv.mkDerivation rec { # calls install-strip ... dontBuild = true; + # Patch scripts to include runtime dependencies in $PATH. + postInstall = '' + for i in "$out/bin/"*; do + test ! -h "$i" || continue + isScript "$i" || continue + sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' "$i" + done + ''; + # On Linux, use patchelf to modify the executables so that they can # find editline/gmp. postFixup = lib.optionalString stdenv.isLinux '' From 5384a35a0c5198e224435b7295b3d273e645243d Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Thu, 25 Nov 2021 13:52:57 +0100 Subject: [PATCH 09/17] haskell.compiler.ghc*Binary: add all missing runtimeDeps to PATH This brings the binary GHCs on parity with the source built ones in terms of the wrapper. The upshot of this is that compiling something using the binary GHCs no longer depends on PATH being populated with the tools included in stdenv at all. We can even test this by running the installCheck with an empty environment (via `env -i`). --- .../compilers/ghc/8.10.2-binary.nix | 18 +++++++++++++++--- .../compilers/ghc/8.10.7-binary.nix | 16 +++++++++++++--- .../development/compilers/ghc/8.6.5-binary.nix | 16 +++++++++++++--- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/pkgs/development/compilers/ghc/8.10.2-binary.nix b/pkgs/development/compilers/ghc/8.10.2-binary.nix index d610e4bcd8cb..a29a5b0b5ab6 100644 --- a/pkgs/development/compilers/ghc/8.10.2-binary.nix +++ b/pkgs/development/compilers/ghc/8.10.2-binary.nix @@ -3,6 +3,8 @@ , ncurses5 , ncurses6, gmp, libiconv, numactl , llvmPackages +, coreutils +, targetPackages # minimal = true; will remove files that aren't strictly necessary for # regular builds and GHC bootstrapping. @@ -140,8 +142,17 @@ let libEnvVar = lib.optionalString stdenv.hostPlatform.isDarwin "DY" + "LD_LIBRARY_PATH"; - runtimeDeps = lib.optionals useLLVM [ + runtimeDeps = [ + targetPackages.stdenv.cc + targetPackages.stdenv.cc.bintools + coreutils # for cat + ] + ++ lib.optionals useLLVM [ (lib.getBin llvmPackages.llvm) + ] + # On darwin, we need unwrapped bintools as well (for otool) + ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ + targetPackages.stdenv.cc.bintools.bintools ]; in @@ -372,7 +383,6 @@ stdenv.mkDerivation rec { doInstallCheck = true; installCheckPhase = '' - unset ${libEnvVar} # Sanity check, can ghc create executables? cd $TMP mkdir test-ghc; cd test-ghc @@ -381,7 +391,9 @@ stdenv.mkDerivation rec { module Main where main = putStrLn \$([|"yes"|]) EOF - $out/bin/ghc --make main.hs || exit 1 + # can't use env -i here because otherwise we don't find -lgmp on musl + env ${libEnvVar}= PATH= \ + $out/bin/ghc --make main.hs || exit 1 echo compilation ok [ $(./main) == "yes" ] ''; diff --git a/pkgs/development/compilers/ghc/8.10.7-binary.nix b/pkgs/development/compilers/ghc/8.10.7-binary.nix index b8164ae9f6f3..7b10f60affda 100644 --- a/pkgs/development/compilers/ghc/8.10.7-binary.nix +++ b/pkgs/development/compilers/ghc/8.10.7-binary.nix @@ -3,6 +3,8 @@ , ncurses5 , ncurses6, gmp, libiconv, numactl , llvmPackages +, coreutils +, targetPackages # minimal = true; will remove files that aren't strictly necessary for # regular builds and GHC bootstrapping. @@ -155,8 +157,17 @@ let libEnvVar = lib.optionalString stdenv.hostPlatform.isDarwin "DY" + "LD_LIBRARY_PATH"; - runtimeDeps = lib.optionals useLLVM [ + runtimeDeps = [ + targetPackages.stdenv.cc + targetPackages.stdenv.cc.bintools + coreutils # for cat + ] + ++ lib.optionals useLLVM [ (lib.getBin llvmPackages.llvm) + ] + # On darwin, we need unwrapped bintools as well (for otool) + ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ + targetPackages.stdenv.cc.bintools.bintools ]; in @@ -370,7 +381,6 @@ stdenv.mkDerivation rec { doInstallCheck = true; installCheckPhase = '' - unset ${libEnvVar} # Sanity check, can ghc create executables? cd $TMP mkdir test-ghc; cd test-ghc @@ -379,7 +389,7 @@ stdenv.mkDerivation rec { module Main where main = putStrLn \$([|"yes"|]) EOF - $out/bin/ghc --make main.hs || exit 1 + env -i $out/bin/ghc --make main.hs || exit 1 echo compilation ok [ $(./main) == "yes" ] ''; diff --git a/pkgs/development/compilers/ghc/8.6.5-binary.nix b/pkgs/development/compilers/ghc/8.6.5-binary.nix index 95b381b955fd..22bfae79c0ce 100644 --- a/pkgs/development/compilers/ghc/8.6.5-binary.nix +++ b/pkgs/development/compilers/ghc/8.6.5-binary.nix @@ -2,6 +2,8 @@ , fetchurl, perl, gcc , ncurses5, ncurses6, gmp, glibc, libiconv , llvmPackages +, coreutils +, targetPackages }: # Prebuilt only does native @@ -30,8 +32,17 @@ let downloadsUrl = "https://downloads.haskell.org/ghc"; - runtimeDeps = lib.optionals useLLVM [ + runtimeDeps = [ + targetPackages.stdenv.cc + targetPackages.stdenv.cc.bintools + coreutils # for cat + ] + ++ lib.optionals useLLVM [ (lib.getBin llvmPackages.llvm) + ] + # On darwin, we need unwrapped bintools as well (for otool) + ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ + targetPackages.stdenv.cc.bintools.bintools ]; in @@ -175,7 +186,6 @@ stdenv.mkDerivation rec { doInstallCheck = true; installCheckPhase = '' - unset ${libEnvVar} # Sanity check, can ghc create executables? cd $TMP mkdir test-ghc; cd test-ghc @@ -184,7 +194,7 @@ stdenv.mkDerivation rec { module Main where main = putStrLn \$([|"yes"|]) EOF - $out/bin/ghc --make main.hs || exit 1 + env -i $out/bin/ghc --make main.hs || exit 1 echo compilation ok [ $(./main) == "yes" ] ''; From 035f20bc6bf809c7be9bb5b6d4dd19b0a2df9d17 Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Thu, 25 Nov 2021 13:12:40 +0100 Subject: [PATCH 10/17] haskell.compiler.*: prefix PATH with runtimeDeps This will prevent freak accidents where the wrong tools are used because they are in PATH by chance. --- pkgs/development/compilers/ghc/8.10.7.nix | 6 +++--- pkgs/development/compilers/ghc/8.8.4.nix | 6 +++--- pkgs/development/compilers/ghc/9.0.1.nix | 6 +++--- pkgs/development/compilers/ghc/9.2.1.nix | 6 +++--- pkgs/development/compilers/ghc/head.nix | 6 +++--- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/pkgs/development/compilers/ghc/8.10.7.nix b/pkgs/development/compilers/ghc/8.10.7.nix index f0c57f7fae8b..9cf459f45167 100644 --- a/pkgs/development/compilers/ghc/8.10.7.nix +++ b/pkgs/development/compilers/ghc/8.10.7.nix @@ -134,7 +134,7 @@ let runtimeDeps = [ targetPackages.stdenv.cc.bintools - coreutils + coreutils # for cat ] # On darwin, we need unwrapped bintools as well (for otool) ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ @@ -321,11 +321,11 @@ stdenv.mkDerivation (rec { # Install the bash completion file. install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc - # Patch scripts to include "readelf" and "cat" in $PATH. + # Patch scripts to include runtime dependencies in $PATH. for i in "$out/bin/"*; do test ! -h $i || continue egrep --quiet '^#!' <(head -n 1 $i) || continue - sed -i -e '2i export PATH="$PATH:${lib.makeBinPath runtimeDeps}"' $i + sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' $i done ''; diff --git a/pkgs/development/compilers/ghc/8.8.4.nix b/pkgs/development/compilers/ghc/8.8.4.nix index e0f6c84637b2..069657808a35 100644 --- a/pkgs/development/compilers/ghc/8.8.4.nix +++ b/pkgs/development/compilers/ghc/8.8.4.nix @@ -142,7 +142,7 @@ let runtimeDeps = [ targetPackages.stdenv.cc.bintools - coreutils + coreutils # for cat ] # On darwin, we need unwrapped bintools as well (for otool) ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ @@ -320,11 +320,11 @@ stdenv.mkDerivation (rec { # Install the bash completion file. install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc - # Patch scripts to include "readelf" and "cat" in $PATH. + # Patch scripts to include runtime dependencies in $PATH. for i in "$out/bin/"*; do test ! -h $i || continue egrep --quiet '^#!' <(head -n 1 $i) || continue - sed -i -e '2i export PATH="$PATH:${lib.makeBinPath runtimeDeps}"' $i + sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' $i done ''; diff --git a/pkgs/development/compilers/ghc/9.0.1.nix b/pkgs/development/compilers/ghc/9.0.1.nix index 005333a8d83e..3f2ea4dedca5 100644 --- a/pkgs/development/compilers/ghc/9.0.1.nix +++ b/pkgs/development/compilers/ghc/9.0.1.nix @@ -129,7 +129,7 @@ let runtimeDeps = [ targetPackages.stdenv.cc.bintools - coreutils + coreutils # for cat ] # On darwin, we need unwrapped bintools as well (for otool) ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ @@ -286,11 +286,11 @@ stdenv.mkDerivation (rec { # Install the bash completion file. install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc - # Patch scripts to include "readelf" and "cat" in $PATH. + # Patch scripts to include runtime dependencies in $PATH. for i in "$out/bin/"*; do test ! -h $i || continue egrep --quiet '^#!' <(head -n 1 $i) || continue - sed -i -e '2i export PATH="$PATH:${lib.makeBinPath runtimeDeps}"' $i + sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' $i done ''; diff --git a/pkgs/development/compilers/ghc/9.2.1.nix b/pkgs/development/compilers/ghc/9.2.1.nix index 2ebbdc63ac93..d1c69e5c4633 100644 --- a/pkgs/development/compilers/ghc/9.2.1.nix +++ b/pkgs/development/compilers/ghc/9.2.1.nix @@ -128,7 +128,7 @@ let runtimeDeps = [ targetPackages.stdenv.cc.bintools - coreutils + coreutils # for cat ] # On darwin, we need unwrapped bintools as well (for otool) ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ @@ -289,11 +289,11 @@ stdenv.mkDerivation (rec { # Install the bash completion file. install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc - # Patch scripts to include "readelf" and "cat" in $PATH. + # Patch scripts to include runtime dependencies in $PATH. for i in "$out/bin/"*; do test ! -h $i || continue egrep --quiet '^#!' <(head -n 1 $i) || continue - sed -i -e '2i export PATH="$PATH:${lib.makeBinPath runtimeDeps}"' $i + sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' $i done ''; diff --git a/pkgs/development/compilers/ghc/head.nix b/pkgs/development/compilers/ghc/head.nix index f50b3b76e15d..50bd9527093b 100644 --- a/pkgs/development/compilers/ghc/head.nix +++ b/pkgs/development/compilers/ghc/head.nix @@ -142,7 +142,7 @@ let runtimeDeps = [ targetPackages.stdenv.cc.bintools - coreutils + coreutils # for cat ] # On darwin, we need unwrapped bintools as well (for otool) ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ @@ -309,11 +309,11 @@ stdenv.mkDerivation (rec { # Install the bash completion file. install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc - # Patch scripts to include "readelf" and "cat" in $PATH. + # Patch scripts to include runtime dependencies in $PATH. for i in "$out/bin/"*; do test ! -h $i || continue egrep --quiet '^#!' <(head -n 1 $i) || continue - sed -i -e '2i export PATH="$PATH:${lib.makeBinPath runtimeDeps}"' $i + sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' $i done ''; From f5c3b6523cab9861a343b1f49081205d799695c6 Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Thu, 25 Nov 2021 13:58:06 +0100 Subject: [PATCH 11/17] haskell.compiler.*: move propagatedBuildInputs into runtimeDeps This has two main benefits: * GHC will work reliably outside of stdenv, even when using -fllvm since everything it'll call at runtime will be provided in PATH via the wrapper scripts. * LLVM will no longer leak into haskell packages' configure scripts. This was an issue with llvm-hs which fails to build if the LLVM version of the compiler since the propagatedBuildInputs of GHC take precedence over the nativeBuildInputs added in the derivation. --- pkgs/development/compilers/ghc/8.10.7.nix | 9 ++++++--- pkgs/development/compilers/ghc/8.8.4.nix | 9 ++++++--- pkgs/development/compilers/ghc/9.0.1.nix | 9 ++++++--- pkgs/development/compilers/ghc/9.2.1.nix | 9 ++++++--- pkgs/development/compilers/ghc/head.nix | 9 ++++++--- 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/pkgs/development/compilers/ghc/8.10.7.nix b/pkgs/development/compilers/ghc/8.10.7.nix index 9cf459f45167..f2f1bfc64e14 100644 --- a/pkgs/development/compilers/ghc/8.10.7.nix +++ b/pkgs/development/compilers/ghc/8.10.7.nix @@ -132,9 +132,15 @@ let useLdGold = targetPlatform.linker == "gold" || (targetPlatform.linker == "bfd" && (targetPackages.stdenv.cc.bintools.bintools.hasGold or false) && !targetPlatform.isMusl); + # Tools GHC will need to call at runtime. Some of these were handled using + # propagatedBuildInputs before, however this allowed for GHC environment and + # a derivations build environment to interfere, especially when GHC is built. runtimeDeps = [ + targetPackages.stdenv.cc targetPackages.stdenv.cc.bintools coreutils # for cat + ] ++ lib.optionals useLLVM [ + (lib.getBin llvmPackages.llvm) ] # On darwin, we need unwrapped bintools as well (for otool) ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ @@ -290,9 +296,6 @@ stdenv.mkDerivation (rec { buildInputs = [ perl bash ] ++ (libDeps hostPlatform); - propagatedBuildInputs = [ targetPackages.stdenv.cc ] - ++ lib.optional useLLVM llvmPackages.llvm; - depsTargetTarget = map lib.getDev (libDeps targetPlatform); depsTargetTargetPropagated = map (lib.getOutput "out") (libDeps targetPlatform); diff --git a/pkgs/development/compilers/ghc/8.8.4.nix b/pkgs/development/compilers/ghc/8.8.4.nix index 069657808a35..44d8d33fecc4 100644 --- a/pkgs/development/compilers/ghc/8.8.4.nix +++ b/pkgs/development/compilers/ghc/8.8.4.nix @@ -140,9 +140,15 @@ let useLdGold = targetPlatform.linker == "gold" || (targetPlatform.linker == "bfd" && (targetPackages.stdenv.cc.bintools.bintools.hasGold or false) && !targetPlatform.isMusl); + # Tools GHC will need to call at runtime. Some of these were handled using + # propagatedBuildInputs before, however this allowed for GHC environment and + # a derivations build environment to interfere, especially when GHC is built. runtimeDeps = [ + targetPackages.stdenv.cc targetPackages.stdenv.cc.bintools coreutils # for cat + ] ++ lib.optionals useLLVM [ + (lib.getBin llvmPackages.llvm) ] # On darwin, we need unwrapped bintools as well (for otool) ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ @@ -293,9 +299,6 @@ stdenv.mkDerivation (rec { buildInputs = [ perl bash ] ++ (libDeps hostPlatform); - propagatedBuildInputs = [ targetPackages.stdenv.cc ] - ++ lib.optional useLLVM llvmPackages.llvm; - depsTargetTarget = map lib.getDev (libDeps targetPlatform); depsTargetTargetPropagated = map (lib.getOutput "out") (libDeps targetPlatform); diff --git a/pkgs/development/compilers/ghc/9.0.1.nix b/pkgs/development/compilers/ghc/9.0.1.nix index 3f2ea4dedca5..a778fda31a73 100644 --- a/pkgs/development/compilers/ghc/9.0.1.nix +++ b/pkgs/development/compilers/ghc/9.0.1.nix @@ -127,9 +127,15 @@ let useLdGold = targetPlatform.linker == "gold" || (targetPlatform.linker == "bfd" && (targetPackages.stdenv.cc.bintools.bintools.hasGold or false) && !targetPlatform.isMusl); + # Tools GHC will need to call at runtime. Some of these were handled using + # propagatedBuildInputs before, however this allowed for GHC environment and + # a derivations build environment to interfere, especially when GHC is built. runtimeDeps = [ + targetPackages.stdenv.cc targetPackages.stdenv.cc.bintools coreutils # for cat + ] ++ lib.optionals useLLVM [ + (lib.getBin llvmPackages.llvm) ] # On darwin, we need unwrapped bintools as well (for otool) ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ @@ -255,9 +261,6 @@ stdenv.mkDerivation (rec { buildInputs = [ perl bash ] ++ (libDeps hostPlatform); - propagatedBuildInputs = [ targetPackages.stdenv.cc ] - ++ lib.optional useLLVM llvmPackages.llvm; - depsTargetTarget = map lib.getDev (libDeps targetPlatform); depsTargetTargetPropagated = map (lib.getOutput "out") (libDeps targetPlatform); diff --git a/pkgs/development/compilers/ghc/9.2.1.nix b/pkgs/development/compilers/ghc/9.2.1.nix index d1c69e5c4633..5442a423bdd0 100644 --- a/pkgs/development/compilers/ghc/9.2.1.nix +++ b/pkgs/development/compilers/ghc/9.2.1.nix @@ -126,9 +126,15 @@ let # see #84670 and #49071 for more background. useLdGold = targetPlatform.linker == "gold" || (targetPlatform.linker == "bfd" && !targetPlatform.isMusl); + # Tools GHC will need to call at runtime. Some of these were handled using + # propagatedBuildInputs before, however this allowed for GHC environment and + # a derivations build environment to interfere, especially when GHC is built. runtimeDeps = [ + targetPackages.stdenv.cc targetPackages.stdenv.cc.bintools coreutils # for cat + ] ++ lib.optionals useLLVM [ + (lib.getBin llvmPackages.llvm) ] # On darwin, we need unwrapped bintools as well (for otool) ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ @@ -258,9 +264,6 @@ stdenv.mkDerivation (rec { buildInputs = [ perl bash ] ++ (libDeps hostPlatform); - propagatedBuildInputs = [ targetPackages.stdenv.cc ] - ++ lib.optional useLLVM llvmPackages.llvm; - depsTargetTarget = map lib.getDev (libDeps targetPlatform); depsTargetTargetPropagated = map (lib.getOutput "out") (libDeps targetPlatform); diff --git a/pkgs/development/compilers/ghc/head.nix b/pkgs/development/compilers/ghc/head.nix index 50bd9527093b..40dbe131f9dd 100644 --- a/pkgs/development/compilers/ghc/head.nix +++ b/pkgs/development/compilers/ghc/head.nix @@ -140,9 +140,15 @@ let useLdGold = targetPlatform.linker == "gold" || (targetPlatform.linker == "bfd" && (targetPackages.stdenv.cc.bintools.bintools.hasGold or false) && !targetPlatform.isMusl); + # Tools GHC will need to call at runtime. Some of these were handled using + # propagatedBuildInputs before, however this allowed for GHC environment and + # a derivations build environment to interfere, especially when GHC is built. runtimeDeps = [ + targetPackages.stdenv.cc targetPackages.stdenv.cc.bintools coreutils # for cat + ] ++ lib.optionals useLLVM [ + (lib.getBin llvmPackages.llvm) ] # On darwin, we need unwrapped bintools as well (for otool) ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ @@ -278,9 +284,6 @@ stdenv.mkDerivation (rec { buildInputs = [ perl bash ] ++ (libDeps hostPlatform); - propagatedBuildInputs = [ targetPackages.stdenv.cc ] - ++ lib.optional useLLVM llvmPackages.llvm; - depsTargetTarget = map lib.getDev (libDeps targetPlatform); depsTargetTargetPropagated = map (lib.getOutput "out") (libDeps targetPlatform); From a7c564596e195cf9aa46ad2762f78e4d9cc9789b Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Thu, 25 Nov 2021 14:06:35 +0100 Subject: [PATCH 12/17] haskell.compiler.*: use `isScript` over grepping for `#!` --- pkgs/development/compilers/ghc/8.10.7.nix | 6 +++--- pkgs/development/compilers/ghc/8.8.4.nix | 6 +++--- pkgs/development/compilers/ghc/9.0.1.nix | 6 +++--- pkgs/development/compilers/ghc/9.2.1.nix | 6 +++--- pkgs/development/compilers/ghc/head.nix | 6 +++--- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/pkgs/development/compilers/ghc/8.10.7.nix b/pkgs/development/compilers/ghc/8.10.7.nix index f2f1bfc64e14..bfcd53141fa0 100644 --- a/pkgs/development/compilers/ghc/8.10.7.nix +++ b/pkgs/development/compilers/ghc/8.10.7.nix @@ -326,9 +326,9 @@ stdenv.mkDerivation (rec { # Patch scripts to include runtime dependencies in $PATH. for i in "$out/bin/"*; do - test ! -h $i || continue - egrep --quiet '^#!' <(head -n 1 $i) || continue - sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' $i + test ! -h "$i" || continue + isScript "$i" || continue + sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' "$i" done ''; diff --git a/pkgs/development/compilers/ghc/8.8.4.nix b/pkgs/development/compilers/ghc/8.8.4.nix index 44d8d33fecc4..c3efc2f2a7ba 100644 --- a/pkgs/development/compilers/ghc/8.8.4.nix +++ b/pkgs/development/compilers/ghc/8.8.4.nix @@ -325,9 +325,9 @@ stdenv.mkDerivation (rec { # Patch scripts to include runtime dependencies in $PATH. for i in "$out/bin/"*; do - test ! -h $i || continue - egrep --quiet '^#!' <(head -n 1 $i) || continue - sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' $i + test ! -h "$i" || continue + isScript "$i" || continue + sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' "$i" done ''; diff --git a/pkgs/development/compilers/ghc/9.0.1.nix b/pkgs/development/compilers/ghc/9.0.1.nix index a778fda31a73..e7da05871070 100644 --- a/pkgs/development/compilers/ghc/9.0.1.nix +++ b/pkgs/development/compilers/ghc/9.0.1.nix @@ -291,9 +291,9 @@ stdenv.mkDerivation (rec { # Patch scripts to include runtime dependencies in $PATH. for i in "$out/bin/"*; do - test ! -h $i || continue - egrep --quiet '^#!' <(head -n 1 $i) || continue - sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' $i + test ! -h "$i" || continue + isScript "$i" || continue + sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' "$i" done ''; diff --git a/pkgs/development/compilers/ghc/9.2.1.nix b/pkgs/development/compilers/ghc/9.2.1.nix index 5442a423bdd0..78dbdb617e64 100644 --- a/pkgs/development/compilers/ghc/9.2.1.nix +++ b/pkgs/development/compilers/ghc/9.2.1.nix @@ -294,9 +294,9 @@ stdenv.mkDerivation (rec { # Patch scripts to include runtime dependencies in $PATH. for i in "$out/bin/"*; do - test ! -h $i || continue - egrep --quiet '^#!' <(head -n 1 $i) || continue - sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' $i + test ! -h "$i" || continue + isScript "$i" || continue + sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' "$i" done ''; diff --git a/pkgs/development/compilers/ghc/head.nix b/pkgs/development/compilers/ghc/head.nix index 40dbe131f9dd..053c43649f3f 100644 --- a/pkgs/development/compilers/ghc/head.nix +++ b/pkgs/development/compilers/ghc/head.nix @@ -314,9 +314,9 @@ stdenv.mkDerivation (rec { # Patch scripts to include runtime dependencies in $PATH. for i in "$out/bin/"*; do - test ! -h $i || continue - egrep --quiet '^#!' <(head -n 1 $i) || continue - sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' $i + test ! -h "$i" || continue + isScript "$i" || continue + sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' "$i" done ''; From 50f256f5efb8ec79a76c5de0c4d37d84643a98e8 Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Thu, 25 Nov 2021 17:14:21 +0100 Subject: [PATCH 13/17] ghcWithPackages: don't wrap GHC with LLVM unnecessarily Since GHC now will have LLVM available when needed, we don't need to add it in the wrapper anymore. It can still be added if NCG is available, but -fllvm should be used (e. g. to work around an NCG bug). --- .../haskell-modules/with-packages-wrapper.nix | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/pkgs/development/haskell-modules/with-packages-wrapper.nix b/pkgs/development/haskell-modules/with-packages-wrapper.nix index f7bebbc4aa07..e5fe60a0ae5c 100644 --- a/pkgs/development/haskell-modules/with-packages-wrapper.nix +++ b/pkgs/development/haskell-modules/with-packages-wrapper.nix @@ -1,14 +1,8 @@ { lib, stdenv, ghc, llvmPackages, packages, symlinkJoin, makeWrapper -# Include LLVM by default if GHC doesn't have native code generation support -# See https://gitlab.haskell.org/ghc/ghc/-/wikis/platforms -, useLLVM ? !(lib.any lib.id ([ - stdenv.targetPlatform.isx86 - stdenv.targetPlatform.isPowerPC - stdenv.targetPlatform.isSparc - ] ++ lib.optionals (lib.versionAtLeast ghc.version "9.2") [ - (stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin) - # TODO(@sternenseemann): Is armv7a supported for iOS? - ])) +# GHC will have LLVM available if necessary for the respective target, +# so useLLVM only needs to be changed if -fllvm is to be used for a +# platform that has NCG support +, useLLVM ? false , postBuild ? "" , ghcLibdir ? null # only used by ghcjs, when resolving plugins }: From ef081bf3056f3facd2a0b85b172c5c730a0404e8 Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Thu, 25 Nov 2021 19:30:05 +0100 Subject: [PATCH 14/17] haskell.compiler.*: don't useLLVM if aarch64-darwin NCG is available aarch64-darwin NCG was added in 9.2.1 which makes it unnecessary to include LLVM in the wrapper. --- pkgs/development/compilers/ghc/9.2.1.nix | 3 ++- pkgs/development/compilers/ghc/head.nix | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pkgs/development/compilers/ghc/9.2.1.nix b/pkgs/development/compilers/ghc/9.2.1.nix index 78dbdb617e64..2401a8900530 100644 --- a/pkgs/development/compilers/ghc/9.2.1.nix +++ b/pkgs/development/compilers/ghc/9.2.1.nix @@ -12,7 +12,8 @@ , # GHC can be built with system libffi or a bundled one. libffi ? null -, useLLVM ? !stdenv.targetPlatform.isx86 +, useLLVM ? !(stdenv.targetPlatform.isx86 + || (stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin)) , # LLVM is conceptually a run-time-only depedendency, but for # non-x86, we need LLVM to bootstrap later stages, so it becomes a # build-time dependency too. diff --git a/pkgs/development/compilers/ghc/head.nix b/pkgs/development/compilers/ghc/head.nix index 053c43649f3f..5be02df13b4a 100644 --- a/pkgs/development/compilers/ghc/head.nix +++ b/pkgs/development/compilers/ghc/head.nix @@ -17,7 +17,8 @@ !stdenv.targetPlatform.isWindows , elfutils # for DWARF support -, useLLVM ? !stdenv.targetPlatform.isx86 || stdenv.targetPlatform.isiOS +, useLLVM ? !(stdenv.targetPlatform.isx86 + || (stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin)) , # LLVM is conceptually a run-time-only depedendency, but for # non-x86, we need LLVM to bootstrap later stages, so it becomes a # build-time dependency too. From 558da925f33e1b4cb9469997175bf9bdd56586b0 Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Wed, 24 Nov 2021 15:52:25 +0100 Subject: [PATCH 15/17] ghc: make sure top level exposed GHC is always host->target See the added comment in all-packages.nix for a more detailed explanation. This makes the top-level GHC different from haskellPackages.ghc (which is build->host and used for building the package set), but more consistent with gcc, gnat etc. Specifically, pkgsCross.${platform}.buildPackages.ghc will now be a cross-compiler instead of a native build->build compiler. Since this change has a slight chance of being disruptive, add a note to the changelog. --- .../from_md/release-notes/rl-2205.section.xml | 25 +++++++++++++++++-- .../manual/release-notes/rl-2205.section.md | 12 +++++++++ pkgs/top-level/all-packages.nix | 10 +++++++- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml b/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml index 91c91dc0ab38..baefa0d369e5 100644 --- a/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml +++ b/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml @@ -24,8 +24,29 @@
Backward Incompatibilities - - + + + + pkgs.ghc now refers to + pkgs.targetPackages.haskellPackages.ghc. + This only makes a difference if you are + cross-compiling and will ensure that + pkgs.ghc always runs on the host platform + and compiles for the target platform (similar to + pkgs.gcc for example). + haskellPackages.ghc still behaves as + before, running on the build platform and compiling for the + host platform (similar to stdenv.cc). This + means you don’t have to adjust your derivations if you use + haskellPackages.callPackage, but when using + pkgs.callPackage and taking + ghc as an input, you should now use + buildPackages.ghc instead to ensure cross + compilation keeps working (or switch to + haskellPackages.callPackage). + + +
Other Notable Changes diff --git a/nixos/doc/manual/release-notes/rl-2205.section.md b/nixos/doc/manual/release-notes/rl-2205.section.md index b233d02fa568..a66e29bdb5f8 100644 --- a/nixos/doc/manual/release-notes/rl-2205.section.md +++ b/nixos/doc/manual/release-notes/rl-2205.section.md @@ -10,4 +10,16 @@ In addition to numerous new and upgraded packages, this release has the followin ## Backward Incompatibilities {#sec-release-22.05-incompatibilities} +* `pkgs.ghc` now refers to `pkgs.targetPackages.haskellPackages.ghc`. + This *only* makes a difference if you are cross-compiling and will + ensure that `pkgs.ghc` always runs on the host platform and compiles + for the target platform (similar to `pkgs.gcc` for example). + `haskellPackages.ghc` still behaves as before, running on the build + platform and compiling for the host platform (similar to `stdenv.cc`). + This means you don't have to adjust your derivations if you use + `haskellPackages.callPackage`, but when using `pkgs.callPackage` and + taking `ghc` as an input, you should now use `buildPackages.ghc` + instead to ensure cross compilation keeps working (or switch to + `haskellPackages.callPackage`). + ## Other Notable Changes {#sec-release-22.05-notable-changes} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 7a85231790e0..f1c46938cf51 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -12066,7 +12066,15 @@ with pkgs; # current default compiler is”, if you bump this: haskellPackages = dontRecurseIntoAttrs haskell.packages.ghc8107; - inherit (haskellPackages) ghc; + # haskellPackages.ghc is build->host (it exposes the compiler used to build the + # set, similarly to stdenv.cc), but pkgs.ghc should be host->target to be more + # consistent with the gcc, gnat, clang etc. derivations + # + # We use targetPackages.haskellPackages.ghc if available since this also has + # the withPackages wrapper available. In the final cross-compiled package set + # however, targetPackages won't be populated, so we need to fall back to the + # plain, cross-compiled compiler (which is only theoretical at the moment). + ghc = targetPackages.haskellPackages.ghc or haskell.compiler.ghc8107; cabal-install = haskell.lib.compose.justStaticExecutables haskellPackages.cabal-install; From 17b8b5a4dc5a49d83d508cb66c6ac2f0bb9fa39b Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Sat, 27 Nov 2021 12:09:31 +0100 Subject: [PATCH 16/17] haskell.compiler.*: pass runtime dependencies via configure script GHC can actually accept absolute paths for its runtime tools (except for touch) at configure time which are then saved in `$out/lib/ghc-${version}/settings`. This allows us to drop the wrapper entirely if we assume that a POSIX compliant touch is in PATH when we run GHC later. The touch problem can presumably be fixed by either patching the configure file of GHC (although we need to take care not to change the touch GHC uses during its compilation) or messing with the settings file after installation. The rationale for dropping the wrapper PATH entry completely is that it's always possible to invoke GHC via its library which will bypass the wrapper completely, leading to subtly different behavior. Binary GHCs are not touched in this commit, but ideally they'll get a similar treatment as well, so they are more robust, although we generally don't need to use them as a library. Note that GHC 8.8.4 doesn't care about install_name_tool or otool, so the respective environment variables are not set. --- pkgs/development/compilers/ghc/8.10.7.nix | 38 ++++++++++------------- pkgs/development/compilers/ghc/8.8.4.nix | 35 ++++++++------------- pkgs/development/compilers/ghc/9.0.1.nix | 38 ++++++++++------------- pkgs/development/compilers/ghc/9.2.1.nix | 38 ++++++++++------------- pkgs/development/compilers/ghc/head.nix | 38 ++++++++++------------- 5 files changed, 77 insertions(+), 110 deletions(-) diff --git a/pkgs/development/compilers/ghc/8.10.7.nix b/pkgs/development/compilers/ghc/8.10.7.nix index bfcd53141fa0..c8ea523be6a7 100644 --- a/pkgs/development/compilers/ghc/8.10.7.nix +++ b/pkgs/development/compilers/ghc/8.10.7.nix @@ -120,6 +120,8 @@ let ++ lib.optional (!enableIntegerSimple) gmp ++ lib.optional (platform.libc != "glibc" && !targetPlatform.isWindows) libiconv; + # TODO(@sternenseemann): is buildTarget LLVM unnecessary? + # GHC doesn't seem to have {LLC,OPT}_HOST toolsForTarget = [ pkgsBuildTarget.targetPackages.stdenv.cc ] ++ lib.optional useLLVM buildTargetLlvmPackages.llvm; @@ -132,21 +134,6 @@ let useLdGold = targetPlatform.linker == "gold" || (targetPlatform.linker == "bfd" && (targetPackages.stdenv.cc.bintools.bintools.hasGold or false) && !targetPlatform.isMusl); - # Tools GHC will need to call at runtime. Some of these were handled using - # propagatedBuildInputs before, however this allowed for GHC environment and - # a derivations build environment to interfere, especially when GHC is built. - runtimeDeps = [ - targetPackages.stdenv.cc - targetPackages.stdenv.cc.bintools - coreutils # for cat - ] ++ lib.optionals useLLVM [ - (lib.getBin llvmPackages.llvm) - ] - # On darwin, we need unwrapped bintools as well (for otool) - ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ - targetPackages.stdenv.cc.bintools.bintools - ]; - # Makes debugging easier to see which variant is at play in `nix-store -q --tree`. variantSuffix = lib.concatStrings [ (lib.optionalString stdenv.hostPlatform.isMusl "-musl") @@ -202,6 +189,7 @@ stdenv.mkDerivation (rec { postPatch = "patchShebangs ."; # GHC is a bit confused on its cross terminology. + # TODO(@sternenseemann): investigate coreutils dependencies and pass absolute paths preConfigure = '' for env in $(env | grep '^TARGET_' | sed -E 's|\+?=.*||'); do export "''${env#TARGET_}=''${!env}" @@ -218,6 +206,19 @@ stdenv.mkDerivation (rec { export RANLIB="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ranlib" export READELF="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}readelf" export STRIP="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}strip" + '' + lib.optionalString (stdenv.targetPlatform.linker == "cctools") '' + export OTOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}otool" + export INSTALL_NAME_TOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}install_name_tool" + '' + lib.optionalString useLLVM '' + export LLC="${lib.getBin llvmPackages.llvm}/bin/llc" + export OPT="${lib.getBin llvmPackages.llvm}/bin/opt" + '' + lib.optionalString (targetCC.isClang || (useLLVM && stdenv.targetPlatform.isDarwin)) (let + # LLVM backend on Darwin needs clang, if we are already using clang, might as well set the environment variable. + # See also https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/codegens.html#llvm-code-generator-fllvm + clang = if targetCC.isClang then targetCC else llvmPackages.clang; + in '' + export CLANG="${clang}/bin/${clang.targetPrefix}clang" + '') + '' echo -n "${buildMK}" > mk/build.mk sed -i -e 's|-isysroot /Developer/SDKs/MacOSX10.5.sdk||' configure @@ -323,13 +324,6 @@ stdenv.mkDerivation (rec { postInstall = '' # Install the bash completion file. install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc - - # Patch scripts to include runtime dependencies in $PATH. - for i in "$out/bin/"*; do - test ! -h "$i" || continue - isScript "$i" || continue - sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' "$i" - done ''; passthru = { diff --git a/pkgs/development/compilers/ghc/8.8.4.nix b/pkgs/development/compilers/ghc/8.8.4.nix index c3efc2f2a7ba..ad9a10d33fbc 100644 --- a/pkgs/development/compilers/ghc/8.8.4.nix +++ b/pkgs/development/compilers/ghc/8.8.4.nix @@ -128,6 +128,8 @@ let ++ lib.optional (!enableIntegerSimple) gmp ++ lib.optional (platform.libc != "glibc" && !targetPlatform.isWindows) libiconv; + # TODO(@sternenseemann): is buildTarget LLVM unnecessary? + # GHC doesn't seem to have {LLC,OPT}_HOST toolsForTarget = [ pkgsBuildTarget.targetPackages.stdenv.cc ] ++ lib.optional useLLVM buildTargetLlvmPackages.llvm; @@ -140,21 +142,6 @@ let useLdGold = targetPlatform.linker == "gold" || (targetPlatform.linker == "bfd" && (targetPackages.stdenv.cc.bintools.bintools.hasGold or false) && !targetPlatform.isMusl); - # Tools GHC will need to call at runtime. Some of these were handled using - # propagatedBuildInputs before, however this allowed for GHC environment and - # a derivations build environment to interfere, especially when GHC is built. - runtimeDeps = [ - targetPackages.stdenv.cc - targetPackages.stdenv.cc.bintools - coreutils # for cat - ] ++ lib.optionals useLLVM [ - (lib.getBin llvmPackages.llvm) - ] - # On darwin, we need unwrapped bintools as well (for otool) - ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ - targetPackages.stdenv.cc.bintools.bintools - ]; - # Makes debugging easier to see which variant is at play in `nix-store -q --tree`. variantSuffix = lib.concatStrings [ (lib.optionalString stdenv.hostPlatform.isMusl "-musl") @@ -203,6 +190,7 @@ stdenv.mkDerivation (rec { postPatch = "patchShebangs ."; # GHC is a bit confused on its cross terminology. + # TODO(@sternenseemann): investigate coreutils dependencies and pass absolute paths preConfigure = # Aarch64 allow backward bootstrapping since earlier versions are unstable. # Same for musl, as earlier versions do not provide a musl bindist for bootstrapping. @@ -226,6 +214,16 @@ stdenv.mkDerivation (rec { export RANLIB="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ranlib" export READELF="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}readelf" export STRIP="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}strip" + '' + lib.optionalString useLLVM '' + export LLC="${lib.getBin llvmPackages.llvm}/bin/llc" + export OPT="${lib.getBin llvmPackages.llvm}/bin/opt" + '' + lib.optionalString (targetCC.isClang || (useLLVM && stdenv.targetPlatform.isDarwin)) (let + # LLVM backend on Darwin needs clang, if we are already using clang, might as well set the environment variable. + # See also https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/codegens.html#llvm-code-generator-fllvm + clang = if targetCC.isClang then targetCC else llvmPackages.clang; + in '' + export CLANG="${clang}/bin/${clang.targetPrefix}clang" + '') + '' echo -n "${buildMK dontStrip}" > mk/build.mk sed -i -e 's|-isysroot /Developer/SDKs/MacOSX10.5.sdk||' configure @@ -322,13 +320,6 @@ stdenv.mkDerivation (rec { postInstall = '' # Install the bash completion file. install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc - - # Patch scripts to include runtime dependencies in $PATH. - for i in "$out/bin/"*; do - test ! -h "$i" || continue - isScript "$i" || continue - sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' "$i" - done ''; passthru = { diff --git a/pkgs/development/compilers/ghc/9.0.1.nix b/pkgs/development/compilers/ghc/9.0.1.nix index e7da05871070..35edd0d4199f 100644 --- a/pkgs/development/compilers/ghc/9.0.1.nix +++ b/pkgs/development/compilers/ghc/9.0.1.nix @@ -115,6 +115,8 @@ let ++ lib.optional (!enableIntegerSimple) gmp ++ lib.optional (platform.libc != "glibc" && !targetPlatform.isWindows) libiconv; + # TODO(@sternenseemann): is buildTarget LLVM unnecessary? + # GHC doesn't seem to have {LLC,OPT}_HOST toolsForTarget = [ pkgsBuildTarget.targetPackages.stdenv.cc ] ++ lib.optional useLLVM buildTargetLlvmPackages.llvm; @@ -127,21 +129,6 @@ let useLdGold = targetPlatform.linker == "gold" || (targetPlatform.linker == "bfd" && (targetPackages.stdenv.cc.bintools.bintools.hasGold or false) && !targetPlatform.isMusl); - # Tools GHC will need to call at runtime. Some of these were handled using - # propagatedBuildInputs before, however this allowed for GHC environment and - # a derivations build environment to interfere, especially when GHC is built. - runtimeDeps = [ - targetPackages.stdenv.cc - targetPackages.stdenv.cc.bintools - coreutils # for cat - ] ++ lib.optionals useLLVM [ - (lib.getBin llvmPackages.llvm) - ] - # On darwin, we need unwrapped bintools as well (for otool) - ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ - targetPackages.stdenv.cc.bintools.bintools - ]; - # Makes debugging easier to see which variant is at play in `nix-store -q --tree`. variantSuffix = lib.concatStrings [ (lib.optionalString stdenv.hostPlatform.isMusl "-musl") @@ -168,6 +155,7 @@ stdenv.mkDerivation (rec { LANG = "en_US.UTF-8"; # GHC is a bit confused on its cross terminology. + # TODO(@sternenseemann): investigate coreutils dependencies and pass absolute paths preConfigure = '' for env in $(env | grep '^TARGET_' | sed -E 's|\+?=.*||'); do export "''${env#TARGET_}=''${!env}" @@ -184,6 +172,19 @@ stdenv.mkDerivation (rec { export RANLIB="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ranlib" export READELF="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}readelf" export STRIP="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}strip" + '' + lib.optionalString (stdenv.targetPlatform.linker == "cctools") '' + export OTOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}otool" + export INSTALL_NAME_TOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}install_name_tool" + '' + lib.optionalString useLLVM '' + export LLC="${lib.getBin llvmPackages.llvm}/bin/llc" + export OPT="${lib.getBin llvmPackages.llvm}/bin/opt" + '' + lib.optionalString (targetCC.isClang || (useLLVM && stdenv.targetPlatform.isDarwin)) (let + # LLVM backend on Darwin needs clang, if we are already using clang, might as well set the environment variable. + # See also https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/codegens.html#llvm-code-generator-fllvm + clang = if targetCC.isClang then targetCC else llvmPackages.clang; + in '' + export CLANG="${clang}/bin/${clang.targetPrefix}clang" + '') + '' echo -n "${buildMK}" > mk/build.mk sed -i -e 's|-isysroot /Developer/SDKs/MacOSX10.5.sdk||' configure @@ -288,13 +289,6 @@ stdenv.mkDerivation (rec { postInstall = '' # Install the bash completion file. install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc - - # Patch scripts to include runtime dependencies in $PATH. - for i in "$out/bin/"*; do - test ! -h "$i" || continue - isScript "$i" || continue - sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' "$i" - done ''; passthru = { diff --git a/pkgs/development/compilers/ghc/9.2.1.nix b/pkgs/development/compilers/ghc/9.2.1.nix index 2401a8900530..e8422372282e 100644 --- a/pkgs/development/compilers/ghc/9.2.1.nix +++ b/pkgs/development/compilers/ghc/9.2.1.nix @@ -116,6 +116,8 @@ let ++ lib.optional (!enableIntegerSimple) gmp ++ lib.optional (platform.libc != "glibc" && !targetPlatform.isWindows) libiconv; + # TODO(@sternenseemann): is buildTarget LLVM unnecessary? + # GHC doesn't seem to have {LLC,OPT}_HOST toolsForTarget = [ pkgsBuildTarget.targetPackages.stdenv.cc ] ++ lib.optional useLLVM buildTargetLlvmPackages.llvm; @@ -127,21 +129,6 @@ let # see #84670 and #49071 for more background. useLdGold = targetPlatform.linker == "gold" || (targetPlatform.linker == "bfd" && !targetPlatform.isMusl); - # Tools GHC will need to call at runtime. Some of these were handled using - # propagatedBuildInputs before, however this allowed for GHC environment and - # a derivations build environment to interfere, especially when GHC is built. - runtimeDeps = [ - targetPackages.stdenv.cc - targetPackages.stdenv.cc.bintools - coreutils # for cat - ] ++ lib.optionals useLLVM [ - (lib.getBin llvmPackages.llvm) - ] - # On darwin, we need unwrapped bintools as well (for otool) - ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ - targetPackages.stdenv.cc.bintools.bintools - ]; - # Makes debugging easier to see which variant is at play in `nix-store -q --tree`. variantSuffix = lib.concatStrings [ (lib.optionalString stdenv.hostPlatform.isMusl "-musl") @@ -168,6 +155,7 @@ stdenv.mkDerivation (rec { LANG = "en_US.UTF-8"; # GHC is a bit confused on its cross terminology. + # TODO(@sternenseemann): investigate coreutils dependencies and pass absolute paths preConfigure = '' for env in $(env | grep '^TARGET_' | sed -E 's|\+?=.*||'); do export "''${env#TARGET_}=''${!env}" @@ -184,6 +172,19 @@ stdenv.mkDerivation (rec { export RANLIB="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ranlib" export READELF="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}readelf" export STRIP="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}strip" + '' + lib.optionalString (stdenv.targetPlatform.linker == "cctools") '' + export OTOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}otool" + export INSTALL_NAME_TOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}install_name_tool" + '' + lib.optionalString useLLVM '' + export LLC="${lib.getBin llvmPackages.llvm}/bin/llc" + export OPT="${lib.getBin llvmPackages.llvm}/bin/opt" + '' + lib.optionalString (targetCC.isClang || (useLLVM && stdenv.targetPlatform.isDarwin)) (let + # LLVM backend on Darwin needs clang, if we are already using clang, might as well set the environment variable. + # See also https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/codegens.html#llvm-code-generator-fllvm + clang = if targetCC.isClang then targetCC else llvmPackages.clang; + in '' + export CLANG="${clang}/bin/${clang.targetPrefix}clang" + '') + '' echo -n "${buildMK}" > mk/build.mk sed -i -e 's|-isysroot /Developer/SDKs/MacOSX10.5.sdk||' configure @@ -292,13 +293,6 @@ stdenv.mkDerivation (rec { postInstall = '' # Install the bash completion file. install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc - - # Patch scripts to include runtime dependencies in $PATH. - for i in "$out/bin/"*; do - test ! -h "$i" || continue - isScript "$i" || continue - sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' "$i" - done ''; passthru = { diff --git a/pkgs/development/compilers/ghc/head.nix b/pkgs/development/compilers/ghc/head.nix index 5be02df13b4a..df8ac642cddf 100644 --- a/pkgs/development/compilers/ghc/head.nix +++ b/pkgs/development/compilers/ghc/head.nix @@ -129,6 +129,8 @@ let ++ lib.optional (platform.libc != "glibc" && !targetPlatform.isWindows) libiconv ++ lib.optional enableDwarf elfutils; + # TODO(@sternenseemann): is buildTarget LLVM unnecessary? + # GHC doesn't seem to have {LLC,OPT}_HOST toolsForTarget = [ pkgsBuildTarget.targetPackages.stdenv.cc ] ++ lib.optional useLLVM buildTargetLlvmPackages.llvm; @@ -141,21 +143,6 @@ let useLdGold = targetPlatform.linker == "gold" || (targetPlatform.linker == "bfd" && (targetPackages.stdenv.cc.bintools.bintools.hasGold or false) && !targetPlatform.isMusl); - # Tools GHC will need to call at runtime. Some of these were handled using - # propagatedBuildInputs before, however this allowed for GHC environment and - # a derivations build environment to interfere, especially when GHC is built. - runtimeDeps = [ - targetPackages.stdenv.cc - targetPackages.stdenv.cc.bintools - coreutils # for cat - ] ++ lib.optionals useLLVM [ - (lib.getBin llvmPackages.llvm) - ] - # On darwin, we need unwrapped bintools as well (for otool) - ++ lib.optionals (stdenv.targetPlatform.linker == "cctools") [ - targetPackages.stdenv.cc.bintools.bintools - ]; - # Makes debugging easier to see which variant is at play in `nix-store -q --tree`. variantSuffix = lib.concatStrings [ (lib.optionalString stdenv.hostPlatform.isMusl "-musl") @@ -181,6 +168,7 @@ stdenv.mkDerivation (rec { postPatch = "patchShebangs ."; # GHC is a bit confused on its cross terminology. + # TODO(@sternenseemann): investigate coreutils dependencies and pass absolute paths preConfigure = '' for env in $(env | grep '^TARGET_' | sed -E 's|\+?=.*||'); do export "''${env#TARGET_}=''${!env}" @@ -198,6 +186,19 @@ stdenv.mkDerivation (rec { export RANLIB="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}ranlib" export READELF="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}readelf" export STRIP="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}strip" + '' + lib.optionalString (stdenv.targetPlatform.linker == "cctools") '' + export OTOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}otool" + export INSTALL_NAME_TOOL="${targetCC.bintools.bintools}/bin/${targetCC.bintools.targetPrefix}install_name_tool" + '' + lib.optionalString useLLVM '' + export LLC="${lib.getBin llvmPackages.llvm}/bin/llc" + export OPT="${lib.getBin llvmPackages.llvm}/bin/opt" + '' + lib.optionalString (targetCC.isClang || (useLLVM && stdenv.targetPlatform.isDarwin)) (let + # LLVM backend on Darwin needs clang, if we are already using clang, might as well set the environment variable. + # See also https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/codegens.html#llvm-code-generator-fllvm + clang = if targetCC.isClang then targetCC else llvmPackages.clang; + in '' + export CLANG="${clang}/bin/${clang.targetPrefix}clang" + '') + '' # otherwise haddock fails when generating the compiler docs export LANG=C.UTF-8 @@ -312,13 +313,6 @@ stdenv.mkDerivation (rec { postInstall = '' # Install the bash completion file. install -D -m 444 utils/completion/ghc.bash $out/share/bash-completion/completions/${targetPrefix}ghc - - # Patch scripts to include runtime dependencies in $PATH. - for i in "$out/bin/"*; do - test ! -h "$i" || continue - isScript "$i" || continue - sed -i -e '2i export PATH="${lib.makeBinPath runtimeDeps}:$PATH"' "$i" - done ''; passthru = { From 8f1a52ac33fb9a441713261c35cecab7b5331512 Mon Sep 17 00:00:00 2001 From: sternenseemann Date: Thu, 25 Nov 2021 19:58:55 +0100 Subject: [PATCH 17/17] haskell.compiler.*: disable useLLVM also for SPARC and PowerPC These targets also have NCG support, but they are tested less (in fact SPARC seems to be untested atm) and may have issues. In such cases being able to fallback to -fllvm without rebuilding the compiler could be useful. OTOH GHC will default to -fasm and the backends probably work well enough in most cases. --- pkgs/development/compilers/ghc/8.10.7.nix | 4 +++- pkgs/development/compilers/ghc/8.8.4.nix | 4 +++- pkgs/development/compilers/ghc/9.0.1.nix | 4 +++- pkgs/development/compilers/ghc/9.2.1.nix | 2 ++ pkgs/development/compilers/ghc/head.nix | 2 ++ 5 files changed, 13 insertions(+), 3 deletions(-) diff --git a/pkgs/development/compilers/ghc/8.10.7.nix b/pkgs/development/compilers/ghc/8.10.7.nix index c8ea523be6a7..5be64bebcd4d 100644 --- a/pkgs/development/compilers/ghc/8.10.7.nix +++ b/pkgs/development/compilers/ghc/8.10.7.nix @@ -11,7 +11,9 @@ , # GHC can be built with system libffi or a bundled one. libffi ? null -, useLLVM ? !stdenv.targetPlatform.isx86 +, useLLVM ? !(stdenv.targetPlatform.isx86 + || stdenv.targetPlatform.isPowerPC + || stdenv.targetPlatform.isSparc) , # LLVM is conceptually a run-time-only depedendency, but for # non-x86, we need LLVM to bootstrap later stages, so it becomes a # build-time dependency too. diff --git a/pkgs/development/compilers/ghc/8.8.4.nix b/pkgs/development/compilers/ghc/8.8.4.nix index ad9a10d33fbc..ffa2c473eec6 100644 --- a/pkgs/development/compilers/ghc/8.8.4.nix +++ b/pkgs/development/compilers/ghc/8.8.4.nix @@ -10,7 +10,9 @@ , # GHC can be built with system libffi or a bundled one. libffi ? null -, useLLVM ? !stdenv.targetPlatform.isx86 +, useLLVM ? !(stdenv.targetPlatform.isx86 + || stdenv.targetPlatform.isPowerPC + || stdenv.targetPlatform.isSparc) , # LLVM is conceptually a run-time-only depedendency, but for # non-x86, we need LLVM to bootstrap later stages, so it becomes a # build-time dependency too. diff --git a/pkgs/development/compilers/ghc/9.0.1.nix b/pkgs/development/compilers/ghc/9.0.1.nix index 35edd0d4199f..d377328692cb 100644 --- a/pkgs/development/compilers/ghc/9.0.1.nix +++ b/pkgs/development/compilers/ghc/9.0.1.nix @@ -12,7 +12,9 @@ , # GHC can be built with system libffi or a bundled one. libffi ? null -, useLLVM ? !stdenv.targetPlatform.isx86 +, useLLVM ? !(stdenv.targetPlatform.isx86 + || stdenv.targetPlatform.isPowerPC + || stdenv.targetPlatform.isSparc) , # LLVM is conceptually a run-time-only depedendency, but for # non-x86, we need LLVM to bootstrap later stages, so it becomes a # build-time dependency too. diff --git a/pkgs/development/compilers/ghc/9.2.1.nix b/pkgs/development/compilers/ghc/9.2.1.nix index e8422372282e..20062358db50 100644 --- a/pkgs/development/compilers/ghc/9.2.1.nix +++ b/pkgs/development/compilers/ghc/9.2.1.nix @@ -13,6 +13,8 @@ libffi ? null , useLLVM ? !(stdenv.targetPlatform.isx86 + || stdenv.targetPlatform.isPowerPC + || stdenv.targetPlatform.isSparc || (stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin)) , # LLVM is conceptually a run-time-only depedendency, but for # non-x86, we need LLVM to bootstrap later stages, so it becomes a diff --git a/pkgs/development/compilers/ghc/head.nix b/pkgs/development/compilers/ghc/head.nix index df8ac642cddf..537b735b4a21 100644 --- a/pkgs/development/compilers/ghc/head.nix +++ b/pkgs/development/compilers/ghc/head.nix @@ -18,6 +18,8 @@ , elfutils # for DWARF support , useLLVM ? !(stdenv.targetPlatform.isx86 + || stdenv.targetPlatform.isPowerPC + || stdenv.targetPlatform.isSparc || (stdenv.targetPlatform.isAarch64 && stdenv.targetPlatform.isDarwin)) , # LLVM is conceptually a run-time-only depedendency, but for # non-x86, we need LLVM to bootstrap later stages, so it becomes a