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