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.

219 lines
6.3 KiB

#!/bin/sh
set -e
# This script builds and upgrades a bunch of prerequisite tools for gentoo
# There's just too many small details about these to cover properly in a text file...
# Maintenance note: Run gentoo_gen.sh in a fully-updated stable system to get
# the appropriate package versions and URLs.
version_xz=5.2.5
version_zlib=1.2.11
version_libffi=3.3
version_python=3.7.9
version_perl=5.30.3
version_openssl=1.1.1g
version_wget=1.20.3
version_rsync=3.2.3
version_mktemp=1.7
version_ca_certificates=20200601
version_portage=3.0.8
version_m4=1.4.18
version_bison=3.7.1
version_make=4.2.1
version_sed=4.8
export MAKEFLAGS="-j${NPROC:-$(getconf _NPROCESSORS_ONLN)}"
# This symlink isn't provided by the bootstrap, but is necessary for a ton of tools
mkdir -p /usr/bin
ln -sf ../../bootstrap/bin/env /usr/bin/env
cd /sources
export PATH=/bootstrap/bin
# Xz is required to unpack a lot of tarballs, including the Portage tree.
# app-arch/xz-utils:
rm -rf xz-$version_xz
tar zxf xz-$version_xz.tar.gz
( cd xz-$version_xz
./configure --prefix=/bootstrap
make
make install
)
rm -rf xz-$version_xz
# Zlib is required for the zlib Python module, used by Portage.
# sys-libs/zlib:
rm -rf zlib-$version_zlib
tar zxf zlib-$version_zlib.tar.gz
( cd zlib-$version_zlib
./configure --prefix=/bootstrap
make
make install
)
rm -rf zlib-$version_zlib
# Libffi is required for the _ctypes Python module, used by Portage.
# dev-libs/libffi:
rm -rf libffi-$version_libffi
tar zxf libffi-$version_libffi.tar.gz
( cd libffi-$version_libffi
# Fix an error that crops up due to using coreutils-5.0
sed -i -e 's/tail -1/tail -n 1/g' configure
./configure --prefix=/bootstrap
make
make install
)
rm -rf libffi-$version_libffi
# Portage is written in Python. Modern glibc also needs it to build.
# dev-lang/python:
rm -rf Python-$version_python
tar Jxf Python-$version_python.tar.xz
( cd Python-$version_python
./configure --prefix=/bootstrap --without-ensurepip
make
make install
ln -sf python3 /bootstrap/bin/python
)
rm -rf Python-$version_python
# Perl is required to build OpenSSL as well as some other things.
# dev-lang/perl:
rm -rf perl-$version_perl
tar Jxf perl-$version_perl.tar.xz
( cd perl-$version_perl
# Fix pwd hardcode
sed -i -e "s@'/bin/pwd'@'/bootstrap/bin/pwd'@" dist/PathTools/Cwd.pm
./Configure -des -Dprefix=/bootstrap -Dcc=gcc -Dinstallusrbinperl=n
make
make install
)
rm -rf perl-$version_perl
# OpenSSL is required for https support in wget.
# dev-libs/openssl:
rm -rf openssl-$version_openssl
tar zxf openssl-$version_openssl.tar.gz
( cd openssl-$version_openssl
./config --prefix=/bootstrap --openssldir=/bootstrap/etc/ssl
make
make install
)
rm -rf openssl-$version_openssl
# Wget is required to download the portage tree and packages.
# net-misc/wget:
rm -rf wget-$version_wget
tar zxf wget-$version_wget.tar.gz
( cd wget-$version_wget
./configure --prefix=/bootstrap --with-ssl=openssl --with-libssl-prefix=/bootstrap
make
make install
)
rm -rf wget-$version_wget
# Rsync is optional to run emerge-webrsync or emerge --sync,
# and required for linux-headers.
# net-misc/rsync:
rm -rf rsync-$version_rsync
tar zxf rsync-$version_rsync.tar.gz
( cd rsync-$version_rsync
./configure --prefix=/bootstrap --disable-simd --disable-xxhash --disable-zstd --disable-lz4
make
make install
)
rm -rf rsync-$version_rsync
# Mktemp is required by ca-certificates as well as Portage for installing packages.
# To avoid upgrading all coreutils, this standalone version is used.
# custom/mktemp:
rm -rf mktemp-$version_mktemp
tar zxf mktemp-$version_mktemp.tar.gz
( cd mktemp-$version_mktemp
./configure --prefix=/bootstrap
make
make install
)
rm -rf mktemp-$version_mktemp
# To verify https connections, wget/openssl need some certificates.
# They're installed directly here, instead of properly installing
# update-ca-certificates.
# app-misc/ca-certificates:
rm -rf ca-certificates_$version_ca_certificates
tar Jxf ca-certificates_$version_ca_certificates.tar.xz
mv work ca-certificates_$version_ca_certificates
( cd ca-certificates_$version_ca_certificates
make -C mozilla
mkdir -p /bootstrap/share/ca-certificates/mozilla
make -C mozilla CERTSDIR=/bootstrap/share/ca-certificates/mozilla install
find mozilla -name '*.crt' | LC_ALL=C sort > ca-certificates.conf
./sbin/update-ca-certificates \
--certsconf "$PWD/ca-certificates.conf" \
--certsdir /bootstrap/share/ca-certificates \
--etccertsdir /bootstrap/etc/ssl/certs
)
rm -rf ca-certificates_$version_ca_certificates
# Finally, install the package manager.
# sys-apps/portage:
rm -rf portage-$version_portage
tar jxf portage-$version_portage.tar.bz2
( cd portage-$version_portage
python3 setup.py install --system-prefix=/bootstrap
# This path is hardcoded...
# Symlinking the individual files so installing the final package will replace them properly.
mkdir -p /usr/share/portage/config/sets
ln -sf ../../../../bootstrap/share/portage/config/make.globals /usr/share/portage/config/make.globals
ln -sf ../../../../bootstrap/share/portage/config/repos.conf /usr/share/portage/config/repos.conf
ln -sf ../../../../../bootstrap/share/portage/config/sets/portage.conf /usr/share/portage/config/sets/portage.conf
)
rm -rf portage-$version_portage
## ...but that's not all!
## Here come the dependencies to build the initial gcc/glibc!
## These can be installed directly with portage but it's significantly cleaner not to...
# sys-devel/m4 (required by glibc-2.31):
rm -rf m4-$version_m4
tar Jxf m4-$version_m4.tar.xz
( cd m4-$version_m4
./configure --prefix=/bootstrap
make
make install
)
rm -rf m4-$version_m4
# sys-devel/bison (required by glibc-2.31):
rm -rf bison-$version_bison
tar Jxf bison-$version_bison.tar.xz
( cd bison-$version_bison
./configure --prefix=/bootstrap
make
make install
)
rm -rf bison-$version_bison
# sys-devel/make (>=4.0 required by glibc-2.31):
rm -rf make-$version_make
tar jxf make-$version_make.tar.bz2
( cd make-$version_make
./configure --prefix=/bootstrap
make
make install
)
rm -rf make-$version_make
# sys-apps/sed (>=4.3 required by glibc-2.31 for -E option):
rm -rf sed-$version_sed
tar Jxf sed-$version_sed.tar.xz
( cd sed-$version_sed
./configure --prefix=/bootstrap
make
make install
)
rm -rf sed-$version_sed