blob: fa47410c29be9c9829fbdc5d8111c360f9b86326 [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')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +0100734subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +0400735subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +0400736subdir('linux-user')
737
Marc-André Lureaub309c322019-08-18 19:20:37 +0400738bsd_user_ss.add(files('gdbstub.c'))
739specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
740
Marc-André Lureau3a304462019-08-18 16:13:08 +0400741linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
742specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +0200743
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +0200744# needed for fuzzing binaries
745subdir('tests/qtest/libqos')
746
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400747block_mods = []
748softmmu_mods = []
749foreach d, list : modules
750 foreach m, module_ss : list
751 if enable_modules and targetos != 'windows'
752 module_ss = module_ss.apply(config_host, strict: false)
753 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
754 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
755 if d == 'block'
756 block_mods += sl
757 else
758 softmmu_mods += sl
759 endif
760 else
761 if d == 'block'
762 block_ss.add_all(module_ss)
763 else
764 softmmu_ss.add_all(module_ss)
765 endif
766 endif
767 endforeach
768endforeach
769
770nm = find_program('nm')
771undefsym = find_program('scripts/undefsym.sh')
772block_syms = custom_target('block.syms', output: 'block.syms',
773 input: [libqemuutil, block_mods],
774 capture: true,
775 command: [undefsym, nm, '@INPUT@'])
776qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
777 input: [libqemuutil, softmmu_mods],
778 capture: true,
779 command: [undefsym, nm, '@INPUT@'])
780
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400781block_ss = block_ss.apply(config_host, strict: false)
782libblock = static_library('block', block_ss.sources() + genh,
783 dependencies: block_ss.dependencies(),
784 link_depends: block_syms,
785 name_suffix: 'fa',
786 build_by_default: false)
787
788block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400789 link_args: '@block.syms',
790 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400791
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200792qmp_ss = qmp_ss.apply(config_host, strict: false)
793libqmp = static_library('qmp', qmp_ss.sources() + genh,
794 dependencies: qmp_ss.dependencies(),
795 name_suffix: 'fa',
796 build_by_default: false)
797
798qmp = declare_dependency(link_whole: [libqmp])
799
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400800foreach m : block_mods + softmmu_mods
801 shared_module(m.name(),
802 name_prefix: '',
803 link_whole: m,
804 install: true,
805 install_dir: config_host['qemu_moddir'])
806endforeach
807
Paolo Bonzini2becc362020-02-03 11:42:03 +0100808common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
809common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
810
811common_all = common_ss.apply(config_all, strict: false)
812common_all = static_library('common',
813 build_by_default: false,
814 sources: common_all.sources() + genh,
815 dependencies: common_all.dependencies(),
816 name_suffix: 'fa')
817
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400818feature_to_c = find_program('scripts/feature_to_c.sh')
819
Paolo Bonzini2becc362020-02-03 11:42:03 +0100820foreach target : target_dirs
821 config_target = config_target_mak[target]
822 target_name = config_target['TARGET_NAME']
823 arch = config_target['TARGET_BASE_ARCH']
824 arch_srcs = []
825
826 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
827 if targetos == 'linux'
828 target_inc += include_directories('linux-headers', is_system: true)
829 endif
830 if target.endswith('-softmmu')
831 qemu_target_name = 'qemu-system-' + target_name
832 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200833 t = target_softmmu_arch[arch].apply(config_target, strict: false)
834 arch_srcs += t.sources()
835
Marc-André Lureau2c442202019-08-17 13:55:58 +0400836 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
837 hw = hw_arch[hw_dir].apply(config_target, strict: false)
838 arch_srcs += hw.sources()
839
Paolo Bonzini2becc362020-02-03 11:42:03 +0100840 arch_srcs += config_devices_h[target]
841 else
Marc-André Lureau3a304462019-08-18 16:13:08 +0400842 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +0100843 target_type='user'
844 qemu_target_name = 'qemu-' + target_name
845 if 'CONFIG_LINUX_USER' in config_target
846 base_dir = 'linux-user'
847 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
848 else
849 base_dir = 'bsd-user'
850 endif
851 target_inc += include_directories(
852 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +0400853 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +0100854 )
Marc-André Lureau3a304462019-08-18 16:13:08 +0400855 if 'CONFIG_LINUX_USER' in config_target
856 dir = base_dir / abi
857 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
858 if config_target.has_key('TARGET_SYSTBL_ABI')
859 arch_srcs += \
860 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
861 extra_args : config_target['TARGET_SYSTBL_ABI'])
862 endif
863 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +0100864 endif
865
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400866 if 'TARGET_XML_FILES' in config_target
867 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
868 output: target + '-gdbstub-xml.c',
869 input: files(config_target['TARGET_XML_FILES'].split()),
870 command: [feature_to_c, '@INPUT@'],
871 capture: true)
872 arch_srcs += gdbstub_xml
873 endif
874
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200875 t = target_arch[arch].apply(config_target, strict: false)
876 arch_srcs += t.sources()
877
Paolo Bonzini2becc362020-02-03 11:42:03 +0100878 target_common = common_ss.apply(config_target, strict: false)
879 objects = common_all.extract_objects(target_common.sources())
880
881 # TODO: Change to generator once obj-y goes away
882 config_target_h = custom_target(target + '-config-target.h',
883 input: meson.current_build_dir() / target / 'config-target.mak',
884 output: target + '-config-target.h',
885 capture: true,
886 command: [create_config, '@INPUT@'])
887
888 target_specific = specific_ss.apply(config_target, strict: false)
889 arch_srcs += target_specific.sources()
890
891 static_library('qemu-' + target,
892 sources: arch_srcs + [config_target_h] + genh,
893 objects: objects,
894 include_directories: target_inc,
895 c_args: ['-DNEED_CPU_H',
896 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
897 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
898 name_suffix: 'fa')
899endforeach
900
Paolo Bonzini931049b2020-02-05 09:44:24 +0100901# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400902
Paolo Bonzinif556b4a2020-01-24 13:08:01 +0100903if 'CONFIG_PLUGIN' in config_host
904 install_headers('include/qemu/qemu-plugin.h')
905endif
906
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200907if 'CONFIG_GUEST_AGENT' in config_host
908 subdir('qga')
909endif
910
Paolo Bonzini931049b2020-02-05 09:44:24 +0100911if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400912 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
913 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
914 qemu_io = executable('qemu-io', files('qemu-io.c'),
915 dependencies: [block, qemuutil], install: true)
916 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
917 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
918 dependencies: [block, qemuutil], install: true)
919 endif
920
Paolo Bonzini7c58bb72020-08-04 20:18:36 +0200921 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +0200922 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400923 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +0200924
Marc-André Lureauade60d42019-07-15 14:48:31 +0400925 if 'CONFIG_XKBCOMMON' in config_host
926 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
927 dependencies: [qemuutil, xkbcommon], install: true)
928 endif
929
Marc-André Lureau157e7b12019-07-15 14:50:58 +0400930 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
931 dependencies: qemuutil,
932 install: true)
933
Paolo Bonzini931049b2020-02-05 09:44:24 +0100934 if 'CONFIG_VHOST_USER' in config_host
935 subdir('contrib/libvhost-user')
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +0200936 subdir('contrib/vhost-user-blk')
Marc-André Lureauea458962019-07-12 22:23:46 +0400937 if 'CONFIG_LINUX' in config_host
938 subdir('contrib/vhost-user-gpu')
939 endif
Marc-André Lureau32fcc622019-07-12 22:11:20 +0400940 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +0200941 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +0100942 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +0400943
944 if targetos == 'linux'
945 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
946 dependencies: [qemuutil, libcap_ng],
947 install: true,
948 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400949
950 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
951 dependencies: [authz, crypto, io, qom, qemuutil,
952 libcap_ng, libudev, libmpathpersist],
953 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +0400954 endif
955
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400956 if 'CONFIG_IVSHMEM' in config_host
957 subdir('contrib/ivshmem-client')
958 subdir('contrib/ivshmem-server')
959 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +0100960endif
961
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100962subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +0400963subdir('pc-bios')
Paolo Bonzinice1c1e72020-01-28 16:41:44 +0100964subdir('tests')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100965
Paolo Bonzinif9332752020-02-03 13:28:38 +0100966summary_info = {}
967summary_info += {'Install prefix': config_host['prefix']}
968summary_info += {'BIOS directory': config_host['qemu_datadir']}
969summary_info += {'firmware path': config_host['qemu_firmwarepath']}
970summary_info += {'binary directory': config_host['bindir']}
971summary_info += {'library directory': config_host['libdir']}
972summary_info += {'module directory': config_host['qemu_moddir']}
973summary_info += {'libexec directory': config_host['libexecdir']}
974summary_info += {'include directory': config_host['includedir']}
975summary_info += {'config directory': config_host['sysconfdir']}
976if targetos != 'windows'
977 summary_info += {'local state directory': config_host['qemu_localstatedir']}
978 summary_info += {'Manual directory': config_host['mandir']}
979else
980 summary_info += {'local state directory': 'queried at runtime'}
981endif
982summary_info += {'Build directory': meson.current_build_dir()}
983summary_info += {'Source path': meson.current_source_dir()}
984summary_info += {'GIT binary': config_host['GIT']}
985summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
986summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
987summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
988if link_language == 'cpp'
989 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
990else
991 summary_info += {'C++ compiler': false}
992endif
993if targetos == 'darwin'
994 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
995endif
996summary_info += {'ARFLAGS': config_host['ARFLAGS']}
997summary_info += {'CFLAGS': config_host['CFLAGS']}
998summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
999summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
1000summary_info += {'make': config_host['MAKE']}
1001summary_info += {'install': config_host['INSTALL']}
1002summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1003summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
1004summary_info += {'genisoimage': config_host['GENISOIMAGE']}
1005# TODO: add back version
1006summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
1007if config_host.has_key('CONFIG_SLIRP')
1008 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
1009endif
1010summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
1011if config_host.has_key('CONFIG_MODULES')
1012 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1013endif
1014summary_info += {'host CPU': cpu}
1015summary_info += {'host endianness': build_machine.endian()}
1016summary_info += {'target list': config_host['TARGET_DIRS']}
1017summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
1018summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
1019summary_info += {'strip binaries': get_option('strip')}
1020summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
1021summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
1022if targetos == 'darwin'
1023 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1024endif
1025# TODO: add back version
1026summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
1027summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
1028# TODO: add back version
1029summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
1030summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
1031# TODO: add back version
1032summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
1033summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
1034summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
1035# TODO: add back version
1036summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
1037if config_host.has_key('CONFIG_GCRYPT')
1038 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
1039 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1040endif
1041# TODO: add back version
1042summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
1043if config_host.has_key('CONFIG_NETTLE')
1044 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1045endif
1046summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1047summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1048summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1049summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1050# TODO: add back version
1051summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1052summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1053summary_info += {'mingw32 support': targetos == 'windows'}
1054summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1055summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1056summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1057summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
1058summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
1059summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
1060if config_host.has_key('CONFIG_VNC')
1061 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
1062 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
1063 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
1064endif
1065summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1066if config_host.has_key('CONFIG_XEN_BACKEND')
1067 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1068endif
1069summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1070summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1071summary_info += {'PIE': get_option('b_pie')}
1072summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1073summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1074summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1075summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1076summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1077summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1078# TODO: add back KVM/HAX/HVF/WHPX/TCG
1079#summary_info += {'KVM support': have_kvm'}
1080#summary_info += {'HAX support': have_hax'}
1081#summary_info += {'HVF support': have_hvf'}
1082#summary_info += {'WHPX support': have_whpx'}
1083#summary_info += {'TCG support': have_tcg'}
1084#if get_option('tcg')
1085# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1086# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1087#endif
1088summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1089summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1090summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1091summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
1092summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1093summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1094summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1095summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1096summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1097summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1098summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1099summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1100summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1101summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1102summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1103summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1104summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1105summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1106summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1107if config_host['TRACE_BACKENDS'].split().contains('simple')
1108 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1109endif
1110# TODO: add back protocol and server version
1111summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1112summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1113summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1114summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1115summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1116summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1117summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1118summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1119summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1120summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1121summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1122if targetos == 'windows'
1123 if 'WIN_SDK' in config_host
1124 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1125 endif
1126 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1127 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1128 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1129endif
1130summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1131summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1132summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1133summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1134summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1135summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1136summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +04001137summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001138summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1139summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1140summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1141summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1142summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1143summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1144summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1145summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1146summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1147summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1148summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1149summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1150summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1151summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1152summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1153summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1154summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1155summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1156summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1157summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1158summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1159summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1160summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1161summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1162summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1163summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1164summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1165summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1166summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1167summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1168summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1169summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1170if config_host.has_key('HAVE_GDB_BIN')
1171 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1172endif
1173summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1174summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1175summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1176summary(summary_info, bool_yn: true)
1177
1178if not supported_cpus.contains(cpu)
1179 message()
1180 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1181 message()
1182 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1183 message('The QEMU project intends to remove support for this host CPU in')
1184 message('a future release if nobody volunteers to maintain it and to')
1185 message('provide a build host for our continuous integration setup.')
1186 message('configure has succeeded and you can continue to build, but')
1187 message('if you care about QEMU on this platform you should contact')
1188 message('us upstream at qemu-devel@nongnu.org.')
1189endif
1190
1191if not supported_oses.contains(targetos)
1192 message()
1193 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1194 message()
1195 message('Host OS ' + targetos + 'support is not currently maintained.')
1196 message('The QEMU project intends to remove support for this host OS in')
1197 message('a future release if nobody volunteers to maintain it and to')
1198 message('provide a build host for our continuous integration setup.')
1199 message('configure has succeeded and you can continue to build, but')
1200 message('if you care about QEMU on this platform you should contact')
1201 message('us upstream at qemu-devel@nongnu.org.')
1202endif