Files
Aleksi Hannula 745f12467c minimal-bootstrap: Fix tools in preparation for early cross-compilation
Various packages under minimal-bootstrap explicitly use the musl gcc
wrapper (especially the *-static packages).

In #494106, the desire is to allow these packages to run on a host
platform which may differ from the bootstrap seed platform. That host
platform may be a non-musl platform, and furthermore musl may not even
be available on the desired host architecture.

This change aims to make the packages more generic wrt libc. It is
extracted out of #494106.
2026-06-17 13:34:53 +03:00

125 lines
3.0 KiB
Nix

{
lib,
buildPlatform,
hostPlatform,
fetchurl,
bash,
gcc-buildbuild,
gcc,
binutils,
gnumake,
gnupatch,
gnused,
gnugrep,
gawk,
diffutils,
findutils,
gnutar,
xz,
}:
let
inherit (import ./common.nix { inherit lib; }) meta;
pname = "binutils-static";
version = "2.46.0";
src = fetchurl {
url = "mirror://gnu/binutils/binutils-${version}.tar.xz";
hash = "sha256-11qU9Nc+ekCG91E+Z+Q56Pzcu3Jv/mP0ZhdE5iVrLPI=";
};
patches = [
# Make binutils output deterministic by default.
./deterministic.patch
];
configureFlags = [
"--prefix=${placeholder "out"}"
"--build=${buildPlatform.config}"
"--host=${hostPlatform.config}"
"--disable-dependency-tracking"
"--disable-nls"
"--enable-deterministic-archives"
# depends on bison
"--disable-gprofng"
# unused downstream
"--disable-gprof"
# 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=:"
"--disable-gold"
# unused in the bootstrap path and removed from the output
"--disable-libctf"
"--disable-plugins"
];
in
bash.runCommand "${pname}-${version}"
{
inherit pname version meta;
nativeBuildInputs = [
gcc
gcc-buildbuild
binutils
gnumake
gnupatch
gnused
gnugrep
gawk
diffutils
findutils
gnutar
xz
];
passthru.tests.get-version =
result:
bash.runCommand "${pname}-get-version-${version}" { } ''
${result}/bin/ld --version
${result}/${hostPlatform.config}/bin/ld --version
mkdir $out
'';
}
''
# Unpack
tar xf ${src}
cd binutils-${version}
# Patch
${lib.concatMapStringsSep "\n" (f: "patch -Np1 -i ${f}") patches}
# Configure
bash ./configure ${lib.concatStringsSep " " configureFlags}
# Build
make -j $NIX_BUILD_CORES
# Install
# strip to remove build dependency store path references
make -j $NIX_BUILD_CORES install-strip
# gprof/addr2line/elfedit + man pages are unused downstream.
rm -f $out/bin/gprof $out/bin/addr2line $out/bin/elfedit
rm -rf $out/include $out/lib $out/share
# The target-prefixed tools duplicate the unprefixed tools byte-for-byte.
# Keep the conventional target-prefixed paths, but make them symlinks.
targetBin=$out/${hostPlatform.config}/bin
if [ -d "$targetBin" ]; then
for tool in ar as ld ld.bfd nm objcopy objdump ranlib readelf strip; do
if [ -e "$targetBin/$tool" ] && cmp -s "$out/bin/$tool" "$targetBin/$tool"; then
rm "$targetBin/$tool"
ln -s ../../bin/$tool "$targetBin/$tool"
fi
done
fi
''