lang-bootstrap/06/using-nix/2a0-static-gnumake.nix

71 lines
2.6 KiB
Nix
Raw Normal View History

2025-04-18 12:41:04 +01:00
{ fetchurl, mkDerivationStage2, stage1 }:
let
source-tarball-gnumake = fetchurl {
# local = /downloads/make-4.4.1.tar.gz;
url = "http://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz";
sha256 = "dd16fb1d67bfab79a72f5e8390735c49e3e8e70b4945a15ab1f81ddb78658fb3";
};
in
mkDerivationStage2 {
name = "bootstrap-2a0-static-gnumake";
buildInputPaths = [
"${stage1.tinycc}/wrappers"
"${stage1.protobusybox}/bin"
];
script = ''
mkdir build-dir; cd build-dir
# unpack:
unpack ${source-tarball-gnumake}
# fixup:
sed -i 's|/bin/sh|${stage1.protobusybox}/bin/ash|' \
src/job.c build-aux/install-sh po/Makefile.in.in
# this is part of stdlib, no idea how it's supposed to not clash
rm src/getopt.h
for f in src/getopt.c src/getopt1.c lib/fnmatch.c; do :> $f; done
for f in lib/glob.c lib/xmalloc.c lib/error.c; do :> $f; done
# embrace chaos
shuffle_comment='\/\* Handle shuffle mode argument. \*\/'
shuffle_default='if (!shuffle_mode) shuffle_mode = xstrdup(\"random\");'
sed -i "s|$shuffle_comment|$shuffle_comment\n$shuffle_default|" \
src/main.c
grep 'if (!shuffle_mode) shuffle_mode = xstrdup("random");' src/main.c
# configure:
ash ./configure \
--build x86_64-linux \
--disable-dependency-tracking \
--prefix=$out \
CONFIG_SHELL='${stage1.protobusybox}/bin/ash' \
SHELL='${stage1.protobusybox}/bin/ash'
# bootstrap build:
ash ./build.sh
# test static GNU Make by remaking it with itself:
mv make make-intermediate
./make-intermediate -j $NPROC clean
./make-intermediate -j $NPROC
# reconfigure:
ash ./configure \
--build x86_64-linux \
--disable-dependency-tracking \
--prefix=$out \
CONFIG_SHELL='${stage1.protobusybox}/bin/ash' \
SHELL='${stage1.protobusybox}/bin/ash'
# rebuild:
ash ./build.sh
# test:
mv make make-intermediate
./make-intermediate -j $NPROC clean
./make-intermediate -j $NPROC CFLAGS=-O2
# install:
./make -j $NPROC install
# check for build path leaks:
( ! grep -rF $(pwd) $out )
# wrap:
# FIXME: patch make to use getenv?
mkdir -p $out/wrappers; cd $out/wrappers
echo "#!${stage1.protobusybox}/bin/ash" > make
echo "exec $out/bin/make SHELL=\$SHELL \"\$@\"" \ >> make
chmod +x make
'';
}