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