Scripts for bootstrapping various programming languages
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

182 lines
6.0 KiB

#!/bin/sh
set -eu
version_mes=0.22
version_mescc_tools=1.0.1
version_nyacc=0.99.3
version_linux=4.14
version_binutils=2.20.1
version_gcc=4.9.4
version_gmp=4.3.2
version_mpfr=2.4.2
version_mpc=1.0.3
version_musl=1.2.1
version_busybox=1.31.1
export MAKEFLAGS="-j${NPROC:-$(getconf _NPROCESSORS_ONLN)}"
system=system
dir_root="$PWD"
dir_sources="$dir_root/sources"
dir_install="$dir_root/$system"
mkdir -p build && cd build
rm -rf "mes-$version_mes"
tar xf "$dir_sources/mes-$version_mes.tar.gz"
( cd "mes-$version_mes"
tar xf "$dir_sources/mescc-tools-Release_$version_mescc_tools.tar.gz"
tar xf "$dir_sources/nyacc-$version_nyacc.tar.gz"
mv "mescc-tools-Release_$version_mescc_tools" mescc-tools
mv "nyacc-$version_nyacc" nyacc
cp -a mescc-tools mescc-tools-target
make -C mescc-tools M1 hex2 blood-elf COMMIT=
export PATH="$PWD/mescc-tools/bin:$PATH"
# First, we build a native mes, "mes-gcc".
# This allows us to cross-build everything on systems that mes doesn't support.
gcc -w -O2 -std=gnu99 -fcommon -lrt -o mes-gcc -DMES_VERSION='""' -DSYSTEM_LIBC=1 -Iinclude \
lib/mes/eputs.c \
lib/mes/fdgetc.c \
lib/mes/fdputc.c \
lib/mes/fdputs.c \
lib/mes/fdungetc.c \
lib/mes/itoa.c \
lib/mes/mes_open.c \
lib/mes/ntoab.c \
src/gc.c \
src/hash.c \
src/lib.c \
src/math.c \
src/mes.c \
src/module.c \
src/posix.c \
src/reader.c \
src/string.c \
src/struct.c \
src/vector.c
# This version of mes messes doesn't have a proper getopt...
# TODO: Fix this (somehow) and make the patch unnecessary.
sed -i -e 's/ -nostdlib/ --nostdlib/' \
-e 's/ -lc/ -l c/' \
build-aux/bootstrap.sh.in
# Use this to build mes and its libc for the target
CC=true guile_site_dir="$PWD/nyacc/module" sh configure.sh --host=x86-linux-mes
CC="$PWD/scripts/mescc" MES="$PWD/mes-gcc" sh bootstrap.sh
# Install mes
install -Dm755 bin/mes "$dir_install/mes/bin/mes"
# Build tools with mes to obtain reproducible outputs
make -C mescc-tools-target M1 hex2 blood-elf COMMIT= \
CC="$PWD/scripts/mescc" MES="$PWD/mes-gcc" MES_PREFIX="../" \
GUILE_LOAD_PATH="../module" CFLAGS='-L ../lib -L ../mescc-lib -l c+tcc'
install -Dm755 mescc-tools-target/bin/M1 "$dir_install/mes/bin/M1"
install -Dm755 mescc-tools-target/bin/hex2 "$dir_install/mes/bin/hex2"
install -Dm755 mescc-tools-target/bin/blood-elf "$dir_install/mes/bin/blood-elf"
)
rm -rf "linux-$version_linux"
tar xf "$dir_sources/linux-$version_linux.tar.gz"
( cd "linux-$version_linux"
make mrproper
make ARCH=x86 INSTALL_HDR_PATH="$dir_install/sources/linux-headers" headers_install
find "$dir_install/sources/linux-headers" -type f ! -name "*.h" -exec rm {} +
)
# Build static busybox with musl
rm -rf "busybox-$version_busybox"
tar xf "$dir_sources/busybox-$version_busybox.tar.bz2"
( cd "busybox-$version_busybox"
tar xf "$dir_sources/binutils-${version_binutils}a.tar.bz2"
mv "binutils-$version_binutils" binutils
tar xf "$dir_sources/gcc-$version_gcc.tar.bz2"
mv "gcc-$version_gcc" gcc
tar xf "$dir_sources/gmp-$version_gmp.tar.bz2"
mv "gmp-$version_gmp" gcc/gmp
tar xf "$dir_sources/mpfr-$version_mpfr.tar.bz2"
mv "mpfr-$version_mpfr" gcc/mpfr
tar xf "$dir_sources/mpc-$version_mpc.tar.gz"
mv "mpc-$version_mpc" gcc/mpc
tar xf "$dir_sources/musl-$version_musl.tar.gz"
mv "musl-$version_musl" musl
prefix="$PWD/prefix"
export PATH="$prefix/bin:$PATH"
# Fix requirement for mktemp, so it works with coreutils-5.0
if ! command -v mktemp 2> /dev/null; then
sed -i -e 's@$(mktemp tmp.XXXXXXXXXX)@/tmp/tmp.trylink@' scripts/trylink
fi
# Building a specific version of binutils+GCC, to make the results reproducible...
# GCC-4.6.4's results aren't reproducible across machines for some reason,
# so this bootstrap uses GCC-4.9.4. This increases the build time a little.
( cd binutils
CFLAGS='-O2 -w -fcommon' ./configure \
--target=i686-bootstrap-linux-gnu \
--prefix="$prefix" \
--with-sysroot="$prefix" \
--disable-nls \
--disable-werror
make
make install
)
( cd gcc
mkdir build && cd build # Build breaks without a build directory
# Using --with-local-prefix=/ puts /include in the search path before
# /lib/gcc/.../include-fixed, avoiding some issues.
CFLAGS='-O2 -w' CXXFLAGS='-O2 -w' MAKEINFO=true ../configure \
--target=i686-bootstrap-linux-gnu \
--prefix="$prefix" \
--with-sysroot="$prefix" \
--with-local-prefix=/ \
--with-host-libstdcxx=-lsupc++ \
--with-newlib \
--without-headers \
--disable-shared \
--disable-threads \
--disable-nls \
--enable-languages=c
make all-gcc all-target-libgcc
make install-gcc install-target-libgcc
)
# Musl provides a very small libc, that can be linked statically.
# It might be worthwhile to switch to uClibc in the future, as that's
# what's usually used for busybox. Might yield "cleaner" results.
cp -a "$dir_install/sources/linux-headers" prefix
( cd musl
./configure \
--host=i686-bootstrap-linux-gnu \
--prefix="$PWD/../prefix" \
--disable-shared
make
make install
)
cp "$dir_root/busybox-config" .config
make CROSS_COMPILE=i686-bootstrap-linux-gnu- CONFIG_STATIC=y busybox
install -Dm755 busybox "$dir_install/bin/busybox"
install -Dm755 busybox_unstripped "$dir_install/bin/busybox_unstripped"
)
cd "$dir_install"
# Verify the built binaries
sha1sum -c "$dir_root/binaries.sha1"
# Pack it up
find bin mes sources \( -type f -o -type l \) ! -path bin/busybox_unstripped | LC_ALL=C sort | xargs tar --mtime=@0 --numeric-owner --owner=0 --group=0 -cf binaries.tar
gzip -nv binaries.tar
# Clean up
cd "$dir_root"
rm -rf build