blob: 5b1608df09f94fbf3480b1cdb5c79b2e6ff0e79f [file] [log] [blame]
Paolo Bonzinia5665052019-06-10 12:05:14 +02001project('qemu', ['c'], meson_version: '>=0.55.0',
2 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_lundef=false'],
3 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
4
5not_found = dependency('', required: false)
6keyval = import('unstable-keyval')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04007ss = import('sourceset')
8
Paolo Bonzinice1c1e72020-01-28 16:41:44 +01009sh = find_program('sh')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040010cc = meson.get_compiler('c')
Paolo Bonzinia5665052019-06-10 12:05:14 +020011config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Paolo Bonzini2becc362020-02-03 11:42:03 +010012config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
Marc-André Lureau3154fee2019-08-29 22:07:01 +040013enable_modules = 'CONFIG_MODULES' in config_host
Paolo Bonzinia5665052019-06-10 12:05:14 +020014
15add_project_arguments(config_host['QEMU_CFLAGS'].split(),
16 native: false, language: ['c', 'objc'])
17add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
18 native: false, language: 'cpp')
19add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
20 native: false, language: ['c', 'cpp', 'objc'])
21add_project_arguments(config_host['QEMU_INCLUDES'].split(),
22 language: ['c', 'cpp', 'objc'])
23
Marc-André Lureaufc929892019-07-13 01:47:54 +040024python = import('python').find_installation()
25
26link_language = meson.get_external_property('link_language', 'cpp')
27if link_language == 'cpp'
28 add_languages('cpp', required: true, native: false)
29endif
Paolo Bonzinia5665052019-06-10 12:05:14 +020030if host_machine.system() == 'darwin'
31 add_languages('objc', required: false, native: false)
32endif
33
Paolo Bonzini968b4db2020-02-03 14:45:33 +010034if 'SPARSE_CFLAGS' in config_host
35 run_target('sparse',
36 command: [find_program('scripts/check_sparse.py'),
37 config_host['SPARSE_CFLAGS'].split(),
38 'compile_commands.json'])
39endif
40
Paolo Bonzinia5665052019-06-10 12:05:14 +020041configure_file(input: files('scripts/ninjatool.py'),
42 output: 'ninjatool',
43 configuration: config_host)
Paolo Bonzinif9332752020-02-03 13:28:38 +010044
45supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
46supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
47 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
48
49cpu = host_machine.cpu_family()
50targetos = host_machine.system()
51
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040052m = cc.find_library('m', required: false)
53util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +020054winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040055socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +040056version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +040057coref = []
58iokit = []
59cocoa = []
60hvf = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040061if targetos == 'windows'
62 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +020063 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +040064
65 win = import('windows')
66 version_res = win.compile_resources('version.rc',
67 depend_files: files('pc-bios/qemu-nsis.ico'),
68 include_directories: include_directories('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +040069elif targetos == 'darwin'
70 coref = dependency('appleframeworks', modules: 'CoreFoundation')
71 iokit = dependency('appleframeworks', modules: 'IOKit')
72 cocoa = dependency('appleframeworks', modules: 'Cocoa')
73 hvf = dependency('appleframeworks', modules: 'Hypervisor')
Paolo Bonzinicfad62f2020-08-09 23:47:45 +020074elif targetos == 'sunos'
75 socket = [cc.find_library('socket'),
76 cc.find_library('nsl'),
77 cc.find_library('resolv')]
78elif targetos == 'haiku'
79 socket = [cc.find_library('posix_error_mapper'),
80 cc.find_library('network'),
81 cc.find_library('bsd')]
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040082endif
83glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
84 link_args: config_host['GLIB_LIBS'].split())
85gio = not_found
86if 'CONFIG_GIO' in config_host
87 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
88 link_args: config_host['GIO_LIBS'].split())
89endif
90lttng = not_found
91if 'CONFIG_TRACE_UST' in config_host
92 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
93endif
94urcubp = not_found
95if 'CONFIG_TRACE_UST' in config_host
96 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
97endif
98nettle = not_found
99if 'CONFIG_NETTLE' in config_host
100 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
101 link_args: config_host['NETTLE_LIBS'].split())
102endif
103gnutls = not_found
104if 'CONFIG_GNUTLS' in config_host
105 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
106 link_args: config_host['GNUTLS_LIBS'].split())
107endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400108pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
109 link_args: config_host['PIXMAN_LIBS'].split())
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400110pam = not_found
111if 'CONFIG_AUTH_PAM' in config_host
112 pam = cc.find_library('pam')
113endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400114libaio = cc.find_library('aio', required: false)
115zlib = not_found
116if 'CONFIG_ZLIB' in config_host
117 zlib = declare_dependency(compile_args: config_host['ZLIB_CFLAGS'].split(),
118 link_args: config_host['ZLIB_LIBS'].split())
119endif
120linux_io_uring = not_found
121if 'CONFIG_LINUX_IO_URING' in config_host
122 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
123 link_args: config_host['LINUX_IO_URING_LIBS'].split())
124endif
125libxml2 = not_found
126if 'CONFIG_LIBXML2' in config_host
127 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
128 link_args: config_host['LIBXML2_LIBS'].split())
129endif
130libnfs = not_found
131if 'CONFIG_LIBNFS' in config_host
132 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
133endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400134libattr = not_found
135if 'CONFIG_ATTR' in config_host
136 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
137endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100138seccomp = not_found
139if 'CONFIG_SECCOMP' in config_host
140 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
141 link_args: config_host['SECCOMP_LIBS'].split())
142endif
143libcap_ng = not_found
144if 'CONFIG_LIBCAP_NG' in config_host
145 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
146endif
Marc-André Lureauade60d42019-07-15 14:48:31 +0400147xkbcommon = not_found
148if 'CONFIG_XKBCOMMON' in config_host
149 xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(),
150 link_args: config_host['XKBCOMMON_LIBS'].split())
151endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400152slirp = not_found
153if config_host.has_key('CONFIG_SLIRP')
154 slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
155 link_args: config_host['SLIRP_LIBS'].split())
156endif
157vde = not_found
158if config_host.has_key('CONFIG_VDE')
159 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
160endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200161pulse = not_found
162if 'CONFIG_LIBPULSE' in config_host
163 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
164 link_args: config_host['PULSE_LIBS'].split())
165endif
166alsa = not_found
167if 'CONFIG_ALSA' in config_host
168 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
169 link_args: config_host['ALSA_LIBS'].split())
170endif
171jack = not_found
172if 'CONFIG_LIBJACK' in config_host
173 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
174endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200175spice = not_found
176if 'CONFIG_SPICE' in config_host
177 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
178 link_args: config_host['SPICE_LIBS'].split())
179endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400180rt = cc.find_library('rt', required: false)
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400181libmpathpersist = not_found
182if config_host.has_key('CONFIG_MPATH')
183 libmpathpersist = cc.find_library('mpathpersist')
184endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200185libiscsi = not_found
186if 'CONFIG_LIBISCSI' in config_host
187 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
188 link_args: config_host['LIBISCSI_LIBS'].split())
189endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400190zstd = not_found
191if 'CONFIG_ZSTD' in config_host
192 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
193 link_args: config_host['ZSTD_LIBS'].split())
194endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400195gbm = not_found
196if 'CONFIG_GBM' in config_host
197 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
198 link_args: config_host['GBM_LIBS'].split())
199endif
200virgl = not_found
201if 'CONFIG_VIRGL' in config_host
202 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
203 link_args: config_host['VIRGL_LIBS'].split())
204endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400205curl = not_found
206if 'CONFIG_CURL' in config_host
207 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
208 link_args: config_host['CURL_LIBS'].split())
209endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200210libudev = not_found
211if 'CONFIG_LIBUDEV' in config_host
212 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
213endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200214brlapi = not_found
215if 'CONFIG_BRLAPI' in config_host
216 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
217endif
218sdl = not_found
219if 'CONFIG_SDL' in config_host
220 sdl = declare_dependency(compile_args: config_host['SDL_CFLAGS'].split(),
221 link_args: config_host['SDL_LIBS'].split())
222endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400223rbd = not_found
224if 'CONFIG_RBD' in config_host
225 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
226endif
227glusterfs = not_found
228if 'CONFIG_GLUSTERFS' in config_host
229 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
230 link_args: config_host['GLUSTERFS_LIBS'].split())
231endif
232libssh = not_found
233if 'CONFIG_LIBSSH' in config_host
234 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
235 link_args: config_host['LIBSSH_LIBS'].split())
236endif
237libbzip2 = not_found
238if 'CONFIG_BZIP2' in config_host
239 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
240endif
241liblzfse = not_found
242if 'CONFIG_LZFSE' in config_host
243 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
244endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200245oss = not_found
246if 'CONFIG_AUDIO_OSS' in config_host
247 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
248endif
249dsound = not_found
250if 'CONFIG_AUDIO_DSOUND' in config_host
251 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
252endif
253coreaudio = not_found
254if 'CONFIG_AUDIO_COREAUDIO' in config_host
255 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
256endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400257opengl = not_found
258if 'CONFIG_OPENGL' in config_host
259 opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
260else
261endif
262gtk = not_found
263if 'CONFIG_GTK' in config_host
264 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
265 link_args: config_host['GTK_LIBS'].split())
266endif
267vte = not_found
268if 'CONFIG_VTE' in config_host
269 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
270 link_args: config_host['VTE_LIBS'].split())
271endif
272x11 = not_found
273if 'CONFIG_X11' in config_host
274 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
275 link_args: config_host['X11_LIBS'].split())
276endif
277curses = not_found
278if 'CONFIG_CURSES' in config_host
279 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
280 link_args: config_host['CURSES_LIBS'].split())
281endif
282iconv = not_found
283if 'CONFIG_ICONV' in config_host
284 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
285 link_args: config_host['ICONV_LIBS'].split())
286endif
287gio = not_found
288if 'CONFIG_GIO' in config_host
289 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
290 link_args: config_host['GIO_LIBS'].split())
291endif
292png = not_found
293if 'CONFIG_VNC_PNG' in config_host
294 png = declare_dependency(compile_args: config_host['PNG_CFLAGS'].split(),
295 link_args: config_host['PNG_LIBS'].split())
296endif
297jpeg = not_found
298if 'CONFIG_VNC_JPEG' in config_host
299 jpeg = declare_dependency(compile_args: config_host['JPEG_CFLAGS'].split(),
300 link_args: config_host['JPEG_LIBS'].split())
301endif
302sasl = not_found
303if 'CONFIG_VNC_SASL' in config_host
304 sasl = declare_dependency(compile_args: config_host['SASL_CFLAGS'].split(),
305 link_args: config_host['SASL_LIBS'].split())
306endif
Paolo Bonzini4a963372020-08-03 16:22:28 +0200307fdt = not_found
308if 'CONFIG_FDT' in config_host
309 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
310 link_args: config_host['FDT_LIBS'].split())
311endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400312snappy = not_found
313if 'CONFIG_SNAPPY' in config_host
314 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
315endif
316lzo = not_found
317if 'CONFIG_LZO' in config_host
318 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
319endif
Marc-André Lureau55166232019-07-24 19:16:22 +0400320rdma = not_found
321if 'CONFIG_RDMA' in config_host
322 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
323endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400324numa = not_found
325if 'CONFIG_NUMA' in config_host
326 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
327endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400328xen = not_found
329if 'CONFIG_XEN_BACKEND' in config_host
330 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
331 link_args: config_host['XEN_LIBS'].split())
332endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200333cacard = not_found
334if 'CONFIG_SMARTCARD' in config_host
335 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
336 link_args: config_host['SMARTCARD_LIBS'].split())
337endif
338usbredir = not_found
339if 'CONFIG_USB_REDIR' in config_host
340 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
341 link_args: config_host['USB_REDIR_LIBS'].split())
342endif
343libusb = not_found
344if 'CONFIG_USB_LIBUSB' in config_host
345 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
346 link_args: config_host['LIBUSB_LIBS'].split())
347endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400348capstone = not_found
349if 'CONFIG_CAPSTONE' in config_host
350 capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(),
351 link_args: config_host['CAPSTONE_LIBS'].split())
352endif
353libpmem = not_found
354if 'CONFIG_LIBPMEM' in config_host
355 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
356 link_args: config_host['LIBPMEM_LIBS'].split())
357endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400358
Paolo Bonzini2becc362020-02-03 11:42:03 +0100359create_config = find_program('scripts/create_config')
360minikconf = find_program('scripts/minikconf.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400361target_dirs = config_host['TARGET_DIRS'].split()
362have_user = false
363have_system = false
Paolo Bonzini2becc362020-02-03 11:42:03 +0100364config_devices_mak_list = []
365config_devices_h = {}
366config_target_mak = {}
367kconfig_external_symbols = [
368 'CONFIG_KVM',
369 'CONFIG_XEN',
370 'CONFIG_TPM',
371 'CONFIG_SPICE',
372 'CONFIG_IVSHMEM',
373 'CONFIG_OPENGL',
374 'CONFIG_X11',
375 'CONFIG_VHOST_USER',
376 'CONFIG_VHOST_KERNEL',
377 'CONFIG_VIRTFS',
378 'CONFIG_LINUX',
379 'CONFIG_PVRDMA',
380]
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400381foreach target : target_dirs
382 have_user = have_user or target.endswith('-user')
Paolo Bonzini2becc362020-02-03 11:42:03 +0100383 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
384
385 if target.endswith('-softmmu')
386 have_system = true
387
388 base_kconfig = []
389 foreach sym : kconfig_external_symbols
390 if sym in config_target
391 base_kconfig += '@0@=y'.format(sym)
392 endif
393 endforeach
394
395 config_devices_mak = target + '-config-devices.mak'
396 config_devices_mak = configure_file(
397 input: ['default-configs' / target + '.mak', 'Kconfig'],
398 output: config_devices_mak,
399 depfile: config_devices_mak + '.d',
400 capture: true,
401 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
402 config_devices_mak, '@DEPFILE@', '@INPUT@',
403 base_kconfig])
404 config_devices_h += {target: custom_target(
405 target + '-config-devices.h',
406 input: config_devices_mak,
407 output: target + '-config-devices.h',
408 capture: true,
409 command: [create_config, '@INPUT@'])}
410 config_devices_mak_list += config_devices_mak
411 config_target += keyval.load(config_devices_mak)
412 endif
413 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400414endforeach
415have_tools = 'CONFIG_TOOLS' in config_host
416have_block = have_system or have_tools
417
Paolo Bonzini2becc362020-02-03 11:42:03 +0100418grepy = find_program('scripts/grepy.sh')
419# This configuration is used to build files that are shared by
420# multiple binaries, and then extracted out of the "common"
421# static_library target.
422#
423# We do not use all_sources()/all_dependencies(), because it would
424# build literally all source files, including devices only used by
425# targets that are not built for this compilation. The CONFIG_ALL
426# pseudo symbol replaces it.
427
428if have_system
429 config_all_devices_mak = configure_file(
430 output: 'config-all-devices.mak',
431 input: config_devices_mak_list,
432 capture: true,
433 command: [grepy, '@INPUT@'],
434 )
435 config_all_devices = keyval.load(config_all_devices_mak)
436else
437 config_all_devices = {}
438endif
439config_all = config_all_devices
440config_all += config_host
441config_all += config_all_disas
442config_all += {
443 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
444 'CONFIG_SOFTMMU': have_system,
445 'CONFIG_USER_ONLY': have_user,
446 'CONFIG_ALL': true,
447}
448
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400449# Generators
450
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400451genh = []
Marc-André Lureau3f885652019-07-15 18:06:04 +0400452hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +0400453shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400454qapi_gen = find_program('scripts/qapi-gen.py')
455qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
456 meson.source_root() / 'scripts/qapi/commands.py',
457 meson.source_root() / 'scripts/qapi/common.py',
458 meson.source_root() / 'scripts/qapi/doc.py',
459 meson.source_root() / 'scripts/qapi/error.py',
460 meson.source_root() / 'scripts/qapi/events.py',
461 meson.source_root() / 'scripts/qapi/expr.py',
462 meson.source_root() / 'scripts/qapi/gen.py',
463 meson.source_root() / 'scripts/qapi/introspect.py',
464 meson.source_root() / 'scripts/qapi/parser.py',
465 meson.source_root() / 'scripts/qapi/schema.py',
466 meson.source_root() / 'scripts/qapi/source.py',
467 meson.source_root() / 'scripts/qapi/types.py',
468 meson.source_root() / 'scripts/qapi/visit.py',
469 meson.source_root() / 'scripts/qapi/common.py',
470 meson.source_root() / 'scripts/qapi/doc.py',
471 meson.source_root() / 'scripts/qapi-gen.py'
472]
473
474tracetool = [
475 python, files('scripts/tracetool.py'),
476 '--backend=' + config_host['TRACE_BACKENDS']
477]
478
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400479qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
480 meson.current_source_dir(),
481 config_host['PKGVERSION'], config_host['VERSION']]
482qemu_version = custom_target('qemu-version.h',
483 output: 'qemu-version.h',
484 command: qemu_version_cmd,
485 capture: true,
486 build_by_default: true,
487 build_always_stale: true)
488genh += qemu_version
489
Paolo Bonzini2becc362020-02-03 11:42:03 +0100490config_host_h = custom_target('config-host.h',
491 input: meson.current_build_dir() / 'config-host.mak',
492 output: 'config-host.h',
493 capture: true,
494 command: [create_config, '@INPUT@'])
495genh += config_host_h
496
Marc-André Lureau3f885652019-07-15 18:06:04 +0400497hxdep = []
498hx_headers = [
499 ['qemu-options.hx', 'qemu-options.def'],
500 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
501]
502if have_system
503 hx_headers += [
504 ['hmp-commands.hx', 'hmp-commands.h'],
505 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
506 ]
507endif
508foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400509 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +0400510 input: files(d[0]),
511 output: d[1],
512 capture: true,
513 build_by_default: true, # to be removed when added to a target
514 command: [hxtool, '-h', '@INPUT0@'])
515endforeach
516genh += hxdep
517
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400518# Collect sourcesets.
519
520util_ss = ss.source_set()
521stub_ss = ss.source_set()
522trace_ss = ss.source_set()
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400523block_ss = ss.source_set()
Paolo Bonzini4a963372020-08-03 16:22:28 +0200524blockdev_ss = ss.source_set()
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200525qmp_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +0100526common_ss = ss.source_set()
527softmmu_ss = ss.source_set()
528user_ss = ss.source_set()
529bsd_user_ss = ss.source_set()
530linux_user_ss = ss.source_set()
531specific_ss = ss.source_set()
532
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400533modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100534hw_arch = {}
535target_arch = {}
536target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400537
538###############
539# Trace files #
540###############
541
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400542# TODO: add each directory to the subdirs from its own meson.build, once
543# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400544trace_events_subdirs = [
545 'accel/kvm',
546 'accel/tcg',
547 'crypto',
548 'monitor',
549]
550if have_user
551 trace_events_subdirs += [ 'linux-user' ]
552endif
553if have_block
554 trace_events_subdirs += [
555 'authz',
556 'block',
557 'io',
558 'nbd',
559 'scsi',
560 ]
561endif
562if have_system
563 trace_events_subdirs += [
564 'audio',
565 'backends',
566 'backends/tpm',
567 'chardev',
568 'hw/9pfs',
569 'hw/acpi',
570 'hw/alpha',
571 'hw/arm',
572 'hw/audio',
573 'hw/block',
574 'hw/block/dataplane',
575 'hw/char',
576 'hw/display',
577 'hw/dma',
578 'hw/hppa',
579 'hw/hyperv',
580 'hw/i2c',
581 'hw/i386',
582 'hw/i386/xen',
583 'hw/ide',
584 'hw/input',
585 'hw/intc',
586 'hw/isa',
587 'hw/mem',
588 'hw/mips',
589 'hw/misc',
590 'hw/misc/macio',
591 'hw/net',
592 'hw/nvram',
593 'hw/pci',
594 'hw/pci-host',
595 'hw/ppc',
596 'hw/rdma',
597 'hw/rdma/vmw',
598 'hw/rtc',
599 'hw/s390x',
600 'hw/scsi',
601 'hw/sd',
602 'hw/sparc',
603 'hw/sparc64',
604 'hw/ssi',
605 'hw/timer',
606 'hw/tpm',
607 'hw/usb',
608 'hw/vfio',
609 'hw/virtio',
610 'hw/watchdog',
611 'hw/xen',
612 'hw/gpio',
613 'hw/riscv',
614 'migration',
615 'net',
616 'ui',
617 ]
618endif
619trace_events_subdirs += [
620 'hw/core',
621 'qapi',
622 'qom',
623 'target/arm',
624 'target/hppa',
625 'target/i386',
626 'target/mips',
627 'target/ppc',
628 'target/riscv',
629 'target/s390x',
630 'target/sparc',
631 'util',
632]
633
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400634subdir('qapi')
635subdir('qobject')
636subdir('stubs')
637subdir('trace')
638subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +0400639subdir('qom')
640subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400641subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +0400642subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400643
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400644
645if enable_modules
646 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
647 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
648endif
649
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400650# Build targets from sourcesets
651
Paolo Bonzini2becc362020-02-03 11:42:03 +0100652stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400653
654util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +0100655util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400656libqemuutil = static_library('qemuutil',
657 sources: util_ss.sources() + stub_ss.sources() + genh,
658 dependencies: [util_ss.dependencies(), m, glib, socket])
659qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400660 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400661
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200662decodetree = generator(find_program('scripts/decodetree.py'),
663 output: 'decode-@BASENAME@.c.inc',
664 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
665
Paolo Bonzini478e9432020-08-17 12:47:55 +0200666subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +0400667subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +0400668subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400669subdir('fsdev')
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200670subdir('libdecnumber')
Marc-André Lureaud3b18482019-08-17 14:55:32 +0400671subdir('target')
Marc-André Lureau708eab42019-09-03 16:59:33 +0400672subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400673
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400674block_ss.add(files(
675 'block.c',
676 'blockjob.c',
677 'job.c',
678 'qemu-io-cmds.c',
679))
680block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
681
682subdir('nbd')
683subdir('scsi')
684subdir('block')
685
Paolo Bonzini4a963372020-08-03 16:22:28 +0200686blockdev_ss.add(files(
687 'blockdev.c',
688 'blockdev-nbd.c',
689 'iothread.c',
690 'job-qmp.c',
691))
692
693# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
694# os-win32.c does not
695blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
696softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
697
698softmmu_ss.add_all(blockdev_ss)
699softmmu_ss.add(files(
700 'bootdevice.c',
701 'dma-helpers.c',
702 'qdev-monitor.c',
703), sdl)
704
705softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
706softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
707softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
708
709common_ss.add(files('cpus-common.c'))
710
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +0200711subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400712
713specific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem)
714specific_ss.add(files('exec-vary.c'))
715specific_ss.add(when: 'CONFIG_TCG', if_true: files(
716 'fpu/softfloat.c',
717 'tcg/optimize.c',
718 'tcg/tcg-common.c',
719 'tcg/tcg-op-gvec.c',
720 'tcg/tcg-op-vec.c',
721 'tcg/tcg-op.c',
722 'tcg/tcg.c',
723))
724specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
725
Marc-André Lureauab318052019-07-24 19:23:16 +0400726subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +0400727subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +0400728subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200729subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400730subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +0400731subdir('replay')
Marc-André Lureau582ea952019-08-15 15:15:32 +0400732subdir('hw')
Marc-André Lureau1a828782019-08-18 16:13:08 +0400733subdir('accel')
Marc-André Lureaub309c322019-08-18 19:20:37 +0400734subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +0400735subdir('linux-user')
736
Marc-André Lureaub309c322019-08-18 19:20:37 +0400737bsd_user_ss.add(files('gdbstub.c'))
738specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
739
Marc-André Lureau3a304462019-08-18 16:13:08 +0400740linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
741specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +0200742
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +0200743# needed for fuzzing binaries
744subdir('tests/qtest/libqos')
745
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400746block_mods = []
747softmmu_mods = []
748foreach d, list : modules
749 foreach m, module_ss : list
750 if enable_modules and targetos != 'windows'
751 module_ss = module_ss.apply(config_host, strict: false)
752 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
753 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
754 if d == 'block'
755 block_mods += sl
756 else
757 softmmu_mods += sl
758 endif
759 else
760 if d == 'block'
761 block_ss.add_all(module_ss)
762 else
763 softmmu_ss.add_all(module_ss)
764 endif
765 endif
766 endforeach
767endforeach
768
769nm = find_program('nm')
770undefsym = find_program('scripts/undefsym.sh')
771block_syms = custom_target('block.syms', output: 'block.syms',
772 input: [libqemuutil, block_mods],
773 capture: true,
774 command: [undefsym, nm, '@INPUT@'])
775qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
776 input: [libqemuutil, softmmu_mods],
777 capture: true,
778 command: [undefsym, nm, '@INPUT@'])
779
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400780block_ss = block_ss.apply(config_host, strict: false)
781libblock = static_library('block', block_ss.sources() + genh,
782 dependencies: block_ss.dependencies(),
783 link_depends: block_syms,
784 name_suffix: 'fa',
785 build_by_default: false)
786
787block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400788 link_args: '@block.syms',
789 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400790
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200791qmp_ss = qmp_ss.apply(config_host, strict: false)
792libqmp = static_library('qmp', qmp_ss.sources() + genh,
793 dependencies: qmp_ss.dependencies(),
794 name_suffix: 'fa',
795 build_by_default: false)
796
797qmp = declare_dependency(link_whole: [libqmp])
798
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400799foreach m : block_mods + softmmu_mods
800 shared_module(m.name(),
801 name_prefix: '',
802 link_whole: m,
803 install: true,
804 install_dir: config_host['qemu_moddir'])
805endforeach
806
Paolo Bonzini2becc362020-02-03 11:42:03 +0100807common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
808common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
809
810common_all = common_ss.apply(config_all, strict: false)
811common_all = static_library('common',
812 build_by_default: false,
813 sources: common_all.sources() + genh,
814 dependencies: common_all.dependencies(),
815 name_suffix: 'fa')
816
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400817feature_to_c = find_program('scripts/feature_to_c.sh')
818
Paolo Bonzini2becc362020-02-03 11:42:03 +0100819foreach target : target_dirs
820 config_target = config_target_mak[target]
821 target_name = config_target['TARGET_NAME']
822 arch = config_target['TARGET_BASE_ARCH']
823 arch_srcs = []
824
825 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
826 if targetos == 'linux'
827 target_inc += include_directories('linux-headers', is_system: true)
828 endif
829 if target.endswith('-softmmu')
830 qemu_target_name = 'qemu-system-' + target_name
831 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200832 t = target_softmmu_arch[arch].apply(config_target, strict: false)
833 arch_srcs += t.sources()
834
Marc-André Lureau2c442202019-08-17 13:55:58 +0400835 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
836 hw = hw_arch[hw_dir].apply(config_target, strict: false)
837 arch_srcs += hw.sources()
838
Paolo Bonzini2becc362020-02-03 11:42:03 +0100839 arch_srcs += config_devices_h[target]
840 else
Marc-André Lureau3a304462019-08-18 16:13:08 +0400841 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +0100842 target_type='user'
843 qemu_target_name = 'qemu-' + target_name
844 if 'CONFIG_LINUX_USER' in config_target
845 base_dir = 'linux-user'
846 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
847 else
848 base_dir = 'bsd-user'
849 endif
850 target_inc += include_directories(
851 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +0400852 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +0100853 )
Marc-André Lureau3a304462019-08-18 16:13:08 +0400854 if 'CONFIG_LINUX_USER' in config_target
855 dir = base_dir / abi
856 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
857 if config_target.has_key('TARGET_SYSTBL_ABI')
858 arch_srcs += \
859 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
860 extra_args : config_target['TARGET_SYSTBL_ABI'])
861 endif
862 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +0100863 endif
864
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400865 if 'TARGET_XML_FILES' in config_target
866 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
867 output: target + '-gdbstub-xml.c',
868 input: files(config_target['TARGET_XML_FILES'].split()),
869 command: [feature_to_c, '@INPUT@'],
870 capture: true)
871 arch_srcs += gdbstub_xml
872 endif
873
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200874 t = target_arch[arch].apply(config_target, strict: false)
875 arch_srcs += t.sources()
876
Paolo Bonzini2becc362020-02-03 11:42:03 +0100877 target_common = common_ss.apply(config_target, strict: false)
878 objects = common_all.extract_objects(target_common.sources())
879
880 # TODO: Change to generator once obj-y goes away
881 config_target_h = custom_target(target + '-config-target.h',
882 input: meson.current_build_dir() / target / 'config-target.mak',
883 output: target + '-config-target.h',
884 capture: true,
885 command: [create_config, '@INPUT@'])
886
887 target_specific = specific_ss.apply(config_target, strict: false)
888 arch_srcs += target_specific.sources()
889
890 static_library('qemu-' + target,
891 sources: arch_srcs + [config_target_h] + genh,
892 objects: objects,
893 include_directories: target_inc,
894 c_args: ['-DNEED_CPU_H',
895 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
896 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
897 name_suffix: 'fa')
898endforeach
899
Paolo Bonzini931049b2020-02-05 09:44:24 +0100900# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400901
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200902if 'CONFIG_GUEST_AGENT' in config_host
903 subdir('qga')
904endif
905
Paolo Bonzini931049b2020-02-05 09:44:24 +0100906if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400907 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
908 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
909 qemu_io = executable('qemu-io', files('qemu-io.c'),
910 dependencies: [block, qemuutil], install: true)
911 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
912 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
913 dependencies: [block, qemuutil], install: true)
914 endif
915
Paolo Bonzini7c58bb72020-08-04 20:18:36 +0200916 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +0200917 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400918 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +0200919
Marc-André Lureauade60d42019-07-15 14:48:31 +0400920 if 'CONFIG_XKBCOMMON' in config_host
921 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
922 dependencies: [qemuutil, xkbcommon], install: true)
923 endif
924
Marc-André Lureau157e7b12019-07-15 14:50:58 +0400925 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
926 dependencies: qemuutil,
927 install: true)
928
Paolo Bonzini931049b2020-02-05 09:44:24 +0100929 if 'CONFIG_VHOST_USER' in config_host
930 subdir('contrib/libvhost-user')
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +0200931 subdir('contrib/vhost-user-blk')
Marc-André Lureauea458962019-07-12 22:23:46 +0400932 if 'CONFIG_LINUX' in config_host
933 subdir('contrib/vhost-user-gpu')
934 endif
Marc-André Lureau32fcc622019-07-12 22:11:20 +0400935 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +0200936 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +0100937 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +0400938
939 if targetos == 'linux'
940 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
941 dependencies: [qemuutil, libcap_ng],
942 install: true,
943 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400944
945 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
946 dependencies: [authz, crypto, io, qom, qemuutil,
947 libcap_ng, libudev, libmpathpersist],
948 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +0400949 endif
950
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400951 if 'CONFIG_IVSHMEM' in config_host
952 subdir('contrib/ivshmem-client')
953 subdir('contrib/ivshmem-server')
954 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +0100955endif
956
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100957subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +0400958subdir('pc-bios')
Paolo Bonzinice1c1e72020-01-28 16:41:44 +0100959subdir('tests')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100960
Paolo Bonzinif9332752020-02-03 13:28:38 +0100961summary_info = {}
962summary_info += {'Install prefix': config_host['prefix']}
963summary_info += {'BIOS directory': config_host['qemu_datadir']}
964summary_info += {'firmware path': config_host['qemu_firmwarepath']}
965summary_info += {'binary directory': config_host['bindir']}
966summary_info += {'library directory': config_host['libdir']}
967summary_info += {'module directory': config_host['qemu_moddir']}
968summary_info += {'libexec directory': config_host['libexecdir']}
969summary_info += {'include directory': config_host['includedir']}
970summary_info += {'config directory': config_host['sysconfdir']}
971if targetos != 'windows'
972 summary_info += {'local state directory': config_host['qemu_localstatedir']}
973 summary_info += {'Manual directory': config_host['mandir']}
974else
975 summary_info += {'local state directory': 'queried at runtime'}
976endif
977summary_info += {'Build directory': meson.current_build_dir()}
978summary_info += {'Source path': meson.current_source_dir()}
979summary_info += {'GIT binary': config_host['GIT']}
980summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
981summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
982summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
983if link_language == 'cpp'
984 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
985else
986 summary_info += {'C++ compiler': false}
987endif
988if targetos == 'darwin'
989 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
990endif
991summary_info += {'ARFLAGS': config_host['ARFLAGS']}
992summary_info += {'CFLAGS': config_host['CFLAGS']}
993summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
994summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
995summary_info += {'make': config_host['MAKE']}
996summary_info += {'install': config_host['INSTALL']}
997summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
998summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
999summary_info += {'genisoimage': config_host['GENISOIMAGE']}
1000# TODO: add back version
1001summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
1002if config_host.has_key('CONFIG_SLIRP')
1003 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
1004endif
1005summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
1006if config_host.has_key('CONFIG_MODULES')
1007 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1008endif
1009summary_info += {'host CPU': cpu}
1010summary_info += {'host endianness': build_machine.endian()}
1011summary_info += {'target list': config_host['TARGET_DIRS']}
1012summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
1013summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
1014summary_info += {'strip binaries': get_option('strip')}
1015summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
1016summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
1017if targetos == 'darwin'
1018 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1019endif
1020# TODO: add back version
1021summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
1022summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
1023# TODO: add back version
1024summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
1025summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
1026# TODO: add back version
1027summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
1028summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
1029summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
1030# TODO: add back version
1031summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
1032if config_host.has_key('CONFIG_GCRYPT')
1033 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
1034 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1035endif
1036# TODO: add back version
1037summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
1038if config_host.has_key('CONFIG_NETTLE')
1039 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1040endif
1041summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1042summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1043summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1044summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1045# TODO: add back version
1046summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1047summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1048summary_info += {'mingw32 support': targetos == 'windows'}
1049summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1050summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1051summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1052summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
1053summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
1054summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
1055if config_host.has_key('CONFIG_VNC')
1056 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
1057 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
1058 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
1059endif
1060summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1061if config_host.has_key('CONFIG_XEN_BACKEND')
1062 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1063endif
1064summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1065summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1066summary_info += {'PIE': get_option('b_pie')}
1067summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1068summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1069summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1070summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1071summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1072summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1073# TODO: add back KVM/HAX/HVF/WHPX/TCG
1074#summary_info += {'KVM support': have_kvm'}
1075#summary_info += {'HAX support': have_hax'}
1076#summary_info += {'HVF support': have_hvf'}
1077#summary_info += {'WHPX support': have_whpx'}
1078#summary_info += {'TCG support': have_tcg'}
1079#if get_option('tcg')
1080# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1081# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1082#endif
1083summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1084summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1085summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1086summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
1087summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1088summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1089summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1090summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1091summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1092summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1093summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1094summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1095summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1096summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1097summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1098summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1099summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1100summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1101summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1102if config_host['TRACE_BACKENDS'].split().contains('simple')
1103 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1104endif
1105# TODO: add back protocol and server version
1106summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1107summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1108summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1109summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1110summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1111summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1112summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1113summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1114summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1115summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1116summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1117if targetos == 'windows'
1118 if 'WIN_SDK' in config_host
1119 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1120 endif
1121 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1122 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1123 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1124endif
1125summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1126summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1127summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1128summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1129summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1130summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1131summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +04001132summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001133summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1134summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1135summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1136summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1137summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1138summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1139summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1140summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1141summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1142summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1143summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1144summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1145summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1146summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1147summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1148summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1149summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1150summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1151summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1152summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1153summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1154summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1155summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1156summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1157summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1158summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1159summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1160summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1161summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1162summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1163summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1164summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1165if config_host.has_key('HAVE_GDB_BIN')
1166 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1167endif
1168summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1169summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1170summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1171summary(summary_info, bool_yn: true)
1172
1173if not supported_cpus.contains(cpu)
1174 message()
1175 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1176 message()
1177 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1178 message('The QEMU project intends to remove support for this host CPU in')
1179 message('a future release if nobody volunteers to maintain it and to')
1180 message('provide a build host for our continuous integration setup.')
1181 message('configure has succeeded and you can continue to build, but')
1182 message('if you care about QEMU on this platform you should contact')
1183 message('us upstream at qemu-devel@nongnu.org.')
1184endif
1185
1186if not supported_oses.contains(targetos)
1187 message()
1188 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1189 message()
1190 message('Host OS ' + targetos + 'support is not currently maintained.')
1191 message('The QEMU project intends to remove support for this host OS in')
1192 message('a future release if nobody volunteers to maintain it and to')
1193 message('provide a build host for our continuous integration setup.')
1194 message('configure has succeeded and you can continue to build, but')
1195 message('if you care about QEMU on this platform you should contact')
1196 message('us upstream at qemu-devel@nongnu.org.')
1197endif