summaryrefslogtreecommitdiffstats
path: root/pkgs/top-level/stage.nix
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2019-03-13 13:34:38 -0400
committerJohn Ericson <git@JohnEricson.me>2019-03-24 22:12:15 -0400
commit70d71bbbe46eecfefc920bb1a919960d5feb9fc4 (patch)
tree5b65648837c13163f04829c492c1d3f08b898c35 /pkgs/top-level/stage.nix
parentceb27efde0532bb663e3d8c4fe20f82ee4dc22e3 (diff)
top-level: Create `pkgs{Build,Host,Target}{Build,Host,Target}`
This is needed to avoid confusing and repeated boilerplate for `fooForTarget`. The vast majority of use-cases can still use `buildPackages or `targetPackages`, which are now defined in terms of these.
Diffstat (limited to 'pkgs/top-level/stage.nix')
-rw-r--r--pkgs/top-level/stage.nix59
1 files changed, 43 insertions, 16 deletions
diff --git a/pkgs/top-level/stage.nix b/pkgs/top-level/stage.nix
index 0ee5c25b0101..f04cdf338e8f 100644
--- a/pkgs/top-level/stage.nix
+++ b/pkgs/top-level/stage.nix
@@ -21,18 +21,23 @@
## Other parameters
##
-, # The package set used at build-time. If null, `buildPackages` will
- # be defined internally as the final produced package set itself. This allows
- # us to avoid expensive splicing.
- buildPackages
-
-, # The package set used in the next stage. If null, `targetPackages` will be
- # defined internally as the final produced package set itself, just like with
- # `buildPackages` and for the same reasons.
+, # Either null or an object in the form:
#
- # THIS IS A HACK for compilers that don't think critically about cross-
- # compilation. Please do *not* use unless you really know what you are doing.
- targetPackages
+ # {
+ # pkgsBuildBuild = ...;
+ # pkgsBuildHost = ...;
+ # pkgsBuildTarget = ...;
+ # pkgsHostHost = ...;
+ # # pkgsHostTarget skipped on purpose.
+ # pkgsTargetTarget ...;
+ # }
+ #
+ # These are references to adjacent bootstrapping stages. The more familiar
+ # `buildPackages` and `targetPackages` are defined in terms of them. If null,
+ # they are instead defined internally as the current stage. This allows us to
+ # avoid expensive splicing. `pkgsHostTarget` is skipped because it is always
+ # defined as the current stage.
+ adjacentPackages
, # The standard environment to use for building packages.
stdenv
@@ -70,11 +75,33 @@ let
inherit (self) runtimeShell;
};
- stdenvBootstappingAndPlatforms = self: super: {
- buildPackages = (if buildPackages == null then self else buildPackages)
- // { recurseForDerivations = false; };
- targetPackages = (if targetPackages == null then self else targetPackages)
+ stdenvBootstappingAndPlatforms = self: super: let
+ withFallback = thisPkgs:
+ (if adjacentPackages == null then self else thisPkgs)
// { recurseForDerivations = false; };
+ in {
+ # Here are package sets of from related stages. They are all in the form
+ # `pkgs{theirHost}{theirTarget}`. For example, `pkgsBuildHost` means their
+ # host platform is our build platform, and their target platform is our host
+ # platform. We only care about their host/target platforms, not their build
+ # platform, because the the former two alone affect the interface of the
+ # final package; the build platform is just an implementation detail that
+ # should not leak.
+ pkgsBuildBuild = withFallback adjacentPackages.pkgsBuildBuild;
+ pkgsBuildHost = withFallback adjacentPackages.pkgsBuildHost;
+ pkgsBuildTarget = withFallback adjacentPackages.pkgsBuildTarget;
+ pkgsHostHost = withFallback adjacentPackages.pkgsHostHost;
+ pkgsHostTarget = self // { recurseForDerivations = false; }; # always `self`
+ pkgsTargetTarget = withFallback adjacentPackages.pkgsTargetTarget;
+
+ # Older names for package sets. Use these when only the host platform of the
+ # package set matter (i.e. use `buildPackages` where any of `pkgsBuild*`
+ # would do, and `targetPackages` when any of `pkgsTarget*` would do (if we
+ # had more than just `pkgsTargetTarget`).)
+ buildPackages = self.pkgsBuildHost;
+ pkgs = self.pkgsHostTarget;
+ targetPackages = self.pkgsTargetTarget;
+
inherit stdenv;
};
@@ -87,7 +114,7 @@ let
inherit (hostPlatform) system;
};
- splice = self: super: import ./splice.nix lib self (buildPackages != null);
+ splice = self: super: import ./splice.nix lib self (adjacentPackages != null);
allPackages = self: super:
let res = import ./all-packages.nix