Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 683640 | Differences between
and this patch

Collapse All | Expand All

(-)a/app-emulation/qemu/files/qemu-3.1.0-fix-mips-fpu-mode.patch (+31 lines)
Line 0 Link Here
1
From c4af335ad921a2218e7ea8a40ed3639291917458 Mon Sep 17 00:00:00 2001
2
From: Daniel Santos <daniel.santos@pobox.com>
3
Date: Wed, 17 Apr 2019 08:36:41 -0500
4
Subject: 1825002 fix mips "Unexpected FPU mode"
5
6
Sanitize interp_info and init fp_abi for TARGET_MIPS
7
8
Signed-off-by: Daniel Santos <daniel.santos@pobox.com>
9
---
10
 linux-user/elfload.c | 5 +++++
11
 1 file changed, 5 insertions(+)
12
13
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
14
index 5bccd2e243..db8bdc34d1 100644
15
--- a/linux-user/elfload.c
16
+++ b/linux-user/elfload.c
17
@@ -2648,6 +2648,11 @@ int load_elf_binary(struct linux_binprm *bprm, struct image_info *info)
18
     char *elf_interpreter = NULL;
19
     char *scratch;
20
 
21
+    memset(&interp_info, 0, sizeof(interp_info));
22
+#ifdef TARGET_MIPS
23
+    interp_info.fp_abi = MIPS_ABI_FP_UNKNOWN;
24
+#endif
25
+
26
     info->start_mmap = (abi_ulong)ELF_START_MMAP;
27
 
28
     load_elf_image(bprm->filename, bprm->fd, info,
29
-- 
30
2.19.2
31
(-)a/app-emulation/qemu/qemu-3.1.0-r5.ebuild (-1 / +814 lines)
Line 0 Link Here
0
- 
1
# Copyright 1999-2019 Gentoo Authors
2
# Distributed under the terms of the GNU General Public License v2
3
4
EAPI="7"
5
6
PYTHON_COMPAT=( python{2_7,3_5,3_6,3_7} )
7
PYTHON_REQ_USE="ncurses,readline"
8
9
PLOCALES="bg de_DE fr_FR hu it tr zh_CN"
10
11
FIRMWARE_ABI_VERSION="2.11.1-r50"
12
13
inherit eutils flag-o-matic linux-info toolchain-funcs multilib python-r1 \
14
	user udev fcaps readme.gentoo-r1 pax-utils l10n
15
16
if [[ ${PV} = *9999* ]]; then
17
	EGIT_REPO_URI="git://git.qemu.org/qemu.git"
18
	inherit git-r3
19
	SRC_URI=""
20
else
21
	SRC_URI="http://wiki.qemu-project.org/download/${P}.tar.xz"
22
	KEYWORDS="amd64 ~arm64 ~ppc ~ppc64 ~x86 ~x86-fbsd"
23
24
	# Gentoo specific patchsets:
25
	SRC_URI+=" https://dev.gentoo.org/~tamiko/distfiles/${P}-patches-r1.tar.xz"
26
fi
27
28
DESCRIPTION="QEMU + Kernel-based Virtual Machine userland tools"
29
HOMEPAGE="http://www.qemu.org http://www.linux-kvm.org"
30
31
LICENSE="GPL-2 LGPL-2 BSD-2"
32
SLOT="0"
33
IUSE="accessibility +aio alsa bzip2 capstone +caps +curl debug
34
	+fdt glusterfs gnutls gtk infiniband iscsi +jpeg kernel_linux
35
	kernel_FreeBSD lzo ncurses nfs nls numa opengl +pin-upstream-blobs +png
36
	pulseaudio python rbd sasl +seccomp sdl selinux smartcard snappy
37
	spice ssh static static-user systemtap tci test usb usbredir vde
38
	+vhost-net virgl virtfs +vnc vte xattr xen xfs"
39
40
RESTRICT=strip
41
42
COMMON_TARGETS="aarch64 alpha arm cris hppa i386 m68k microblaze microblazeel
43
	mips mips64 mips64el mipsel nios2 or1k ppc ppc64 riscv32 riscv64 s390x
44
	sh4 sh4eb sparc sparc64 x86_64 xtensa xtensaeb"
45
IUSE_SOFTMMU_TARGETS="${COMMON_TARGETS}
46
	lm32 moxie tricore unicore32"
47
IUSE_USER_TARGETS="${COMMON_TARGETS}
48
	aarch64_be armeb mipsn32 mipsn32el ppc64abi32 ppc64le sparc32plus
49
	tilegx"
50
51
use_softmmu_targets=$(printf ' qemu_softmmu_targets_%s' ${IUSE_SOFTMMU_TARGETS})
52
use_user_targets=$(printf ' qemu_user_targets_%s' ${IUSE_USER_TARGETS})
53
IUSE+=" ${use_softmmu_targets} ${use_user_targets}"
54
55
# Allow no targets to be built so that people can get a tools-only build.
56
# Block USE flag configurations known to not work.
57
REQUIRED_USE="${PYTHON_REQUIRED_USE}
58
	qemu_softmmu_targets_arm? ( fdt )
59
	qemu_softmmu_targets_microblaze? ( fdt )
60
	qemu_softmmu_targets_mips64el? ( fdt )
61
	qemu_softmmu_targets_ppc64? ( fdt )
62
	qemu_softmmu_targets_ppc? ( fdt )
63
	qemu_softmmu_targets_riscv32? ( fdt )
64
	qemu_softmmu_targets_riscv64? ( fdt )
65
	static? ( static-user !alsa !gtk !opengl !pulseaudio !snappy )
66
	virtfs? ( xattr )
67
	vte? ( gtk )"
68
69
# Dependencies required for qemu tools (qemu-nbd, qemu-img, qemu-io, ...)
70
# and user/softmmu targets (qemu-*, qemu-system-*).
71
#
72
# Yep, you need both libcap and libcap-ng since virtfs only uses libcap.
73
#
74
# The attr lib isn't always linked in (although the USE flag is always
75
# respected).  This is because qemu supports using the C library's API
76
# when available rather than always using the external library.
77
ALL_DEPEND="
78
	>=dev-libs/glib-2.0[static-libs(+)]
79
	sys-libs/zlib[static-libs(+)]
80
	python? ( ${PYTHON_DEPS} )
81
	systemtap? ( dev-util/systemtap )
82
	xattr? ( sys-apps/attr[static-libs(+)] )"
83
84
# Dependencies required for qemu tools (qemu-nbd, qemu-img, qemu-io, ...)
85
# softmmu targets (qemu-system-*).
86
SOFTMMU_TOOLS_DEPEND="
87
	dev-libs/libxml2[static-libs(+)]
88
	x11-libs/libxkbcommon[static-libs(+)]
89
	>=x11-libs/pixman-0.28.0[static-libs(+)]
90
	accessibility? (
91
		app-accessibility/brltty[api]
92
		app-accessibility/brltty[static-libs(+)]
93
	)
94
	aio? ( dev-libs/libaio[static-libs(+)] )
95
	alsa? ( >=media-libs/alsa-lib-1.0.13 )
96
	bzip2? ( app-arch/bzip2[static-libs(+)] )
97
	capstone? ( dev-libs/capstone:= )
98
	caps? ( sys-libs/libcap-ng[static-libs(+)] )
99
	curl? ( >=net-misc/curl-7.15.4[static-libs(+)] )
100
	fdt? ( >=sys-apps/dtc-1.4.2[static-libs(+)] )
101
	glusterfs? ( >=sys-cluster/glusterfs-3.4.0[static-libs(+)] )
102
	gnutls? (
103
		dev-libs/nettle:=[static-libs(+)]
104
		>=net-libs/gnutls-3.0:=[static-libs(+)]
105
	)
106
	gtk? (
107
		x11-libs/gtk+:3
108
		vte? ( x11-libs/vte:2.91 )
109
	)
110
	infiniband? (
111
		sys-fabric/libibumad:=[static-libs(+)]
112
		sys-fabric/libibverbs:=[static-libs(+)]
113
		sys-fabric/librdmacm:=[static-libs(+)]
114
	)
115
	iscsi? ( net-libs/libiscsi )
116
	jpeg? ( virtual/jpeg:0=[static-libs(+)] )
117
	lzo? ( dev-libs/lzo:2[static-libs(+)] )
118
	ncurses? (
119
		sys-libs/ncurses:0=[unicode]
120
		sys-libs/ncurses:0=[static-libs(+)]
121
	)
122
	nfs? ( >=net-fs/libnfs-1.9.3:=[static-libs(+)] )
123
	numa? ( sys-process/numactl[static-libs(+)] )
124
	opengl? (
125
		virtual/opengl
126
		media-libs/libepoxy[static-libs(+)]
127
		media-libs/mesa[static-libs(+)]
128
		media-libs/mesa[egl,gbm]
129
	)
130
	png? ( media-libs/libpng:0=[static-libs(+)] )
131
	pulseaudio? ( media-sound/pulseaudio )
132
	rbd? ( sys-cluster/ceph[static-libs(+)] )
133
	sasl? ( dev-libs/cyrus-sasl[static-libs(+)] )
134
	sdl? (
135
		media-libs/libsdl2[X]
136
		media-libs/libsdl2[static-libs(+)]
137
	)
138
	seccomp? ( >=sys-libs/libseccomp-2.1.0[static-libs(+)] )
139
	smartcard? ( >=app-emulation/libcacard-2.5.0[static-libs(+)] )
140
	snappy? ( app-arch/snappy:= )
141
	spice? (
142
		>=app-emulation/spice-protocol-0.12.3
143
		>=app-emulation/spice-0.12.0[static-libs(+)]
144
	)
145
	ssh? ( >=net-libs/libssh2-1.2.8[static-libs(+)] )
146
	usb? ( >=virtual/libusb-1-r2[static-libs(+)] )
147
	usbredir? ( >=sys-apps/usbredir-0.6[static-libs(+)] )
148
	vde? ( net-misc/vde[static-libs(+)] )
149
	virgl? ( media-libs/virglrenderer[static-libs(+)] )
150
	virtfs? ( sys-libs/libcap )
151
	xen? ( app-emulation/xen-tools:= )
152
	xfs? ( sys-fs/xfsprogs[static-libs(+)] )"
153
154
X86_FIRMWARE_DEPEND="
155
	pin-upstream-blobs? (
156
		~sys-firmware/edk2-ovmf-2017_p20180211[binary]
157
		~sys-firmware/ipxe-1.0.0_p20180211[binary]
158
		~sys-firmware/seabios-1.11.0[binary,seavgabios]
159
		~sys-firmware/sgabios-0.1_pre8[binary]
160
	)
161
	!pin-upstream-blobs? (
162
		sys-firmware/edk2-ovmf
163
		sys-firmware/ipxe
164
		>=sys-firmware/seabios-1.10.2[seavgabios]
165
		sys-firmware/sgabios
166
	)"
167
PPC64_FIRMWARE_DEPEND="
168
	pin-upstream-blobs? (
169
		~sys-firmware/seabios-1.11.0[binary,seavgabios]
170
	)
171
	!pin-upstream-blobs? (
172
		>=sys-firmware/seabios-1.10.2[seavgabios]
173
	)
174
"
175
176
BDEPEND="
177
	${PYTHON_DEPS}
178
	dev-lang/perl
179
	sys-apps/texinfo
180
	virtual/pkgconfig
181
	gtk? ( nls? ( sys-devel/gettext ) )
182
	test? (
183
		dev-libs/glib[utils]
184
		sys-devel/bc
185
	)
186
"
187
CDEPEND="
188
	!static? (
189
		${ALL_DEPEND//\[static-libs(+)]}
190
		${SOFTMMU_TOOLS_DEPEND//\[static-libs(+)]}
191
	)
192
	qemu_softmmu_targets_i386? ( ${X86_FIRMWARE_DEPEND} )
193
	qemu_softmmu_targets_x86_64? ( ${X86_FIRMWARE_DEPEND} )
194
	qemu_softmmu_targets_ppc64? ( ${PPC64_FIRMWARE_DEPEND} )
195
"
196
DEPEND="${CDEPEND}
197
	${PYTHON_DEPS}
198
	kernel_linux? ( >=sys-kernel/linux-headers-2.6.35 )
199
	static? (
200
		${ALL_DEPEND}
201
		${SOFTMMU_TOOLS_DEPEND}
202
	)
203
	static-user? ( ${ALL_DEPEND} )"
204
RDEPEND="${CDEPEND}
205
	selinux? ( sec-policy/selinux-qemu )"
206
207
PATCHES=(
208
	"${FILESDIR}"/${PN}-2.5.0-cflags.patch
209
	"${FILESDIR}"/${PN}-2.5.0-sysmacros.patch
210
	"${FILESDIR}"/${PN}-2.11.1-capstone_include_path.patch
211
	"${FILESDIR}"/${PN}-3.1.0-fix-mips-fpu-mode.patch
212
	"${WORKDIR}"/patches
213
)
214
215
QA_PREBUILT="
216
	usr/share/qemu/hppa-firmware.img
217
	usr/share/qemu/openbios-ppc
218
	usr/share/qemu/openbios-sparc64
219
	usr/share/qemu/openbios-sparc32
220
	usr/share/qemu/palcode-clipper
221
	usr/share/qemu/s390-ccw.img
222
	usr/share/qemu/s390-netboot.img
223
	usr/share/qemu/u-boot.e500"
224
225
QA_WX_LOAD="usr/bin/qemu-i386
226
	usr/bin/qemu-x86_64
227
	usr/bin/qemu-alpha
228
	usr/bin/qemu-arm
229
	usr/bin/qemu-cris
230
	usr/bin/qemu-m68k
231
	usr/bin/qemu-microblaze
232
	usr/bin/qemu-microblazeel
233
	usr/bin/qemu-mips
234
	usr/bin/qemu-mipsel
235
	usr/bin/qemu-or1k
236
	usr/bin/qemu-ppc
237
	usr/bin/qemu-ppc64
238
	usr/bin/qemu-ppc64abi32
239
	usr/bin/qemu-sh4
240
	usr/bin/qemu-sh4eb
241
	usr/bin/qemu-sparc
242
	usr/bin/qemu-sparc64
243
	usr/bin/qemu-armeb
244
	usr/bin/qemu-sparc32plus
245
	usr/bin/qemu-s390x
246
	usr/bin/qemu-unicore32"
247
248
DOC_CONTENTS="If you don't have kvm compiled into the kernel, make sure you have the
249
kernel module loaded before running kvm. The easiest way to ensure that the
250
kernel module is loaded is to load it on boot.
251
	For AMD CPUs the module is called 'kvm-amd'.
252
	For Intel CPUs the module is called 'kvm-intel'.
253
Please review /etc/conf.d/modules for how to load these.
254
255
Make sure your user is in the 'kvm' group. Just run
256
	$ gpasswd -a <USER> kvm
257
then have <USER> re-login.
258
259
For brand new installs, the default permissions on /dev/kvm might not let
260
you access it.  You can tell udev to reset ownership/perms:
261
	$ udevadm trigger -c add /dev/kvm
262
263
If you want to register binfmt handlers for qemu user targets:
264
For openrc:
265
	# rc-update add qemu-binfmt
266
For systemd:
267
	# ln -s /usr/share/qemu/binfmt.d/qemu.conf /etc/binfmt.d/qemu.conf"
268
269
pkg_pretend() {
270
	if use kernel_linux && kernel_is lt 2 6 25; then
271
		eerror "This version of KVM requres a host kernel of 2.6.25 or higher."
272
	elif use kernel_linux; then
273
		if ! linux_config_exists; then
274
			eerror "Unable to check your kernel for KVM support"
275
		else
276
			CONFIG_CHECK="~KVM ~TUN ~BRIDGE"
277
			ERROR_KVM="You must enable KVM in your kernel to continue"
278
			ERROR_KVM_AMD="If you have an AMD CPU, you must enable KVM_AMD in"
279
			ERROR_KVM_AMD+=" your kernel configuration."
280
			ERROR_KVM_INTEL="If you have an Intel CPU, you must enable"
281
			ERROR_KVM_INTEL+=" KVM_INTEL in your kernel configuration."
282
			ERROR_TUN="You will need the Universal TUN/TAP driver compiled"
283
			ERROR_TUN+=" into your kernel or loaded as a module to use the"
284
			ERROR_TUN+=" virtual network device if using -net tap."
285
			ERROR_BRIDGE="You will also need support for 802.1d"
286
			ERROR_BRIDGE+=" Ethernet Bridging for some network configurations."
287
			use vhost-net && CONFIG_CHECK+=" ~VHOST_NET"
288
			ERROR_VHOST_NET="You must enable VHOST_NET to have vhost-net"
289
			ERROR_VHOST_NET+=" support"
290
291
			if use amd64 || use x86 || use amd64-linux || use x86-linux; then
292
				if grep -q AuthenticAMD /proc/cpuinfo; then
293
					CONFIG_CHECK+=" ~KVM_AMD"
294
				elif grep -q GenuineIntel /proc/cpuinfo; then
295
					CONFIG_CHECK+=" ~KVM_INTEL"
296
				fi
297
			fi
298
299
			use python && CONFIG_CHECK+=" ~DEBUG_FS"
300
			ERROR_DEBUG_FS="debugFS support required for kvm_stat"
301
302
			# Now do the actual checks setup above
303
			check_extra_config
304
		fi
305
	fi
306
307
	if grep -qs '/usr/bin/qemu-kvm' "${EROOT}"/etc/libvirt/qemu/*.xml; then
308
		eerror "The kvm/qemu-kvm wrappers no longer exist, but your libvirt"
309
		eerror "instances are still pointing to it.  Please update your"
310
		eerror "configs in /etc/libvirt/qemu/ to use the -enable-kvm flag"
311
		eerror "and the right system binary (e.g. qemu-system-x86_64)."
312
		die "update your virt configs to not use qemu-kvm"
313
	fi
314
}
315
316
pkg_setup() {
317
	enewgroup kvm 78
318
}
319
320
# Sanity check to make sure target lists are kept up-to-date.
321
check_targets() {
322
	local var=$1 mak=$2
323
	local detected sorted
324
325
	pushd "${S}"/default-configs >/dev/null || die
326
327
	# Force C locale until glibc is updated. #564936
328
	detected=$(echo $(printf '%s\n' *-${mak}.mak | sed "s:-${mak}.mak::" | LC_COLLATE=C sort -u))
329
	sorted=$(echo $(printf '%s\n' ${!var} | LC_COLLATE=C sort -u))
330
	if [[ ${sorted} != "${detected}" ]] ; then
331
		eerror "The ebuild needs to be kept in sync."
332
		eerror "${var}: ${sorted}"
333
		eerror "$(printf '%-*s' ${#var} configure): ${detected}"
334
		die "sync ${var} to the list of targets"
335
	fi
336
337
	popd >/dev/null
338
}
339
340
handle_locales() {
341
	# Make sure locale list is kept up-to-date.
342
	local detected sorted
343
	detected=$(echo $(cd po && printf '%s\n' *.po | grep -v messages.po | sed 's:.po$::' | sort -u))
344
	sorted=$(echo $(printf '%s\n' ${PLOCALES} | sort -u))
345
	if [[ ${sorted} != "${detected}" ]] ; then
346
		eerror "The ebuild needs to be kept in sync."
347
		eerror "PLOCALES: ${sorted}"
348
		eerror " po/*.po: ${detected}"
349
		die "sync PLOCALES"
350
	fi
351
352
	# Deal with selective install of locales.
353
	if use nls ; then
354
		# Delete locales the user does not want. #577814
355
		rm_loc() { rm po/$1.po || die; }
356
		l10n_for_each_disabled_locale_do rm_loc
357
	else
358
		# Cheap hack to disable gettext .mo generation.
359
		rm -f po/*.po
360
	fi
361
}
362
363
src_prepare() {
364
	check_targets IUSE_SOFTMMU_TARGETS softmmu
365
	check_targets IUSE_USER_TARGETS linux-user
366
367
	# Alter target makefiles to accept CFLAGS set via flag-o
368
	sed -i -r \
369
		-e 's/^(C|OP_C|HELPER_C)FLAGS=/\1FLAGS+=/' \
370
		Makefile Makefile.target || die
371
372
	default
373
374
	# Fix ld and objcopy being called directly
375
	tc-export AR LD OBJCOPY
376
377
	# Verbose builds
378
	MAKEOPTS+=" V=1"
379
380
	# Run after we've applied all patches.
381
	handle_locales
382
383
	# Remove bundled copy of libfdt
384
	rm -r dtc || die
385
}
386
387
##
388
# configures qemu based on the build directory and the build type
389
# we are using.
390
#
391
qemu_src_configure() {
392
	debug-print-function ${FUNCNAME} "$@"
393
394
	local buildtype=$1
395
	local builddir="${S}/${buildtype}-build"
396
397
	mkdir "${builddir}"
398
399
	local conf_opts=(
400
		--prefix=/usr
401
		--sysconfdir=/etc
402
		--libdir=/usr/$(get_libdir)
403
		--docdir=/usr/share/doc/${PF}/html
404
		--disable-bsd-user
405
		--disable-guest-agent
406
		--disable-strip
407
		--disable-werror
408
		# We support gnutls/nettle for crypto operations.  It is possible
409
		# to use gcrypt when gnutls/nettle are disabled (but not when they
410
		# are enabled), but it's not really worth the hassle.  Disable it
411
		# all the time to avoid automatically detecting it. #568856
412
		--disable-gcrypt
413
		--python="${PYTHON}"
414
		--cc="$(tc-getCC)"
415
		--cxx="$(tc-getCXX)"
416
		--host-cc="$(tc-getBUILD_CC)"
417
		$(use_enable debug debug-info)
418
		$(use_enable debug debug-tcg)
419
		--enable-docs
420
		$(use_enable tci tcg-interpreter)
421
		$(use_enable xattr attr)
422
	)
423
424
	# Disable options not used by user targets. This simplifies building
425
	# static user targets (USE=static-user) considerably.
426
	conf_notuser() {
427
		if [[ ${buildtype} == "user" ]] ; then
428
			echo "--disable-${2:-$1}"
429
		else
430
			use_enable "$@"
431
		fi
432
	}
433
	conf_opts+=(
434
		--disable-bluez
435
		$(conf_notuser accessibility brlapi)
436
		$(conf_notuser aio linux-aio)
437
		$(conf_notuser bzip2)
438
		$(conf_notuser capstone)
439
		$(conf_notuser caps cap-ng)
440
		$(conf_notuser curl)
441
		$(conf_notuser fdt)
442
		$(conf_notuser glusterfs)
443
		$(conf_notuser gnutls)
444
		$(conf_notuser gnutls nettle)
445
		$(conf_notuser gtk)
446
		$(conf_notuser infiniband rdma)
447
		$(conf_notuser iscsi libiscsi)
448
		$(conf_notuser jpeg vnc-jpeg)
449
		$(conf_notuser kernel_linux kvm)
450
		$(conf_notuser lzo)
451
		$(conf_notuser ncurses curses)
452
		$(conf_notuser nfs libnfs)
453
		$(conf_notuser numa)
454
		$(conf_notuser opengl)
455
		$(conf_notuser png vnc-png)
456
		$(conf_notuser rbd)
457
		$(conf_notuser sasl vnc-sasl)
458
		$(conf_notuser sdl)
459
		$(conf_notuser seccomp)
460
		$(conf_notuser smartcard)
461
		$(conf_notuser snappy)
462
		$(conf_notuser spice)
463
		$(conf_notuser ssh libssh2)
464
		$(conf_notuser usb libusb)
465
		$(conf_notuser usbredir usb-redir)
466
		$(conf_notuser vde)
467
		$(conf_notuser vhost-net)
468
		$(conf_notuser virgl virglrenderer)
469
		$(conf_notuser virtfs)
470
		$(conf_notuser vnc)
471
		$(conf_notuser vte)
472
		$(conf_notuser xen)
473
		$(conf_notuser xen xen-pci-passthrough)
474
		$(conf_notuser xfs xfsctl)
475
	)
476
477
	if [[ ${buildtype} == "user" ]] ; then
478
		conf_opts+=( --disable-libxml2 )
479
	else
480
		conf_opts+=( --enable-libxml2 )
481
	fi
482
483
	if [[ ! ${buildtype} == "user" ]] ; then
484
		# audio options
485
		local audio_opts="oss"
486
		use alsa && audio_opts="alsa,${audio_opts}"
487
		use sdl && audio_opts="sdl,${audio_opts}"
488
		use pulseaudio && audio_opts="pa,${audio_opts}"
489
		conf_opts+=(
490
			--audio-drv-list="${audio_opts}"
491
		)
492
		use sdl && conf_opts+=( --with-sdlabi=2.0 )
493
	fi
494
495
	case ${buildtype} in
496
	user)
497
		conf_opts+=(
498
			--enable-linux-user
499
			--disable-system
500
			--disable-blobs
501
			--disable-tools
502
		)
503
		local static_flag="static-user"
504
		;;
505
	softmmu)
506
		conf_opts+=(
507
			--disable-linux-user
508
			--enable-system
509
			--disable-tools
510
		)
511
		local static_flag="static"
512
		;;
513
	tools)
514
		conf_opts+=(
515
			--disable-linux-user
516
			--disable-system
517
			--disable-blobs
518
			--enable-tools
519
		)
520
		local static_flag="static"
521
		;;
522
	esac
523
524
	local targets="${buildtype}_targets"
525
	[[ -n ${targets} ]] && conf_opts+=( --target-list="${!targets}" )
526
527
	# Add support for SystemTAP
528
	use systemtap && conf_opts+=( --enable-trace-backend=dtrace )
529
530
	# We always want to attempt to build with PIE support as it results
531
	# in a more secure binary. But it doesn't work with static or if
532
	# the current GCC doesn't have PIE support.
533
	if use ${static_flag}; then
534
		conf_opts+=( --static --disable-pie )
535
	else
536
		tc-enables-pie && conf_opts+=( --enable-pie )
537
	fi
538
539
	echo "../configure ${conf_opts[*]}"
540
	cd "${builddir}"
541
	../configure "${conf_opts[@]}" || die "configure failed"
542
543
	# FreeBSD's kernel does not support QEMU assigning/grabbing
544
	# host USB devices yet
545
	use kernel_FreeBSD && \
546
		sed -i -E -e "s|^(HOST_USB=)bsd|\1stub|" "${S}"/config-host.mak
547
}
548
549
src_configure() {
550
	local target
551
552
	python_setup
553
554
	softmmu_targets= softmmu_bins=()
555
	user_targets= user_bins=()
556
557
	for target in ${IUSE_SOFTMMU_TARGETS} ; do
558
		if use "qemu_softmmu_targets_${target}"; then
559
			softmmu_targets+=",${target}-softmmu"
560
			softmmu_bins+=( "qemu-system-${target}" )
561
		fi
562
	done
563
564
	for target in ${IUSE_USER_TARGETS} ; do
565
		if use "qemu_user_targets_${target}"; then
566
			user_targets+=",${target}-linux-user"
567
			user_bins+=( "qemu-${target}" )
568
		fi
569
	done
570
571
	softmmu_targets=${softmmu_targets#,}
572
	user_targets=${user_targets#,}
573
574
	[[ -n ${softmmu_targets} ]] && qemu_src_configure "softmmu"
575
	[[ -n ${user_targets}    ]] && qemu_src_configure "user"
576
	qemu_src_configure "tools"
577
}
578
579
src_compile() {
580
	if [[ -n ${user_targets} ]]; then
581
		cd "${S}/user-build"
582
		default
583
	fi
584
585
	if [[ -n ${softmmu_targets} ]]; then
586
		cd "${S}/softmmu-build"
587
		default
588
	fi
589
590
	cd "${S}/tools-build"
591
	default
592
}
593
594
src_test() {
595
	if [[ -n ${softmmu_targets} ]]; then
596
		cd "${S}/softmmu-build"
597
		pax-mark m */qemu-system-* #515550
598
		emake -j1 check
599
		emake -j1 check-report.html
600
	fi
601
}
602
603
qemu_python_install() {
604
	python_domodule "${S}/scripts/qmp/qmp.py"
605
606
	python_doscript "${S}/scripts/kvm/vmxcap"
607
	python_doscript "${S}/scripts/qmp/qmp-shell"
608
	python_doscript "${S}/scripts/qmp/qemu-ga-client"
609
}
610
611
# Generate binfmt support files.
612
#   - /etc/init.d/qemu-binfmt script which registers the user handlers (openrc)
613
#   - /usr/share/qemu/binfmt.d/qemu.conf (for use with systemd-binfmt)
614
generate_initd() {
615
	local out="${T}/qemu-binfmt"
616
	local out_systemd="${T}/qemu.conf"
617
	local d="${T}/binfmt.d"
618
619
	einfo "Generating qemu binfmt scripts and configuration files"
620
621
	# Generate the debian fragments first.
622
	mkdir -p "${d}"
623
	"${S}"/scripts/qemu-binfmt-conf.sh \
624
		--debian \
625
		--exportdir "${d}" \
626
		--qemu-path "${EPREFIX}/usr/bin" \
627
		|| die
628
	# Then turn the fragments into a shell script we can source.
629
	sed -E -i \
630
		-e 's:^([^ ]+) (.*)$:\1="\2":' \
631
		"${d}"/* || die
632
633
	# Generate the init.d script by assembling the fragments from above.
634
	local f qcpu package interpreter magic mask
635
	cat "${FILESDIR}"/qemu-binfmt.initd.head >"${out}" || die
636
	for f in "${d}"/qemu-* ; do
637
		source "${f}"
638
639
		# Normalize the cpu logic like we do in the init.d for the native cpu.
640
		qcpu=${package#qemu-}
641
		case ${qcpu} in
642
		arm*)   qcpu="arm";;
643
		mips*)  qcpu="mips";;
644
		ppc*)   qcpu="ppc";;
645
		s390*)  qcpu="s390";;
646
		sh*)    qcpu="sh";;
647
		sparc*) qcpu="sparc";;
648
		esac
649
650
		# we use 'printf' here to be portable across 'sh'
651
		# implementations: #679168
652
		cat <<EOF >>"${out}"
653
	if [ "\${cpu}" != "${qcpu}" -a -x "${interpreter}" ] ; then
654
		printf '%s\n' ':${package}:M::${magic}:${mask}:${interpreter}:'"\${QEMU_BINFMT_FLAGS}" >/proc/sys/fs/binfmt_misc/register
655
	fi
656
EOF
657
658
		echo ":${package}:M::${magic}:${mask}:${interpreter}:OC" >>"${out_systemd}"
659
660
	done
661
	cat "${FILESDIR}"/qemu-binfmt.initd.tail >>"${out}" || die
662
}
663
664
src_install() {
665
	if [[ -n ${user_targets} ]]; then
666
		cd "${S}/user-build"
667
		emake DESTDIR="${ED}" install
668
669
		# Install binfmt handler init script for user targets.
670
		generate_initd
671
		doinitd "${T}/qemu-binfmt"
672
673
		# Install binfmt/qemu.conf.
674
		insinto "/usr/share/qemu/binfmt.d"
675
		doins "${T}/qemu.conf"
676
	fi
677
678
	if [[ -n ${softmmu_targets} ]]; then
679
		cd "${S}/softmmu-build"
680
		emake DESTDIR="${ED}" install
681
682
		# This might not exist if the test failed. #512010
683
		if [[ -e check-report.html ]]; then
684
			docinto html
685
			dodoc check-report.html
686
		fi
687
688
		if use kernel_linux; then
689
			udev_newrules "${FILESDIR}"/65-kvm.rules-r1 65-kvm.rules
690
		fi
691
692
		if use python; then
693
			python_foreach_impl qemu_python_install
694
		fi
695
	fi
696
697
	cd "${S}/tools-build"
698
	emake DESTDIR="${ED}" install
699
700
	# Disable mprotect on the qemu binaries as they use JITs to be fast #459348
701
	pushd "${ED}"/usr/bin >/dev/null
702
	pax-mark mr "${softmmu_bins[@]}" "${user_bins[@]}" # bug 575594
703
	popd >/dev/null
704
705
	# Install config file example for qemu-bridge-helper
706
	insinto "/etc/qemu"
707
	doins "${FILESDIR}/bridge.conf"
708
709
	cd "${S}"
710
	dodoc Changelog MAINTAINERS docs/specs/pci-ids.txt
711
	newdoc pc-bios/README README.pc-bios
712
713
	if [[ -n ${softmmu_targets} ]]; then
714
		# Remove SeaBIOS since we're using the SeaBIOS packaged one
715
		rm "${ED}/usr/share/qemu/bios.bin"
716
		rm "${ED}/usr/share/qemu/bios-256k.bin"
717
		if use qemu_softmmu_targets_x86_64 || use qemu_softmmu_targets_i386; then
718
			dosym ../seabios/bios.bin /usr/share/qemu/bios.bin
719
			dosym ../seabios/bios-256k.bin /usr/share/qemu/bios-256k.bin
720
		fi
721
722
		# Remove vgabios since we're using the seavgabios packaged one
723
		rm "${ED}/usr/share/qemu/vgabios.bin"
724
		rm "${ED}/usr/share/qemu/vgabios-cirrus.bin"
725
		rm "${ED}/usr/share/qemu/vgabios-qxl.bin"
726
		rm "${ED}/usr/share/qemu/vgabios-stdvga.bin"
727
		rm "${ED}/usr/share/qemu/vgabios-virtio.bin"
728
		rm "${ED}/usr/share/qemu/vgabios-vmware.bin"
729
		# PPC64 loads vgabios-stdvga
730
		if use qemu_softmmu_targets_x86_64 || use qemu_softmmu_targets_i386 || use qemu_softmmu_targets_ppc64; then
731
			dosym ../seavgabios/vgabios-isavga.bin /usr/share/qemu/vgabios.bin
732
			dosym ../seavgabios/vgabios-cirrus.bin /usr/share/qemu/vgabios-cirrus.bin
733
			dosym ../seavgabios/vgabios-qxl.bin /usr/share/qemu/vgabios-qxl.bin
734
			dosym ../seavgabios/vgabios-stdvga.bin /usr/share/qemu/vgabios-stdvga.bin
735
			dosym ../seavgabios/vgabios-virtio.bin /usr/share/qemu/vgabios-virtio.bin
736
			dosym ../seavgabios/vgabios-vmware.bin /usr/share/qemu/vgabios-vmware.bin
737
		fi
738
739
		# Remove sgabios since we're using the sgabios packaged one
740
		rm "${ED}/usr/share/qemu/sgabios.bin"
741
		if use qemu_softmmu_targets_x86_64 || use qemu_softmmu_targets_i386; then
742
			dosym ../sgabios/sgabios.bin /usr/share/qemu/sgabios.bin
743
		fi
744
745
		# Remove iPXE since we're using the iPXE packaged one
746
		rm "${ED}"/usr/share/qemu/pxe-*.rom
747
		if use qemu_softmmu_targets_x86_64 || use qemu_softmmu_targets_i386; then
748
			dosym ../ipxe/8086100e.rom /usr/share/qemu/pxe-e1000.rom
749
			dosym ../ipxe/80861209.rom /usr/share/qemu/pxe-eepro100.rom
750
			dosym ../ipxe/10500940.rom /usr/share/qemu/pxe-ne2k_pci.rom
751
			dosym ../ipxe/10222000.rom /usr/share/qemu/pxe-pcnet.rom
752
			dosym ../ipxe/10ec8139.rom /usr/share/qemu/pxe-rtl8139.rom
753
			dosym ../ipxe/1af41000.rom /usr/share/qemu/pxe-virtio.rom
754
		fi
755
	fi
756
757
	DISABLE_AUTOFORMATTING=true
758
	readme.gentoo_create_doc
759
}
760
761
firmware_abi_change() {
762
	local pv
763
	for pv in ${REPLACING_VERSIONS}; do
764
		if ver_test $pv -lt ${FIRMWARE_ABI_VERSION}; then
765
			return 0
766
		fi
767
	done
768
	return 1
769
}
770
771
pkg_postinst() {
772
	if [[ -n ${softmmu_targets} ]] && use kernel_linux; then
773
		udev_reload
774
	fi
775
776
	[[ -f ${EROOT}/usr/libexec/qemu-bridge-helper ]] && \
777
		fcaps cap_net_admin /usr/libexec/qemu-bridge-helper
778
779
	DISABLE_AUTOFORMATTING=true
780
	readme.gentoo_print_elog
781
782
	if use pin-upstream-blobs && firmware_abi_change; then
783
		ewarn "This version of qemu pins new versions of firmware blobs:"
784
		ewarn "	$(best_version sys-firmware/edk2-ovmf)"
785
		ewarn "	$(best_version sys-firmware/ipxe)"
786
		ewarn "	$(best_version sys-firmware/seabios)"
787
		ewarn "	$(best_version sys-firmware/sgabios)"
788
		ewarn "This might break resume of hibernated guests (started with a different"
789
		ewarn "firmware version) and live migration to/from qemu versions with different"
790
		ewarn "firmware. Please (cold) restart all running guests. For functional"
791
		ewarn "guest migration ensure that all"
792
		ewarn "hosts run at least"
793
		ewarn "	app-emulation/qemu-${FIRMWARE_ABI_VERSION}."
794
	fi
795
}
796
797
pkg_info() {
798
	echo "Using:"
799
	echo "  $(best_version app-emulation/spice-protocol)"
800
	echo "  $(best_version sys-firmware/edk2-ovmf)"
801
	if has_version 'sys-firmware/edk2-ovmf[binary]'; then
802
		echo "    USE=binary"
803
	else
804
		echo "    USE=''"
805
	fi
806
	echo "  $(best_version sys-firmware/ipxe)"
807
	echo "  $(best_version sys-firmware/seabios)"
808
	if has_version 'sys-firmware/seabios[binary]'; then
809
		echo "    USE=binary"
810
	else
811
		echo "    USE=''"
812
	fi
813
	echo "  $(best_version sys-firmware/sgabios)"
814
}

Return to bug 683640