Skip to content

Commit

Permalink
pkgs/test/stdenv/default.nix: add gcc-stageCompare
Browse files Browse the repository at this point in the history
This commit adds a derivation `gcc-stageCompare` to
`pkgs/test/stdenv/default.nix`.

It is important to always build this derivation whenever building
`stdenv`!  Because we are using a Nix-driven bootstrap instead of
gcc's built-in `--enable-bootstrap`, the `gcc` derivation no longer
performs the post-self-compilation sanity check.  You must build
this derivation in order to perform that sanity check.

The major benefit of this new approach is that the sanity check
(which involves a third compilation of gcc) can be performed
*concurrently* with all packages that depend on `stdenv`, rather
than serially.  Since `stdenv` has very little derivation-level
parallelism it cannot take advantage of more than one or perhaps two
builders.  If you have three or more builders this commit will
reduce the time-to-rebuild-stdenv by around 20% (one of three gcc
rebuilds is removed from the critical path, and stdenv's build time
is dominated by roughly 3*gcc + 1*binutils + 1*bison-test-suite).

Co-authored-by: Sandro <sandro.jaeckel@gmail.com>
  • Loading branch information
Adam Joseph and SuperSandro2000 committed Apr 2, 2023
1 parent 96588eb commit 5f57c2e
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 2 deletions.
4 changes: 3 additions & 1 deletion nixos/release-small.nix
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@ in rec {
stdenv
subversion
tarball
vim;
vim
tests-stdenv-gcc-stageCompare;
};

tested = let
Expand Down Expand Up @@ -131,6 +132,7 @@ in rec {
"nixos.tests.proxy"
"nixos.tests.simple"
"nixpkgs.jdk"
"nixpkgs.tests-stdenv-gcc-stageCompare"
])
];
};
Expand Down
1 change: 1 addition & 0 deletions pkgs/development/compilers/gcc/common/checksum.nix
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
, nukeReferences
, langC
, langCC
, runtimeShell
}:

let
Expand Down
32 changes: 32 additions & 0 deletions pkgs/test/stdenv/gcc-stageCompare.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# This test *must* be run prior to releasing any build of either stdenv or the
# gcc that it exports! This check should also be part of CI for any PR that
# causes a rebuild of `stdenv.cc`.
#
# When we used gcc's internal bootstrap it did this check as part of (and
# serially with) the gcc derivation. Now that we bootstrap externally this
# check can be done in parallel with any/all of stdenv's referrers. But we
# must remember to do the check.
#

{ stdenv
, pkgs
, lib
}:

assert stdenv.cc.isGNU;
with pkgs;
# rebuild gcc using the "final" stdenv
let gcc-stageCompare = (gcc-unwrapped.override {
reproducibleBuild = true;
profiledCompiler = false;
stdenv = overrideCC stdenv (wrapCCWith {
cc = stdenv.cc;
});
}).overrideAttrs(_: {
NIX_OUTPATH_USED_AS_RANDOM_SEED = stdenv.cc.cc.out;
});
in (runCommand "gcc-stageCompare" {} ''
diff -sr ${pkgs.gcc-unwrapped.checksum}/checksums ${gcc-stageCompare.checksum}/checksums && touch $out
'').overrideAttrs (a: {
meta = (a.meta or { }) // { platforms = lib.platforms.linux; };
})
2 changes: 2 additions & 0 deletions pkgs/top-level/all-packages.nix
Original file line number Diff line number Diff line change
Expand Up @@ -33898,6 +33898,8 @@ with pkgs;

testssl = callPackage ../applications/networking/testssl { };

tests-stdenv-gcc-stageCompare = callPackage ../test/stdenv/gcc-stageCompare.nix { };

lavalauncher = callPackage ../applications/misc/lavalauncher { };

t-rec = callPackage ../misc/t-rec {
Expand Down
2 changes: 1 addition & 1 deletion pkgs/top-level/release-small.nix
Original file line number Diff line number Diff line change
Expand Up @@ -150,5 +150,5 @@ with import ./release-lib.nix { inherit supportedSystems nixpkgsArgs; };
xfsprogs = linux;
xkeyboard_config = linux;
zip = all;

tests-stdenv-gcc-stageCompare = all;
} ))

0 comments on commit 5f57c2e

Please sign in to comment.