Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

aarch64: enable rebootstrap, upgrade to gcc11 #209462

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions pkgs/stdenv/cross/default.nix
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
{ lib
, localSystem, crossSystem, config, overlays, crossOverlays ? []
, rebootstrap ? false
}:

assert rebootstrap -> throw "bootstrapping is irrelevant to stdenv/cross";

let
bootStages = import ../. {
inherit lib localSystem overlays;
Expand Down
3 changes: 3 additions & 0 deletions pkgs/stdenv/custom/default.nix
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
{ lib
, localSystem, crossSystem, config, overlays, crossOverlays ? []
, rebootstrap ? false
}:

assert rebootstrap -> throw "bootstrapping is not relevant to stdenv/custom";

assert crossSystem == localSystem;

let
Expand Down
2 changes: 2 additions & 0 deletions pkgs/stdenv/darwin/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,11 @@
cpio = fetch { file = "cpio"; sha256 = "sha256-SWkwvLaFyV44kLKL2nx720SvcL4ej/p2V/bX3uqAGO0="; };
tarball = fetch { file = "bootstrap-tools.cpio.bz2"; sha256 = "sha256-kRC/bhCmlD4L7KAvJQgcukk7AinkMz4IwmG1rqlh5tA="; executable = false; };
}
, rebootstrap ? false
}:

assert crossSystem == localSystem;
assert rebootstrap -> throw "darwin does not yet support automatic rebootstrapping";

let
inherit (localSystem) system;
Expand Down
7 changes: 7 additions & 0 deletions pkgs/stdenv/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@
lib
# Args to pass on to the pkgset builder, too
, localSystem, crossSystem, config, overlays, crossOverlays ? []

# If true, the bootstrapFiles will be rebuilt, resulting in a stdenv
# built by the same compiler as its bootstrap tools. Turning this
# feature on will considerably increase the rebuild cycle, but may
# help with troubleshooting the bootstrap.
, rebootstrap ? false

} @ args:

let
Expand Down
3 changes: 3 additions & 0 deletions pkgs/stdenv/freebsd/default.nix
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
{ lib
, localSystem, crossSystem, config, overlays, crossOverlays ? []
, rebootstrap ? false
}:

assert rebootstrap -> throw "stdenv/freebsd does not yet support automatic rebootstrapping";

assert crossSystem == localSystem;
let inherit (localSystem) system;
fetchURL = import <nix/fetchurl.nix>;
Expand Down
47 changes: 35 additions & 12 deletions pkgs/stdenv/linux/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,14 @@
{ lib
, localSystem, crossSystem, config, overlays, crossOverlays ? []

# ARMv8.0 backward compatibility (`-moutline-intrinsics`) currently
# requires regenerating bootstrapFiles; see:
#
# https://github.com/NixOS/nixpkgs/issues/108111
# https://github.com/NixOS/nixpkgs/pull/108200
# https://bugzilla.redhat.com/show_bug.cgi?id=1830472
, rebootstrap ? localSystem.isAarch64

, bootstrapFiles ?
let table = {
glibc = {
Expand Down Expand Up @@ -93,7 +101,7 @@
files = archLookupTable.${localSystem.system} or (if getCompatibleTools != null then getCompatibleTools
else (abort "unsupported platform for the pure Linux stdenv"));
in files
}:
} @args:

assert crossSystem == localSystem;

Expand All @@ -117,7 +125,7 @@ let


# Download and unpack the bootstrap tools (coreutils, GCC, Glibc, ...).
bootstrapTools = import (if localSystem.libc == "musl" then ./bootstrap-tools-musl else ./bootstrap-tools) {
unpackBootstrapTools = bootstrapFiles: import (if localSystem.libc == "musl" then ./bootstrap-tools-musl else ./bootstrap-tools) {
inherit system bootstrapFiles;
extraAttrs = lib.optionalAttrs
config.contentAddressedByDefault
Expand All @@ -135,10 +143,9 @@ let
# the bootstrap. In all stages, we build an stdenv and the package
# set that can be built with that stdenv.
stageFun = prevStage:
{ name, overrides ? (self: super: {}), extraNativeBuildInputs ? [] }:
{ name, overrides ? (self: super: {}), extraNativeBuildInputs ? [], bootstrapTools ? prevStage.bootstrapTools }:

let

thisStdenv = import ../generic {
name = "${name}-stdenv-linux";
buildPlatform = localSystem;
Expand Down Expand Up @@ -177,33 +184,49 @@ let
stdenvNoCC = prevStage.ccWrapperStdenv;
};

overrides = self: super: (overrides self super) // { fetchurl = thisStdenv.fetchurlBoot; };
overrides = self: super: (overrides self super) // {
fetchurl = thisStdenv.fetchurlBoot;
inherit bootstrapTools;
};
};

in {
inherit config overlays;
stdenv = thisStdenv;
};

in

[
# when rebootstrapping, we first prepend a copy of the stdenv stages
# that use the fetched bootstrapFiles:
lib.optionals rebootstrap (import ./. (args // { rebootstrap = false; })) ++

({}: {
[
(prevStage: {
__raw = true;

gcc-unwrapped = null;
binutils = null;
coreutils = null;
gnugrep = null;
bootstrapTools =
unpackBootstrapTools
(if rebootstrap
then (prevStage.freshBootstrapTools.override {
# Copy busybox from the original bootstrapFiles; it is
# safe to do this because it is statically linked. This
# avoids having to rebuild a musl-gcc compiler (glibc
# doesn't know how to do static linking).
busyboxMinimal = prevStage.stdenv.bootstrapFiles.busybox;
# don't rebuild a custom compiler
bootGCC = prevStage.gcc.cc;
}).bootstrapFiles else bootstrapFiles);
})

# Build a dummy stdenv with no GCC or working fetchurl. This is
# because we need a stdenv to build the GCC wrapper and fetchurl.
#
# resulting stage0 stdenv:
# - coreutils, binutils, glibc, gcc: from bootstrapFiles
(prevStage: stageFun prevStage {
({ bootstrapTools, ...}@prevStage: stageFun prevStage {
name = "bootstrap-stage0";

overrides = self: super: {
Expand Down Expand Up @@ -477,7 +500,7 @@ in
# and the bootstrapTools-built, statically-linked
# lib{mpfr,mpc,gmp,isl}.a which are linked into the final gcc
# (see commit cfde88976ba4cddd01b1bb28b40afd12ea93a11d).
(prevStage: {
({ bootstrapTools, ...}@prevStage: {
inherit config overlays;
stdenv = import ../generic rec {
name = "stdenv-linux";
Expand All @@ -504,7 +527,7 @@ in
inherit (prevStage.stdenv) fetchurlBoot;

extraAttrs = {
inherit bootstrapTools;
inherit bootstrapTools bootstrapFiles;
shellPackage = prevStage.bash;
};

Expand Down
36 changes: 18 additions & 18 deletions pkgs/stdenv/linux/make-bootstrap-tools.nix
Original file line number Diff line number Diff line change
@@ -1,4 +1,20 @@
{ pkgs ? import ../../.. {} }:
{ pkgs ? import ../../.. {}
, busyboxMinimal ? "${pkgs.busybox.override {
useMusl = !pkgs.stdenv.targetPlatform.isRiscV;
enableStatic = true;
enableMinimal = true;
extraConfig = ''
CONFIG_ASH y
CONFIG_ASH_ECHO y
CONFIG_ASH_TEST y
CONFIG_ASH_OPTIMIZE_FOR_SIZE y
CONFIG_MKDIR y
CONFIG_TAR y
CONFIG_UNXZ y
'';
}}/bin/busybox"
, bootGCC ? pkgs.gcc.cc.override { enableLTO = false; }
}:

let
libc = pkgs.stdenv.cc.libc;
Expand All @@ -15,22 +31,6 @@ in with pkgs; rec {

tarMinimal = gnutar.override { acl = null; };

busyboxMinimal = busybox.override {
useMusl = !stdenv.targetPlatform.isRiscV;
enableStatic = true;
enableMinimal = true;
extraConfig = ''
CONFIG_ASH y
CONFIG_ASH_ECHO y
CONFIG_ASH_TEST y
CONFIG_ASH_OPTIMIZE_FOR_SIZE y
CONFIG_MKDIR y
CONFIG_TAR y
CONFIG_UNXZ y
'';
};

bootGCC = gcc.cc.override { enableLTO = false; };
bootBinutils = binutils.bintools.override {
withAllTargets = false;
# Don't need two linkers, disable whatever's not primary/default.
Expand Down Expand Up @@ -196,7 +196,7 @@ in with pkgs; rec {

mkdir $out/on-server
XZ_OPT="-9 -e" tar cvJf $out/on-server/bootstrap-tools.tar.xz --hard-dereference --sort=name --numeric-owner --owner=0 --group=0 --mtime=@1 -C $out/pack .
cp ${busyboxMinimal}/bin/busybox $out/on-server
cp ${busyboxMinimal} $out/on-server/busybox
chmod u+w $out/on-server/busybox
nuke-refs $out/on-server/busybox
''; # */
Expand Down
2 changes: 2 additions & 0 deletions pkgs/stdenv/native/default.nix
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
{ lib
, localSystem, crossSystem, config, overlays, crossOverlays ? []
, rebootstrap
}:

assert crossSystem == localSystem;
assert rebootstrap -> throw "stdenv/native does not yet support automatic rebootstrapping";

let
inherit (localSystem) system;
Expand Down
1 change: 0 additions & 1 deletion pkgs/top-level/all-packages.nix
Original file line number Diff line number Diff line change
Expand Up @@ -14052,7 +14052,6 @@ with pkgs;
inherit (let
num =
if (with stdenv.targetPlatform; isVc4 || libc == "relibc") then 6
else if (stdenv.targetPlatform.isAarch64 && stdenv.isLinux) then 9
else 11;
numS = toString num;
in {
Expand Down