live-bootstrap/rootfs.sh

394 lines
10 KiB
Bash
Executable File

#!/bin/bash
# SPDX-FileCopyrightText: 2021 Andrius Štikonas <andrius@stikonas.eu>
# SPDX-FileCopyrightText: 2021 Bastian Bittorf <bb@npl.de>
# SPDX-FileCopyrightText: 2020-2021 fosslinux <fosslinux@aussies.space>
#
# SPDX-License-Identifier: GPL-3.0-or-later
set -ex
QEMU_CMD="${1:-qemu-system-x86_64}" # or 'chroot' or 'minikernel'
QEMU_RAM="${2:-8G}"
GITDIR="$PWD/$(dirname "$0")"
if [ ! -f 'rootfs.sh' ]; then
echo 'must be run from base of repo'
exit 1
fi
pushd sysa
# SYSTEM A
# Setup tmp
mkdir -p tmp/
sudo mount -t tmpfs -o size=8G tmpfs tmp
LOGFILE="$PWD/tmp/bootstrap.log"
_wget() {
local url="$1"
local dir="${CACHEDIR:-$GITDIR/sources}"
local file="${2:-$(basename "${url}")}"
mkdir -p "$dir"
test -s "$dir/$file" || command wget -O "$dir/$file" "$url"
cp -v "$dir/$file" .
checksum_do "$dir" "$file"
}
checksum_do() {
local dir="$1"
local file="$2"
local line
local store="$GITDIR/SHA256SUMS.sources"
if line=$(grep "[[:space:]][[:space:]]$file"$ "$store"); then
(cd "$dir" && echo "$line" | sha256sum -c)
else
echo 'Checksum mismatch or not found!'
exit 1
fi
}
# base: mescc-tools-seed
# copy in all the mescc-tools-seed stuff
cp -r mescc-tools-seed/src/mescc-tools-seed/x86/* tmp
cp -r mescc-tools-seed/src/mescc-tools-seed/{M2-Planet,mes-m2} tmp/
cp -r mescc-tools-seed/src/mescc-tools-patched tmp/mescc-tools
# and the kaem seed
cp bootstrap-seeds/POSIX/x86/kaem-optional-seed tmp/init
cp bootstrap-seeds/POSIX/x86/kaem-optional-seed tmp/
cp -r bootstrap-seeds tmp/
# replace the init kaem with our own custom one
mv tmp/kaem.run tmp/mescc-tools-seed.kaem.run
cp base.kaem.run tmp/kaem.run
# create directories needed
mkdir -p tmp/bin
# after mescc-tools-seed we get into our own directory because
# the mescc-tools-seed one is hella messy
mkdir -p tmp/after/bin
mkdir -p tmp/after/{lib,include}
mkdir -p tmp/after/lib/{tcc,linux}
ln -s . tmp/after/lib/x86-mes
ln -s . tmp/after/lib/linux/x86-mes
mkdir -p tmp/after/include/{mes,gnu,linux,sys,mach}
mkdir -p tmp/after/include/linux/{x86,x86_64}
mkdir -p tmp/tmp
cp after.kaem tmp/
cp after.kaem.run tmp/after/kaem.run
cp mescc-tools-seed/checksums tmp/after/mescc-tools-seed-checksums
cp helpers.sh run.sh run2.sh pre-sha.sha256sums tmp/after/
# mescc-tools-extra
cp -r mescc-tools-extra tmp/after/
# mes
cp -r mes tmp/after/
#ln -s lib/x86-mes tmp/after/mes/src/mes/x86-mes
mkdir -p tmp/after/mes/src/mes/{bin,m2}
# tcc 0.9.26
cp -r tcc-0.9.26 tmp/after/
pushd tmp/after/tcc-0.9.26/src/tcc-0.9.26
ln -s ../mes/module .
ln -s ../mes/mes .
ln -s /after/lib x86-mes
ln -s /after/lib/linux .
popd
# tcc 0.9.27
cp -r tcc-0.9.27 tmp/after/
# tar 1.12
url=https://ftp.gnu.org/gnu/tar/tar-1.12.tar.gz
cp -r tar-1.12 tmp/after
mkdir tmp/after/tar-1.12/{src,build}
pushd tmp/after/tar-1.12/src
if [ ! -f "$(basename $url)" ]; then
_wget "$url"
fi
popd
tar -C tmp/after/tar-1.12/src -xf "tmp/after/tar-1.12/src/$(basename $url)" --strip-components=1
unset url
_get_file() {
local url="$1"
local output="$2"
local target="$3"
# Get the actual file
pushd "${target}/src"
if [ ! -f "$(basename "$url")" ]; then
_wget "$url" "${output:-${url##*/}}"
fi
popd
}
_get_target() {
local url="$1"
local output="$2"
local ext="${url##*.}"
if [ "$ext" = "tar" ]; then
bname=$(basename "${output:-${url}}" ".tar")
else
bname=$(basename "${output:-${url}}" ".tar.${ext}")
fi
# this is the target
echo "tmp/after/${bname}"
}
_get_main() {
local url="$1"
local output="$2"
local make_build="$3"
local target="$4"
# Copy main files
cp -r "$(basename "${target}")" tmp/after/
# Make directories
mkdir -p "${target}/src"
if [ "${make_build}" -eq 1 ]; then
mkdir -p "${target}/build"
fi
# Also get this file
_get_file "${url}" "${output}" "${target}"
}
get_file() {
# A mapping of URL to output filenames based on index (position-dependent)
local outputs=()
local urls=()
# Argument parsing
while [ $# -gt 0 ]; do
case "$1" in
--mkbuild=*) local make_build="${1#*=}" ;;
--output=*) outputs+=("${1#*=}") ;;
# It's just another URL to download
*) urls+=("$1") ;;
esac
shift
done
if [ -z "${make_build}" ]; then
make_build=0
fi
# Actual work
# Loop over urls
local url_length="${#urls[@]}"
local target
target="$(_get_target "${urls[0]}" "${outputs[0]}")"
_get_main "${urls[0]}" "${outputs[0]}" "${make_build}" "${target}"
if [ "${url_length}" -gt 1 ]; then
url_length="$((url_length-1))"
echo "${url_length}"
for i in $(seq 1 "${url_length}"); do
_get_file "${urls[${i}]}" "${outputs[${i}]}" "${target}"
done
fi
}
# gzip 1.2.4
get_file https://ftp.gnu.org/gnu/gzip/gzip-1.2.4.tar --mkbuild=1
# sed 4.0.9
get_file https://ftp.gnu.org/gnu/sed/sed-4.0.9.tar.gz --mkbuild=1
# patch 2.5.9
get_file https://ftp.gnu.org/pub/gnu/patch/patch-2.5.9.tar.gz --mkbuild=1
# sha-2 61555d
get_file https://github.com/amosnier/sha-2/archive/61555d.tar.gz --mkbuild=1 --output=sha-2-61555d.tar.gz
# make 3.80
get_file https://ftp.gnu.org/gnu/make/make-3.80.tar.gz --mkbuild=1
# bzip2 1.0.8
get_file ftp://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz --mkbuild=1
# coreutils 5.0
get_file https://ftp.gnu.org/gnu/coreutils/coreutils-5.0.tar.bz2 --mkbuild=1
# heirloom-devtools
get_file http://downloads.sourceforge.net/project/heirloom/heirloom-devtools/070527/heirloom-devtools-070527.tar.bz2
# bash 2.05b
get_file https://ftp.gnu.org/pub/gnu/bash/bash-2.05b.tar.gz
# flex 2.5.11
get_file http://download.nust.na/pub2/openpkg1/sources/DST/flex/flex-2.5.11.tar.gz
# musl 1.1.24
get_file https://musl.libc.org/releases/musl-1.1.24.tar.gz
# m4 1.4.7
get_file https://ftp.gnu.org/gnu/m4/m4-1.4.7.tar.gz
# flex 2.6.4
get_file https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz
# bison 3.4.1
get_file https://ftp.gnu.org/gnu/bison/bison-3.4.1.tar.gz
# grep 2.4
get_file https://ftp.gnu.org/gnu/grep/grep-2.4.tar.gz
# diffutils 2.7
get_file https://ftp.gnu.org/gnu/diffutils/diffutils-2.7.tar.gz
# coreutils 6.10
get_file https://ftp.gnu.org/gnu/coreutils/coreutils-6.10.tar.gz
# gawk 3.0.4
get_file https://ftp.gnu.org/gnu/gawk/gawk-3.0.4.tar.gz
# perl 5.000
get_file https://github.com/Perl/perl5/archive/perl-5.000.tar.gz
# perl 5.003
get_file https://github.com/Perl/perl5/archive/perl-5.003.tar.gz
# perl 5.004_05
get_file https://www.cpan.org/src/5.0/perl5.004_05.tar.gz
# perl 5.005_03
get_file https://www.cpan.org/src/5.0/perl5.005_03.tar.gz
# perl 5.6.2
get_file https://www.cpan.org/src/5.0/perl-5.6.2.tar.gz
# autoconf 2.52
get_file https://ftp.gnu.org/gnu/autoconf/autoconf-2.52.tar.bz2
# automake 1.6.3
get_file https://ftp.gnu.org/gnu/automake/automake-1.6.3.tar.bz2
# automake 1.4-p6
get_file https://ftp.gnu.org/gnu/automake/automake-1.4-p6.tar.gz
# autoconf 2.13
get_file https://ftp.gnu.org/gnu/autoconf/autoconf-2.13.tar.gz
# autoconf 2.12
get_file https://ftp.gnu.org/gnu/autoconf/autoconf-2.12.tar.gz
# libtool 1.4
get_file https://ftp.gnu.org/gnu/libtool/libtool-1.4.tar.gz
# binutils 2.14
get_file https://ftp.gnu.org/gnu/binutils/binutils-2.14.tar.bz2
# autoconf 2.53
get_file https://ftp.gnu.org/gnu/autoconf/autoconf-2.53.tar.bz2
# automake 1.7
get_file https://ftp.gnu.org/gnu/automake/automake-1.7.tar.bz2
# autoconf 2.54
get_file https://ftp.gnu.org/gnu/autoconf/autoconf-2.54.tar.bz2
# autoconf 2.55
get_file https://ftp.gnu.org/gnu/autoconf/autoconf-2.55.tar.bz2
# automake 1.7.8
get_file https://ftp.gnu.org/gnu/automake/automake-1.7.8.tar.bz2
# autoconf 2.57
get_file https://ftp.gnu.org/gnu/autoconf/autoconf-2.57.tar.bz2
# autoconf 2.59
get_file https://ftp.gnu.org/gnu/autoconf/autoconf-2.59.tar.bz2
# automake 1.8.5
get_file https://ftp.gnu.org/gnu/automake/automake-1.8.5.tar.bz2
# help2man 1.36.4
get_file https://ftp.gnu.org/gnu/help2man/help2man-1.36.4.tar.gz
# autoconf 2.61
get_file https://ftp.gnu.org/gnu/autoconf/autoconf-2.61.tar.bz2
# automake 1.9.6
get_file https://ftp.gnu.org/gnu/automake/automake-1.9.6.tar.bz2
# findutils 4.2.33
get_file https://ftp.gnu.org/gnu/findutils/findutils-4.2.33.tar.gz \
https://git.savannah.gnu.org/cgit/gnulib.git/snapshot/gnulib-8e128e.tar.gz
# libtool 2.2.4
get_file https://ftp.gnu.org/gnu/libtool/libtool-2.2.4.tar.bz2
# automake 1.10.3
get_file https://ftp.gnu.org/gnu/automake/automake-1.10.3.tar.bz2
# autoconf 2.65
get_file https://ftp.gnu.org/gnu/autoconf/autoconf-2.65.tar.bz2
# gcc 4.0.4
get_file https://ftp.gnu.org/gnu/gcc/gcc-4.0.4/gcc-core-4.0.4.tar.bz2 --output=gcc-4.0.4.tar.bz2
# musl 1.2.2
get_file https://musl.libc.org/releases/musl-1.2.2.tar.gz
# bash 5.1
get_file https://ftp.gnu.org/gnu/bash/bash-5.1.tar.gz
# xz 5.0.5
get_file https://tukaani.org/xz/xz-5.0.5.tar.bz2
# automake 1.11.2
get_file https://ftp.gnu.org/gnu/automake/automake-1.11.2.tar.bz2
# autoconf 2.69
get_file https://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.xz
# automake 1.12.6
get_file https://ftp.gnu.org/gnu/automake/automake-1.12.6.tar.xz
# automake 1.13.4
get_file https://ftp.gnu.org/gnu/automake/automake-1.13.4.tar.xz
# automake 1.15.1
get_file https://ftp.gnu.org/gnu/automake/automake-1.15.1.tar.xz
# tar 1.34
get_file https://ftp.gnu.org/gnu/tar/tar-1.34.tar.xz \
https://git.savannah.gnu.org/cgit/gnulib.git/snapshot/gnulib-30820c.tar.gz
# gmp 6.2.1
get_file https://ftp.gnu.org/gnu/gmp/gmp-6.2.1.tar.xz
# General cleanup
find tmp -name .git -exec rm -rf \;
# initramfs
cd tmp
find . | cpio -H newc -o | gzip > initramfs.igz
# Run
case "${QEMU_CMD}" in
chroot)
sudo PATH="/after/bin:${PATH}" chroot . /init 2>&1 | tee "$LOGFILE"
;;
minikernel)
git clone --depth 1 --branch v0.4 https://github.com/bittorf/kritis-linux.git
kritis-linux/ci_helper.sh \
--arch x86_64 \
--ramsize 4G \
--kernel 5.10.8 \
--initrd initramfs.igz \
--log "$LOGFILE"
;;
*)
${QEMU_CMD} -enable-kvm \
-m "${QEMU_RAM:-8G}" \
-nographic \
-no-reboot \
-kernel ../../kernel -initrd initramfs.igz -append console=ttyS0 | tee "$LOGFILE"
;;
esac
cd ../..
# Cleanup
sudo umount sysa/tmp