]> git.ipfire.org Git - thirdparty/qemu.git/blame - meson.build
remove Makefile.target
[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
64ed6f92 218sdlwindows = false
2634733c
PB
219sdl = not_found
220if 'CONFIG_SDL' in config_host
221 sdl = declare_dependency(compile_args: config_host['SDL_CFLAGS'].split(),
222 link_args: config_host['SDL_LIBS'].split())
64ed6f92 223 sdlwindows = config_host['SDL_LIBS'].contains('-mwindows')
2634733c 224endif
5e5733e5
MAL
225rbd = not_found
226if 'CONFIG_RBD' in config_host
227 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
228endif
229glusterfs = not_found
230if 'CONFIG_GLUSTERFS' in config_host
231 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
232 link_args: config_host['GLUSTERFS_LIBS'].split())
233endif
234libssh = not_found
235if 'CONFIG_LIBSSH' in config_host
236 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
237 link_args: config_host['LIBSSH_LIBS'].split())
238endif
239libbzip2 = not_found
240if 'CONFIG_BZIP2' in config_host
241 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
242endif
243liblzfse = not_found
244if 'CONFIG_LZFSE' in config_host
245 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
246endif
478e943f
PB
247oss = not_found
248if 'CONFIG_AUDIO_OSS' in config_host
249 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
250endif
251dsound = not_found
252if 'CONFIG_AUDIO_DSOUND' in config_host
253 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
254endif
255coreaudio = not_found
256if 'CONFIG_AUDIO_COREAUDIO' in config_host
257 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
2b1ccdf4
MAL
258endif
259opengl = not_found
260if 'CONFIG_OPENGL' in config_host
261 opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
262else
263endif
264gtk = not_found
265if 'CONFIG_GTK' in config_host
266 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
267 link_args: config_host['GTK_LIBS'].split())
268endif
269vte = not_found
270if 'CONFIG_VTE' in config_host
271 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
272 link_args: config_host['VTE_LIBS'].split())
273endif
274x11 = not_found
275if 'CONFIG_X11' in config_host
276 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
277 link_args: config_host['X11_LIBS'].split())
278endif
279curses = not_found
280if 'CONFIG_CURSES' in config_host
281 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
282 link_args: config_host['CURSES_LIBS'].split())
283endif
284iconv = not_found
285if 'CONFIG_ICONV' in config_host
286 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
287 link_args: config_host['ICONV_LIBS'].split())
288endif
289gio = not_found
290if 'CONFIG_GIO' in config_host
291 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
292 link_args: config_host['GIO_LIBS'].split())
293endif
294png = not_found
295if 'CONFIG_VNC_PNG' in config_host
296 png = declare_dependency(compile_args: config_host['PNG_CFLAGS'].split(),
297 link_args: config_host['PNG_LIBS'].split())
298endif
299jpeg = not_found
300if 'CONFIG_VNC_JPEG' in config_host
301 jpeg = declare_dependency(compile_args: config_host['JPEG_CFLAGS'].split(),
302 link_args: config_host['JPEG_LIBS'].split())
303endif
304sasl = not_found
305if 'CONFIG_VNC_SASL' in config_host
306 sasl = declare_dependency(compile_args: config_host['SASL_CFLAGS'].split(),
307 link_args: config_host['SASL_LIBS'].split())
478e943f 308endif
4a96337d
PB
309fdt = not_found
310if 'CONFIG_FDT' in config_host
311 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
312 link_args: config_host['FDT_LIBS'].split())
313endif
708eab42
MAL
314snappy = not_found
315if 'CONFIG_SNAPPY' in config_host
316 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
317endif
318lzo = not_found
319if 'CONFIG_LZO' in config_host
320 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
321endif
55166230
MAL
322rdma = not_found
323if 'CONFIG_RDMA' in config_host
324 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
325endif
ab318051
MAL
326numa = not_found
327if 'CONFIG_NUMA' in config_host
328 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
329endif
582ea95f
MAL
330xen = not_found
331if 'CONFIG_XEN_BACKEND' in config_host
332 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
333 link_args: config_host['XEN_LIBS'].split())
334endif
06677ce1
PB
335cacard = not_found
336if 'CONFIG_SMARTCARD' in config_host
337 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
338 link_args: config_host['SMARTCARD_LIBS'].split())
339endif
340usbredir = not_found
341if 'CONFIG_USB_REDIR' in config_host
342 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
343 link_args: config_host['USB_REDIR_LIBS'].split())
344endif
345libusb = not_found
346if 'CONFIG_USB_LIBUSB' in config_host
347 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
348 link_args: config_host['LIBUSB_LIBS'].split())
349endif
c9322ab5
MAL
350capstone = not_found
351if 'CONFIG_CAPSTONE' in config_host
352 capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(),
353 link_args: config_host['CAPSTONE_LIBS'].split())
354endif
355libpmem = not_found
356if 'CONFIG_LIBPMEM' in config_host
357 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
358 link_args: config_host['LIBPMEM_LIBS'].split())
359endif
a81df1b6 360
2becc36a
PB
361create_config = find_program('scripts/create_config')
362minikconf = find_program('scripts/minikconf.py')
a81df1b6
PB
363target_dirs = config_host['TARGET_DIRS'].split()
364have_user = false
365have_system = false
2becc36a
PB
366config_devices_mak_list = []
367config_devices_h = {}
368config_target_mak = {}
369kconfig_external_symbols = [
370 'CONFIG_KVM',
371 'CONFIG_XEN',
372 'CONFIG_TPM',
373 'CONFIG_SPICE',
374 'CONFIG_IVSHMEM',
375 'CONFIG_OPENGL',
376 'CONFIG_X11',
377 'CONFIG_VHOST_USER',
378 'CONFIG_VHOST_KERNEL',
379 'CONFIG_VIRTFS',
380 'CONFIG_LINUX',
381 'CONFIG_PVRDMA',
382]
a81df1b6
PB
383foreach target : target_dirs
384 have_user = have_user or target.endswith('-user')
2becc36a
PB
385 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
386
387 if target.endswith('-softmmu')
388 have_system = true
389
390 base_kconfig = []
391 foreach sym : kconfig_external_symbols
392 if sym in config_target
393 base_kconfig += '@0@=y'.format(sym)
394 endif
395 endforeach
396
397 config_devices_mak = target + '-config-devices.mak'
398 config_devices_mak = configure_file(
399 input: ['default-configs' / target + '.mak', 'Kconfig'],
400 output: config_devices_mak,
401 depfile: config_devices_mak + '.d',
402 capture: true,
403 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
404 config_devices_mak, '@DEPFILE@', '@INPUT@',
405 base_kconfig])
406 config_devices_h += {target: custom_target(
407 target + '-config-devices.h',
408 input: config_devices_mak,
409 output: target + '-config-devices.h',
410 capture: true,
411 command: [create_config, '@INPUT@'])}
412 config_devices_mak_list += config_devices_mak
413 config_target += keyval.load(config_devices_mak)
414 endif
415 config_target_mak += {target: config_target}
a81df1b6
PB
416endforeach
417have_tools = 'CONFIG_TOOLS' in config_host
418have_block = have_system or have_tools
419
2becc36a
PB
420grepy = find_program('scripts/grepy.sh')
421# This configuration is used to build files that are shared by
422# multiple binaries, and then extracted out of the "common"
423# static_library target.
424#
425# We do not use all_sources()/all_dependencies(), because it would
426# build literally all source files, including devices only used by
427# targets that are not built for this compilation. The CONFIG_ALL
428# pseudo symbol replaces it.
429
430if have_system
431 config_all_devices_mak = configure_file(
432 output: 'config-all-devices.mak',
433 input: config_devices_mak_list,
434 capture: true,
435 command: [grepy, '@INPUT@'],
436 )
437 config_all_devices = keyval.load(config_all_devices_mak)
438else
439 config_all_devices = {}
440endif
441config_all = config_all_devices
442config_all += config_host
443config_all += config_all_disas
444config_all += {
445 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
446 'CONFIG_SOFTMMU': have_system,
447 'CONFIG_USER_ONLY': have_user,
448 'CONFIG_ALL': true,
449}
450
a81df1b6
PB
451# Generators
452
2c273f32 453genh = []
3f885659 454hxtool = find_program('scripts/hxtool')
650b5d54 455shaderinclude = find_program('scripts/shaderinclude.pl')
a81df1b6
PB
456qapi_gen = find_program('scripts/qapi-gen.py')
457qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
458 meson.source_root() / 'scripts/qapi/commands.py',
459 meson.source_root() / 'scripts/qapi/common.py',
460 meson.source_root() / 'scripts/qapi/doc.py',
461 meson.source_root() / 'scripts/qapi/error.py',
462 meson.source_root() / 'scripts/qapi/events.py',
463 meson.source_root() / 'scripts/qapi/expr.py',
464 meson.source_root() / 'scripts/qapi/gen.py',
465 meson.source_root() / 'scripts/qapi/introspect.py',
466 meson.source_root() / 'scripts/qapi/parser.py',
467 meson.source_root() / 'scripts/qapi/schema.py',
468 meson.source_root() / 'scripts/qapi/source.py',
469 meson.source_root() / 'scripts/qapi/types.py',
470 meson.source_root() / 'scripts/qapi/visit.py',
471 meson.source_root() / 'scripts/qapi/common.py',
472 meson.source_root() / 'scripts/qapi/doc.py',
473 meson.source_root() / 'scripts/qapi-gen.py'
474]
475
476tracetool = [
477 python, files('scripts/tracetool.py'),
478 '--backend=' + config_host['TRACE_BACKENDS']
479]
480
2c273f32
MAL
481qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
482 meson.current_source_dir(),
483 config_host['PKGVERSION'], config_host['VERSION']]
484qemu_version = custom_target('qemu-version.h',
485 output: 'qemu-version.h',
486 command: qemu_version_cmd,
487 capture: true,
488 build_by_default: true,
489 build_always_stale: true)
490genh += qemu_version
491
2becc36a
PB
492config_host_h = custom_target('config-host.h',
493 input: meson.current_build_dir() / 'config-host.mak',
494 output: 'config-host.h',
495 capture: true,
496 command: [create_config, '@INPUT@'])
497genh += config_host_h
498
3f885659
MAL
499hxdep = []
500hx_headers = [
501 ['qemu-options.hx', 'qemu-options.def'],
502 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
503]
504if have_system
505 hx_headers += [
506 ['hmp-commands.hx', 'hmp-commands.h'],
507 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
508 ]
509endif
510foreach d : hx_headers
b7c70bf2 511 hxdep += custom_target(d[1],
3f885659
MAL
512 input: files(d[0]),
513 output: d[1],
514 capture: true,
515 build_by_default: true, # to be removed when added to a target
516 command: [hxtool, '-h', '@INPUT0@'])
517endforeach
518genh += hxdep
519
a81df1b6
PB
520# Collect sourcesets.
521
522util_ss = ss.source_set()
523stub_ss = ss.source_set()
524trace_ss = ss.source_set()
3154fee4 525block_ss = ss.source_set()
4a96337d 526blockdev_ss = ss.source_set()
ff219dca 527qmp_ss = ss.source_set()
2becc36a
PB
528common_ss = ss.source_set()
529softmmu_ss = ss.source_set()
530user_ss = ss.source_set()
531bsd_user_ss = ss.source_set()
532linux_user_ss = ss.source_set()
533specific_ss = ss.source_set()
64ed6f92 534specific_fuzz_ss = ss.source_set()
2becc36a 535
3154fee4 536modules = {}
2becc36a
PB
537hw_arch = {}
538target_arch = {}
539target_softmmu_arch = {}
a81df1b6
PB
540
541###############
542# Trace files #
543###############
544
c9322ab5
MAL
545# TODO: add each directory to the subdirs from its own meson.build, once
546# we have those
a81df1b6
PB
547trace_events_subdirs = [
548 'accel/kvm',
549 'accel/tcg',
550 'crypto',
551 'monitor',
552]
553if have_user
554 trace_events_subdirs += [ 'linux-user' ]
555endif
556if have_block
557 trace_events_subdirs += [
558 'authz',
559 'block',
560 'io',
561 'nbd',
562 'scsi',
563 ]
564endif
565if have_system
566 trace_events_subdirs += [
567 'audio',
568 'backends',
569 'backends/tpm',
570 'chardev',
571 'hw/9pfs',
572 'hw/acpi',
573 'hw/alpha',
574 'hw/arm',
575 'hw/audio',
576 'hw/block',
577 'hw/block/dataplane',
578 'hw/char',
579 'hw/display',
580 'hw/dma',
581 'hw/hppa',
582 'hw/hyperv',
583 'hw/i2c',
584 'hw/i386',
585 'hw/i386/xen',
586 'hw/ide',
587 'hw/input',
588 'hw/intc',
589 'hw/isa',
590 'hw/mem',
591 'hw/mips',
592 'hw/misc',
593 'hw/misc/macio',
594 'hw/net',
595 'hw/nvram',
596 'hw/pci',
597 'hw/pci-host',
598 'hw/ppc',
599 'hw/rdma',
600 'hw/rdma/vmw',
601 'hw/rtc',
602 'hw/s390x',
603 'hw/scsi',
604 'hw/sd',
605 'hw/sparc',
606 'hw/sparc64',
607 'hw/ssi',
608 'hw/timer',
609 'hw/tpm',
610 'hw/usb',
611 'hw/vfio',
612 'hw/virtio',
613 'hw/watchdog',
614 'hw/xen',
615 'hw/gpio',
616 'hw/riscv',
617 'migration',
618 'net',
619 'ui',
620 ]
621endif
622trace_events_subdirs += [
623 'hw/core',
624 'qapi',
625 'qom',
626 'target/arm',
627 'target/hppa',
628 'target/i386',
629 'target/mips',
630 'target/ppc',
631 'target/riscv',
632 'target/s390x',
633 'target/sparc',
634 'util',
635]
636
a81df1b6
PB
637subdir('qapi')
638subdir('qobject')
639subdir('stubs')
640subdir('trace')
641subdir('util')
5582c58f
MAL
642subdir('qom')
643subdir('authz')
a81df1b6 644subdir('crypto')
2d78b56e 645subdir('ui')
a81df1b6 646
3154fee4
MAL
647
648if enable_modules
649 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
650 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
651endif
652
a81df1b6
PB
653# Build targets from sourcesets
654
2becc36a 655stub_ss = stub_ss.apply(config_all, strict: false)
a81df1b6
PB
656
657util_ss.add_all(trace_ss)
2becc36a 658util_ss = util_ss.apply(config_all, strict: false)
a81df1b6
PB
659libqemuutil = static_library('qemuutil',
660 sources: util_ss.sources() + stub_ss.sources() + genh,
661 dependencies: [util_ss.dependencies(), m, glib, socket])
662qemuutil = declare_dependency(link_with: libqemuutil,
04c6f1e7 663 sources: genh + version_res)
a81df1b6 664
abff1abf
PB
665decodetree = generator(find_program('scripts/decodetree.py'),
666 output: 'decode-@BASENAME@.c.inc',
667 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
668
478e943f 669subdir('audio')
7fcfd456 670subdir('io')
848e8ff6 671subdir('chardev')
ec0d5893 672subdir('fsdev')
abff1abf 673subdir('libdecnumber')
d3b18480 674subdir('target')
708eab42 675subdir('dump')
ec0d5893 676
5e5733e5
MAL
677block_ss.add(files(
678 'block.c',
679 'blockjob.c',
680 'job.c',
681 'qemu-io-cmds.c',
682))
683block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
684
685subdir('nbd')
686subdir('scsi')
687subdir('block')
688
4a96337d
PB
689blockdev_ss.add(files(
690 'blockdev.c',
691 'blockdev-nbd.c',
692 'iothread.c',
693 'job-qmp.c',
694))
695
696# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
697# os-win32.c does not
698blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
699softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
700
701softmmu_ss.add_all(blockdev_ss)
702softmmu_ss.add(files(
703 'bootdevice.c',
704 'dma-helpers.c',
705 'qdev-monitor.c',
706), sdl)
707
708softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
709softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
710softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
711
712common_ss.add(files('cpus-common.c'))
713
5d3ea0e1 714subdir('softmmu')
c9322ab5
MAL
715
716specific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem)
717specific_ss.add(files('exec-vary.c'))
718specific_ss.add(when: 'CONFIG_TCG', if_true: files(
719 'fpu/softfloat.c',
720 'tcg/optimize.c',
721 'tcg/tcg-common.c',
722 'tcg/tcg-op-gvec.c',
723 'tcg/tcg-op-vec.c',
724 'tcg/tcg-op.c',
725 'tcg/tcg.c',
726))
727specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
728
ab318051 729subdir('backends')
c574e161 730subdir('disas')
55166230 731subdir('migration')
ff219dca 732subdir('monitor')
cdaf0722 733subdir('net')
17ef2af6 734subdir('replay')
582ea95f 735subdir('hw')
1a82878a 736subdir('accel')
f556b4a1 737subdir('plugins')
b309c321 738subdir('bsd-user')
3a30446a
MAL
739subdir('linux-user')
740
b309c321
MAL
741bsd_user_ss.add(files('gdbstub.c'))
742specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
743
3a30446a
MAL
744linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
745specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
5d3ea0e1 746
a2ce7dbd
PB
747# needed for fuzzing binaries
748subdir('tests/qtest/libqos')
64ed6f92 749subdir('tests/qtest/fuzz')
a2ce7dbd 750
3154fee4
MAL
751block_mods = []
752softmmu_mods = []
753foreach d, list : modules
754 foreach m, module_ss : list
755 if enable_modules and targetos != 'windows'
756 module_ss = module_ss.apply(config_host, strict: false)
757 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
758 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
759 if d == 'block'
760 block_mods += sl
761 else
762 softmmu_mods += sl
763 endif
764 else
765 if d == 'block'
766 block_ss.add_all(module_ss)
767 else
768 softmmu_ss.add_all(module_ss)
769 endif
770 endif
771 endforeach
772endforeach
773
774nm = find_program('nm')
775undefsym = find_program('scripts/undefsym.sh')
776block_syms = custom_target('block.syms', output: 'block.syms',
777 input: [libqemuutil, block_mods],
778 capture: true,
779 command: [undefsym, nm, '@INPUT@'])
780qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
781 input: [libqemuutil, softmmu_mods],
782 capture: true,
783 command: [undefsym, nm, '@INPUT@'])
784
5e5733e5
MAL
785block_ss = block_ss.apply(config_host, strict: false)
786libblock = static_library('block', block_ss.sources() + genh,
787 dependencies: block_ss.dependencies(),
788 link_depends: block_syms,
789 name_suffix: 'fa',
790 build_by_default: false)
791
792block = declare_dependency(link_whole: [libblock],
b7c70bf2
MAL
793 link_args: '@block.syms',
794 dependencies: [crypto, io])
5e5733e5 795
ff219dca
PB
796qmp_ss = qmp_ss.apply(config_host, strict: false)
797libqmp = static_library('qmp', qmp_ss.sources() + genh,
798 dependencies: qmp_ss.dependencies(),
799 name_suffix: 'fa',
800 build_by_default: false)
801
802qmp = declare_dependency(link_whole: [libqmp])
803
3154fee4
MAL
804foreach m : block_mods + softmmu_mods
805 shared_module(m.name(),
806 name_prefix: '',
807 link_whole: m,
808 install: true,
809 install_dir: config_host['qemu_moddir'])
810endforeach
811
64ed6f92
PB
812softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
813common_ss.add(qom, qemuutil)
814
815common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
2becc36a
PB
816common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
817
818common_all = common_ss.apply(config_all, strict: false)
819common_all = static_library('common',
820 build_by_default: false,
821 sources: common_all.sources() + genh,
822 dependencies: common_all.dependencies(),
823 name_suffix: 'fa')
824
c9322ab5
MAL
825feature_to_c = find_program('scripts/feature_to_c.sh')
826
64ed6f92 827emulators = []
2becc36a
PB
828foreach target : target_dirs
829 config_target = config_target_mak[target]
830 target_name = config_target['TARGET_NAME']
831 arch = config_target['TARGET_BASE_ARCH']
832 arch_srcs = []
64ed6f92
PB
833 arch_deps = []
834 c_args = ['-DNEED_CPU_H',
835 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
836 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
837 link_args = []
2becc36a
PB
838
839 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
840 if targetos == 'linux'
841 target_inc += include_directories('linux-headers', is_system: true)
842 endif
843 if target.endswith('-softmmu')
844 qemu_target_name = 'qemu-system-' + target_name
845 target_type='system'
abff1abf
PB
846 t = target_softmmu_arch[arch].apply(config_target, strict: false)
847 arch_srcs += t.sources()
64ed6f92 848 arch_deps += t.dependencies()
abff1abf 849
2c44220d
MAL
850 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
851 hw = hw_arch[hw_dir].apply(config_target, strict: false)
852 arch_srcs += hw.sources()
64ed6f92 853 arch_deps += hw.dependencies()
2c44220d 854
2becc36a 855 arch_srcs += config_devices_h[target]
64ed6f92 856 link_args += ['@block.syms', '@qemu.syms']
2becc36a 857 else
3a30446a 858 abi = config_target['TARGET_ABI_DIR']
2becc36a
PB
859 target_type='user'
860 qemu_target_name = 'qemu-' + target_name
861 if 'CONFIG_LINUX_USER' in config_target
862 base_dir = 'linux-user'
863 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
864 else
865 base_dir = 'bsd-user'
866 endif
867 target_inc += include_directories(
868 base_dir,
3a30446a 869 base_dir / abi,
2becc36a 870 )
3a30446a
MAL
871 if 'CONFIG_LINUX_USER' in config_target
872 dir = base_dir / abi
873 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
874 if config_target.has_key('TARGET_SYSTBL_ABI')
875 arch_srcs += \
876 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
877 extra_args : config_target['TARGET_SYSTBL_ABI'])
878 endif
879 endif
2becc36a
PB
880 endif
881
c9322ab5
MAL
882 if 'TARGET_XML_FILES' in config_target
883 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
884 output: target + '-gdbstub-xml.c',
885 input: files(config_target['TARGET_XML_FILES'].split()),
886 command: [feature_to_c, '@INPUT@'],
887 capture: true)
888 arch_srcs += gdbstub_xml
889 endif
890
abff1abf
PB
891 t = target_arch[arch].apply(config_target, strict: false)
892 arch_srcs += t.sources()
64ed6f92 893 arch_deps += t.dependencies()
abff1abf 894
2becc36a
PB
895 target_common = common_ss.apply(config_target, strict: false)
896 objects = common_all.extract_objects(target_common.sources())
64ed6f92 897 deps = target_common.dependencies()
2becc36a
PB
898
899 # TODO: Change to generator once obj-y goes away
900 config_target_h = custom_target(target + '-config-target.h',
901 input: meson.current_build_dir() / target / 'config-target.mak',
902 output: target + '-config-target.h',
903 capture: true,
904 command: [create_config, '@INPUT@'])
905
906 target_specific = specific_ss.apply(config_target, strict: false)
907 arch_srcs += target_specific.sources()
64ed6f92 908 arch_deps += target_specific.dependencies()
2becc36a 909
64ed6f92 910 lib = static_library('qemu-' + target,
2becc36a
PB
911 sources: arch_srcs + [config_target_h] + genh,
912 objects: objects,
913 include_directories: target_inc,
64ed6f92
PB
914 c_args: c_args,
915 build_by_default: false,
2becc36a 916 name_suffix: 'fa')
64ed6f92
PB
917
918 if target.endswith('-softmmu')
919 execs = [{
920 'name': 'qemu-system-' + target_name,
921 'gui': false,
922 'sources': files('softmmu/main.c'),
923 'dependencies': []
924 }]
925 if sdlwindows
926 execs += [{
927 'name': 'qemu-system-' + target_name + 'w',
928 'gui': true,
929 'sources': files('softmmu/main.c'),
930 'dependencies': []
931 }]
932 endif
933 if config_host.has_key('CONFIG_FUZZ')
934 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
935 execs += [{
936 'name': 'qemu-fuzz-' + target_name,
937 'gui': false,
938 'sources': specific_fuzz.sources(),
939 'dependencies': specific_fuzz.dependencies(),
940 'link_depends': [files('tests/qtest/fuzz/fork_fuzz.ld')],
941 }]
942 endif
943 else
944 execs = [{
945 'name': 'qemu-' + target_name,
946 'gui': false,
947 'sources': [],
948 'dependencies': []
949 }]
950 endif
951 foreach exe: execs
952 emulators += executable(exe['name'], exe['sources'],
953 install: true,
954 c_args: c_args,
955 dependencies: arch_deps + deps + exe['dependencies'],
956 objects: lib.extract_all_objects(recursive: true),
957 link_language: link_language,
958 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
959 link_args: link_args,
960 gui_app: exe['gui'])
10e1d263
MAL
961
962 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
963 foreach stp: [
964 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe_name, 'install': false},
965 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe_name, 'install': true},
966 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
967 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
968 ]
969 custom_target(exe_name + stp['ext'],
970 input: trace_events_all,
971 output: exe_name + stp['ext'],
972 capture: true,
973 install: stp['install'],
974 install_dir: config_host['qemu_datadir'] / '../systemtap/tapset',
975 command: [
976 tracetool, '--group=all', '--format=' + stp['fmt'],
977 '--binary=' + stp['bin'],
978 '--target-name=' + target_name,
979 '--target-type=' + target_type,
980 '--probe-prefix=qemu.' + target_type + '.' + target_name,
981 '@INPUT@',
982 ])
983 endforeach
984 endif
64ed6f92 985 endforeach
2becc36a
PB
986endforeach
987
931049b4 988# Other build targets
897b5afa 989
f556b4a1
PB
990if 'CONFIG_PLUGIN' in config_host
991 install_headers('include/qemu/qemu-plugin.h')
992endif
993
f15bff25
PB
994if 'CONFIG_GUEST_AGENT' in config_host
995 subdir('qga')
996endif
997
931049b4 998if have_tools
b7c70bf2
MAL
999 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1000 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1001 qemu_io = executable('qemu-io', files('qemu-io.c'),
1002 dependencies: [block, qemuutil], install: true)
1003 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
1004 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1005 dependencies: [block, qemuutil], install: true)
1006 endif
1007
7c58bb76 1008 subdir('storage-daemon')
a9c9727c 1009 subdir('contrib/rdmacm-mux')
1d7bb6ab 1010 subdir('contrib/elf2dmp')
a9c9727c 1011
ade60d4f
MAL
1012 if 'CONFIG_XKBCOMMON' in config_host
1013 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
1014 dependencies: [qemuutil, xkbcommon], install: true)
1015 endif
1016
157e7b13
MAL
1017 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1018 dependencies: qemuutil,
1019 install: true)
1020
931049b4
PB
1021 if 'CONFIG_VHOST_USER' in config_host
1022 subdir('contrib/libvhost-user')
2d7ac0af 1023 subdir('contrib/vhost-user-blk')
ea458960
MAL
1024 if 'CONFIG_LINUX' in config_host
1025 subdir('contrib/vhost-user-gpu')
1026 endif
32fcc624 1027 subdir('contrib/vhost-user-input')
99650b62 1028 subdir('contrib/vhost-user-scsi')
931049b4 1029 endif
8f51e01c
MAL
1030
1031 if targetos == 'linux'
1032 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1033 dependencies: [qemuutil, libcap_ng],
1034 install: true,
1035 install_dir: get_option('libexecdir'))
897b5afa
MAL
1036
1037 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1038 dependencies: [authz, crypto, io, qom, qemuutil,
1039 libcap_ng, libudev, libmpathpersist],
1040 install: true)
8f51e01c
MAL
1041 endif
1042
5ee24e78
MAL
1043 if 'CONFIG_IVSHMEM' in config_host
1044 subdir('contrib/ivshmem-client')
1045 subdir('contrib/ivshmem-server')
1046 endif
931049b4
PB
1047endif
1048
3f99cf57 1049subdir('tools')
bdcbea7a 1050subdir('pc-bios')
ce1c1e7a 1051subdir('tests')
3f99cf57 1052
f9332757
PB
1053summary_info = {}
1054summary_info += {'Install prefix': config_host['prefix']}
1055summary_info += {'BIOS directory': config_host['qemu_datadir']}
1056summary_info += {'firmware path': config_host['qemu_firmwarepath']}
1057summary_info += {'binary directory': config_host['bindir']}
1058summary_info += {'library directory': config_host['libdir']}
1059summary_info += {'module directory': config_host['qemu_moddir']}
1060summary_info += {'libexec directory': config_host['libexecdir']}
1061summary_info += {'include directory': config_host['includedir']}
1062summary_info += {'config directory': config_host['sysconfdir']}
1063if targetos != 'windows'
1064 summary_info += {'local state directory': config_host['qemu_localstatedir']}
1065 summary_info += {'Manual directory': config_host['mandir']}
1066else
1067 summary_info += {'local state directory': 'queried at runtime'}
1068endif
1069summary_info += {'Build directory': meson.current_build_dir()}
1070summary_info += {'Source path': meson.current_source_dir()}
1071summary_info += {'GIT binary': config_host['GIT']}
1072summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
1073summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
1074summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
1075if link_language == 'cpp'
1076 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
1077else
1078 summary_info += {'C++ compiler': false}
1079endif
1080if targetos == 'darwin'
1081 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1082endif
1083summary_info += {'ARFLAGS': config_host['ARFLAGS']}
1084summary_info += {'CFLAGS': config_host['CFLAGS']}
1085summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
1086summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
1087summary_info += {'make': config_host['MAKE']}
1088summary_info += {'install': config_host['INSTALL']}
1089summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1090summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
1091summary_info += {'genisoimage': config_host['GENISOIMAGE']}
1092# TODO: add back version
1093summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
1094if config_host.has_key('CONFIG_SLIRP')
1095 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
1096endif
1097summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
1098if config_host.has_key('CONFIG_MODULES')
1099 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1100endif
1101summary_info += {'host CPU': cpu}
1102summary_info += {'host endianness': build_machine.endian()}
1103summary_info += {'target list': config_host['TARGET_DIRS']}
1104summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
1105summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
1106summary_info += {'strip binaries': get_option('strip')}
1107summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
1108summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
1109if targetos == 'darwin'
1110 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1111endif
1112# TODO: add back version
1113summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
1114summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
1115# TODO: add back version
1116summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
1117summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
1118# TODO: add back version
1119summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
1120summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
1121summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
1122# TODO: add back version
1123summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
1124if config_host.has_key('CONFIG_GCRYPT')
1125 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
1126 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1127endif
1128# TODO: add back version
1129summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
1130if config_host.has_key('CONFIG_NETTLE')
1131 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1132endif
1133summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1134summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1135summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1136summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1137# TODO: add back version
1138summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1139summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1140summary_info += {'mingw32 support': targetos == 'windows'}
1141summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1142summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1143summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1144summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
1145summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
1146summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
1147if config_host.has_key('CONFIG_VNC')
1148 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
1149 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
1150 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
1151endif
1152summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1153if config_host.has_key('CONFIG_XEN_BACKEND')
1154 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1155endif
1156summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1157summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1158summary_info += {'PIE': get_option('b_pie')}
1159summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1160summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1161summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1162summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1163summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1164summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1165# TODO: add back KVM/HAX/HVF/WHPX/TCG
1166#summary_info += {'KVM support': have_kvm'}
1167#summary_info += {'HAX support': have_hax'}
1168#summary_info += {'HVF support': have_hvf'}
1169#summary_info += {'WHPX support': have_whpx'}
1170#summary_info += {'TCG support': have_tcg'}
1171#if get_option('tcg')
1172# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1173# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1174#endif
1175summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1176summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1177summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1178summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
1179summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1180summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1181summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1182summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1183summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1184summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1185summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1186summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1187summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1188summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1189summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1190summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1191summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1192summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1193summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1194if config_host['TRACE_BACKENDS'].split().contains('simple')
1195 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1196endif
1197# TODO: add back protocol and server version
1198summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1199summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1200summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1201summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1202summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1203summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1204summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1205summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1206summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1207summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1208summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1209if targetos == 'windows'
1210 if 'WIN_SDK' in config_host
1211 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1212 endif
1213 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1214 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1215 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1216endif
1217summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1218summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1219summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1220summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1221summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1222summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1223summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
bf0e56a3 1224summary_info += {'gcov': get_option('b_coverage')}
f9332757
PB
1225summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1226summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1227summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1228summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1229summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1230summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1231summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1232summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1233summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1234summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1235summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1236summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1237summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1238summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1239summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1240summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1241summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1242summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1243summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1244summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1245summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1246summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1247summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1248summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1249summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1250summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1251summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1252summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1253summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1254summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1255summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1256summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1257if config_host.has_key('HAVE_GDB_BIN')
1258 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1259endif
1260summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1261summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1262summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1263summary(summary_info, bool_yn: true)
1264
1265if not supported_cpus.contains(cpu)
1266 message()
1267 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1268 message()
1269 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1270 message('The QEMU project intends to remove support for this host CPU in')
1271 message('a future release if nobody volunteers to maintain it and to')
1272 message('provide a build host for our continuous integration setup.')
1273 message('configure has succeeded and you can continue to build, but')
1274 message('if you care about QEMU on this platform you should contact')
1275 message('us upstream at qemu-devel@nongnu.org.')
1276endif
1277
1278if not supported_oses.contains(targetos)
1279 message()
1280 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1281 message()
1282 message('Host OS ' + targetos + 'support is not currently maintained.')
1283 message('The QEMU project intends to remove support for this host OS in')
1284 message('a future release if nobody volunteers to maintain it and to')
1285 message('provide a build host for our continuous integration setup.')
1286 message('configure has succeeded and you can continue to build, but')
1287 message('if you care about QEMU on this platform you should contact')
1288 message('us upstream at qemu-devel@nongnu.org.')
1289endif