From d4063e0330ec9f68037d4dbdd12aec3376e679ba Mon Sep 17 00:00:00 2001 From: Ivan Trubach Date: Tue, 12 Sep 2023 16:55:32 +0300 Subject: [PATCH] pkgs/top-level: use lib.systems.equals for crossSystem Fixes otherwise equivalent systems being treated as different by packages that compare `stdenv.*Platform`s using `==` operator. --- pkgs/test/default.nix | 2 ++ pkgs/test/top-level/default.nix | 47 +++++++++++++++++++++++++++++++++ pkgs/top-level/default.nix | 16 +++++++++-- 3 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 pkgs/test/top-level/default.nix diff --git a/pkgs/test/default.nix b/pkgs/test/default.nix index b914ec26ae00..05d8ee61e9a5 100644 --- a/pkgs/test/default.nix +++ b/pkgs/test/default.nix @@ -94,6 +94,8 @@ with pkgs; config = callPackage ./config.nix { }; + top-level = callPackage ./top-level { }; + haskell = callPackage ./haskell { }; hooks = callPackage ./hooks { }; diff --git a/pkgs/test/top-level/default.nix b/pkgs/test/top-level/default.nix new file mode 100644 index 000000000000..fdb9fe09a88b --- /dev/null +++ b/pkgs/test/top-level/default.nix @@ -0,0 +1,47 @@ +{ lib, pkgs, ... }: +let + nixpkgsFun = import ../../top-level; +in +lib.recurseIntoAttrs { + platformEquality = + let + configsLocal = [ + # crossSystem is implicitly set to localSystem. + { + localSystem = { system = "x86_64-linux"; }; + } + { + localSystem = { system = "aarch64-linux"; }; + crossSystem = null; + } + # Both systems explicitly set to the same string. + { + localSystem = { system = "x86_64-linux"; }; + crossSystem = { system = "x86_64-linux"; }; + } + # Vendor and ABI inferred from system double. + { + localSystem = { system = "aarch64-linux"; }; + crossSystem = { config = "aarch64-unknown-linux-gnu"; }; + } + ]; + configsCross = [ + # GNU is inferred from double, but config explicitly requests musl. + { + localSystem = { system = "aarch64-linux"; }; + crossSystem = { config = "aarch64-unknown-linux-musl"; }; + } + # Cross-compile from AArch64 to x86-64. + { + localSystem = { system = "aarch64-linux"; }; + crossSystem = { system = "x86_64-unknown-linux-gnu"; }; + } + ]; + + pkgsLocal = map nixpkgsFun configsLocal; + pkgsCross = map nixpkgsFun configsCross; + in + assert lib.all (p: p.buildPlatform == p.hostPlatform) pkgsLocal; + assert lib.all (p: p.buildPlatform != p.hostPlatform) pkgsCross; + pkgs.emptyFile; +} diff --git a/pkgs/top-level/default.nix b/pkgs/top-level/default.nix index ba00e78ce2e6..5c224802d5bf 100644 --- a/pkgs/top-level/default.nix +++ b/pkgs/top-level/default.nix @@ -61,10 +61,22 @@ in let localSystem = lib.systems.elaborate args.localSystem; # Condition preserves sharing which in turn affects equality. + # + # See `lib.systems.equals` documentation for more details. + # + # Note that it is generally not possible to compare systems as given in + # parameters, e.g. if systems are initialized as + # + # localSystem = { system = "x86_64-linux"; }; + # crossSystem = { config = "x86_64-unknown-linux-gnu"; }; + # + # Both systems are semantically equivalent as the same vendor and ABI are + # inferred from the system double in `localSystem`. crossSystem = - if crossSystem0 == null || crossSystem0 == args.localSystem + let system = lib.systems.elaborate crossSystem0; in + if crossSystem0 == null || lib.systems.equals system localSystem then localSystem - else lib.systems.elaborate crossSystem0; + else system; # Allow both: # { /* the config */ } and