2005-02-21 20:42:07 +00:00
|
|
|
|
# This file constructs the standard build environment for the
|
|
|
|
|
# Linux/i686 platform. It's completely pure; that is, it relies on no
|
|
|
|
|
# external (non-Nix) tools, such as /usr/bin/gcc, and it contains a C
|
|
|
|
|
# compiler and linker that do not search in default locations,
|
|
|
|
|
# ensuring purity of components produced by it.
|
2016-12-16 13:22:02 +00:00
|
|
|
|
{ lib
|
2018-12-05 03:06:46 +00:00
|
|
|
|
, localSystem, crossSystem, config, overlays, crossOverlays ? []
|
2016-12-24 18:55:11 +00:00
|
|
|
|
|
2018-01-12 22:19:22 +00:00
|
|
|
|
, bootstrapFiles ?
|
|
|
|
|
let table = {
|
2019-08-13 21:52:01 +00:00
|
|
|
|
glibc = {
|
|
|
|
|
i686-linux = import ./bootstrap-files/i686.nix;
|
|
|
|
|
x86_64-linux = import ./bootstrap-files/x86_64.nix;
|
|
|
|
|
armv5tel-linux = import ./bootstrap-files/armv5tel.nix;
|
|
|
|
|
armv6l-linux = import ./bootstrap-files/armv6l.nix;
|
|
|
|
|
armv7l-linux = import ./bootstrap-files/armv7l.nix;
|
|
|
|
|
aarch64-linux = import ./bootstrap-files/aarch64.nix;
|
|
|
|
|
mipsel-linux = import ./bootstrap-files/loongson2f.nix;
|
2022-04-07 00:30:43 +00:00
|
|
|
|
powerpc64le-linux = import ./bootstrap-files/powerpc64le.nix;
|
2021-02-27 18:53:22 +00:00
|
|
|
|
riscv64-linux = import ./bootstrap-files/riscv64.nix;
|
2018-01-12 22:19:22 +00:00
|
|
|
|
};
|
2019-08-13 21:52:01 +00:00
|
|
|
|
musl = {
|
|
|
|
|
aarch64-linux = import ./bootstrap-files/aarch64-musl.nix;
|
|
|
|
|
armv6l-linux = import ./bootstrap-files/armv6l-musl.nix;
|
|
|
|
|
x86_64-linux = import ./bootstrap-files/x86_64-musl.nix;
|
2018-01-12 22:19:22 +00:00
|
|
|
|
};
|
|
|
|
|
};
|
2019-04-10 22:38:20 +00:00
|
|
|
|
|
|
|
|
|
# Try to find an architecture compatible with our current system. We
|
|
|
|
|
# just try every bootstrap we’ve got and test to see if it is
|
|
|
|
|
# compatible with or current architecture.
|
|
|
|
|
getCompatibleTools = lib.foldl (v: system:
|
|
|
|
|
if v != null then v
|
2022-04-26 20:17:48 +00:00
|
|
|
|
else if localSystem.canExecute (lib.systems.elaborate { inherit system; }) then archLookupTable.${system}
|
2019-04-10 22:38:20 +00:00
|
|
|
|
else null) null (lib.attrNames archLookupTable);
|
|
|
|
|
|
2018-01-12 22:19:22 +00:00
|
|
|
|
archLookupTable = table.${localSystem.libc}
|
|
|
|
|
or (abort "unsupported libc for the pure Linux stdenv");
|
2019-04-10 22:38:20 +00:00
|
|
|
|
files = archLookupTable.${localSystem.system} or (if getCompatibleTools != null then getCompatibleTools
|
|
|
|
|
else (abort "unsupported platform for the pure Linux stdenv"));
|
2018-01-12 22:19:22 +00:00
|
|
|
|
in files
|
2016-03-03 12:46:21 +00:00
|
|
|
|
}:
|
2006-08-23 16:18:02 +00:00
|
|
|
|
|
2018-12-05 03:06:46 +00:00
|
|
|
|
assert crossSystem == localSystem;
|
2016-11-30 23:51:13 +00:00
|
|
|
|
|
2016-12-24 15:38:56 +00:00
|
|
|
|
let
|
2021-01-24 22:51:12 +00:00
|
|
|
|
inherit (localSystem) system;
|
2006-08-23 16:18:02 +00:00
|
|
|
|
|
2009-03-25 17:34:38 +00:00
|
|
|
|
commonPreHook =
|
|
|
|
|
''
|
2016-02-29 11:10:26 +00:00
|
|
|
|
export NIX_ENFORCE_PURITY="''${NIX_ENFORCE_PURITY-1}"
|
2016-03-15 16:35:07 +00:00
|
|
|
|
export NIX_ENFORCE_NO_NATIVE="''${NIX_ENFORCE_NO_NATIVE-1}"
|
2009-03-25 17:34:38 +00:00
|
|
|
|
${if system == "x86_64-linux" then "NIX_LIB64_IN_SELF_RPATH=1" else ""}
|
2017-12-05 10:27:45 +00:00
|
|
|
|
${if system == "mipsel-linux" then "NIX_LIB32_IN_SELF_RPATH=1" else ""}
|
2009-03-25 17:34:38 +00:00
|
|
|
|
'';
|
|
|
|
|
|
|
|
|
|
|
2005-02-21 20:42:07 +00:00
|
|
|
|
# The bootstrap process proceeds in several steps.
|
|
|
|
|
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2014-08-23 19:26:37 +00:00
|
|
|
|
# Create a standard environment by downloading pre-built binaries of
|
|
|
|
|
# coreutils, GCC, etc.
|
2005-02-22 09:55:03 +00:00
|
|
|
|
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2009-02-01 21:44:56 +00:00
|
|
|
|
# Download and unpack the bootstrap tools (coreutils, GCC, Glibc, ...).
|
2021-04-26 15:21:17 +00:00
|
|
|
|
bootstrapTools = import (if localSystem.libc == "musl" then ./bootstrap-tools-musl else ./bootstrap-tools) {
|
|
|
|
|
inherit system bootstrapFiles;
|
|
|
|
|
extraAttrs = lib.optionalAttrs
|
2022-04-27 20:21:32 +00:00
|
|
|
|
config.contentAddressedByDefault
|
2021-04-26 15:21:17 +00:00
|
|
|
|
{
|
|
|
|
|
__contentAddressed = true;
|
|
|
|
|
outputHashAlgo = "sha256";
|
|
|
|
|
outputHashMode = "recursive";
|
|
|
|
|
};
|
|
|
|
|
};
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2018-01-12 00:15:40 +00:00
|
|
|
|
getLibc = stage: stage.${localSystem.libc};
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2004-11-04 12:19:32 +00:00
|
|
|
|
|
2009-02-01 21:44:56 +00:00
|
|
|
|
# This function builds the various standard environments used during
|
2014-08-23 19:26:37 +00:00
|
|
|
|
# the bootstrap. In all stages, we build an stdenv and the package
|
|
|
|
|
# set that can be built with that stdenv.
|
2016-12-24 15:07:20 +00:00
|
|
|
|
stageFun = prevStage:
|
2017-08-15 15:30:45 +00:00
|
|
|
|
{ name, overrides ? (self: super: {}), extraNativeBuildInputs ? [] }:
|
2004-11-04 12:19:32 +00:00
|
|
|
|
|
2014-08-23 19:26:37 +00:00
|
|
|
|
let
|
2014-08-24 16:08:23 +00:00
|
|
|
|
|
|
|
|
|
thisStdenv = import ../generic {
|
2018-02-01 00:00:00 +00:00
|
|
|
|
name = "${name}-stdenv-linux";
|
2017-07-06 01:47:48 +00:00
|
|
|
|
buildPlatform = localSystem;
|
|
|
|
|
hostPlatform = localSystem;
|
|
|
|
|
targetPlatform = localSystem;
|
2017-08-15 15:30:45 +00:00
|
|
|
|
inherit config extraNativeBuildInputs;
|
2014-08-24 16:08:23 +00:00
|
|
|
|
preHook =
|
|
|
|
|
''
|
|
|
|
|
# Don't patch #!/interpreter because it leads to retained
|
|
|
|
|
# dependencies on the bootstrapTools in the final stdenv.
|
|
|
|
|
dontPatchShebangs=1
|
|
|
|
|
${commonPreHook}
|
|
|
|
|
'';
|
2016-02-24 10:01:11 +00:00
|
|
|
|
shell = "${bootstrapTools}/bin/bash";
|
2014-09-14 17:32:58 +00:00
|
|
|
|
initialPath = [bootstrapTools];
|
2016-02-27 19:27:24 +00:00
|
|
|
|
|
|
|
|
|
fetchurlBoot = import ../../build-support/fetchurl/boot.nix {
|
|
|
|
|
inherit system;
|
2014-08-24 16:08:23 +00:00
|
|
|
|
};
|
2014-09-10 23:18:14 +00:00
|
|
|
|
|
2019-04-24 03:48:22 +00:00
|
|
|
|
cc = if prevStage.gcc-unwrapped == null
|
2015-06-15 17:26:52 +00:00
|
|
|
|
then null
|
2015-01-09 19:22:12 +00:00
|
|
|
|
else lib.makeOverridable (import ../../build-support/cc-wrapper) {
|
2018-02-01 00:00:00 +00:00
|
|
|
|
name = "${name}-gcc-wrapper";
|
2014-09-10 23:18:14 +00:00
|
|
|
|
nativeTools = false;
|
|
|
|
|
nativeLibc = false;
|
2017-06-29 16:06:55 +00:00
|
|
|
|
buildPackages = lib.optionalAttrs (prevStage ? stdenv) {
|
|
|
|
|
inherit (prevStage) stdenv;
|
|
|
|
|
};
|
2016-12-24 15:07:20 +00:00
|
|
|
|
cc = prevStage.gcc-unwrapped;
|
2017-08-26 15:43:30 +00:00
|
|
|
|
bintools = prevStage.binutils;
|
2015-05-11 21:30:13 +00:00
|
|
|
|
isGNU = true;
|
2018-01-12 00:15:40 +00:00
|
|
|
|
libc = getLibc prevStage;
|
2021-01-24 03:02:59 +00:00
|
|
|
|
inherit lib;
|
2017-08-26 15:43:30 +00:00
|
|
|
|
inherit (prevStage) coreutils gnugrep;
|
2017-09-20 15:07:52 +00:00
|
|
|
|
stdenvNoCC = prevStage.ccWrapperStdenv;
|
2014-09-10 23:18:14 +00:00
|
|
|
|
};
|
|
|
|
|
|
2016-12-19 16:10:47 +00:00
|
|
|
|
overrides = self: super: (overrides self super) // { fetchurl = thisStdenv.fetchurlBoot; };
|
2014-08-23 18:34:01 +00:00
|
|
|
|
};
|
2004-11-04 12:19:32 +00:00
|
|
|
|
|
2016-12-16 13:22:02 +00:00
|
|
|
|
in {
|
2016-12-24 18:55:11 +00:00
|
|
|
|
inherit config overlays;
|
2016-12-16 13:22:02 +00:00
|
|
|
|
stdenv = thisStdenv;
|
|
|
|
|
};
|
2009-02-01 21:44:56 +00:00
|
|
|
|
|
2016-12-24 15:38:56 +00:00
|
|
|
|
in
|
|
|
|
|
|
|
|
|
|
[
|
|
|
|
|
|
|
|
|
|
({}: {
|
2016-12-24 15:28:40 +00:00
|
|
|
|
__raw = true;
|
|
|
|
|
|
2016-12-24 15:07:20 +00:00
|
|
|
|
gcc-unwrapped = null;
|
2014-09-10 23:18:14 +00:00
|
|
|
|
binutils = null;
|
|
|
|
|
coreutils = null;
|
2016-01-24 05:18:32 +00:00
|
|
|
|
gnugrep = null;
|
2016-12-24 15:38:56 +00:00
|
|
|
|
})
|
2016-12-24 15:07:20 +00:00
|
|
|
|
|
|
|
|
|
# Build a dummy stdenv with no GCC or working fetchurl. This is
|
|
|
|
|
# because we need a stdenv to build the GCC wrapper and fetchurl.
|
2016-12-24 15:38:56 +00:00
|
|
|
|
(prevStage: stageFun prevStage {
|
2018-02-01 00:00:00 +00:00
|
|
|
|
name = "bootstrap-stage0";
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2016-12-19 16:10:47 +00:00
|
|
|
|
overrides = self: super: {
|
2016-12-24 15:28:40 +00:00
|
|
|
|
# We thread stage0's stdenv through under this name so downstream stages
|
|
|
|
|
# can use it for wrapping gcc too. This way, downstream stages don't need
|
|
|
|
|
# to refer to this stage directly, which violates the principle that each
|
|
|
|
|
# stage should only access the stage that came before it.
|
|
|
|
|
ccWrapperStdenv = self.stdenv;
|
2014-08-23 19:26:37 +00:00
|
|
|
|
# The Glibc include directory cannot have the same prefix as the
|
|
|
|
|
# GCC include directory, since GCC gets confused otherwise (it
|
|
|
|
|
# will search the Glibc headers before the GCC headers). So
|
|
|
|
|
# create a dummy Glibc here, which will be used in the stdenv of
|
|
|
|
|
# stage1.
|
2018-01-12 00:15:40 +00:00
|
|
|
|
${localSystem.libc} = self.stdenv.mkDerivation {
|
2021-05-10 15:12:59 +00:00
|
|
|
|
pname = "bootstrap-stage0-${localSystem.libc}";
|
2022-05-21 16:58:22 +00:00
|
|
|
|
strictDeps = true;
|
2021-05-10 15:12:59 +00:00
|
|
|
|
version = "bootstrap";
|
2022-05-14 01:13:49 +00:00
|
|
|
|
enableParallelBuilding = true;
|
2014-08-23 19:26:37 +00:00
|
|
|
|
buildCommand = ''
|
|
|
|
|
mkdir -p $out
|
|
|
|
|
ln -s ${bootstrapTools}/lib $out/lib
|
2018-01-11 21:09:34 +00:00
|
|
|
|
'' + lib.optionalString (localSystem.libc == "glibc") ''
|
2014-08-23 19:26:37 +00:00
|
|
|
|
ln -s ${bootstrapTools}/include-glibc $out/include
|
2018-01-11 21:09:34 +00:00
|
|
|
|
'' + lib.optionalString (localSystem.libc == "musl") ''
|
|
|
|
|
ln -s ${bootstrapTools}/include-libc $out/include
|
2014-08-23 19:26:37 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
2016-12-24 15:07:20 +00:00
|
|
|
|
gcc-unwrapped = bootstrapTools;
|
2017-08-26 15:43:30 +00:00
|
|
|
|
binutils = import ../../build-support/bintools-wrapper {
|
2018-02-01 00:00:00 +00:00
|
|
|
|
name = "bootstrap-stage0-binutils-wrapper";
|
2017-08-26 15:43:30 +00:00
|
|
|
|
nativeTools = false;
|
|
|
|
|
nativeLibc = false;
|
|
|
|
|
buildPackages = { };
|
2018-01-12 00:15:40 +00:00
|
|
|
|
libc = getLibc self;
|
2021-01-24 03:02:59 +00:00
|
|
|
|
inherit lib;
|
2017-08-26 15:43:30 +00:00
|
|
|
|
inherit (self) stdenvNoCC coreutils gnugrep;
|
|
|
|
|
bintools = bootstrapTools;
|
|
|
|
|
};
|
2016-12-24 15:07:20 +00:00
|
|
|
|
coreutils = bootstrapTools;
|
|
|
|
|
gnugrep = bootstrapTools;
|
2004-11-04 12:19:32 +00:00
|
|
|
|
};
|
2016-12-24 15:38:56 +00:00
|
|
|
|
})
|
2005-02-21 20:42:07 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Create the first "real" standard environment. This one consists
|
2009-02-01 21:44:56 +00:00
|
|
|
|
# of bootstrap tools only, and a minimal Glibc to keep the GCC
|
|
|
|
|
# configure script happy.
|
2014-08-24 13:55:14 +00:00
|
|
|
|
#
|
|
|
|
|
# For clarity, we only use the previous stage when specifying these
|
|
|
|
|
# stages. So stageN should only ever have references for stage{N-1}.
|
|
|
|
|
#
|
|
|
|
|
# If we ever need to use a package from more than one stage back, we
|
|
|
|
|
# simply re-export those packages in the middle stage(s) using the
|
|
|
|
|
# overrides attribute and the inherit syntax.
|
2016-12-24 15:38:56 +00:00
|
|
|
|
(prevStage: stageFun prevStage {
|
2018-02-01 00:00:00 +00:00
|
|
|
|
name = "bootstrap-stage1";
|
2014-09-10 23:18:14 +00:00
|
|
|
|
|
2014-08-23 19:26:37 +00:00
|
|
|
|
# Rebuild binutils to use from stage2 onwards.
|
2016-12-19 16:10:47 +00:00
|
|
|
|
overrides = self: super: {
|
2018-09-01 20:30:41 +00:00
|
|
|
|
binutils-unwrapped = super.binutils-unwrapped.override {
|
2022-02-10 19:50:33 +00:00
|
|
|
|
enableGold = false;
|
2018-09-01 20:30:41 +00:00
|
|
|
|
};
|
2016-12-24 15:28:40 +00:00
|
|
|
|
inherit (prevStage)
|
|
|
|
|
ccWrapperStdenv
|
2018-01-12 00:15:40 +00:00
|
|
|
|
gcc-unwrapped coreutils gnugrep;
|
|
|
|
|
|
|
|
|
|
${localSystem.libc} = getLibc prevStage;
|
2014-09-10 23:18:14 +00:00
|
|
|
|
|
2014-09-04 14:17:39 +00:00
|
|
|
|
# A threaded perl build needs glibc/libpthread_nonshared.a,
|
|
|
|
|
# which is not included in bootstrapTools, so disable threading.
|
|
|
|
|
# This is not an issue for the final stdenv, because this perl
|
|
|
|
|
# won't be included in the final stdenv and won't be exported to
|
|
|
|
|
# top-level pkgs as an override either.
|
2016-12-19 16:10:47 +00:00
|
|
|
|
perl = super.perl.override { enableThreading = false; };
|
2010-01-19 11:25:33 +00:00
|
|
|
|
};
|
2016-12-24 15:38:56 +00:00
|
|
|
|
})
|
2005-02-21 20:42:07 +00:00
|
|
|
|
|
2014-01-07 16:46:47 +00:00
|
|
|
|
|
2014-08-23 19:26:37 +00:00
|
|
|
|
# 2nd stdenv that contains our own rebuilt binutils and is used for
|
|
|
|
|
# compiling our own Glibc.
|
2016-12-24 15:38:56 +00:00
|
|
|
|
(prevStage: stageFun prevStage {
|
2018-02-01 00:00:00 +00:00
|
|
|
|
name = "bootstrap-stage2";
|
2014-09-10 23:18:14 +00:00
|
|
|
|
|
2016-12-19 16:10:47 +00:00
|
|
|
|
overrides = self: super: {
|
2016-12-24 15:07:20 +00:00
|
|
|
|
inherit (prevStage)
|
2016-12-24 15:28:40 +00:00
|
|
|
|
ccWrapperStdenv
|
2017-08-26 15:43:30 +00:00
|
|
|
|
gcc-unwrapped coreutils gnugrep
|
2018-12-22 11:49:41 +00:00
|
|
|
|
perl gnum4 bison;
|
2019-08-18 10:46:38 +00:00
|
|
|
|
dejagnu = super.dejagnu.overrideAttrs (a: { doCheck = false; } );
|
2019-08-18 18:58:56 +00:00
|
|
|
|
|
|
|
|
|
# We need libidn2 and its dependency libunistring as glibc dependency.
|
|
|
|
|
# To avoid the cycle, we build against bootstrap libc, nuke references,
|
|
|
|
|
# and use the result as input for our final glibc. We also pass this pair
|
|
|
|
|
# through, so the final package-set uses exactly the same builds.
|
|
|
|
|
libunistring = super.libunistring.overrideAttrs (attrs: {
|
|
|
|
|
postFixup = attrs.postFixup or "" + ''
|
|
|
|
|
${self.nukeReferences}/bin/nuke-refs "$out"/lib/lib*.so.*.*
|
|
|
|
|
'';
|
|
|
|
|
# Apparently iconv won't work with bootstrap glibc, but it will be used
|
|
|
|
|
# with glibc built later where we keep *this* build of libunistring,
|
|
|
|
|
# so we need to trick it into supporting libiconv.
|
|
|
|
|
am_cv_func_iconv_works = "yes";
|
|
|
|
|
});
|
|
|
|
|
libidn2 = super.libidn2.overrideAttrs (attrs: {
|
|
|
|
|
postFixup = attrs.postFixup or "" + ''
|
|
|
|
|
${self.nukeReferences}/bin/nuke-refs -e '${lib.getLib self.libunistring}' \
|
|
|
|
|
"$out"/lib/lib*.so.*.*
|
|
|
|
|
'';
|
|
|
|
|
});
|
|
|
|
|
|
2014-08-23 19:26:37 +00:00
|
|
|
|
# This also contains the full, dynamically linked, final Glibc.
|
2017-08-26 15:43:30 +00:00
|
|
|
|
binutils = prevStage.binutils.override {
|
|
|
|
|
# Rewrap the binutils with the new glibc, so both the next
|
|
|
|
|
# stage's wrappers use it.
|
2018-01-12 00:15:40 +00:00
|
|
|
|
libc = getLibc self;
|
2021-06-30 17:47:13 +00:00
|
|
|
|
|
|
|
|
|
# Unfortunately, when building gcc in the next stage, its LTO plugin
|
|
|
|
|
# would use the final libc but `ld` would use the bootstrap one,
|
|
|
|
|
# and that can fail to load. Therefore we upgrade `ld` to use newer libc;
|
|
|
|
|
# apparently the interpreter needs to match libc, too.
|
|
|
|
|
bintools = self.stdenvNoCC.mkDerivation {
|
|
|
|
|
inherit (prevStage.bintools.bintools) name;
|
2022-05-14 01:13:49 +00:00
|
|
|
|
enableParallelBuilding = true;
|
2021-06-30 17:47:13 +00:00
|
|
|
|
dontUnpack = true;
|
|
|
|
|
dontBuild = true;
|
2022-05-21 16:58:22 +00:00
|
|
|
|
strictDeps = true;
|
2021-06-30 17:47:13 +00:00
|
|
|
|
# We wouldn't need to *copy* all, but it's easier and the result is temporary anyway.
|
|
|
|
|
installPhase = ''
|
|
|
|
|
mkdir -p "$out"/bin
|
|
|
|
|
cp -a '${prevStage.bintools.bintools}'/bin/* "$out"/bin/
|
|
|
|
|
chmod +w "$out"/bin/ld.bfd
|
|
|
|
|
patchelf --set-interpreter '${getLibc self}'/lib/ld*.so.? \
|
|
|
|
|
--set-rpath "${getLibc self}/lib:$(patchelf --print-rpath "$out"/bin/ld.bfd)" \
|
|
|
|
|
"$out"/bin/ld.bfd
|
|
|
|
|
'';
|
|
|
|
|
};
|
2017-08-26 15:43:30 +00:00
|
|
|
|
};
|
2011-12-14 14:31:56 +00:00
|
|
|
|
};
|
2021-03-31 15:56:38 +00:00
|
|
|
|
|
|
|
|
|
# `libtool` comes with obsolete config.sub/config.guess that don't recognize Risc-V.
|
|
|
|
|
extraNativeBuildInputs =
|
|
|
|
|
lib.optional (localSystem.isRiscV) prevStage.updateAutotoolsGnuConfigScriptsHook;
|
2016-12-24 15:38:56 +00:00
|
|
|
|
})
|
2010-08-25 13:22:48 +00:00
|
|
|
|
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2014-08-23 19:26:37 +00:00
|
|
|
|
# Construct a third stdenv identical to the 2nd, except that this
|
|
|
|
|
# one uses the rebuilt Glibc from stage2. It still uses the recent
|
|
|
|
|
# binutils and rest of the bootstrap tools, including GCC.
|
2016-12-24 15:38:56 +00:00
|
|
|
|
(prevStage: stageFun prevStage {
|
2018-02-01 00:00:00 +00:00
|
|
|
|
name = "bootstrap-stage3";
|
2014-09-10 23:18:14 +00:00
|
|
|
|
|
2016-12-19 16:10:47 +00:00
|
|
|
|
overrides = self: super: rec {
|
2016-12-24 15:07:20 +00:00
|
|
|
|
inherit (prevStage)
|
2016-12-24 15:28:40 +00:00
|
|
|
|
ccWrapperStdenv
|
2018-01-12 00:15:40 +00:00
|
|
|
|
binutils coreutils gnugrep
|
2019-08-18 18:58:56 +00:00
|
|
|
|
perl patchelf linuxHeaders gnum4 bison libidn2 libunistring;
|
2018-01-12 00:15:40 +00:00
|
|
|
|
${localSystem.libc} = getLibc prevStage;
|
2011-12-14 14:31:56 +00:00
|
|
|
|
# Link GCC statically against GMP etc. This makes sense because
|
|
|
|
|
# these builds of the libraries are only used by GCC, so it
|
|
|
|
|
# reduces the size of the stdenv closure.
|
2016-12-19 16:10:47 +00:00
|
|
|
|
gmp = super.gmp.override { stdenv = self.makeStaticLibraries self.stdenv; };
|
|
|
|
|
mpfr = super.mpfr.override { stdenv = self.makeStaticLibraries self.stdenv; };
|
|
|
|
|
libmpc = super.libmpc.override { stdenv = self.makeStaticLibraries self.stdenv; };
|
2020-11-17 21:20:48 +00:00
|
|
|
|
isl_0_20 = super.isl_0_20.override { stdenv = self.makeStaticLibraries self.stdenv; };
|
2016-12-24 15:07:20 +00:00
|
|
|
|
gcc-unwrapped = super.gcc-unwrapped.override {
|
2020-11-17 21:20:48 +00:00
|
|
|
|
isl = isl_0_20;
|
2021-02-12 17:18:43 +00:00
|
|
|
|
# Use a deterministically built compiler
|
|
|
|
|
# see https://github.com/NixOS/nixpkgs/issues/108475 for context
|
|
|
|
|
reproducibleBuild = true;
|
|
|
|
|
profiledCompiler = false;
|
2015-06-11 16:52:19 +00:00
|
|
|
|
};
|
2010-01-19 11:25:33 +00:00
|
|
|
|
};
|
2018-12-22 11:49:41 +00:00
|
|
|
|
extraNativeBuildInputs = [ prevStage.patchelf ] ++
|
2016-03-05 00:28:23 +00:00
|
|
|
|
# Many tarballs come with obsolete config.sub/config.guess that don't recognize aarch64.
|
2018-09-11 16:47:09 +00:00
|
|
|
|
lib.optional (!localSystem.isx86 || localSystem.libc == "musl")
|
|
|
|
|
prevStage.updateAutotoolsGnuConfigScriptsHook;
|
2016-12-24 15:38:56 +00:00
|
|
|
|
})
|
2005-02-21 20:42:07 +00:00
|
|
|
|
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2014-08-23 19:26:37 +00:00
|
|
|
|
# Construct a fourth stdenv that uses the new GCC. But coreutils is
|
|
|
|
|
# still from the bootstrap tools.
|
2016-12-24 15:38:56 +00:00
|
|
|
|
(prevStage: stageFun prevStage {
|
2018-02-01 00:00:00 +00:00
|
|
|
|
name = "bootstrap-stage4";
|
2014-09-10 23:18:14 +00:00
|
|
|
|
|
2016-12-19 16:10:47 +00:00
|
|
|
|
overrides = self: super: {
|
2014-09-10 23:10:49 +00:00
|
|
|
|
# Zlib has to be inherited and not rebuilt in this stage,
|
|
|
|
|
# because gcc (since JAR support) already depends on zlib, and
|
|
|
|
|
# then if we already have a zlib we want to use that for the
|
|
|
|
|
# other purposes (binutils and top-level pkgs) too.
|
2019-08-18 18:58:56 +00:00
|
|
|
|
inherit (prevStage) gettext gnum4 bison gmp perl texinfo zlib linuxHeaders libidn2 libunistring;
|
2018-01-12 00:15:40 +00:00
|
|
|
|
${localSystem.libc} = getLibc prevStage;
|
2017-08-26 15:43:30 +00:00
|
|
|
|
binutils = super.binutils.override {
|
|
|
|
|
# Don't use stdenv's shell but our own
|
|
|
|
|
shell = self.bash + "/bin/bash";
|
|
|
|
|
# Build expand-response-params with last stage like below
|
|
|
|
|
buildPackages = {
|
|
|
|
|
inherit (prevStage) stdenv;
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
2015-01-09 19:22:12 +00:00
|
|
|
|
gcc = lib.makeOverridable (import ../../build-support/cc-wrapper) {
|
2014-09-10 23:18:14 +00:00
|
|
|
|
nativeTools = false;
|
|
|
|
|
nativeLibc = false;
|
2015-05-11 21:30:13 +00:00
|
|
|
|
isGNU = true;
|
2017-06-29 16:06:55 +00:00
|
|
|
|
buildPackages = {
|
|
|
|
|
inherit (prevStage) stdenv;
|
|
|
|
|
};
|
2016-12-24 15:07:20 +00:00
|
|
|
|
cc = prevStage.gcc-unwrapped;
|
2017-08-26 15:43:30 +00:00
|
|
|
|
bintools = self.binutils;
|
2018-01-12 00:15:40 +00:00
|
|
|
|
libc = getLibc self;
|
2021-01-24 03:02:59 +00:00
|
|
|
|
inherit lib;
|
2017-08-26 15:43:30 +00:00
|
|
|
|
inherit (self) stdenvNoCC coreutils gnugrep;
|
2016-12-19 16:10:47 +00:00
|
|
|
|
shell = self.bash + "/bin/bash";
|
2014-09-10 23:18:14 +00:00
|
|
|
|
};
|
2010-01-19 11:25:33 +00:00
|
|
|
|
};
|
2017-08-15 15:30:45 +00:00
|
|
|
|
extraNativeBuildInputs = [ prevStage.patchelf prevStage.xz ] ++
|
2016-03-05 00:28:23 +00:00
|
|
|
|
# Many tarballs come with obsolete config.sub/config.guess that don't recognize aarch64.
|
2018-09-11 16:47:09 +00:00
|
|
|
|
lib.optional (!localSystem.isx86 || localSystem.libc == "musl")
|
|
|
|
|
prevStage.updateAutotoolsGnuConfigScriptsHook;
|
2016-12-24 15:38:56 +00:00
|
|
|
|
})
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2014-08-23 19:26:37 +00:00
|
|
|
|
# Construct the final stdenv. It uses the Glibc and GCC, and adds
|
|
|
|
|
# in a new binutils that doesn't depend on bootstrap-tools, as well
|
|
|
|
|
# as dynamically linked versions of all other tools.
|
2009-02-01 21:44:56 +00:00
|
|
|
|
#
|
2014-08-23 19:26:37 +00:00
|
|
|
|
# When updating stdenvLinux, make sure that the result has no
|
|
|
|
|
# dependency (`nix-store -qR') on bootstrapTools or the first
|
|
|
|
|
# binutils built.
|
2016-12-24 15:38:56 +00:00
|
|
|
|
(prevStage: {
|
2016-12-24 18:55:11 +00:00
|
|
|
|
inherit config overlays;
|
2016-12-24 15:38:56 +00:00
|
|
|
|
stdenv = import ../generic rec {
|
2018-02-01 00:00:00 +00:00
|
|
|
|
name = "stdenv-linux";
|
|
|
|
|
|
2017-07-06 01:47:48 +00:00
|
|
|
|
buildPlatform = localSystem;
|
|
|
|
|
hostPlatform = localSystem;
|
|
|
|
|
targetPlatform = localSystem;
|
2017-05-22 01:37:16 +00:00
|
|
|
|
inherit config;
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2021-09-17 14:59:12 +00:00
|
|
|
|
preHook = commonPreHook;
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2016-12-24 15:38:56 +00:00
|
|
|
|
initialPath =
|
|
|
|
|
((import ../common-path.nix) {pkgs = prevStage;});
|
2005-02-21 20:42:07 +00:00
|
|
|
|
|
2018-12-22 11:49:41 +00:00
|
|
|
|
extraNativeBuildInputs = [ prevStage.patchelf ] ++
|
2016-03-05 00:28:23 +00:00
|
|
|
|
# Many tarballs come with obsolete config.sub/config.guess that don't recognize aarch64.
|
2018-09-11 16:47:09 +00:00
|
|
|
|
lib.optional (!localSystem.isx86 || localSystem.libc == "musl")
|
|
|
|
|
prevStage.updateAutotoolsGnuConfigScriptsHook;
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2016-12-24 15:38:56 +00:00
|
|
|
|
cc = prevStage.gcc;
|
2012-12-28 15:41:56 +00:00
|
|
|
|
|
2016-12-24 15:38:56 +00:00
|
|
|
|
shell = cc.shell;
|
2010-08-06 10:34:34 +00:00
|
|
|
|
|
2016-12-24 15:38:56 +00:00
|
|
|
|
inherit (prevStage.stdenv) fetchurlBoot;
|
2014-08-29 20:09:01 +00:00
|
|
|
|
|
2016-12-24 15:38:56 +00:00
|
|
|
|
extraAttrs = {
|
2018-02-09 14:43:39 +00:00
|
|
|
|
# TODO: remove this!
|
2016-12-24 15:38:56 +00:00
|
|
|
|
inherit (prevStage) glibc;
|
2018-02-09 14:43:39 +00:00
|
|
|
|
|
2021-01-24 22:51:12 +00:00
|
|
|
|
inherit bootstrapTools;
|
2016-12-24 15:38:56 +00:00
|
|
|
|
shellPackage = prevStage.bash;
|
|
|
|
|
};
|
2015-01-03 14:54:02 +00:00
|
|
|
|
|
2017-08-13 09:44:36 +00:00
|
|
|
|
# Mainly avoid reference to bootstrap tools
|
|
|
|
|
allowedRequisites = with prevStage; with lib;
|
|
|
|
|
# Simple executable tools
|
2018-09-04 22:03:51 +00:00
|
|
|
|
concatMap (p: [ (getBin p) (getLib p) ]) [
|
|
|
|
|
gzip bzip2 xz bash binutils.bintools coreutils diffutils findutils
|
fixLibtool(): patch ./configure, add `file` to common-path.nix
libtool's libtool.m4 script assumes that `file` is available, and can
be found at `/usr/bin/file` (this path is hardwired). Furthermore,
the script with this assumption is vendored into the ./configure
scripts of an enormous number of packages. Without this commit, you
will frequently see errors like this during the configurePhase with
the sandbox enabled:
./configure: line 9595: /usr/bin/file: command not found
Due mostly to luck, this error does not affect native compiles on
nixpkgs' two most popular platforms, x86_64-linux and aarch64-linux.
However it will cause incorrect linker flag detection and a failure to
generate shared libraries for sandboxed cross-builds to a x86_64-linux
host as well as any sandboxed build (cross or native) for the following
hosts: x86_64-freebsd, *-hpux, *-irix, mips64*-linux, powerpc*-linux,
s390x-linux, s390x-tpf, sparc-linux, and *-solaris.
This commit fixes the problem by adding an extra line to fixLibtool()
in pkgs/stdenv/generic/setup.sh. This extra line will scan the
unpacked source code for executable files named "configure" which
contain the following text:
'GNU Libtool is free software; you can redistribute it and/or modify'
This text is taken to be an indicator of a vendored libtool.m4. When
it is found, the configure script containing it is subjected to `sed
-i s_/usr/bin/file_file_` which replaces all occurrences of
`/usr/bin/file` with `file`.
Additionally, the `file` package is now considered to be part of
`stdenv`. It has been added to `common-path.nix` so that the `file`
binary will be found in the `$PATH` of every build, except for the
bootstrap-tools and the first few stages of stdenv boostrapping.
Verified no regressions under:
nix-build --arg pkgs 'import ./. {}' ./lib/tests/release.nix
This commit allows the following commands to complete, which should
enable Hydra to produce bootstrap-files for mips64el:
nix-build \
--option sandbox true \
--option sandbox-fallback false \
pkgs/top-level/release-cross.nix \
-A bootstrapTools.mips64el-linux-gnuabi64.build
nix-build \
--option sandbox true \
--option sandbox-fallback false \
. \
-A pkgsCross.mips64el-linux-gnuabi64.nix_2_4
2022-04-12 21:46:57 +00:00
|
|
|
|
gawk gnumake gnused gnutar gnugrep gnupatch patchelf ed file
|
2017-08-13 09:44:36 +00:00
|
|
|
|
]
|
|
|
|
|
# Library dependencies
|
2017-08-24 08:57:50 +00:00
|
|
|
|
++ map getLib (
|
2019-08-18 18:58:56 +00:00
|
|
|
|
[ attr acl zlib pcre libidn2 libunistring ]
|
2017-08-24 08:57:50 +00:00
|
|
|
|
++ lib.optional (gawk.libsigsegv != null) gawk.libsigsegv
|
|
|
|
|
)
|
2017-08-13 09:44:36 +00:00
|
|
|
|
# More complicated cases
|
2018-01-12 00:15:40 +00:00
|
|
|
|
++ (map (x: getOutput x (getLibc prevStage)) [ "out" "dev" "bin" ] )
|
|
|
|
|
++ [ /*propagated from .dev*/ linuxHeaders
|
2017-08-26 15:43:30 +00:00
|
|
|
|
binutils gcc gcc.cc gcc.cc.lib gcc.expand-response-params
|
2017-08-13 09:44:36 +00:00
|
|
|
|
]
|
2018-09-11 16:47:09 +00:00
|
|
|
|
++ lib.optionals (!localSystem.isx86 || localSystem.libc == "musl")
|
2017-08-15 06:08:12 +00:00
|
|
|
|
[ prevStage.updateAutotoolsGnuConfigScriptsHook prevStage.gnu-config ];
|
2016-12-24 15:38:56 +00:00
|
|
|
|
|
|
|
|
|
overrides = self: super: {
|
|
|
|
|
inherit (prevStage)
|
2017-02-11 23:15:12 +00:00
|
|
|
|
gzip bzip2 xz bash coreutils diffutils findutils gawk
|
2018-01-12 00:15:40 +00:00
|
|
|
|
gnumake gnused gnutar gnugrep gnupatch patchelf
|
2019-08-18 18:58:56 +00:00
|
|
|
|
attr acl zlib pcre libunistring libidn2;
|
2018-01-12 00:15:40 +00:00
|
|
|
|
${localSystem.libc} = getLibc prevStage;
|
2018-08-20 18:43:41 +00:00
|
|
|
|
} // lib.optionalAttrs (super.stdenv.targetPlatform == localSystem) {
|
2017-02-11 23:15:12 +00:00
|
|
|
|
# Need to get rid of these when cross-compiling.
|
2018-04-03 16:50:25 +00:00
|
|
|
|
inherit (prevStage) binutils binutils-unwrapped;
|
2017-02-11 23:15:12 +00:00
|
|
|
|
gcc = cc;
|
2016-12-24 15:38:56 +00:00
|
|
|
|
};
|
2006-02-09 17:04:18 +00:00
|
|
|
|
};
|
2016-12-24 15:38:56 +00:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
]
|