live-bootstrap/rootfs.sh
fosslinux 54234a5683 Add multiple tarball support, named args in rootfs.sh
1. Add named args to make this more clear and avoid unnessecarily
   setting default values for certain values ot set others positioned
   later.
2. Add support for multiple tarballs in rootfs.sh.
3. Add support for extracting multiple tarballs (name dosen't matter
   anymore) in helpers.sh.
4. Add comment for 4th arg to build.
2021-04-06 08:59:37 +10:00

388 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
# 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
# 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