about summary refs log tree commit diff
path: root/pkgs/os-specific/linux/minimal-bootstrap
diff options
context:
space:
mode:
authorEmily Trau <emily@downunderctf.com>2023-09-18 19:13:01 -0700
committerEmily Trau <emily@downunderctf.com>2023-09-26 22:20:34 -0700
commit665d36050736d95904c689940e64aea00350b887 (patch)
treec82eef2331838bee47601a8fb1ecfe100cbd2d79 /pkgs/os-specific/linux/minimal-bootstrap
parent477a60351c2a234cce5d6b6df9dfbf3b1ab29dc4 (diff)
minimal-bootstrap.binutils: add musl version
Diffstat (limited to 'pkgs/os-specific/linux/minimal-bootstrap')
-rw-r--r--pkgs/os-specific/linux/minimal-bootstrap/binutils/default.nix36
-rw-r--r--pkgs/os-specific/linux/minimal-bootstrap/binutils/mes.nix105
-rw-r--r--pkgs/os-specific/linux/minimal-bootstrap/binutils/musl.nix114
-rw-r--r--pkgs/os-specific/linux/minimal-bootstrap/default.nix14
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}