lang-bootstrap/06/recipes/4-rebootstrap-using-nix.sh

99 lines
3.6 KiB
Bash
Raw Normal View History

2025-04-18 12:41:04 +01:00
#!/store/2b2-busybox/bin/ash
set -uex
export PATH='/store/2b2-busybox/bin'
export PATH="$PATH:/store/3a-pkg-config/bin"
export PATH="$PATH:/store/3a-sqlite/bin"
export PATH="$PATH:/store/3b-nix/bin"
export SHELL='/store/2b2-busybox/bin/ash'
export PKG_CONFIG_PATH=''
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-sqlite/lib/pkgconfig"
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-curl/lib/pkgconfig"
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-editline/lib/pkgconfig"
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-seccomp/lib/pkgconfig"
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-libarchive/lib/pkgconfig"
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-libsodium/lib/pkgconfig"
export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/store/3a-lowdown/lib/pkgconfig"
LIBDIRS=''
LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir sqlite3)"
LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libcurl)"
LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libeditline)"
LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libseccomp)"
LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libarchive)"
LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir libsodium)"
LIBDIRS="$LIBDIRS:$(pkg-config --variable=libdir lowdown)"
LIBDIRS="$LIBDIRS:/store/3a-boost/lib"
LIBDIRS="$LIBDIRS:/store/2b1-clang/lib"
export LD_LIBRARY_PATH=$LIBDIRS
mkdir -p /tmp/4-rebootstrap-using-nix; cd /tmp/4-rebootstrap-using-nix
echo "### $0: preparing stuff for nix to work..."
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
ln -s /dev/pts/ptmx /dev/ptmx
echo "### $0: faking lots of stuff for nix to work..."
mkdir shelter
export HOME=/tmp/4-rebootstrap-using-nix/shelter
export USER=notauser
echo 'oh come on' >/dev/urandom
echo "### $0: fixing up paths to shell..."
cp -a --reflink=auto /using-nix /default.nix /recipes ./
sed -i 's|/bin/sh|/store/3b-busybox-static/bin/ash|' using-nix/1-stage1.nix
echo "### $0: pointing to local downloads..."
sed -i 's| url =| #remote_url =|' using-nix/*.nix
sed -i 's|# local = \(.*\);|url = "file://\1";|' using-nix/*.nix
if [ -e /prev/nix/store ] && [ -e /prev/nix-db.tar ]; then
echo "### $0: restoring nix store & db from previous build..."
mkdir -p /nix
cp -a --reflink=auto /prev/nix/store /nix
tar -xf /prev/nix-db.tar -C /
sqlite3 /nix/var/nix/db/db.sqlite \
< /nix/var/nix/db/db.sqlite.dump
rm /nix/var/nix/db/db.sqlite.dump
fi
echo "### $0: writing a 0.nix that simply injects what we've built..."
# Makefile bootstrap injects it as /stage/protosrc, regular --- as /protosrc
[ -e /protosrc ] && PROTOSRC="/protosrc" || PROTOSRC=/stage/protosrc
echo "{ tinycc = /store/3b-tinycc-static/bin/tcc; protosrc = $PROTOSRC; }" \
> using-nix/0.nix
echo "### $0: rebuilding everything using nix..."
nix-build \
--extra-experimental-features ca-derivations \
--option build-users-group '' \
--option compress-build-log false \
--no-substitute \
--cores $NPROC \
--keep-failed \
-vvv \
default.nix
rm -f /dev/urandom
rm /dev/ptmx
umount /dev/pts
umount /dev/pts || true
rm -r /dev/pts
rm -r shelter
rm -rf /build
# this one is special wrt how the results are saved, see Makefile/USE_NIX_CACHE
echo "### $0: exporting resulting /nix/store (reproducible)..."
mkdir -p /store/4-rebootstrap-using-nix/nix
cp -a --reflink=auto /nix/store /store/4-rebootstrap-using-nix/nix/
echo "### $0: exporting /nix/var/nix/db to restore it (non-reproducible)..."
cp /nix/var/nix/db/db.sqlite db.sqlite
sqlite3 db.sqlite 'UPDATE ValidPaths SET registrationTime = 1;'
sqlite3 db.sqlite .dump > /nix/var/nix/db/db.sqlite.dump
tar --exclude nix/var/nix/db/db.sqlite \
-cf /store/4-rebootstrap-using-nix/nix-db.tar /nix/var/nix/db
rm /nix/var/nix/db/db.sqlite.dump