# Maintainer: Frederic Bezies <fredbezies@gmail.com>
# Contributor: ajs124 < aur at ajs124 dot de>
# Contributor: Devin Cofer <ranguvar{AT]archlinux[DOT}us>
# Contributor: Tobias Powalowski <tpowa@archlinux.org>
# Contributor: David Runge <dvzrv@archlinux.org>
# Contributor: Sébastien "Seblu" Luttringer <seblu@seblu.net>

pkgbase=qemu-git
_gitname=qemu
pkgname=(
  qemu-git
  qemu-headless-git
  qemu-arch-extra-git
  qemu-headless-arch-extra-git
  qemu-block-iscsi-git
  qemu-guest-agent-git
)
pkgdesc="A generic and open source machine emulator and virtualizer. Git version."
pkgver=11.1.0.rc0.r19.g5ef0ecc594
pkgrel=1
epoch=28
arch=(i686 x86_64)
license=(GPL-2.0-or-later LGPL-2.1-or-later)
url="https://wiki.qemu.org/"
# TODO: consider providing rdma-core
# TODO: consider providing lzfse
makedepends=(
  alsa-lib
  brltty
  bzip2
  cairo
  capstone
  curl
  cdrtools
  dtc
  fuse3
  gcc-libs
  gdk-pixbuf2
  git
  glib2
  gnutls
  gtk3
  jack
  libaio
  libbpf
  libcacard
  libcap-ng
  libepoxy
  libiscsi
  libnfs
  libpng
  libpulse
  libsasl
  libseccomp
  libslirp
  libssh
  liburing
  libusb
  libx11
  libxkbcommon
  lzo
  mesa
  meson
  ncurses
  ndctl
  numactl
  pam
  pixman
  python
  python-sphinx
  python-sphinx_rtd_theme
  sdl2
  sdl2_image
  seabios
  snappy
  spice-protocol
  spice
  systemd
  usbredir
  vde2
  virglrenderer
  vte3 libvte-2.91.so
  xfsprogs
  zlib
  zstd
)
options=(!debug !lto)
source=(git+https://gitlab.com/qemu-project/qemu.git
  qemu-guest-agent.service
  65-kvm.rules)
sha256sums=('SKIP'
  'c39bcde4a09165e64419fd2033b3532378bba84d509d39e2d51694d44c1f8d88'
  'a66f0e791b16b03b91049aac61a25950d93e962e1b2ba64a38c6ad7f609b532c')

case $CARCH in
  i?86) _corearch=i386 ;;
  x86_64) _corearch=x86_64 ;;
esac

pkgver() {
  cd "${srcdir}/${_gitname}"
  git describe --long --tags | sed 's/\([^-]*-g\)/r\1/;s/-/./g' | cut -c2-47
}

prepare() {
  cd "${srcdir}/${_gitname}"
  mkdir build-{full,headless}
  mkdir -p extra-arch-{full,headless}/usr/{bin,share/qemu}
}

build() {
  _build full

  _build headless \
    --audio-drv-list= \
    --disable-gtk \
    --disable-vte \
    --disable-brlapi \
    --disable-opengl \
    --disable-dbus-display \
    --disable-virglrenderer \
    --disable-alsa \
    --disable-jack \
    --disable-oss \
    --disable-pa \
    --disable-sdl
}

_build() (

  cd ${srcdir}/${_gitname}/build-$1

  ../configure \
    --prefix=/usr \
    --sysconfdir=/etc \
    --localstatedir=/var \
    --libexecdir=/usr/lib/qemu \
    --smbd=/usr/bin/smbd \
    --enable-modules \
    --enable-sdl \
    --disable-werror #\
  #"${@:2}"

  ninja
)

package_qemu-git() {
  pkgdesc="QEMU Git version."
  depends=(
    alsa-lib libasound.so
    bzip2 libbz2.so
    cairo
    capstone
    curl libcurl.so
    dtc
    fuse3
    gcc-libs
    gdk-pixbuf2 libgdk_pixbuf-2.0.so
    glib2 libgio-2.0.so libglib-2.0.so libgmodule-2.0.so libgobject-2.0.so
    gnutls
    gtk3 libgdk-3.so libgtk-3.so
    jack libjack.so
    libaio
    libbpf libbpf.so
    libcacard
    libcap-ng libcap-ng.so
    libepoxy
    libjpeg libjpeg.so
    libnfs
    libpng
    libpulse libpulse.so
    libsasl
    libseccomp libseccomp.so
    libslirp libslirp.so
    libssh libssh.so
    libusb libusb-1.0.so
    liburing liburing.so
    libx11
    libxdp
    libxkbcommon libxkbcommon.so
    lzo
    mesa
    ncurses libncursesw.so
    ndctl
    numactl libnuma.so
    pam libpam.so
    pixman libpixman-1.so
    seabios
    sdl2
    sdl2_image
    snappy
    spice libspice-server.so
    systemd-libs libudev.so
    usbredir
    virglrenderer
    vde2
    vte3 libvte-2.91.so
    zlib
    zstd libzstd.so
  )
  optdepends=(
    'brltty: for braille device support'
    'qemu-arch-extra-git: extra architectures support'
  )
  conflicts=('qemu-headless' 'qemu' 'qemu-desktop')
  provides=('qemu-headless' 'qemu')

  _package full
}

package_qemu-headless-git() {
  pkgdesc="QEMU without GUI. Git version."
  depends=(
    bzip2 libbz2.so
    curl libcurl.so
    dtc
    fuse3
    gcc-libs
    glib2 libgio-2.0.so libglib-2.0.so libgmodule-2.0.so libgobject-2.0.so
    gnutls
    libaio
    libbpf libbpf.so
    libcacard
    libcap-ng libcap-ng.so
    libjpeg libjpeg.so
    libnfs
    libpng
    libsasl
    libseccomp libseccomp.so
    libslirp libslirp.so
    libssh libssh.so
    libusb libusb-1.0.so
    liburing liburing.so
    libxkbcommon libxkbcommon.so
    lzo
    ndctl
    numactl libnuma.so
    ncurses libncursesw.so
    pam libpam.so
    pixman libpixman-1.so
    seabios
    snappy
    spice libspice-server.so
    systemd-libs libudev.so
    usbredir
    vde2
    zlib
    zstd libzstd.so
  )
  optdepends=('qemu-headless-arch-extra-git: extra architectures support')
  conflicts=('qemu-headless' 'qemu' 'qemu-base')
  provides=('qemu-headless' 'qemu')

  _package headless
}

_package() {
  optdepends+=('ovmf: Tianocore UEFI firmware for qemu'
    'samba: SMB/CIFS server support'
    'qemu-block-iscsi-git: iSCSI block support')
  install=qemu.install
  options=(!strip !emptydirs)

  DESTDIR="$pkgdir" ninja -C "${srcdir}/${_gitname}/build-$1" install "${@:2}"

  # systemd stuff
  install -Dm644 65-kvm.rules "$pkgdir/usr/lib/udev/rules.d/65-kvm.rules"

  # remove conflicting /var/run directory
  cd "$pkgdir"
  rm -r var

  cd usr/lib

  # bridge_helper needs suid
  # https://bugs.archlinux.org/task/32565
  chmod u+s qemu/qemu-bridge-helper

  # remove split block modules
  rm qemu/block-iscsi.so

  cd ../bin

  # remove extra arch
  for _bin in qemu-*; do
    [[ -f $_bin ]] || continue

    case ${_bin#qemu-} in
      # guest agent
      ga)
        rm "$_bin"
        continue
        ;;

      # tools
      edid | img | io | keymap | nbd | pr-helper | storage-daemon) continue ;;

      # core emu
      system-${_corearch}) continue ;;
    esac

    mv "$_bin" "$srcdir/$_gitname/extra-arch-$1/usr/bin"
  done

  cd ../share/qemu
  for _blob in *; do
    [[ -f $_blob ]] || continue

    case $_blob in
      # provided by seabios package
      bios.bin | bios-256k.bin | vgabios-cirrus.bin | vgabios-qxl.bin | \
        vgabios-stdvga.bin | vgabios-vmware.bin | vgabios-virtio.bin | vgabios-bochs-display.bin | \
        vgabios-ramfb.bin | bios-microvm.bin | vgabios-ati.bin)
        rm "$_blob"
        continue
        ;;

      # provided by edk2-ovmf package
      edk2-*)
        rm "$_blob"
        continue
        ;;

      # iPXE ROMs
      efi-* | pxe-*) continue ;;

      # core blobs
      bios-microvm.bin | kvmvapic.bin | linuxboot* | multiboot.bin | sgabios.bin | vgabios*) continue ;;

      # Trace events definitions
      trace-events*) continue ;;
    esac

    mv "$_blob" "$srcdir/$_gitname/extra-arch-$1/usr/share/qemu"
  done

  # provided by edk2-ovmf package
  rm -r firmware

  cd ..
  if [ "$1" = headless ]; then rm -r {applications,icons}; fi
}

package_qemu-arch-extra-git() {
  pkgdesc="QEMU for foreign architectures. Git version."
  depends=(
    dtc
    fuse3
    gcc-libs
    gnutls
    libaio
    libbpf libbpf.so
    glib2 libgio-2.0.so libglib-2.0.so libgobject-2.0.so libgmodule-2.0.so
    libjpeg libjpeg.so
    libpng
    libsasl
    libseccomp libseccomp.so
    libslirp libslirp.so
    liburing liburing.so
    lzo
    ndctl
    numactl libnuma.so
    pam libpam.so
    pixman libpixman-1.so
    snappy
    systemd-libs
    libudev.so
    qemu-git
    vde2
    zlib
    zstd
    libzstd.so
  )
  optdepends=(
    'edk2-armvirt: for aarch64 UEFI support'
    'edk2-ovmf: for ia32 and x64 UEFI support'
  )
  options=(!strip)
  provides=(qemu-arch-extra)
  conflicts=(qemu-arch-extra qemu-emulators-full)

  mv -v "$srcdir/$_gitname/extra-arch-full/usr" "$pkgdir"
}

package_qemu-headless-arch-extra-git() {
  pkgdesc="QEMU without GUI, for foreign architectures. Git version."
  depends=(
    dtc
    fuse3
    gcc-libs
    gnutls
    libaio
    libbpf libbpf.so
    glib2 libgio-2.0.so libglib-2.0.so libgobject-2.0.so libgmodule-2.0.so
    libjpeg libjpeg.so
    libpng
    libsasl
    libseccomp libseccomp.so
    libslirp libslirp.so
    liburing liburing.so
    lzo
    ndctl
    numactl libnuma.so
    pam libpam.so
    pixman libpixman-1.so
    snappy
    qemu-headless-git
    systemd-libs libudev.so
    vde2
    zlib
    zstd libzstd.so
  )
  optdepends=(
    'edk2-armvirt: for aarch64 UEFI support'
    'edk2-ovmf: for ia32 and x64 UEFI support'
  )
  options=(!strip)
  conflicts=(qemu-headless-arch-extra qemu-emulators-full)
  provides=(qemu-headless-arch-extra)

  mv -v "$srcdir/$_gitname/extra-arch-headless/usr" "$pkgdir"
}

package_qemu-block-iscsi-git() {
  pkgdesc="QEMU iSCSI block module. Git version."
  depends=(glibc libiscsi)
  conflicts=(qemu-block-iscsi)
  provides=(qemu-block-iscsi)

  install -vDm 755 "$srcdir/$_gitname/build-full/block-iscsi.so" -t "$pkgdir/usr/lib/qemu/"
}

package_qemu-guest-agent-git() {
  pkgdesc="QEMU Guest Agent. Git version."
  depends=(gcc-libs glib2 libudev.so liburing)
  conflicts=(qemu-guest-agent)
  provides=(qemu-guest-agent)
  install=qemu-guest-agent.install

  install -vDm 755 "$srcdir/$_gitname/build-full/qga/qemu-ga" -t "$pkgdir/usr/bin/"
  install -vDm 644 "$srcdir/qemu-guest-agent.service" -t "$pkgdir/usr/lib/systemd/system/"
  install -vDm 755 "$srcdir/$_gitname/scripts/qemu-guest-agent/fsfreeze-hook" -t "$pkgdir/etc/qemu/"
}

# vim:set ts=2 sw=2 et:
