top-level: Make overridePackages extend rather than replace existing overrides
This commit is contained in:
+57
-48
@@ -61,6 +61,35 @@ let
|
||||
inherit system bootStdenv noSysDirs config crossSystem platform lib;
|
||||
};
|
||||
|
||||
stdenvAdapters = self: super:
|
||||
let res = import ../stdenv/adapters.nix self; in res // {
|
||||
stdenvAdapters = res;
|
||||
};
|
||||
|
||||
trivialBuilders = self: super:
|
||||
(import ../build-support/trivial-builders.nix {
|
||||
inherit lib; inherit (self) stdenv stdenvNoCC; inherit (self.xorg) lndir;
|
||||
});
|
||||
|
||||
stdenvDefault = self: super: (import ./stdenv.nix topLevelArguments) {} pkgs;
|
||||
|
||||
allPackages = self: super:
|
||||
let res = import ./all-packages.nix topLevelArguments res self;
|
||||
in res;
|
||||
|
||||
aliases = self: super: import ./aliases.nix super;
|
||||
|
||||
# stdenvOverrides is used to avoid circular dependencies for building
|
||||
# the standard build environment. This mechanism uses the override
|
||||
# mechanism to implement some staged compilation of the stdenv.
|
||||
#
|
||||
# We don't want stdenv overrides in the case of cross-building, or
|
||||
# otherwise the basic overridden packages will not be built with the
|
||||
# crossStdenv adapter.
|
||||
stdenvOverrides = self: super:
|
||||
lib.optionalAttrs (crossSystem == null && super.stdenv ? overrides)
|
||||
(super.stdenv.overrides super);
|
||||
|
||||
# Allow packages to be overridden globally via the `packageOverrides'
|
||||
# configuration option, which must be a function that takes `pkgs'
|
||||
# as an argument and returns a set of new or overridden packages.
|
||||
@@ -68,54 +97,34 @@ let
|
||||
# (un-overridden) set of packages, allowing packageOverrides
|
||||
# attributes to refer to the original attributes (e.g. "foo =
|
||||
# ... pkgs.foo ...").
|
||||
pkgs = pkgsWithOverrides (self: config.packageOverrides or (super: {}));
|
||||
configOverrides = self: super:
|
||||
lib.optionalAttrs (bootStdenv == null)
|
||||
((config.packageOverrides or (super: {})) super);
|
||||
|
||||
# Return the complete set of packages, after applying the overrides
|
||||
# returned by the `overrider' function (see above). Warning: this
|
||||
# function is very expensive!
|
||||
pkgsWithOverrides = overrider:
|
||||
let
|
||||
stdenvAdapters = self: super:
|
||||
let res = import ../stdenv/adapters.nix self; in res // {
|
||||
stdenvAdapters = res;
|
||||
};
|
||||
# The complete chain of package set builders, applied from bottom to top
|
||||
toFix = lib.fold lib.extends (self: {}) [
|
||||
configOverrides
|
||||
stdenvOverrides
|
||||
aliases
|
||||
allPackages
|
||||
stdenvDefault
|
||||
trivialBuilders
|
||||
stdenvAdapters
|
||||
];
|
||||
|
||||
trivialBuilders = self: super:
|
||||
(import ../build-support/trivial-builders.nix {
|
||||
inherit lib; inherit (self) stdenv stdenvNoCC; inherit (self.xorg) lndir;
|
||||
});
|
||||
# Use `overridePackages` to easily override this package set.
|
||||
# Warning: this function is very expensive and must not be used
|
||||
# from within the nixpkgs repository.
|
||||
#
|
||||
# Example:
|
||||
# pkgs.overridePackages (self: super: {
|
||||
# foo = super.foo.override { ... };
|
||||
# }
|
||||
#
|
||||
# The result is `pkgs' where all the derivations depending on `foo'
|
||||
# will use the new version.
|
||||
|
||||
stdenvDefault = self: super: (import ./stdenv.nix topLevelArguments) {} pkgs;
|
||||
|
||||
allPackagesArgs = topLevelArguments // { inherit pkgsWithOverrides; };
|
||||
allPackages = self: super:
|
||||
let res = import ./all-packages.nix allPackagesArgs res self;
|
||||
in res;
|
||||
|
||||
aliases = self: super: import ./aliases.nix super;
|
||||
|
||||
# stdenvOverrides is used to avoid circular dependencies for building
|
||||
# the standard build environment. This mechanism uses the override
|
||||
# mechanism to implement some staged compilation of the stdenv.
|
||||
#
|
||||
# We don't want stdenv overrides in the case of cross-building, or
|
||||
# otherwise the basic overridden packages will not be built with the
|
||||
# crossStdenv adapter.
|
||||
stdenvOverrides = self: super:
|
||||
lib.optionalAttrs (crossSystem == null && super.stdenv ? overrides)
|
||||
(super.stdenv.overrides super);
|
||||
|
||||
customOverrides = self: super:
|
||||
lib.optionalAttrs (bootStdenv == null) (overrider self super);
|
||||
in
|
||||
lib.fix' (
|
||||
lib.extends customOverrides (
|
||||
lib.extends stdenvOverrides (
|
||||
lib.extends aliases (
|
||||
lib.extends allPackages (
|
||||
lib.extends stdenvDefault (
|
||||
lib.extends trivialBuilders (
|
||||
lib.extends stdenvAdapters (
|
||||
self: {}))))))));
|
||||
in
|
||||
pkgs
|
||||
# Return the complete set of packages. Warning: this function is very
|
||||
# expensive!
|
||||
pkgs = lib.makeExtensibleWithCustomName "overridePackages" toFix;
|
||||
in pkgs
|
||||
|
||||
Reference in New Issue
Block a user