# Contributor: Sergei Lukin <sergej.lukin@gmail.com>
# Contributor: Valery Kartel <valery.kartel@gmail.com>
# Contributor: Jakub Jirutka <jakub@jirutka.cz>
# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
pkgname=qemu
pkgver=2.11.1
pkgrel=0
pkgdesc="QEMU is a generic machine emulator and virtualizer"
url="http://qemu.org/"
arch="all"
license="GPL-2.0 LGPL-2"
makedepends="
	alsa-lib-dev
	bison
	curl-dev
	flex
	glib-dev
	glib-static
	gnutls-dev
	gtk+3.0-dev
	libaio-dev
	libcap-dev
	libcap-ng-dev
	libjpeg-turbo-dev
	libnfs-dev
	libpng-dev
	libssh2-dev
	libusb-dev
	linux-headers
	lzo-dev
	ncurses-dev
	paxmark
	snappy-dev
	spice-dev
	texinfo
	usbredir-dev
	util-linux-dev
	vde2-dev
	xfsprogs-dev
	zlib-dev
	"
pkggroups="qemu"
install="$pkgname.pre-install $pkgname.post-install"
# suid needed for qemu-bridge-helper
# strip fails on .img files
# some tests does not run on our builders
options="suid !strip !check"
subpackages="$pkgname-doc $pkgname-lang $pkgname-guest-agent:guest"

_subsystems="
	aarch64
	alpha
	arm
	armeb
	cris
	hppa
	i386
	m68k
	microblaze
	microblazeel
	mips
	mips64
	mips64el
	mipsel
	mipsn32
	mipsn32el
	or1k
	ppc
	ppc64
	ppc64abi32
	ppc64le
	s390x
	sh4
	sh4eb
	sparc
	sparc32plus
	sparc64
	system-aarch64
	system-alpha
	system-arm
	system-cris
	system-i386
	system-lm32
	system-m68k
	system-microblaze
	system-microblazeel
	system-mips
	system-mips64
	system-mips64el
	system-mipsel
	system-moxie
	system-nios2
	system-or1k
	system-ppc
	system-ppc64
	system-ppcemb
	system-s390x
	system-sh4
	system-sh4eb
	system-sparc
	system-sparc64
	system-tricore
	system-unicore32
	system-x86_64
	system-xtensa
	system-xtensaeb
	tilegx
	x86_64
	"
for _sub in $_subsystems; do
	subpackages="$subpackages $pkgname-$_sub:_subsys"
done

case "$CARCH" in
	x86) _arch=i386 ;;
	x86_64) _arch=x86_64 ;;
	*) _arch="" ;;
esac
if [ -n "$_arch" ]; then
	subpackages="$subpackages $pkgname-gtk"
	gtk() { _subsys system-$_arch-gtk; }
fi

subpackages="$subpackages $pkgname-img"  # -img must be declared the last

source="http://wiki.qemu-project.org/download/$pkgname-$pkgver.tar.bz2
	0001-elfload-load-PIE-executables-to-right-address.patch
	0006-linux-user-signal.c-define-__SIGRTMIN-MAX-for-non-GN.patch
	0001-linux-user-fix-build-with-musl-on-aarch64.patch
	musl-F_SHLCK-and-F_EXLCK.patch
	fix-sigevent-and-sigval_t.patch
	xattr_size_max.patch
	ncurses.patch
	ignore-signals-33-and-64-to-allow-golang-emulation.patch
	0001-linux-user-fix-build-with-musl-on-ppc64le.patch
	fix-sockios-header.patch
	test-crypto-ivgen-skip-essiv.patch
	12-12-Fix-configure-for-s390-qemu-on-alpine.patch

	$pkgname-guest-agent.confd
	$pkgname-guest-agent.initd
	80-kvm.rules
	bridge.conf
	"
builddir="$srcdir/$pkgname-$pkgver"

# secfixes:
#   2.8.1-r1:
#   - CVE-2016-7994
#   - CVE-2016-7995
#   - CVE-2016-8576
#   - CVE-2016-8577
#   - CVE-2016-8578
#   - CVE-2016-8668
#   - CVE-2016-8909
#   - CVE-2016-8910
#   - CVE-2016-9101
#   - CVE-2016-9102
#   - CVE-2016-9103
#   - CVE-2016-9104
#   - CVE-2016-9105
#   - CVE-2016-9106
#   - CVE-2017-2615
#   - CVE-2017-2620
#   - CVE-2017-5525
#   - CVE-2017-5552
#   - CVE-2017-5578
#   - CVE-2017-5579
#   - CVE-2017-5667
#   - CVE-2017-5856
#   - CVE-2017-5857
#   - CVE-2017-5898
#   - CVE-2017-5931

prepare() {
	default_prepare  # apply patches

	sed -i 's/^VL_LDFLAGS=$/VL_LDFLAGS=-Wl,-z,execheap/' \
		Makefile.target
}

_compile_common() {
	CFLAGS="${CFLAGS/-Os/-O2}" "$builddir"/configure \
		--prefix=/usr \
		--localstatedir=/var \
		--sysconfdir=/etc \
		--libexecdir=/usr/lib/qemu \
		--disable-glusterfs \
		--disable-debug-info \
		--disable-bsd-user \
		--disable-werror \
		--disable-sdl \
		--disable-xen \
		--cc="${CC:-gcc}" \
		"$@"
	make ARFLAGS="rc"
}

_compile_system() {
	_compile_common \
		--audio-drv-list=oss,alsa \
		--enable-kvm \
		--enable-vde \
		--enable-virtfs \
		--enable-curl \
		--enable-cap-ng \
		--enable-linux-aio \
		--enable-usb-redir \
		--enable-libssh2 \
		--enable-vhost-net \
		--enable-snappy \
		--enable-tpm \
		--enable-libnfs \
		--enable-lzo \
		--enable-docs \
		--enable-curses \
		--enable-pie \
		--disable-linux-user \
		"$@"
}

build() {
	mkdir -p "$builddir"/build \
		"$builddir"/build-user \
		"$builddir"/build-gtk

	cd "$builddir"/build-user
	_compile_common \
		--enable-linux-user \
		--disable-system \
		--static

	cd "$builddir"/build
	_compile_system \
		--enable-vnc \
		--enable-vnc-png \
		--enable-vnc-jpeg \
		--enable-spice \
		--enable-guest-agent \
		--disable-gtk

	if [ -n "$_arch" ]; then
		cd "$builddir"/build-gtk
		_compile_system \
			--enable-gtk \
			--with-gtkabi=3.0 \
			--disable-vnc \
			--disable-spice \
			--disable-guest-agent \
			--target-list="$_arch-softmmu"
	fi
}

check() {
	cd "$builddir"/build

	# XXX: ESSIV crypto tests are disabled, see test-crypto-ivgen-skip-essiv.patch.
	make check V=1
}

package() {
	cd "$builddir"/build-user
	make DESTDIR="$pkgdir" install

	cd "$builddir"/build
	make DESTDIR="$pkgdir" install
	paxmark -m "$pkgdir"/usr/bin/qemu-system-*

	install -Dm640 -g qemu "$srcdir"/bridge.conf \
		"$pkgdir"/etc/qemu/bridge.conf

	install -Dm644 "$srcdir"/80-kvm.rules \
		"$pkgdir"/lib/udev/rules.d/80-kvm.rules

	# qemu-bridge-helper needs suid to create tunX devices;
	# allow only users in the qemu group to run it.
	chmod 04710 "$pkgdir"/usr/lib/qemu/qemu-bridge-helper
	chgrp qemu "$pkgdir"/usr/lib/qemu/qemu-bridge-helper

	if [ -n "$_arch" ]; then
		cd "$builddir"/build-gtk
		install $_arch-softmmu/qemu-system-$_arch \
			"$pkgdir"/usr/bin/qemu-system-$_arch-gtk
	fi

	# Do not install HTML docs.
	rm "$pkgdir"/usr/share/doc/qemu/*.html
}

_subsys() {
	local name=${1:-"${subpkgname#$pkgname-}"}
	pkgdesc="Qemu ${name/-/ } emulator"
	options=""
	depends=""
	case "$name" in
		system*) depends="qemu";;
	esac

	mkdir -p "$subpkgdir"/usr/bin
	mv "$pkgdir"/usr/bin/qemu-$name "$subpkgdir"/usr/bin/
}

img() {
	pkgdesc="QEMU command line tool for manipulating disk images"
	depends=""
	options=""

	mkdir -p "$subpkgdir"/usr/bin
	mv "$pkgdir"/usr/bin/qemu-img \
		"$pkgdir"/usr/bin/qemu-io \
		"$pkgdir"/usr/bin/qemu-nbd \
		"$subpkgdir"/usr/bin/

	# We exploit the fact that -img subpackage are created last
	# and check that we done have new systems that belongs in
	# subpackage.
	local path= retval=0
	for path in "$pkgdir"/usr/bin/qemu-system-*; do
		if [ -r "$path" ]; then
			error "Please create a subpackage for ${path##*/}"
			retval=1
		fi
	done
	return $retval
}

guest() {
	pkgdesc="QEMU guest agent"
	depends=""
	options=""

	mkdir -p "$subpkgdir"/usr/bin
	mv "$pkgdir"/usr/bin/qemu-ga "$subpkgdir"/usr/bin/

	install -Dm755 "$srcdir"/$pkgname-guest-agent.initd \
		"$subpkgdir"/etc/init.d/$pkgname-guest-agent
	install -Dm644 "$srcdir"/$pkgname-guest-agent.confd \
		"$subpkgdir"/etc/conf.d/$pkgname-guest-agent
}

sha512sums="1b692bbdfc3dc785738c7192aa2a3f9cf53d9f5bf3b3f49fa8692050dc50f7056c8a4d1b527d48ffb2a674a0fd3a46d87addd1eaaa758f35eec1ab5adfe32354  qemu-2.11.1.tar.bz2
405008589cad1c8b609eca004d520bf944366e8525f85a19fc6e283c95b84b6c2429822ba064675823ab69f1406a57377266a65021623d1cd581e7db000134fd  0001-elfload-load-PIE-executables-to-right-address.patch
ec84b27648c01c6e58781295dcd0c2ff8e5a635f9836ef50c1da5d0ed125db1afc4cb5b01cb97606d6dd8f417acba93e1560d9a32ca29161a4bb730b302440ea  0006-linux-user-signal.c-define-__SIGRTMIN-MAX-for-non-GN.patch
1ac043312864309e19f839a699ab2485bca51bbf3d5fdb39f1a87b87e3cbdd8cbda1a56e6b5c9ffccd65a8ac2f600da9ceb8713f4dbba26f245bc52bcd8a1c56  0001-linux-user-fix-build-with-musl-on-aarch64.patch
224f5b44da749921e8a821359478c5238d8b6e24a9c0b4c5738c34e82f3062ec4639d495b8b5883d304af4a0d567e38aa6623aac1aa3a7164a5757c036528ac0  musl-F_SHLCK-and-F_EXLCK.patch
5da8114b9bd2e62f0f1f0f73f393fdbd738c5dea827ea60cedffd6f6edd0f5a97489c7148d37a8ec5a148d4e65d75cbefe9353714ee6b6f51a600200133fc914  fix-sigevent-and-sigval_t.patch
4b1e26ba4d53f9f762cbd5cea8ef6f8062d827ae3ae07bc36c5b0c0be4e94fc1856ad2477e8e791b074b8a25d51ed6d0ddd75e605e54600e5dd0799143793ce4  xattr_size_max.patch
b6ed02aaf95a9bb30a5f107d35371207967edca058f3ca11348b0b629ea7a9c4baa618db68a3df72199eea6d86d14ced74a5a229d17604cc3f0adedcfeae7a73  ncurses.patch
fd178f2913639a0c33199b3880cb17536961f2b3ff171c12b27f4be6bca032d6b88fd16302d09c692bb34883346babef5c44407a6804b20a39a465bb2bc85136  ignore-signals-33-and-64-to-allow-golang-emulation.patch
d8933df9484158c2b4888254e62117d78f8ed7c18527b249419f39c2b2ab1afa148010884b40661f8965f1ef3105580fceffdfddbb2c9221dc1c62066722ba65  0001-linux-user-fix-build-with-musl-on-ppc64le.patch
39590476a4ebd7c1e79a4f0451b24c75b1817a2a83abaa1f71bb60b225d772152f0af8f3e51ff65645e378c536ffa6ff551dade52884d03a14b7c6a19c5c97d4  fix-sockios-header.patch
8b8db136f78bd26b5da171effa9e11016ec2bc3e2fc8107228b5543b47aa370978ed883794aa4f917f334e284a5b49e82070e1da2d31d49301195b6713a48eff  test-crypto-ivgen-skip-essiv.patch
272272efbf380a6c070c267864c96aa6747c446394b650c9e40633f905e3b6240faa12202e38e9dede5fce02df3fc1bf5b0d6c7ce96826488e752ce339588117  12-12-Fix-configure-for-s390-qemu-on-alpine.patch
d90c034cae3f9097466854ed1a9f32ab4b02089fcdf7320e8f4da13b2b1ff65067233f48809911485e4431d7ec1a22448b934121bc9522a2dc489009e87e2b1f  qemu-guest-agent.confd
1cd24c2444c5935a763c501af2b0da31635aad9cf62e55416d6477fcec153cddbe7de205d99616def11b085e0dd366ba22463d2270f831d884edbc307c7864a6  qemu-guest-agent.initd
9b7a89b20fcf737832cb7b4d5dc7d8301dd88169cbe5339eda69fbb51c2e537d8cb9ec7cf37600899e734209e63410d50d0821bce97e401421db39c294d97be2  80-kvm.rules
749efa2e764006555b4fd3a8e2f6d1118ad2ea4d45acf99104a41a93cfe66dc9685f72027c17d8211e5716246c2a52322c962cf4b73b27541b69393cd57f53bb  bridge.conf"
