# Adapted from Arch Linux

# Note: --disable-kmods, we use DKMS.
# Note: --build-* means building from bundled sources.
# Note: --disable-docs, use pre-generated documentation from distribution
# packages - upstream build system is too much of a pain.
# Note: The build system cannot handle switches, all options are hard-coded.
abinfo "Running configure ..."
"$SRCDIR"/configure \
    --enable-vnc \
    --enable-libvorbis \
    --enable-libogg \
    --enable-vde \
    --setup-wine \
    --disable-docs \
    --disable-kmods \
    --with-gcc=gcc-multilib-wrapper \
    --with-g++=g++-multilib-wrapper \
    --with-makeself=/usr/bin/echo

abinfo "Sourcing env.sh to export required environment variables ..."
source "$SRCDIR"/env.sh
kmk

abinfo "Building VNC plugin ..."
kmk -C "$SRCDIR"/src/VBox/ExtPacks/VNC packing
abinfo "Building virtualbox image mounter ..."
kmk -C "$SRCDIR"/src/VBox/ImageMounter/vboximg-mount

OUTPUTDIR="$SRCDIR"/out/linux.amd64/release/bin

abinfo "Preparing target directories ..."
install -vdm755 "$PKGDIR"/usr/{src,bin,lib/virtualbox}

abinfo "Installing binaries ..."
install -vm755 "$OUTPUTDIR"/VBox.sh "$PKGDIR"/usr/bin/VBox
for i in VBoxHeadless VBoxManage VBoxSDL VirtualBox vboxwebsrv VBoxBalloonCtrl; do
    ln -svf VBox "$PKGDIR"/usr/bin/$i
    ln -svf VBox "$PKGDIR"/usr/bin/${i,,}
done

install -vm755 "$OUTPUTDIR"/vboximg-mount "$PKGDIR"/usr/bin

abinfo "Installing libraries ..."
install -vm755 "$OUTPUTDIR"/*.so "$PKGDIR"/usr/lib/virtualbox
install -vm644 "$OUTPUTDIR"/*.r0 "$OUTPUTDIR"/VBoxEFI*.fd "$PKGDIR"/usr/lib/virtualbox

abinfo "** (1/2) Installing setuid root binaries ..."
for i in VBoxSDL VBoxHeadless VBoxNetDHCP VBoxNetAdpCtl VBoxNetNAT VirtualBoxVM; do
    install -vm4755 "$OUTPUTDIR/$i" -t "$PKGDIR"/usr/lib/virtualbox
done

abinfo "** (2/2) Installing other binaries ..."
for i in VBoxManage VirtualBox VBoxSVC VBoxExtPackHelperApp VBoxXPCOMIPCD.so VBoxBalloonCtrl vboxwebsrv webtest; do
    install -vm755 "$OUTPUTDIR/$i" -t "$PKGDIR"/usr/lib/virtualbox
done

abinfo "Installing components ..."
install -vdm755 "$PKGDIR"/usr/lib/virtualbox/components
install -vm755 "$OUTPUTDIR"/components/* -t "$PKGDIR"/usr/lib/virtualbox/components

abinfo "Installing extensions packs ..."
install -vdm755 "$PKGDIR"/usr/lib/virtualbox/ExtensionPacks

abinfo "Installing language files ..."
install -vdm755 "$PKGDIR"/usr/share/virtualbox/nls
install -vm755 "$OUTPUTDIR"/nls/*.qm -t "$PKGDIR"/usr/share/virtualbox/nls

abinfo "Installing other scripts ..."
install -vm755 "$OUTPUTDIR"/VBoxCreateUSBNode.sh "$OUTPUTDIR"/VBoxSysInfo.sh -t "$PKGDIR"/usr/share/virtualbox

abinfo "Installing icon files ..."
install -vDm644 "$OUTPUTDIR"/VBox.png "$PKGDIR"/usr/share/pixmaps/VBox.png

pushd "$OUTPUTDIR"/icons >/dev/null
for i in *; do
    install -vd "$PKGDIR"/usr/share/icons/hicolor/$i/mimetypes
    cp -v $i/* "$PKGDIR"/usr/share/icons/hicolor/$i/mimetypes
done
popd >/dev/null

abinfo "Installing desktop files ..."
install -Dvm644 "$OUTPUTDIR"/virtualbox.desktop "$PKGDIR"/usr/share/applications/virtualbox.desktop
install -Dvm644 "$OUTPUTDIR"/virtualbox.xml "$PKGDIR"/usr/share/mime/packages/virtualbox.xml

abinfo "Installing configuration files ..."
install -vdm755 "$PKGDIR"/etc/vbox
echo 'INSTALL_DIR=/usr/lib/virtualbox' >"$PKGDIR"/etc/vbox/vbox.cfg

abinfo "Installing SDK ..."
install -Dvm755 "$OUTPUTDIR"/vboxshell.py "$PKGDIR"/usr/lib/virtualbox/vboxshell.py

pushd "$OUTPUTDIR"/sdk/installer/python/
VBOX_INSTALL_PATH=/usr/lib/virtualbox python3 vboxapisetup.py install --root "$PKGDIR"
popd

rm -rv "$OUTPUTDIR"/sdk/installer
mv -v "$OUTPUTDIR"/sdk "$PKGDIR"/usr/lib/virtualbox

abinfo "Copying required sources ..."
cp -rv "$OUTPUTDIR"/src "$PKGDIR"/usr/src/vboxhost-${PKGVER}_OSE

abinfo "Generating dkms related configuration and scripts ..."
cat >"$PKGDIR"/usr/src/vboxhost-${PKGVER}_OSE/dkms.conf <<EOF
PACKAGE_NAME="vboxhost"
PACKAGE_VERSION=${PKGVER}_OSE
AUTOINSTALL=yes

BUILT_MODULE_NAME[0]="vboxdrv"
BUILT_MODULE_LOCATION[0]="vboxdrv"
DEST_MODULE_LOCATION[0]="/kernel/misc"

BUILT_MODULE_NAME[1]="vboxnetflt"
BUILT_MODULE_LOCATION[1]="vboxnetflt"
DEST_MODULE_LOCATION[1]="/kernel/misc"

BUILT_MODULE_NAME[2]="vboxnetadp"
BUILT_MODULE_LOCATION[2]="vboxnetadp"
DEST_MODULE_LOCATION[2]="/kernel/misc"

EOF

abinfo "Generating DKMS script ..."
cat >"$PKGDIR"/usr/src/vboxhost-${PKGVER}_OSE/do_dkms <<EOF
#!/bin/sh

ACTION=
if [ "\$1" = "install" ]; then
  ACTION="install"
  MODULE="\$2"
  VERSION="\$3"
elif [ "\$1" = "uninstall" ]; then
  shift
  ACTION="uninstall"
  OLDMODULES="\$*"
fi

DKMS=\`which dkms 2>/dev/null\`
if [ -n "\$DKMS" ]
then
    if [ "\$ACTION" = "uninstall" ]; then

        echo "Uninstalling modules from DKMS"
        for m in \$OLDMODULES
        do
            \$DKMS status -m \$m | while read line
            # first, remove _any_ old module
            do
                if echo "\$line" | grep -q added > /dev/null ||
                   echo "\$line" | grep -q built > /dev/null ||
                   echo "\$line" | grep -q installed > /dev/null; then
                    # either 'vboxvideo, <version >: added'
                    # or 'vboxvideo, ...: installed'
                    version=\`echo "\$line" | sed "s/\$m,\([^,]*\)[,:].*/\1/;t;d"\`
                    echo "  removing old DKMS module \$m version \$version"
                    \$DKMS remove -m \$m -v \$version --all
                fi
            done
        done
        exit 0

    elif [ "\$ACTION" = "install" ]; then

        echo "Attempting to install using DKMS"
        if \$DKMS add -m \$MODULE -v \$VERSION &&
            \$DKMS build -m \$MODULE -v \$VERSION &&
            \$DKMS install -m \$MODULE -v \$VERSION --force
        then
            exit 0
        fi
        echo "Failed to install using DKMS, attempting to install without"

    fi
fi

exit 1
EOF
chmod -v +x "$PKGDIR"/usr/src/vboxhost-${PKGVER}_OSE/do_dkms

abinfo "Installing unattended templates ..."
cp -rv "$SRCDIR"/src/VBox/Main/UnattendedTemplates \
    "$PKGDIR"/usr/share/virtualbox

abinfo "Installing help data ..."
dpkg -x "$SRCDIR"/../virtualbox.deb \
    "$SRCDIR"/temp
install -Dvm644 "$SRCDIR"/temp/usr/share/doc/virtualbox-${PKGVER%.*}/User* \
    -t "$PKGDIR"/usr/share/doc/virtualbox/

abinfo "Installing Guest Additions ISO ..."
install -Dvm644 "$SRCDIR"/../VBoxGuestAdditions.iso \
    "$PKGDIR"/usr/lib/virtualbox/additions/VBoxGuestAdditions.iso

# FIXME: Wine processes may not exit cleanly post-build.
processes=(
    "wineserver"
    "services.exe"
    "explorer.exe"
    "winedevice.exe"
    "svchost.exe"
    "plugplay.exe"
)
for process in "${processes[@]}"; do
    abinfo "Killing unhandled Wine process: $i ..."
    pgrep "$process" | xargs -r kill -9 || true
done
