~comcloudway/builds.sr.ht

21f8c5068e8600d7430ec2ba40ab9ebbd7416e85 — Drew DeVault 5 years ago 27a67c0
image/debian: basic ppc64el support
M images/control => images/control +2 -0
@@ 31,6 31,8 @@ cpu_opts() {
		x86_64)
			printf "%s" "-cpu qemu64"
			;;
		ppc64le)
			;;
		*)
			echo "Unsupported architecture $arch" >&2
			exit 1

M images/debian/build.yml => images/debian/build.yml +3 -0
@@ 30,6 30,9 @@ tasks:
          amd64)
              qpkg=x86
              ;;
          ppc64el)
              qpkg=ppc
              ;;
      esac
      sudo apt install -y qemu-system-"$qpkg"
      sudo ./genimg $arch

M images/debian/functions => images/debian/functions +10 -0
@@ 18,6 18,16 @@ boot() {
				-initrd "$wd/$arch/initrd.img" \
				-append "root=/dev/vda3"
			;;
		ppc64el)
			driveopts="id=root,if=none"
			qemu=qemu-system-ppc64le
			_boot \
				$(cpu_opts ppc64le) \
				-device virtio-blk-pci,drive=root \
				-kernel "$wd/$arch/vmlinuz" \
				-initrd "$wd/$arch/initrd.img" \
				-append "root=/dev/vda3"
			;;
		*)
			echo "Unsupported architecture $arch" >&2
			exit 1

M images/debian/genimg => images/debian/genimg +9 -1
@@ 10,6 10,10 @@ case $arch in
		iface=enp0s1
		qarch=aarch64
		;;
	ppc64el)
		iface=ens3
		qarch=ppc64
		;;
	*)
		echo "unsupported architecture $arch"
		exit 1


@@ 60,7 64,7 @@ if [ "$arch" = "x86_64" ]
then
	debootstrap --include=gnupg2 --arch=$arch $release /mnt
else
	qemu-debootstrap --include=gnupg2 --arch=$arch $release /mnt
	../qemu-debootstrap --include=gnupg2 --arch=$arch $release /mnt
fi

mount --bind /dev /mnt/dev


@@ 145,6 149,10 @@ case "$arch" in
		cp /mnt/boot/vmlinuz-* $arch/vmlinuz
		cp /mnt/boot/initrd.img-* $arch/initrd.img
		;;
	ppc64el)
		cp /mnt/boot/vmlinuz-* $arch/vmlinuz
		cp /mnt/boot/initrd.img-* $arch/initrd.img
		;;
esac

sync

A images/debian/qemu-debootstrap => images/debian/qemu-debootstrap +171 -0
@@ 0,0 1,171 @@
#!/bin/sh
# qemu-debootstrap - setup qemu syscall emulation in a debootstrap chroot
# Copyright (C) 2010 Loïc Minier <lool@dooz.org>
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
# SOFTWARE IN THE PUBLIC INTEREST, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
# Except as contained in this notice, the name of the author shall not be used
# in advertising or otherwise to promote the sale, use or other dealings in
# this Software without prior written authorization from the author.

set -e

log() {
    local format="$1"
    shift
    printf -- "$format\n" "$@" >&2
}

warn() {
    local format="$1"
    shift
    log "W: $format" "$@"
}

die() {
    local format="$1"
    shift
    log "E: $format" "$@"
    exit 1
}

run() {
    log "I: Running command: %s" "$*"
    "$@"
}

escape() {
    echo "$*" | sed "s/'/'\"'\"'/g; s/.*/'&'/"
}
unescape () {
    eval "echo" "$*"
}

system_arch="amd64"
deb_arch="$system_arch"

opts=""
args=""
suite=""
target=""
mirror=""
script=""
while [ $# -gt 0 ]; do
    case "$1" in
      --help)
        die "I'm just a debootstrap wrapper; please see debootstrap --help"
      ;;
      --arch|--arch=?*)
        if [ "$1" = "--arch" -a $# -ge 2 -a -n "$2" ]; then
            deb_arch="$2"
            shift 2
        elif [ "$1" != "${1#--arch=}" ]; then
            deb_arch="${1#--arch=}"
            shift
        else
            die "option %s requires an argument" "$1"
        fi
      ;;
      --include|--exclude|--components|--variant|--keyring|--unpack-tarball|--make-tarball|--second-stage-target|--extractor|--private-key|--certificate)
        if [ $# -ge 2 -a -n "$2" ]; then
            opts="$opts $(escape "$1") $(escape "$2")"
            shift 2
        else
            die "option %s requires an argument" "$1"
        fi
      ;;
      --*)
        opts="$opts $(escape "$1")"
        shift
      ;;
      *)
        if [ -z "$suite" ]; then stage="suite";
        elif [ -z "$target" ]; then stage="target";
        elif [ -z "$mirror" ]; then stage="mirror";
        elif [ -z "$script" ]; then stage="script";
        fi
        if [ -n "$1" ]; then
            eval $stage=\"\$1\"
            args="$args $(escape "$1")"
        else
            die "option %s may not be empty" "$stage"
        fi
        shift
      ;;
    esac
done

which debootstrap >/dev/null 2>/dev/null ||
  die "debootstrap isn't found in \$PATH, is debootstrap package installed?"

needs_qemu="yes"
if [ "$deb_arch" = "$system_arch" ]; then
    warn "Target architecture is the same as host architecture; disabling QEMU support"
    needs_qemu="no"
fi
# bi-arch; TODO test whether the running kernel is actually bi-arch capable
case "$system_arch-$deb_arch" in
  amd64-i386|arm-armel|armel-arm|arm-armhf|armhf-arm|armel-armhf|armhf-armel|i386-amd64|powerpc-ppc64|ppc64-powerpc|sparc-sparc64|sparc64-sparc|s390-s390x|s390x-s390)
    warn "Host architecture might allow running target architecture; disabling QEMU support"
    needs_qemu="no"
  ;;
esac

if [ "$needs_qemu" = no ]; then
    eval run debootstrap --arch "$deb_arch" $opts $args
    exit $?
fi

qemu_arch=""
case "$deb_arch" in
  alpha|arm|armeb|i386|m68k|mips|mipsel|mips64el|ppc64|riscv32|riscv64|sh4|sh4eb|sparc|sparc64|s390x)
    qemu_arch="$deb_arch"
  ;;
  amd64)
    qemu_arch="x86_64"
  ;;
  armel|armhf)
    qemu_arch="arm"
  ;;
  arm64)
    qemu_arch="aarch64"
  ;;
  lpia)
    qemu_arch="i386"
  ;;
  powerpc|powerpcspe)
    qemu_arch="ppc"
  ;;
  ppc64el)
    qemu_arch="ppc64le"
  ;;
  *)
    die "Sorry, I don't know how to support arch %s" "$arch"
  ;;
esac

if ! which "qemu-$qemu_arch-static" >/dev/null 2>&1; then
    die "Sorry, couldn't find binary %s" "qemu-$qemu_arch-static"
fi

eval run debootstrap --arch "$deb_arch" --foreign $opts $args
mkdir -p "$target/usr/bin"
cp $(which "qemu-$qemu_arch-static") "$target/usr/bin"
run chroot "$target" /debootstrap/debootstrap --second-stage