diff options
Diffstat (limited to 'pkgs/development/tools/haskell/hadrian/make-hadrian.nix')
-rw-r--r-- | pkgs/development/tools/haskell/hadrian/make-hadrian.nix | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/pkgs/development/tools/haskell/hadrian/make-hadrian.nix b/pkgs/development/tools/haskell/hadrian/make-hadrian.nix new file mode 100644 index 000000000000..6aa30cb9e60c --- /dev/null +++ b/pkgs/development/tools/haskell/hadrian/make-hadrian.nix @@ -0,0 +1,59 @@ +# Hadrian is the build system used to (exclusively) build GHC. It can +# (theoretically) be used starting with GHC 9.4 and is required since 9.6. It is +# developed in the GHC source tree and specific to the GHC version it is released +# with, i.e. Hadrian always needs to be built from the same GHC source tree as +# the GHC we want to build. +# +# This fact makes it impossible to integrate Hadrian into our Haskell package +# sets which are also used to bootstrap GHC, since a package set can bootstrap +# multiple GHC versions (usually two major versions). A bootstrap set would need +# knowledge of the GHC it would eventually bootstrap which would make the logic +# unnecessarily complicated. +# +# Luckily Hadrian is, while annoying to bootstrap, relatively simple. Specifically +# all it requires to build is (relative to the GHC we are trying to build) a +# build->build GHC and build->build Haskell packages. We can get all of this +# from bootPkgs which is already passed to the GHC expression. +# +# The solution is the following: The GHC expression passes its source tree and +# version along with some parameters to this function (./make-hadrian.nix) +# which acts as a common expression builder for all Hadrian version as well as +# related packages that are managed in the GHC source tree. Its main job is to +# expose all possible compile time customization in a common interface and +# take care of all differences between Hadrian versions. +{ bootPkgs +, lib +}: + +{ # GHC source tree and version to build hadrian & friends from. + # These are passed on to the actual package expressions. + ghcSrc +, ghcVersion + # Contents of a non-default UserSettings.hs to use when building hadrian, if any. + # Should be a string or null. +, userSettings ? null + # Whether to pass --hyperlinked-source to haddock or not. This is a custom + # workaround as we wait for this to be configurable via userSettings or similar. + # https://gitlab.haskell.org/ghc/ghc/-/issues/23625 +, enableHyperlinkedSource ? false +}: + +let + callPackage' = f: args: bootPkgs.callPackage f ({ + inherit ghcSrc ghcVersion; + } // args); + + ghc-platform = callPackage' ./ghc-platform.nix { }; + ghc-toolchain = callPackage' ./ghc-toolchain.nix { + inherit ghc-platform; + }; +in + +callPackage' ./hadrian.nix ({ + inherit userSettings enableHyperlinkedSource; +} // lib.optionalAttrs (lib.versionAtLeast ghcVersion "9.9") { + # Starting with GHC 9.9 development, additional in tree packages are required + # to build hadrian. (Hackage-released conditional dependencies are handled + # in ./hadrian.nix without requiring intervention here.) + inherit ghc-platform ghc-toolchain; +}) |