mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-07-13 21:50:33 +03:00
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.
This commit is contained in:
parent
69775e2deb
commit
2acca93bef
2 changed files with 9 additions and 7 deletions
|
@ -110,9 +110,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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue