haskellPackages.mkDerivation: opt to only propagate pkgConfigModules
The main idea is to limit the amount of flags passed to Setup.hs as well as, consequently, linkers and C compilers. E.g. in the case of gi-javascriptcore, the default behavior causes the argv limit to be exceeded.
This commit is contained in:
parent
305246161f
commit
88f2062797
1 changed files with 20 additions and 4 deletions
|
@ -98,6 +98,15 @@ in
|
||||||
# build products from that prior build as a starting point for accelerating
|
# build products from that prior build as a starting point for accelerating
|
||||||
# this build
|
# this build
|
||||||
, previousIntermediates ? null
|
, previousIntermediates ? null
|
||||||
|
, # For GHC >= 9.4 we currently automatically propagate the dependencies of
|
||||||
|
# allPkgconfigDepends to be direct dependencies to allow Cabal >= 3.8
|
||||||
|
# to call `pkg-config --libs --static` (https://github.com/haskell/cabal/issues/8455).
|
||||||
|
# This can easily lead to the argv limit being exceeded in linker or C compiler
|
||||||
|
# invocations. To work around this we can only propagate derivations that are
|
||||||
|
# known to provide pkg-config modules, as indicated by the presence of
|
||||||
|
# `meta.pkgConfigModules`. This option defaults to false for now, since this
|
||||||
|
# metadata is far from complete in nixpkgs.
|
||||||
|
__onlyPropagateKnownPkgConfigModules ? false
|
||||||
} @ args:
|
} @ args:
|
||||||
|
|
||||||
assert editedCabalFile != null -> revision != null;
|
assert editedCabalFile != null -> revision != null;
|
||||||
|
@ -265,6 +274,13 @@ let
|
||||||
# pkg-config --static to work in most cases.
|
# pkg-config --static to work in most cases.
|
||||||
allPkgconfigDepends =
|
allPkgconfigDepends =
|
||||||
let
|
let
|
||||||
|
# If __onlyPropagateKnownPkgConfigModules is set, packages without
|
||||||
|
# meta.pkgConfigModules will be filtered out, otherwise all packages in
|
||||||
|
# buildInputs and propagatePlainBuildInputs are propagated.
|
||||||
|
propagateValue = drv:
|
||||||
|
lib.isDerivation drv
|
||||||
|
&& (__onlyPropagateKnownPkgConfigModules -> drv ? meta.pkgConfigModules);
|
||||||
|
|
||||||
# Take list of derivations and return list of the transitive dependency
|
# Take list of derivations and return list of the transitive dependency
|
||||||
# closure, only taking into account buildInputs. Loosely based on
|
# closure, only taking into account buildInputs. Loosely based on
|
||||||
# closePropagationFast.
|
# closePropagationFast.
|
||||||
|
@ -273,12 +289,12 @@ let
|
||||||
builtins.genericClosure {
|
builtins.genericClosure {
|
||||||
startSet = builtins.map (drv:
|
startSet = builtins.map (drv:
|
||||||
{ key = drv.outPath; val = drv; }
|
{ key = drv.outPath; val = drv; }
|
||||||
) (builtins.filter lib.isDerivation drvs);
|
) (builtins.filter propagateValue drvs);
|
||||||
operator = { val, ... }:
|
operator = { val, ... }:
|
||||||
builtins.concatMap (drv:
|
builtins.concatMap (drv:
|
||||||
if !lib.isDerivation drv
|
if propagateValue drv
|
||||||
then [ ]
|
then [ { key = drv.outPath; val = drv; } ]
|
||||||
else [ { key = drv.outPath; val = drv; } ]
|
else [ ]
|
||||||
) (val.buildInputs or [ ] ++ val.propagatedBuildInputs or [ ]);
|
) (val.buildInputs or [ ] ++ val.propagatedBuildInputs or [ ]);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in a new issue