]> git.ipfire.org Git - thirdparty/qemu.git/blame - meson.build
meson: linux-user
[thirdparty/qemu.git] / meson.build
CommitLineData
a5665051
PB
1project('qemu', ['c'], meson_version: '>=0.55.0',
2 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_lundef=false'],
3 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
4
5not_found = dependency('', required: false)
6keyval = import('unstable-keyval')
a81df1b6
PB
7ss = import('sourceset')
8
ce1c1e7a 9sh = find_program('sh')
a81df1b6 10cc = meson.get_compiler('c')
a5665051 11config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
2becc36a 12config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
3154fee4 13enable_modules = 'CONFIG_MODULES' in config_host
a5665051
PB
14
15add_project_arguments(config_host['QEMU_CFLAGS'].split(),
16 native: false, language: ['c', 'objc'])
17add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
18 native: false, language: 'cpp')
19add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
20 native: false, language: ['c', 'cpp', 'objc'])
21add_project_arguments(config_host['QEMU_INCLUDES'].split(),
22 language: ['c', 'cpp', 'objc'])
23
fc929892
MAL
24python = import('python').find_installation()
25
26link_language = meson.get_external_property('link_language', 'cpp')
27if link_language == 'cpp'
28 add_languages('cpp', required: true, native: false)
29endif
a5665051
PB
30if host_machine.system() == 'darwin'
31 add_languages('objc', required: false, native: false)
32endif
33
968b4db3
PB
34if 'SPARSE_CFLAGS' in config_host
35 run_target('sparse',
36 command: [find_program('scripts/check_sparse.py'),
37 config_host['SPARSE_CFLAGS'].split(),
38 'compile_commands.json'])
39endif
40
a5665051
PB
41configure_file(input: files('scripts/ninjatool.py'),
42 output: 'ninjatool',
43 configuration: config_host)
f9332757
PB
44
45supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
46supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
47 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
48
49cpu = host_machine.cpu_family()
50targetos = host_machine.system()
51
a81df1b6
PB
52m = cc.find_library('m', required: false)
53util = cc.find_library('util', required: false)
4a96337d 54winmm = []
a81df1b6 55socket = []
04c6f1e7 56version_res = []
d92989aa
MAL
57coref = []
58iokit = []
59cocoa = []
60hvf = []
a81df1b6
PB
61if targetos == 'windows'
62 socket = cc.find_library('ws2_32')
4a96337d 63 winmm = cc.find_library('winmm')
04c6f1e7
MAL
64
65 win = import('windows')
66 version_res = win.compile_resources('version.rc',
67 depend_files: files('pc-bios/qemu-nsis.ico'),
68 include_directories: include_directories('.'))
d92989aa
MAL
69elif targetos == 'darwin'
70 coref = dependency('appleframeworks', modules: 'CoreFoundation')
71 iokit = dependency('appleframeworks', modules: 'IOKit')
72 cocoa = dependency('appleframeworks', modules: 'Cocoa')
73 hvf = dependency('appleframeworks', modules: 'Hypervisor')
cfad62f1
PB
74elif targetos == 'sunos'
75 socket = [cc.find_library('socket'),
76 cc.find_library('nsl'),
77 cc.find_library('resolv')]
78elif targetos == 'haiku'
79 socket = [cc.find_library('posix_error_mapper'),
80 cc.find_library('network'),
81 cc.find_library('bsd')]
a81df1b6
PB
82endif
83glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
84 link_args: config_host['GLIB_LIBS'].split())
85gio = not_found
86if 'CONFIG_GIO' in config_host
87 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
88 link_args: config_host['GIO_LIBS'].split())
89endif
90lttng = not_found
91if 'CONFIG_TRACE_UST' in config_host
92 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
93endif
94urcubp = not_found
95if 'CONFIG_TRACE_UST' in config_host
96 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
97endif
98nettle = not_found
99if 'CONFIG_NETTLE' in config_host
100 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
101 link_args: config_host['NETTLE_LIBS'].split())
102endif
103gnutls = not_found
104if 'CONFIG_GNUTLS' in config_host
105 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
106 link_args: config_host['GNUTLS_LIBS'].split())
107endif
ea458960
MAL
108pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
109 link_args: config_host['PIXMAN_LIBS'].split())
5e7fbd25
MAL
110pam = not_found
111if 'CONFIG_AUTH_PAM' in config_host
112 pam = cc.find_library('pam')
113endif
5e5733e5
MAL
114libaio = cc.find_library('aio', required: false)
115zlib = not_found
116if 'CONFIG_ZLIB' in config_host
117 zlib = declare_dependency(compile_args: config_host['ZLIB_CFLAGS'].split(),
118 link_args: config_host['ZLIB_LIBS'].split())
119endif
120linux_io_uring = not_found
121if 'CONFIG_LINUX_IO_URING' in config_host
122 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
123 link_args: config_host['LINUX_IO_URING_LIBS'].split())
124endif
125libxml2 = not_found
126if 'CONFIG_LIBXML2' in config_host
127 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
128 link_args: config_host['LIBXML2_LIBS'].split())
129endif
130libnfs = not_found
131if 'CONFIG_LIBNFS' in config_host
132 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
133endif
ec0d5893
MAL
134libattr = not_found
135if 'CONFIG_ATTR' in config_host
136 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
137endif
3f99cf57
PB
138seccomp = not_found
139if 'CONFIG_SECCOMP' in config_host
140 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
141 link_args: config_host['SECCOMP_LIBS'].split())
142endif
143libcap_ng = not_found
144if 'CONFIG_LIBCAP_NG' in config_host
145 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
146endif
ade60d4f
MAL
147xkbcommon = not_found
148if 'CONFIG_XKBCOMMON' in config_host
149 xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(),
150 link_args: config_host['XKBCOMMON_LIBS'].split())
151endif
cdaf0722
MAL
152slirp = not_found
153if config_host.has_key('CONFIG_SLIRP')
154 slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
155 link_args: config_host['SLIRP_LIBS'].split())
156endif
157vde = not_found
158if config_host.has_key('CONFIG_VDE')
159 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
160endif
478e943f
PB
161pulse = not_found
162if 'CONFIG_LIBPULSE' in config_host
163 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
164 link_args: config_host['PULSE_LIBS'].split())
165endif
166alsa = not_found
167if 'CONFIG_ALSA' in config_host
168 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
169 link_args: config_host['ALSA_LIBS'].split())
170endif
171jack = not_found
172if 'CONFIG_LIBJACK' in config_host
173 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
174endif
2634733c
PB
175spice = not_found
176if 'CONFIG_SPICE' in config_host
177 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
178 link_args: config_host['SPICE_LIBS'].split())
179endif
5ee24e78 180rt = cc.find_library('rt', required: false)
897b5afa
MAL
181libmpathpersist = not_found
182if config_host.has_key('CONFIG_MPATH')
183 libmpathpersist = cc.find_library('mpathpersist')
184endif
99650b62
PB
185libiscsi = not_found
186if 'CONFIG_LIBISCSI' in config_host
187 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
188 link_args: config_host['LIBISCSI_LIBS'].split())
189endif
5e5733e5
MAL
190zstd = not_found
191if 'CONFIG_ZSTD' in config_host
192 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
193 link_args: config_host['ZSTD_LIBS'].split())
194endif
ea458960
MAL
195gbm = not_found
196if 'CONFIG_GBM' in config_host
197 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
198 link_args: config_host['GBM_LIBS'].split())
199endif
200virgl = not_found
201if 'CONFIG_VIRGL' in config_host
202 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
203 link_args: config_host['VIRGL_LIBS'].split())
204endif
1d7bb6ab
MAL
205curl = not_found
206if 'CONFIG_CURL' in config_host
207 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
208 link_args: config_host['CURL_LIBS'].split())
209endif
f15bff25
PB
210libudev = not_found
211if 'CONFIG_LIBUDEV' in config_host
212 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
213endif
2634733c
PB
214brlapi = not_found
215if 'CONFIG_BRLAPI' in config_host
216 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
217endif
218sdl = not_found
219if 'CONFIG_SDL' in config_host
220 sdl = declare_dependency(compile_args: config_host['SDL_CFLAGS'].split(),
221 link_args: config_host['SDL_LIBS'].split())
222endif
5e5733e5
MAL
223rbd = not_found
224if 'CONFIG_RBD' in config_host
225 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
226endif
227glusterfs = not_found
228if 'CONFIG_GLUSTERFS' in config_host
229 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
230 link_args: config_host['GLUSTERFS_LIBS'].split())
231endif
232libssh = not_found
233if 'CONFIG_LIBSSH' in config_host
234 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
235 link_args: config_host['LIBSSH_LIBS'].split())
236endif
237libbzip2 = not_found
238if 'CONFIG_BZIP2' in config_host
239 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
240endif
241liblzfse = not_found
242if 'CONFIG_LZFSE' in config_host
243 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
244endif
478e943f
PB
245oss = not_found
246if 'CONFIG_AUDIO_OSS' in config_host
247 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
248endif
249dsound = not_found
250if 'CONFIG_AUDIO_DSOUND' in config_host
251 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
252endif
253coreaudio = not_found
254if 'CONFIG_AUDIO_COREAUDIO' in config_host
255 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
2b1ccdf4
MAL
256endif
257opengl = not_found
258if 'CONFIG_OPENGL' in config_host
259 opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
260else
261endif
262gtk = not_found
263if 'CONFIG_GTK' in config_host
264 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
265 link_args: config_host['GTK_LIBS'].split())
266endif
267vte = not_found
268if 'CONFIG_VTE' in config_host
269 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
270 link_args: config_host['VTE_LIBS'].split())
271endif
272x11 = not_found
273if 'CONFIG_X11' in config_host
274 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
275 link_args: config_host['X11_LIBS'].split())
276endif
277curses = not_found
278if 'CONFIG_CURSES' in config_host
279 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
280 link_args: config_host['CURSES_LIBS'].split())
281endif
282iconv = not_found
283if 'CONFIG_ICONV' in config_host
284 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
285 link_args: config_host['ICONV_LIBS'].split())
286endif
287gio = not_found
288if 'CONFIG_GIO' in config_host
289 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
290 link_args: config_host['GIO_LIBS'].split())
291endif
292png = not_found
293if 'CONFIG_VNC_PNG' in config_host
294 png = declare_dependency(compile_args: config_host['PNG_CFLAGS'].split(),
295 link_args: config_host['PNG_LIBS'].split())
296endif
297jpeg = not_found
298if 'CONFIG_VNC_JPEG' in config_host
299 jpeg = declare_dependency(compile_args: config_host['JPEG_CFLAGS'].split(),
300 link_args: config_host['JPEG_LIBS'].split())
301endif
302sasl = not_found
303if 'CONFIG_VNC_SASL' in config_host
304 sasl = declare_dependency(compile_args: config_host['SASL_CFLAGS'].split(),
305 link_args: config_host['SASL_LIBS'].split())
478e943f 306endif
4a96337d
PB
307fdt = not_found
308if 'CONFIG_FDT' in config_host
309 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
310 link_args: config_host['FDT_LIBS'].split())
311endif
708eab42
MAL
312snappy = not_found
313if 'CONFIG_SNAPPY' in config_host
314 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
315endif
316lzo = not_found
317if 'CONFIG_LZO' in config_host
318 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
319endif
55166230
MAL
320rdma = not_found
321if 'CONFIG_RDMA' in config_host
322 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
323endif
ab318051
MAL
324numa = not_found
325if 'CONFIG_NUMA' in config_host
326 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
327endif
582ea95f
MAL
328xen = not_found
329if 'CONFIG_XEN_BACKEND' in config_host
330 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
331 link_args: config_host['XEN_LIBS'].split())
332endif
06677ce1
PB
333cacard = not_found
334if 'CONFIG_SMARTCARD' in config_host
335 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
336 link_args: config_host['SMARTCARD_LIBS'].split())
337endif
338usbredir = not_found
339if 'CONFIG_USB_REDIR' in config_host
340 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
341 link_args: config_host['USB_REDIR_LIBS'].split())
342endif
343libusb = not_found
344if 'CONFIG_USB_LIBUSB' in config_host
345 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
346 link_args: config_host['LIBUSB_LIBS'].split())
347endif
a81df1b6 348
2becc36a
PB
349create_config = find_program('scripts/create_config')
350minikconf = find_program('scripts/minikconf.py')
a81df1b6
PB
351target_dirs = config_host['TARGET_DIRS'].split()
352have_user = false
353have_system = false
2becc36a
PB
354config_devices_mak_list = []
355config_devices_h = {}
356config_target_mak = {}
357kconfig_external_symbols = [
358 'CONFIG_KVM',
359 'CONFIG_XEN',
360 'CONFIG_TPM',
361 'CONFIG_SPICE',
362 'CONFIG_IVSHMEM',
363 'CONFIG_OPENGL',
364 'CONFIG_X11',
365 'CONFIG_VHOST_USER',
366 'CONFIG_VHOST_KERNEL',
367 'CONFIG_VIRTFS',
368 'CONFIG_LINUX',
369 'CONFIG_PVRDMA',
370]
a81df1b6
PB
371foreach target : target_dirs
372 have_user = have_user or target.endswith('-user')
2becc36a
PB
373 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
374
375 if target.endswith('-softmmu')
376 have_system = true
377
378 base_kconfig = []
379 foreach sym : kconfig_external_symbols
380 if sym in config_target
381 base_kconfig += '@0@=y'.format(sym)
382 endif
383 endforeach
384
385 config_devices_mak = target + '-config-devices.mak'
386 config_devices_mak = configure_file(
387 input: ['default-configs' / target + '.mak', 'Kconfig'],
388 output: config_devices_mak,
389 depfile: config_devices_mak + '.d',
390 capture: true,
391 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
392 config_devices_mak, '@DEPFILE@', '@INPUT@',
393 base_kconfig])
394 config_devices_h += {target: custom_target(
395 target + '-config-devices.h',
396 input: config_devices_mak,
397 output: target + '-config-devices.h',
398 capture: true,
399 command: [create_config, '@INPUT@'])}
400 config_devices_mak_list += config_devices_mak
401 config_target += keyval.load(config_devices_mak)
402 endif
403 config_target_mak += {target: config_target}
a81df1b6
PB
404endforeach
405have_tools = 'CONFIG_TOOLS' in config_host
406have_block = have_system or have_tools
407
2becc36a
PB
408grepy = find_program('scripts/grepy.sh')
409# This configuration is used to build files that are shared by
410# multiple binaries, and then extracted out of the "common"
411# static_library target.
412#
413# We do not use all_sources()/all_dependencies(), because it would
414# build literally all source files, including devices only used by
415# targets that are not built for this compilation. The CONFIG_ALL
416# pseudo symbol replaces it.
417
418if have_system
419 config_all_devices_mak = configure_file(
420 output: 'config-all-devices.mak',
421 input: config_devices_mak_list,
422 capture: true,
423 command: [grepy, '@INPUT@'],
424 )
425 config_all_devices = keyval.load(config_all_devices_mak)
426else
427 config_all_devices = {}
428endif
429config_all = config_all_devices
430config_all += config_host
431config_all += config_all_disas
432config_all += {
433 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
434 'CONFIG_SOFTMMU': have_system,
435 'CONFIG_USER_ONLY': have_user,
436 'CONFIG_ALL': true,
437}
438
a81df1b6
PB
439# Generators
440
2c273f32 441genh = []
3f885659 442hxtool = find_program('scripts/hxtool')
650b5d54 443shaderinclude = find_program('scripts/shaderinclude.pl')
a81df1b6
PB
444qapi_gen = find_program('scripts/qapi-gen.py')
445qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
446 meson.source_root() / 'scripts/qapi/commands.py',
447 meson.source_root() / 'scripts/qapi/common.py',
448 meson.source_root() / 'scripts/qapi/doc.py',
449 meson.source_root() / 'scripts/qapi/error.py',
450 meson.source_root() / 'scripts/qapi/events.py',
451 meson.source_root() / 'scripts/qapi/expr.py',
452 meson.source_root() / 'scripts/qapi/gen.py',
453 meson.source_root() / 'scripts/qapi/introspect.py',
454 meson.source_root() / 'scripts/qapi/parser.py',
455 meson.source_root() / 'scripts/qapi/schema.py',
456 meson.source_root() / 'scripts/qapi/source.py',
457 meson.source_root() / 'scripts/qapi/types.py',
458 meson.source_root() / 'scripts/qapi/visit.py',
459 meson.source_root() / 'scripts/qapi/common.py',
460 meson.source_root() / 'scripts/qapi/doc.py',
461 meson.source_root() / 'scripts/qapi-gen.py'
462]
463
464tracetool = [
465 python, files('scripts/tracetool.py'),
466 '--backend=' + config_host['TRACE_BACKENDS']
467]
468
2c273f32
MAL
469qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
470 meson.current_source_dir(),
471 config_host['PKGVERSION'], config_host['VERSION']]
472qemu_version = custom_target('qemu-version.h',
473 output: 'qemu-version.h',
474 command: qemu_version_cmd,
475 capture: true,
476 build_by_default: true,
477 build_always_stale: true)
478genh += qemu_version
479
2becc36a
PB
480config_host_h = custom_target('config-host.h',
481 input: meson.current_build_dir() / 'config-host.mak',
482 output: 'config-host.h',
483 capture: true,
484 command: [create_config, '@INPUT@'])
485genh += config_host_h
486
3f885659
MAL
487hxdep = []
488hx_headers = [
489 ['qemu-options.hx', 'qemu-options.def'],
490 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
491]
492if have_system
493 hx_headers += [
494 ['hmp-commands.hx', 'hmp-commands.h'],
495 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
496 ]
497endif
498foreach d : hx_headers
b7c70bf2 499 hxdep += custom_target(d[1],
3f885659
MAL
500 input: files(d[0]),
501 output: d[1],
502 capture: true,
503 build_by_default: true, # to be removed when added to a target
504 command: [hxtool, '-h', '@INPUT0@'])
505endforeach
506genh += hxdep
507
a81df1b6
PB
508# Collect sourcesets.
509
510util_ss = ss.source_set()
511stub_ss = ss.source_set()
512trace_ss = ss.source_set()
3154fee4 513block_ss = ss.source_set()
4a96337d 514blockdev_ss = ss.source_set()
ff219dca 515qmp_ss = ss.source_set()
2becc36a
PB
516common_ss = ss.source_set()
517softmmu_ss = ss.source_set()
518user_ss = ss.source_set()
519bsd_user_ss = ss.source_set()
520linux_user_ss = ss.source_set()
521specific_ss = ss.source_set()
522
3154fee4 523modules = {}
2becc36a
PB
524hw_arch = {}
525target_arch = {}
526target_softmmu_arch = {}
a81df1b6
PB
527
528###############
529# Trace files #
530###############
531
532trace_events_subdirs = [
533 'accel/kvm',
534 'accel/tcg',
535 'crypto',
536 'monitor',
537]
538if have_user
539 trace_events_subdirs += [ 'linux-user' ]
540endif
541if have_block
542 trace_events_subdirs += [
543 'authz',
544 'block',
545 'io',
546 'nbd',
547 'scsi',
548 ]
549endif
550if have_system
551 trace_events_subdirs += [
552 'audio',
553 'backends',
554 'backends/tpm',
555 'chardev',
556 'hw/9pfs',
557 'hw/acpi',
558 'hw/alpha',
559 'hw/arm',
560 'hw/audio',
561 'hw/block',
562 'hw/block/dataplane',
563 'hw/char',
564 'hw/display',
565 'hw/dma',
566 'hw/hppa',
567 'hw/hyperv',
568 'hw/i2c',
569 'hw/i386',
570 'hw/i386/xen',
571 'hw/ide',
572 'hw/input',
573 'hw/intc',
574 'hw/isa',
575 'hw/mem',
576 'hw/mips',
577 'hw/misc',
578 'hw/misc/macio',
579 'hw/net',
580 'hw/nvram',
581 'hw/pci',
582 'hw/pci-host',
583 'hw/ppc',
584 'hw/rdma',
585 'hw/rdma/vmw',
586 'hw/rtc',
587 'hw/s390x',
588 'hw/scsi',
589 'hw/sd',
590 'hw/sparc',
591 'hw/sparc64',
592 'hw/ssi',
593 'hw/timer',
594 'hw/tpm',
595 'hw/usb',
596 'hw/vfio',
597 'hw/virtio',
598 'hw/watchdog',
599 'hw/xen',
600 'hw/gpio',
601 'hw/riscv',
602 'migration',
603 'net',
604 'ui',
605 ]
606endif
607trace_events_subdirs += [
608 'hw/core',
609 'qapi',
610 'qom',
611 'target/arm',
612 'target/hppa',
613 'target/i386',
614 'target/mips',
615 'target/ppc',
616 'target/riscv',
617 'target/s390x',
618 'target/sparc',
619 'util',
620]
621
a81df1b6
PB
622subdir('qapi')
623subdir('qobject')
624subdir('stubs')
625subdir('trace')
626subdir('util')
5582c58f
MAL
627subdir('qom')
628subdir('authz')
a81df1b6 629subdir('crypto')
2d78b56e 630subdir('ui')
a81df1b6 631
3154fee4
MAL
632
633if enable_modules
634 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
635 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
636endif
637
a81df1b6
PB
638# Build targets from sourcesets
639
2becc36a 640stub_ss = stub_ss.apply(config_all, strict: false)
a81df1b6
PB
641
642util_ss.add_all(trace_ss)
2becc36a 643util_ss = util_ss.apply(config_all, strict: false)
a81df1b6
PB
644libqemuutil = static_library('qemuutil',
645 sources: util_ss.sources() + stub_ss.sources() + genh,
646 dependencies: [util_ss.dependencies(), m, glib, socket])
647qemuutil = declare_dependency(link_with: libqemuutil,
04c6f1e7 648 sources: genh + version_res)
a81df1b6 649
abff1abf
PB
650decodetree = generator(find_program('scripts/decodetree.py'),
651 output: 'decode-@BASENAME@.c.inc',
652 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
653
478e943f 654subdir('audio')
7fcfd456 655subdir('io')
848e8ff6 656subdir('chardev')
ec0d5893 657subdir('fsdev')
abff1abf 658subdir('libdecnumber')
d3b18480 659subdir('target')
708eab42 660subdir('dump')
ec0d5893 661
5e5733e5
MAL
662block_ss.add(files(
663 'block.c',
664 'blockjob.c',
665 'job.c',
666 'qemu-io-cmds.c',
667))
668block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
669
670subdir('nbd')
671subdir('scsi')
672subdir('block')
673
4a96337d
PB
674blockdev_ss.add(files(
675 'blockdev.c',
676 'blockdev-nbd.c',
677 'iothread.c',
678 'job-qmp.c',
679))
680
681# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
682# os-win32.c does not
683blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
684softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
685
686softmmu_ss.add_all(blockdev_ss)
687softmmu_ss.add(files(
688 'bootdevice.c',
689 'dma-helpers.c',
690 'qdev-monitor.c',
691), sdl)
692
693softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
694softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
695softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
696
697common_ss.add(files('cpus-common.c'))
698
5d3ea0e1 699subdir('softmmu')
ab318051 700subdir('backends')
c574e161 701subdir('disas')
55166230 702subdir('migration')
ff219dca 703subdir('monitor')
cdaf0722 704subdir('net')
17ef2af6 705subdir('replay')
582ea95f 706subdir('hw')
1a82878a 707subdir('accel')
3a30446a
MAL
708subdir('linux-user')
709
710linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
711specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
5d3ea0e1 712
a2ce7dbd
PB
713# needed for fuzzing binaries
714subdir('tests/qtest/libqos')
715
3154fee4
MAL
716block_mods = []
717softmmu_mods = []
718foreach d, list : modules
719 foreach m, module_ss : list
720 if enable_modules and targetos != 'windows'
721 module_ss = module_ss.apply(config_host, strict: false)
722 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
723 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
724 if d == 'block'
725 block_mods += sl
726 else
727 softmmu_mods += sl
728 endif
729 else
730 if d == 'block'
731 block_ss.add_all(module_ss)
732 else
733 softmmu_ss.add_all(module_ss)
734 endif
735 endif
736 endforeach
737endforeach
738
739nm = find_program('nm')
740undefsym = find_program('scripts/undefsym.sh')
741block_syms = custom_target('block.syms', output: 'block.syms',
742 input: [libqemuutil, block_mods],
743 capture: true,
744 command: [undefsym, nm, '@INPUT@'])
745qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
746 input: [libqemuutil, softmmu_mods],
747 capture: true,
748 command: [undefsym, nm, '@INPUT@'])
749
5e5733e5
MAL
750block_ss = block_ss.apply(config_host, strict: false)
751libblock = static_library('block', block_ss.sources() + genh,
752 dependencies: block_ss.dependencies(),
753 link_depends: block_syms,
754 name_suffix: 'fa',
755 build_by_default: false)
756
757block = declare_dependency(link_whole: [libblock],
b7c70bf2
MAL
758 link_args: '@block.syms',
759 dependencies: [crypto, io])
5e5733e5 760
ff219dca
PB
761qmp_ss = qmp_ss.apply(config_host, strict: false)
762libqmp = static_library('qmp', qmp_ss.sources() + genh,
763 dependencies: qmp_ss.dependencies(),
764 name_suffix: 'fa',
765 build_by_default: false)
766
767qmp = declare_dependency(link_whole: [libqmp])
768
3154fee4
MAL
769foreach m : block_mods + softmmu_mods
770 shared_module(m.name(),
771 name_prefix: '',
772 link_whole: m,
773 install: true,
774 install_dir: config_host['qemu_moddir'])
775endforeach
776
2becc36a
PB
777common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
778common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
779
780common_all = common_ss.apply(config_all, strict: false)
781common_all = static_library('common',
782 build_by_default: false,
783 sources: common_all.sources() + genh,
784 dependencies: common_all.dependencies(),
785 name_suffix: 'fa')
786
787foreach target : target_dirs
788 config_target = config_target_mak[target]
789 target_name = config_target['TARGET_NAME']
790 arch = config_target['TARGET_BASE_ARCH']
791 arch_srcs = []
792
793 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
794 if targetos == 'linux'
795 target_inc += include_directories('linux-headers', is_system: true)
796 endif
797 if target.endswith('-softmmu')
798 qemu_target_name = 'qemu-system-' + target_name
799 target_type='system'
abff1abf
PB
800 t = target_softmmu_arch[arch].apply(config_target, strict: false)
801 arch_srcs += t.sources()
802
2c44220d
MAL
803 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
804 hw = hw_arch[hw_dir].apply(config_target, strict: false)
805 arch_srcs += hw.sources()
806
2becc36a
PB
807 arch_srcs += config_devices_h[target]
808 else
3a30446a 809 abi = config_target['TARGET_ABI_DIR']
2becc36a
PB
810 target_type='user'
811 qemu_target_name = 'qemu-' + target_name
812 if 'CONFIG_LINUX_USER' in config_target
813 base_dir = 'linux-user'
814 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
815 else
816 base_dir = 'bsd-user'
817 endif
818 target_inc += include_directories(
819 base_dir,
3a30446a 820 base_dir / abi,
2becc36a 821 )
3a30446a
MAL
822 if 'CONFIG_LINUX_USER' in config_target
823 dir = base_dir / abi
824 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
825 if config_target.has_key('TARGET_SYSTBL_ABI')
826 arch_srcs += \
827 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
828 extra_args : config_target['TARGET_SYSTBL_ABI'])
829 endif
830 endif
2becc36a
PB
831 endif
832
abff1abf
PB
833 t = target_arch[arch].apply(config_target, strict: false)
834 arch_srcs += t.sources()
835
2becc36a
PB
836 target_common = common_ss.apply(config_target, strict: false)
837 objects = common_all.extract_objects(target_common.sources())
838
839 # TODO: Change to generator once obj-y goes away
840 config_target_h = custom_target(target + '-config-target.h',
841 input: meson.current_build_dir() / target / 'config-target.mak',
842 output: target + '-config-target.h',
843 capture: true,
844 command: [create_config, '@INPUT@'])
845
846 target_specific = specific_ss.apply(config_target, strict: false)
847 arch_srcs += target_specific.sources()
848
849 static_library('qemu-' + target,
850 sources: arch_srcs + [config_target_h] + genh,
851 objects: objects,
852 include_directories: target_inc,
853 c_args: ['-DNEED_CPU_H',
854 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
855 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
856 name_suffix: 'fa')
857endforeach
858
931049b4 859# Other build targets
897b5afa 860
f15bff25
PB
861if 'CONFIG_GUEST_AGENT' in config_host
862 subdir('qga')
863endif
864
931049b4 865if have_tools
b7c70bf2
MAL
866 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
867 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
868 qemu_io = executable('qemu-io', files('qemu-io.c'),
869 dependencies: [block, qemuutil], install: true)
870 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
871 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
872 dependencies: [block, qemuutil], install: true)
873 endif
874
7c58bb76 875 subdir('storage-daemon')
a9c9727c 876 subdir('contrib/rdmacm-mux')
1d7bb6ab 877 subdir('contrib/elf2dmp')
a9c9727c 878
ade60d4f
MAL
879 if 'CONFIG_XKBCOMMON' in config_host
880 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
881 dependencies: [qemuutil, xkbcommon], install: true)
882 endif
883
157e7b13
MAL
884 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
885 dependencies: qemuutil,
886 install: true)
887
931049b4
PB
888 if 'CONFIG_VHOST_USER' in config_host
889 subdir('contrib/libvhost-user')
2d7ac0af 890 subdir('contrib/vhost-user-blk')
ea458960
MAL
891 if 'CONFIG_LINUX' in config_host
892 subdir('contrib/vhost-user-gpu')
893 endif
32fcc624 894 subdir('contrib/vhost-user-input')
99650b62 895 subdir('contrib/vhost-user-scsi')
931049b4 896 endif
8f51e01c
MAL
897
898 if targetos == 'linux'
899 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
900 dependencies: [qemuutil, libcap_ng],
901 install: true,
902 install_dir: get_option('libexecdir'))
897b5afa
MAL
903
904 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
905 dependencies: [authz, crypto, io, qom, qemuutil,
906 libcap_ng, libudev, libmpathpersist],
907 install: true)
8f51e01c
MAL
908 endif
909
5ee24e78
MAL
910 if 'CONFIG_IVSHMEM' in config_host
911 subdir('contrib/ivshmem-client')
912 subdir('contrib/ivshmem-server')
913 endif
931049b4
PB
914endif
915
3f99cf57 916subdir('tools')
bdcbea7a 917subdir('pc-bios')
ce1c1e7a 918subdir('tests')
3f99cf57 919
f9332757
PB
920summary_info = {}
921summary_info += {'Install prefix': config_host['prefix']}
922summary_info += {'BIOS directory': config_host['qemu_datadir']}
923summary_info += {'firmware path': config_host['qemu_firmwarepath']}
924summary_info += {'binary directory': config_host['bindir']}
925summary_info += {'library directory': config_host['libdir']}
926summary_info += {'module directory': config_host['qemu_moddir']}
927summary_info += {'libexec directory': config_host['libexecdir']}
928summary_info += {'include directory': config_host['includedir']}
929summary_info += {'config directory': config_host['sysconfdir']}
930if targetos != 'windows'
931 summary_info += {'local state directory': config_host['qemu_localstatedir']}
932 summary_info += {'Manual directory': config_host['mandir']}
933else
934 summary_info += {'local state directory': 'queried at runtime'}
935endif
936summary_info += {'Build directory': meson.current_build_dir()}
937summary_info += {'Source path': meson.current_source_dir()}
938summary_info += {'GIT binary': config_host['GIT']}
939summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
940summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
941summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
942if link_language == 'cpp'
943 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
944else
945 summary_info += {'C++ compiler': false}
946endif
947if targetos == 'darwin'
948 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
949endif
950summary_info += {'ARFLAGS': config_host['ARFLAGS']}
951summary_info += {'CFLAGS': config_host['CFLAGS']}
952summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
953summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
954summary_info += {'make': config_host['MAKE']}
955summary_info += {'install': config_host['INSTALL']}
956summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
957summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
958summary_info += {'genisoimage': config_host['GENISOIMAGE']}
959# TODO: add back version
960summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
961if config_host.has_key('CONFIG_SLIRP')
962 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
963endif
964summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
965if config_host.has_key('CONFIG_MODULES')
966 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
967endif
968summary_info += {'host CPU': cpu}
969summary_info += {'host endianness': build_machine.endian()}
970summary_info += {'target list': config_host['TARGET_DIRS']}
971summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
972summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
973summary_info += {'strip binaries': get_option('strip')}
974summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
975summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
976if targetos == 'darwin'
977 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
978endif
979# TODO: add back version
980summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
981summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
982# TODO: add back version
983summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
984summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
985# TODO: add back version
986summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
987summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
988summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
989# TODO: add back version
990summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
991if config_host.has_key('CONFIG_GCRYPT')
992 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
993 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
994endif
995# TODO: add back version
996summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
997if config_host.has_key('CONFIG_NETTLE')
998 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
999endif
1000summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1001summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1002summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1003summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1004# TODO: add back version
1005summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1006summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1007summary_info += {'mingw32 support': targetos == 'windows'}
1008summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1009summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1010summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1011summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
1012summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
1013summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
1014if config_host.has_key('CONFIG_VNC')
1015 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
1016 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
1017 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
1018endif
1019summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1020if config_host.has_key('CONFIG_XEN_BACKEND')
1021 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1022endif
1023summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1024summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1025summary_info += {'PIE': get_option('b_pie')}
1026summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1027summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1028summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1029summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1030summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1031summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1032# TODO: add back KVM/HAX/HVF/WHPX/TCG
1033#summary_info += {'KVM support': have_kvm'}
1034#summary_info += {'HAX support': have_hax'}
1035#summary_info += {'HVF support': have_hvf'}
1036#summary_info += {'WHPX support': have_whpx'}
1037#summary_info += {'TCG support': have_tcg'}
1038#if get_option('tcg')
1039# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1040# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1041#endif
1042summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1043summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1044summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1045summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
1046summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1047summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1048summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1049summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1050summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1051summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1052summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1053summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1054summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1055summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1056summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1057summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1058summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1059summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1060summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1061if config_host['TRACE_BACKENDS'].split().contains('simple')
1062 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1063endif
1064# TODO: add back protocol and server version
1065summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1066summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1067summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1068summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1069summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1070summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1071summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1072summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1073summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1074summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1075summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1076if targetos == 'windows'
1077 if 'WIN_SDK' in config_host
1078 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1079 endif
1080 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1081 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1082 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1083endif
1084summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1085summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1086summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1087summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1088summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1089summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1090summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
bf0e56a3 1091summary_info += {'gcov': get_option('b_coverage')}
f9332757
PB
1092summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1093summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1094summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1095summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1096summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1097summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1098summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1099summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1100summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1101summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1102summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1103summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1104summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1105summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1106summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1107summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1108summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1109summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1110summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1111summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1112summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1113summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1114summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1115summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1116summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1117summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1118summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1119summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1120summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1121summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1122summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1123summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1124if config_host.has_key('HAVE_GDB_BIN')
1125 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1126endif
1127summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1128summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1129summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1130summary(summary_info, bool_yn: true)
1131
1132if not supported_cpus.contains(cpu)
1133 message()
1134 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1135 message()
1136 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1137 message('The QEMU project intends to remove support for this host CPU in')
1138 message('a future release if nobody volunteers to maintain it and to')
1139 message('provide a build host for our continuous integration setup.')
1140 message('configure has succeeded and you can continue to build, but')
1141 message('if you care about QEMU on this platform you should contact')
1142 message('us upstream at qemu-devel@nongnu.org.')
1143endif
1144
1145if not supported_oses.contains(targetos)
1146 message()
1147 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1148 message()
1149 message('Host OS ' + targetos + 'support is not currently maintained.')
1150 message('The QEMU project intends to remove support for this host OS in')
1151 message('a future release if nobody volunteers to maintain it and to')
1152 message('provide a build host for our continuous integration setup.')
1153 message('configure has succeeded and you can continue to build, but')
1154 message('if you care about QEMU on this platform you should contact')
1155 message('us upstream at qemu-devel@nongnu.org.')
1156endif