#!/bin/bash
set -euo pipefail
configuration=/opt/toolchain/config.json
build_root=/opt/toolchain/source
mkdir -p "$build_root" /opt/toolchain/provenance /tmp/qemu-signature
chmod 700 /tmp/qemu-signature
cd "$build_root"
if [[ $1 == qemu ]]; then
curl --fail --location --retry 2 --connect-timeout 20 \
  "$(jq -r .qemu_url "$configuration")" -o qemu.tar.xz
curl --fail --location --retry 2 --connect-timeout 20 \
  "$(jq -r .qemu_signature_url "$configuration")" -o qemu.tar.xz.sig
curl --fail --location --retry 2 --connect-timeout 20 \
  "$(jq -r .qemu_key_url "$configuration")" -o qemu-key.asc
gpg --batch --homedir /tmp/qemu-signature --import qemu-key.asc
gpg --batch --homedir /tmp/qemu-signature --status-fd 1 \
  --verify qemu.tar.xz.sig qemu.tar.xz > /opt/toolchain/provenance/qemu-signature.txt
fingerprint=$(jq -r .qemu_fingerprint "$configuration")
awk -v fingerprint="$fingerprint" \
  '$2 == "VALIDSIG" && ($3 == fingerprint || $NF == fingerprint) {valid=1} END {exit !valid}' \
  /opt/toolchain/provenance/qemu-signature.txt
sha256sum qemu.tar.xz > /opt/toolchain/provenance/qemu-sha256.txt
tar -xf qemu.tar.xz
qemu_version=$(jq -r .qemu_version "$configuration")
jobs=$(jq -r .jobs "$configuration")
cd "qemu-$qemu_version"
./configure --prefix=/opt/qemu --target-list=x86_64-softmmu --enable-kvm \
  --disable-docs --disable-gtk --disable-sdl --disable-vnc --disable-spice \
  --disable-curses --disable-slirp --disable-capstone --disable-werror \
  --enable-trace-backends=log
make -j"$jobs"
make install
rm -rf /tmp/qemu-signature "$build_root/qemu.tar.xz"
/opt/qemu/bin/qemu-system-x86_64 --version
elif [[ $1 == vfio ]]; then
cd "$build_root"
cd /opt/toolchain/downloads
sha256sum --check libvfio-user.tar.gz.sha256
cp libvfio-user.tar.gz.sha256 /opt/toolchain/provenance/libvfio-user-sha256.txt
tar -xf libvfio-user.tar.gz -C "$build_root"
cd "$build_root"
revision=$(jq -r .libvfio_user_revision "$configuration")
jobs=$(jq -r .jobs "$configuration")
meson setup vfio-build "libvfio-user-$revision" --prefix=/opt/vfio \
  --libdir=lib --buildtype=release
ninja -C vfio-build -j"$jobs"
ninja -C vfio-build install
else
  echo 'Expected qemu or vfio build operation' >&2
  exit 2
fi
