blob: edb635347c4cbf859d3c18deb581dabc602fb8e3 [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
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400328
Paolo Bonzini2becc362020-02-03 11:42:03 +0100329create_config = find_program('scripts/create_config')
330minikconf = find_program('scripts/minikconf.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400331target_dirs = config_host['TARGET_DIRS'].split()
332have_user = false
333have_system = false
Paolo Bonzini2becc362020-02-03 11:42:03 +0100334config_devices_mak_list = []
335config_devices_h = {}
336config_target_mak = {}
337kconfig_external_symbols = [
338 'CONFIG_KVM',
339 'CONFIG_XEN',
340 'CONFIG_TPM',
341 'CONFIG_SPICE',
342 'CONFIG_IVSHMEM',
343 'CONFIG_OPENGL',
344 'CONFIG_X11',
345 'CONFIG_VHOST_USER',
346 'CONFIG_VHOST_KERNEL',
347 'CONFIG_VIRTFS',
348 'CONFIG_LINUX',
349 'CONFIG_PVRDMA',
350]
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400351foreach target : target_dirs
352 have_user = have_user or target.endswith('-user')
Paolo Bonzini2becc362020-02-03 11:42:03 +0100353 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
354
355 if target.endswith('-softmmu')
356 have_system = true
357
358 base_kconfig = []
359 foreach sym : kconfig_external_symbols
360 if sym in config_target
361 base_kconfig += '@0@=y'.format(sym)
362 endif
363 endforeach
364
365 config_devices_mak = target + '-config-devices.mak'
366 config_devices_mak = configure_file(
367 input: ['default-configs' / target + '.mak', 'Kconfig'],
368 output: config_devices_mak,
369 depfile: config_devices_mak + '.d',
370 capture: true,
371 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
372 config_devices_mak, '@DEPFILE@', '@INPUT@',
373 base_kconfig])
374 config_devices_h += {target: custom_target(
375 target + '-config-devices.h',
376 input: config_devices_mak,
377 output: target + '-config-devices.h',
378 capture: true,
379 command: [create_config, '@INPUT@'])}
380 config_devices_mak_list += config_devices_mak
381 config_target += keyval.load(config_devices_mak)
382 endif
383 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400384endforeach
385have_tools = 'CONFIG_TOOLS' in config_host
386have_block = have_system or have_tools
387
Paolo Bonzini2becc362020-02-03 11:42:03 +0100388grepy = find_program('scripts/grepy.sh')
389# This configuration is used to build files that are shared by
390# multiple binaries, and then extracted out of the "common"
391# static_library target.
392#
393# We do not use all_sources()/all_dependencies(), because it would
394# build literally all source files, including devices only used by
395# targets that are not built for this compilation. The CONFIG_ALL
396# pseudo symbol replaces it.
397
398if have_system
399 config_all_devices_mak = configure_file(
400 output: 'config-all-devices.mak',
401 input: config_devices_mak_list,
402 capture: true,
403 command: [grepy, '@INPUT@'],
404 )
405 config_all_devices = keyval.load(config_all_devices_mak)
406else
407 config_all_devices = {}
408endif
409config_all = config_all_devices
410config_all += config_host
411config_all += config_all_disas
412config_all += {
413 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
414 'CONFIG_SOFTMMU': have_system,
415 'CONFIG_USER_ONLY': have_user,
416 'CONFIG_ALL': true,
417}
418
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400419# Generators
420
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400421genh = []
Marc-André Lureau3f885652019-07-15 18:06:04 +0400422hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +0400423shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400424qapi_gen = find_program('scripts/qapi-gen.py')
425qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
426 meson.source_root() / 'scripts/qapi/commands.py',
427 meson.source_root() / 'scripts/qapi/common.py',
428 meson.source_root() / 'scripts/qapi/doc.py',
429 meson.source_root() / 'scripts/qapi/error.py',
430 meson.source_root() / 'scripts/qapi/events.py',
431 meson.source_root() / 'scripts/qapi/expr.py',
432 meson.source_root() / 'scripts/qapi/gen.py',
433 meson.source_root() / 'scripts/qapi/introspect.py',
434 meson.source_root() / 'scripts/qapi/parser.py',
435 meson.source_root() / 'scripts/qapi/schema.py',
436 meson.source_root() / 'scripts/qapi/source.py',
437 meson.source_root() / 'scripts/qapi/types.py',
438 meson.source_root() / 'scripts/qapi/visit.py',
439 meson.source_root() / 'scripts/qapi/common.py',
440 meson.source_root() / 'scripts/qapi/doc.py',
441 meson.source_root() / 'scripts/qapi-gen.py'
442]
443
444tracetool = [
445 python, files('scripts/tracetool.py'),
446 '--backend=' + config_host['TRACE_BACKENDS']
447]
448
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400449qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
450 meson.current_source_dir(),
451 config_host['PKGVERSION'], config_host['VERSION']]
452qemu_version = custom_target('qemu-version.h',
453 output: 'qemu-version.h',
454 command: qemu_version_cmd,
455 capture: true,
456 build_by_default: true,
457 build_always_stale: true)
458genh += qemu_version
459
Paolo Bonzini2becc362020-02-03 11:42:03 +0100460config_host_h = custom_target('config-host.h',
461 input: meson.current_build_dir() / 'config-host.mak',
462 output: 'config-host.h',
463 capture: true,
464 command: [create_config, '@INPUT@'])
465genh += config_host_h
466
Marc-André Lureau3f885652019-07-15 18:06:04 +0400467hxdep = []
468hx_headers = [
469 ['qemu-options.hx', 'qemu-options.def'],
470 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
471]
472if have_system
473 hx_headers += [
474 ['hmp-commands.hx', 'hmp-commands.h'],
475 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
476 ]
477endif
478foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400479 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +0400480 input: files(d[0]),
481 output: d[1],
482 capture: true,
483 build_by_default: true, # to be removed when added to a target
484 command: [hxtool, '-h', '@INPUT0@'])
485endforeach
486genh += hxdep
487
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400488# Collect sourcesets.
489
490util_ss = ss.source_set()
491stub_ss = ss.source_set()
492trace_ss = ss.source_set()
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400493block_ss = ss.source_set()
Paolo Bonzini4a963372020-08-03 16:22:28 +0200494blockdev_ss = ss.source_set()
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200495qmp_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +0100496common_ss = ss.source_set()
497softmmu_ss = ss.source_set()
498user_ss = ss.source_set()
499bsd_user_ss = ss.source_set()
500linux_user_ss = ss.source_set()
501specific_ss = ss.source_set()
502
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400503modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100504hw_arch = {}
505target_arch = {}
506target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400507
508###############
509# Trace files #
510###############
511
512trace_events_subdirs = [
513 'accel/kvm',
514 'accel/tcg',
515 'crypto',
516 'monitor',
517]
518if have_user
519 trace_events_subdirs += [ 'linux-user' ]
520endif
521if have_block
522 trace_events_subdirs += [
523 'authz',
524 'block',
525 'io',
526 'nbd',
527 'scsi',
528 ]
529endif
530if have_system
531 trace_events_subdirs += [
532 'audio',
533 'backends',
534 'backends/tpm',
535 'chardev',
536 'hw/9pfs',
537 'hw/acpi',
538 'hw/alpha',
539 'hw/arm',
540 'hw/audio',
541 'hw/block',
542 'hw/block/dataplane',
543 'hw/char',
544 'hw/display',
545 'hw/dma',
546 'hw/hppa',
547 'hw/hyperv',
548 'hw/i2c',
549 'hw/i386',
550 'hw/i386/xen',
551 'hw/ide',
552 'hw/input',
553 'hw/intc',
554 'hw/isa',
555 'hw/mem',
556 'hw/mips',
557 'hw/misc',
558 'hw/misc/macio',
559 'hw/net',
560 'hw/nvram',
561 'hw/pci',
562 'hw/pci-host',
563 'hw/ppc',
564 'hw/rdma',
565 'hw/rdma/vmw',
566 'hw/rtc',
567 'hw/s390x',
568 'hw/scsi',
569 'hw/sd',
570 'hw/sparc',
571 'hw/sparc64',
572 'hw/ssi',
573 'hw/timer',
574 'hw/tpm',
575 'hw/usb',
576 'hw/vfio',
577 'hw/virtio',
578 'hw/watchdog',
579 'hw/xen',
580 'hw/gpio',
581 'hw/riscv',
582 'migration',
583 'net',
584 'ui',
585 ]
586endif
587trace_events_subdirs += [
588 'hw/core',
589 'qapi',
590 'qom',
591 'target/arm',
592 'target/hppa',
593 'target/i386',
594 'target/mips',
595 'target/ppc',
596 'target/riscv',
597 'target/s390x',
598 'target/sparc',
599 'util',
600]
601
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400602subdir('qapi')
603subdir('qobject')
604subdir('stubs')
605subdir('trace')
606subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +0400607subdir('qom')
608subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400609subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +0400610subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400611
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400612
613if enable_modules
614 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
615 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
616endif
617
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400618# Build targets from sourcesets
619
Paolo Bonzini2becc362020-02-03 11:42:03 +0100620stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400621
622util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +0100623util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400624libqemuutil = static_library('qemuutil',
625 sources: util_ss.sources() + stub_ss.sources() + genh,
626 dependencies: [util_ss.dependencies(), m, glib, socket])
627qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400628 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400629
Paolo Bonzini478e9432020-08-17 12:47:55 +0200630subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +0400631subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +0400632subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400633subdir('fsdev')
Marc-André Lureaud3b18482019-08-17 14:55:32 +0400634subdir('target')
Marc-André Lureau708eab42019-09-03 16:59:33 +0400635subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400636
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400637block_ss.add(files(
638 'block.c',
639 'blockjob.c',
640 'job.c',
641 'qemu-io-cmds.c',
642))
643block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
644
645subdir('nbd')
646subdir('scsi')
647subdir('block')
648
Paolo Bonzini4a963372020-08-03 16:22:28 +0200649blockdev_ss.add(files(
650 'blockdev.c',
651 'blockdev-nbd.c',
652 'iothread.c',
653 'job-qmp.c',
654))
655
656# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
657# os-win32.c does not
658blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
659softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
660
661softmmu_ss.add_all(blockdev_ss)
662softmmu_ss.add(files(
663 'bootdevice.c',
664 'dma-helpers.c',
665 'qdev-monitor.c',
666), sdl)
667
668softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
669softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
670softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
671
672common_ss.add(files('cpus-common.c'))
673
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +0200674subdir('softmmu')
Marc-André Lureauab318052019-07-24 19:23:16 +0400675subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +0400676subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +0400677subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200678subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400679subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +0400680subdir('replay')
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +0200681
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +0200682# needed for fuzzing binaries
683subdir('tests/qtest/libqos')
684
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400685block_mods = []
686softmmu_mods = []
687foreach d, list : modules
688 foreach m, module_ss : list
689 if enable_modules and targetos != 'windows'
690 module_ss = module_ss.apply(config_host, strict: false)
691 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
692 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
693 if d == 'block'
694 block_mods += sl
695 else
696 softmmu_mods += sl
697 endif
698 else
699 if d == 'block'
700 block_ss.add_all(module_ss)
701 else
702 softmmu_ss.add_all(module_ss)
703 endif
704 endif
705 endforeach
706endforeach
707
708nm = find_program('nm')
709undefsym = find_program('scripts/undefsym.sh')
710block_syms = custom_target('block.syms', output: 'block.syms',
711 input: [libqemuutil, block_mods],
712 capture: true,
713 command: [undefsym, nm, '@INPUT@'])
714qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
715 input: [libqemuutil, softmmu_mods],
716 capture: true,
717 command: [undefsym, nm, '@INPUT@'])
718
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400719block_ss = block_ss.apply(config_host, strict: false)
720libblock = static_library('block', block_ss.sources() + genh,
721 dependencies: block_ss.dependencies(),
722 link_depends: block_syms,
723 name_suffix: 'fa',
724 build_by_default: false)
725
726block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400727 link_args: '@block.syms',
728 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400729
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200730qmp_ss = qmp_ss.apply(config_host, strict: false)
731libqmp = static_library('qmp', qmp_ss.sources() + genh,
732 dependencies: qmp_ss.dependencies(),
733 name_suffix: 'fa',
734 build_by_default: false)
735
736qmp = declare_dependency(link_whole: [libqmp])
737
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400738foreach m : block_mods + softmmu_mods
739 shared_module(m.name(),
740 name_prefix: '',
741 link_whole: m,
742 install: true,
743 install_dir: config_host['qemu_moddir'])
744endforeach
745
Paolo Bonzini2becc362020-02-03 11:42:03 +0100746common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
747common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
748
749common_all = common_ss.apply(config_all, strict: false)
750common_all = static_library('common',
751 build_by_default: false,
752 sources: common_all.sources() + genh,
753 dependencies: common_all.dependencies(),
754 name_suffix: 'fa')
755
756foreach target : target_dirs
757 config_target = config_target_mak[target]
758 target_name = config_target['TARGET_NAME']
759 arch = config_target['TARGET_BASE_ARCH']
760 arch_srcs = []
761
762 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
763 if targetos == 'linux'
764 target_inc += include_directories('linux-headers', is_system: true)
765 endif
766 if target.endswith('-softmmu')
767 qemu_target_name = 'qemu-system-' + target_name
768 target_type='system'
769 arch_srcs += config_devices_h[target]
770 else
771 target_type='user'
772 qemu_target_name = 'qemu-' + target_name
773 if 'CONFIG_LINUX_USER' in config_target
774 base_dir = 'linux-user'
775 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
776 else
777 base_dir = 'bsd-user'
778 endif
779 target_inc += include_directories(
780 base_dir,
781 base_dir / config_target['TARGET_ABI_DIR'],
782 )
783 endif
784
785 target_common = common_ss.apply(config_target, strict: false)
786 objects = common_all.extract_objects(target_common.sources())
787
788 # TODO: Change to generator once obj-y goes away
789 config_target_h = custom_target(target + '-config-target.h',
790 input: meson.current_build_dir() / target / 'config-target.mak',
791 output: target + '-config-target.h',
792 capture: true,
793 command: [create_config, '@INPUT@'])
794
795 target_specific = specific_ss.apply(config_target, strict: false)
796 arch_srcs += target_specific.sources()
797
798 static_library('qemu-' + target,
799 sources: arch_srcs + [config_target_h] + genh,
800 objects: objects,
801 include_directories: target_inc,
802 c_args: ['-DNEED_CPU_H',
803 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
804 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
805 name_suffix: 'fa')
806endforeach
807
Paolo Bonzini931049b2020-02-05 09:44:24 +0100808# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400809
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200810if 'CONFIG_GUEST_AGENT' in config_host
811 subdir('qga')
812endif
813
Paolo Bonzini931049b2020-02-05 09:44:24 +0100814if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400815 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
816 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
817 qemu_io = executable('qemu-io', files('qemu-io.c'),
818 dependencies: [block, qemuutil], install: true)
819 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
820 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
821 dependencies: [block, qemuutil], install: true)
822 endif
823
Paolo Bonzini7c58bb72020-08-04 20:18:36 +0200824 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +0200825 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400826 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +0200827
Marc-André Lureauade60d42019-07-15 14:48:31 +0400828 if 'CONFIG_XKBCOMMON' in config_host
829 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
830 dependencies: [qemuutil, xkbcommon], install: true)
831 endif
832
Marc-André Lureau157e7b12019-07-15 14:50:58 +0400833 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
834 dependencies: qemuutil,
835 install: true)
836
Paolo Bonzini931049b2020-02-05 09:44:24 +0100837 if 'CONFIG_VHOST_USER' in config_host
838 subdir('contrib/libvhost-user')
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +0200839 subdir('contrib/vhost-user-blk')
Marc-André Lureauea458962019-07-12 22:23:46 +0400840 if 'CONFIG_LINUX' in config_host
841 subdir('contrib/vhost-user-gpu')
842 endif
Marc-André Lureau32fcc622019-07-12 22:11:20 +0400843 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +0200844 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +0100845 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +0400846
847 if targetos == 'linux'
848 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
849 dependencies: [qemuutil, libcap_ng],
850 install: true,
851 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400852
853 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
854 dependencies: [authz, crypto, io, qom, qemuutil,
855 libcap_ng, libudev, libmpathpersist],
856 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +0400857 endif
858
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400859 if 'CONFIG_IVSHMEM' in config_host
860 subdir('contrib/ivshmem-client')
861 subdir('contrib/ivshmem-server')
862 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +0100863endif
864
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100865subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +0400866subdir('pc-bios')
Paolo Bonzinice1c1e72020-01-28 16:41:44 +0100867subdir('tests')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100868
Paolo Bonzinif9332752020-02-03 13:28:38 +0100869summary_info = {}
870summary_info += {'Install prefix': config_host['prefix']}
871summary_info += {'BIOS directory': config_host['qemu_datadir']}
872summary_info += {'firmware path': config_host['qemu_firmwarepath']}
873summary_info += {'binary directory': config_host['bindir']}
874summary_info += {'library directory': config_host['libdir']}
875summary_info += {'module directory': config_host['qemu_moddir']}
876summary_info += {'libexec directory': config_host['libexecdir']}
877summary_info += {'include directory': config_host['includedir']}
878summary_info += {'config directory': config_host['sysconfdir']}
879if targetos != 'windows'
880 summary_info += {'local state directory': config_host['qemu_localstatedir']}
881 summary_info += {'Manual directory': config_host['mandir']}
882else
883 summary_info += {'local state directory': 'queried at runtime'}
884endif
885summary_info += {'Build directory': meson.current_build_dir()}
886summary_info += {'Source path': meson.current_source_dir()}
887summary_info += {'GIT binary': config_host['GIT']}
888summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
889summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
890summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
891if link_language == 'cpp'
892 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
893else
894 summary_info += {'C++ compiler': false}
895endif
896if targetos == 'darwin'
897 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
898endif
899summary_info += {'ARFLAGS': config_host['ARFLAGS']}
900summary_info += {'CFLAGS': config_host['CFLAGS']}
901summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
902summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
903summary_info += {'make': config_host['MAKE']}
904summary_info += {'install': config_host['INSTALL']}
905summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
906summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
907summary_info += {'genisoimage': config_host['GENISOIMAGE']}
908# TODO: add back version
909summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
910if config_host.has_key('CONFIG_SLIRP')
911 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
912endif
913summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
914if config_host.has_key('CONFIG_MODULES')
915 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
916endif
917summary_info += {'host CPU': cpu}
918summary_info += {'host endianness': build_machine.endian()}
919summary_info += {'target list': config_host['TARGET_DIRS']}
920summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
921summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
922summary_info += {'strip binaries': get_option('strip')}
923summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
924summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
925if targetos == 'darwin'
926 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
927endif
928# TODO: add back version
929summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
930summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
931# TODO: add back version
932summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
933summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
934# TODO: add back version
935summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
936summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
937summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
938# TODO: add back version
939summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
940if config_host.has_key('CONFIG_GCRYPT')
941 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
942 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
943endif
944# TODO: add back version
945summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
946if config_host.has_key('CONFIG_NETTLE')
947 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
948endif
949summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
950summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
951summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
952summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
953# TODO: add back version
954summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
955summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
956summary_info += {'mingw32 support': targetos == 'windows'}
957summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
958summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
959summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
960summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
961summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
962summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
963if config_host.has_key('CONFIG_VNC')
964 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
965 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
966 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
967endif
968summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
969if config_host.has_key('CONFIG_XEN_BACKEND')
970 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
971endif
972summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
973summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
974summary_info += {'PIE': get_option('b_pie')}
975summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
976summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
977summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
978summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
979summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
980summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
981# TODO: add back KVM/HAX/HVF/WHPX/TCG
982#summary_info += {'KVM support': have_kvm'}
983#summary_info += {'HAX support': have_hax'}
984#summary_info += {'HVF support': have_hvf'}
985#summary_info += {'WHPX support': have_whpx'}
986#summary_info += {'TCG support': have_tcg'}
987#if get_option('tcg')
988# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
989# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
990#endif
991summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
992summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
993summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
994summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
995summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
996summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
997summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
998summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
999summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1000summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1001summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1002summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1003summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1004summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1005summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1006summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1007summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1008summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1009summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1010if config_host['TRACE_BACKENDS'].split().contains('simple')
1011 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1012endif
1013# TODO: add back protocol and server version
1014summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1015summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1016summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1017summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1018summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1019summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1020summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1021summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1022summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1023summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1024summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1025if targetos == 'windows'
1026 if 'WIN_SDK' in config_host
1027 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1028 endif
1029 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1030 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1031 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1032endif
1033summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1034summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1035summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1036summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1037summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1038summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1039summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +04001040summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001041summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1042summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1043summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1044summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1045summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1046summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1047summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1048summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1049summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1050summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1051summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1052summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1053summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1054summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1055summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1056summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1057summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1058summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1059summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1060summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1061summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1062summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1063summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1064summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1065summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1066summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1067summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1068summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1069summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1070summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1071summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1072summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1073if config_host.has_key('HAVE_GDB_BIN')
1074 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1075endif
1076summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1077summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1078summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1079summary(summary_info, bool_yn: true)
1080
1081if not supported_cpus.contains(cpu)
1082 message()
1083 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1084 message()
1085 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1086 message('The QEMU project intends to remove support for this host CPU in')
1087 message('a future release if nobody volunteers to maintain it and to')
1088 message('provide a build host for our continuous integration setup.')
1089 message('configure has succeeded and you can continue to build, but')
1090 message('if you care about QEMU on this platform you should contact')
1091 message('us upstream at qemu-devel@nongnu.org.')
1092endif
1093
1094if not supported_oses.contains(targetos)
1095 message()
1096 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1097 message()
1098 message('Host OS ' + targetos + 'support is not currently maintained.')
1099 message('The QEMU project intends to remove support for this host OS in')
1100 message('a future release if nobody volunteers to maintain it and to')
1101 message('provide a build host for our continuous integration setup.')
1102 message('configure has succeeded and you can continue to build, but')
1103 message('if you care about QEMU on this platform you should contact')
1104 message('us upstream at qemu-devel@nongnu.org.')
1105endif