From 5643714dea562f0161529ab23058562afeff46d0 Mon Sep 17 00:00:00 2001 From: Alyssa Ross Date: Mon, 30 May 2022 14:16:22 +0000 Subject: [PATCH] stdenvBootstrapTools: inherit {cross,local}System It's expected that attributes in the top-level package set will all use that package set, but this wasn't the case for the bootstrap tools. This led some very confusing behaviour: - pkgsMusl.stdenvBootstrapTools would build glibc bootstrap tools - stdenvBootstrapTools was _always_ cross compiled, even if Nixpkgs wasn't, because it always set crossSystem. This also didn't match the behaviour of using make-bootstrap-tools.nix as an entrypoint, where crossSystem would default to null. For the Linux stdenv, I've made the ideal fix, which is to make pkgs an argument rather than taking the arguments for pkgs, and then re-importing it. This means it'll always use exactly the same package set that's calling it, and should also mean faster eval due to not importing Nixpkgs twice. The Darwin stdenv is more complicated, and I'm not able to easily test it, so I wasn't confident in making the same fix there. Instead, I've just made sure crossSystem and localSystem are set to the correct values so they're not always cross compiled and match the parent package set's. It would still be preferable if somebody could make Darwin's make-bootstrap-tools.nix take pkgs as an argument, rather than all the arguments for pkgs. --- pkgs/stdenv/darwin/make-bootstrap-tools.nix | 8 +++++--- pkgs/stdenv/linux/make-bootstrap-tools.nix | 5 +---- pkgs/top-level/all-packages.nix | 16 +++++++++------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/pkgs/stdenv/darwin/make-bootstrap-tools.nix b/pkgs/stdenv/darwin/make-bootstrap-tools.nix index 1fed692fd1ce..da4a94e34b01 100644 --- a/pkgs/stdenv/darwin/make-bootstrap-tools.nix +++ b/pkgs/stdenv/darwin/make-bootstrap-tools.nix @@ -1,5 +1,7 @@ { pkgspath ? ../../.., test-pkgspath ? pkgspath -, system ? builtins.currentSystem, crossSystem ? null, bootstrapFiles ? null +, localSystem ? { system = builtins.currentSystem; } +, crossSystem ? null +, bootstrapFiles ? null }: let cross = if crossSystem != null @@ -11,7 +13,7 @@ let cross = if crossSystem != null in (import "${pkgspath}/pkgs/stdenv/darwin" args').stagesDarwin; } else {}; -in with import pkgspath ({ inherit system; } // cross // custom-bootstrap); +in with import pkgspath ({ inherit localSystem; } // cross // custom-bootstrap); let llvmPackages = llvmPackages_11; @@ -364,7 +366,7 @@ in rec { test-pkgs = import test-pkgspath { # if the bootstrap tools are for another platform, we should be testing # that platform. - system = if crossSystem != null then crossSystem else system; + localSystem = if crossSystem != null then crossSystem else localSystem; stdenvStages = args: let args' = args // { inherit bootstrapLlvmVersion bootstrapFiles; }; diff --git a/pkgs/stdenv/linux/make-bootstrap-tools.nix b/pkgs/stdenv/linux/make-bootstrap-tools.nix index d23a996dfcb4..b2d04c8667d5 100644 --- a/pkgs/stdenv/linux/make-bootstrap-tools.nix +++ b/pkgs/stdenv/linux/make-bootstrap-tools.nix @@ -1,9 +1,6 @@ -{ localSystem ? { system = builtins.currentSystem; } -, crossSystem ? null -}: +{ pkgs ? import ../../.. {} }: let - pkgs = import ../../.. { inherit localSystem crossSystem; }; libc = pkgs.stdenv.cc.libc; in with pkgs; rec { diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index cd897ea89774..1df7461b98de 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -1918,13 +1918,15 @@ with pkgs; brewtarget = libsForQt514.callPackage ../applications/misc/brewtarget { } ; - stdenvBootstrapTools = - let args = { crossSystem = stdenv.hostPlatform.system; }; in - if stdenv.hostPlatform.isDarwin - then callPackage ../stdenv/darwin/make-bootstrap-tools.nix args - else if stdenv.hostPlatform.isLinux - then callPackage ../stdenv/linux/make-bootstrap-tools.nix args - else throw "stdenvBootstrapTools: unknown hostPlatform ${stdenv.hostPlatform.config}"; + stdenvBootstrapTools = if stdenv.hostPlatform.isDarwin then + callPackage ../stdenv/darwin/make-bootstrap-tools.nix { + localSystem = stdenv.buildPlatform; + crossSystem = + if stdenv.buildPlatform == stdenv.hostPlatform then null else stdenv.hostPlatform; + } + else if stdenv.hostPlatform.isLinux then + callPackage ../stdenv/linux/make-bootstrap-tools.nix {} + else throw "stdenvBootstrapTools: unknown hostPlatform ${stdenv.hostPlatform.config}"; boxes = callPackage ../tools/text/boxes { };