summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xscripts/bootstrap.sh126
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