diff options
4 files changed, 244 insertions, 25 deletions
diff --git a/pkgs/os-specific/linux/minimal-bootstrap/binutils/default.nix b/pkgs/os-specific/linux/minimal-bootstrap/binutils/default.nix index f386ebbaf8e93..75a1512ff09ee 100644 --- a/pkgs/os-specific/linux/minimal-bootstrap/binutils/default.nix +++ b/pkgs/os-specific/linux/minimal-bootstrap/binutils/default.nix @@ -5,18 +5,19 @@ , bash , gnumake , gnupatch +, gnused , gnugrep , gnutar , gawk , bzip2 -, sed -, mesBootstrap ? false, tinycc ? null -, gcc ? null, glibc ? null, binutils ? null, linux-headers +, gcc +, glibc +, binutilsBoot +, linux-headers }: -assert mesBootstrap -> tinycc != null; -assert !mesBootstrap -> gcc != null && glibc != null && binutils != null; + let - pname = "binutils" + lib.optionalString mesBootstrap "-mes"; + pname = "binutils"; version = "2.20.1"; rev = "a"; @@ -60,15 +61,16 @@ bash.runCommand "${pname}-${version}" { inherit pname version; nativeBuildInputs = [ - (if mesBootstrap then tinycc.compiler else gcc) + gcc gnumake gnupatch + gnused gnugrep gnutar gawk bzip2 - sed - ] ++ lib.optional (!mesBootstrap) binutils; + binutilsBoot + ]; passthru.tests.get-version = result: bash.runCommand "${pname}-get-version-${version}" {} '' @@ -95,17 +97,11 @@ bash.runCommand "${pname}-${version}" { ${lib.concatMapStringsSep "\n" (f: "patch -Np1 -i ${f}") patches} # Configure - ${if mesBootstrap then '' - export CC="tcc -B ${tinycc.libs}/lib -D __GLIBC_MINOR__=6 -D MES_BOOTSTRAP=1" - export AR="tcc -ar" - '' else '' - export CC="gcc -B ${glibc}/lib -I${glibc}/include -I${linux-headers}/include" - export CPP="gcc -E -I${glibc}/include -I${linux-headers}/include" - export AR="ar" - export LIBRARY_PATH="${glibc}/lib" - export LIBS="-lc -lnss_files -lnss_dns -lresolv" - ''} - export SED=sed + export CC="gcc -B ${glibc}/lib -I${glibc}/include -I${linux-headers}/include" + export CPP="gcc -E -I${glibc}/include -I${linux-headers}/include" + export AR="ar" + export LIBRARY_PATH="${glibc}/lib" + export LIBS="-lc -lnss_files -lnss_dns -lresolv" bash ./configure ${lib.concatStringsSep " " configureFlags} # Build diff --git a/pkgs/os-specific/linux/minimal-bootstrap/binutils/mes.nix b/pkgs/os-specific/linux/minimal-bootstrap/binutils/mes.nix new file mode 100644 index 0000000000000..018b4d78a4bac --- /dev/null +++ b/pkgs/os-specific/linux/minimal-bootstrap/binutils/mes.nix @@ -0,0 +1,105 @@ +{ lib +, buildPlatform +, hostPlatform +, fetchurl +, bash +, gnumake +, gnupatch +, gnused +, gnugrep +, gnutar +, gawk +, bzip2 +, tinycc +}: + +let + pname = "binutils-mes"; + version = "2.20.1"; + rev = "a"; + + src = fetchurl { + url = "mirror://gnu/binutils/binutils-${version}${rev}.tar.bz2"; + sha256 = "0r7dr0brfpchh5ic0z9r4yxqn4ybzmlh25sbp30cacqk8nb7rlvi"; + }; + + patches = [ + # Enables building binutils using TCC and Mes C Library + (fetchurl { + url = "https://git.savannah.gnu.org/cgit/guix.git/plain/gnu/packages/patches/binutils-boot-2.20.1a.patch?id=50249cab3a98839ade2433456fe618acc6f804a5"; + sha256 = "086sf6an2k56axvs4jlky5n3hs2l3rq8zq5d37h0b69cdyh7igpn"; + }) + + # Make binutils output deterministic by default. + ./deterministic.patch + ]; + + configureFlags = [ + "--prefix=${placeholder "out"}" + "--build=${buildPlatform.config}" + "--host=${hostPlatform.config}" + "--disable-nls" + "--disable-shared" + "--disable-werror" + "--with-sysroot=/" + + # Turn on --enable-new-dtags by default to make the linker set + # RUNPATH instead of RPATH on binaries. This is important because + # RUNPATH can be overridden using LD_LIBRARY_PATH at runtime. + "--enable-new-dtags" + + # By default binutils searches $libdir for libraries. This brings in + # libbfd and libopcodes into a default visibility. Drop default lib + # path to force users to declare their use of these libraries. + "--with-lib-path=:" + ]; +in +bash.runCommand "${pname}-${version}" { + inherit pname version; + + nativeBuildInputs = [ + tinycc.compiler + gnumake + gnupatch + gnused + gnugrep + gnutar + gawk + bzip2 + ]; + + passthru.tests.get-version = result: + bash.runCommand "${pname}-get-version-${version}" {} '' + ${result}/bin/ld --version + mkdir $out + ''; + + meta = with lib; { + description = "Tools for manipulating binaries (linker, assembler, etc.)"; + homepage = "https://www.gnu.org/software/binutils"; + license = licenses.gpl3Plus; + maintainers = teams.minimal-bootstrap.members; + platforms = platforms.unix; + }; +} '' + # Unpack + cp ${src} binutils.tar.bz2 + bunzip2 binutils.tar.bz2 + tar xf binutils.tar + rm binutils.tar + cd binutils-${version} + + # Patch + ${lib.concatMapStringsSep "\n" (f: "patch -Np1 -i ${f}") patches} + + # Configure + export CC="tcc -B ${tinycc.libs}/lib -D __GLIBC_MINOR__=6 -D MES_BOOTSTRAP=1" + export AR="tcc -ar" + bash ./configure ${lib.concatStringsSep " " configureFlags} + + # Build + make + + # Install + make install +'' diff --git a/pkgs/os-specific/linux/minimal-bootstrap/binutils/musl.nix b/pkgs/os-specific/linux/minimal-bootstrap/binutils/musl.nix new file mode 100644 index 0000000000000..8dfd6e76027fd --- /dev/null +++ b/pkgs/os-specific/linux/minimal-bootstrap/binutils/musl.nix @@ -0,0 +1,114 @@ +{ lib +, buildPlatform +, hostPlatform +, fetchurl +, bash +, coreutils +, gnumake +, gnupatch +, gnused +, gnugrep +, gawk +, diffutils +, gnutar +, xz +, tinycc +, musl +}: + +let + pname = "binutils-musl"; + version = "2.41"; + + src = fetchurl { + url = "mirror://gnu/binutils/binutils-${version}.tar.xz"; + hash = "sha256-rppXieI0WeWWBuZxRyPy0//DHAMXQZHvDQFb3wYAdFA="; + }; + + patches = [ + # Make binutils output deterministic by default. + ./deterministic.patch + ]; + + configureFlags = [ + "--prefix=${placeholder "out"}" + "--build=${buildPlatform.config}" + "--host=${hostPlatform.config}" + "--with-sysroot=/" + "--enable-deterministic-archives" + # depends on bison + "--disable-gprofng" + + # Turn on --enable-new-dtags by default to make the linker set + # RUNPATH instead of RPATH on binaries. This is important because + # RUNPATH can be overridden using LD_LIBRARY_PATH at runtime. + "--enable-new-dtags" + + # By default binutils searches $libdir for libraries. This brings in + # libbfd and libopcodes into a default visibility. Drop default lib + # path to force users to declare their use of these libraries. + "--with-lib-path=:" + ]; +in +bash.runCommand "${pname}-${version}" { + inherit pname version; + + nativeBuildInputs = [ + tinycc.compiler + gnumake + gnupatch + gnused + gnugrep + gawk + diffutils + gnutar + xz + ]; + + passthru.tests.get-version = result: + bash.runCommand "${pname}-get-version-${version}" {} '' + ${result}/bin/ld --version + mkdir $out + ''; + + meta = with lib; { + description = "Tools for manipulating binaries (linker, assembler, etc.)"; + homepage = "https://www.gnu.org/software/binutils"; + license = licenses.gpl3Plus; + maintainers = teams.minimal-bootstrap.members; + platforms = platforms.unix; + }; +} '' + # Unpack + cp ${src} binutils.tar.xz + unxz binutils.tar.xz + tar xf binutils.tar + rm binutils.tar + cd binutils-${version} + + # Patch + ${lib.concatMapStringsSep "\n" (f: "patch -Np1 -i ${f}") patches} + sed -i 's|/bin/sh|${bash}/bin/bash|' \ + missing install-sh mkinstalldirs + # see libtool's 74c8993c178a1386ea5e2363a01d919738402f30 + sed -i 's/| \$NL2SP/| sort | $NL2SP/' ltmain.sh + # alias makeinfo to true + mkdir aliases + ln -s ${coreutils}/bin/true aliases/makeinfo + export PATH="$(pwd)/aliases/:$PATH" + + # Configure + export CC="tcc -B ${musl}/lib" + export AR="tcc -ar" + export lt_cv_sys_max_cmd_len=32768 + export CFLAGS="-D__LITTLE_ENDIAN__=1" + bash ./configure ${lib.concatStringsSep " " configureFlags} + + # Build + make all-libiberty all-gas all-bfd all-libctf all-zlib all-gprof + make all-ld # race condition on ld/.deps/ldwrite.Po, serialize + make + + # Install + make install +'' diff --git a/pkgs/os-specific/linux/minimal-bootstrap/default.nix b/pkgs/os-specific/linux/minimal-bootstrap/default.nix index 7387d3eaa9102..b7d05eab8aef8 100644 --- a/pkgs/os-specific/linux/minimal-bootstrap/default.nix +++ b/pkgs/os-specific/linux/minimal-bootstrap/default.nix @@ -25,17 +25,20 @@ lib.makeScope binutils = callPackage ./binutils { bash = bash_2_05; gcc = gcc2; - binutils = binutils-mes; + binutilsBoot = binutils-mes; glibc = glibc22; - sed = heirloom.sed; gawk = gawk-mes; }; - binutils-mes = callPackage ./binutils { + binutils-mes = callPackage ./binutils/mes.nix { bash = bash_2_05; tinycc = tinycc-mes; - sed = heirloom.sed; gawk = gawk-mes; - mesBootstrap = true; + }; + binutils-musl = callPackage ./binutils/musl.nix { + bash = bash_2_05; + tinycc = tinycc-musl; + musl = musl11; + gawk = gawk-mes; }; bzip2 = callPackage ./bzip2 { @@ -178,6 +181,7 @@ lib.makeScope echo ${bash_2_05.tests.get-version} echo ${binutils.tests.get-version} echo ${binutils-mes.tests.get-version} + echo ${binutils-musl.tests.get-version} echo ${bzip2.tests.get-version} echo ${diffutils.tests.get-version} echo ${findutils.tests.get-version} |