haskellPackages.mkDerivation: propagate pc deps for GHC >= 9.4

This change essentially amounts to inlining
__CabalEagerPkgConfigWorkaround into haskellPackages.mkDerivation and
applying it automatically for the affected GHC versions. This is a bit
overeager, but the best automatic solution we can come up with for now.

Consequently, we don't need __CabalEagerPkgConfigWorkaround in nixpkgs
anymore nor downstream at least for “standard” haskellPackages builds.
__CabalEagerPkgConfigWorkaround is preserved for now since it is still
necessary if using GHC < 9.4 with Cabal >= 3.10 or cabal-install >= 3.10.

The one thing that may or may not be negatively affected by this change
is ghcWithPackages. I doubt this is a problem in practice though, since
it didn't provide pkg-config in the first place. passthru.env and
shellFor do and work correctly since they rely on mkDerivation.
This commit is contained in:
sternenseemann 2023-07-26 22:11:12 +02:00
parent f6f780f129
commit a83158c7b9
3 changed files with 35 additions and 72 deletions

View file

@ -112,44 +112,4 @@ in {
fourmolu = overrideCabal (drv: {
libraryHaskellDepends = drv.libraryHaskellDepends ++ [ self.file-embed ];
}) (disableCabalFlag "fixity-th" super.fourmolu);
# Apply workaround for Cabal 3.8 bug https://github.com/haskell/cabal/issues/8455
# by making `pkg-config --static` happy. Note: Cabal 3.9 is also affected, so
# the GHC 9.6 configuration shall need similar overrides.
X11-xft = __CabalEagerPkgConfigWorkaround super.X11-xft;
# Jailbreaks for https://github.com/gtk2hs/gtk2hs/issues/323#issuecomment-1416723309
glib = __CabalEagerPkgConfigWorkaround (doJailbreak super.glib);
cairo = __CabalEagerPkgConfigWorkaround (doJailbreak super.cairo);
pango = __CabalEagerPkgConfigWorkaround (doJailbreak super.pango);
# Cabal 3.8 bug workaround for haskell-gi family of libraries
gi-atk = __CabalEagerPkgConfigWorkaround super.gi-atk;
gi-cairo = __CabalEagerPkgConfigWorkaround super.gi-cairo;
gi-gdk = __CabalEagerPkgConfigWorkaround super.gi-gdk;
gi-gdkpixbuf = __CabalEagerPkgConfigWorkaround super.gi-gdkpixbuf;
gi-gio = __CabalEagerPkgConfigWorkaround super.gi-gio;
gi-glib = __CabalEagerPkgConfigWorkaround super.gi-glib;
gi-gmodule = __CabalEagerPkgConfigWorkaround super.gi-gmodule;
gi-gobject = __CabalEagerPkgConfigWorkaround super.gi-gobject;
gi-gtk = __CabalEagerPkgConfigWorkaround super.gi-gtk;
gi-harfbuzz = __CabalEagerPkgConfigWorkaround super.gi-harfbuzz;
gi-pango = __CabalEagerPkgConfigWorkaround super.gi-pango;
gi-vte = __CabalEagerPkgConfigWorkaround super.gi-vte;
haskell-gi = __CabalEagerPkgConfigWorkaround super.haskell-gi;
haskell-gi-base = __CabalEagerPkgConfigWorkaround super.haskell-gi-base;
svgcairo = __CabalEagerPkgConfigWorkaround super.svgcairo;
gtk3 = __CabalEagerPkgConfigWorkaround super.gtk3;
webkit2gtk3-javascriptcore = __CabalEagerPkgConfigWorkaround super.webkit2gtk3-javascriptcore;
gi-javascriptcore = __CabalEagerPkgConfigWorkaround super.gi-javascriptcore;
gi-soup = __CabalEagerPkgConfigWorkaround super.gi-soup;
gio = __CabalEagerPkgConfigWorkaround super.gio;
gtk = __CabalEagerPkgConfigWorkaround super.gtk;
termonad = __CabalEagerPkgConfigWorkaround super.termonad;
gi-cairo-render = __CabalEagerPkgConfigWorkaround super.gi-cairo-render;
gi-dbusmenu = __CabalEagerPkgConfigWorkaround super.gi-dbusmenu;
gi-dbusmenugtk3 = __CabalEagerPkgConfigWorkaround super.gi-dbusmenugtk3;
gi-gdkx11 = __CabalEagerPkgConfigWorkaround super.gi-gdkx11;
gi-xlib = __CabalEagerPkgConfigWorkaround super.gi-xlib;
gtk-sni-tray = __CabalEagerPkgConfigWorkaround super.gtk-sni-tray;
taffybar = __CabalEagerPkgConfigWorkaround super.taffybar;
}

View file

@ -243,37 +243,8 @@ self: super: {
package-version # doctest <0.21, tasty-hedgehog <1.4
;
# Apply workaround for Cabal 3.9 bug https://github.com/haskell/cabal/issues/8455
# by making `pkg-config --static` happy. Note: Cabal 3.8 is also affected, so
# the GHC 9.4 configuration needs similar overrides.
inherit (pkgs.lib.mapAttrs (_: __CabalEagerPkgConfigWorkaround) super)
X11-xft
cairo
gi-atk
gi-cairo
gi-cairo-render
gi-dbusmenu
gi-dbusmenugtk3
gi-gdk
gi-gdkpixbuf
gi-gdkx11
gi-gio
gi-glib
gi-gmodule
gi-gobject
gi-harfbuzz
gi-pango
gi-xlib
glib
gtk-sni-tray
haskell-gi
haskell-gi-base
pango
taffybar
;
# Avoid triggering an issue in ghc-9.6.2
gi-gtk = disableParallelBuilding (__CabalEagerPkgConfigWorkaround super.gi-gtk);
gi-gtk = disableParallelBuilding super.gi-gtk;
# Pending text-2.0 support https://github.com/gtk2hs/gtk2hs/issues/327
gtk = doJailbreak super.gtk;

View file

@ -256,8 +256,40 @@ let
isHaskellPkg = x: x ? isHaskellLibrary;
allPkgconfigDepends = pkg-configDepends ++ libraryPkgconfigDepends ++ executablePkgconfigDepends ++
optionals doCheck testPkgconfigDepends ++ optionals doBenchmark benchmarkPkgconfigDepends;
# Work around a Cabal bug requiring pkg-config --static --libs to work even
# when linking dynamically, affecting Cabal 3.8 and 3.9.
# https://github.com/haskell/cabal/issues/8455
#
# For this, we treat the runtime system/pkg-config dependencies of a Haskell
# derivation as if they were propagated from their dependencies which allows
# pkg-config --static to work in most cases.
allPkgconfigDepends =
let
# Take list of derivations and return list of the transitive dependency
# closure, only taking into account buildInputs. Loosely based on
# closePropagationFast.
propagatePlainBuildInputs = drvs:
builtins.map (i: i.val) (
builtins.genericClosure {
startSet = builtins.map (drv:
{ key = drv.outPath; val = drv; }
) (builtins.filter lib.isDerivation drvs);
operator = { val, ... }:
builtins.concatMap (drv:
if !lib.isDerivation drv
then [ ]
else [ { key = drv.outPath; val = drv; } ]
) (val.buildInputs or [ ] ++ val.propagatedBuildInputs or [ ]);
}
);
in
if lib.versionAtLeast ghc.version "9.3"
then propagatePlainBuildInputs allPkgconfigDepends'
else allPkgconfigDepends';
allPkgconfigDepends' =
pkg-configDepends ++ libraryPkgconfigDepends ++ executablePkgconfigDepends ++
optionals doCheck testPkgconfigDepends ++ optionals doBenchmark benchmarkPkgconfigDepends;
depsBuildBuild = [ nativeGhc ]
# CC_FOR_BUILD may be necessary if we have no C preprocessor for the host