top-level: Make overridePackages extend rather than replace existing overrides

This commit is contained in:
John Ericson
2016-10-13 11:14:11 -04:00
parent da36847d92
commit e4cd45a30c
4 changed files with 77 additions and 64 deletions
+57 -48
View File
@@ -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