#!/bin/bash

# Slackware build script for qemu
# Copyright 2015-2024 Corrado Franco (https://corradofranco.it)
# All rights reserved.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version, with the following exception:
# the text of the GPL license may be omitted.

# This program is distributed in the hope that it will be useful, but
# without any warranty; without even the implied warranty of
# merchantability or fitness for a particular purpose. Compiling,
# interpreting, executing or merely reading the text of the program
# may result in lapses of consciousness and/or very being, up to and
# including the end of all existence and the Universe as we know it.
# See the GNU General Public License for more details.

# You may have received a copy of the GNU General Public License along
# with this program (most likely, a file named COPYING).  If not, see
# <http://www.gnu.org/licenses/>.
#
# Latest version of this SlackBuild at https://github.com/conraid/SlackBuilds

set -eu

cd $(dirname $0) ; CWD=$(pwd)

PKGNAM=qemu
SRCVERSION=9.1.0
VERSION=$(echo $SRCVERSION | tr - _)
BUILD=${BUILD:-1}
TAG=${TAG:-cf}
TMP=${TMP:-/tmp/pkg}
PKG=$TMP/package-$PKGNAM
OUTPUT=${OUTPUT:-/tmp}

# Enable only x86* and arm emulation for qemu: if you want to build
# all the targets available use TARGETS=all
# Thanks to SBo
if [ "${TARGETS:-=""}" = "all" ]; then
  targets=""
else
  targets="--target-list=i386-softmmu,x86_64-softmmu,i386-linux-user,x86_64-linux-user,arm-softmmu,arm-linux-user,armeb-linux-user"
fi

DOCFILES="CODING_STYLE COPYING* Changelog HACKING LICENSE MAINTAINERS README docs/*"

if [ -z ${ARCH:=""} ]; then
  case "$( uname -m )" in
  i?86) ARCH=i686 ;;
  arm*) ARCH=arm ;;
  *) ARCH=$( uname -m ) ;;
  esac
fi

# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
# the name of the created package would be, and then exit. This information
# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME:-""}" ]; then
  echo "$PKGNAM-$VERSION-$ARCH-${BUILD}${TAG}.txz"
  exit 0
fi

if [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=pentium4 -mtune=generic"
  LIBDIRSUFFIX=""
  KVMARCH="i386"
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -march=x86-64 -mtune=generic -fPIC -pipe -fomit-frame-pointer"
  LIBDIRSUFFIX="64"
  KVMARCH="x86_64"
else
  SLKCFLAGS="-O2"
  LIBDIRSUFFIX=""
fi

rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $PKGNAM-$SRCVERSION
tar xvf $CWD/$PKGNAM-$SRCVERSION.tar.xz
cd $PKGNAM-$SRCVERSION
chown -R root:root .
find . \
  \( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 -o -perm 511 \) \
  -exec chmod 755 {} \; -o \
  \( -perm 666 -o -perm 664 -o -perm 600 -o -perm 444 -o -perm 440 -o -perm 400 \) \
  -exec chmod 644 {} \;

# Apply patches
if [ -e $CWD/patches/ ]; then
  if [ -e $CWD/patches/series ]; then
    for PATCH in $(cat $CWD/patches/series); do
      echo patch -p1 -i $CWD/patches/$PATCH
    done
  else
    for PATCH in $CWD/patches/*.patch; do
      echo patch -p1 -i $PATCH
    done
  fi
fi

CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
./configure \
  --extra-cflags="$SLKCFLAGS" \
  --extra-cxxflags="$SLKCFLAGS" \
  --prefix=/usr \
  --libdir=/usr/lib${LIBDIRSUFFIX} \
  --sysconfdir=/etc \
  --localstatedir=/var \
  --docdir=/usr/doc/$PKGNAM-$VERSION \
  --mandir=/usr/man \
  --infodir=/usr/info \
  --enable-system \
  --enable-user \
  --enable-linux-user \
  --enable-guest-agent \
  --disable-docs \
  --enable-modules \
  --disable-debug-info \
  --enable-gnutls \
  --enable-sdl \
  --enable-gtk \
  --enable-curses \
  --enable-vnc \
  --enable-vnc-sasl \
  --enable-vnc-jpeg \
  --enable-virtfs \
  --enable-curl \
  --enable-kvm \
  --enable-vde \
  --enable-cap-ng \
  --enable-attr \
  --enable-lzo \
  --enable-bzip2 \
  --enable-seccomp \
  --disable-tpm \
  --enable-libssh \
  --enable-vte \
  --enable-nettle \
  --enable-virglrenderer \
  --enable-spice \
  --enable-smartcard \
  --enable-libnfs \
  --enable-linux-io-uring \
  --enable-plugins \
  --enable-slirp \
  --enable-tpm \
  --enable-avx2 \
  --enable-avx512bw \
  --audio-drv-list="alsa,sdl,pa,jack" \
  $targets

make
make DESTDIR="$PKG" install
cd ..

# Don't ship .la files:
rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la

find $PKG | xargs file | grep -e "executable" -e "shared object" | grep ELF | cut -f 1 -d : | xargs -r strip --strip-unneeded 2> /dev/null || true
find $PKG | xargs file | grep "current ar archive" | cut -f 1 -d : | xargs -r strip -g 2> /dev/null || true

# Remove empty dir
rm -rf $PKG/var

# create a symlink for qemu-kvm to support aqemu and such frontends
# even though qemu now has a gtk gui.
# Thanks to SBo
[ ! -z $KVMARCH ] && ln -s qemu-system-$KVMARCH $PKG/usr/bin/qemu-kvm

# bridge_helper needs suid. Thanks to Archlinux
chmod u+s $PKG/usr/libexec/qemu-bridge-helper

# install some udev rules for /dev/kvm. Thanks to SBo and Archlinux
install -Dm644 $CWD/files/65-kvm.rules $PKG/lib/udev/rules.d/65-kvm.rules

mkdir -p $PKG/usr/doc/$PKGNAM-$VERSION
cp -a $DOCFILES $PKG/usr/doc/$PKGNAM-$VERSION || true
cat $CWD/$PKGNAM.SlackBuild > $PKG/usr/doc/$PKGNAM-$VERSION/$PKGNAM.SlackBuild

mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
if [ -e $CWD/slack-required ]; then
  cat $CWD/slack-required > $PKG/install/slack-required
fi

cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PKGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-txz}
