1PORTNAME=	qemu
2DISTVERSION=	11.0.0
3PORTREVISION=	1
4CATEGORIES=	emulators
5MASTER_SITES=	https://download.qemu.org/
6DIST_SUBDIR=	qemu/${PORTVERSION}
7
8MAINTAINER=	ports@MidnightBSD.org
9COMMENT=	QEMU CPU Emulator ${${FLAVOR}_COMMENT}
10WWW=		https://www.qemu.org/
11
12LICENSE=	gpl2
13
14BUILD_DEPENDS=	bash:shells/bash \
15		${PYTHON_PKGNAMEPREFIX}qemu.qmp>=0.0.5:emulators/py-qemu.qmp@${PY_FLAVOR} \
16		${PYTHON_PKGNAMEPREFIX}wheel>=0:devel/py-wheel@${PY_FLAVOR}
17.if ${FLAVOR:U} != guestagent
18LIB_DEPENDS+=	libzstd.so:archivers/zstd
19.endif
20.if ${FLAVOR:U} != tools && ${FLAVOR:U} != guestagent
21LIB_DEPENDS+=	libfdt.so:sysutils/dtc \
22		libinotify.so:devel/libinotify \
23		libslirp.so:net/libslirp
24.endif
25.if (${FLAVOR:U} != nox11 && ${FLAVOR:U} != tools && ${FLAVOR:U} != guestagent)
26LIB_DEPENDS+=	libepoxy.so:graphics/libepoxy
27.endif
28.if (${FLAVOR:U} != nox11 && ${FLAVOR:U} != tools && ${FLAVOR:U} != default)
29PKGMESSAGE=	${.CURDIR}/pkg-message.guest-agent
30.endif
31
32FLAVORS=			default nox11 tools guestagent
33FLAVOR?=			${FLAVORS:[1]}
34default_CONFLICTS_INSTALL=	qemu-devel qemu-nox11 qemu-tools qemu-utils \
35				qemu6* qemu7*
36nox11_PKGNAMESUFFIX=		-nox11
37nox11_CONFLICTS_INSTALL=	qemu qemu-devel qemu6* qemu7* qemu-guest-agent
38nox11_COMMENT=			(without X11)
39tools_PKGNAMESUFFIX=		-tools
40tools_COMMENT=			(tools only)
41tools_CONFLICTS_INSTALL=	qemu qemu-devel qemu-nox11 qemu-utils qemu6* \
42				qemu70* qemu-guest-agent
43tools_DESCR=			${.CURDIR}/pkg-descr-tools
44tools_PLIST=			${.CURDIR}/pkg-plist-tools
45guestagent_PKGNAMESUFFIX=		-guest-agent
46guestagent_COMMENT=			(guest agent)
47guestagent_DESCR=		${.CURDIR}/pkg-descr-ga
48guestagent_PLIST=		${.CURDIR}/pkg-plist-ga
49guestagent_CONFLICTS_INSTALL=	qemu qemu-devel qemu-nox11 qemu-tools qemu-utils qemu6* \
50				qemu7* qemu-guest-agent
51
52USES=		cpe gmake gnome ninja perl5 pkgconfig python shebangfix tar:xz
53SHEBANG_FILES=	scripts/xml-preprocess.py
54USE_GNOME=	glib20
55USE_PERL5=	build
56.if ${FLAVOR:U} != tools && ${FLAVOR:U} != guestagent
57USES+=		iconv:wchar_t
58.endif
59.if (${FLAVOR:U} != nox11 && ${FLAVOR:U} != tools && ${FLAVOR:U} != guestagent)
60USE_GNOME+=	cairo
61.endif
62
63BINARY_ALIAS=	python3=${PYTHON_VERSION}
64
65HAS_CONFIGURE=		yes
66CONFIGURE_ARGS+=	--cc=${CC} \
67			--disable-fuse \
68			--disable-fuse-lseek \
69			--disable-jack \
70			--disable-libnfs \
71			--disable-libssh \
72			--disable-lzfse \
73			--disable-kvm \
74			--disable-linux-aio \
75			--disable-linux-user \
76			--disable-sdl-image \
77			--disable-snappy \
78			--disable-sndio \
79			--disable-spice \
80			--disable-spice-protocol \
81			--disable-xen \
82			--extra-cflags=-I${WRKSRC}\ -I${LOCALBASE}/include\ -DPREFIX=\\\"\"${PREFIX}\\\"\" \
83			--extra-ldflags=-L${LOCALBASE}/lib \
84			--extra-ldflags=-L/usr/lib \
85			--localstatedir=/var \
86			--mandir=${PREFIX}/share/man \
87			--prefix=${PREFIX} \
88			--python=${PYTHON_CMD}
89.if ${FLAVOR:U} == guestagent
90USE_RC_SUBR=		qemu-guest-agent
91CONFIGURE_ARGS+=	--enable-guest-agent --disable-tools --disable-xkbcommon
92.else
93CONFIGURE_ARGS+=	--disable-guest-agent
94.endif
95.if ${FLAVOR:U} != tools && ${FLAVOR:U} != guestagent
96CONFIGURE_ARGS+=	--enable-fdt=system \
97			--enable-netmap
98.endif
99.if ${FLAVOR:U} == tools || ${FLAVOR:U} == guestagent
100CONFIGURE_ARGS+=	--disable-attr \
101			--disable-install-blobs \
102			--disable-brlapi \
103			--disable-bzip2 \
104			--disable-cap-ng \
105			--disable-coroutine-pool \
106			--disable-curses \
107			--disable-fdt \
108			--disable-gcrypt \
109			--disable-glusterfs \
110			--disable-libnfs \
111			--disable-libusb \
112			--disable-lzo \
113			--disable-netmap \
114			--disable-nettle \
115			--disable-numa \
116			--disable-rbd \
117			--disable-rdma \
118			--disable-seccomp \
119			--disable-smartcard \
120			--disable-snappy \
121			--disable-spice \
122			--disable-system \
123			--disable-tpm \
124			--disable-user \
125			--disable-vhost-net \
126			--disable-virtfs \
127			--disable-vnc
128.endif
129.if ${FLAVOR:U} == tools
130CONFIGURE_ARGS+=	--enable-tools --enable-zstd
131.endif
132
133CFLAGS:=	${CFLAGS:C/-fno-tree-vrp//}
134WITHOUT_CPU_CFLAGS=	yes #to avoid problems with register allocation
135
136PORTDOCS=	.buildinfo _static/* about/* dbus-dbusindex.html devel/* docs \
137		genindex.html glossary.html index.html interop/* objects.inv \
138		qapi-qga-index.html qapi-qmp-index.html qapi-qsd-index.html \
139		search.html searchindex.js specs/* system/* tools/* user/*
140
141OPTIONS_DEFINE=			CAPSTONE CDROM_DMA CURL DEBUG DOCS GNUTLS GTK3 \
142				ISCSI JPEG OPENGL PNG SAMBA SASL STATIC_LINK \
143				STRIP USBREDIR VDE X11 X86_TARGETS
144OPTIONS_DEFAULT=		CDROM_DMA CURL GNUTLS GTK3 JPEG NCURSES_DEFAULT \
145				OPENGL PNG SASL VDE X11
146OPTIONS_SINGLE=			NCURSES
147OPTIONS_SINGLE_NCURSES=		NCURSES_BASE NCURSES_DEFAULT NCURSES_PORT
148.if ${FLAVOR:U} == nox11
149OPTIONS_EXCLUDE:=		GTK3 OPENGL X11
150.endif
151.if ${FLAVOR:U} == tools || ${FLAVOR:U} == guestagent
152OPTIONS_EXCLUDE:=		CAPSTONE CDROM_DMA CURL DEBUG GNUTLS GTK3 ISCSI \
153				JPEG NCURSES NCURSES_BASE NCURSES_DEFAULT \
154				NCURSES_PORT OPENGL PNG SAMBA SASL STATIC_LINK \
155				USBREDIR VDE X11 X86_TARGETS
156.endif
157OPTIONS_SUB=			yes
158CAPSTONE_DESC=			Disassembly framework support
159CDROM_DMA_DESC=			IDE CDROM DMA
160GNUTLS_DESC=			gnutls dependency (vnc encryption)
161ISCSI_DESC=			libiscsi dependency (iSCSI client for emulated drives)
162JPEG_DESC=			jpeg dependency (vnc lossy compression)
163NCURSES_BASE_DESC=		Depend on ncurses in base
164NCURSES_DEFAULT_DESC=		Depend on ncurses (ports if installed, otherwise base)
165NCURSES_PORT_DESC=		Depend on devel/ncurses in ports
166PNG_DESC=			png dependency (vnc compression)
167SAMBA_DESC=			samba dependency (for -smb)
168SASL_DESC=			cyrus-sasl dependency (vnc encryption)
169STATIC_LINK_DESC=		Statically link the executables
170USBREDIR_DESC=			usb device network redirection (experimental!)
171VDE_DESC=			vde dependency (for vde networking)
172X86_TARGETS_DESC=		Build only x86 system targets
173CAPSTONE_LIB_DEPENDS=		libcapstone.so:devel/capstone
174CAPSTONE_CONFIGURE_ON=		--enable-capstone \
175				--extra-cflags=-I${LOCALBASE}/include/capstone
176CAPSTONE_CONFIGURE_OFF=		--disable-capstone
177CURL_LIB_DEPENDS=		libcurl.so:ftp/curl
178CURL_CONFIGURE_OFF=		--disable-curl
179DEBUG_CONFIGURE_ON=		--enable-debug
180DOCS_BUILD_DEPENDS=		${PYTHON_PKGNAMEPREFIX}sphinx_rtd_theme>0:textproc/py-sphinx_rtd_theme@${PY_FLAVOR} \
181				sphinx-build:textproc/py-sphinx@${PY_FLAVOR}
182DOCS_CONFIGURE_ENABLE=		docs
183GNUTLS_LIB_DEPENDS=		libgnutls.so:security/gnutls
184GNUTLS_CONFIGURE_OFF=		--disable-gnutls
185GTK3_LIB_DEPENDS=		libxkbcommon.so:x11/libxkbcommon
186GTK3_USES=			gettext gl
187GTK3_USE=			GNOME=gdkpixbuf,gtk30,vte3 \
188				XORG=x11,xext
189GTK3_CONFIGURE_OFF=		--disable-gtk \
190				--disable-vte
191ISCSI_LIB_DEPENDS=		libiscsi.so:net/libiscsi
192ISCSI_CONFIGURE_OFF=		--disable-libiscsi
193JPEG_USES=			jpeg
194JPEG_CONFIGURE_OFF=		--disable-vnc-jpeg
195NCURSES_BASE_USES=		ncurses:base
196NCURSES_DEFAULT_USES=		ncurses
197NCURSES_PORT_USES=		ncurses:port
198OPENGL_USES=			gl
199OPENGL_USE=			GL=gbm,gl
200OPENGL_CONFIGURE_OFF=		--disable-opengl
201PNG_LIB_DEPENDS=		libpng.so:graphics/png
202PNG_CONFIGURE_OFF=		--disable-png
203SAMBA_USES=			samba:run # smbd
204SAMBA_CONFIGURE_ON=		--smbd=${LOCALBASE}/sbin/smbd
205SASL_LIB_DEPENDS=		libsasl2.so:security/cyrus-sasl2
206SASL_CONFIGURE_OFF=		--disable-vnc-sasl
207STATIC_LINK_PREVENTS=		GTK3 X11
208STATIC_LINK_PREVENTS_MSG=	X11 ui cannot be built static
209STATIC_LINK_CONFIGURE_ON=	--static
210STRIP_CONFIGURE_OFF=		--disable-strip
211USBREDIR_BUILD_DEPENDS=		usbredir>=0.6:net/usbredir
212USBREDIR_RUN_DEPENDS=		usbredir>=0.6:net/usbredir
213USBREDIR_CONFIGURE_OFF=		--disable-usb-redir
214VDE_LIB_DEPENDS=		libvdeplug.so:net/vde2
215VDE_CONFIGURE_OFF=		--disable-vde
216X11_USES=			sdl
217X11_USE=			GNOME=gdkpixbuf \
218				SDL=sdl2 \
219				XORG=x11,xext
220X11_CONFIGURE_ENABLE=		sdl
221.if (empty(FLAVOR) || ${FLAVOR:U} == default || ${FLAVOR:U} == nox11) && \
222	(${FLAVOR:U} != tools || ${PKGNAMESUFFIX} != "-guest-agent")
223X86_TARGETS_LIB_DEPENDS_OFF=	libdw.so:devel/elfutils \
224	liblzo2.so:archivers/lzo2
225X86_TARGETS_USES_OFF=		xorg
226X86_TARGETS_USE_OFF=		XORG=pixman,x11
227X86_TARGETS_CONFIGURE_ON=	--target-list='i386-softmmu i386-bsd-user x86_64-softmmu x86_64-bsd-user'
228.endif
229
230.include <bsd.mport.options.mk>
231
232.if ${FLAVOR:U} == tools || ${FLAVOR:U} == guestagent
233.if ${ARCH} == "i386" || ${ARCH} == "powerpc" || ${ARCH:Marmv?}
234PLIST_SUB+=	NO_I386="@comment "
235.else
236PLIST_SUB+=	NO_I386=""
237.endif
238.endif
239
240.if (empty(FLAVOR) || ${FLAVOR:U} == default || ${FLAVOR:U} == nox11) && \
241	(${FLAVOR:U} != tools || ${PKGNAMESUFFIX} != "-guest-agent")
242.if ${ARCH} == "amd64"
243MAKE_ARGS+=	ARCH=x86_64
244.endif
245
246.if ${ARCH:Maarch64}
247CONFIGURE_ARGS+=	--disable-bsd-user
248MAKE_ARGS+=	ARCH=${ARCH:C/powerpc64.*/ppc64/}
249PLIST_SUB+=	BSDUSER="@comment "
250.else
251PLIST_SUB+=	BSDUSER=""
252.endif
253
254PLIST_SUB+=	LINUXBOOT_DMA=""
255.endif
256
257pre-patch:
258	${LN} -sf ${WRKSRC}/bsd-user/freebsd ${WRKSRC}/bsd-user/midnightbsd
259
260post-patch:
261.if ${FLAVOR:U} == tools
262	@${REINPLACE_CMD} -e '/keymaps/d' ${WRKSRC}/pc-bios/meson.build
263.endif
264
265post-patch-CDROM_DMA-off:
266	@${REINPLACE_CMD} -e '/USE_DMA_CDROM/d' ${WRKSRC}/hw/ide/ide-internal.h
267
268do-build:
269	cd ${WRKSRC} && ${SETENVI} ${WRK_ENV} ${GMAKE} -j${MAKE_JOBS_NUMBER}
270
271do-install:
272	cd ${WRKSRC} && ${SETENVI} ${WRK_ENV} DESTDIR=${FAKE_DESTDIR} gmake install
273
274.if !target(post-install)
275post-install:
276.if ${FLAVOR:U} != tools && ${FLAVOR:U} != guestagent
277	${INSTALL_SCRIPT} ${FILESDIR}/qemu-ifup.sample ${PREFIX}/etc
278	${INSTALL_SCRIPT} ${FILESDIR}/qemu-ifdown.sample ${PREFIX}/etc
279.endif
280
281post-install-DOCS-on:
282	@(cd ${WRKSRC} && ${COPYTREE_SHARE} docs ${FAKE_DESTDIR}${DOCSDIR}/)
283.endif
284
285.include <bsd.port.mk>
286