summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/systems/default.nix18
-rw-r--r--lib/systems/platforms.nix2
-rw-r--r--pkgs/top-level/default.nix16
3 files changed, 29 insertions, 7 deletions
diff --git a/lib/systems/default.nix b/lib/systems/default.nix
index 70d431837daa..d956969a18f9 100644
--- a/lib/systems/default.nix
+++ b/lib/systems/default.nix
@@ -2,4 +2,22 @@ rec {
doubles = import ./doubles.nix;
parse = import ./parse.nix;
platforms = import ./platforms.nix;
+
+ # Elaborate a `localSystem` or `crossSystem` so that it contains everything
+ # necessary.
+ #
+ # `parsed` is inferred from args, both because there are two options with one
+ # clearly prefered, and to prevent cycles. A simpler fixed point where the RHS
+ # always just used `final.*` would fail on both counts.
+ elaborate = args: let
+ final = {
+ # Prefer to parse `config` as it is strictly more informative.
+ parsed = parse.mkSystemFromString (if args ? config then args.config else args.system);
+ # Either of these can be losslessly-extracted from `parsed` iff parsing succeeds.
+ system = parse.doubleFromSystem final.parsed;
+ config = parse.tripleFromSystem final.parsed;
+ # Just a guess, based on `system`
+ platform = platforms.selectBySystem final.system;
+ } // args;
+ in final;
}
diff --git a/lib/systems/platforms.nix b/lib/systems/platforms.nix
index 665950766f7e..4322c8e2ff68 100644
--- a/lib/systems/platforms.nix
+++ b/lib/systems/platforms.nix
@@ -474,7 +474,7 @@ rec {
};
};
- selectPlatformBySystem = system: {
+ selectBySystem = system: {
"i686-linux" = pc32;
"x86_64-linux" = pc64;
"armv5tel-linux" = sheevaplug;
diff --git a/pkgs/top-level/default.nix b/pkgs/top-level/default.nix
index 48dbe7118bc2..5d3da35c54fb 100644
--- a/pkgs/top-level/default.nix
+++ b/pkgs/top-level/default.nix
@@ -40,6 +40,7 @@
let # Rename the function arguments
configExpr = config;
+ crossSystem0 = crossSystem;
in let
lib = import ../../lib;
@@ -52,12 +53,15 @@ in let
then configExpr { inherit pkgs; }
else configExpr;
- # Allow setting the platform in the config file. Otherwise, let's use a
- # reasonable default.
- localSystem =
- { platform = lib.systems.platforms.selectPlatformBySystem args.localSystem.system; }
- // builtins.intersectAttrs { platform = null; } config
- // args.localSystem;
+ # From a minimum of `system` or `config` (actually a target triple, *not*
+ # nixpkgs configuration), infer the other one and platform as needed.
+ localSystem = lib.systems.elaborate (
+ # Allow setting the platform in the config file. This take precedence over
+ # the inferred platform, but not over an explicitly passed-in onw.
+ builtins.intersectAttrs { platform = null; } config
+ // args.localSystem);
+
+ crossSystem = lib.mapNullable lib.systems.elaborate crossSystem0;
# A few packages make a new package set to draw their dependencies from.
# (Currently to get a cross tool chain, or forced-i686 package.) Rather than