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