haskell.compiler.ghc*Binary: make sure meta can always be evaluated

The `meta` set of the binary GHCs is mostly independent of the used
bindist (except for `pname` which includes `variantSuffix`). Thus we
should make sure it can be evaluated even if no bindist is available for
the platform, i.e. evaluating `outPath` may cause an evaluation failure,
but `meta.platforms` not. Use case at present is to make
`lib.meta.availableOn` work everywhere for any GHC (the normal GHCs
inherit their platforms list from their respective boot compiler, at
least for now).

To fix this we need to make sure that shallowly evaluating `passthru`
doesn't force `binDistUsed`, since `mkDerivation` needs to merge
`passthru` into the resulting derivation attribute set, thus forcing the
attribute names of `passthru`. We can easily do this by accessing what
we want to learn from `ghcBinDists` manually and using `or` to fall back
to a sensible default.
This commit is contained in:
sternenseemann 2023-08-02 12:30:10 +02:00
parent 54a572ac07
commit bf388d5514
3 changed files with 12 additions and 3 deletions

View file

@ -421,7 +421,10 @@ stdenv.mkDerivation rec {
# Our Cabal compiler name
haskellCompilerName = "ghc-${version}";
} // lib.optionalAttrs (binDistUsed.isHadrian or false) {
}
# 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) {
# 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.

View file

@ -417,7 +417,10 @@ stdenv.mkDerivation rec {
# Our Cabal compiler name
haskellCompilerName = "ghc-${version}";
} // lib.optionalAttrs (binDistUsed.isHadrian or false) {
}
# 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) {
# 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.

View file

@ -403,7 +403,10 @@ stdenv.mkDerivation rec {
# Our Cabal compiler name
haskellCompilerName = "ghc-${version}";
} // lib.optionalAttrs (binDistUsed.isHadrian or false) {
}
# 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) {
# 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.