# Compiling Time: 6.23 SBU
# Maintainer: crazy <crazy@frugalware.org>
# Contributor: AlexExtreme <alex@alex-smith.me.uk>

## TODO: web* , vnc , fix module loading , guest 3d , split X/noX stuff

USE_VBOX_DEBUG=${USE_VBOX_DEBUG:-"n"}

## Guest Modules

## NOTE: All 3 exists in mainline kernel, however
## all have issues and mixing them is not a good idea either,
## since they don't support the same set of features yet.
## We can try in kernel 5.9+ again but then we need take care of the
## used VirtualBox version.

USE_VBOXGUEST=${USE_VBOXGUEST:-"y"}
USE_VBOXVIDEO=${USE_VBOXVIDEO:-"n"}
USE_VBOXSF=${USE_VBOXSF:-"y"}
## TODO ( 5.9++ )
USE_VBOX_MODS_MAINLINE=${USE_VBOX_MODS_MAINLINE:-"n"}

## NOTE: this is usually not needed unless vbox break stuff or we want to change something
## right now, vbox broke EFI boot, we have to fix some code and build the FW ourselves
USE_VBOX_FIRMWARE_BUILD=${USE_VBOX_FIRMWARE_BUILD:-"n"}

pkgname=virtualbox
_F_archive_name=VirtualBox
pkgver=7.1.10
pkgextraver=""
pkgrel=6
pkgdesc="Oracle VirtualBox is a family of powerful x86 virtualization products for enterprise as well as home use."
url="http://www.virtualbox.org"
depends=('xerces-c>=2.8.0' 'xalan-c>=1.10.0-2' 'iasl' 'libxslt' 'libxcursor' 'libidl' 'sdl' 'openssl>=3.1.0' \
         'alsa-lib>=1.1.4.1'  'curl' 'libxmu' 'libuuid' 'libcap' 'qt6-base>=6.8.2' 'qt6-scxml>=6.8.2' 'python3' \
         'libvpx>=1.15.1' 'lvm2' 'mesa-libglx>=17.3.0-3' 'libxext' 'libx11' 'libpulse' 'libglu' 'libxrandr' 'libxcomposite' \
	 'libxinerama' 'libvncserver' 'iproute2' 'mesa-libegl>=17.3.0-3' 'libglvnd' 'xrandr' 'libinput' 'opus' 'libxml2>=2.14.3')
makedepends=('cdrtools' 'x11-protos' 'qt6-tools' 'mesa-libgl-headers' 'nasm' 'yasm' 'gettext' 'glslang' \
	'clang' 'compiler-rt' 'lld' 'llvm' 'vulkan-headers' 'zlib-ng-devel' 'docbook-xsl')
rodepends=("virtualbox-modules>=$pkgver")
groups=('xapps-extra')
archs=('x86_64')
_F_archive_grepv="BETA\|RC"
up2date="Flastarchive $url/wiki/Downloads .tar.bz2"
source=(http://download.virtualbox.org/virtualbox/${pkgver}/${_F_archive_name}-${pkgver}${pkgextraver}.tar.bz2 \
	0001-fix-bool-reserved-word-error-in-gcc-15.patch \
	10-vboxdrv.rules \
	LocalConfig.kmk \
	60-vboxguest.rules \
	vboxservice.service \
	vboxdrmclient.service \
	vboxdrmclient.path \
	virtualbox-guest-utils.conf \
	depmod.patch \
	python3-3.13.patch )


_F_kernelmod_scriptlet="$startdir/$pkgname.install"
Finclude kernel-module

## PDMLdr: pdmR3LoadR0U: pszName="VMMR0.r0" rc=VERR_INVALID_PARAMETER szErr="SUP_IOCTL_LDR_OPEN failed"
## SUP_IOCTL_LDR_OPEN: pReq->u.In.cbImageBits < pReq->u.In.cbImageWithTabs

## duh this genscriptlet sh*t is plain broken
options=('nowfsecurity' 'genscriptlet' 'nolto' 'scriptlet')
_F_cd_path="${_F_archive_name}-${pkgver}"

sha1sums=('191486425729499454d1c3a2dadfb3b7c41581fc' \
          'b81cb760b33cb5f4da016b210568ef5b15cc2f95' \
          'aa931ae19edd8585150738f0efd8fedf5175a6d3' \
          '0bf23aad34416dd45545f2ea12171e701c4c94af' \
          '08199d8e7906cb793277b798805d38ce386460d8' \
          '3122b27821e48bab2ed7a0cde520e0b821311d3d' \
          '06321cf7aecca8cad7701ad9230e4c765ba35cda' \
          '9de06686eadee89de812767dd1260e921ca5e761' \
          '80ba54b1e13f0e8f53a84ca3f25df617fb53ae4c' \
          'ed04bf751eae0516e98c81157676d7af8ee41c14' \
          '8427a7e641ad422cb5e1955b5474618c3fbe2750')

subpkgs=("$pkgname-modules")
subdescs=('Kernel modules for VirtualBox')
subarchs=('x86_64')
subgroups=('apps-extra')
subdepends=("kernel$_F_kernelmod_name=$_F_kernelmod_pkgver")
suboptions=('scriptlet')
subinstall=("$pkgname-modules.install")

subpkgs+=("$pkgname-guest-additions")
subdescs+=('VirtualBox guest Additions')
subarchs+=('x86_64')
subgroups+=('xapps-extra')
subdepends+=("kernel$_F_kernelmod_name=$_F_kernelmod_pkgver libxcomposite libxdamage libxrandr libxmu pam mesa-dri-drivers xf86-video-vmware")
suboptions+=('scriptlet')
subinstall+=("$pkgname-guest-additions.install")


build() {

	export LDFLAGS+="-ffreestanding"
	export LLVM=1

	Fcd
	## FIXME: figure these
	Fsed '/usr/X11R6/bin/xterm' '/usr/bin/xterm' \
		src/VBox/Runtime/VBox/RTAssertShouldPanic-vbox.cpp
	Fsed 'X11R6/' '' configure
	Fsed 'X11R6/' '' Config.kmk
	Fsed '-Werror$' '' Config.kmk
	Fsed 'VBOX_WITH_CLOUD_NET = 1' 'VBOX_WITH_CLOUD_NET :=' Config.kmk
	Fsed '.*&& check_makeself' '' configure # we don't have makeself
	Fsed 'smc-napa' 'smcnapa' src/VBox/Devices/PC/vbox.dsl

	Fsed 'opt/VirtualBox' 'usr/share/virtualbox' src/VBox/RDP/client-1.8.4/Makefile.kmk

	Fexec cp "$Fsrcdir/LocalConfig.kmk" . || Fdie

	Fsed 'DocPath=.*' '' src/VBox/Installer/common/virtualbox.desktop.in

	echo -e "\nVBOX_GCC_OPT=$CXXFLAGS" >> LocalConfig.kmk ## DO NOT REMOVE

	Fmessage "Building with the following LocalConfig:"
	Fexec cat LocalConfig.kmk

	if Fuse $USE_VBOX_DEBUG; then
		VBoxBuildType="debug"
		VBox_Opts="-d"
	else
		VBoxBuildType="release"

	fi

	VboxSrcDir=${_F_cd_path}/out/linux.amd64/${VBoxBuildType}/bin
	Fpatchall

	# Configure and load our options
	Fexec ./configure \
		--disable-docs \
		--disable-kmods \
		--enable-vde \
		--enable-vnc \
		--enable-pulse ${VBox_Opts} || Fdie

	Fexec source ./env.sh || Fdie


	## NOTE: this needs to run before main kmk, *DD.so & *DD2.so uses the EFI* stuff we just build here
	if Fuse $USE_VBOX_FIRMWARE_BUILD; then
		## Building firmware
		## Wipe prebuild *fd file
		Frm src/VBox/Devices/EFI/FirmwareBin/*
		Fexec cd src/VBox/Devices/EFI/Firmware || Fdie
		. edksetup.sh || Fdie
		## run the weird perl script
		Fexec cd CryptoPkg/Library/OpensslLib/ || Fdie
		Fexec perl process_files.pl || Fdie
		Fexec cd ../../.. || Fdie
		Fexec kmk || Fdie
		Fexec cd $Fsrcdir/${_F_cd_path} || Fdie
	fi

	## we want to build verbose - DO NOT DISABLE THIS
	Fexec kmk KBUILD_VERBOSE=2  all || Fdie

	Fexec kmk KBUILD_VERBOSE=2 -C src/VBox/ExtPacks/VNC packing


	local i k j s m

	Fmkdir usr/share/icons/hicolor/{16x16,20x20,32x32,40x40,48x48,64x64,128x128,scalable}/apps

	for k in 16 20 32 40 48 64 128; do
           Finstall 0644 ${_F_cd_path}/src/VBox/Artwork/OSE/virtualbox-${k}px.png  usr/share/icons/hicolor/${k}x${k}/apps/virtualbox.png
	done

	Finstall 0644 ${_F_cd_path}/src/VBox/Artwork/OSE/virtualbox.svg usr/share/icons/hicolor/scalable/apps/virtualbox.svg

	Fexec cd ${Fsrcdir}/${VboxSrcDir} || Fdie


	## FIXME: lot stuff missing
	#Binaries and Wrapper with Launchers
	Fexerel VBox.sh "usr/bin/VBox"

	for i in VBoxHeadless vboxheadless VBoxManage vboxmanage vboxsdl VirtualBox virtualbox VBoxBalloonCtrl vboxballoonctrl; do
          Fln VBox "usr/bin/$i"
	done

	Fexerel vboximg-mount "usr/bin/vboximg-mount"
	Fexerel vbox-img "usr/bin/vbox-img"

	# workaround broken symlink
	Fexec rm -rf components/VBoxREM.so || Fdie

	Fexerel components/* "usr/lib/virtualbox/components"

	Fexerel *.so "usr/lib/virtualbox"

	Finstallrel 644 *.r0 "usr/lib/virtualbox/"

	## vmmraw stuff
	Finstallrel 644 VBoxEFI*.fd "usr/lib/virtualbox/"

	Finstallrel 4755 VBoxVolInfo VBoxNetNAT VirtualBoxVM VBoxNetDHCP VBoxNetAdpCtl VBoxHeadless "usr/lib/virtualbox"

	Fexerel VBoxManage VirtualBox VBoxSVC VBoxExtPackHelperApp VBoxBalloonCtrl  "usr/lib/virtualbox"

	Fexerel nls/*.qm "usr/share/virtualbox/nls"
	Fmkdir usr/share/virtualbox
	#useless scripts
	Fexerel VBoxCreateUSBNode.sh VBoxSysInfo.sh "usr/share/virtualbox"


	## icons
	pushd icons
	for j in ./*; do
	  Finstallrel 644 $j/* "usr/share/icons/hicolor/$j/mimetypes"
	done
	popd

	## this fixes -> warning: errors occurred while upgrading virtualbox
	## the folder is empty and the owner is hicolor-icon-theme
	Frm usr/share/icons/hicolor/scalable/mimetypes

	Finstallrel 0644 virtualbox.desktop "usr/share/applications/virtualbox.desktop"
	Finstallrel 0644 virtualbox.xml "usr/share/mime/packages/virtualbox.xml"

	#install configuration
	Fmkdir etc/vbox
	echo 'INSTALL_DIR=/usr/lib/virtualbox' > "$Fdestdir/etc/vbox/vbox.cfg"

	#udev and licence
	Finstall 0644 "VirtualBox-${pkgver}/COPYING" "usr/share/licenses/virtualbox/LICENSE"
	Finstall 0644 usr/lib/udev/rules.d/10-vboxdrv.rules

	Fmkdir etc/ld.so.conf.d
	echo /usr/lib/virtualbox  >> "$Fdestdir/etc/ld.so.conf.d/virtualbox.conf" || Fdie

	if ! Fuse $USE_VBOX_DEBUG; then
		Fmessage "Stripping symbols from $pkgname.."
		for s in `find  $Fdestdir/usr/lib/virtualbox -type f -not -name "*.rc" -not -name "*.r0" -not -name "*.fd" -not -name "*.xpt"`; do
			strip -s $s
		done
	fi

	# host kernel modules
	Fexec cd $Fsrcdir/${_F_cd_path}/out/linux.amd64/release/bin/src || Fdie
	Fmkdir ${_F_kernelmod_dir}/kernel/misc

	Fexec make V=1 KERN_DIR=${_F_kernelmod_dir}/build MODULE_DIR_TST=${Fdestdir}${_F_kernelmod_dir} INSTALL_MOD_DIR=kernel/misc KERN_VER=${_F_kernelmod_uname} || Fdie
	Fexec make V=1 KERN_DIR=${_F_kernelmod_dir}/build MODULE_DIR_TST=${Fdestdir}${_F_kernelmod_dir} INSTALL_MOD_DIR=kernel/misc KERN_VER=${_F_kernelmod_uname} INSTALL_MOD_PATH=${Fdestdir}/usr ZSTD_CLEVEL=19 INSTALL_MOD_STRIP=1 install || Fdie


	Fsed "@_F_kernelmod_uname@" "$_F_kernelmod_uname" $startdir/virtualbox-modules.install
	Fkernelver_compress_modules

	Fsplit virtualbox-modules ${_F_kernelmod_dir}/kernel/misc

	# guest additions
	Fexec cd $Fsrcdir/${_F_cd_path}/out/linux.amd64/release/bin/additions || Fdie
	Fexerel usr/bin/VBoxClient
	Fexerel usr/bin/VBoxControl
	Fexerel usr/bin/VBoxService
	Fexerel usr/bin/VBoxDRMClient
	Fexerel usr/bin/mount.vboxsf
	Fexe ${_F_cd_path}/src/VBox/Additions/x11/Installer/98vboxadd-xclient usr/bin/VBoxClient-all
	## segfaults for everyone just not for us, however let's use  a service now
	# I wonder if that has something to do with our stripping?!
	Fsed '/usr/bin/VBoxClient --vmsvga' '#/usr/bin/VBoxClient --vmsvga' $Fdestdir/usr/bin/VBoxClient-all

	Fsplit virtualbox-guest-additions usr/bin/{VBoxClient,VBoxControl,VBoxService,VBoxDRMClient,VBoxClient-all}
	Fsplit virtualbox-guest-additions usr/bin/mount.vboxsf

	Fexe ${_F_cd_path}/src/VBox/Additions/x11/Installer/vboxclient.desktop etc/xdg/autostart/vboxclient.desktop
	Fsplit virtualbox-guest-additions  etc/xdg

	Finstallrel 755 usr/lib/security/pam_vbox.so

	Finstall 644 usr/lib/udev/rules.d/60-vboxguest.rules
	Finstall 644 usr/lib/systemd/system/vboxservice.service
	Finstall 644 usr/lib/systemd/system/vboxdrmclient.service
	Finstall 644 usr/lib/systemd/system/vboxdrmclient.path
	Finstall 644 usr/lib/sysusers.d/virtualbox-guest-utils.conf
	Fsplit virtualbox-guest-additions usr/lib/sysusers.d/

	# guest kernel modules
	KMOD_NAMES=""
	if Fuse $USE_VBOXGUEST; then
		KMOD_NAMES+=" vboxguest "
	fi
	if Fuse $USE_VBOXVIDEO; then
		KMOD_NAMES+=" vboxvideo "
	fi
	if Fuse $USE_VBOXSF; then
		KMOD_NAMES+=" vboxsf "
	fi

	## at least one needs be enabled
	if [[ -n $KMOD_NAMES ]]; then
		Fexec cd $Fsrcdir/${_F_cd_path}/out/linux.amd64/release/bin/additions/src || Fdie
		Fmkdir ${_F_kernelmod_dir}/kernel/misc

		for mod in ${KMOD_NAMES[@]}
		do
			Fexec make V=1 KERN_DIR=${_F_kernelmod_dir}/build MODULE_DIR_TST=${Fdestdir}${_F_kernelmod_dir} INSTALL_MOD_DIR=kernel/misc KERN_VER=${_F_kernelmod_uname}  $mod || Fdie
			Fexec make V=1 KERN_DIR=${_F_kernelmod_dir}/build MODULE_DIR_TST=${Fdestdir}${_F_kernelmod_dir} INSTALL_MOD_DIR=kernel/misc KERN_VER=${_F_kernelmod_uname} INSTALL_MOD_PATH=${Fdestdir}/usr ZSTD_CLEVEL=19 INSTALL_MOD_STRIP=1 install-$mod || Fdie
		done

		Fsed "@_F_kernelmod_uname@" "$_F_kernelmod_uname" $startdir/virtualbox-guest-additions.install

		Fkernelver_compress_modules
		Fsplit virtualbox-guest-additions usr/lib/modules/
	fi

	Fln /usr/lib/systemd/system/vboxservice.service /usr/lib/systemd/system/multi-user.target.wants/vboxservice.service
	Fln /usr/lib/systemd/system/vboxdrmclient.service /usr/lib/systemd/system/multi-user.target.wants/vboxdrmclient.service
	Fln /usr/lib/systemd/system/vboxdrmclient.path /usr/lib/systemd/system/multi-user.target.wants/vboxdrmclient.path

	Fsplit virtualbox-guest-additions usr/lib/security/
	Fsplit virtualbox-guest-additions usr/lib/systemd/
	Fsplit virtualbox-guest-additions usr/lib/udev/rules.d/60-vboxguest.rules

	## REALLY ? this is the only package does NOT need it..
	##  but no way to do that different atm
	Fbuild_kernelmod_scriptlet

	Fmkdir /usr/share/virtualbox/extensions
	Fexec cd $Fsrcdir/${_F_cd_path}/out/linux.amd64/release/packages || Fdie
	Finstallrel 644 "VNC-${pkgver}r*.vbox-extpack" "usr/share/virtualbox/extensions/VNC-${pkgver}.vbox-extpack"

}

# optimization OK

