Commit d4063e03 authored by Ivan Trubach's avatar Ivan Trubach
Browse files

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.
parent 240cbdc8
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -94,6 +94,8 @@ with pkgs;

  config = callPackage ./config.nix { };

  top-level = callPackage ./top-level { };

  haskell = callPackage ./haskell { };

  hooks = callPackage ./hooks { };
+47 −0
Original line number Diff line number Diff line
{ 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;
}
+14 −2
Original line number Diff line number Diff line
@@ -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