blob: ec958ba2af82e7cf04e9f7b160737582a69d84d9 [file] [log] [blame]
Paolo Bonzinia5665052019-06-10 12:05:14 +02001project('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')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04007ss = import('sourceset')
8
Paolo Bonzinice1c1e72020-01-28 16:41:44 +01009sh = find_program('sh')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040010cc = meson.get_compiler('c')
Paolo Bonzinia5665052019-06-10 12:05:14 +020011config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Paolo Bonzini2becc362020-02-03 11:42:03 +010012config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
Marc-André Lureau3154fee2019-08-29 22:07:01 +040013enable_modules = 'CONFIG_MODULES' in config_host
Paolo Bonzinia5665052019-06-10 12:05:14 +020014
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
Marc-André Lureaufc929892019-07-13 01:47:54 +040024python = 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
Paolo Bonzinia5665052019-06-10 12:05:14 +020030if host_machine.system() == 'darwin'
31 add_languages('objc', required: false, native: false)
32endif
33
Paolo Bonzini968b4db2020-02-03 14:45:33 +010034if '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
Paolo Bonzinia5665052019-06-10 12:05:14 +020041configure_file(input: files('scripts/ninjatool.py'),
42 output: 'ninjatool',
43 configuration: config_host)
Paolo Bonzinif9332752020-02-03 13:28:38 +010044
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
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040052m = cc.find_library('m', required: false)
53util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +020054winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040055socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +040056version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +040057coref = []
58iokit = []
59cocoa = []
60hvf = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040061if targetos == 'windows'
62 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +020063 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +040064
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('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +040069elif 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')
Paolo Bonzinicfad62f2020-08-09 23:47:45 +020074elif 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')]
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040082endif
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
Marc-André Lureauea458962019-07-12 22:23:46 +0400108pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
109 link_args: config_host['PIXMAN_LIBS'].split())
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400110pam = not_found
111if 'CONFIG_AUTH_PAM' in config_host
112 pam = cc.find_library('pam')
113endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400114libaio = 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
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400134libattr = not_found
135if 'CONFIG_ATTR' in config_host
136 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
137endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100138seccomp = 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
Marc-André Lureauade60d42019-07-15 14:48:31 +0400147xkbcommon = 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
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400152slirp = 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
Paolo Bonzini478e9432020-08-17 12:47:55 +0200161pulse = 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
Paolo Bonzini26347332019-07-29 15:40:07 +0200175spice = 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
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400180rt = cc.find_library('rt', required: false)
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400181libmpathpersist = not_found
182if config_host.has_key('CONFIG_MPATH')
183 libmpathpersist = cc.find_library('mpathpersist')
184endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200185libiscsi = 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
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400190zstd = 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
Marc-André Lureauea458962019-07-12 22:23:46 +0400195gbm = 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
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400205curl = 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
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200210libudev = not_found
211if 'CONFIG_LIBUDEV' in config_host
212 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
213endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200214brlapi = 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
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400223rbd = 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
Paolo Bonzini478e9432020-08-17 12:47:55 +0200245oss = 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())
256endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400257opengl = 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())
306endif
Paolo Bonzini4a963372020-08-03 16:22:28 +0200307fdt = 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
Marc-André Lureau708eab42019-09-03 16:59:33 +0400312snappy = 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
Marc-André Lureau55166232019-07-24 19:16:22 +0400320rdma = not_found
321if 'CONFIG_RDMA' in config_host
322 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
323endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400324numa = not_found
325if 'CONFIG_NUMA' in config_host
326 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
327endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400328xen = 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
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200333cacard = 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
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400348
Paolo Bonzini2becc362020-02-03 11:42:03 +0100349create_config = find_program('scripts/create_config')
350minikconf = find_program('scripts/minikconf.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400351target_dirs = config_host['TARGET_DIRS'].split()
352have_user = false
353have_system = false
Paolo Bonzini2becc362020-02-03 11:42:03 +0100354config_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]
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400371foreach target : target_dirs
372 have_user = have_user or target.endswith('-user')
Paolo Bonzini2becc362020-02-03 11:42:03 +0100373 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}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400404endforeach
405have_tools = 'CONFIG_TOOLS' in config_host
406have_block = have_system or have_tools
407
Paolo Bonzini2becc362020-02-03 11:42:03 +0100408grepy = 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
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400439# Generators
440
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400441genh = []
Marc-André Lureau3f885652019-07-15 18:06:04 +0400442hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +0400443shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400444qapi_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
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400469qemu_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
Paolo Bonzini2becc362020-02-03 11:42:03 +0100480config_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
Marc-André Lureau3f885652019-07-15 18:06:04 +0400487hxdep = []
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
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400499 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +0400500 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
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400508# Collect sourcesets.
509
510util_ss = ss.source_set()
511stub_ss = ss.source_set()
512trace_ss = ss.source_set()
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400513block_ss = ss.source_set()
Paolo Bonzini4a963372020-08-03 16:22:28 +0200514blockdev_ss = ss.source_set()
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200515qmp_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +0100516common_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
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400523modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100524hw_arch = {}
525target_arch = {}
526target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400527
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
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400622subdir('qapi')
623subdir('qobject')
624subdir('stubs')
625subdir('trace')
626subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +0400627subdir('qom')
628subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400629subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +0400630subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400631
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400632
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
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400638# Build targets from sourcesets
639
Paolo Bonzini2becc362020-02-03 11:42:03 +0100640stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400641
642util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +0100643util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400644libqemuutil = 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,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400648 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400649
Paolo Bonzini478e9432020-08-17 12:47:55 +0200650subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +0400651subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +0400652subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400653subdir('fsdev')
Marc-André Lureaud3b18482019-08-17 14:55:32 +0400654subdir('target')
Marc-André Lureau708eab42019-09-03 16:59:33 +0400655subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400656
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400657block_ss.add(files(
658 'block.c',
659 'blockjob.c',
660 'job.c',
661 'qemu-io-cmds.c',
662))
663block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
664
665subdir('nbd')
666subdir('scsi')
667subdir('block')
668
Paolo Bonzini4a963372020-08-03 16:22:28 +0200669blockdev_ss.add(files(
670 'blockdev.c',
671 'blockdev-nbd.c',
672 'iothread.c',
673 'job-qmp.c',
674))
675
676# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
677# os-win32.c does not
678blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
679softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
680
681softmmu_ss.add_all(blockdev_ss)
682softmmu_ss.add(files(
683 'bootdevice.c',
684 'dma-helpers.c',
685 'qdev-monitor.c',
686), sdl)
687
688softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
689softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
690softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
691
692common_ss.add(files('cpus-common.c'))
693
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +0200694subdir('softmmu')
Marc-André Lureauab318052019-07-24 19:23:16 +0400695subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +0400696subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +0400697subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200698subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400699subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +0400700subdir('replay')
Marc-André Lureau582ea952019-08-15 15:15:32 +0400701subdir('hw')
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +0200702
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +0200703# needed for fuzzing binaries
704subdir('tests/qtest/libqos')
705
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400706block_mods = []
707softmmu_mods = []
708foreach d, list : modules
709 foreach m, module_ss : list
710 if enable_modules and targetos != 'windows'
711 module_ss = module_ss.apply(config_host, strict: false)
712 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
713 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
714 if d == 'block'
715 block_mods += sl
716 else
717 softmmu_mods += sl
718 endif
719 else
720 if d == 'block'
721 block_ss.add_all(module_ss)
722 else
723 softmmu_ss.add_all(module_ss)
724 endif
725 endif
726 endforeach
727endforeach
728
729nm = find_program('nm')
730undefsym = find_program('scripts/undefsym.sh')
731block_syms = custom_target('block.syms', output: 'block.syms',
732 input: [libqemuutil, block_mods],
733 capture: true,
734 command: [undefsym, nm, '@INPUT@'])
735qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
736 input: [libqemuutil, softmmu_mods],
737 capture: true,
738 command: [undefsym, nm, '@INPUT@'])
739
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400740block_ss = block_ss.apply(config_host, strict: false)
741libblock = static_library('block', block_ss.sources() + genh,
742 dependencies: block_ss.dependencies(),
743 link_depends: block_syms,
744 name_suffix: 'fa',
745 build_by_default: false)
746
747block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400748 link_args: '@block.syms',
749 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400750
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200751qmp_ss = qmp_ss.apply(config_host, strict: false)
752libqmp = static_library('qmp', qmp_ss.sources() + genh,
753 dependencies: qmp_ss.dependencies(),
754 name_suffix: 'fa',
755 build_by_default: false)
756
757qmp = declare_dependency(link_whole: [libqmp])
758
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400759foreach m : block_mods + softmmu_mods
760 shared_module(m.name(),
761 name_prefix: '',
762 link_whole: m,
763 install: true,
764 install_dir: config_host['qemu_moddir'])
765endforeach
766
Paolo Bonzini2becc362020-02-03 11:42:03 +0100767common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
768common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
769
770common_all = common_ss.apply(config_all, strict: false)
771common_all = static_library('common',
772 build_by_default: false,
773 sources: common_all.sources() + genh,
774 dependencies: common_all.dependencies(),
775 name_suffix: 'fa')
776
777foreach target : target_dirs
778 config_target = config_target_mak[target]
779 target_name = config_target['TARGET_NAME']
780 arch = config_target['TARGET_BASE_ARCH']
781 arch_srcs = []
782
783 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
784 if targetos == 'linux'
785 target_inc += include_directories('linux-headers', is_system: true)
786 endif
787 if target.endswith('-softmmu')
788 qemu_target_name = 'qemu-system-' + target_name
789 target_type='system'
790 arch_srcs += config_devices_h[target]
791 else
792 target_type='user'
793 qemu_target_name = 'qemu-' + target_name
794 if 'CONFIG_LINUX_USER' in config_target
795 base_dir = 'linux-user'
796 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
797 else
798 base_dir = 'bsd-user'
799 endif
800 target_inc += include_directories(
801 base_dir,
802 base_dir / config_target['TARGET_ABI_DIR'],
803 )
804 endif
805
806 target_common = common_ss.apply(config_target, strict: false)
807 objects = common_all.extract_objects(target_common.sources())
808
809 # TODO: Change to generator once obj-y goes away
810 config_target_h = custom_target(target + '-config-target.h',
811 input: meson.current_build_dir() / target / 'config-target.mak',
812 output: target + '-config-target.h',
813 capture: true,
814 command: [create_config, '@INPUT@'])
815
816 target_specific = specific_ss.apply(config_target, strict: false)
817 arch_srcs += target_specific.sources()
818
819 static_library('qemu-' + target,
820 sources: arch_srcs + [config_target_h] + genh,
821 objects: objects,
822 include_directories: target_inc,
823 c_args: ['-DNEED_CPU_H',
824 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
825 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
826 name_suffix: 'fa')
827endforeach
828
Paolo Bonzini931049b2020-02-05 09:44:24 +0100829# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400830
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200831if 'CONFIG_GUEST_AGENT' in config_host
832 subdir('qga')
833endif
834
Paolo Bonzini931049b2020-02-05 09:44:24 +0100835if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400836 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
837 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
838 qemu_io = executable('qemu-io', files('qemu-io.c'),
839 dependencies: [block, qemuutil], install: true)
840 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
841 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
842 dependencies: [block, qemuutil], install: true)
843 endif
844
Paolo Bonzini7c58bb72020-08-04 20:18:36 +0200845 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +0200846 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400847 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +0200848
Marc-André Lureauade60d42019-07-15 14:48:31 +0400849 if 'CONFIG_XKBCOMMON' in config_host
850 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
851 dependencies: [qemuutil, xkbcommon], install: true)
852 endif
853
Marc-André Lureau157e7b12019-07-15 14:50:58 +0400854 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
855 dependencies: qemuutil,
856 install: true)
857
Paolo Bonzini931049b2020-02-05 09:44:24 +0100858 if 'CONFIG_VHOST_USER' in config_host
859 subdir('contrib/libvhost-user')
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +0200860 subdir('contrib/vhost-user-blk')
Marc-André Lureauea458962019-07-12 22:23:46 +0400861 if 'CONFIG_LINUX' in config_host
862 subdir('contrib/vhost-user-gpu')
863 endif
Marc-André Lureau32fcc622019-07-12 22:11:20 +0400864 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +0200865 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +0100866 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +0400867
868 if targetos == 'linux'
869 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
870 dependencies: [qemuutil, libcap_ng],
871 install: true,
872 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400873
874 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
875 dependencies: [authz, crypto, io, qom, qemuutil,
876 libcap_ng, libudev, libmpathpersist],
877 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +0400878 endif
879
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400880 if 'CONFIG_IVSHMEM' in config_host
881 subdir('contrib/ivshmem-client')
882 subdir('contrib/ivshmem-server')
883 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +0100884endif
885
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100886subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +0400887subdir('pc-bios')
Paolo Bonzinice1c1e72020-01-28 16:41:44 +0100888subdir('tests')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100889
Paolo Bonzinif9332752020-02-03 13:28:38 +0100890summary_info = {}
891summary_info += {'Install prefix': config_host['prefix']}
892summary_info += {'BIOS directory': config_host['qemu_datadir']}
893summary_info += {'firmware path': config_host['qemu_firmwarepath']}
894summary_info += {'binary directory': config_host['bindir']}
895summary_info += {'library directory': config_host['libdir']}
896summary_info += {'module directory': config_host['qemu_moddir']}
897summary_info += {'libexec directory': config_host['libexecdir']}
898summary_info += {'include directory': config_host['includedir']}
899summary_info += {'config directory': config_host['sysconfdir']}
900if targetos != 'windows'
901 summary_info += {'local state directory': config_host['qemu_localstatedir']}
902 summary_info += {'Manual directory': config_host['mandir']}
903else
904 summary_info += {'local state directory': 'queried at runtime'}
905endif
906summary_info += {'Build directory': meson.current_build_dir()}
907summary_info += {'Source path': meson.current_source_dir()}
908summary_info += {'GIT binary': config_host['GIT']}
909summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
910summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
911summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
912if link_language == 'cpp'
913 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
914else
915 summary_info += {'C++ compiler': false}
916endif
917if targetos == 'darwin'
918 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
919endif
920summary_info += {'ARFLAGS': config_host['ARFLAGS']}
921summary_info += {'CFLAGS': config_host['CFLAGS']}
922summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
923summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
924summary_info += {'make': config_host['MAKE']}
925summary_info += {'install': config_host['INSTALL']}
926summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
927summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
928summary_info += {'genisoimage': config_host['GENISOIMAGE']}
929# TODO: add back version
930summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
931if config_host.has_key('CONFIG_SLIRP')
932 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
933endif
934summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
935if config_host.has_key('CONFIG_MODULES')
936 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
937endif
938summary_info += {'host CPU': cpu}
939summary_info += {'host endianness': build_machine.endian()}
940summary_info += {'target list': config_host['TARGET_DIRS']}
941summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
942summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
943summary_info += {'strip binaries': get_option('strip')}
944summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
945summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
946if targetos == 'darwin'
947 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
948endif
949# TODO: add back version
950summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
951summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
952# TODO: add back version
953summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
954summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
955# TODO: add back version
956summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
957summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
958summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
959# TODO: add back version
960summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
961if config_host.has_key('CONFIG_GCRYPT')
962 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
963 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
964endif
965# TODO: add back version
966summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
967if config_host.has_key('CONFIG_NETTLE')
968 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
969endif
970summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
971summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
972summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
973summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
974# TODO: add back version
975summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
976summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
977summary_info += {'mingw32 support': targetos == 'windows'}
978summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
979summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
980summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
981summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
982summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
983summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
984if config_host.has_key('CONFIG_VNC')
985 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
986 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
987 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
988endif
989summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
990if config_host.has_key('CONFIG_XEN_BACKEND')
991 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
992endif
993summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
994summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
995summary_info += {'PIE': get_option('b_pie')}
996summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
997summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
998summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
999summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1000summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1001summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1002# TODO: add back KVM/HAX/HVF/WHPX/TCG
1003#summary_info += {'KVM support': have_kvm'}
1004#summary_info += {'HAX support': have_hax'}
1005#summary_info += {'HVF support': have_hvf'}
1006#summary_info += {'WHPX support': have_whpx'}
1007#summary_info += {'TCG support': have_tcg'}
1008#if get_option('tcg')
1009# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1010# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1011#endif
1012summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1013summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1014summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1015summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
1016summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1017summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1018summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1019summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1020summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1021summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1022summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1023summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1024summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1025summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1026summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1027summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1028summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1029summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1030summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1031if config_host['TRACE_BACKENDS'].split().contains('simple')
1032 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1033endif
1034# TODO: add back protocol and server version
1035summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1036summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1037summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1038summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1039summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1040summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1041summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1042summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1043summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1044summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1045summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1046if targetos == 'windows'
1047 if 'WIN_SDK' in config_host
1048 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1049 endif
1050 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1051 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1052 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1053endif
1054summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1055summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1056summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1057summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1058summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1059summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1060summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +04001061summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001062summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1063summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1064summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1065summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1066summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1067summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1068summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1069summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1070summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1071summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1072summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1073summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1074summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1075summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1076summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1077summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1078summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1079summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1080summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1081summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1082summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1083summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1084summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1085summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1086summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1087summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1088summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1089summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1090summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1091summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1092summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1093summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1094if config_host.has_key('HAVE_GDB_BIN')
1095 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1096endif
1097summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1098summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1099summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1100summary(summary_info, bool_yn: true)
1101
1102if not supported_cpus.contains(cpu)
1103 message()
1104 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1105 message()
1106 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1107 message('The QEMU project intends to remove support for this host CPU in')
1108 message('a future release if nobody volunteers to maintain it and to')
1109 message('provide a build host for our continuous integration setup.')
1110 message('configure has succeeded and you can continue to build, but')
1111 message('if you care about QEMU on this platform you should contact')
1112 message('us upstream at qemu-devel@nongnu.org.')
1113endif
1114
1115if not supported_oses.contains(targetos)
1116 message()
1117 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1118 message()
1119 message('Host OS ' + targetos + 'support is not currently maintained.')
1120 message('The QEMU project intends to remove support for this host OS in')
1121 message('a future release if nobody volunteers to maintain it and to')
1122 message('provide a build host for our continuous integration setup.')
1123 message('configure has succeeded and you can continue to build, but')
1124 message('if you care about QEMU on this platform you should contact')
1125 message('us upstream at qemu-devel@nongnu.org.')
1126endif