diff options
-rwxr-xr-x | scripts/bootstrap.sh | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/scripts/bootstrap.sh b/scripts/bootstrap.sh new file mode 100755 index 000000000..5d870f436 --- /dev/null +++ b/scripts/bootstrap.sh @@ -0,0 +1,126 @@ +#!/bin/sh + +set -e + +TARGET_ARCH="$1" +SUDO_APK=abuild-apk + +# optional cross build packages +KERNEL_PKG="linux-firmware linux-vanilla" + +# get abuild configurables +[ -e /usr/share/abuild/functions.sh ] || (echo "abuild not found" ; exit 1) +CBUILDROOT="$(CTARGET=$TARGET_ARCH . /usr/share/abuild/functions.sh ; echo $CBUILDROOT)" +. /usr/share/abuild/functions.sh +[ -z "$CBUILD_ARCH" ] && die "abuild is too old (use 2.29.0 or later)" +[ -z "$CBUILDROOT" ] && die "CBUILDROOT not set for $TARGET_ARCH" + +# deduce aports directory +[ -z "$APORTS" ] && APORTS=$(realpath $(dirname $0)/../) +[ -e "$APORTS/system/build-tools" ] || die "Unable to deduce aports base checkout" + +apkbuildname() { + local repo="${1%%/*}" + local pkg="${1##*/}" + [ "$repo" = "$1" ] && repo="system" + echo $APORTS/$repo/$pkg/APKBUILD +} + +msg() { + [ -n "$quiet" ] && return 0 + local prompt="$GREEN>>>${NORMAL}" + local name="${BLUE}bootstrap-${TARGET_ARCH}${NORMAL}" + printf "${prompt} ${name}: %s\n" "$1" >&2 +} + +if [ -z "$TARGET_ARCH" ]; then + program=$(basename $0) + cat <<EOF +usage: $program TARGET_ARCH + +This script creates a local cross-compiler, and uses it to +cross-compile an Alpine Linux base system for new architecture. + +Steps for introducing new architecture include: +- adding the compiler tripler and arch type to abuild +- adding the arch type detection to apk-tools +- adjusting build rules for packages that are arch aware: + gcc, libressl, linux-headers +- create new kernel config for linux-vanilla + +After these steps the initial cross-build can be completed +by running this with the target arch as parameter, e.g.: + ./$program aarch64 + +EOF + return 1 +fi + +if [ ! -d "$CBUILDROOT" ]; then + msg "Creating sysroot in $CBUILDROOT" + mkdir -p "$CBUILDROOT/etc/apk/keys" + cp -a /etc/apk/keys/* "$CBUILDROOT/etc/apk/keys" + ${SUDO_APK} add --quiet --initdb --arch $TARGET_ARCH --root $CBUILDROOT +fi + +msg "Building cross-compiler" + +# Build and install cross binutils (--with-sysroot) +CTARGET=$TARGET_ARCH BOOTSTRAP=nobase APKBUILD=$(apkbuildname binutils) abuild -r + +if ! CHOST=$TARGET_ARCH BOOTSTRAP=nolibc APKBUILD=$(apkbuildname musl) abuild up2date 2>/dev/null; then + # C-library headers for target + CHOST=$TARGET_ARCH BOOTSTRAP=nocc APKBUILD=$(apkbuildname musl) abuild -r + + # Minimal cross GCC + EXTRADEPENDS_HOST="musl-dev" \ + CTARGET=$TARGET_ARCH BOOTSTRAP=nolibc APKBUILD=$(apkbuildname gcc) abuild -r + + # Cross build bootstrap C-library for the target + EXTRADEPENDS_BUILD="gcc-pass2-$TARGET_ARCH" \ + CHOST=$TARGET_ARCH BOOTSTRAP=nolibc APKBUILD=$(apkbuildname musl) abuild -r +fi + +# Full cross GCC +EXTRADEPENDS_TARGET="musl musl-dev" \ +CTARGET=$TARGET_ARCH BOOTSTRAP=nobase APKBUILD=$(apkbuildname gcc) abuild -r + +# Cross build-base +CTARGET=$TARGET_ARCH BOOTSTRAP=nobase APKBUILD=$(apkbuildname build-base) abuild -r + +msg "Cross building base system" +msg "Change your abuild.conf NOW to avoid build errors!!" +read + +# add implicit target prerequisite packages +apk info --quiet --installed --root "$CBUILDROOT" libgcc libstdc++ musl-dev || \ + ${SUDO_APK} --root "$CBUILDROOT" add --repository "$REPODEST/system" libgcc libstdc++ musl-dev + +# ordered cross-build +for PKG in fortify-headers linux-headers musl libc-dev pkgconf zlib \ + gettext-tiny ncurses readline bash binutils make bison flex m4 \ + openssl libfetch apk-tools linux-pam shadow \ + gmp mpfr3 mpc1 isl cloog gcc ca-certificates \ + openrc libcap-ng coreutils sed gzip bzip2 diffutils \ + attr libcap patch sudo acl fakeroot libarchive mawk \ + pax-utils abuild grep findutils patch lzip unzip autoconf automake libtool \ + ncurses util-linux lvm2 popt xz lddtree libssh2 curl build-tools pcre \ + debianutils file shimmy procps zsh sharutils net-tools check kbd sysklogd vim db groff libpipeline man-db psmisc less \ + adelie-base \ + ; do + + CHOST=$TARGET_ARCH BOOTSTRAP=bootimage APKBUILD=$(apkbuildname $PKG) abuild -r + + case "$PKG" in + fortify-headers | libc-dev | build-base) + # headers packages which are implicit but mandatory dependency + apk info --quiet --installed --root "$CBUILDROOT" $PKG || \ + ${SUDO_APK} --update --root "$CBUILDROOT" --repository "$REPODEST/main" add $PKG + ;; + musl | gcc) + # target libraries rebuilt, force upgrade + [ "$(apk upgrade --root "$CBUILDROOT" --repository "$REPODEST/main" --available --simulate | wc -l)" -gt 1 ] && + ${SUDO_APK} upgrade --root "$CBUILDROOT" --repository "$REPODEST/main" --available + ;; + esac +done |