blob: ff200900ed976918ec67f0ec4586f94594c36054 [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
Paolo Bonzini478e9432020-08-17 12:47:55 +0200152pulse = not_found
153if 'CONFIG_LIBPULSE' in config_host
154 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
155 link_args: config_host['PULSE_LIBS'].split())
156endif
157alsa = not_found
158if 'CONFIG_ALSA' in config_host
159 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
160 link_args: config_host['ALSA_LIBS'].split())
161endif
162jack = not_found
163if 'CONFIG_LIBJACK' in config_host
164 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
165endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200166spice = not_found
167if 'CONFIG_SPICE' in config_host
168 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
169 link_args: config_host['SPICE_LIBS'].split())
170endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400171rt = cc.find_library('rt', required: false)
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400172libmpathpersist = not_found
173if config_host.has_key('CONFIG_MPATH')
174 libmpathpersist = cc.find_library('mpathpersist')
175endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200176libiscsi = not_found
177if 'CONFIG_LIBISCSI' in config_host
178 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
179 link_args: config_host['LIBISCSI_LIBS'].split())
180endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400181zstd = not_found
182if 'CONFIG_ZSTD' in config_host
183 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
184 link_args: config_host['ZSTD_LIBS'].split())
185endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400186gbm = not_found
187if 'CONFIG_GBM' in config_host
188 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
189 link_args: config_host['GBM_LIBS'].split())
190endif
191virgl = not_found
192if 'CONFIG_VIRGL' in config_host
193 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
194 link_args: config_host['VIRGL_LIBS'].split())
195endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400196curl = not_found
197if 'CONFIG_CURL' in config_host
198 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
199 link_args: config_host['CURL_LIBS'].split())
200endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200201libudev = not_found
202if 'CONFIG_LIBUDEV' in config_host
203 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
204endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200205brlapi = not_found
206if 'CONFIG_BRLAPI' in config_host
207 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
208endif
209sdl = not_found
210if 'CONFIG_SDL' in config_host
211 sdl = declare_dependency(compile_args: config_host['SDL_CFLAGS'].split(),
212 link_args: config_host['SDL_LIBS'].split())
213endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400214rbd = not_found
215if 'CONFIG_RBD' in config_host
216 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
217endif
218glusterfs = not_found
219if 'CONFIG_GLUSTERFS' in config_host
220 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
221 link_args: config_host['GLUSTERFS_LIBS'].split())
222endif
223libssh = not_found
224if 'CONFIG_LIBSSH' in config_host
225 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
226 link_args: config_host['LIBSSH_LIBS'].split())
227endif
228libbzip2 = not_found
229if 'CONFIG_BZIP2' in config_host
230 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
231endif
232liblzfse = not_found
233if 'CONFIG_LZFSE' in config_host
234 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
235endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200236oss = not_found
237if 'CONFIG_AUDIO_OSS' in config_host
238 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
239endif
240dsound = not_found
241if 'CONFIG_AUDIO_DSOUND' in config_host
242 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
243endif
244coreaudio = not_found
245if 'CONFIG_AUDIO_COREAUDIO' in config_host
246 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
247endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400248opengl = not_found
249if 'CONFIG_OPENGL' in config_host
250 opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
251else
252endif
253gtk = not_found
254if 'CONFIG_GTK' in config_host
255 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
256 link_args: config_host['GTK_LIBS'].split())
257endif
258vte = not_found
259if 'CONFIG_VTE' in config_host
260 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
261 link_args: config_host['VTE_LIBS'].split())
262endif
263x11 = not_found
264if 'CONFIG_X11' in config_host
265 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
266 link_args: config_host['X11_LIBS'].split())
267endif
268curses = not_found
269if 'CONFIG_CURSES' in config_host
270 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
271 link_args: config_host['CURSES_LIBS'].split())
272endif
273iconv = not_found
274if 'CONFIG_ICONV' in config_host
275 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
276 link_args: config_host['ICONV_LIBS'].split())
277endif
278gio = not_found
279if 'CONFIG_GIO' in config_host
280 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
281 link_args: config_host['GIO_LIBS'].split())
282endif
283png = not_found
284if 'CONFIG_VNC_PNG' in config_host
285 png = declare_dependency(compile_args: config_host['PNG_CFLAGS'].split(),
286 link_args: config_host['PNG_LIBS'].split())
287endif
288jpeg = not_found
289if 'CONFIG_VNC_JPEG' in config_host
290 jpeg = declare_dependency(compile_args: config_host['JPEG_CFLAGS'].split(),
291 link_args: config_host['JPEG_LIBS'].split())
292endif
293sasl = not_found
294if 'CONFIG_VNC_SASL' in config_host
295 sasl = declare_dependency(compile_args: config_host['SASL_CFLAGS'].split(),
296 link_args: config_host['SASL_LIBS'].split())
297endif
Paolo Bonzini4a963372020-08-03 16:22:28 +0200298fdt = not_found
299if 'CONFIG_FDT' in config_host
300 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
301 link_args: config_host['FDT_LIBS'].split())
302endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400303
Paolo Bonzini2becc362020-02-03 11:42:03 +0100304create_config = find_program('scripts/create_config')
305minikconf = find_program('scripts/minikconf.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400306target_dirs = config_host['TARGET_DIRS'].split()
307have_user = false
308have_system = false
Paolo Bonzini2becc362020-02-03 11:42:03 +0100309config_devices_mak_list = []
310config_devices_h = {}
311config_target_mak = {}
312kconfig_external_symbols = [
313 'CONFIG_KVM',
314 'CONFIG_XEN',
315 'CONFIG_TPM',
316 'CONFIG_SPICE',
317 'CONFIG_IVSHMEM',
318 'CONFIG_OPENGL',
319 'CONFIG_X11',
320 'CONFIG_VHOST_USER',
321 'CONFIG_VHOST_KERNEL',
322 'CONFIG_VIRTFS',
323 'CONFIG_LINUX',
324 'CONFIG_PVRDMA',
325]
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400326foreach target : target_dirs
327 have_user = have_user or target.endswith('-user')
Paolo Bonzini2becc362020-02-03 11:42:03 +0100328 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
329
330 if target.endswith('-softmmu')
331 have_system = true
332
333 base_kconfig = []
334 foreach sym : kconfig_external_symbols
335 if sym in config_target
336 base_kconfig += '@0@=y'.format(sym)
337 endif
338 endforeach
339
340 config_devices_mak = target + '-config-devices.mak'
341 config_devices_mak = configure_file(
342 input: ['default-configs' / target + '.mak', 'Kconfig'],
343 output: config_devices_mak,
344 depfile: config_devices_mak + '.d',
345 capture: true,
346 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
347 config_devices_mak, '@DEPFILE@', '@INPUT@',
348 base_kconfig])
349 config_devices_h += {target: custom_target(
350 target + '-config-devices.h',
351 input: config_devices_mak,
352 output: target + '-config-devices.h',
353 capture: true,
354 command: [create_config, '@INPUT@'])}
355 config_devices_mak_list += config_devices_mak
356 config_target += keyval.load(config_devices_mak)
357 endif
358 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400359endforeach
360have_tools = 'CONFIG_TOOLS' in config_host
361have_block = have_system or have_tools
362
Paolo Bonzini2becc362020-02-03 11:42:03 +0100363grepy = find_program('scripts/grepy.sh')
364# This configuration is used to build files that are shared by
365# multiple binaries, and then extracted out of the "common"
366# static_library target.
367#
368# We do not use all_sources()/all_dependencies(), because it would
369# build literally all source files, including devices only used by
370# targets that are not built for this compilation. The CONFIG_ALL
371# pseudo symbol replaces it.
372
373if have_system
374 config_all_devices_mak = configure_file(
375 output: 'config-all-devices.mak',
376 input: config_devices_mak_list,
377 capture: true,
378 command: [grepy, '@INPUT@'],
379 )
380 config_all_devices = keyval.load(config_all_devices_mak)
381else
382 config_all_devices = {}
383endif
384config_all = config_all_devices
385config_all += config_host
386config_all += config_all_disas
387config_all += {
388 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
389 'CONFIG_SOFTMMU': have_system,
390 'CONFIG_USER_ONLY': have_user,
391 'CONFIG_ALL': true,
392}
393
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400394# Generators
395
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400396genh = []
Marc-André Lureau3f885652019-07-15 18:06:04 +0400397hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +0400398shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400399qapi_gen = find_program('scripts/qapi-gen.py')
400qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
401 meson.source_root() / 'scripts/qapi/commands.py',
402 meson.source_root() / 'scripts/qapi/common.py',
403 meson.source_root() / 'scripts/qapi/doc.py',
404 meson.source_root() / 'scripts/qapi/error.py',
405 meson.source_root() / 'scripts/qapi/events.py',
406 meson.source_root() / 'scripts/qapi/expr.py',
407 meson.source_root() / 'scripts/qapi/gen.py',
408 meson.source_root() / 'scripts/qapi/introspect.py',
409 meson.source_root() / 'scripts/qapi/parser.py',
410 meson.source_root() / 'scripts/qapi/schema.py',
411 meson.source_root() / 'scripts/qapi/source.py',
412 meson.source_root() / 'scripts/qapi/types.py',
413 meson.source_root() / 'scripts/qapi/visit.py',
414 meson.source_root() / 'scripts/qapi/common.py',
415 meson.source_root() / 'scripts/qapi/doc.py',
416 meson.source_root() / 'scripts/qapi-gen.py'
417]
418
419tracetool = [
420 python, files('scripts/tracetool.py'),
421 '--backend=' + config_host['TRACE_BACKENDS']
422]
423
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400424qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
425 meson.current_source_dir(),
426 config_host['PKGVERSION'], config_host['VERSION']]
427qemu_version = custom_target('qemu-version.h',
428 output: 'qemu-version.h',
429 command: qemu_version_cmd,
430 capture: true,
431 build_by_default: true,
432 build_always_stale: true)
433genh += qemu_version
434
Paolo Bonzini2becc362020-02-03 11:42:03 +0100435config_host_h = custom_target('config-host.h',
436 input: meson.current_build_dir() / 'config-host.mak',
437 output: 'config-host.h',
438 capture: true,
439 command: [create_config, '@INPUT@'])
440genh += config_host_h
441
Marc-André Lureau3f885652019-07-15 18:06:04 +0400442hxdep = []
443hx_headers = [
444 ['qemu-options.hx', 'qemu-options.def'],
445 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
446]
447if have_system
448 hx_headers += [
449 ['hmp-commands.hx', 'hmp-commands.h'],
450 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
451 ]
452endif
453foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400454 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +0400455 input: files(d[0]),
456 output: d[1],
457 capture: true,
458 build_by_default: true, # to be removed when added to a target
459 command: [hxtool, '-h', '@INPUT0@'])
460endforeach
461genh += hxdep
462
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400463# Collect sourcesets.
464
465util_ss = ss.source_set()
466stub_ss = ss.source_set()
467trace_ss = ss.source_set()
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400468block_ss = ss.source_set()
Paolo Bonzini4a963372020-08-03 16:22:28 +0200469blockdev_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +0100470common_ss = ss.source_set()
471softmmu_ss = ss.source_set()
472user_ss = ss.source_set()
473bsd_user_ss = ss.source_set()
474linux_user_ss = ss.source_set()
475specific_ss = ss.source_set()
476
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400477modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100478hw_arch = {}
479target_arch = {}
480target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400481
482###############
483# Trace files #
484###############
485
486trace_events_subdirs = [
487 'accel/kvm',
488 'accel/tcg',
489 'crypto',
490 'monitor',
491]
492if have_user
493 trace_events_subdirs += [ 'linux-user' ]
494endif
495if have_block
496 trace_events_subdirs += [
497 'authz',
498 'block',
499 'io',
500 'nbd',
501 'scsi',
502 ]
503endif
504if have_system
505 trace_events_subdirs += [
506 'audio',
507 'backends',
508 'backends/tpm',
509 'chardev',
510 'hw/9pfs',
511 'hw/acpi',
512 'hw/alpha',
513 'hw/arm',
514 'hw/audio',
515 'hw/block',
516 'hw/block/dataplane',
517 'hw/char',
518 'hw/display',
519 'hw/dma',
520 'hw/hppa',
521 'hw/hyperv',
522 'hw/i2c',
523 'hw/i386',
524 'hw/i386/xen',
525 'hw/ide',
526 'hw/input',
527 'hw/intc',
528 'hw/isa',
529 'hw/mem',
530 'hw/mips',
531 'hw/misc',
532 'hw/misc/macio',
533 'hw/net',
534 'hw/nvram',
535 'hw/pci',
536 'hw/pci-host',
537 'hw/ppc',
538 'hw/rdma',
539 'hw/rdma/vmw',
540 'hw/rtc',
541 'hw/s390x',
542 'hw/scsi',
543 'hw/sd',
544 'hw/sparc',
545 'hw/sparc64',
546 'hw/ssi',
547 'hw/timer',
548 'hw/tpm',
549 'hw/usb',
550 'hw/vfio',
551 'hw/virtio',
552 'hw/watchdog',
553 'hw/xen',
554 'hw/gpio',
555 'hw/riscv',
556 'migration',
557 'net',
558 'ui',
559 ]
560endif
561trace_events_subdirs += [
562 'hw/core',
563 'qapi',
564 'qom',
565 'target/arm',
566 'target/hppa',
567 'target/i386',
568 'target/mips',
569 'target/ppc',
570 'target/riscv',
571 'target/s390x',
572 'target/sparc',
573 'util',
574]
575
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400576subdir('qapi')
577subdir('qobject')
578subdir('stubs')
579subdir('trace')
580subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +0400581subdir('qom')
582subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400583subdir('crypto')
584subdir('storage-daemon')
Marc-André Lureau2d78b562019-07-15 16:00:36 +0400585subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400586
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400587
588if enable_modules
589 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
590 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
591endif
592
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400593# Build targets from sourcesets
594
Paolo Bonzini2becc362020-02-03 11:42:03 +0100595stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400596
597util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +0100598util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400599libqemuutil = static_library('qemuutil',
600 sources: util_ss.sources() + stub_ss.sources() + genh,
601 dependencies: [util_ss.dependencies(), m, glib, socket])
602qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400603 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400604
Paolo Bonzini478e9432020-08-17 12:47:55 +0200605subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +0400606subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +0400607subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400608subdir('fsdev')
Marc-André Lureaud3b18482019-08-17 14:55:32 +0400609subdir('target')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400610
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400611block_ss.add(files(
612 'block.c',
613 'blockjob.c',
614 'job.c',
615 'qemu-io-cmds.c',
616))
617block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
618
619subdir('nbd')
620subdir('scsi')
621subdir('block')
622
Paolo Bonzini4a963372020-08-03 16:22:28 +0200623blockdev_ss.add(files(
624 'blockdev.c',
625 'blockdev-nbd.c',
626 'iothread.c',
627 'job-qmp.c',
628))
629
630# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
631# os-win32.c does not
632blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
633softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
634
635softmmu_ss.add_all(blockdev_ss)
636softmmu_ss.add(files(
637 'bootdevice.c',
638 'dma-helpers.c',
639 'qdev-monitor.c',
640), sdl)
641
642softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
643softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
644softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
645
646common_ss.add(files('cpus-common.c'))
647
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +0200648# needed for fuzzing binaries
649subdir('tests/qtest/libqos')
650
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400651block_mods = []
652softmmu_mods = []
653foreach d, list : modules
654 foreach m, module_ss : list
655 if enable_modules and targetos != 'windows'
656 module_ss = module_ss.apply(config_host, strict: false)
657 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
658 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
659 if d == 'block'
660 block_mods += sl
661 else
662 softmmu_mods += sl
663 endif
664 else
665 if d == 'block'
666 block_ss.add_all(module_ss)
667 else
668 softmmu_ss.add_all(module_ss)
669 endif
670 endif
671 endforeach
672endforeach
673
674nm = find_program('nm')
675undefsym = find_program('scripts/undefsym.sh')
676block_syms = custom_target('block.syms', output: 'block.syms',
677 input: [libqemuutil, block_mods],
678 capture: true,
679 command: [undefsym, nm, '@INPUT@'])
680qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
681 input: [libqemuutil, softmmu_mods],
682 capture: true,
683 command: [undefsym, nm, '@INPUT@'])
684
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400685block_ss = block_ss.apply(config_host, strict: false)
686libblock = static_library('block', block_ss.sources() + genh,
687 dependencies: block_ss.dependencies(),
688 link_depends: block_syms,
689 name_suffix: 'fa',
690 build_by_default: false)
691
692block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400693 link_args: '@block.syms',
694 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400695
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400696foreach m : block_mods + softmmu_mods
697 shared_module(m.name(),
698 name_prefix: '',
699 link_whole: m,
700 install: true,
701 install_dir: config_host['qemu_moddir'])
702endforeach
703
Paolo Bonzini2becc362020-02-03 11:42:03 +0100704common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
705common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
706
707common_all = common_ss.apply(config_all, strict: false)
708common_all = static_library('common',
709 build_by_default: false,
710 sources: common_all.sources() + genh,
711 dependencies: common_all.dependencies(),
712 name_suffix: 'fa')
713
714foreach target : target_dirs
715 config_target = config_target_mak[target]
716 target_name = config_target['TARGET_NAME']
717 arch = config_target['TARGET_BASE_ARCH']
718 arch_srcs = []
719
720 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
721 if targetos == 'linux'
722 target_inc += include_directories('linux-headers', is_system: true)
723 endif
724 if target.endswith('-softmmu')
725 qemu_target_name = 'qemu-system-' + target_name
726 target_type='system'
727 arch_srcs += config_devices_h[target]
728 else
729 target_type='user'
730 qemu_target_name = 'qemu-' + target_name
731 if 'CONFIG_LINUX_USER' in config_target
732 base_dir = 'linux-user'
733 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
734 else
735 base_dir = 'bsd-user'
736 endif
737 target_inc += include_directories(
738 base_dir,
739 base_dir / config_target['TARGET_ABI_DIR'],
740 )
741 endif
742
743 target_common = common_ss.apply(config_target, strict: false)
744 objects = common_all.extract_objects(target_common.sources())
745
746 # TODO: Change to generator once obj-y goes away
747 config_target_h = custom_target(target + '-config-target.h',
748 input: meson.current_build_dir() / target / 'config-target.mak',
749 output: target + '-config-target.h',
750 capture: true,
751 command: [create_config, '@INPUT@'])
752
753 target_specific = specific_ss.apply(config_target, strict: false)
754 arch_srcs += target_specific.sources()
755
756 static_library('qemu-' + target,
757 sources: arch_srcs + [config_target_h] + genh,
758 objects: objects,
759 include_directories: target_inc,
760 c_args: ['-DNEED_CPU_H',
761 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
762 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
763 name_suffix: 'fa')
764endforeach
765
Paolo Bonzini931049b2020-02-05 09:44:24 +0100766# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400767
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200768if 'CONFIG_GUEST_AGENT' in config_host
769 subdir('qga')
770endif
771
Paolo Bonzini931049b2020-02-05 09:44:24 +0100772if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400773 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
774 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
775 qemu_io = executable('qemu-io', files('qemu-io.c'),
776 dependencies: [block, qemuutil], install: true)
777 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
778 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
779 dependencies: [block, qemuutil], install: true)
780 endif
781
Paolo Bonzinia9c97272019-06-10 12:27:52 +0200782 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400783 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +0200784
Marc-André Lureauade60d42019-07-15 14:48:31 +0400785 if 'CONFIG_XKBCOMMON' in config_host
786 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
787 dependencies: [qemuutil, xkbcommon], install: true)
788 endif
789
Marc-André Lureau157e7b12019-07-15 14:50:58 +0400790 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
791 dependencies: qemuutil,
792 install: true)
793
Paolo Bonzini931049b2020-02-05 09:44:24 +0100794 if 'CONFIG_VHOST_USER' in config_host
795 subdir('contrib/libvhost-user')
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +0200796 subdir('contrib/vhost-user-blk')
Marc-André Lureauea458962019-07-12 22:23:46 +0400797 if 'CONFIG_LINUX' in config_host
798 subdir('contrib/vhost-user-gpu')
799 endif
Marc-André Lureau32fcc622019-07-12 22:11:20 +0400800 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +0200801 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +0100802 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +0400803
804 if targetos == 'linux'
805 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
806 dependencies: [qemuutil, libcap_ng],
807 install: true,
808 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400809
810 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
811 dependencies: [authz, crypto, io, qom, qemuutil,
812 libcap_ng, libudev, libmpathpersist],
813 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +0400814 endif
815
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400816 if 'CONFIG_IVSHMEM' in config_host
817 subdir('contrib/ivshmem-client')
818 subdir('contrib/ivshmem-server')
819 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +0100820endif
821
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100822subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +0400823subdir('pc-bios')
Paolo Bonzinice1c1e72020-01-28 16:41:44 +0100824subdir('tests')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100825
Paolo Bonzinif9332752020-02-03 13:28:38 +0100826summary_info = {}
827summary_info += {'Install prefix': config_host['prefix']}
828summary_info += {'BIOS directory': config_host['qemu_datadir']}
829summary_info += {'firmware path': config_host['qemu_firmwarepath']}
830summary_info += {'binary directory': config_host['bindir']}
831summary_info += {'library directory': config_host['libdir']}
832summary_info += {'module directory': config_host['qemu_moddir']}
833summary_info += {'libexec directory': config_host['libexecdir']}
834summary_info += {'include directory': config_host['includedir']}
835summary_info += {'config directory': config_host['sysconfdir']}
836if targetos != 'windows'
837 summary_info += {'local state directory': config_host['qemu_localstatedir']}
838 summary_info += {'Manual directory': config_host['mandir']}
839else
840 summary_info += {'local state directory': 'queried at runtime'}
841endif
842summary_info += {'Build directory': meson.current_build_dir()}
843summary_info += {'Source path': meson.current_source_dir()}
844summary_info += {'GIT binary': config_host['GIT']}
845summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
846summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
847summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
848if link_language == 'cpp'
849 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
850else
851 summary_info += {'C++ compiler': false}
852endif
853if targetos == 'darwin'
854 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
855endif
856summary_info += {'ARFLAGS': config_host['ARFLAGS']}
857summary_info += {'CFLAGS': config_host['CFLAGS']}
858summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
859summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
860summary_info += {'make': config_host['MAKE']}
861summary_info += {'install': config_host['INSTALL']}
862summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
863summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
864summary_info += {'genisoimage': config_host['GENISOIMAGE']}
865# TODO: add back version
866summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
867if config_host.has_key('CONFIG_SLIRP')
868 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
869endif
870summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
871if config_host.has_key('CONFIG_MODULES')
872 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
873endif
874summary_info += {'host CPU': cpu}
875summary_info += {'host endianness': build_machine.endian()}
876summary_info += {'target list': config_host['TARGET_DIRS']}
877summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
878summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
879summary_info += {'strip binaries': get_option('strip')}
880summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
881summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
882if targetos == 'darwin'
883 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
884endif
885# TODO: add back version
886summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
887summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
888# TODO: add back version
889summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
890summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
891# TODO: add back version
892summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
893summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
894summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
895# TODO: add back version
896summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
897if config_host.has_key('CONFIG_GCRYPT')
898 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
899 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
900endif
901# TODO: add back version
902summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
903if config_host.has_key('CONFIG_NETTLE')
904 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
905endif
906summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
907summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
908summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
909summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
910# TODO: add back version
911summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
912summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
913summary_info += {'mingw32 support': targetos == 'windows'}
914summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
915summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
916summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
917summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
918summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
919summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
920if config_host.has_key('CONFIG_VNC')
921 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
922 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
923 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
924endif
925summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
926if config_host.has_key('CONFIG_XEN_BACKEND')
927 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
928endif
929summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
930summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
931summary_info += {'PIE': get_option('b_pie')}
932summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
933summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
934summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
935summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
936summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
937summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
938# TODO: add back KVM/HAX/HVF/WHPX/TCG
939#summary_info += {'KVM support': have_kvm'}
940#summary_info += {'HAX support': have_hax'}
941#summary_info += {'HVF support': have_hvf'}
942#summary_info += {'WHPX support': have_whpx'}
943#summary_info += {'TCG support': have_tcg'}
944#if get_option('tcg')
945# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
946# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
947#endif
948summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
949summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
950summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
951summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
952summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
953summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
954summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
955summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
956summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
957summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
958summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
959summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
960summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
961summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
962summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
963summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
964summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
965summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
966summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
967if config_host['TRACE_BACKENDS'].split().contains('simple')
968 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
969endif
970# TODO: add back protocol and server version
971summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
972summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
973summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
974summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
975summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
976summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
977summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
978summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
979summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
980summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
981summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
982if targetos == 'windows'
983 if 'WIN_SDK' in config_host
984 summary_info += {'Windows SDK': config_host['WIN_SDK']}
985 endif
986 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
987 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
988 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
989endif
990summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
991summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
992summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
993summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
994summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
995summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
996summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +0400997summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +0100998summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
999summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1000summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1001summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1002summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1003summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1004summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1005summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1006summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1007summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1008summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1009summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1010summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1011summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1012summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1013summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1014summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1015summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1016summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1017summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1018summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1019summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1020summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1021summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1022summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1023summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1024summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1025summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1026summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1027summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1028summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1029summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1030if config_host.has_key('HAVE_GDB_BIN')
1031 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1032endif
1033summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1034summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1035summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1036summary(summary_info, bool_yn: true)
1037
1038if not supported_cpus.contains(cpu)
1039 message()
1040 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1041 message()
1042 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1043 message('The QEMU project intends to remove support for this host CPU in')
1044 message('a future release if nobody volunteers to maintain it and to')
1045 message('provide a build host for our continuous integration setup.')
1046 message('configure has succeeded and you can continue to build, but')
1047 message('if you care about QEMU on this platform you should contact')
1048 message('us upstream at qemu-devel@nongnu.org.')
1049endif
1050
1051if not supported_oses.contains(targetos)
1052 message()
1053 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1054 message()
1055 message('Host OS ' + targetos + 'support is not currently maintained.')
1056 message('The QEMU project intends to remove support for this host OS in')
1057 message('a future release if nobody volunteers to maintain it and to')
1058 message('provide a build host for our continuous integration setup.')
1059 message('configure has succeeded and you can continue to build, but')
1060 message('if you care about QEMU on this platform you should contact')
1061 message('us upstream at qemu-devel@nongnu.org.')
1062endif