From 4d699fc30b32d6f3de7d23ee5142e8d4ba1ded03 Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sat, 21 Dec 2024 16:42:40 +0100 Subject: [PATCH] pkgs/top-level: fix composing "native cross" package sets When using pkgsCross with a system that ends up the same as the localSystem, then modifications for package sets like pksgMusl need to be done for **both** localSystem and crossSystem. Consider the following on x86_64-linux: pkgsCross.gnu64.pkgsMusl Before this change, this would result in a musl buildPlatform, but a gnu hostPlatform. This breaks the promise of "stacking" package sets on top of each other. After this change, it results in a musl buildPlatform and a musl hostPlatform. This works better. One could expect this to result in the same as pkgsCross.musl64, i.e. a gnu buildPlatform and a musl hostPlatform, however I couldn't get this to work without increasing memory usage for ci/eval by many, many GB. This is caused by usage of pkgsi686Linux inside the main package set, which follows the same hybrid pattern. --- pkgs/test/top-level/stage.nix | 5 ++--- pkgs/top-level/stage.nix | 11 +++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/pkgs/test/top-level/stage.nix b/pkgs/test/top-level/stage.nix index 20b28f10ddad50..69afa027df5262 100644 --- a/pkgs/test/top-level/stage.nix +++ b/pkgs/test/top-level/stage.nix @@ -107,9 +107,8 @@ assert isComposable "pkgsStatic"; assert isComposable "pkgsi686Linux"; # Special cases regarding buildPlatform vs hostPlatform -# TODO: fails -# assert discardEvaluationErrors (pkgsCross.gnu64.pkgsMusl.stdenv.hostPlatform.isMusl); -# assert discardEvaluationErrors (pkgsCross.gnu64.pkgsi686Linux.stdenv.hostPlatform.isx86_32); +assert discardEvaluationErrors (pkgsCross.gnu64.pkgsMusl.stdenv.hostPlatform.isMusl); +assert discardEvaluationErrors (pkgsCross.gnu64.pkgsi686Linux.stdenv.hostPlatform.isx86_32); assert discardEvaluationErrors (pkgsCross.mingwW64.pkgsLinux.stdenv.hostPlatform.isLinux); assert discardEvaluationErrors ( pkgsCross.aarch64-darwin.pkgsx86_64Darwin.stdenv.hostPlatform.isx86_64 diff --git a/pkgs/top-level/stage.nix b/pkgs/top-level/stage.nix index 4ba1fa199707a4..9854fe66cf4d73 100644 --- a/pkgs/top-level/stage.nix +++ b/pkgs/top-level/stage.nix @@ -195,10 +195,13 @@ let (lib.systems.systemToAttrs (lib.defaultTo prevArgs.localSystem prevArgs.crossSystem or null)) // crossAttrs; }); # This is only cross when we are already cross, otherwise local. - mkHybridPkgs = name: hybridAttrs: mkPkgs name (prevArgs: { - ${if stdenv.hostPlatform == stdenv.buildPlatform then "localSystem" else "crossSystem"} = - (lib.systems.systemToAttrs (lib.defaultTo prevArgs.localSystem prevArgs.crossSystem or null)) // hybridAttrs; - }); + # For the case of "native cross", i.e. pkgsCross.gnu64 on a x86_64-linux system, we need to adjust **both** + # localSystem **and** crossSystem, otherwise they're out of sync. + mkHybridPkgs = name: hybridAttrs: mkPkgs name (prevArgs: let + newSystem = (lib.systems.systemToAttrs (lib.defaultTo prevArgs.localSystem prevArgs.crossSystem or null)) // hybridAttrs; + in { crossSystem = newSystem; } + // lib.optionalAttrs (stdenv.hostPlatform == stdenv.buildPlatform) { localSystem = newSystem; } + ); in self: super: { # This maps each entry in lib.systems.examples to its own package # set. Each of these will contain all packages cross compiled for