#!/bin/sh set -e TARGET_ARCH="$1" SUDO_APK=abuild-apk # 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 packages directory" 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 Adélie 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, musl, binutils, easy-kernel - create new kernel config for easy-kernel 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 musl pkgconf zlib \ gettext-tiny ncurses bash binutils make bison flex m4 \ openssl apk-tools linux-pam shadow \ gmp mpfr3 mpc1 isl 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/system" 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