]> git.ipfire.org Git - thirdparty/qemu.git/blame - meson.build
bzip2: convert to meson
[thirdparty/qemu.git] / meson.build
CommitLineData
a5665051 1project('qemu', ['c'], meson_version: '>=0.55.0',
a5cb7c5a
PB
2 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_colorout=auto'] +
3 (meson.version().version_compare('>=0.56.0') ? [ 'b_staticpic=false' ] : []),
a5665051
PB
4 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5
6not_found = dependency('', required: false)
b29b40f4
PB
7if meson.version().version_compare('>=0.56.0')
8 keyval = import('keyval')
9else
10 keyval = import('unstable-keyval')
11endif
a81df1b6 12ss = import('sourceset')
8b18cdbf 13fs = import('fs')
a81df1b6 14
ce1c1e7a 15sh = find_program('sh')
a81df1b6 16cc = meson.get_compiler('c')
a5665051 17config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
3154fee4 18enable_modules = 'CONFIG_MODULES' in config_host
35be72ba 19enable_static = 'CONFIG_STATIC' in config_host
e3667660
YL
20
21# Temporary directory used for files created while
22# configure runs. Since it is in the build directory
23# we can safely blow away any previous version of it
24# (and we need not jump through hoops to try to delete
25# it when configure exits.)
26tmpdir = meson.current_build_dir() / 'meson-private/temp'
8fe11232
MAL
27
28if get_option('qemu_suffix').startswith('/')
29 error('qemu_suffix cannot start with a /')
30endif
31
16bf7a33 32qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
ab4c0996 33qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
491e74c1 34qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
16bf7a33
PB
35qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
36
37qemu_desktopdir = get_option('datadir') / 'applications'
38qemu_icondir = get_option('datadir') / 'icons'
39
859aef02
PB
40config_host_data = configuration_data()
41genh = []
a5665051 42
760e4327
PB
43target_dirs = config_host['TARGET_DIRS'].split()
44have_user = false
45have_system = false
46foreach target : target_dirs
47 have_user = have_user or target.endswith('-user')
48 have_system = have_system or target.endswith('-softmmu')
49endforeach
50have_tools = 'CONFIG_TOOLS' in config_host
51have_block = have_system or have_tools
52
201e8ed7
PB
53python = import('python').find_installation()
54
55supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
6125673e 56supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
201e8ed7
PB
57 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
58
59cpu = host_machine.cpu_family()
60targetos = host_machine.system()
61
8a19980e
PB
62if cpu in ['x86', 'x86_64']
63 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
64elif cpu == 'aarch64'
65 kvm_targets = ['aarch64-softmmu']
66elif cpu == 's390x'
67 kvm_targets = ['s390x-softmmu']
68elif cpu in ['ppc', 'ppc64']
69 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
fbc5884c
HC
70elif cpu in ['mips', 'mips64']
71 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
8a19980e
PB
72else
73 kvm_targets = []
74endif
75
76accelerator_targets = { 'CONFIG_KVM': kvm_targets }
0c3e41d4
AB
77if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
78 # i368 emulator provides xenpv machine type for multiple architectures
79 accelerator_targets += {
80 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
81 }
82endif
8a19980e
PB
83if cpu in ['x86', 'x86_64']
84 accelerator_targets += {
85 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
8a19980e
PB
86 'CONFIG_HVF': ['x86_64-softmmu'],
87 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
88 }
89endif
90
201e8ed7
PB
91##################
92# Compiler flags #
93##################
94
ff9ed62b
AB
95# Specify linker-script with add_project_link_arguments so that it is not placed
96# within a linker --start-group/--end-group pair
97if 'CONFIG_FUZZ' in config_host
98 add_project_link_arguments(['-Wl,-T,',
99 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
100 native: false, language: ['c', 'cpp', 'objc'])
101endif
102
a5665051
PB
103add_project_arguments(config_host['QEMU_CFLAGS'].split(),
104 native: false, language: ['c', 'objc'])
105add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
106 native: false, language: 'cpp')
107add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
108 native: false, language: ['c', 'cpp', 'objc'])
a5665051 109
1e6e616d
PB
110if targetos == 'linux'
111 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
112 '-isystem', 'linux-headers',
113 language: ['c', 'cpp'])
114endif
115
116if 'CONFIG_TCG_INTERPRETER' in config_host
117 tcg_arch = 'tci'
118elif config_host['ARCH'] == 'sparc64'
119 tcg_arch = 'sparc'
120elif config_host['ARCH'] == 's390x'
121 tcg_arch = 's390'
122elif config_host['ARCH'] in ['x86_64', 'x32']
123 tcg_arch = 'i386'
124elif config_host['ARCH'] == 'ppc64'
125 tcg_arch = 'ppc'
126elif config_host['ARCH'] in ['riscv32', 'riscv64']
127 tcg_arch = 'riscv'
128else
129 tcg_arch = config_host['ARCH']
130endif
131add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
132 '-iquote', '.',
133 '-iquote', meson.current_source_dir(),
134 '-iquote', meson.current_source_dir() / 'accel/tcg',
135 '-iquote', meson.current_source_dir() / 'include',
136 '-iquote', meson.current_source_dir() / 'disas/libvixl',
137 language: ['c', 'cpp', 'objc'])
c46f76d1 138
fc929892
MAL
139link_language = meson.get_external_property('link_language', 'cpp')
140if link_language == 'cpp'
141 add_languages('cpp', required: true, native: false)
142endif
a5665051
PB
143if host_machine.system() == 'darwin'
144 add_languages('objc', required: false, native: false)
145endif
146
deb62371
PB
147sparse = find_program('cgcc', required: get_option('sparse'))
148if sparse.found()
968b4db3
PB
149 run_target('sparse',
150 command: [find_program('scripts/check_sparse.py'),
deb62371
PB
151 'compile_commands.json', sparse.full_path(), '-Wbitwise',
152 '-Wno-transparent-union', '-Wno-old-initializer',
153 '-Wno-non-pointer-null'])
968b4db3
PB
154endif
155
6ec0e15d
PB
156###########################################
157# Target-specific checks and dependencies #
158###########################################
159
160if targetos != 'linux' and get_option('mpath').enabled()
161 error('Multipath is supported only on Linux')
162endif
163
a81df1b6
PB
164m = cc.find_library('m', required: false)
165util = cc.find_library('util', required: false)
4a96337d 166winmm = []
a81df1b6 167socket = []
04c6f1e7 168version_res = []
d92989aa
MAL
169coref = []
170iokit = []
b6c7cfd4 171emulator_link_args = []
b4e312e9 172cocoa = not_found
8a19980e 173hvf = not_found
a81df1b6
PB
174if targetos == 'windows'
175 socket = cc.find_library('ws2_32')
4a96337d 176 winmm = cc.find_library('winmm')
04c6f1e7
MAL
177
178 win = import('windows')
179 version_res = win.compile_resources('version.rc',
180 depend_files: files('pc-bios/qemu-nsis.ico'),
181 include_directories: include_directories('.'))
d92989aa
MAL
182elif targetos == 'darwin'
183 coref = dependency('appleframeworks', modules: 'CoreFoundation')
184 iokit = dependency('appleframeworks', modules: 'IOKit')
b4e312e9 185 cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
cfad62f1
PB
186elif targetos == 'sunos'
187 socket = [cc.find_library('socket'),
188 cc.find_library('nsl'),
189 cc.find_library('resolv')]
190elif targetos == 'haiku'
191 socket = [cc.find_library('posix_error_mapper'),
192 cc.find_library('network'),
193 cc.find_library('bsd')]
b6c7cfd4
PB
194elif targetos == 'openbsd'
195 if not get_option('tcg').disabled() and target_dirs.length() > 0
196 # Disable OpenBSD W^X if available
197 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
198 endif
a81df1b6 199endif
6ec0e15d 200
8a19980e
PB
201accelerators = []
202if not get_option('kvm').disabled() and targetos == 'linux'
203 accelerators += 'CONFIG_KVM'
204endif
205if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
206 accelerators += 'CONFIG_XEN'
207 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
208else
209 have_xen_pci_passthrough = false
210endif
211if not get_option('whpx').disabled() and targetos == 'windows'
57e2a1f8 212 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
8a19980e
PB
213 error('WHPX requires 64-bit host')
214 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
215 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
216 accelerators += 'CONFIG_WHPX'
217 endif
218endif
219if not get_option('hvf').disabled()
220 hvf = dependency('appleframeworks', modules: 'Hypervisor',
221 required: get_option('hvf'))
222 if hvf.found()
223 accelerators += 'CONFIG_HVF'
224 endif
225endif
226if not get_option('hax').disabled()
227 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
228 accelerators += 'CONFIG_HAX'
229 endif
230endif
231if not get_option('tcg').disabled()
232 if cpu not in supported_cpus
233 if 'CONFIG_TCG_INTERPRETER' in config_host
234 warning('Unsupported CPU @0@, will use TCG with TCI (experimental)'.format(cpu))
235 else
236 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
237 endif
238 endif
239 accelerators += 'CONFIG_TCG'
240 config_host += { 'CONFIG_TCG': 'y' }
241endif
242
243if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
244 error('KVM not available on this platform')
245endif
246if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
247 error('HVF not available on this platform')
248endif
249if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
250 error('WHPX not available on this platform')
251endif
252if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
253 if 'CONFIG_XEN' in accelerators
254 error('Xen PCI passthrough not available on this platform')
255 else
256 error('Xen PCI passthrough requested but Xen not enabled')
257 endif
258endif
b4e312e9
PB
259if not cocoa.found() and get_option('cocoa').enabled()
260 error('Cocoa not available on this platform')
261endif
262
6ec0e15d
PB
263################
264# Dependencies #
265################
266
215b0c2f
PB
267# The path to glib.h is added to all compilation commands. This was
268# grandfathered in from the QEMU Makefiles.
269add_project_arguments(config_host['GLIB_CFLAGS'].split(),
270 native: false, language: ['c', 'cpp', 'objc'])
953d5a9e
MAL
271glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
272 link_args: config_host['GLIB_LIBS'].split())
273# override glib dep with the configure results (for subprojects)
274meson.override_dependency('glib-2.0', glib)
275
a81df1b6
PB
276gio = not_found
277if 'CONFIG_GIO' in config_host
278 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
279 link_args: config_host['GIO_LIBS'].split())
280endif
281lttng = not_found
282if 'CONFIG_TRACE_UST' in config_host
283 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
284endif
285urcubp = not_found
286if 'CONFIG_TRACE_UST' in config_host
287 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
288endif
46859d93
DB
289gcrypt = not_found
290if 'CONFIG_GCRYPT' in config_host
291 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
292 link_args: config_host['GCRYPT_LIBS'].split())
293endif
a81df1b6
PB
294nettle = not_found
295if 'CONFIG_NETTLE' in config_host
296 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
297 link_args: config_host['NETTLE_LIBS'].split())
298endif
299gnutls = not_found
300if 'CONFIG_GNUTLS' in config_host
301 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
302 link_args: config_host['GNUTLS_LIBS'].split())
303endif
b7612f45
PB
304pixman = not_found
305if have_system or have_tools
306 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
1a94933f 307 method: 'pkg-config', static: enable_static)
b7612f45 308endif
5e7fbd25
MAL
309pam = not_found
310if 'CONFIG_AUTH_PAM' in config_host
311 pam = cc.find_library('pam')
312endif
5e5733e5 313libaio = cc.find_library('aio', required: false)
1ffb3bbb 314zlib = dependency('zlib', required: true, static: enable_static)
5e5733e5
MAL
315linux_io_uring = not_found
316if 'CONFIG_LINUX_IO_URING' in config_host
317 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
318 link_args: config_host['LINUX_IO_URING_LIBS'].split())
319endif
320libxml2 = not_found
321if 'CONFIG_LIBXML2' in config_host
322 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
323 link_args: config_host['LIBXML2_LIBS'].split())
324endif
325libnfs = not_found
326if 'CONFIG_LIBNFS' in config_host
327 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
328endif
ec0d5893
MAL
329libattr = not_found
330if 'CONFIG_ATTR' in config_host
331 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
332endif
3f99cf57
PB
333seccomp = not_found
334if 'CONFIG_SECCOMP' in config_host
335 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
336 link_args: config_host['SECCOMP_LIBS'].split())
337endif
338libcap_ng = not_found
339if 'CONFIG_LIBCAP_NG' in config_host
340 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
341endif
1917ec6d
PB
342if get_option('xkbcommon').auto() and not have_system and not have_tools
343 xkbcommon = not_found
344else
345 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
1a94933f 346 method: 'pkg-config', static: enable_static)
ade60d4f 347endif
cdaf0722
MAL
348vde = not_found
349if config_host.has_key('CONFIG_VDE')
350 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
351endif
478e943f
PB
352pulse = not_found
353if 'CONFIG_LIBPULSE' in config_host
354 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
355 link_args: config_host['PULSE_LIBS'].split())
356endif
357alsa = not_found
358if 'CONFIG_ALSA' in config_host
359 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
360 link_args: config_host['ALSA_LIBS'].split())
361endif
362jack = not_found
363if 'CONFIG_LIBJACK' in config_host
364 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
365endif
2634733c 366spice = not_found
d72c34cc 367spice_headers = not_found
2634733c
PB
368if 'CONFIG_SPICE' in config_host
369 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
370 link_args: config_host['SPICE_LIBS'].split())
d72c34cc 371 spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
2634733c 372endif
5ee24e78 373rt = cc.find_library('rt', required: false)
ccf7afa5
PB
374libdl = not_found
375if 'CONFIG_PLUGIN' in config_host
376 libdl = cc.find_library('dl', required: true)
377endif
99650b62
PB
378libiscsi = not_found
379if 'CONFIG_LIBISCSI' in config_host
380 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
381 link_args: config_host['LIBISCSI_LIBS'].split())
382endif
5e5733e5
MAL
383zstd = not_found
384if 'CONFIG_ZSTD' in config_host
385 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
386 link_args: config_host['ZSTD_LIBS'].split())
387endif
ea458960
MAL
388gbm = not_found
389if 'CONFIG_GBM' in config_host
390 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
391 link_args: config_host['GBM_LIBS'].split())
392endif
393virgl = not_found
394if 'CONFIG_VIRGL' in config_host
395 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
396 link_args: config_host['VIRGL_LIBS'].split())
397endif
1d7bb6ab 398curl = not_found
f9cd86fe
PB
399if not get_option('curl').auto() or have_block
400 curl = dependency('libcurl', version: '>=7.29.0',
401 method: 'pkg-config',
402 required: get_option('curl'),
403 static: enable_static)
1d7bb6ab 404endif
f15bff25 405libudev = not_found
f01496a3 406if targetos == 'linux' and (have_system or have_tools)
6ec0e15d 407 libudev = dependency('libudev',
a0fbbb6e 408 method: 'pkg-config',
5c53015a 409 required: get_option('libudev'),
6ec0e15d
PB
410 static: enable_static)
411endif
412
5c53015a 413mpathlibs = [libudev]
6ec0e15d
PB
414mpathpersist = not_found
415mpathpersist_new_api = false
416if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
417 mpath_test_source_new = '''
418 #include <libudev.h>
419 #include <mpath_persist.h>
420 unsigned mpath_mx_alloc_len = 1024;
421 int logsink;
422 static struct config *multipath_conf;
423 extern struct udev *udev;
424 extern struct config *get_multipath_config(void);
425 extern void put_multipath_config(struct config *conf);
426 struct udev *udev;
427 struct config *get_multipath_config(void) { return multipath_conf; }
428 void put_multipath_config(struct config *conf) { }
429 int main(void) {
430 udev = udev_new();
431 multipath_conf = mpath_lib_init();
432 return 0;
433 }'''
434 mpath_test_source_old = '''
435 #include <libudev.h>
436 #include <mpath_persist.h>
437 unsigned mpath_mx_alloc_len = 1024;
438 int logsink;
439 int main(void) {
440 struct udev *udev = udev_new();
441 mpath_lib_init(udev);
442 return 0;
443 }'''
5c53015a
PB
444 libmpathpersist = cc.find_library('mpathpersist',
445 required: get_option('mpath'),
446 static: enable_static)
447 if libmpathpersist.found()
448 mpathlibs += libmpathpersist
449 if enable_static
450 mpathlibs += cc.find_library('devmapper',
451 required: get_option('mpath'),
452 static: enable_static)
43b43a40 453 endif
5c53015a
PB
454 mpathlibs += cc.find_library('multipath',
455 required: get_option('mpath'),
456 static: enable_static)
457 foreach lib: mpathlibs
458 if not lib.found()
459 mpathlibs = []
460 break
461 endif
462 endforeach
463 if mpathlibs.length() == 0
464 msg = 'Dependencies missing for libmpathpersist'
465 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
6ec0e15d
PB
466 mpathpersist = declare_dependency(dependencies: mpathlibs)
467 mpathpersist_new_api = true
468 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
469 mpathpersist = declare_dependency(dependencies: mpathlibs)
470 else
5c53015a
PB
471 msg = 'Cannot detect libmpathpersist API'
472 endif
473 if not mpathpersist.found()
6ec0e15d 474 if get_option('mpath').enabled()
5c53015a 475 error(msg)
6ec0e15d 476 else
5c53015a 477 warning(msg + ', disabling')
6ec0e15d
PB
478 endif
479 endif
480 endif
f15bff25 481endif
6ec0e15d 482
5285e593 483iconv = not_found
5285e593 484curses = not_found
30fe76b1 485if have_system and not get_option('curses').disabled()
925a40df
PB
486 curses_test = '''
487 #include <locale.h>
488 #include <curses.h>
489 #include <wchar.h>
490 int main(void) {
491 wchar_t wch = L'w';
492 setlocale(LC_ALL, "");
493 resize_term(0, 0);
494 addwstr(L"wide chars\n");
495 addnwstr(&wch, 1);
496 add_wch(WACS_DEGREE);
497 return 0;
498 }'''
499
ca31e307
YL
500 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
501 foreach curses_dep : curses_dep_list
502 if not curses.found()
503 curses = dependency(curses_dep,
504 required: false,
505 method: 'pkg-config',
506 static: enable_static)
507 endif
508 endforeach
925a40df 509 msg = get_option('curses').enabled() ? 'curses library not found' : ''
0dbce6ef 510 curses_compile_args = ['-DNCURSES_WIDECHAR']
925a40df 511 if curses.found()
0dbce6ef
PB
512 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
513 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
925a40df
PB
514 else
515 msg = 'curses package not usable'
516 curses = not_found
5285e593
YL
517 endif
518 endif
925a40df 519 if not curses.found()
925a40df
PB
520 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
521 if targetos != 'windows' and not has_curses_h
522 message('Trying with /usr/include/ncursesw')
523 curses_compile_args += ['-I/usr/include/ncursesw']
524 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
525 endif
526 if has_curses_h
527 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
528 foreach curses_libname : curses_libname_list
5285e593
YL
529 libcurses = cc.find_library(curses_libname,
530 required: false,
5285e593 531 static: enable_static)
925a40df
PB
532 if libcurses.found()
533 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
534 curses = declare_dependency(compile_args: curses_compile_args,
535 dependencies: [libcurses])
536 break
537 else
538 msg = 'curses library not usable'
539 endif
5285e593 540 endif
925a40df
PB
541 endforeach
542 endif
543 endif
544 if not get_option('iconv').disabled()
545 foreach link_args : [ ['-liconv'], [] ]
546 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
547 # We need to use libiconv if available because mixing libiconv's headers with
548 # the system libc does not work.
549 # However, without adding glib to the dependencies -L/usr/local/lib will not be
550 # included in the command line and libiconv will not be found.
551 if cc.links('''
552 #include <iconv.h>
553 int main(void) {
554 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
555 return conv != (iconv_t) -1;
556 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
557 iconv = declare_dependency(link_args: link_args, dependencies: glib)
558 break
5285e593 559 endif
30fe76b1
PB
560 endforeach
561 endif
925a40df
PB
562 if curses.found() and not iconv.found()
563 if get_option('iconv').enabled()
564 error('iconv not available')
565 endif
566 msg = 'iconv required for curses UI but not available'
567 curses = not_found
568 endif
569 if not curses.found() and msg != ''
570 if get_option('curses').enabled()
571 error(msg)
30fe76b1 572 else
925a40df 573 warning(msg + ', disabling')
30fe76b1 574 endif
5285e593
YL
575 endif
576endif
577
2634733c 578brlapi = not_found
8c6d4ff4
PB
579if not get_option('brlapi').auto() or have_system
580 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
581 required: get_option('brlapi'),
582 static: enable_static)
583 if brlapi.found() and not cc.links('''
584 #include <brlapi.h>
585 #include <stddef.h>
586 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
587 brlapi = not_found
588 if get_option('brlapi').enabled()
589 error('could not link brlapi')
590 else
591 warning('could not link brlapi, disabling')
592 endif
593 endif
2634733c 594endif
35be72ba 595
760e4327
PB
596sdl = not_found
597if have_system
363743da 598 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
760e4327
PB
599 sdl_image = not_found
600endif
35be72ba
PB
601if sdl.found()
602 # work around 2.0.8 bug
603 sdl = declare_dependency(compile_args: '-Wno-undef',
604 dependencies: sdl)
7161a433 605 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
1a94933f 606 method: 'pkg-config', static: enable_static)
35be72ba
PB
607else
608 if get_option('sdl_image').enabled()
a8dc2ace
ST
609 error('sdl-image required, but SDL was @0@'.format(
610 get_option('sdl').disabled() ? 'disabled' : 'not found'))
35be72ba
PB
611 endif
612 sdl_image = not_found
2634733c 613endif
35be72ba 614
5e5733e5
MAL
615rbd = not_found
616if 'CONFIG_RBD' in config_host
617 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
618endif
619glusterfs = not_found
08821ca2
PB
620glusterfs_ftruncate_has_stat = false
621glusterfs_iocb_has_stat = false
622if not get_option('glusterfs').auto() or have_block
623 glusterfs = dependency('glusterfs-api', version: '>=3',
624 required: get_option('glusterfs'),
625 method: 'pkg-config', static: enable_static)
626 if glusterfs.found()
627 glusterfs_ftruncate_has_stat = cc.links('''
628 #include <glusterfs/api/glfs.h>
629
630 int
631 main(void)
632 {
633 /* new glfs_ftruncate() passes two additional args */
634 return glfs_ftruncate(NULL, 0, NULL, NULL);
635 }
636 ''', dependencies: glusterfs)
637 glusterfs_iocb_has_stat = cc.links('''
638 #include <glusterfs/api/glfs.h>
639
640 /* new glfs_io_cbk() passes two additional glfs_stat structs */
641 static void
642 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
643 {}
644
645 int
646 main(void)
647 {
648 glfs_io_cbk iocb = &glusterfs_iocb;
649 iocb(NULL, 0 , NULL, NULL, NULL);
650 return 0;
651 }
652 ''', dependencies: glusterfs)
653 endif
5e5733e5
MAL
654endif
655libssh = not_found
656if 'CONFIG_LIBSSH' in config_host
657 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
658 link_args: config_host['LIBSSH_LIBS'].split())
659endif
660libbzip2 = not_found
29ba6116
PB
661if not get_option('bzip2').auto() or have_block
662 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
663 required: get_option('bzip2'),
664 static: enable_static)
665 if libbzip2.found() and not cc.links('''
666 #include <bzlib.h>
667 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
668 libbzip2 = not_found
669 if get_option('bzip2').enabled()
670 error('could not link libbzip2')
671 else
672 warning('could not link libbzip2, disabling')
673 endif
674 endif
5e5733e5
MAL
675endif
676liblzfse = not_found
677if 'CONFIG_LZFSE' in config_host
678 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
679endif
478e943f
PB
680oss = not_found
681if 'CONFIG_AUDIO_OSS' in config_host
682 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
683endif
684dsound = not_found
685if 'CONFIG_AUDIO_DSOUND' in config_host
686 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
687endif
688coreaudio = not_found
689if 'CONFIG_AUDIO_COREAUDIO' in config_host
690 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
2b1ccdf4
MAL
691endif
692opengl = not_found
693if 'CONFIG_OPENGL' in config_host
de2d3005
PB
694 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
695 link_args: config_host['OPENGL_LIBS'].split())
2b1ccdf4
MAL
696endif
697gtk = not_found
698if 'CONFIG_GTK' in config_host
699 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
700 link_args: config_host['GTK_LIBS'].split())
701endif
702vte = not_found
703if 'CONFIG_VTE' in config_host
704 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
705 link_args: config_host['VTE_LIBS'].split())
706endif
707x11 = not_found
708if 'CONFIG_X11' in config_host
709 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
710 link_args: config_host['X11_LIBS'].split())
711endif
a0b93237 712vnc = not_found
2b1ccdf4 713png = not_found
2b1ccdf4 714jpeg = not_found
2b1ccdf4 715sasl = not_found
a0b93237
PB
716if get_option('vnc').enabled()
717 vnc = declare_dependency() # dummy dependency
718 png = dependency('libpng', required: get_option('vnc_png'),
1a94933f 719 method: 'pkg-config', static: enable_static)
8e242b3c
PB
720 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
721 method: 'pkg-config', static: enable_static)
a0b93237
PB
722 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
723 required: get_option('vnc_sasl'),
724 static: enable_static)
725 if sasl.found()
726 sasl = declare_dependency(dependencies: sasl,
727 compile_args: '-DSTRUCT_IOVEC_DEFINED')
728 endif
478e943f 729endif
708eab42
MAL
730snappy = not_found
731if 'CONFIG_SNAPPY' in config_host
732 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
733endif
734lzo = not_found
735if 'CONFIG_LZO' in config_host
736 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
737endif
55166230
MAL
738rdma = not_found
739if 'CONFIG_RDMA' in config_host
740 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
741endif
ab318051
MAL
742numa = not_found
743if 'CONFIG_NUMA' in config_host
744 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
745endif
582ea95f
MAL
746xen = not_found
747if 'CONFIG_XEN_BACKEND' in config_host
748 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
749 link_args: config_host['XEN_LIBS'].split())
750endif
06677ce1
PB
751cacard = not_found
752if 'CONFIG_SMARTCARD' in config_host
753 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
754 link_args: config_host['SMARTCARD_LIBS'].split())
755endif
0a40bcb7
CB
756u2f = not_found
757if have_system
758 u2f = dependency('u2f-emu', required: get_option('u2f'),
759 method: 'pkg-config',
760 static: enable_static)
761endif
06677ce1
PB
762usbredir = not_found
763if 'CONFIG_USB_REDIR' in config_host
764 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
765 link_args: config_host['USB_REDIR_LIBS'].split())
766endif
767libusb = not_found
768if 'CONFIG_USB_LIBUSB' in config_host
769 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
770 link_args: config_host['LIBUSB_LIBS'].split())
771endif
c9322ab5
MAL
772libpmem = not_found
773if 'CONFIG_LIBPMEM' in config_host
774 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
775 link_args: config_host['LIBPMEM_LIBS'].split())
776endif
c7c91a74
BR
777libdaxctl = not_found
778if 'CONFIG_LIBDAXCTL' in config_host
779 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
780endif
8ce0a45f
MAL
781tasn1 = not_found
782if 'CONFIG_TASN1' in config_host
783 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
784 link_args: config_host['TASN1_LIBS'].split())
785endif
af04e89d
MAL
786keyutils = dependency('libkeyutils', required: false,
787 method: 'pkg-config', static: enable_static)
a81df1b6 788
3909def8
MAL
789has_gettid = cc.has_function('gettid')
790
aa087962
PB
791# Malloc tests
792
793malloc = []
794if get_option('malloc') == 'system'
795 has_malloc_trim = \
796 not get_option('malloc_trim').disabled() and \
797 cc.links('''#include <malloc.h>
798 int main(void) { malloc_trim(0); return 0; }''')
799else
800 has_malloc_trim = false
801 malloc = cc.find_library(get_option('malloc'), required: true)
802endif
803if not has_malloc_trim and get_option('malloc_trim').enabled()
804 if get_option('malloc') == 'system'
805 error('malloc_trim not available on this platform.')
806 else
807 error('malloc_trim not available with non-libc memory allocator')
808 endif
809endif
810
84e319a5
HR
811# Check whether the glibc provides statx()
812
813statx_test = '''
814 #ifndef _GNU_SOURCE
815 #define _GNU_SOURCE
816 #endif
817 #include <sys/stat.h>
818 int main(void) {
819 struct statx statxbuf;
820 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
821 return 0;
822 }'''
823
824has_statx = cc.links(statx_test)
825
eb6a3886
SH
826have_vhost_user_blk_server = (targetos == 'linux' and
827 'CONFIG_VHOST_USER' in config_host)
e5e856c1
SH
828
829if get_option('vhost_user_blk_server').enabled()
830 if targetos != 'linux'
831 error('vhost_user_blk_server requires linux')
eb6a3886
SH
832 elif 'CONFIG_VHOST_USER' not in config_host
833 error('vhost_user_blk_server requires vhost-user support')
e5e856c1
SH
834 endif
835elif get_option('vhost_user_blk_server').disabled() or not have_system
836 have_vhost_user_blk_server = false
837endif
838
9e62ba48 839
df4ea709
HR
840if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
841 error('Cannot enable fuse-lseek while fuse is disabled')
842endif
843
a484a719
HR
844fuse = dependency('fuse3', required: get_option('fuse'),
845 version: '>=3.1', method: 'pkg-config',
846 static: enable_static)
847
df4ea709
HR
848fuse_lseek = not_found
849if not get_option('fuse_lseek').disabled()
850 if fuse.version().version_compare('>=3.8')
851 # Dummy dependency
852 fuse_lseek = declare_dependency()
853 elif get_option('fuse_lseek').enabled()
854 if fuse.found()
855 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
856 else
857 error('fuse-lseek requires libfuse, which was not found')
858 endif
859 endif
860endif
861
9e62ba48
DB
862if get_option('cfi')
863 cfi_flags=[]
864 # Check for dependency on LTO
865 if not get_option('b_lto')
866 error('Selected Control-Flow Integrity but LTO is disabled')
867 endif
868 if config_host.has_key('CONFIG_MODULES')
869 error('Selected Control-Flow Integrity is not compatible with modules')
870 endif
871 # Check for cfi flags. CFI requires LTO so we can't use
872 # get_supported_arguments, but need a more complex "compiles" which allows
873 # custom arguments
874 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
875 args: ['-flto', '-fsanitize=cfi-icall'] )
876 cfi_flags += '-fsanitize=cfi-icall'
877 else
878 error('-fsanitize=cfi-icall is not supported by the compiler')
879 endif
880 if cc.compiles('int main () { return 0; }',
881 name: '-fsanitize-cfi-icall-generalize-pointers',
882 args: ['-flto', '-fsanitize=cfi-icall',
883 '-fsanitize-cfi-icall-generalize-pointers'] )
884 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
885 else
886 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
887 endif
888 if get_option('cfi_debug')
889 if cc.compiles('int main () { return 0; }',
890 name: '-fno-sanitize-trap=cfi-icall',
891 args: ['-flto', '-fsanitize=cfi-icall',
892 '-fno-sanitize-trap=cfi-icall'] )
893 cfi_flags += '-fno-sanitize-trap=cfi-icall'
894 else
895 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
896 endif
897 endif
898 add_project_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
899 add_project_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
900endif
901
a0c9162c
PB
902#################
903# config-host.h #
904#################
859aef02 905
16bf7a33
PB
906config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
907config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
908config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
909config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
910config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
911config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
912config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
913config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
914config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
915config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
916config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
917config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
918
8c6d4ff4 919config_host_data.set('CONFIG_BRLAPI', brlapi.found())
b4e312e9 920config_host_data.set('CONFIG_COCOA', cocoa.found())
f01496a3 921config_host_data.set('CONFIG_LIBUDEV', libudev.found())
6ec0e15d
PB
922config_host_data.set('CONFIG_MPATH', mpathpersist.found())
923config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
f9cd86fe 924config_host_data.set('CONFIG_CURL', curl.found())
5285e593 925config_host_data.set('CONFIG_CURSES', curses.found())
08821ca2
PB
926config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
927if glusterfs.found()
928 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
929 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
930 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
931 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
932 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
933 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
934endif
35be72ba
PB
935config_host_data.set('CONFIG_SDL', sdl.found())
936config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
e5e856c1 937config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
a0b93237
PB
938config_host_data.set('CONFIG_VNC', vnc.found())
939config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
940config_host_data.set('CONFIG_VNC_PNG', png.found())
941config_host_data.set('CONFIG_VNC_SASL', sasl.found())
4113f4cf 942config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
af04e89d 943config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
3909def8 944config_host_data.set('CONFIG_GETTID', has_gettid)
aa087962 945config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
84e319a5 946config_host_data.set('CONFIG_STATX', has_statx)
a484a719 947config_host_data.set('CONFIG_FUSE', fuse.found())
df4ea709 948config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
9e62ba48 949config_host_data.set('CONFIG_CFI', get_option('cfi'))
859aef02
PB
950config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
951config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
952config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
953config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
954
48f670ec 955config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
2964be52 956config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
2802d91d 957config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
ded5d78c 958config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
4a9d5f89 959config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
88c78f16 960config_host_data.set('HAVE_SYS_SIGNAL_H', cc.has_header('sys/signal.h'))
ded5d78c 961
765686d6 962ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
859aef02 963arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
16bf7a33 964strings = ['HOST_DSOSUF', 'CONFIG_IASL']
859aef02 965foreach k, v: config_host
765686d6
PB
966 if ignored.contains(k)
967 # do nothing
968 elif arrays.contains(k)
859aef02
PB
969 if v != ''
970 v = '"' + '", "'.join(v.split()) + '", '
971 endif
972 config_host_data.set(k, v)
973 elif k == 'ARCH'
974 config_host_data.set('HOST_' + v.to_upper(), 1)
975 elif strings.contains(k)
976 if not k.startswith('CONFIG_')
977 k = 'CONFIG_' + k.to_upper()
978 endif
979 config_host_data.set_quoted(k, v)
980 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
981 config_host_data.set(k, v == 'y' ? 1 : v)
982 endif
983endforeach
859aef02 984
a0c9162c
PB
985########################
986# Target configuration #
987########################
988
2becc36a 989minikconf = find_program('scripts/minikconf.py')
05512f55 990config_all = {}
a98006bc 991config_all_devices = {}
ca0fc784 992config_all_disas = {}
2becc36a
PB
993config_devices_mak_list = []
994config_devices_h = {}
859aef02 995config_target_h = {}
2becc36a 996config_target_mak = {}
ca0fc784
PB
997
998disassemblers = {
999 'alpha' : ['CONFIG_ALPHA_DIS'],
1000 'arm' : ['CONFIG_ARM_DIS'],
1001 'avr' : ['CONFIG_AVR_DIS'],
1002 'cris' : ['CONFIG_CRIS_DIS'],
1003 'hppa' : ['CONFIG_HPPA_DIS'],
1004 'i386' : ['CONFIG_I386_DIS'],
1005 'x86_64' : ['CONFIG_I386_DIS'],
1006 'x32' : ['CONFIG_I386_DIS'],
1007 'lm32' : ['CONFIG_LM32_DIS'],
1008 'm68k' : ['CONFIG_M68K_DIS'],
1009 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1010 'mips' : ['CONFIG_MIPS_DIS'],
1011 'moxie' : ['CONFIG_MOXIE_DIS'],
1012 'nios2' : ['CONFIG_NIOS2_DIS'],
1013 'or1k' : ['CONFIG_OPENRISC_DIS'],
1014 'ppc' : ['CONFIG_PPC_DIS'],
1015 'riscv' : ['CONFIG_RISCV_DIS'],
1016 'rx' : ['CONFIG_RX_DIS'],
1017 's390' : ['CONFIG_S390_DIS'],
1018 'sh4' : ['CONFIG_SH4_DIS'],
1019 'sparc' : ['CONFIG_SPARC_DIS'],
1020 'xtensa' : ['CONFIG_XTENSA_DIS'],
1021}
1022if link_language == 'cpp'
1023 disassemblers += {
1024 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1025 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1026 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1027 }
1028endif
1029
0a189110
PB
1030host_kconfig = \
1031 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
1032 ('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
1033 ('CONFIG_IVSHMEM' in config_host ? ['CONFIG_IVSHMEM=y'] : []) + \
1034 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
1035 ('CONFIG_X11' in config_host ? ['CONFIG_X11=y'] : []) + \
1036 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1037 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1038 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
1039 ('CONFIG_VIRTFS' in config_host ? ['CONFIG_VIRTFS=y'] : []) + \
1040 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
1041 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : [])
1042
a9a74907 1043ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
05512f55 1044
fdb75aef
PB
1045default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1046actual_target_dirs = []
fbb4121d 1047fdt_required = []
a81df1b6 1048foreach target : target_dirs
765686d6
PB
1049 config_target = { 'TARGET_NAME': target.split('-')[0] }
1050 if target.endswith('linux-user')
fdb75aef
PB
1051 if targetos != 'linux'
1052 if default_targets
1053 continue
1054 endif
1055 error('Target @0@ is only available on a Linux host'.format(target))
1056 endif
765686d6
PB
1057 config_target += { 'CONFIG_LINUX_USER': 'y' }
1058 elif target.endswith('bsd-user')
fdb75aef
PB
1059 if 'CONFIG_BSD' not in config_host
1060 if default_targets
1061 continue
1062 endif
1063 error('Target @0@ is only available on a BSD host'.format(target))
1064 endif
765686d6
PB
1065 config_target += { 'CONFIG_BSD_USER': 'y' }
1066 elif target.endswith('softmmu')
1067 config_target += { 'CONFIG_SOFTMMU': 'y' }
1068 endif
1069 if target.endswith('-user')
1070 config_target += {
1071 'CONFIG_USER_ONLY': 'y',
1072 'CONFIG_QEMU_INTERP_PREFIX':
1073 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1074 }
1075 endif
859aef02 1076
0a189110 1077 accel_kconfig = []
8a19980e
PB
1078 foreach sym: accelerators
1079 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1080 config_target += { sym: 'y' }
1081 config_all += { sym: 'y' }
1082 if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
1083 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1084 endif
0a189110 1085 accel_kconfig += [ sym + '=y' ]
8a19980e
PB
1086 endif
1087 endforeach
0a189110 1088 if accel_kconfig.length() == 0
fdb75aef
PB
1089 if default_targets
1090 continue
1091 endif
1092 error('No accelerator available for target @0@'.format(target))
1093 endif
8a19980e 1094
fdb75aef 1095 actual_target_dirs += target
765686d6 1096 config_target += keyval.load('default-configs/targets' / target + '.mak')
a9a74907 1097 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
765686d6 1098
fbb4121d
PB
1099 if 'TARGET_NEED_FDT' in config_target
1100 fdt_required += target
1101 endif
1102
fa73168b
PB
1103 # Add default keys
1104 if 'TARGET_BASE_ARCH' not in config_target
1105 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1106 endif
1107 if 'TARGET_ABI_DIR' not in config_target
1108 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1109 endif
859aef02 1110
ca0fc784
PB
1111 foreach k, v: disassemblers
1112 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1113 foreach sym: v
1114 config_target += { sym: 'y' }
1115 config_all_disas += { sym: 'y' }
1116 endforeach
1117 endif
1118 endforeach
1119
859aef02
PB
1120 config_target_data = configuration_data()
1121 foreach k, v: config_target
1122 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1123 # do nothing
1124 elif ignored.contains(k)
1125 # do nothing
1126 elif k == 'TARGET_BASE_ARCH'
a9a74907
PB
1127 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1128 # not used to select files from sourcesets.
859aef02 1129 config_target_data.set('TARGET_' + v.to_upper(), 1)
765686d6 1130 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
859aef02
PB
1131 config_target_data.set_quoted(k, v)
1132 elif v == 'y'
1133 config_target_data.set(k, 1)
1134 else
1135 config_target_data.set(k, v)
1136 endif
1137 endforeach
1138 config_target_h += {target: configure_file(output: target + '-config-target.h',
1139 configuration: config_target_data)}
2becc36a
PB
1140
1141 if target.endswith('-softmmu')
2becc36a
PB
1142 config_devices_mak = target + '-config-devices.mak'
1143 config_devices_mak = configure_file(
1bb4cb1c 1144 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
2becc36a
PB
1145 output: config_devices_mak,
1146 depfile: config_devices_mak + '.d',
1147 capture: true,
1148 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
1149 config_devices_mak, '@DEPFILE@', '@INPUT@',
0a189110 1150 host_kconfig, accel_kconfig])
859aef02
PB
1151
1152 config_devices_data = configuration_data()
1153 config_devices = keyval.load(config_devices_mak)
1154 foreach k, v: config_devices
1155 config_devices_data.set(k, 1)
1156 endforeach
2becc36a 1157 config_devices_mak_list += config_devices_mak
859aef02
PB
1158 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1159 configuration: config_devices_data)}
1160 config_target += config_devices
a98006bc 1161 config_all_devices += config_devices
2becc36a
PB
1162 endif
1163 config_target_mak += {target: config_target}
a81df1b6 1164endforeach
fdb75aef 1165target_dirs = actual_target_dirs
a81df1b6 1166
2becc36a
PB
1167# This configuration is used to build files that are shared by
1168# multiple binaries, and then extracted out of the "common"
1169# static_library target.
1170#
1171# We do not use all_sources()/all_dependencies(), because it would
1172# build literally all source files, including devices only used by
1173# targets that are not built for this compilation. The CONFIG_ALL
1174# pseudo symbol replaces it.
1175
05512f55 1176config_all += config_all_devices
2becc36a
PB
1177config_all += config_host
1178config_all += config_all_disas
1179config_all += {
1180 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1181 'CONFIG_SOFTMMU': have_system,
1182 'CONFIG_USER_ONLY': have_user,
1183 'CONFIG_ALL': true,
1184}
1185
a0c9162c
PB
1186##############
1187# Submodules #
1188##############
8b18cdbf
RH
1189
1190capstone = not_found
1191capstone_opt = get_option('capstone')
1192if capstone_opt in ['enabled', 'auto', 'system']
1193 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
bcf36862
RH
1194 capstone = dependency('capstone', version: '>=4.0',
1195 static: enable_static, method: 'pkg-config',
8b18cdbf
RH
1196 required: capstone_opt == 'system' or
1197 capstone_opt == 'enabled' and not have_internal)
1198 if capstone.found()
1199 capstone_opt = 'system'
1200 elif have_internal
1201 capstone_opt = 'internal'
1202 else
1203 capstone_opt = 'disabled'
1204 endif
1205endif
1206if capstone_opt == 'internal'
1207 capstone_data = configuration_data()
1208 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1209
1210 capstone_files = files(
1211 'capstone/cs.c',
1212 'capstone/MCInst.c',
1213 'capstone/MCInstrDesc.c',
1214 'capstone/MCRegisterInfo.c',
1215 'capstone/SStream.c',
1216 'capstone/utils.c'
1217 )
1218
1219 if 'CONFIG_ARM_DIS' in config_all_disas
1220 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1221 capstone_files += files(
1222 'capstone/arch/ARM/ARMDisassembler.c',
1223 'capstone/arch/ARM/ARMInstPrinter.c',
1224 'capstone/arch/ARM/ARMMapping.c',
1225 'capstone/arch/ARM/ARMModule.c'
1226 )
1227 endif
1228
1229 # FIXME: This config entry currently depends on a c++ compiler.
1230 # Which is needed for building libvixl, but not for capstone.
1231 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1232 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1233 capstone_files += files(
1234 'capstone/arch/AArch64/AArch64BaseInfo.c',
1235 'capstone/arch/AArch64/AArch64Disassembler.c',
1236 'capstone/arch/AArch64/AArch64InstPrinter.c',
1237 'capstone/arch/AArch64/AArch64Mapping.c',
1238 'capstone/arch/AArch64/AArch64Module.c'
1239 )
1240 endif
1241
1242 if 'CONFIG_PPC_DIS' in config_all_disas
1243 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1244 capstone_files += files(
1245 'capstone/arch/PowerPC/PPCDisassembler.c',
1246 'capstone/arch/PowerPC/PPCInstPrinter.c',
1247 'capstone/arch/PowerPC/PPCMapping.c',
1248 'capstone/arch/PowerPC/PPCModule.c'
1249 )
1250 endif
1251
3d562845
RH
1252 if 'CONFIG_S390_DIS' in config_all_disas
1253 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1254 capstone_files += files(
1255 'capstone/arch/SystemZ/SystemZDisassembler.c',
1256 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1257 'capstone/arch/SystemZ/SystemZMapping.c',
1258 'capstone/arch/SystemZ/SystemZModule.c',
1259 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1260 )
1261 endif
1262
8b18cdbf
RH
1263 if 'CONFIG_I386_DIS' in config_all_disas
1264 capstone_data.set('CAPSTONE_HAS_X86', 1)
1265 capstone_files += files(
1266 'capstone/arch/X86/X86Disassembler.c',
1267 'capstone/arch/X86/X86DisassemblerDecoder.c',
1268 'capstone/arch/X86/X86ATTInstPrinter.c',
1269 'capstone/arch/X86/X86IntelInstPrinter.c',
eef20e40 1270 'capstone/arch/X86/X86InstPrinterCommon.c',
8b18cdbf
RH
1271 'capstone/arch/X86/X86Mapping.c',
1272 'capstone/arch/X86/X86Module.c'
1273 )
1274 endif
1275
1276 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1277
1278 capstone_cargs = [
1279 # FIXME: There does not seem to be a way to completely replace the c_args
1280 # that come from add_project_arguments() -- we can only add to them.
1281 # So: disable all warnings with a big hammer.
1282 '-Wno-error', '-w',
1283
1284 # Include all configuration defines via a header file, which will wind up
1285 # as a dependency on the object file, and thus changes here will result
1286 # in a rebuild.
1287 '-include', 'capstone-defs.h'
1288 ]
1289
1290 libcapstone = static_library('capstone',
1291 sources: capstone_files,
1292 c_args: capstone_cargs,
1293 include_directories: 'capstone/include')
1294 capstone = declare_dependency(link_with: libcapstone,
eef20e40 1295 include_directories: 'capstone/include/capstone')
8b18cdbf 1296endif
4d34a86b
PB
1297
1298slirp = not_found
1299slirp_opt = 'disabled'
1300if have_system
1301 slirp_opt = get_option('slirp')
1302 if slirp_opt in ['enabled', 'auto', 'system']
1303 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
1304 slirp = dependency('slirp', static: enable_static,
1305 method: 'pkg-config',
1306 required: slirp_opt == 'system' or
1307 slirp_opt == 'enabled' and not have_internal)
1308 if slirp.found()
1309 slirp_opt = 'system'
1310 elif have_internal
1311 slirp_opt = 'internal'
1312 else
1313 slirp_opt = 'disabled'
1314 endif
1315 endif
1316 if slirp_opt == 'internal'
1317 slirp_deps = []
1318 if targetos == 'windows'
1319 slirp_deps = cc.find_library('iphlpapi')
1320 endif
1321 slirp_conf = configuration_data()
1322 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1323 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1324 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1325 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1326 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1327 slirp_files = [
1328 'slirp/src/arp_table.c',
1329 'slirp/src/bootp.c',
1330 'slirp/src/cksum.c',
1331 'slirp/src/dhcpv6.c',
1332 'slirp/src/dnssearch.c',
1333 'slirp/src/if.c',
1334 'slirp/src/ip6_icmp.c',
1335 'slirp/src/ip6_input.c',
1336 'slirp/src/ip6_output.c',
1337 'slirp/src/ip_icmp.c',
1338 'slirp/src/ip_input.c',
1339 'slirp/src/ip_output.c',
1340 'slirp/src/mbuf.c',
1341 'slirp/src/misc.c',
1342 'slirp/src/ncsi.c',
1343 'slirp/src/ndp_table.c',
1344 'slirp/src/sbuf.c',
1345 'slirp/src/slirp.c',
1346 'slirp/src/socket.c',
1347 'slirp/src/state.c',
1348 'slirp/src/stream.c',
1349 'slirp/src/tcp_input.c',
1350 'slirp/src/tcp_output.c',
1351 'slirp/src/tcp_subr.c',
1352 'slirp/src/tcp_timer.c',
1353 'slirp/src/tftp.c',
1354 'slirp/src/udp.c',
1355 'slirp/src/udp6.c',
1356 'slirp/src/util.c',
1357 'slirp/src/version.c',
1358 'slirp/src/vmstate.c',
1359 ]
1360
1361 configure_file(
1362 input : 'slirp/src/libslirp-version.h.in',
1363 output : 'libslirp-version.h',
1364 configuration: slirp_conf)
1365
1366 slirp_inc = include_directories('slirp', 'slirp/src')
1367 libslirp = static_library('slirp',
1368 sources: slirp_files,
1369 c_args: slirp_cargs,
1370 include_directories: slirp_inc)
1371 slirp = declare_dependency(link_with: libslirp,
1372 dependencies: slirp_deps,
1373 include_directories: slirp_inc)
1374 endif
1375endif
1376
fbb4121d
PB
1377fdt = not_found
1378fdt_opt = get_option('fdt')
1379if have_system
1380 if fdt_opt in ['enabled', 'auto', 'system']
1381 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
1382 fdt = cc.find_library('fdt', static: enable_static,
1383 required: fdt_opt == 'system' or
1384 fdt_opt == 'enabled' and not have_internal)
1385 if fdt.found() and cc.links('''
1386 #include <libfdt.h>
1387 #include <libfdt_env.h>
1388 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1389 dependencies: fdt)
1390 fdt_opt = 'system'
1391 elif have_internal
1392 fdt_opt = 'internal'
1393 else
1394 fdt_opt = 'disabled'
1395 endif
1396 endif
1397 if fdt_opt == 'internal'
1398 fdt_files = files(
1399 'dtc/libfdt/fdt.c',
1400 'dtc/libfdt/fdt_ro.c',
1401 'dtc/libfdt/fdt_wip.c',
1402 'dtc/libfdt/fdt_sw.c',
1403 'dtc/libfdt/fdt_rw.c',
1404 'dtc/libfdt/fdt_strerror.c',
1405 'dtc/libfdt/fdt_empty_tree.c',
1406 'dtc/libfdt/fdt_addresses.c',
1407 'dtc/libfdt/fdt_overlay.c',
1408 'dtc/libfdt/fdt_check.c',
1409 )
1410
1411 fdt_inc = include_directories('dtc/libfdt')
1412 libfdt = static_library('fdt',
1413 sources: fdt_files,
1414 include_directories: fdt_inc)
1415 fdt = declare_dependency(link_with: libfdt,
1416 include_directories: fdt_inc)
1417 endif
1418endif
1419if not fdt.found() and fdt_required.length() > 0
1420 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1421endif
1422
8b18cdbf 1423config_host_data.set('CONFIG_CAPSTONE', capstone.found())
fbb4121d 1424config_host_data.set('CONFIG_FDT', fdt.found())
4d34a86b 1425config_host_data.set('CONFIG_SLIRP', slirp.found())
8b18cdbf 1426
a0c9162c
PB
1427#####################
1428# Generated sources #
1429#####################
8b18cdbf 1430
a0c9162c 1431genh += configure_file(output: 'config-host.h', configuration: config_host_data)
a81df1b6 1432
3f885659 1433hxtool = find_program('scripts/hxtool')
650b5d54 1434shaderinclude = find_program('scripts/shaderinclude.pl')
a81df1b6
PB
1435qapi_gen = find_program('scripts/qapi-gen.py')
1436qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1437 meson.source_root() / 'scripts/qapi/commands.py',
1438 meson.source_root() / 'scripts/qapi/common.py',
a81df1b6
PB
1439 meson.source_root() / 'scripts/qapi/error.py',
1440 meson.source_root() / 'scripts/qapi/events.py',
1441 meson.source_root() / 'scripts/qapi/expr.py',
1442 meson.source_root() / 'scripts/qapi/gen.py',
1443 meson.source_root() / 'scripts/qapi/introspect.py',
1444 meson.source_root() / 'scripts/qapi/parser.py',
1445 meson.source_root() / 'scripts/qapi/schema.py',
1446 meson.source_root() / 'scripts/qapi/source.py',
1447 meson.source_root() / 'scripts/qapi/types.py',
1448 meson.source_root() / 'scripts/qapi/visit.py',
1449 meson.source_root() / 'scripts/qapi/common.py',
a81df1b6
PB
1450 meson.source_root() / 'scripts/qapi-gen.py'
1451]
1452
1453tracetool = [
1454 python, files('scripts/tracetool.py'),
1455 '--backend=' + config_host['TRACE_BACKENDS']
1456]
1457
2c273f32
MAL
1458qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1459 meson.current_source_dir(),
859aef02 1460 config_host['PKGVERSION'], meson.project_version()]
2c273f32
MAL
1461qemu_version = custom_target('qemu-version.h',
1462 output: 'qemu-version.h',
1463 command: qemu_version_cmd,
1464 capture: true,
1465 build_by_default: true,
1466 build_always_stale: true)
1467genh += qemu_version
1468
3f885659
MAL
1469hxdep = []
1470hx_headers = [
1471 ['qemu-options.hx', 'qemu-options.def'],
1472 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1473]
1474if have_system
1475 hx_headers += [
1476 ['hmp-commands.hx', 'hmp-commands.h'],
1477 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1478 ]
1479endif
1480foreach d : hx_headers
b7c70bf2 1481 hxdep += custom_target(d[1],
3f885659
MAL
1482 input: files(d[0]),
1483 output: d[1],
1484 capture: true,
1485 build_by_default: true, # to be removed when added to a target
1486 command: [hxtool, '-h', '@INPUT0@'])
1487endforeach
1488genh += hxdep
1489
a0c9162c
PB
1490###################
1491# Collect sources #
1492###################
a81df1b6 1493
55567891 1494authz_ss = ss.source_set()
4a96337d 1495blockdev_ss = ss.source_set()
7e2b888f 1496block_ss = ss.source_set()
2becc36a 1497bsd_user_ss = ss.source_set()
c2306d71 1498chardev_ss = ss.source_set()
7e2b888f 1499common_ss = ss.source_set()
2389304a 1500crypto_ss = ss.source_set()
f78536b1 1501io_ss = ss.source_set()
2becc36a 1502linux_user_ss = ss.source_set()
7e2b888f 1503qmp_ss = ss.source_set()
da33fc09 1504qom_ss = ss.source_set()
7e2b888f 1505softmmu_ss = ss.source_set()
64ed6f92 1506specific_fuzz_ss = ss.source_set()
7e2b888f
PMD
1507specific_ss = ss.source_set()
1508stub_ss = ss.source_set()
1509trace_ss = ss.source_set()
1510user_ss = ss.source_set()
1511util_ss = ss.source_set()
2becc36a 1512
3154fee4 1513modules = {}
2becc36a
PB
1514hw_arch = {}
1515target_arch = {}
1516target_softmmu_arch = {}
a81df1b6
PB
1517
1518###############
1519# Trace files #
1520###############
1521
c9322ab5
MAL
1522# TODO: add each directory to the subdirs from its own meson.build, once
1523# we have those
a81df1b6
PB
1524trace_events_subdirs = [
1525 'accel/kvm',
1526 'accel/tcg',
1527 'crypto',
1528 'monitor',
1529]
1530if have_user
1531 trace_events_subdirs += [ 'linux-user' ]
1532endif
1533if have_block
1534 trace_events_subdirs += [
1535 'authz',
1536 'block',
1537 'io',
1538 'nbd',
1539 'scsi',
1540 ]
1541endif
1542if have_system
1543 trace_events_subdirs += [
1544 'audio',
1545 'backends',
1546 'backends/tpm',
1547 'chardev',
1548 'hw/9pfs',
1549 'hw/acpi',
1550 'hw/alpha',
1551 'hw/arm',
1552 'hw/audio',
1553 'hw/block',
1554 'hw/block/dataplane',
1555 'hw/char',
1556 'hw/display',
1557 'hw/dma',
1558 'hw/hppa',
1559 'hw/hyperv',
1560 'hw/i2c',
1561 'hw/i386',
1562 'hw/i386/xen',
1563 'hw/ide',
1564 'hw/input',
1565 'hw/intc',
1566 'hw/isa',
1567 'hw/mem',
1568 'hw/mips',
1569 'hw/misc',
1570 'hw/misc/macio',
1571 'hw/net',
98e5d7a2 1572 'hw/net/can',
a81df1b6
PB
1573 'hw/nvram',
1574 'hw/pci',
1575 'hw/pci-host',
1576 'hw/ppc',
1577 'hw/rdma',
1578 'hw/rdma/vmw',
1579 'hw/rtc',
1580 'hw/s390x',
1581 'hw/scsi',
1582 'hw/sd',
1583 'hw/sparc',
1584 'hw/sparc64',
1585 'hw/ssi',
1586 'hw/timer',
1587 'hw/tpm',
1588 'hw/usb',
1589 'hw/vfio',
1590 'hw/virtio',
1591 'hw/watchdog',
1592 'hw/xen',
1593 'hw/gpio',
a81df1b6
PB
1594 'migration',
1595 'net',
8b7a5507 1596 'softmmu',
a81df1b6
PB
1597 'ui',
1598 ]
1599endif
1600trace_events_subdirs += [
1601 'hw/core',
1602 'qapi',
1603 'qom',
1604 'target/arm',
1605 'target/hppa',
1606 'target/i386',
a9dc68d9 1607 'target/i386/kvm',
a81df1b6
PB
1608 'target/mips',
1609 'target/ppc',
1610 'target/riscv',
1611 'target/s390x',
1612 'target/sparc',
1613 'util',
1614]
1615
0df750e9
MAL
1616vhost_user = not_found
1617if 'CONFIG_VHOST_USER' in config_host
1618 libvhost_user = subproject('libvhost-user')
1619 vhost_user = libvhost_user.get_variable('vhost_user_dep')
1620endif
1621
a81df1b6
PB
1622subdir('qapi')
1623subdir('qobject')
1624subdir('stubs')
1625subdir('trace')
1626subdir('util')
5582c58f
MAL
1627subdir('qom')
1628subdir('authz')
a81df1b6 1629subdir('crypto')
2d78b56e 1630subdir('ui')
a81df1b6 1631
3154fee4
MAL
1632
1633if enable_modules
1634 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1635 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1636endif
1637
2becc36a 1638stub_ss = stub_ss.apply(config_all, strict: false)
a81df1b6
PB
1639
1640util_ss.add_all(trace_ss)
2becc36a 1641util_ss = util_ss.apply(config_all, strict: false)
a81df1b6
PB
1642libqemuutil = static_library('qemuutil',
1643 sources: util_ss.sources() + stub_ss.sources() + genh,
aa087962 1644 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
a81df1b6 1645qemuutil = declare_dependency(link_with: libqemuutil,
04c6f1e7 1646 sources: genh + version_res)
a81df1b6 1647
abff1abf
PB
1648decodetree = generator(find_program('scripts/decodetree.py'),
1649 output: 'decode-@BASENAME@.c.inc',
1650 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1651
478e943f 1652subdir('audio')
7fcfd456 1653subdir('io')
848e8ff6 1654subdir('chardev')
ec0d5893 1655subdir('fsdev')
abff1abf 1656subdir('libdecnumber')
d3b18480 1657subdir('target')
708eab42 1658subdir('dump')
ec0d5893 1659
5e5733e5
MAL
1660block_ss.add(files(
1661 'block.c',
1662 'blockjob.c',
1663 'job.c',
1664 'qemu-io-cmds.c',
1665))
1666block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
1667
1668subdir('nbd')
1669subdir('scsi')
1670subdir('block')
1671
4a96337d
PB
1672blockdev_ss.add(files(
1673 'blockdev.c',
cbc20bfb 1674 'blockdev-nbd.c',
4a96337d
PB
1675 'iothread.c',
1676 'job-qmp.c',
1677))
1678
1679# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1680# os-win32.c does not
1681blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1682softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
4a96337d
PB
1683
1684common_ss.add(files('cpus-common.c'))
1685
5d3ea0e1 1686subdir('softmmu')
c9322ab5 1687
f343346b 1688common_ss.add(capstone)
d9f24bf5 1689specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
c9322ab5
MAL
1690specific_ss.add(files('exec-vary.c'))
1691specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1692 'fpu/softfloat.c',
1693 'tcg/optimize.c',
1694 'tcg/tcg-common.c',
1695 'tcg/tcg-op-gvec.c',
1696 'tcg/tcg-op-vec.c',
1697 'tcg/tcg-op.c',
1698 'tcg/tcg.c',
1699))
1700specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1701
ab318051 1702subdir('backends')
c574e161 1703subdir('disas')
55166230 1704subdir('migration')
ff219dca 1705subdir('monitor')
cdaf0722 1706subdir('net')
17ef2af6 1707subdir('replay')
582ea95f 1708subdir('hw')
1a82878a 1709subdir('accel')
f556b4a1 1710subdir('plugins')
b309c321 1711subdir('bsd-user')
3a30446a
MAL
1712subdir('linux-user')
1713
b309c321
MAL
1714bsd_user_ss.add(files('gdbstub.c'))
1715specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1716
3a30446a
MAL
1717linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1718specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
5d3ea0e1 1719
a2ce7dbd
PB
1720# needed for fuzzing binaries
1721subdir('tests/qtest/libqos')
64ed6f92 1722subdir('tests/qtest/fuzz')
a2ce7dbd 1723
a0c9162c
PB
1724########################
1725# Library dependencies #
1726########################
1727
3154fee4
MAL
1728block_mods = []
1729softmmu_mods = []
1730foreach d, list : modules
1731 foreach m, module_ss : list
1732 if enable_modules and targetos != 'windows'
3e292c51 1733 module_ss = module_ss.apply(config_all, strict: false)
3154fee4
MAL
1734 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1735 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1736 if d == 'block'
1737 block_mods += sl
1738 else
1739 softmmu_mods += sl
1740 endif
1741 else
1742 if d == 'block'
1743 block_ss.add_all(module_ss)
1744 else
1745 softmmu_ss.add_all(module_ss)
1746 endif
1747 endif
1748 endforeach
1749endforeach
1750
1751nm = find_program('nm')
604f3e4e 1752undefsym = find_program('scripts/undefsym.py')
3154fee4
MAL
1753block_syms = custom_target('block.syms', output: 'block.syms',
1754 input: [libqemuutil, block_mods],
1755 capture: true,
1756 command: [undefsym, nm, '@INPUT@'])
1757qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1758 input: [libqemuutil, softmmu_mods],
1759 capture: true,
1760 command: [undefsym, nm, '@INPUT@'])
1761
da33fc09
PMD
1762qom_ss = qom_ss.apply(config_host, strict: false)
1763libqom = static_library('qom', qom_ss.sources() + genh,
1764 dependencies: [qom_ss.dependencies()],
1765 name_suffix: 'fa')
1766
1767qom = declare_dependency(link_whole: libqom)
1768
55567891
PMD
1769authz_ss = authz_ss.apply(config_host, strict: false)
1770libauthz = static_library('authz', authz_ss.sources() + genh,
1771 dependencies: [authz_ss.dependencies()],
1772 name_suffix: 'fa',
1773 build_by_default: false)
1774
1775authz = declare_dependency(link_whole: libauthz,
1776 dependencies: qom)
1777
2389304a
PMD
1778crypto_ss = crypto_ss.apply(config_host, strict: false)
1779libcrypto = static_library('crypto', crypto_ss.sources() + genh,
1780 dependencies: [crypto_ss.dependencies()],
1781 name_suffix: 'fa',
1782 build_by_default: false)
1783
1784crypto = declare_dependency(link_whole: libcrypto,
1785 dependencies: [authz, qom])
1786
f78536b1
PMD
1787io_ss = io_ss.apply(config_host, strict: false)
1788libio = static_library('io', io_ss.sources() + genh,
1789 dependencies: [io_ss.dependencies()],
1790 link_with: libqemuutil,
1791 name_suffix: 'fa',
1792 build_by_default: false)
1793
1794io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
1795
7e6edef3
PMD
1796libmigration = static_library('migration', sources: migration_files + genh,
1797 name_suffix: 'fa',
1798 build_by_default: false)
1799migration = declare_dependency(link_with: libmigration,
1800 dependencies: [zlib, qom, io])
1801softmmu_ss.add(migration)
1802
5e5733e5
MAL
1803block_ss = block_ss.apply(config_host, strict: false)
1804libblock = static_library('block', block_ss.sources() + genh,
1805 dependencies: block_ss.dependencies(),
1806 link_depends: block_syms,
1807 name_suffix: 'fa',
1808 build_by_default: false)
1809
1810block = declare_dependency(link_whole: [libblock],
b7c70bf2
MAL
1811 link_args: '@block.syms',
1812 dependencies: [crypto, io])
5e5733e5 1813
4fb9071f
SH
1814blockdev_ss = blockdev_ss.apply(config_host, strict: false)
1815libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
1816 dependencies: blockdev_ss.dependencies(),
1817 name_suffix: 'fa',
1818 build_by_default: false)
1819
1820blockdev = declare_dependency(link_whole: [libblockdev],
1821 dependencies: [block])
1822
ff219dca
PB
1823qmp_ss = qmp_ss.apply(config_host, strict: false)
1824libqmp = static_library('qmp', qmp_ss.sources() + genh,
1825 dependencies: qmp_ss.dependencies(),
1826 name_suffix: 'fa',
1827 build_by_default: false)
1828
1829qmp = declare_dependency(link_whole: [libqmp])
1830
c2306d71
PMD
1831libchardev = static_library('chardev', chardev_ss.sources() + genh,
1832 name_suffix: 'fa',
1833 build_by_default: false)
1834
1835chardev = declare_dependency(link_whole: libchardev)
1836
e28ab096
PMD
1837libhwcore = static_library('hwcore', sources: hwcore_files + genh,
1838 name_suffix: 'fa',
1839 build_by_default: false)
1840hwcore = declare_dependency(link_whole: libhwcore)
1841common_ss.add(hwcore)
1842
064f8ee7
PMD
1843###########
1844# Targets #
1845###########
1846
3154fee4
MAL
1847foreach m : block_mods + softmmu_mods
1848 shared_module(m.name(),
1849 name_prefix: '',
1850 link_whole: m,
1851 install: true,
16bf7a33 1852 install_dir: qemu_moddir)
3154fee4
MAL
1853endforeach
1854
4fb9071f 1855softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
64ed6f92
PB
1856common_ss.add(qom, qemuutil)
1857
1858common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
2becc36a
PB
1859common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
1860
1861common_all = common_ss.apply(config_all, strict: false)
1862common_all = static_library('common',
1863 build_by_default: false,
1864 sources: common_all.sources() + genh,
1865 dependencies: common_all.dependencies(),
1866 name_suffix: 'fa')
1867
c9322ab5
MAL
1868feature_to_c = find_program('scripts/feature_to_c.sh')
1869
fd5eef85 1870emulators = {}
2becc36a
PB
1871foreach target : target_dirs
1872 config_target = config_target_mak[target]
1873 target_name = config_target['TARGET_NAME']
1874 arch = config_target['TARGET_BASE_ARCH']
859aef02 1875 arch_srcs = [config_target_h[target]]
64ed6f92
PB
1876 arch_deps = []
1877 c_args = ['-DNEED_CPU_H',
1878 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
1879 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
b6c7cfd4 1880 link_args = emulator_link_args
2becc36a 1881
859aef02 1882 config_target += config_host
2becc36a
PB
1883 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
1884 if targetos == 'linux'
1885 target_inc += include_directories('linux-headers', is_system: true)
1886 endif
1887 if target.endswith('-softmmu')
1888 qemu_target_name = 'qemu-system-' + target_name
1889 target_type='system'
abff1abf
PB
1890 t = target_softmmu_arch[arch].apply(config_target, strict: false)
1891 arch_srcs += t.sources()
64ed6f92 1892 arch_deps += t.dependencies()
abff1abf 1893
2c44220d
MAL
1894 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
1895 hw = hw_arch[hw_dir].apply(config_target, strict: false)
1896 arch_srcs += hw.sources()
64ed6f92 1897 arch_deps += hw.dependencies()
2c44220d 1898
2becc36a 1899 arch_srcs += config_devices_h[target]
64ed6f92 1900 link_args += ['@block.syms', '@qemu.syms']
2becc36a 1901 else
3a30446a 1902 abi = config_target['TARGET_ABI_DIR']
2becc36a
PB
1903 target_type='user'
1904 qemu_target_name = 'qemu-' + target_name
1905 if 'CONFIG_LINUX_USER' in config_target
1906 base_dir = 'linux-user'
1907 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1908 else
1909 base_dir = 'bsd-user'
1910 endif
1911 target_inc += include_directories(
1912 base_dir,
3a30446a 1913 base_dir / abi,
2becc36a 1914 )
3a30446a
MAL
1915 if 'CONFIG_LINUX_USER' in config_target
1916 dir = base_dir / abi
1917 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1918 if config_target.has_key('TARGET_SYSTBL_ABI')
1919 arch_srcs += \
1920 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1921 extra_args : config_target['TARGET_SYSTBL_ABI'])
1922 endif
1923 endif
2becc36a
PB
1924 endif
1925
c9322ab5
MAL
1926 if 'TARGET_XML_FILES' in config_target
1927 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1928 output: target + '-gdbstub-xml.c',
1929 input: files(config_target['TARGET_XML_FILES'].split()),
1930 command: [feature_to_c, '@INPUT@'],
1931 capture: true)
1932 arch_srcs += gdbstub_xml
1933 endif
1934
abff1abf
PB
1935 t = target_arch[arch].apply(config_target, strict: false)
1936 arch_srcs += t.sources()
64ed6f92 1937 arch_deps += t.dependencies()
abff1abf 1938
2becc36a
PB
1939 target_common = common_ss.apply(config_target, strict: false)
1940 objects = common_all.extract_objects(target_common.sources())
64ed6f92 1941 deps = target_common.dependencies()
2becc36a 1942
2becc36a
PB
1943 target_specific = specific_ss.apply(config_target, strict: false)
1944 arch_srcs += target_specific.sources()
64ed6f92 1945 arch_deps += target_specific.dependencies()
2becc36a 1946
64ed6f92 1947 lib = static_library('qemu-' + target,
859aef02 1948 sources: arch_srcs + genh,
b7612f45 1949 dependencies: arch_deps,
2becc36a
PB
1950 objects: objects,
1951 include_directories: target_inc,
64ed6f92
PB
1952 c_args: c_args,
1953 build_by_default: false,
2becc36a 1954 name_suffix: 'fa')
64ed6f92
PB
1955
1956 if target.endswith('-softmmu')
1957 execs = [{
1958 'name': 'qemu-system-' + target_name,
1959 'gui': false,
1960 'sources': files('softmmu/main.c'),
1961 'dependencies': []
1962 }]
35be72ba 1963 if targetos == 'windows' and (sdl.found() or gtk.found())
64ed6f92
PB
1964 execs += [{
1965 'name': 'qemu-system-' + target_name + 'w',
1966 'gui': true,
1967 'sources': files('softmmu/main.c'),
1968 'dependencies': []
1969 }]
1970 endif
1971 if config_host.has_key('CONFIG_FUZZ')
1972 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1973 execs += [{
1974 'name': 'qemu-fuzz-' + target_name,
1975 'gui': false,
1976 'sources': specific_fuzz.sources(),
1977 'dependencies': specific_fuzz.dependencies(),
64ed6f92
PB
1978 }]
1979 endif
1980 else
1981 execs = [{
1982 'name': 'qemu-' + target_name,
1983 'gui': false,
1984 'sources': [],
1985 'dependencies': []
1986 }]
1987 endif
1988 foreach exe: execs
fd5eef85
PB
1989 emulators += {exe['name']:
1990 executable(exe['name'], exe['sources'],
64ed6f92
PB
1991 install: true,
1992 c_args: c_args,
1993 dependencies: arch_deps + deps + exe['dependencies'],
1994 objects: lib.extract_all_objects(recursive: true),
1995 link_language: link_language,
1996 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1997 link_args: link_args,
1998 gui_app: exe['gui'])
fd5eef85 1999 }
10e1d263
MAL
2000
2001 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
2002 foreach stp: [
bd5f973a
SH
2003 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
2004 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
10e1d263
MAL
2005 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
2006 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
2007 ]
bd5f973a 2008 custom_target(exe['name'] + stp['ext'],
10e1d263 2009 input: trace_events_all,
bd5f973a 2010 output: exe['name'] + stp['ext'],
10e1d263
MAL
2011 capture: true,
2012 install: stp['install'],
16bf7a33 2013 install_dir: get_option('datadir') / 'systemtap/tapset',
10e1d263
MAL
2014 command: [
2015 tracetool, '--group=all', '--format=' + stp['fmt'],
2016 '--binary=' + stp['bin'],
2017 '--target-name=' + target_name,
2018 '--target-type=' + target_type,
2019 '--probe-prefix=qemu.' + target_type + '.' + target_name,
2020 '@INPUT@',
2021 ])
2022 endforeach
2023 endif
64ed6f92 2024 endforeach
2becc36a
PB
2025endforeach
2026
931049b4 2027# Other build targets
897b5afa 2028
f556b4a1
PB
2029if 'CONFIG_PLUGIN' in config_host
2030 install_headers('include/qemu/qemu-plugin.h')
2031endif
2032
f15bff25
PB
2033if 'CONFIG_GUEST_AGENT' in config_host
2034 subdir('qga')
2035endif
2036
9755c94a
LV
2037# Don't build qemu-keymap if xkbcommon is not explicitly enabled
2038# when we don't build tools or system
4113f4cf 2039if xkbcommon.found()
28742467
MAL
2040 # used for the update-keymaps target, so include rules even if !have_tools
2041 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
2042 dependencies: [qemuutil, xkbcommon], install: have_tools)
2043endif
2044
931049b4 2045if have_tools
b7c70bf2
MAL
2046 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
2047 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
2048 qemu_io = executable('qemu-io', files('qemu-io.c'),
2049 dependencies: [block, qemuutil], install: true)
eb705985 2050 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
cbc20bfb 2051 dependencies: [blockdev, qemuutil], install: true)
b7c70bf2 2052
7c58bb76 2053 subdir('storage-daemon')
a9c9727c 2054 subdir('contrib/rdmacm-mux')
1d7bb6ab 2055 subdir('contrib/elf2dmp')
a9c9727c 2056
157e7b13
MAL
2057 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
2058 dependencies: qemuutil,
2059 install: true)
2060
931049b4 2061 if 'CONFIG_VHOST_USER' in config_host
2d7ac0af 2062 subdir('contrib/vhost-user-blk')
b7612f45 2063 subdir('contrib/vhost-user-gpu')
32fcc624 2064 subdir('contrib/vhost-user-input')
99650b62 2065 subdir('contrib/vhost-user-scsi')
931049b4 2066 endif
8f51e01c
MAL
2067
2068 if targetos == 'linux'
2069 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2070 dependencies: [qemuutil, libcap_ng],
2071 install: true,
2072 install_dir: get_option('libexecdir'))
897b5afa
MAL
2073
2074 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2075 dependencies: [authz, crypto, io, qom, qemuutil,
6ec0e15d 2076 libcap_ng, mpathpersist],
897b5afa 2077 install: true)
8f51e01c
MAL
2078 endif
2079
5ee24e78
MAL
2080 if 'CONFIG_IVSHMEM' in config_host
2081 subdir('contrib/ivshmem-client')
2082 subdir('contrib/ivshmem-server')
2083 endif
931049b4
PB
2084endif
2085
f5aa6320 2086subdir('scripts')
3f99cf57 2087subdir('tools')
bdcbea7a 2088subdir('pc-bios')
f8aa24ea 2089subdir('docs')
e3667660 2090subdir('tests')
e8f3bd71
MAL
2091if 'CONFIG_GTK' in config_host
2092 subdir('po')
2093endif
3f99cf57 2094
8adfeba9
MAL
2095if host_machine.system() == 'windows'
2096 nsis_cmd = [
2097 find_program('scripts/nsis.py'),
2098 '@OUTPUT@',
2099 get_option('prefix'),
2100 meson.current_source_dir(),
24bdcc96 2101 host_machine.cpu(),
8adfeba9
MAL
2102 '--',
2103 '-DDISPLAYVERSION=' + meson.project_version(),
2104 ]
2105 if build_docs
2106 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2107 endif
2108 if 'CONFIG_GTK' in config_host
2109 nsis_cmd += '-DCONFIG_GTK=y'
2110 endif
2111
2112 nsis = custom_target('nsis',
2113 output: 'qemu-setup-' + meson.project_version() + '.exe',
2114 input: files('qemu.nsi'),
2115 build_always_stale: true,
2116 command: nsis_cmd + ['@INPUT@'])
2117 alias_target('installer', nsis)
2118endif
2119
a0c9162c
PB
2120#########################
2121# Configuration summary #
2122#########################
2123
f9332757 2124summary_info = {}
16bf7a33
PB
2125summary_info += {'Install prefix': get_option('prefix')}
2126summary_info += {'BIOS directory': qemu_datadir}
2127summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2128summary_info += {'binary directory': get_option('bindir')}
2129summary_info += {'library directory': get_option('libdir')}
2130summary_info += {'module directory': qemu_moddir}
2131summary_info += {'libexec directory': get_option('libexecdir')}
2132summary_info += {'include directory': get_option('includedir')}
2133summary_info += {'config directory': get_option('sysconfdir')}
f9332757 2134if targetos != 'windows'
16bf7a33 2135 summary_info += {'local state directory': get_option('localstatedir')}
b81efab7 2136 summary_info += {'Manual directory': get_option('mandir')}
f9332757
PB
2137else
2138 summary_info += {'local state directory': 'queried at runtime'}
2139endif
491e74c1 2140summary_info += {'Doc directory': get_option('docdir')}
f9332757
PB
2141summary_info += {'Build directory': meson.current_build_dir()}
2142summary_info += {'Source path': meson.current_source_dir()}
2143summary_info += {'GIT binary': config_host['GIT']}
2144summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
2145summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
2146summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
2147if link_language == 'cpp'
2148 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
2149else
2150 summary_info += {'C++ compiler': false}
2151endif
2152if targetos == 'darwin'
2153 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
2154endif
2155summary_info += {'ARFLAGS': config_host['ARFLAGS']}
47b30835
PB
2156summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2157 + ['-O' + get_option('optimization')]
2158 + (get_option('debug') ? ['-g'] : []))}
2159if link_language == 'cpp'
2160 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2161 + ['-O' + get_option('optimization')]
2162 + (get_option('debug') ? ['-g'] : []))}
2163endif
2164link_args = get_option(link_language + '_link_args')
2165if link_args.length() > 0
2166 summary_info += {'LDFLAGS': ' '.join(link_args)}
2167endif
f9332757
PB
2168summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2169summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
2170summary_info += {'make': config_host['MAKE']}
f9332757 2171summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
e3667660 2172summary_info += {'sphinx-build': sphinx_build.found()}
f9332757
PB
2173summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2174# TODO: add back version
4d34a86b
PB
2175summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
2176if slirp_opt != 'disabled'
f9332757
PB
2177 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2178endif
2179summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2180if config_host.has_key('CONFIG_MODULES')
2181 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2182endif
2183summary_info += {'host CPU': cpu}
2184summary_info += {'host endianness': build_machine.endian()}
fdb75aef 2185summary_info += {'target list': ' '.join(target_dirs)}
f9332757 2186summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
deb62371 2187summary_info += {'sparse enabled': sparse.found()}
f9332757
PB
2188summary_info += {'strip binaries': get_option('strip')}
2189summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
cdad781d 2190summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
3e8529dd 2191summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
f9332757
PB
2192if targetos == 'darwin'
2193 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
2194endif
2195# TODO: add back version
35be72ba
PB
2196summary_info += {'SDL support': sdl.found()}
2197summary_info += {'SDL image support': sdl_image.found()}
f9332757
PB
2198# TODO: add back version
2199summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
2200summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
b7612f45 2201summary_info += {'pixman': pixman.found()}
f9332757
PB
2202# TODO: add back version
2203summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
2204summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
2205summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
2206# TODO: add back version
2207summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
2208if config_host.has_key('CONFIG_GCRYPT')
2209 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
2210 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2211endif
2212# TODO: add back version
2213summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
2214if config_host.has_key('CONFIG_NETTLE')
2215 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2216endif
2217summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
2218summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
5285e593
YL
2219summary_info += {'iconv support': iconv.found()}
2220summary_info += {'curses support': curses.found()}
f9332757
PB
2221# TODO: add back version
2222summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
f9cd86fe 2223summary_info += {'curl support': curl.found()}
f9332757
PB
2224summary_info += {'mingw32 support': targetos == 'windows'}
2225summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2226summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2227summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
2228summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
cece116c 2229summary_info += {'build virtiofs daemon': have_virtiofsd}
6ec0e15d 2230summary_info += {'Multipath support': mpathpersist.found()}
a0b93237
PB
2231summary_info += {'VNC support': vnc.found()}
2232if vnc.found()
2233 summary_info += {'VNC SASL support': sasl.found()}
2234 summary_info += {'VNC JPEG support': jpeg.found()}
2235 summary_info += {'VNC PNG support': png.found()}
f9332757
PB
2236endif
2237summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2238if config_host.has_key('CONFIG_XEN_BACKEND')
2239 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2240endif
8c6d4ff4 2241summary_info += {'brlapi support': brlapi.found()}
e3667660 2242summary_info += {'Documentation': build_docs}
f9332757
PB
2243summary_info += {'PIE': get_option('b_pie')}
2244summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2245summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2246summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2247summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
2248summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
c8d5450b 2249summary_info += {'Install blobs': get_option('install_blobs')}
05512f55
PB
2250summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2251summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2252summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2253summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
2254summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2255if config_all.has_key('CONFIG_TCG')
2256 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
2257 summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
2258endif
aa087962 2259summary_info += {'malloc trim support': has_malloc_trim}
f9332757
PB
2260summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2261summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
fbb4121d 2262summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
f9332757
PB
2263summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
2264summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
2265summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2266summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2267summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2268summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
2269summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
b54b82df 2270summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
f9332757
PB
2271summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2272summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2273summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2274summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
b54b82df 2275summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
e5e856c1 2276summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
f9332757
PB
2277summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2278summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2279summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2280if config_host['TRACE_BACKENDS'].split().contains('simple')
2281 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2282endif
2283# TODO: add back protocol and server version
2284summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
2285summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
2286summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
2287summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
0a40bcb7 2288summary_info += {'U2F support': u2f.found()}
f9332757
PB
2289summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
2290summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
2291summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
2292summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
2293summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
2294summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
2295summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2296if targetos == 'windows'
2297 if 'WIN_SDK' in config_host
2298 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2299 endif
2300 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2301 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
4bad7c3b 2302 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')}
f9332757
PB
2303endif
2304summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
9e62ba48
DB
2305summary_info += {'CFI support': get_option('cfi')}
2306summary_info += {'CFI debug support': get_option('cfi_debug')}
f9332757
PB
2307summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2308summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2309summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2310summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2311summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
08821ca2 2312summary_info += {'GlusterFS support': glusterfs.found()}
bf0e56a3 2313summary_info += {'gcov': get_option('b_coverage')}
f9332757
PB
2314summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2315summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
2316summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2317summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
2318summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
2319summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
29ba6116 2320summary_info += {'bzip2 support': libbzip2.found()}
f9332757
PB
2321summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
2322summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
2323summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2324summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
aa087962 2325summary_info += {'memory allocator': get_option('malloc')}
f9332757
PB
2326summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2327summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2328summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2329summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2330summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2331summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2332summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2333summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2334summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2335summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2336summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2337summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
8b18cdbf 2338summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
f9332757
PB
2339summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2340summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
f01496a3 2341summary_info += {'libudev': libudev.found()}
f9332757
PB
2342summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
2343summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2344summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2345if config_host.has_key('HAVE_GDB_BIN')
2346 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2347endif
2348summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2349summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2350summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
a484a719 2351summary_info += {'FUSE exports': fuse.found()}
df4ea709 2352summary_info += {'FUSE lseek': fuse_lseek.found()}
f9332757
PB
2353summary(summary_info, bool_yn: true)
2354
2355if not supported_cpus.contains(cpu)
2356 message()
2357 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2358 message()
2359 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2360 message('The QEMU project intends to remove support for this host CPU in')
2361 message('a future release if nobody volunteers to maintain it and to')
2362 message('provide a build host for our continuous integration setup.')
2363 message('configure has succeeded and you can continue to build, but')
2364 message('if you care about QEMU on this platform you should contact')
2365 message('us upstream at qemu-devel@nongnu.org.')
2366endif
2367
2368if not supported_oses.contains(targetos)
2369 message()
2370 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2371 message()
2372 message('Host OS ' + targetos + 'support is not currently maintained.')
2373 message('The QEMU project intends to remove support for this host OS in')
2374 message('a future release if nobody volunteers to maintain it and to')
2375 message('provide a build host for our continuous integration setup.')
2376 message('configure has succeeded and you can continue to build, but')
2377 message('if you care about QEMU on this platform you should contact')
2378 message('us upstream at qemu-devel@nongnu.org.')
2379endif