1 project('qemu', ['c'], meson_version: '>=0.55.0',
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' ] : []),
4 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
6 not_found = dependency('', required: false)
7 if meson.version().version_compare('>=0.56.0')
8 keyval = import('keyval')
10 keyval = import('unstable-keyval')
12 ss = import('sourceset')
15 sh = find_program('sh')
16 cc = meson.get_compiler('c')
17 config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
18 enable_modules = 'CONFIG_MODULES' in config_host
19 enable_static = 'CONFIG_STATIC' in config_host
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.)
26 tmpdir = meson.current_build_dir() / 'meson-private/temp'
28 if get_option('qemu_suffix').startswith('/')
29 error('qemu_suffix cannot start with a /')
32 qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
33 qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
34 qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
35 qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
37 qemu_desktopdir = get_option('datadir') / 'applications'
38 qemu_icondir = get_option('datadir') / 'icons'
40 config_host_data = configuration_data()
43 target_dirs = config_host['TARGET_DIRS'].split()
46 foreach target : target_dirs
47 have_user = have_user or target.endswith('-user')
48 have_system = have_system or target.endswith('-softmmu')
50 have_tools = 'CONFIG_TOOLS' in config_host
51 have_block = have_system or have_tools
53 python = import('python').find_installation()
55 supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
56 supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
57 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
59 cpu = host_machine.cpu_family()
60 targetos = host_machine.system()
62 if cpu in ['x86', 'x86_64']
63 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
65 kvm_targets = ['aarch64-softmmu']
67 kvm_targets = ['s390x-softmmu']
68 elif cpu in ['ppc', 'ppc64']
69 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
70 elif cpu in ['mips', 'mips64']
71 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
76 accelerator_targets = { 'CONFIG_KVM': kvm_targets }
77 if 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'],
83 if cpu in ['x86', 'x86_64']
84 accelerator_targets += {
85 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
86 'CONFIG_HVF': ['x86_64-softmmu'],
87 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
95 # Specify linker-script with add_project_link_arguments so that it is not placed
96 # within a linker --start-group/--end-group pair
97 if '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'])
103 add_project_arguments(config_host['QEMU_CFLAGS'].split(),
104 native: false, language: ['c', 'objc'])
105 add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
106 native: false, language: 'cpp')
107 add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
108 native: false, language: ['c', 'cpp', 'objc'])
110 if targetos == 'linux'
111 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
112 '-isystem', 'linux-headers',
113 language: ['c', 'cpp'])
116 if 'CONFIG_TCG_INTERPRETER' in config_host
118 elif config_host['ARCH'] == 'sparc64'
120 elif config_host['ARCH'] == 's390x'
122 elif config_host['ARCH'] in ['x86_64', 'x32']
124 elif config_host['ARCH'] == 'ppc64'
126 elif config_host['ARCH'] in ['riscv32', 'riscv64']
129 tcg_arch = config_host['ARCH']
131 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
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'])
139 link_language = meson.get_external_property('link_language', 'cpp')
140 if link_language == 'cpp'
141 add_languages('cpp', required: true, native: false)
143 if host_machine.system() == 'darwin'
144 add_languages('objc', required: false, native: false)
147 sparse = find_program('cgcc', required: get_option('sparse'))
150 command: [find_program('scripts/check_sparse.py'),
151 'compile_commands.json', sparse.full_path(), '-Wbitwise',
152 '-Wno-transparent-union', '-Wno-old-initializer',
153 '-Wno-non-pointer-null'])
156 ###########################################
157 # Target-specific checks and dependencies #
158 ###########################################
160 if targetos != 'linux' and get_option('mpath').enabled()
161 error('Multipath is supported only on Linux')
164 m = cc.find_library('m', required: false)
165 util = cc.find_library('util', required: false)
171 emulator_link_args = []
174 if targetos == 'windows'
175 socket = cc.find_library('ws2_32')
176 winmm = cc.find_library('winmm')
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('.'))
182 elif targetos == 'darwin'
183 coref = dependency('appleframeworks', modules: 'CoreFoundation')
184 iokit = dependency('appleframeworks', modules: 'IOKit')
185 cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
186 elif targetos == 'sunos'
187 socket = [cc.find_library('socket'),
188 cc.find_library('nsl'),
189 cc.find_library('resolv')]
190 elif targetos == 'haiku'
191 socket = [cc.find_library('posix_error_mapper'),
192 cc.find_library('network'),
193 cc.find_library('bsd')]
194 elif 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')
202 if not get_option('kvm').disabled() and targetos == 'linux'
203 accelerators += 'CONFIG_KVM'
205 if 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'
209 have_xen_pci_passthrough = false
211 if not get_option('whpx').disabled() and targetos == 'windows'
212 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
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'
219 if not get_option('hvf').disabled()
220 hvf = dependency('appleframeworks', modules: 'Hypervisor',
221 required: get_option('hvf'))
223 accelerators += 'CONFIG_HVF'
226 if not get_option('hax').disabled()
227 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
228 accelerators += 'CONFIG_HAX'
231 if 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))
236 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
239 accelerators += 'CONFIG_TCG'
240 config_host += { 'CONFIG_TCG': 'y' }
243 if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
244 error('KVM not available on this platform')
246 if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
247 error('HVF not available on this platform')
249 if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
250 error('WHPX not available on this platform')
252 if 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')
256 error('Xen PCI passthrough requested but Xen not enabled')
259 if not cocoa.found() and get_option('cocoa').enabled()
260 error('Cocoa not available on this platform')
267 # The path to glib.h is added to all compilation commands. This was
268 # grandfathered in from the QEMU Makefiles.
269 add_project_arguments(config_host['GLIB_CFLAGS'].split(),
270 native: false, language: ['c', 'cpp', 'objc'])
271 glib = 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)
274 meson.override_dependency('glib-2.0', glib)
277 if 'CONFIG_GIO' in config_host
278 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
279 link_args: config_host['GIO_LIBS'].split())
282 if 'CONFIG_TRACE_UST' in config_host
283 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
286 if 'CONFIG_TRACE_UST' in config_host
287 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
290 if 'CONFIG_GCRYPT' in config_host
291 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
292 link_args: config_host['GCRYPT_LIBS'].split())
295 if 'CONFIG_NETTLE' in config_host
296 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
297 link_args: config_host['NETTLE_LIBS'].split())
300 if 'CONFIG_GNUTLS' in config_host
301 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
302 link_args: config_host['GNUTLS_LIBS'].split())
305 if have_system or have_tools
306 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
307 method: 'pkg-config', static: enable_static)
310 if 'CONFIG_AUTH_PAM' in config_host
311 pam = cc.find_library('pam')
313 libaio = cc.find_library('aio', required: false)
314 zlib = dependency('zlib', required: true, static: enable_static)
315 linux_io_uring = not_found
316 if '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())
321 if 'CONFIG_LIBXML2' in config_host
322 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
323 link_args: config_host['LIBXML2_LIBS'].split())
326 if not get_option('libnfs').auto() or have_block
327 libnfs = dependency('libnfs', version: '>=1.9.3',
328 required: get_option('libnfs'),
329 method: 'pkg-config', static: enable_static)
332 if 'CONFIG_ATTR' in config_host
333 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
336 if 'CONFIG_SECCOMP' in config_host
337 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
338 link_args: config_host['SECCOMP_LIBS'].split())
340 libcap_ng = not_found
341 if 'CONFIG_LIBCAP_NG' in config_host
342 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
344 if get_option('xkbcommon').auto() and not have_system and not have_tools
345 xkbcommon = not_found
347 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
348 method: 'pkg-config', static: enable_static)
351 if config_host.has_key('CONFIG_VDE')
352 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
355 if 'CONFIG_LIBPULSE' in config_host
356 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
357 link_args: config_host['PULSE_LIBS'].split())
360 if 'CONFIG_ALSA' in config_host
361 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
362 link_args: config_host['ALSA_LIBS'].split())
365 if 'CONFIG_LIBJACK' in config_host
366 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
369 spice_headers = not_found
370 if 'CONFIG_SPICE' in config_host
371 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
372 link_args: config_host['SPICE_LIBS'].split())
373 spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
375 rt = cc.find_library('rt', required: false)
377 if 'CONFIG_PLUGIN' in config_host
378 libdl = cc.find_library('dl', required: true)
381 if not get_option('libiscsi').auto() or have_block
382 libiscsi = dependency('libiscsi', version: '>=1.9.0',
383 required: get_option('libiscsi'),
384 method: 'pkg-config', static: enable_static)
387 if 'CONFIG_ZSTD' in config_host
388 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
389 link_args: config_host['ZSTD_LIBS'].split())
392 if 'CONFIG_GBM' in config_host
393 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
394 link_args: config_host['GBM_LIBS'].split())
397 if 'CONFIG_VIRGL' in config_host
398 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
399 link_args: config_host['VIRGL_LIBS'].split())
402 if not get_option('curl').auto() or have_block
403 curl = dependency('libcurl', version: '>=7.29.0',
404 method: 'pkg-config',
405 required: get_option('curl'),
406 static: enable_static)
409 if targetos == 'linux' and (have_system or have_tools)
410 libudev = dependency('libudev',
411 method: 'pkg-config',
412 required: get_option('libudev'),
413 static: enable_static)
416 mpathlibs = [libudev]
417 mpathpersist = not_found
418 mpathpersist_new_api = false
419 if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
420 mpath_test_source_new = '''
422 #include <mpath_persist.h>
423 unsigned mpath_mx_alloc_len = 1024;
425 static struct config *multipath_conf;
426 extern struct udev *udev;
427 extern struct config *get_multipath_config(void);
428 extern void put_multipath_config(struct config *conf);
430 struct config *get_multipath_config(void) { return multipath_conf; }
431 void put_multipath_config(struct config *conf) { }
434 multipath_conf = mpath_lib_init();
437 mpath_test_source_old = '''
439 #include <mpath_persist.h>
440 unsigned mpath_mx_alloc_len = 1024;
443 struct udev *udev = udev_new();
444 mpath_lib_init(udev);
447 libmpathpersist = cc.find_library('mpathpersist',
448 required: get_option('mpath'),
449 static: enable_static)
450 if libmpathpersist.found()
451 mpathlibs += libmpathpersist
453 mpathlibs += cc.find_library('devmapper',
454 required: get_option('mpath'),
455 static: enable_static)
457 mpathlibs += cc.find_library('multipath',
458 required: get_option('mpath'),
459 static: enable_static)
460 foreach lib: mpathlibs
466 if mpathlibs.length() == 0
467 msg = 'Dependencies missing for libmpathpersist'
468 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
469 mpathpersist = declare_dependency(dependencies: mpathlibs)
470 mpathpersist_new_api = true
471 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
472 mpathpersist = declare_dependency(dependencies: mpathlibs)
474 msg = 'Cannot detect libmpathpersist API'
476 if not mpathpersist.found()
477 if get_option('mpath').enabled()
480 warning(msg + ', disabling')
488 if have_system and not get_option('curses').disabled()
495 setlocale(LC_ALL, "");
497 addwstr(L"wide chars\n");
499 add_wch(WACS_DEGREE);
503 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
504 foreach curses_dep : curses_dep_list
505 if not curses.found()
506 curses = dependency(curses_dep,
508 method: 'pkg-config',
509 static: enable_static)
512 msg = get_option('curses').enabled() ? 'curses library not found' : ''
513 curses_compile_args = ['-DNCURSES_WIDECHAR']
515 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
516 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
518 msg = 'curses package not usable'
522 if not curses.found()
523 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
524 if targetos != 'windows' and not has_curses_h
525 message('Trying with /usr/include/ncursesw')
526 curses_compile_args += ['-I/usr/include/ncursesw']
527 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
530 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
531 foreach curses_libname : curses_libname_list
532 libcurses = cc.find_library(curses_libname,
534 static: enable_static)
536 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
537 curses = declare_dependency(compile_args: curses_compile_args,
538 dependencies: [libcurses])
541 msg = 'curses library not usable'
547 if not get_option('iconv').disabled()
548 foreach link_args : [ ['-liconv'], [] ]
549 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
550 # We need to use libiconv if available because mixing libiconv's headers with
551 # the system libc does not work.
552 # However, without adding glib to the dependencies -L/usr/local/lib will not be
553 # included in the command line and libiconv will not be found.
557 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
558 return conv != (iconv_t) -1;
559 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
560 iconv = declare_dependency(link_args: link_args, dependencies: glib)
565 if curses.found() and not iconv.found()
566 if get_option('iconv').enabled()
567 error('iconv not available')
569 msg = 'iconv required for curses UI but not available'
572 if not curses.found() and msg != ''
573 if get_option('curses').enabled()
576 warning(msg + ', disabling')
582 if not get_option('brlapi').auto() or have_system
583 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
584 required: get_option('brlapi'),
585 static: enable_static)
586 if brlapi.found() and not cc.links('''
589 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
591 if get_option('brlapi').enabled()
592 error('could not link brlapi')
594 warning('could not link brlapi, disabling')
601 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
602 sdl_image = not_found
605 # work around 2.0.8 bug
606 sdl = declare_dependency(compile_args: '-Wno-undef',
608 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
609 method: 'pkg-config', static: enable_static)
611 if get_option('sdl_image').enabled()
612 error('sdl-image required, but SDL was @0@'.format(
613 get_option('sdl').disabled() ? 'disabled' : 'not found'))
615 sdl_image = not_found
619 if 'CONFIG_RBD' in config_host
620 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
622 glusterfs = not_found
623 glusterfs_ftruncate_has_stat = false
624 glusterfs_iocb_has_stat = false
625 if not get_option('glusterfs').auto() or have_block
626 glusterfs = dependency('glusterfs-api', version: '>=3',
627 required: get_option('glusterfs'),
628 method: 'pkg-config', static: enable_static)
630 glusterfs_ftruncate_has_stat = cc.links('''
631 #include <glusterfs/api/glfs.h>
636 /* new glfs_ftruncate() passes two additional args */
637 return glfs_ftruncate(NULL, 0, NULL, NULL);
639 ''', dependencies: glusterfs)
640 glusterfs_iocb_has_stat = cc.links('''
641 #include <glusterfs/api/glfs.h>
643 /* new glfs_io_cbk() passes two additional glfs_stat structs */
645 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
651 glfs_io_cbk iocb = &glusterfs_iocb;
652 iocb(NULL, 0 , NULL, NULL, NULL);
655 ''', dependencies: glusterfs)
659 if 'CONFIG_LIBSSH' in config_host
660 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
661 link_args: config_host['LIBSSH_LIBS'].split())
664 if not get_option('bzip2').auto() or have_block
665 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
666 required: get_option('bzip2'),
667 static: enable_static)
668 if libbzip2.found() and not cc.links('''
670 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
672 if get_option('bzip2').enabled()
673 error('could not link libbzip2')
675 warning('could not link libbzip2, disabling')
680 if 'CONFIG_LZFSE' in config_host
681 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
684 if 'CONFIG_AUDIO_OSS' in config_host
685 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
688 if 'CONFIG_AUDIO_DSOUND' in config_host
689 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
691 coreaudio = not_found
692 if 'CONFIG_AUDIO_COREAUDIO' in config_host
693 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
696 if 'CONFIG_OPENGL' in config_host
697 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
698 link_args: config_host['OPENGL_LIBS'].split())
701 if 'CONFIG_GTK' in config_host
702 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
703 link_args: config_host['GTK_LIBS'].split())
706 if 'CONFIG_VTE' in config_host
707 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
708 link_args: config_host['VTE_LIBS'].split())
711 if 'CONFIG_X11' in config_host
712 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
713 link_args: config_host['X11_LIBS'].split())
719 if get_option('vnc').enabled()
720 vnc = declare_dependency() # dummy dependency
721 png = dependency('libpng', required: get_option('vnc_png'),
722 method: 'pkg-config', static: enable_static)
723 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
724 method: 'pkg-config', static: enable_static)
725 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
726 required: get_option('vnc_sasl'),
727 static: enable_static)
729 sasl = declare_dependency(dependencies: sasl,
730 compile_args: '-DSTRUCT_IOVEC_DEFINED')
734 if 'CONFIG_SNAPPY' in config_host
735 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
738 if 'CONFIG_LZO' in config_host
739 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
742 if 'CONFIG_RDMA' in config_host
743 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
746 if 'CONFIG_NUMA' in config_host
747 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
750 if 'CONFIG_XEN_BACKEND' in config_host
751 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
752 link_args: config_host['XEN_LIBS'].split())
755 if 'CONFIG_SMARTCARD' in config_host
756 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
757 link_args: config_host['SMARTCARD_LIBS'].split())
761 u2f = dependency('u2f-emu', required: get_option('u2f'),
762 method: 'pkg-config',
763 static: enable_static)
766 if 'CONFIG_USB_REDIR' in config_host
767 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
768 link_args: config_host['USB_REDIR_LIBS'].split())
771 if 'CONFIG_USB_LIBUSB' in config_host
772 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
773 link_args: config_host['LIBUSB_LIBS'].split())
776 if 'CONFIG_LIBPMEM' in config_host
777 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
778 link_args: config_host['LIBPMEM_LIBS'].split())
780 libdaxctl = not_found
781 if 'CONFIG_LIBDAXCTL' in config_host
782 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
785 if 'CONFIG_TASN1' in config_host
786 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
787 link_args: config_host['TASN1_LIBS'].split())
789 keyutils = dependency('libkeyutils', required: false,
790 method: 'pkg-config', static: enable_static)
792 has_gettid = cc.has_function('gettid')
797 if get_option('malloc') == 'system'
799 not get_option('malloc_trim').disabled() and \
800 cc.links('''#include <malloc.h>
801 int main(void) { malloc_trim(0); return 0; }''')
803 has_malloc_trim = false
804 malloc = cc.find_library(get_option('malloc'), required: true)
806 if not has_malloc_trim and get_option('malloc_trim').enabled()
807 if get_option('malloc') == 'system'
808 error('malloc_trim not available on this platform.')
810 error('malloc_trim not available with non-libc memory allocator')
814 # Check whether the glibc provides statx()
820 #include <sys/stat.h>
822 struct statx statxbuf;
823 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
827 has_statx = cc.links(statx_test)
829 have_vhost_user_blk_server = (targetos == 'linux' and
830 'CONFIG_VHOST_USER' in config_host)
832 if get_option('vhost_user_blk_server').enabled()
833 if targetos != 'linux'
834 error('vhost_user_blk_server requires linux')
835 elif 'CONFIG_VHOST_USER' not in config_host
836 error('vhost_user_blk_server requires vhost-user support')
838 elif get_option('vhost_user_blk_server').disabled() or not have_system
839 have_vhost_user_blk_server = false
843 if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
844 error('Cannot enable fuse-lseek while fuse is disabled')
847 fuse = dependency('fuse3', required: get_option('fuse'),
848 version: '>=3.1', method: 'pkg-config',
849 static: enable_static)
851 fuse_lseek = not_found
852 if not get_option('fuse_lseek').disabled()
853 if fuse.version().version_compare('>=3.8')
855 fuse_lseek = declare_dependency()
856 elif get_option('fuse_lseek').enabled()
858 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
860 error('fuse-lseek requires libfuse, which was not found')
867 # Check for dependency on LTO
868 if not get_option('b_lto')
869 error('Selected Control-Flow Integrity but LTO is disabled')
871 if config_host.has_key('CONFIG_MODULES')
872 error('Selected Control-Flow Integrity is not compatible with modules')
874 # Check for cfi flags. CFI requires LTO so we can't use
875 # get_supported_arguments, but need a more complex "compiles" which allows
877 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
878 args: ['-flto', '-fsanitize=cfi-icall'] )
879 cfi_flags += '-fsanitize=cfi-icall'
881 error('-fsanitize=cfi-icall is not supported by the compiler')
883 if cc.compiles('int main () { return 0; }',
884 name: '-fsanitize-cfi-icall-generalize-pointers',
885 args: ['-flto', '-fsanitize=cfi-icall',
886 '-fsanitize-cfi-icall-generalize-pointers'] )
887 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
889 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
891 if get_option('cfi_debug')
892 if cc.compiles('int main () { return 0; }',
893 name: '-fno-sanitize-trap=cfi-icall',
894 args: ['-flto', '-fsanitize=cfi-icall',
895 '-fno-sanitize-trap=cfi-icall'] )
896 cfi_flags += '-fno-sanitize-trap=cfi-icall'
898 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
901 add_project_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
902 add_project_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
909 config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
910 config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
911 config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
912 config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
913 config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
914 config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
915 config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
916 config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
917 config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
918 config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
919 config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
920 config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
922 config_host_data.set('CONFIG_BRLAPI', brlapi.found())
923 config_host_data.set('CONFIG_COCOA', cocoa.found())
924 config_host_data.set('CONFIG_LIBUDEV', libudev.found())
925 config_host_data.set('CONFIG_MPATH', mpathpersist.found())
926 config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
927 config_host_data.set('CONFIG_CURL', curl.found())
928 config_host_data.set('CONFIG_CURSES', curses.found())
929 config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
931 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
932 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
933 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
934 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
935 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
936 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
938 config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
939 config_host_data.set('CONFIG_LIBNFS', libnfs.found())
940 config_host_data.set('CONFIG_SDL', sdl.found())
941 config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
942 config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
943 config_host_data.set('CONFIG_VNC', vnc.found())
944 config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
945 config_host_data.set('CONFIG_VNC_PNG', png.found())
946 config_host_data.set('CONFIG_VNC_SASL', sasl.found())
947 config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
948 config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
949 config_host_data.set('CONFIG_GETTID', has_gettid)
950 config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
951 config_host_data.set('CONFIG_STATX', has_statx)
952 config_host_data.set('CONFIG_FUSE', fuse.found())
953 config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
954 config_host_data.set('CONFIG_CFI', get_option('cfi'))
955 config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
956 config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
957 config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
958 config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
960 config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
961 config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
962 config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
963 config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
964 config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
965 config_host_data.set('HAVE_SYS_SIGNAL_H', cc.has_header('sys/signal.h'))
967 ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
968 arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
969 strings = ['HOST_DSOSUF', 'CONFIG_IASL']
970 foreach k, v: config_host
971 if ignored.contains(k)
973 elif arrays.contains(k)
975 v = '"' + '", "'.join(v.split()) + '", '
977 config_host_data.set(k, v)
979 config_host_data.set('HOST_' + v.to_upper(), 1)
980 elif strings.contains(k)
981 if not k.startswith('CONFIG_')
982 k = 'CONFIG_' + k.to_upper()
984 config_host_data.set_quoted(k, v)
985 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
986 config_host_data.set(k, v == 'y' ? 1 : v)
990 ########################
991 # Target configuration #
992 ########################
994 minikconf = find_program('scripts/minikconf.py')
996 config_all_devices = {}
997 config_all_disas = {}
998 config_devices_mak_list = []
999 config_devices_h = {}
1000 config_target_h = {}
1001 config_target_mak = {}
1004 'alpha' : ['CONFIG_ALPHA_DIS'],
1005 'arm' : ['CONFIG_ARM_DIS'],
1006 'avr' : ['CONFIG_AVR_DIS'],
1007 'cris' : ['CONFIG_CRIS_DIS'],
1008 'hppa' : ['CONFIG_HPPA_DIS'],
1009 'i386' : ['CONFIG_I386_DIS'],
1010 'x86_64' : ['CONFIG_I386_DIS'],
1011 'x32' : ['CONFIG_I386_DIS'],
1012 'lm32' : ['CONFIG_LM32_DIS'],
1013 'm68k' : ['CONFIG_M68K_DIS'],
1014 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1015 'mips' : ['CONFIG_MIPS_DIS'],
1016 'moxie' : ['CONFIG_MOXIE_DIS'],
1017 'nios2' : ['CONFIG_NIOS2_DIS'],
1018 'or1k' : ['CONFIG_OPENRISC_DIS'],
1019 'ppc' : ['CONFIG_PPC_DIS'],
1020 'riscv' : ['CONFIG_RISCV_DIS'],
1021 'rx' : ['CONFIG_RX_DIS'],
1022 's390' : ['CONFIG_S390_DIS'],
1023 'sh4' : ['CONFIG_SH4_DIS'],
1024 'sparc' : ['CONFIG_SPARC_DIS'],
1025 'xtensa' : ['CONFIG_XTENSA_DIS'],
1027 if link_language == 'cpp'
1029 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1030 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1031 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1036 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
1037 ('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
1038 ('CONFIG_IVSHMEM' in config_host ? ['CONFIG_IVSHMEM=y'] : []) + \
1039 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
1040 ('CONFIG_X11' in config_host ? ['CONFIG_X11=y'] : []) + \
1041 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1042 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1043 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
1044 ('CONFIG_VIRTFS' in config_host ? ['CONFIG_VIRTFS=y'] : []) + \
1045 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
1046 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : [])
1048 ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
1050 default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1051 actual_target_dirs = []
1053 foreach target : target_dirs
1054 config_target = { 'TARGET_NAME': target.split('-')[0] }
1055 if target.endswith('linux-user')
1056 if targetos != 'linux'
1060 error('Target @0@ is only available on a Linux host'.format(target))
1062 config_target += { 'CONFIG_LINUX_USER': 'y' }
1063 elif target.endswith('bsd-user')
1064 if 'CONFIG_BSD' not in config_host
1068 error('Target @0@ is only available on a BSD host'.format(target))
1070 config_target += { 'CONFIG_BSD_USER': 'y' }
1071 elif target.endswith('softmmu')
1072 config_target += { 'CONFIG_SOFTMMU': 'y' }
1074 if target.endswith('-user')
1076 'CONFIG_USER_ONLY': 'y',
1077 'CONFIG_QEMU_INTERP_PREFIX':
1078 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1083 foreach sym: accelerators
1084 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1085 config_target += { sym: 'y' }
1086 config_all += { sym: 'y' }
1087 if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
1088 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1090 accel_kconfig += [ sym + '=y' ]
1093 if accel_kconfig.length() == 0
1097 error('No accelerator available for target @0@'.format(target))
1100 actual_target_dirs += target
1101 config_target += keyval.load('default-configs/targets' / target + '.mak')
1102 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
1104 if 'TARGET_NEED_FDT' in config_target
1105 fdt_required += target
1109 if 'TARGET_BASE_ARCH' not in config_target
1110 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1112 if 'TARGET_ABI_DIR' not in config_target
1113 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1116 foreach k, v: disassemblers
1117 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1119 config_target += { sym: 'y' }
1120 config_all_disas += { sym: 'y' }
1125 config_target_data = configuration_data()
1126 foreach k, v: config_target
1127 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1129 elif ignored.contains(k)
1131 elif k == 'TARGET_BASE_ARCH'
1132 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1133 # not used to select files from sourcesets.
1134 config_target_data.set('TARGET_' + v.to_upper(), 1)
1135 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
1136 config_target_data.set_quoted(k, v)
1138 config_target_data.set(k, 1)
1140 config_target_data.set(k, v)
1143 config_target_h += {target: configure_file(output: target + '-config-target.h',
1144 configuration: config_target_data)}
1146 if target.endswith('-softmmu')
1147 config_devices_mak = target + '-config-devices.mak'
1148 config_devices_mak = configure_file(
1149 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
1150 output: config_devices_mak,
1151 depfile: config_devices_mak + '.d',
1153 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
1154 config_devices_mak, '@DEPFILE@', '@INPUT@',
1155 host_kconfig, accel_kconfig])
1157 config_devices_data = configuration_data()
1158 config_devices = keyval.load(config_devices_mak)
1159 foreach k, v: config_devices
1160 config_devices_data.set(k, 1)
1162 config_devices_mak_list += config_devices_mak
1163 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1164 configuration: config_devices_data)}
1165 config_target += config_devices
1166 config_all_devices += config_devices
1168 config_target_mak += {target: config_target}
1170 target_dirs = actual_target_dirs
1172 # This configuration is used to build files that are shared by
1173 # multiple binaries, and then extracted out of the "common"
1174 # static_library target.
1176 # We do not use all_sources()/all_dependencies(), because it would
1177 # build literally all source files, including devices only used by
1178 # targets that are not built for this compilation. The CONFIG_ALL
1179 # pseudo symbol replaces it.
1181 config_all += config_all_devices
1182 config_all += config_host
1183 config_all += config_all_disas
1185 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1186 'CONFIG_SOFTMMU': have_system,
1187 'CONFIG_USER_ONLY': have_user,
1195 capstone = not_found
1196 capstone_opt = get_option('capstone')
1197 if capstone_opt in ['enabled', 'auto', 'system']
1198 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
1199 capstone = dependency('capstone', version: '>=4.0',
1200 static: enable_static, method: 'pkg-config',
1201 required: capstone_opt == 'system' or
1202 capstone_opt == 'enabled' and not have_internal)
1204 capstone_opt = 'system'
1206 capstone_opt = 'internal'
1208 capstone_opt = 'disabled'
1211 if capstone_opt == 'internal'
1212 capstone_data = configuration_data()
1213 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1215 capstone_files = files(
1217 'capstone/MCInst.c',
1218 'capstone/MCInstrDesc.c',
1219 'capstone/MCRegisterInfo.c',
1220 'capstone/SStream.c',
1224 if 'CONFIG_ARM_DIS' in config_all_disas
1225 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1226 capstone_files += files(
1227 'capstone/arch/ARM/ARMDisassembler.c',
1228 'capstone/arch/ARM/ARMInstPrinter.c',
1229 'capstone/arch/ARM/ARMMapping.c',
1230 'capstone/arch/ARM/ARMModule.c'
1234 # FIXME: This config entry currently depends on a c++ compiler.
1235 # Which is needed for building libvixl, but not for capstone.
1236 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1237 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1238 capstone_files += files(
1239 'capstone/arch/AArch64/AArch64BaseInfo.c',
1240 'capstone/arch/AArch64/AArch64Disassembler.c',
1241 'capstone/arch/AArch64/AArch64InstPrinter.c',
1242 'capstone/arch/AArch64/AArch64Mapping.c',
1243 'capstone/arch/AArch64/AArch64Module.c'
1247 if 'CONFIG_PPC_DIS' in config_all_disas
1248 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1249 capstone_files += files(
1250 'capstone/arch/PowerPC/PPCDisassembler.c',
1251 'capstone/arch/PowerPC/PPCInstPrinter.c',
1252 'capstone/arch/PowerPC/PPCMapping.c',
1253 'capstone/arch/PowerPC/PPCModule.c'
1257 if 'CONFIG_S390_DIS' in config_all_disas
1258 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1259 capstone_files += files(
1260 'capstone/arch/SystemZ/SystemZDisassembler.c',
1261 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1262 'capstone/arch/SystemZ/SystemZMapping.c',
1263 'capstone/arch/SystemZ/SystemZModule.c',
1264 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1268 if 'CONFIG_I386_DIS' in config_all_disas
1269 capstone_data.set('CAPSTONE_HAS_X86', 1)
1270 capstone_files += files(
1271 'capstone/arch/X86/X86Disassembler.c',
1272 'capstone/arch/X86/X86DisassemblerDecoder.c',
1273 'capstone/arch/X86/X86ATTInstPrinter.c',
1274 'capstone/arch/X86/X86IntelInstPrinter.c',
1275 'capstone/arch/X86/X86InstPrinterCommon.c',
1276 'capstone/arch/X86/X86Mapping.c',
1277 'capstone/arch/X86/X86Module.c'
1281 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1284 # FIXME: There does not seem to be a way to completely replace the c_args
1285 # that come from add_project_arguments() -- we can only add to them.
1286 # So: disable all warnings with a big hammer.
1289 # Include all configuration defines via a header file, which will wind up
1290 # as a dependency on the object file, and thus changes here will result
1292 '-include', 'capstone-defs.h'
1295 libcapstone = static_library('capstone',
1296 sources: capstone_files,
1297 c_args: capstone_cargs,
1298 include_directories: 'capstone/include')
1299 capstone = declare_dependency(link_with: libcapstone,
1300 include_directories: 'capstone/include/capstone')
1304 slirp_opt = 'disabled'
1306 slirp_opt = get_option('slirp')
1307 if slirp_opt in ['enabled', 'auto', 'system']
1308 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
1309 slirp = dependency('slirp', static: enable_static,
1310 method: 'pkg-config',
1311 required: slirp_opt == 'system' or
1312 slirp_opt == 'enabled' and not have_internal)
1314 slirp_opt = 'system'
1316 slirp_opt = 'internal'
1318 slirp_opt = 'disabled'
1321 if slirp_opt == 'internal'
1323 if targetos == 'windows'
1324 slirp_deps = cc.find_library('iphlpapi')
1326 slirp_conf = configuration_data()
1327 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1328 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1329 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1330 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1331 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1333 'slirp/src/arp_table.c',
1334 'slirp/src/bootp.c',
1335 'slirp/src/cksum.c',
1336 'slirp/src/dhcpv6.c',
1337 'slirp/src/dnssearch.c',
1339 'slirp/src/ip6_icmp.c',
1340 'slirp/src/ip6_input.c',
1341 'slirp/src/ip6_output.c',
1342 'slirp/src/ip_icmp.c',
1343 'slirp/src/ip_input.c',
1344 'slirp/src/ip_output.c',
1348 'slirp/src/ndp_table.c',
1350 'slirp/src/slirp.c',
1351 'slirp/src/socket.c',
1352 'slirp/src/state.c',
1353 'slirp/src/stream.c',
1354 'slirp/src/tcp_input.c',
1355 'slirp/src/tcp_output.c',
1356 'slirp/src/tcp_subr.c',
1357 'slirp/src/tcp_timer.c',
1362 'slirp/src/version.c',
1363 'slirp/src/vmstate.c',
1367 input : 'slirp/src/libslirp-version.h.in',
1368 output : 'libslirp-version.h',
1369 configuration: slirp_conf)
1371 slirp_inc = include_directories('slirp', 'slirp/src')
1372 libslirp = static_library('slirp',
1373 sources: slirp_files,
1374 c_args: slirp_cargs,
1375 include_directories: slirp_inc)
1376 slirp = declare_dependency(link_with: libslirp,
1377 dependencies: slirp_deps,
1378 include_directories: slirp_inc)
1383 fdt_opt = get_option('fdt')
1385 if fdt_opt in ['enabled', 'auto', 'system']
1386 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
1387 fdt = cc.find_library('fdt', static: enable_static,
1388 required: fdt_opt == 'system' or
1389 fdt_opt == 'enabled' and not have_internal)
1390 if fdt.found() and cc.links('''
1392 #include <libfdt_env.h>
1393 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1397 fdt_opt = 'internal'
1399 fdt_opt = 'disabled'
1402 if fdt_opt == 'internal'
1405 'dtc/libfdt/fdt_ro.c',
1406 'dtc/libfdt/fdt_wip.c',
1407 'dtc/libfdt/fdt_sw.c',
1408 'dtc/libfdt/fdt_rw.c',
1409 'dtc/libfdt/fdt_strerror.c',
1410 'dtc/libfdt/fdt_empty_tree.c',
1411 'dtc/libfdt/fdt_addresses.c',
1412 'dtc/libfdt/fdt_overlay.c',
1413 'dtc/libfdt/fdt_check.c',
1416 fdt_inc = include_directories('dtc/libfdt')
1417 libfdt = static_library('fdt',
1419 include_directories: fdt_inc)
1420 fdt = declare_dependency(link_with: libfdt,
1421 include_directories: fdt_inc)
1424 if not fdt.found() and fdt_required.length() > 0
1425 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1428 config_host_data.set('CONFIG_CAPSTONE', capstone.found())
1429 config_host_data.set('CONFIG_FDT', fdt.found())
1430 config_host_data.set('CONFIG_SLIRP', slirp.found())
1432 #####################
1433 # Generated sources #
1434 #####################
1436 genh += configure_file(output: 'config-host.h', configuration: config_host_data)
1438 hxtool = find_program('scripts/hxtool')
1439 shaderinclude = find_program('scripts/shaderinclude.pl')
1440 qapi_gen = find_program('scripts/qapi-gen.py')
1441 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1442 meson.source_root() / 'scripts/qapi/commands.py',
1443 meson.source_root() / 'scripts/qapi/common.py',
1444 meson.source_root() / 'scripts/qapi/error.py',
1445 meson.source_root() / 'scripts/qapi/events.py',
1446 meson.source_root() / 'scripts/qapi/expr.py',
1447 meson.source_root() / 'scripts/qapi/gen.py',
1448 meson.source_root() / 'scripts/qapi/introspect.py',
1449 meson.source_root() / 'scripts/qapi/parser.py',
1450 meson.source_root() / 'scripts/qapi/schema.py',
1451 meson.source_root() / 'scripts/qapi/source.py',
1452 meson.source_root() / 'scripts/qapi/types.py',
1453 meson.source_root() / 'scripts/qapi/visit.py',
1454 meson.source_root() / 'scripts/qapi/common.py',
1455 meson.source_root() / 'scripts/qapi-gen.py'
1459 python, files('scripts/tracetool.py'),
1460 '--backend=' + config_host['TRACE_BACKENDS']
1463 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1464 meson.current_source_dir(),
1465 config_host['PKGVERSION'], meson.project_version()]
1466 qemu_version = custom_target('qemu-version.h',
1467 output: 'qemu-version.h',
1468 command: qemu_version_cmd,
1470 build_by_default: true,
1471 build_always_stale: true)
1472 genh += qemu_version
1476 ['qemu-options.hx', 'qemu-options.def'],
1477 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1481 ['hmp-commands.hx', 'hmp-commands.h'],
1482 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1485 foreach d : hx_headers
1486 hxdep += custom_target(d[1],
1490 build_by_default: true, # to be removed when added to a target
1491 command: [hxtool, '-h', '@INPUT0@'])
1499 authz_ss = ss.source_set()
1500 blockdev_ss = ss.source_set()
1501 block_ss = ss.source_set()
1502 bsd_user_ss = ss.source_set()
1503 chardev_ss = ss.source_set()
1504 common_ss = ss.source_set()
1505 crypto_ss = ss.source_set()
1506 io_ss = ss.source_set()
1507 linux_user_ss = ss.source_set()
1508 qmp_ss = ss.source_set()
1509 qom_ss = ss.source_set()
1510 softmmu_ss = ss.source_set()
1511 specific_fuzz_ss = ss.source_set()
1512 specific_ss = ss.source_set()
1513 stub_ss = ss.source_set()
1514 trace_ss = ss.source_set()
1515 user_ss = ss.source_set()
1516 util_ss = ss.source_set()
1521 target_softmmu_arch = {}
1527 # TODO: add each directory to the subdirs from its own meson.build, once
1529 trace_events_subdirs = [
1536 trace_events_subdirs += [ 'linux-user' ]
1539 trace_events_subdirs += [
1548 trace_events_subdirs += [
1559 'hw/block/dataplane',
1605 trace_events_subdirs += [
1621 vhost_user = not_found
1622 if 'CONFIG_VHOST_USER' in config_host
1623 libvhost_user = subproject('libvhost-user')
1624 vhost_user = libvhost_user.get_variable('vhost_user_dep')
1639 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1640 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1643 stub_ss = stub_ss.apply(config_all, strict: false)
1645 util_ss.add_all(trace_ss)
1646 util_ss = util_ss.apply(config_all, strict: false)
1647 libqemuutil = static_library('qemuutil',
1648 sources: util_ss.sources() + stub_ss.sources() + genh,
1649 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
1650 qemuutil = declare_dependency(link_with: libqemuutil,
1651 sources: genh + version_res)
1653 decodetree = generator(find_program('scripts/decodetree.py'),
1654 output: 'decode-@BASENAME@.c.inc',
1655 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1661 subdir('libdecnumber')
1671 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
1677 blockdev_ss.add(files(
1684 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1685 # os-win32.c does not
1686 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1687 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
1689 common_ss.add(files('cpus-common.c'))
1693 common_ss.add(capstone)
1694 specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
1695 specific_ss.add(files('exec-vary.c'))
1696 specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1700 'tcg/tcg-op-gvec.c',
1705 specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1717 subdir('linux-user')
1719 bsd_user_ss.add(files('gdbstub.c'))
1720 specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1722 linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1723 specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
1725 # needed for fuzzing binaries
1726 subdir('tests/qtest/libqos')
1727 subdir('tests/qtest/fuzz')
1729 ########################
1730 # Library dependencies #
1731 ########################
1735 foreach d, list : modules
1736 foreach m, module_ss : list
1737 if enable_modules and targetos != 'windows'
1738 module_ss = module_ss.apply(config_all, strict: false)
1739 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1740 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1748 block_ss.add_all(module_ss)
1750 softmmu_ss.add_all(module_ss)
1756 nm = find_program('nm')
1757 undefsym = find_program('scripts/undefsym.py')
1758 block_syms = custom_target('block.syms', output: 'block.syms',
1759 input: [libqemuutil, block_mods],
1761 command: [undefsym, nm, '@INPUT@'])
1762 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1763 input: [libqemuutil, softmmu_mods],
1765 command: [undefsym, nm, '@INPUT@'])
1767 qom_ss = qom_ss.apply(config_host, strict: false)
1768 libqom = static_library('qom', qom_ss.sources() + genh,
1769 dependencies: [qom_ss.dependencies()],
1772 qom = declare_dependency(link_whole: libqom)
1774 authz_ss = authz_ss.apply(config_host, strict: false)
1775 libauthz = static_library('authz', authz_ss.sources() + genh,
1776 dependencies: [authz_ss.dependencies()],
1778 build_by_default: false)
1780 authz = declare_dependency(link_whole: libauthz,
1783 crypto_ss = crypto_ss.apply(config_host, strict: false)
1784 libcrypto = static_library('crypto', crypto_ss.sources() + genh,
1785 dependencies: [crypto_ss.dependencies()],
1787 build_by_default: false)
1789 crypto = declare_dependency(link_whole: libcrypto,
1790 dependencies: [authz, qom])
1792 io_ss = io_ss.apply(config_host, strict: false)
1793 libio = static_library('io', io_ss.sources() + genh,
1794 dependencies: [io_ss.dependencies()],
1795 link_with: libqemuutil,
1797 build_by_default: false)
1799 io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
1801 libmigration = static_library('migration', sources: migration_files + genh,
1803 build_by_default: false)
1804 migration = declare_dependency(link_with: libmigration,
1805 dependencies: [zlib, qom, io])
1806 softmmu_ss.add(migration)
1808 block_ss = block_ss.apply(config_host, strict: false)
1809 libblock = static_library('block', block_ss.sources() + genh,
1810 dependencies: block_ss.dependencies(),
1811 link_depends: block_syms,
1813 build_by_default: false)
1815 block = declare_dependency(link_whole: [libblock],
1816 link_args: '@block.syms',
1817 dependencies: [crypto, io])
1819 blockdev_ss = blockdev_ss.apply(config_host, strict: false)
1820 libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
1821 dependencies: blockdev_ss.dependencies(),
1823 build_by_default: false)
1825 blockdev = declare_dependency(link_whole: [libblockdev],
1826 dependencies: [block])
1828 qmp_ss = qmp_ss.apply(config_host, strict: false)
1829 libqmp = static_library('qmp', qmp_ss.sources() + genh,
1830 dependencies: qmp_ss.dependencies(),
1832 build_by_default: false)
1834 qmp = declare_dependency(link_whole: [libqmp])
1836 libchardev = static_library('chardev', chardev_ss.sources() + genh,
1838 build_by_default: false)
1840 chardev = declare_dependency(link_whole: libchardev)
1842 libhwcore = static_library('hwcore', sources: hwcore_files + genh,
1844 build_by_default: false)
1845 hwcore = declare_dependency(link_whole: libhwcore)
1846 common_ss.add(hwcore)
1852 foreach m : block_mods + softmmu_mods
1853 shared_module(m.name(),
1857 install_dir: qemu_moddir)
1860 softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
1861 common_ss.add(qom, qemuutil)
1863 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
1864 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
1866 common_all = common_ss.apply(config_all, strict: false)
1867 common_all = static_library('common',
1868 build_by_default: false,
1869 sources: common_all.sources() + genh,
1870 dependencies: common_all.dependencies(),
1873 feature_to_c = find_program('scripts/feature_to_c.sh')
1876 foreach target : target_dirs
1877 config_target = config_target_mak[target]
1878 target_name = config_target['TARGET_NAME']
1879 arch = config_target['TARGET_BASE_ARCH']
1880 arch_srcs = [config_target_h[target]]
1882 c_args = ['-DNEED_CPU_H',
1883 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
1884 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
1885 link_args = emulator_link_args
1887 config_target += config_host
1888 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
1889 if targetos == 'linux'
1890 target_inc += include_directories('linux-headers', is_system: true)
1892 if target.endswith('-softmmu')
1893 qemu_target_name = 'qemu-system-' + target_name
1894 target_type='system'
1895 t = target_softmmu_arch[arch].apply(config_target, strict: false)
1896 arch_srcs += t.sources()
1897 arch_deps += t.dependencies()
1899 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
1900 hw = hw_arch[hw_dir].apply(config_target, strict: false)
1901 arch_srcs += hw.sources()
1902 arch_deps += hw.dependencies()
1904 arch_srcs += config_devices_h[target]
1905 link_args += ['@block.syms', '@qemu.syms']
1907 abi = config_target['TARGET_ABI_DIR']
1909 qemu_target_name = 'qemu-' + target_name
1910 if 'CONFIG_LINUX_USER' in config_target
1911 base_dir = 'linux-user'
1912 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1914 base_dir = 'bsd-user'
1916 target_inc += include_directories(
1920 if 'CONFIG_LINUX_USER' in config_target
1921 dir = base_dir / abi
1922 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1923 if config_target.has_key('TARGET_SYSTBL_ABI')
1925 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1926 extra_args : config_target['TARGET_SYSTBL_ABI'])
1931 if 'TARGET_XML_FILES' in config_target
1932 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1933 output: target + '-gdbstub-xml.c',
1934 input: files(config_target['TARGET_XML_FILES'].split()),
1935 command: [feature_to_c, '@INPUT@'],
1937 arch_srcs += gdbstub_xml
1940 t = target_arch[arch].apply(config_target, strict: false)
1941 arch_srcs += t.sources()
1942 arch_deps += t.dependencies()
1944 target_common = common_ss.apply(config_target, strict: false)
1945 objects = common_all.extract_objects(target_common.sources())
1946 deps = target_common.dependencies()
1948 target_specific = specific_ss.apply(config_target, strict: false)
1949 arch_srcs += target_specific.sources()
1950 arch_deps += target_specific.dependencies()
1952 lib = static_library('qemu-' + target,
1953 sources: arch_srcs + genh,
1954 dependencies: arch_deps,
1956 include_directories: target_inc,
1958 build_by_default: false,
1961 if target.endswith('-softmmu')
1963 'name': 'qemu-system-' + target_name,
1965 'sources': files('softmmu/main.c'),
1968 if targetos == 'windows' and (sdl.found() or gtk.found())
1970 'name': 'qemu-system-' + target_name + 'w',
1972 'sources': files('softmmu/main.c'),
1976 if config_host.has_key('CONFIG_FUZZ')
1977 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1979 'name': 'qemu-fuzz-' + target_name,
1981 'sources': specific_fuzz.sources(),
1982 'dependencies': specific_fuzz.dependencies(),
1987 'name': 'qemu-' + target_name,
1994 emulators += {exe['name']:
1995 executable(exe['name'], exe['sources'],
1998 dependencies: arch_deps + deps + exe['dependencies'],
1999 objects: lib.extract_all_objects(recursive: true),
2000 link_language: link_language,
2001 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
2002 link_args: link_args,
2003 gui_app: exe['gui'])
2006 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
2008 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
2009 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
2010 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
2011 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
2013 custom_target(exe['name'] + stp['ext'],
2014 input: trace_events_all,
2015 output: exe['name'] + stp['ext'],
2017 install: stp['install'],
2018 install_dir: get_option('datadir') / 'systemtap/tapset',
2020 tracetool, '--group=all', '--format=' + stp['fmt'],
2021 '--binary=' + stp['bin'],
2022 '--target-name=' + target_name,
2023 '--target-type=' + target_type,
2024 '--probe-prefix=qemu.' + target_type + '.' + target_name,
2032 # Other build targets
2034 if 'CONFIG_PLUGIN' in config_host
2035 install_headers('include/qemu/qemu-plugin.h')
2038 if 'CONFIG_GUEST_AGENT' in config_host
2042 # Don't build qemu-keymap if xkbcommon is not explicitly enabled
2043 # when we don't build tools or system
2044 if xkbcommon.found()
2045 # used for the update-keymaps target, so include rules even if !have_tools
2046 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
2047 dependencies: [qemuutil, xkbcommon], install: have_tools)
2051 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
2052 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
2053 qemu_io = executable('qemu-io', files('qemu-io.c'),
2054 dependencies: [block, qemuutil], install: true)
2055 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
2056 dependencies: [blockdev, qemuutil], install: true)
2058 subdir('storage-daemon')
2059 subdir('contrib/rdmacm-mux')
2060 subdir('contrib/elf2dmp')
2062 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
2063 dependencies: qemuutil,
2066 if 'CONFIG_VHOST_USER' in config_host
2067 subdir('contrib/vhost-user-blk')
2068 subdir('contrib/vhost-user-gpu')
2069 subdir('contrib/vhost-user-input')
2070 subdir('contrib/vhost-user-scsi')
2073 if targetos == 'linux'
2074 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2075 dependencies: [qemuutil, libcap_ng],
2077 install_dir: get_option('libexecdir'))
2079 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2080 dependencies: [authz, crypto, io, qom, qemuutil,
2081 libcap_ng, mpathpersist],
2085 if 'CONFIG_IVSHMEM' in config_host
2086 subdir('contrib/ivshmem-client')
2087 subdir('contrib/ivshmem-server')
2096 if 'CONFIG_GTK' in config_host
2100 if host_machine.system() == 'windows'
2102 find_program('scripts/nsis.py'),
2104 get_option('prefix'),
2105 meson.current_source_dir(),
2108 '-DDISPLAYVERSION=' + meson.project_version(),
2111 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2113 if 'CONFIG_GTK' in config_host
2114 nsis_cmd += '-DCONFIG_GTK=y'
2117 nsis = custom_target('nsis',
2118 output: 'qemu-setup-' + meson.project_version() + '.exe',
2119 input: files('qemu.nsi'),
2120 build_always_stale: true,
2121 command: nsis_cmd + ['@INPUT@'])
2122 alias_target('installer', nsis)
2125 #########################
2126 # Configuration summary #
2127 #########################
2130 summary_info += {'Install prefix': get_option('prefix')}
2131 summary_info += {'BIOS directory': qemu_datadir}
2132 summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2133 summary_info += {'binary directory': get_option('bindir')}
2134 summary_info += {'library directory': get_option('libdir')}
2135 summary_info += {'module directory': qemu_moddir}
2136 summary_info += {'libexec directory': get_option('libexecdir')}
2137 summary_info += {'include directory': get_option('includedir')}
2138 summary_info += {'config directory': get_option('sysconfdir')}
2139 if targetos != 'windows'
2140 summary_info += {'local state directory': get_option('localstatedir')}
2141 summary_info += {'Manual directory': get_option('mandir')}
2143 summary_info += {'local state directory': 'queried at runtime'}
2145 summary_info += {'Doc directory': get_option('docdir')}
2146 summary_info += {'Build directory': meson.current_build_dir()}
2147 summary_info += {'Source path': meson.current_source_dir()}
2148 summary_info += {'GIT binary': config_host['GIT']}
2149 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
2150 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
2151 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
2152 if link_language == 'cpp'
2153 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
2155 summary_info += {'C++ compiler': false}
2157 if targetos == 'darwin'
2158 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
2160 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
2161 summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2162 + ['-O' + get_option('optimization')]
2163 + (get_option('debug') ? ['-g'] : []))}
2164 if link_language == 'cpp'
2165 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2166 + ['-O' + get_option('optimization')]
2167 + (get_option('debug') ? ['-g'] : []))}
2169 link_args = get_option(link_language + '_link_args')
2170 if link_args.length() > 0
2171 summary_info += {'LDFLAGS': ' '.join(link_args)}
2173 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2174 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
2175 summary_info += {'make': config_host['MAKE']}
2176 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
2177 summary_info += {'sphinx-build': sphinx_build.found()}
2178 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2179 # TODO: add back version
2180 summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
2181 if slirp_opt != 'disabled'
2182 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2184 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2185 if config_host.has_key('CONFIG_MODULES')
2186 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2188 summary_info += {'host CPU': cpu}
2189 summary_info += {'host endianness': build_machine.endian()}
2190 summary_info += {'target list': ' '.join(target_dirs)}
2191 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
2192 summary_info += {'sparse enabled': sparse.found()}
2193 summary_info += {'strip binaries': get_option('strip')}
2194 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
2195 summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
2196 summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
2197 if targetos == 'darwin'
2198 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
2200 # TODO: add back version
2201 summary_info += {'SDL support': sdl.found()}
2202 summary_info += {'SDL image support': sdl_image.found()}
2203 # TODO: add back version
2204 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
2205 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
2206 summary_info += {'pixman': pixman.found()}
2207 # TODO: add back version
2208 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
2209 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
2210 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
2211 # TODO: add back version
2212 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
2213 if config_host.has_key('CONFIG_GCRYPT')
2214 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
2215 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2217 # TODO: add back version
2218 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
2219 if config_host.has_key('CONFIG_NETTLE')
2220 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2222 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
2223 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
2224 summary_info += {'iconv support': iconv.found()}
2225 summary_info += {'curses support': curses.found()}
2226 # TODO: add back version
2227 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
2228 summary_info += {'curl support': curl.found()}
2229 summary_info += {'mingw32 support': targetos == 'windows'}
2230 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2231 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2232 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
2233 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
2234 summary_info += {'build virtiofs daemon': have_virtiofsd}
2235 summary_info += {'Multipath support': mpathpersist.found()}
2236 summary_info += {'VNC support': vnc.found()}
2238 summary_info += {'VNC SASL support': sasl.found()}
2239 summary_info += {'VNC JPEG support': jpeg.found()}
2240 summary_info += {'VNC PNG support': png.found()}
2242 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2243 if config_host.has_key('CONFIG_XEN_BACKEND')
2244 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2246 summary_info += {'brlapi support': brlapi.found()}
2247 summary_info += {'Documentation': build_docs}
2248 summary_info += {'PIE': get_option('b_pie')}
2249 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2250 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2251 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2252 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
2253 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
2254 summary_info += {'Install blobs': get_option('install_blobs')}
2255 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2256 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2257 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2258 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
2259 summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2260 if config_all.has_key('CONFIG_TCG')
2261 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
2262 summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
2264 summary_info += {'malloc trim support': has_malloc_trim}
2265 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2266 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
2267 summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
2268 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
2269 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
2270 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2271 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2272 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2273 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
2274 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
2275 summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
2276 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2277 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2278 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2279 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
2280 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
2281 summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
2282 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2283 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2284 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2285 if config_host['TRACE_BACKENDS'].split().contains('simple')
2286 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2288 # TODO: add back protocol and server version
2289 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
2290 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
2291 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
2292 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
2293 summary_info += {'U2F support': u2f.found()}
2294 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
2295 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
2296 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
2297 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
2298 summary_info += {'libiscsi support': libiscsi.found()}
2299 summary_info += {'libnfs support': libnfs.found()}
2300 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2301 if targetos == 'windows'
2302 if 'WIN_SDK' in config_host
2303 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2305 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2306 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
2307 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')}
2309 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
2310 summary_info += {'CFI support': get_option('cfi')}
2311 summary_info += {'CFI debug support': get_option('cfi_debug')}
2312 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2313 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2314 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2315 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2316 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
2317 summary_info += {'GlusterFS support': glusterfs.found()}
2318 summary_info += {'gcov': get_option('b_coverage')}
2319 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2320 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
2321 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2322 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
2323 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
2324 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
2325 summary_info += {'bzip2 support': libbzip2.found()}
2326 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
2327 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
2328 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2329 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
2330 summary_info += {'memory allocator': get_option('malloc')}
2331 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2332 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2333 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2334 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2335 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2336 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2337 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2338 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2339 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2340 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2341 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2342 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
2343 summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
2344 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2345 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
2346 summary_info += {'libudev': libudev.found()}
2347 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
2348 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2349 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2350 if config_host.has_key('HAVE_GDB_BIN')
2351 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2353 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2354 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2355 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
2356 summary_info += {'FUSE exports': fuse.found()}
2357 summary_info += {'FUSE lseek': fuse_lseek.found()}
2358 summary(summary_info, bool_yn: true)
2360 if not supported_cpus.contains(cpu)
2362 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2364 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2365 message('The QEMU project intends to remove support for this host CPU in')
2366 message('a future release if nobody volunteers to maintain it and to')
2367 message('provide a build host for our continuous integration setup.')
2368 message('configure has succeeded and you can continue to build, but')
2369 message('if you care about QEMU on this platform you should contact')
2370 message('us upstream at qemu-devel@nongnu.org.')
2373 if not supported_oses.contains(targetos)
2375 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2377 message('Host OS ' + targetos + 'support is not currently maintained.')
2378 message('The QEMU project intends to remove support for this host OS in')
2379 message('a future release if nobody volunteers to maintain it and to')
2380 message('provide a build host for our continuous integration setup.')
2381 message('configure has succeeded and you can continue to build, but')
2382 message('if you care about QEMU on this platform you should contact')
2383 message('us upstream at qemu-devel@nongnu.org.')