Skip to content

Commit

Permalink
pkgs/top-level: fix composing "native cross" package sets
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
wolfgangwalther committed Jan 11, 2025
1 parent 0d303f3 commit 6693a00
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 7 deletions.
5 changes: 2 additions & 3 deletions pkgs/test/top-level/stage.nix
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,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
Expand Down
11 changes: 7 additions & 4 deletions pkgs/top-level/stage.nix
Original file line number Diff line number Diff line change
Expand Up @@ -191,10 +191,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 lib.optionalAttrs (stdenv.hostPlatform == stdenv.buildPlatform) { localSystem = newSystem; }
// lib.optionalAttrs (prevArgs ? crossSystem) { crossSystem = 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
Expand Down

0 comments on commit 6693a00

Please sign in to comment.