scsi/scsi_bus: switch search direction in scsi_device_find
[qemu/ar7.git] / meson.build
blob0c676af1941a15c77f5e4a5846f8befc8a9958b3
1 project('qemu', ['c'], meson_version: '>=0.55.0',
2         default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11',
3                           'b_colorout=auto'],
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')
9 else
10   keyval = import('unstable-keyval')
11 endif
12 ss = import('sourceset')
13 fs = import('fs')
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
20 build_docs = 'BUILD_DOCS' in config_host
22 if get_option('qemu_suffix').startswith('/')
23   error('qemu_suffix cannot start with a /')
24 endif
26 qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
27 qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
28 config_host_data = configuration_data()
29 genh = []
31 target_dirs = config_host['TARGET_DIRS'].split()
32 have_user = false
33 have_system = false
34 foreach target : target_dirs
35   have_user = have_user or target.endswith('-user')
36   have_system = have_system or target.endswith('-softmmu')
37 endforeach
38 have_tools = 'CONFIG_TOOLS' in config_host
39 have_block = have_system or have_tools
41 python = import('python').find_installation()
43 supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
44 supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
45   'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
47 cpu = host_machine.cpu_family()
48 targetos = host_machine.system()
50 configure_file(input: files('scripts/ninjatool.py'),
51                output: 'ninjatool',
52                configuration: config_host)
54 if cpu in ['x86', 'x86_64']
55   kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
56 elif cpu == 'aarch64'
57   kvm_targets = ['aarch64-softmmu']
58 elif cpu == 's390x'
59   kvm_targets = ['s390x-softmmu']
60 elif cpu in ['ppc', 'ppc64']
61   kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
62 elif cpu in ['mips', 'mips64']
63   kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
64 else
65   kvm_targets = []
66 endif
68 accelerator_targets = { 'CONFIG_KVM': kvm_targets }
69 if cpu in ['x86', 'x86_64']
70   accelerator_targets += {
71     'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
72     'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
73     'CONFIG_HVF': ['x86_64-softmmu'],
74     'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
75   }
76 endif
78 ##################
79 # Compiler flags #
80 ##################
82 # Specify linker-script with add_project_link_arguments so that it is not placed
83 # within a linker --start-group/--end-group pair
84 if 'CONFIG_FUZZ' in config_host
85    add_project_link_arguments(['-Wl,-T,',
86                                (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
87                               native: false, language: ['c', 'cpp', 'objc'])
88 endif
90 add_project_arguments(config_host['QEMU_CFLAGS'].split(),
91                       native: false, language: ['c', 'objc'])
92 add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
93                       native: false, language: 'cpp')
94 add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
95                            native: false, language: ['c', 'cpp', 'objc'])
96 add_project_arguments(config_host['QEMU_INCLUDES'].split(),
97                       language: ['c', 'cpp', 'objc'])
100 link_language = meson.get_external_property('link_language', 'cpp')
101 if link_language == 'cpp'
102   add_languages('cpp', required: true, native: false)
103 endif
104 if host_machine.system() == 'darwin'
105   add_languages('objc', required: false, native: false)
106 endif
108 sparse = find_program('cgcc', required: get_option('sparse'))
109 if sparse.found()
110   run_target('sparse',
111              command: [find_program('scripts/check_sparse.py'),
112                        'compile_commands.json', sparse.full_path(), '-Wbitwise',
113                        '-Wno-transparent-union', '-Wno-old-initializer',
114                        '-Wno-non-pointer-null'])
115 endif
117 ###########################################
118 # Target-specific checks and dependencies #
119 ###########################################
121 if targetos != 'linux' and get_option('mpath').enabled()
122   error('Multipath is supported only on Linux')
123 endif
125 m = cc.find_library('m', required: false)
126 util = cc.find_library('util', required: false)
127 winmm = []
128 socket = []
129 version_res = []
130 coref = []
131 iokit = []
132 emulator_link_args = []
133 cocoa = not_found
134 hvf = not_found
135 if targetos == 'windows'
136   socket = cc.find_library('ws2_32')
137   winmm = cc.find_library('winmm')
139   win = import('windows')
140   version_res = win.compile_resources('version.rc',
141                                       depend_files: files('pc-bios/qemu-nsis.ico'),
142                                       include_directories: include_directories('.'))
143 elif targetos == 'darwin'
144   coref = dependency('appleframeworks', modules: 'CoreFoundation')
145   iokit = dependency('appleframeworks', modules: 'IOKit')
146   cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
147 elif targetos == 'sunos'
148   socket = [cc.find_library('socket'),
149             cc.find_library('nsl'),
150             cc.find_library('resolv')]
151 elif targetos == 'haiku'
152   socket = [cc.find_library('posix_error_mapper'),
153             cc.find_library('network'),
154             cc.find_library('bsd')]
155 elif targetos == 'openbsd'
156   if not get_option('tcg').disabled() and target_dirs.length() > 0
157     # Disable OpenBSD W^X if available
158     emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
159   endif
160 endif
162 accelerators = []
163 if not get_option('kvm').disabled() and targetos == 'linux'
164   accelerators += 'CONFIG_KVM'
165 endif
166 if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
167   accelerators += 'CONFIG_XEN'
168   have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
169 else
170   have_xen_pci_passthrough = false
171 endif
172 if not get_option('whpx').disabled() and targetos == 'windows'
173   if get_option('whpx').enabled() and cpu != 'x86_64'
174     error('WHPX requires 64-bit host')
175   elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
176        cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
177     accelerators += 'CONFIG_WHPX'
178   endif
179 endif
180 if not get_option('hvf').disabled()
181   hvf = dependency('appleframeworks', modules: 'Hypervisor',
182                    required: get_option('hvf'))
183   if hvf.found()
184     accelerators += 'CONFIG_HVF'
185   endif
186 endif
187 if not get_option('hax').disabled()
188   if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
189     accelerators += 'CONFIG_HAX'
190   endif
191 endif
192 if not get_option('tcg').disabled()
193   if cpu not in supported_cpus
194     if 'CONFIG_TCG_INTERPRETER' in config_host
195       warning('Unsupported CPU @0@, will use TCG with TCI (experimental)'.format(cpu))
196     else
197       error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
198     endif
199   endif
200   accelerators += 'CONFIG_TCG'
201   config_host += { 'CONFIG_TCG': 'y' }
202 endif
204 if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
205   error('KVM not available on this platform')
206 endif
207 if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
208   error('HVF not available on this platform')
209 endif
210 if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
211   error('WHPX not available on this platform')
212 endif
213 if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
214   if 'CONFIG_XEN' in accelerators
215     error('Xen PCI passthrough not available on this platform')
216   else
217     error('Xen PCI passthrough requested but Xen not enabled')
218   endif
219 endif
220 if not cocoa.found() and get_option('cocoa').enabled()
221   error('Cocoa not available on this platform')
222 endif
224 ################
225 # Dependencies #
226 ################
228 # The path to glib.h is added to all compilation commands.  This was
229 # grandfathered in from the QEMU Makefiles.
230 add_project_arguments(config_host['GLIB_CFLAGS'].split(),
231                       native: false, language: ['c', 'cpp', 'objc'])
232 glib = declare_dependency(link_args: config_host['GLIB_LIBS'].split())
233 gio = not_found
234 if 'CONFIG_GIO' in config_host
235   gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
236                            link_args: config_host['GIO_LIBS'].split())
237 endif
238 lttng = not_found
239 if 'CONFIG_TRACE_UST' in config_host
240   lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
241 endif
242 urcubp = not_found
243 if 'CONFIG_TRACE_UST' in config_host
244   urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
245 endif
246 gcrypt = not_found
247 if 'CONFIG_GCRYPT' in config_host
248   gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
249                               link_args: config_host['GCRYPT_LIBS'].split())
250 endif
251 nettle = not_found
252 if 'CONFIG_NETTLE' in config_host
253   nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
254                               link_args: config_host['NETTLE_LIBS'].split())
255 endif
256 gnutls = not_found
257 if 'CONFIG_GNUTLS' in config_host
258   gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
259                               link_args: config_host['GNUTLS_LIBS'].split())
260 endif
261 pixman = not_found
262 if have_system or have_tools
263   pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
264                       method: 'pkg-config', static: enable_static)
265 endif
266 pam = not_found
267 if 'CONFIG_AUTH_PAM' in config_host
268   pam = cc.find_library('pam')
269 endif
270 libaio = cc.find_library('aio', required: false)
271 zlib = dependency('zlib', required: true, static: enable_static)
272 linux_io_uring = not_found
273 if 'CONFIG_LINUX_IO_URING' in config_host
274   linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
275                                       link_args: config_host['LINUX_IO_URING_LIBS'].split())
276 endif
277 libxml2 = not_found
278 if 'CONFIG_LIBXML2' in config_host
279   libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
280                                link_args: config_host['LIBXML2_LIBS'].split())
281 endif
282 libnfs = not_found
283 if 'CONFIG_LIBNFS' in config_host
284   libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
285 endif
286 libattr = not_found
287 if 'CONFIG_ATTR' in config_host
288   libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
289 endif
290 seccomp = not_found
291 if 'CONFIG_SECCOMP' in config_host
292   seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
293                                link_args: config_host['SECCOMP_LIBS'].split())
294 endif
295 libcap_ng = not_found
296 if 'CONFIG_LIBCAP_NG' in config_host
297   libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
298 endif
299 if get_option('xkbcommon').auto() and not have_system and not have_tools
300   xkbcommon = not_found
301 else
302   xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
303                          method: 'pkg-config', static: enable_static)
304 endif
305 vde = not_found
306 if config_host.has_key('CONFIG_VDE')
307   vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
308 endif
309 pulse = not_found
310 if 'CONFIG_LIBPULSE' in config_host
311   pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
312                              link_args: config_host['PULSE_LIBS'].split())
313 endif
314 alsa = not_found
315 if 'CONFIG_ALSA' in config_host
316   alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
317                             link_args: config_host['ALSA_LIBS'].split())
318 endif
319 jack = not_found
320 if 'CONFIG_LIBJACK' in config_host
321   jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
322 endif
323 spice = not_found
324 if 'CONFIG_SPICE' in config_host
325   spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
326                              link_args: config_host['SPICE_LIBS'].split())
327 endif
328 rt = cc.find_library('rt', required: false)
329 libdl = not_found
330 if 'CONFIG_PLUGIN' in config_host
331   libdl = cc.find_library('dl', required: true)
332 endif
333 libiscsi = not_found
334 if 'CONFIG_LIBISCSI' in config_host
335   libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
336                                 link_args: config_host['LIBISCSI_LIBS'].split())
337 endif
338 zstd = not_found
339 if 'CONFIG_ZSTD' in config_host
340   zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
341                             link_args: config_host['ZSTD_LIBS'].split())
342 endif
343 gbm = not_found
344 if 'CONFIG_GBM' in config_host
345   gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
346                            link_args: config_host['GBM_LIBS'].split())
347 endif
348 virgl = not_found
349 if 'CONFIG_VIRGL' in config_host
350   virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
351                              link_args: config_host['VIRGL_LIBS'].split())
352 endif
353 curl = not_found
354 if 'CONFIG_CURL' in config_host
355   curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
356                             link_args: config_host['CURL_LIBS'].split())
357 endif
358 libudev = not_found
359 if targetos == 'linux' and (have_system or have_tools)
360   libudev = dependency('libudev',
361                        required: get_option('mpath').enabled(),
362                        static: enable_static)
363 endif
365 mpathpersist = not_found
366 mpathpersist_new_api = false
367 if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
368   mpath_test_source_new = '''
369     #include <libudev.h>
370     #include <mpath_persist.h>
371     unsigned mpath_mx_alloc_len = 1024;
372     int logsink;
373     static struct config *multipath_conf;
374     extern struct udev *udev;
375     extern struct config *get_multipath_config(void);
376     extern void put_multipath_config(struct config *conf);
377     struct udev *udev;
378     struct config *get_multipath_config(void) { return multipath_conf; }
379     void put_multipath_config(struct config *conf) { }
380     int main(void) {
381         udev = udev_new();
382         multipath_conf = mpath_lib_init();
383         return 0;
384     }'''
385   mpath_test_source_old = '''
386       #include <libudev.h>
387       #include <mpath_persist.h>
388       unsigned mpath_mx_alloc_len = 1024;
389       int logsink;
390       int main(void) {
391           struct udev *udev = udev_new();
392           mpath_lib_init(udev);
393           return 0;
394       }'''
395   mpathlibs = [libudev]
396   if enable_static
397     mpathlibs += cc.find_library('devmapper',
398                                    required: get_option('mpath'),
399                                    static: enable_static)
400   endif
401   mpathlibs += cc.find_library('multipath',
402                                required: get_option('mpath'),
403                                static: enable_static)
404   mpathlibs += cc.find_library('mpathpersist',
405                                required: get_option('mpath'),
406                                static: enable_static)
407   foreach lib: mpathlibs
408     if not lib.found()
409       mpathlibs = []
410       break
411     endif
412   endforeach
413   if mpathlibs.length() > 0
414     if cc.links(mpath_test_source_new, dependencies: mpathlibs)
415       mpathpersist = declare_dependency(dependencies: mpathlibs)
416       mpathpersist_new_api = true
417     elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
418       mpathpersist = declare_dependency(dependencies: mpathlibs)
419     else
420       if get_option('mpath').enabled()
421         error('Cannot detect libmpathpersist API')
422       else
423         warning('Cannot detect libmpathpersist API, disabling')
424       endif
425     endif
426   endif
427 endif
429 brlapi = not_found
430 if 'CONFIG_BRLAPI' in config_host
431   brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
432 endif
434 sdl = not_found
435 if have_system
436   sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
437   sdl_image = not_found
438 endif
439 if sdl.found()
440   # work around 2.0.8 bug
441   sdl = declare_dependency(compile_args: '-Wno-undef',
442                            dependencies: sdl)
443   sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
444                          method: 'pkg-config', static: enable_static)
445 else
446   if get_option('sdl_image').enabled()
447     error('sdl-image required, but SDL was @0@'.format(
448           get_option('sdl').disabled() ? 'disabled' : 'not found'))
449   endif
450   sdl_image = not_found
451 endif
453 rbd = not_found
454 if 'CONFIG_RBD' in config_host
455   rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
456 endif
457 glusterfs = not_found
458 if 'CONFIG_GLUSTERFS' in config_host
459   glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
460                                  link_args: config_host['GLUSTERFS_LIBS'].split())
461 endif
462 libssh = not_found
463 if 'CONFIG_LIBSSH' in config_host
464   libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
465                               link_args: config_host['LIBSSH_LIBS'].split())
466 endif
467 libbzip2 = not_found
468 if 'CONFIG_BZIP2' in config_host
469   libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
470 endif
471 liblzfse = not_found
472 if 'CONFIG_LZFSE' in config_host
473   liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
474 endif
475 oss = not_found
476 if 'CONFIG_AUDIO_OSS' in config_host
477   oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
478 endif
479 dsound = not_found
480 if 'CONFIG_AUDIO_DSOUND' in config_host
481   dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
482 endif
483 coreaudio = not_found
484 if 'CONFIG_AUDIO_COREAUDIO' in config_host
485   coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
486 endif
487 opengl = not_found
488 if 'CONFIG_OPENGL' in config_host
489   opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
490                               link_args: config_host['OPENGL_LIBS'].split())
491 endif
492 gtk = not_found
493 if 'CONFIG_GTK' in config_host
494   gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
495                               link_args: config_host['GTK_LIBS'].split())
496 endif
497 vte = not_found
498 if 'CONFIG_VTE' in config_host
499   vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
500                            link_args: config_host['VTE_LIBS'].split())
501 endif
502 x11 = not_found
503 if 'CONFIG_X11' in config_host
504   x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
505                            link_args: config_host['X11_LIBS'].split())
506 endif
507 curses = not_found
508 if 'CONFIG_CURSES' in config_host
509   curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
510                               link_args: config_host['CURSES_LIBS'].split())
511 endif
512 iconv = not_found
513 if 'CONFIG_ICONV' in config_host
514   iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
515                              link_args: config_host['ICONV_LIBS'].split())
516 endif
517 vnc = not_found
518 png = not_found
519 jpeg = not_found
520 sasl = not_found
521 if get_option('vnc').enabled()
522   vnc = declare_dependency() # dummy dependency
523   png = dependency('libpng', required: get_option('vnc_png'),
524                    method: 'pkg-config', static: enable_static)
525   jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
526                          required: get_option('vnc_jpeg'),
527                          static: enable_static)
528   sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
529                          required: get_option('vnc_sasl'),
530                          static: enable_static)
531   if sasl.found()
532     sasl = declare_dependency(dependencies: sasl,
533                               compile_args: '-DSTRUCT_IOVEC_DEFINED')
534   endif
535 endif
536 snappy = not_found
537 if 'CONFIG_SNAPPY' in config_host
538   snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
539 endif
540 lzo = not_found
541 if 'CONFIG_LZO' in config_host
542   lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
543 endif
544 rdma = not_found
545 if 'CONFIG_RDMA' in config_host
546   rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
547 endif
548 numa = not_found
549 if 'CONFIG_NUMA' in config_host
550   numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
551 endif
552 xen = not_found
553 if 'CONFIG_XEN_BACKEND' in config_host
554   xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
555                            link_args: config_host['XEN_LIBS'].split())
556 endif
557 cacard = not_found
558 if 'CONFIG_SMARTCARD' in config_host
559   cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
560                               link_args: config_host['SMARTCARD_LIBS'].split())
561 endif
562 u2f = not_found
563 if have_system
564   u2f = dependency('u2f-emu', required: get_option('u2f'),
565                    method: 'pkg-config',
566                    static: enable_static)
567 endif
568 usbredir = not_found
569 if 'CONFIG_USB_REDIR' in config_host
570   usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
571                                 link_args: config_host['USB_REDIR_LIBS'].split())
572 endif
573 libusb = not_found
574 if 'CONFIG_USB_LIBUSB' in config_host
575   libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
576                               link_args: config_host['LIBUSB_LIBS'].split())
577 endif
578 libpmem = not_found
579 if 'CONFIG_LIBPMEM' in config_host
580   libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
581                                link_args: config_host['LIBPMEM_LIBS'].split())
582 endif
583 libdaxctl = not_found
584 if 'CONFIG_LIBDAXCTL' in config_host
585   libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
586 endif
587 tasn1 = not_found
588 if 'CONFIG_TASN1' in config_host
589   tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
590                              link_args: config_host['TASN1_LIBS'].split())
591 endif
592 keyutils = dependency('libkeyutils', required: false,
593                       method: 'pkg-config', static: enable_static)
595 has_gettid = cc.has_function('gettid')
597 # Malloc tests
599 malloc = []
600 if get_option('malloc') == 'system'
601   has_malloc_trim = \
602     not get_option('malloc_trim').disabled() and \
603     cc.links('''#include <malloc.h>
604                 int main(void) { malloc_trim(0); return 0; }''')
605 else
606   has_malloc_trim = false
607   malloc = cc.find_library(get_option('malloc'), required: true)
608 endif
609 if not has_malloc_trim and get_option('malloc_trim').enabled()
610   if get_option('malloc') == 'system'
611     error('malloc_trim not available on this platform.')
612   else
613     error('malloc_trim not available with non-libc memory allocator')
614   endif
615 endif
617 # Create config-host.h
619 config_host_data.set('CONFIG_COCOA', cocoa.found())
620 config_host_data.set('CONFIG_LIBUDEV', libudev.found())
621 config_host_data.set('CONFIG_MPATH', mpathpersist.found())
622 config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
623 config_host_data.set('CONFIG_SDL', sdl.found())
624 config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
625 config_host_data.set('CONFIG_VNC', vnc.found())
626 config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
627 config_host_data.set('CONFIG_VNC_PNG', png.found())
628 config_host_data.set('CONFIG_VNC_SASL', sasl.found())
629 config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
630 config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
631 config_host_data.set('CONFIG_GETTID', has_gettid)
632 config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
633 config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
634 config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
635 config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
636 config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
638 ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
639 arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
640 strings = ['HOST_DSOSUF', 'CONFIG_IASL', 'bindir', 'prefix', 'qemu_confdir', 'qemu_datadir',
641            'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
642            'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath', 'sysconfdir']
643 foreach k, v: config_host
644   if ignored.contains(k)
645     # do nothing
646   elif arrays.contains(k)
647     if v != ''
648       v = '"' + '", "'.join(v.split()) + '", '
649     endif
650     config_host_data.set(k, v)
651   elif k == 'ARCH'
652     config_host_data.set('HOST_' + v.to_upper(), 1)
653   elif strings.contains(k)
654     if not k.startswith('CONFIG_')
655       k = 'CONFIG_' + k.to_upper()
656     endif
657     config_host_data.set_quoted(k, v)
658   elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
659     config_host_data.set(k, v == 'y' ? 1 : v)
660   endif
661 endforeach
663 minikconf = find_program('scripts/minikconf.py')
664 config_all = {}
665 config_all_devices = {}
666 config_all_disas = {}
667 config_devices_mak_list = []
668 config_devices_h = {}
669 config_target_h = {}
670 config_target_mak = {}
672 disassemblers = {
673   'alpha' : ['CONFIG_ALPHA_DIS'],
674   'arm' : ['CONFIG_ARM_DIS'],
675   'avr' : ['CONFIG_AVR_DIS'],
676   'cris' : ['CONFIG_CRIS_DIS'],
677   'hppa' : ['CONFIG_HPPA_DIS'],
678   'i386' : ['CONFIG_I386_DIS'],
679   'x86_64' : ['CONFIG_I386_DIS'],
680   'x32' : ['CONFIG_I386_DIS'],
681   'lm32' : ['CONFIG_LM32_DIS'],
682   'm68k' : ['CONFIG_M68K_DIS'],
683   'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
684   'mips' : ['CONFIG_MIPS_DIS'],
685   'moxie' : ['CONFIG_MOXIE_DIS'],
686   'nios2' : ['CONFIG_NIOS2_DIS'],
687   'or1k' : ['CONFIG_OPENRISC_DIS'],
688   'ppc' : ['CONFIG_PPC_DIS'],
689   'riscv' : ['CONFIG_RISCV_DIS'],
690   'rx' : ['CONFIG_RX_DIS'],
691   's390' : ['CONFIG_S390_DIS'],
692   'sh4' : ['CONFIG_SH4_DIS'],
693   'sparc' : ['CONFIG_SPARC_DIS'],
694   'xtensa' : ['CONFIG_XTENSA_DIS'],
696 if link_language == 'cpp'
697   disassemblers += {
698     'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
699     'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
700     'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
701   }
702 endif
704 kconfig_external_symbols = [
705   'CONFIG_KVM',
706   'CONFIG_XEN',
707   'CONFIG_TPM',
708   'CONFIG_SPICE',
709   'CONFIG_IVSHMEM',
710   'CONFIG_OPENGL',
711   'CONFIG_X11',
712   'CONFIG_VHOST_USER',
713   'CONFIG_VHOST_VDPA',
714   'CONFIG_VHOST_KERNEL',
715   'CONFIG_VIRTFS',
716   'CONFIG_LINUX',
717   'CONFIG_PVRDMA',
719 ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
721 default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
722 actual_target_dirs = []
723 fdt_required = []
724 foreach target : target_dirs
725   config_target = { 'TARGET_NAME': target.split('-')[0] }
726   if target.endswith('linux-user')
727     if targetos != 'linux'
728       if default_targets
729         continue
730       endif
731       error('Target @0@ is only available on a Linux host'.format(target))
732     endif
733     config_target += { 'CONFIG_LINUX_USER': 'y' }
734   elif target.endswith('bsd-user')
735     if 'CONFIG_BSD' not in config_host
736       if default_targets
737         continue
738       endif
739       error('Target @0@ is only available on a BSD host'.format(target))
740     endif
741     config_target += { 'CONFIG_BSD_USER': 'y' }
742   elif target.endswith('softmmu')
743     config_target += { 'CONFIG_SOFTMMU': 'y' }
744   endif
745   if target.endswith('-user')
746     config_target += {
747       'CONFIG_USER_ONLY': 'y',
748       'CONFIG_QEMU_INTERP_PREFIX':
749         config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
750     }
751   endif
753   have_accel = false
754   foreach sym: accelerators
755     if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
756       config_target += { sym: 'y' }
757       config_all += { sym: 'y' }
758       if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
759         config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
760       endif
761       have_accel = true
762     endif
763   endforeach
764   if not have_accel
765     if default_targets
766       continue
767     endif
768     error('No accelerator available for target @0@'.format(target))
769   endif
771   actual_target_dirs += target
772   config_target += keyval.load('default-configs/targets' / target + '.mak')
773   config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
775   if 'TARGET_NEED_FDT' in config_target
776     fdt_required += target
777   endif
779   # Add default keys
780   if 'TARGET_BASE_ARCH' not in config_target
781     config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
782   endif
783   if 'TARGET_ABI_DIR' not in config_target
784     config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
785   endif
787   foreach k, v: disassemblers
788     if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
789       foreach sym: v
790         config_target += { sym: 'y' }
791         config_all_disas += { sym: 'y' }
792       endforeach
793     endif
794   endforeach
796   config_target_data = configuration_data()
797   foreach k, v: config_target
798     if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
799       # do nothing
800     elif ignored.contains(k)
801       # do nothing
802     elif k == 'TARGET_BASE_ARCH'
803       # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
804       # not used to select files from sourcesets.
805       config_target_data.set('TARGET_' + v.to_upper(), 1)
806     elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
807       config_target_data.set_quoted(k, v)
808     elif v == 'y'
809       config_target_data.set(k, 1)
810     else
811       config_target_data.set(k, v)
812     endif
813   endforeach
814   config_target_h += {target: configure_file(output: target + '-config-target.h',
815                                                configuration: config_target_data)}
817   if target.endswith('-softmmu')
818     base_kconfig = []
819     foreach sym : kconfig_external_symbols
820       if sym in config_target or sym in config_host
821         base_kconfig += '@0@=y'.format(sym)
822       endif
823     endforeach
825     config_devices_mak = target + '-config-devices.mak'
826     config_devices_mak = configure_file(
827       input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
828       output: config_devices_mak,
829       depfile: config_devices_mak + '.d',
830       capture: true,
831       command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
832                 config_devices_mak, '@DEPFILE@', '@INPUT@',
833                 base_kconfig])
835     config_devices_data = configuration_data()
836     config_devices = keyval.load(config_devices_mak)
837     foreach k, v: config_devices
838       config_devices_data.set(k, 1)
839     endforeach
840     config_devices_mak_list += config_devices_mak
841     config_devices_h += {target: configure_file(output: target + '-config-devices.h',
842                                                 configuration: config_devices_data)}
843     config_target += config_devices
844     config_all_devices += config_devices
845   endif
846   config_target_mak += {target: config_target}
847 endforeach
848 target_dirs = actual_target_dirs
850 # This configuration is used to build files that are shared by
851 # multiple binaries, and then extracted out of the "common"
852 # static_library target.
854 # We do not use all_sources()/all_dependencies(), because it would
855 # build literally all source files, including devices only used by
856 # targets that are not built for this compilation.  The CONFIG_ALL
857 # pseudo symbol replaces it.
859 config_all += config_all_devices
860 config_all += config_host
861 config_all += config_all_disas
862 config_all += {
863   'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
864   'CONFIG_SOFTMMU': have_system,
865   'CONFIG_USER_ONLY': have_user,
866   'CONFIG_ALL': true,
869 # Submodules
871 capstone = not_found
872 capstone_opt = get_option('capstone')
873 if capstone_opt in ['enabled', 'auto', 'system']
874   have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
875   capstone = dependency('capstone', version: '>=4.0',
876                         static: enable_static, method: 'pkg-config',
877                         required: capstone_opt == 'system' or
878                                   capstone_opt == 'enabled' and not have_internal)
879   if capstone.found()
880     capstone_opt = 'system'
881   elif have_internal
882     capstone_opt = 'internal'
883   else
884     capstone_opt = 'disabled'
885   endif
886 endif
887 if capstone_opt == 'internal'
888   capstone_data = configuration_data()
889   capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
891   capstone_files = files(
892     'capstone/cs.c',
893     'capstone/MCInst.c',
894     'capstone/MCInstrDesc.c',
895     'capstone/MCRegisterInfo.c',
896     'capstone/SStream.c',
897     'capstone/utils.c'
898   )
900   if 'CONFIG_ARM_DIS' in config_all_disas
901     capstone_data.set('CAPSTONE_HAS_ARM', '1')
902     capstone_files += files(
903       'capstone/arch/ARM/ARMDisassembler.c',
904       'capstone/arch/ARM/ARMInstPrinter.c',
905       'capstone/arch/ARM/ARMMapping.c',
906       'capstone/arch/ARM/ARMModule.c'
907     )
908   endif
910   # FIXME: This config entry currently depends on a c++ compiler.
911   # Which is needed for building libvixl, but not for capstone.
912   if 'CONFIG_ARM_A64_DIS' in config_all_disas
913     capstone_data.set('CAPSTONE_HAS_ARM64', '1')
914     capstone_files += files(
915       'capstone/arch/AArch64/AArch64BaseInfo.c',
916       'capstone/arch/AArch64/AArch64Disassembler.c',
917       'capstone/arch/AArch64/AArch64InstPrinter.c',
918       'capstone/arch/AArch64/AArch64Mapping.c',
919       'capstone/arch/AArch64/AArch64Module.c'
920     )
921   endif
923   if 'CONFIG_PPC_DIS' in config_all_disas
924     capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
925     capstone_files += files(
926       'capstone/arch/PowerPC/PPCDisassembler.c',
927       'capstone/arch/PowerPC/PPCInstPrinter.c',
928       'capstone/arch/PowerPC/PPCMapping.c',
929       'capstone/arch/PowerPC/PPCModule.c'
930     )
931   endif
933   if 'CONFIG_S390_DIS' in config_all_disas
934     capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
935     capstone_files += files(
936       'capstone/arch/SystemZ/SystemZDisassembler.c',
937       'capstone/arch/SystemZ/SystemZInstPrinter.c',
938       'capstone/arch/SystemZ/SystemZMapping.c',
939       'capstone/arch/SystemZ/SystemZModule.c',
940       'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
941     )
942   endif
944   if 'CONFIG_I386_DIS' in config_all_disas
945     capstone_data.set('CAPSTONE_HAS_X86', 1)
946     capstone_files += files(
947       'capstone/arch/X86/X86Disassembler.c',
948       'capstone/arch/X86/X86DisassemblerDecoder.c',
949       'capstone/arch/X86/X86ATTInstPrinter.c',
950       'capstone/arch/X86/X86IntelInstPrinter.c',
951       'capstone/arch/X86/X86InstPrinterCommon.c',
952       'capstone/arch/X86/X86Mapping.c',
953       'capstone/arch/X86/X86Module.c'
954     )
955   endif
957   configure_file(output: 'capstone-defs.h', configuration: capstone_data)
959   capstone_cargs = [
960     # FIXME: There does not seem to be a way to completely replace the c_args
961     # that come from add_project_arguments() -- we can only add to them.
962     # So: disable all warnings with a big hammer.
963     '-Wno-error', '-w',
965     # Include all configuration defines via a header file, which will wind up
966     # as a dependency on the object file, and thus changes here will result
967     # in a rebuild.
968     '-include', 'capstone-defs.h'
969   ]
971   libcapstone = static_library('capstone',
972                                sources: capstone_files,
973                                c_args: capstone_cargs,
974                                include_directories: 'capstone/include')
975   capstone = declare_dependency(link_with: libcapstone,
976                                 include_directories: 'capstone/include/capstone')
977 endif
979 slirp = not_found
980 slirp_opt = 'disabled'
981 if have_system
982   slirp_opt = get_option('slirp')
983   if slirp_opt in ['enabled', 'auto', 'system']
984     have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
985     slirp = dependency('slirp', static: enable_static,
986                        method: 'pkg-config',
987                        required: slirp_opt == 'system' or
988                                  slirp_opt == 'enabled' and not have_internal)
989     if slirp.found()
990       slirp_opt = 'system'
991     elif have_internal
992       slirp_opt = 'internal'
993     else
994       slirp_opt = 'disabled'
995     endif
996   endif
997   if slirp_opt == 'internal'
998     slirp_deps = []
999     if targetos == 'windows'
1000       slirp_deps = cc.find_library('iphlpapi')
1001     endif
1002     slirp_conf = configuration_data()
1003     slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1004     slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1005     slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1006     slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1007     slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1008     slirp_files = [
1009       'slirp/src/arp_table.c',
1010       'slirp/src/bootp.c',
1011       'slirp/src/cksum.c',
1012       'slirp/src/dhcpv6.c',
1013       'slirp/src/dnssearch.c',
1014       'slirp/src/if.c',
1015       'slirp/src/ip6_icmp.c',
1016       'slirp/src/ip6_input.c',
1017       'slirp/src/ip6_output.c',
1018       'slirp/src/ip_icmp.c',
1019       'slirp/src/ip_input.c',
1020       'slirp/src/ip_output.c',
1021       'slirp/src/mbuf.c',
1022       'slirp/src/misc.c',
1023       'slirp/src/ncsi.c',
1024       'slirp/src/ndp_table.c',
1025       'slirp/src/sbuf.c',
1026       'slirp/src/slirp.c',
1027       'slirp/src/socket.c',
1028       'slirp/src/state.c',
1029       'slirp/src/stream.c',
1030       'slirp/src/tcp_input.c',
1031       'slirp/src/tcp_output.c',
1032       'slirp/src/tcp_subr.c',
1033       'slirp/src/tcp_timer.c',
1034       'slirp/src/tftp.c',
1035       'slirp/src/udp.c',
1036       'slirp/src/udp6.c',
1037       'slirp/src/util.c',
1038       'slirp/src/version.c',
1039       'slirp/src/vmstate.c',
1040     ]
1042     configure_file(
1043       input : 'slirp/src/libslirp-version.h.in',
1044       output : 'libslirp-version.h',
1045       configuration: slirp_conf)
1047     slirp_inc = include_directories('slirp', 'slirp/src')
1048     libslirp = static_library('slirp',
1049                               sources: slirp_files,
1050                               c_args: slirp_cargs,
1051                               include_directories: slirp_inc)
1052     slirp = declare_dependency(link_with: libslirp,
1053                                dependencies: slirp_deps,
1054                                include_directories: slirp_inc)
1055   endif
1056 endif
1058 fdt = not_found
1059 fdt_opt = get_option('fdt')
1060 if have_system
1061   if fdt_opt in ['enabled', 'auto', 'system']
1062     have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
1063     fdt = cc.find_library('fdt', static: enable_static,
1064                           required: fdt_opt == 'system' or
1065                                     fdt_opt == 'enabled' and not have_internal)
1066     if fdt.found() and cc.links('''
1067        #include <libfdt.h>
1068        #include <libfdt_env.h>
1069        int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1070          dependencies: fdt)
1071       fdt_opt = 'system'
1072     elif have_internal
1073       fdt_opt = 'internal'
1074     else
1075       fdt_opt = 'disabled'
1076     endif
1077   endif
1078   if fdt_opt == 'internal'
1079     fdt_files = files(
1080       'dtc/libfdt/fdt.c',
1081       'dtc/libfdt/fdt_ro.c',
1082       'dtc/libfdt/fdt_wip.c',
1083       'dtc/libfdt/fdt_sw.c',
1084       'dtc/libfdt/fdt_rw.c',
1085       'dtc/libfdt/fdt_strerror.c',
1086       'dtc/libfdt/fdt_empty_tree.c',
1087       'dtc/libfdt/fdt_addresses.c',
1088       'dtc/libfdt/fdt_overlay.c',
1089       'dtc/libfdt/fdt_check.c',
1090     )
1092     fdt_inc = include_directories('dtc/libfdt')
1093     libfdt = static_library('fdt',
1094                             sources: fdt_files,
1095                             include_directories: fdt_inc)
1096     fdt = declare_dependency(link_with: libfdt,
1097                              include_directories: fdt_inc)
1098   endif
1099 endif
1100 if not fdt.found() and fdt_required.length() > 0
1101   error('fdt not available but required by targets ' + ', '.join(fdt_required))
1102 endif
1104 config_host_data.set('CONFIG_CAPSTONE', capstone.found())
1105 config_host_data.set('CONFIG_FDT', fdt.found())
1106 config_host_data.set('CONFIG_SLIRP', slirp.found())
1108 genh += configure_file(output: 'config-host.h', configuration: config_host_data)
1110 # Generators
1112 hxtool = find_program('scripts/hxtool')
1113 shaderinclude = find_program('scripts/shaderinclude.pl')
1114 qapi_gen = find_program('scripts/qapi-gen.py')
1115 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1116                      meson.source_root() / 'scripts/qapi/commands.py',
1117                      meson.source_root() / 'scripts/qapi/common.py',
1118                      meson.source_root() / 'scripts/qapi/error.py',
1119                      meson.source_root() / 'scripts/qapi/events.py',
1120                      meson.source_root() / 'scripts/qapi/expr.py',
1121                      meson.source_root() / 'scripts/qapi/gen.py',
1122                      meson.source_root() / 'scripts/qapi/introspect.py',
1123                      meson.source_root() / 'scripts/qapi/parser.py',
1124                      meson.source_root() / 'scripts/qapi/schema.py',
1125                      meson.source_root() / 'scripts/qapi/source.py',
1126                      meson.source_root() / 'scripts/qapi/types.py',
1127                      meson.source_root() / 'scripts/qapi/visit.py',
1128                      meson.source_root() / 'scripts/qapi/common.py',
1129                      meson.source_root() / 'scripts/qapi-gen.py'
1132 tracetool = [
1133   python, files('scripts/tracetool.py'),
1134    '--backend=' + config_host['TRACE_BACKENDS']
1137 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1138                     meson.current_source_dir(),
1139                     config_host['PKGVERSION'], meson.project_version()]
1140 qemu_version = custom_target('qemu-version.h',
1141                              output: 'qemu-version.h',
1142                              command: qemu_version_cmd,
1143                              capture: true,
1144                              build_by_default: true,
1145                              build_always_stale: true)
1146 genh += qemu_version
1148 hxdep = []
1149 hx_headers = [
1150   ['qemu-options.hx', 'qemu-options.def'],
1151   ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1153 if have_system
1154   hx_headers += [
1155     ['hmp-commands.hx', 'hmp-commands.h'],
1156     ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1157   ]
1158 endif
1159 foreach d : hx_headers
1160   hxdep += custom_target(d[1],
1161                 input: files(d[0]),
1162                 output: d[1],
1163                 capture: true,
1164                 build_by_default: true, # to be removed when added to a target
1165                 command: [hxtool, '-h', '@INPUT0@'])
1166 endforeach
1167 genh += hxdep
1169 SPHINX_ARGS = [config_host['SPHINX_BUILD'],
1170                '-Dversion=' + meson.project_version(),
1171                '-Drelease=' + config_host['PKGVERSION']]
1173 if get_option('werror')
1174   SPHINX_ARGS += [ '-W' ]
1175 endif
1177 sphinx_extn_depends = [ meson.source_root() / 'docs/sphinx/depfile.py',
1178                         meson.source_root() / 'docs/sphinx/hxtool.py',
1179                         meson.source_root() / 'docs/sphinx/kerneldoc.py',
1180                         meson.source_root() / 'docs/sphinx/kernellog.py',
1181                         meson.source_root() / 'docs/sphinx/qapidoc.py',
1182                         meson.source_root() / 'docs/sphinx/qmp_lexer.py',
1183                         qapi_gen_depends ]
1185 # Collect sourcesets.
1187 authz_ss = ss.source_set()
1188 blockdev_ss = ss.source_set()
1189 block_ss = ss.source_set()
1190 bsd_user_ss = ss.source_set()
1191 chardev_ss = ss.source_set()
1192 common_ss = ss.source_set()
1193 crypto_ss = ss.source_set()
1194 io_ss = ss.source_set()
1195 linux_user_ss = ss.source_set()
1196 qmp_ss = ss.source_set()
1197 qom_ss = ss.source_set()
1198 softmmu_ss = ss.source_set()
1199 specific_fuzz_ss = ss.source_set()
1200 specific_ss = ss.source_set()
1201 stub_ss = ss.source_set()
1202 trace_ss = ss.source_set()
1203 user_ss = ss.source_set()
1204 util_ss = ss.source_set()
1206 modules = {}
1207 hw_arch = {}
1208 target_arch = {}
1209 target_softmmu_arch = {}
1211 ###############
1212 # Trace files #
1213 ###############
1215 # TODO: add each directory to the subdirs from its own meson.build, once
1216 # we have those
1217 trace_events_subdirs = [
1218   'accel/kvm',
1219   'accel/tcg',
1220   'crypto',
1221   'monitor',
1223 if have_user
1224   trace_events_subdirs += [ 'linux-user' ]
1225 endif
1226 if have_block
1227   trace_events_subdirs += [
1228     'authz',
1229     'block',
1230     'io',
1231     'nbd',
1232     'scsi',
1233   ]
1234 endif
1235 if have_system
1236   trace_events_subdirs += [
1237     'audio',
1238     'backends',
1239     'backends/tpm',
1240     'chardev',
1241     'hw/9pfs',
1242     'hw/acpi',
1243     'hw/alpha',
1244     'hw/arm',
1245     'hw/audio',
1246     'hw/block',
1247     'hw/block/dataplane',
1248     'hw/char',
1249     'hw/display',
1250     'hw/dma',
1251     'hw/hppa',
1252     'hw/hyperv',
1253     'hw/i2c',
1254     'hw/i386',
1255     'hw/i386/xen',
1256     'hw/ide',
1257     'hw/input',
1258     'hw/intc',
1259     'hw/isa',
1260     'hw/mem',
1261     'hw/mips',
1262     'hw/misc',
1263     'hw/misc/macio',
1264     'hw/net',
1265     'hw/nvram',
1266     'hw/pci',
1267     'hw/pci-host',
1268     'hw/ppc',
1269     'hw/rdma',
1270     'hw/rdma/vmw',
1271     'hw/rtc',
1272     'hw/s390x',
1273     'hw/scsi',
1274     'hw/sd',
1275     'hw/sparc',
1276     'hw/sparc64',
1277     'hw/ssi',
1278     'hw/timer',
1279     'hw/tpm',
1280     'hw/usb',
1281     'hw/vfio',
1282     'hw/virtio',
1283     'hw/watchdog',
1284     'hw/xen',
1285     'hw/gpio',
1286     'migration',
1287     'net',
1288     'softmmu',
1289     'ui',
1290   ]
1291 endif
1292 trace_events_subdirs += [
1293   'hw/core',
1294   'qapi',
1295   'qom',
1296   'target/arm',
1297   'target/hppa',
1298   'target/i386',
1299   'target/mips',
1300   'target/ppc',
1301   'target/riscv',
1302   'target/s390x',
1303   'target/sparc',
1304   'util',
1307 subdir('qapi')
1308 subdir('qobject')
1309 subdir('stubs')
1310 subdir('trace')
1311 subdir('util')
1312 subdir('qom')
1313 subdir('authz')
1314 subdir('crypto')
1315 subdir('ui')
1318 if enable_modules
1319   libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1320   modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1321 endif
1323 # Build targets from sourcesets
1325 stub_ss = stub_ss.apply(config_all, strict: false)
1327 util_ss.add_all(trace_ss)
1328 util_ss = util_ss.apply(config_all, strict: false)
1329 libqemuutil = static_library('qemuutil',
1330                              sources: util_ss.sources() + stub_ss.sources() + genh,
1331                              dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
1332 qemuutil = declare_dependency(link_with: libqemuutil,
1333                               sources: genh + version_res)
1335 decodetree = generator(find_program('scripts/decodetree.py'),
1336                        output: 'decode-@BASENAME@.c.inc',
1337                        arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1339 subdir('audio')
1340 subdir('io')
1341 subdir('chardev')
1342 subdir('fsdev')
1343 subdir('libdecnumber')
1344 subdir('target')
1345 subdir('dump')
1347 block_ss.add(files(
1348   'block.c',
1349   'blockdev-nbd.c',
1350   'blockjob.c',
1351   'job.c',
1352   'qemu-io-cmds.c',
1354 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
1356 subdir('nbd')
1357 subdir('scsi')
1358 subdir('block')
1360 blockdev_ss.add(files(
1361   'blockdev.c',
1362   'iothread.c',
1363   'job-qmp.c',
1366 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1367 # os-win32.c does not
1368 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1369 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
1370 softmmu_ss.add_all(blockdev_ss)
1372 common_ss.add(files('cpus-common.c'))
1374 subdir('softmmu')
1376 common_ss.add(capstone)
1377 specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
1378 specific_ss.add(files('exec-vary.c'))
1379 specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1380   'fpu/softfloat.c',
1381   'tcg/optimize.c',
1382   'tcg/tcg-common.c',
1383   'tcg/tcg-op-gvec.c',
1384   'tcg/tcg-op-vec.c',
1385   'tcg/tcg-op.c',
1386   'tcg/tcg.c',
1388 specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1390 subdir('backends')
1391 subdir('disas')
1392 subdir('migration')
1393 subdir('monitor')
1394 subdir('net')
1395 subdir('replay')
1396 subdir('hw')
1397 subdir('accel')
1398 subdir('plugins')
1399 subdir('bsd-user')
1400 subdir('linux-user')
1402 bsd_user_ss.add(files('gdbstub.c'))
1403 specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1405 linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1406 specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
1408 # needed for fuzzing binaries
1409 subdir('tests/qtest/libqos')
1410 subdir('tests/qtest/fuzz')
1412 block_mods = []
1413 softmmu_mods = []
1414 foreach d, list : modules
1415   foreach m, module_ss : list
1416     if enable_modules and targetos != 'windows'
1417       module_ss = module_ss.apply(config_all, strict: false)
1418       sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1419                           dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1420       if d == 'block'
1421         block_mods += sl
1422       else
1423         softmmu_mods += sl
1424       endif
1425     else
1426       if d == 'block'
1427         block_ss.add_all(module_ss)
1428       else
1429         softmmu_ss.add_all(module_ss)
1430       endif
1431     endif
1432   endforeach
1433 endforeach
1435 nm = find_program('nm')
1436 undefsym = find_program('scripts/undefsym.py')
1437 block_syms = custom_target('block.syms', output: 'block.syms',
1438                              input: [libqemuutil, block_mods],
1439                              capture: true,
1440                              command: [undefsym, nm, '@INPUT@'])
1441 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1442                              input: [libqemuutil, softmmu_mods],
1443                              capture: true,
1444                              command: [undefsym, nm, '@INPUT@'])
1446 ########################
1447 # Library dependencies #
1448 ########################
1450 qom_ss = qom_ss.apply(config_host, strict: false)
1451 libqom = static_library('qom', qom_ss.sources() + genh,
1452                         dependencies: [qom_ss.dependencies()],
1453                         name_suffix: 'fa')
1455 qom = declare_dependency(link_whole: libqom)
1457 authz_ss = authz_ss.apply(config_host, strict: false)
1458 libauthz = static_library('authz', authz_ss.sources() + genh,
1459                           dependencies: [authz_ss.dependencies()],
1460                           name_suffix: 'fa',
1461                           build_by_default: false)
1463 authz = declare_dependency(link_whole: libauthz,
1464                            dependencies: qom)
1466 crypto_ss = crypto_ss.apply(config_host, strict: false)
1467 libcrypto = static_library('crypto', crypto_ss.sources() + genh,
1468                            dependencies: [crypto_ss.dependencies()],
1469                            name_suffix: 'fa',
1470                            build_by_default: false)
1472 crypto = declare_dependency(link_whole: libcrypto,
1473                             dependencies: [authz, qom])
1475 io_ss = io_ss.apply(config_host, strict: false)
1476 libio = static_library('io', io_ss.sources() + genh,
1477                        dependencies: [io_ss.dependencies()],
1478                        link_with: libqemuutil,
1479                        name_suffix: 'fa',
1480                        build_by_default: false)
1482 io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
1484 libmigration = static_library('migration', sources: migration_files + genh,
1485                               name_suffix: 'fa',
1486                               build_by_default: false)
1487 migration = declare_dependency(link_with: libmigration,
1488                                dependencies: [zlib, qom, io])
1489 softmmu_ss.add(migration)
1491 block_ss = block_ss.apply(config_host, strict: false)
1492 libblock = static_library('block', block_ss.sources() + genh,
1493                           dependencies: block_ss.dependencies(),
1494                           link_depends: block_syms,
1495                           name_suffix: 'fa',
1496                           build_by_default: false)
1498 block = declare_dependency(link_whole: [libblock],
1499                            link_args: '@block.syms',
1500                            dependencies: [crypto, io])
1502 qmp_ss = qmp_ss.apply(config_host, strict: false)
1503 libqmp = static_library('qmp', qmp_ss.sources() + genh,
1504                         dependencies: qmp_ss.dependencies(),
1505                         name_suffix: 'fa',
1506                         build_by_default: false)
1508 qmp = declare_dependency(link_whole: [libqmp])
1510 libchardev = static_library('chardev', chardev_ss.sources() + genh,
1511                             name_suffix: 'fa',
1512                             build_by_default: false)
1514 chardev = declare_dependency(link_whole: libchardev)
1516 libhwcore = static_library('hwcore', sources: hwcore_files + genh,
1517                            name_suffix: 'fa',
1518                            build_by_default: false)
1519 hwcore = declare_dependency(link_whole: libhwcore)
1520 common_ss.add(hwcore)
1522 ###########
1523 # Targets #
1524 ###########
1526 foreach m : block_mods + softmmu_mods
1527   shared_module(m.name(),
1528                 name_prefix: '',
1529                 link_whole: m,
1530                 install: true,
1531                 install_dir: config_host['qemu_moddir'])
1532 endforeach
1534 softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
1535 common_ss.add(qom, qemuutil)
1537 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
1538 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
1540 common_all = common_ss.apply(config_all, strict: false)
1541 common_all = static_library('common',
1542                             build_by_default: false,
1543                             sources: common_all.sources() + genh,
1544                             dependencies: common_all.dependencies(),
1545                             name_suffix: 'fa')
1547 feature_to_c = find_program('scripts/feature_to_c.sh')
1549 emulators = {}
1550 foreach target : target_dirs
1551   config_target = config_target_mak[target]
1552   target_name = config_target['TARGET_NAME']
1553   arch = config_target['TARGET_BASE_ARCH']
1554   arch_srcs = [config_target_h[target]]
1555   arch_deps = []
1556   c_args = ['-DNEED_CPU_H',
1557             '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
1558             '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
1559   link_args = emulator_link_args
1561   config_target += config_host
1562   target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
1563   if targetos == 'linux'
1564     target_inc += include_directories('linux-headers', is_system: true)
1565   endif
1566   if target.endswith('-softmmu')
1567     qemu_target_name = 'qemu-system-' + target_name
1568     target_type='system'
1569     t = target_softmmu_arch[arch].apply(config_target, strict: false)
1570     arch_srcs += t.sources()
1571     arch_deps += t.dependencies()
1573     hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
1574     hw = hw_arch[hw_dir].apply(config_target, strict: false)
1575     arch_srcs += hw.sources()
1576     arch_deps += hw.dependencies()
1578     arch_srcs += config_devices_h[target]
1579     link_args += ['@block.syms', '@qemu.syms']
1580   else
1581     abi = config_target['TARGET_ABI_DIR']
1582     target_type='user'
1583     qemu_target_name = 'qemu-' + target_name
1584     if 'CONFIG_LINUX_USER' in config_target
1585       base_dir = 'linux-user'
1586       target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1587     else
1588       base_dir = 'bsd-user'
1589     endif
1590     target_inc += include_directories(
1591       base_dir,
1592       base_dir / abi,
1593     )
1594     if 'CONFIG_LINUX_USER' in config_target
1595       dir = base_dir / abi
1596       arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1597       if config_target.has_key('TARGET_SYSTBL_ABI')
1598         arch_srcs += \
1599           syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1600                                              extra_args : config_target['TARGET_SYSTBL_ABI'])
1601       endif
1602     endif
1603   endif
1605   if 'TARGET_XML_FILES' in config_target
1606     gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1607                                 output: target + '-gdbstub-xml.c',
1608                                 input: files(config_target['TARGET_XML_FILES'].split()),
1609                                 command: [feature_to_c, '@INPUT@'],
1610                                 capture: true)
1611     arch_srcs += gdbstub_xml
1612   endif
1614   t = target_arch[arch].apply(config_target, strict: false)
1615   arch_srcs += t.sources()
1616   arch_deps += t.dependencies()
1618   target_common = common_ss.apply(config_target, strict: false)
1619   objects = common_all.extract_objects(target_common.sources())
1620   deps = target_common.dependencies()
1622   target_specific = specific_ss.apply(config_target, strict: false)
1623   arch_srcs += target_specific.sources()
1624   arch_deps += target_specific.dependencies()
1626   lib = static_library('qemu-' + target,
1627                  sources: arch_srcs + genh,
1628                  dependencies: arch_deps,
1629                  objects: objects,
1630                  include_directories: target_inc,
1631                  c_args: c_args,
1632                  build_by_default: false,
1633                  name_suffix: 'fa')
1635   if target.endswith('-softmmu')
1636     execs = [{
1637       'name': 'qemu-system-' + target_name,
1638       'gui': false,
1639       'sources': files('softmmu/main.c'),
1640       'dependencies': []
1641     }]
1642     if targetos == 'windows' and (sdl.found() or gtk.found())
1643       execs += [{
1644         'name': 'qemu-system-' + target_name + 'w',
1645         'gui': true,
1646         'sources': files('softmmu/main.c'),
1647         'dependencies': []
1648       }]
1649     endif
1650     if config_host.has_key('CONFIG_FUZZ')
1651       specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1652       execs += [{
1653         'name': 'qemu-fuzz-' + target_name,
1654         'gui': false,
1655         'sources': specific_fuzz.sources(),
1656         'dependencies': specific_fuzz.dependencies(),
1657       }]
1658     endif
1659   else
1660     execs = [{
1661       'name': 'qemu-' + target_name,
1662       'gui': false,
1663       'sources': [],
1664       'dependencies': []
1665     }]
1666   endif
1667   foreach exe: execs
1668     emulators += {exe['name']:
1669          executable(exe['name'], exe['sources'],
1670                install: true,
1671                c_args: c_args,
1672                dependencies: arch_deps + deps + exe['dependencies'],
1673                objects: lib.extract_all_objects(recursive: true),
1674                link_language: link_language,
1675                link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1676                link_args: link_args,
1677                gui_app: exe['gui'])
1678     }
1680     if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1681       foreach stp: [
1682         {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1683         {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
1684         {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1685         {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1686       ]
1687         custom_target(exe['name'] + stp['ext'],
1688                       input: trace_events_all,
1689                       output: exe['name'] + stp['ext'],
1690                       capture: true,
1691                       install: stp['install'],
1692                       install_dir: qemu_datadir / '../systemtap/tapset',
1693                       command: [
1694                         tracetool, '--group=all', '--format=' + stp['fmt'],
1695                         '--binary=' + stp['bin'],
1696                         '--target-name=' + target_name,
1697                         '--target-type=' + target_type,
1698                         '--probe-prefix=qemu.' + target_type + '.' + target_name,
1699                         '@INPUT@',
1700                       ])
1701       endforeach
1702     endif
1703   endforeach
1704 endforeach
1706 # Other build targets
1708 if 'CONFIG_PLUGIN' in config_host
1709   install_headers('include/qemu/qemu-plugin.h')
1710 endif
1712 if 'CONFIG_GUEST_AGENT' in config_host
1713   subdir('qga')
1714 endif
1716 # Don't build qemu-keymap if xkbcommon is not explicitly enabled
1717 # when we don't build tools or system
1718 if xkbcommon.found()
1719   # used for the update-keymaps target, so include rules even if !have_tools
1720   qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1721                            dependencies: [qemuutil, xkbcommon], install: have_tools)
1722 endif
1724 if have_tools
1725   qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1726              dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1727   qemu_io = executable('qemu-io', files('qemu-io.c'),
1728              dependencies: [block, qemuutil], install: true)
1729   qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1730                dependencies: [block, qemuutil], install: true)
1732   subdir('storage-daemon')
1733   subdir('contrib/rdmacm-mux')
1734   subdir('contrib/elf2dmp')
1736   executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1737              dependencies: qemuutil,
1738              install: true)
1740   if 'CONFIG_VHOST_USER' in config_host
1741     subdir('contrib/libvhost-user')
1742     subdir('contrib/vhost-user-blk')
1743     subdir('contrib/vhost-user-gpu')
1744     subdir('contrib/vhost-user-input')
1745     subdir('contrib/vhost-user-scsi')
1746   endif
1748   if targetos == 'linux'
1749     executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1750                dependencies: [qemuutil, libcap_ng],
1751                install: true,
1752                install_dir: get_option('libexecdir'))
1754     executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1755                dependencies: [authz, crypto, io, qom, qemuutil,
1756                               libcap_ng, mpathpersist],
1757                install: true)
1758   endif
1760   if 'CONFIG_IVSHMEM' in config_host
1761     subdir('contrib/ivshmem-client')
1762     subdir('contrib/ivshmem-server')
1763   endif
1764 endif
1766 subdir('scripts')
1767 subdir('tools')
1768 subdir('pc-bios')
1769 subdir('tests')
1770 subdir('docs')
1771 if 'CONFIG_GTK' in config_host
1772   subdir('po')
1773 endif
1775 if host_machine.system() == 'windows'
1776   nsis_cmd = [
1777     find_program('scripts/nsis.py'),
1778     '@OUTPUT@',
1779     get_option('prefix'),
1780     meson.current_source_dir(),
1781     host_machine.cpu_family(),
1782     '--',
1783     '-DDISPLAYVERSION=' + meson.project_version(),
1784   ]
1785   if build_docs
1786     nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
1787   endif
1788   if 'CONFIG_GTK' in config_host
1789     nsis_cmd += '-DCONFIG_GTK=y'
1790   endif
1792   nsis = custom_target('nsis',
1793                        output: 'qemu-setup-' + meson.project_version() + '.exe',
1794                        input: files('qemu.nsi'),
1795                        build_always_stale: true,
1796                        command: nsis_cmd + ['@INPUT@'])
1797   alias_target('installer', nsis)
1798 endif
1800 summary_info = {}
1801 summary_info += {'Install prefix':    config_host['prefix']}
1802 summary_info += {'BIOS directory':    config_host['qemu_datadir']}
1803 summary_info += {'firmware path':     config_host['qemu_firmwarepath']}
1804 summary_info += {'binary directory':  config_host['bindir']}
1805 summary_info += {'library directory': config_host['libdir']}
1806 summary_info += {'module directory':  config_host['qemu_moddir']}
1807 summary_info += {'libexec directory': config_host['libexecdir']}
1808 summary_info += {'include directory': config_host['includedir']}
1809 summary_info += {'config directory':  config_host['sysconfdir']}
1810 if targetos != 'windows'
1811   summary_info += {'local state directory': config_host['qemu_localstatedir']}
1812   summary_info += {'Manual directory':      get_option('mandir')}
1813 else
1814   summary_info += {'local state directory': 'queried at runtime'}
1815 endif
1816 summary_info += {'Doc directory':     get_option('docdir')}
1817 summary_info += {'Build directory':   meson.current_build_dir()}
1818 summary_info += {'Source path':       meson.current_source_dir()}
1819 summary_info += {'GIT binary':        config_host['GIT']}
1820 summary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
1821 summary_info += {'C compiler':        meson.get_compiler('c').cmd_array()[0]}
1822 summary_info += {'Host C compiler':   meson.get_compiler('c', native: true).cmd_array()[0]}
1823 if link_language == 'cpp'
1824   summary_info += {'C++ compiler':      meson.get_compiler('cpp').cmd_array()[0]}
1825 else
1826   summary_info += {'C++ compiler':      false}
1827 endif
1828 if targetos == 'darwin'
1829   summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1830 endif
1831 summary_info += {'ARFLAGS':           config_host['ARFLAGS']}
1832 summary_info += {'CFLAGS':            ' '.join(get_option('c_args')
1833                                                + ['-O' + get_option('optimization')]
1834                                                + (get_option('debug') ? ['-g'] : []))}
1835 if link_language == 'cpp'
1836   summary_info += {'CXXFLAGS':        ' '.join(get_option('cpp_args')
1837                                                + ['-O' + get_option('optimization')]
1838                                                + (get_option('debug') ? ['-g'] : []))}
1839 endif
1840 link_args = get_option(link_language + '_link_args')
1841 if link_args.length() > 0
1842   summary_info += {'LDFLAGS':         ' '.join(link_args)}
1843 endif
1844 summary_info += {'QEMU_CFLAGS':       config_host['QEMU_CFLAGS']}
1845 summary_info += {'QEMU_LDFLAGS':      config_host['QEMU_LDFLAGS']}
1846 summary_info += {'make':              config_host['MAKE']}
1847 summary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1848 summary_info += {'sphinx-build':      config_host['SPHINX_BUILD']}
1849 summary_info += {'genisoimage':       config_host['GENISOIMAGE']}
1850 # TODO: add back version
1851 summary_info += {'slirp support':     slirp_opt == 'disabled' ? false : slirp_opt}
1852 if slirp_opt != 'disabled'
1853   summary_info += {'smbd':            config_host['CONFIG_SMBD_COMMAND']}
1854 endif
1855 summary_info += {'module support':    config_host.has_key('CONFIG_MODULES')}
1856 if config_host.has_key('CONFIG_MODULES')
1857   summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1858 endif
1859 summary_info += {'host CPU':          cpu}
1860 summary_info += {'host endianness':   build_machine.endian()}
1861 summary_info += {'target list':       ' '.join(target_dirs)}
1862 summary_info += {'gprof enabled':     config_host.has_key('CONFIG_GPROF')}
1863 summary_info += {'sparse enabled':    sparse.found()}
1864 summary_info += {'strip binaries':    get_option('strip')}
1865 summary_info += {'profiler':          config_host.has_key('CONFIG_PROFILER')}
1866 summary_info += {'static build':      config_host.has_key('CONFIG_STATIC')}
1867 if targetos == 'darwin'
1868   summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1869 endif
1870 # TODO: add back version
1871 summary_info += {'SDL support':       sdl.found()}
1872 summary_info += {'SDL image support': sdl_image.found()}
1873 # TODO: add back version
1874 summary_info += {'GTK support':       config_host.has_key('CONFIG_GTK')}
1875 summary_info += {'GTK GL support':    config_host.has_key('CONFIG_GTK_GL')}
1876 summary_info += {'pixman':            pixman.found()}
1877 # TODO: add back version
1878 summary_info += {'VTE support':       config_host.has_key('CONFIG_VTE')}
1879 summary_info += {'TLS priority':      config_host['CONFIG_TLS_PRIORITY']}
1880 summary_info += {'GNUTLS support':    config_host.has_key('CONFIG_GNUTLS')}
1881 # TODO: add back version
1882 summary_info += {'libgcrypt':         config_host.has_key('CONFIG_GCRYPT')}
1883 if config_host.has_key('CONFIG_GCRYPT')
1884    summary_info += {'  hmac':            config_host.has_key('CONFIG_GCRYPT_HMAC')}
1885    summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1886 endif
1887 # TODO: add back version
1888 summary_info += {'nettle':            config_host.has_key('CONFIG_NETTLE')}
1889 if config_host.has_key('CONFIG_NETTLE')
1890    summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1891 endif
1892 summary_info += {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
1893 summary_info += {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
1894 summary_info += {'iconv support':     config_host.has_key('CONFIG_ICONV')}
1895 summary_info += {'curses support':    config_host.has_key('CONFIG_CURSES')}
1896 # TODO: add back version
1897 summary_info += {'virgl support':     config_host.has_key('CONFIG_VIRGL')}
1898 summary_info += {'curl support':      config_host.has_key('CONFIG_CURL')}
1899 summary_info += {'mingw32 support':   targetos == 'windows'}
1900 summary_info += {'Audio drivers':     config_host['CONFIG_AUDIO_DRIVERS']}
1901 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1902 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1903 summary_info += {'VirtFS support':    config_host.has_key('CONFIG_VIRTFS')}
1904 summary_info += {'Multipath support': mpathpersist.found()}
1905 summary_info += {'VNC support':       vnc.found()}
1906 if vnc.found()
1907   summary_info += {'VNC SASL support':  sasl.found()}
1908   summary_info += {'VNC JPEG support':  jpeg.found()}
1909   summary_info += {'VNC PNG support':   png.found()}
1910 endif
1911 summary_info += {'xen support':       config_host.has_key('CONFIG_XEN_BACKEND')}
1912 if config_host.has_key('CONFIG_XEN_BACKEND')
1913   summary_info += {'xen ctrl version':  config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1914 endif
1915 summary_info += {'brlapi support':    config_host.has_key('CONFIG_BRLAPI')}
1916 summary_info += {'Documentation':     config_host.has_key('BUILD_DOCS')}
1917 summary_info += {'PIE':               get_option('b_pie')}
1918 summary_info += {'vde support':       config_host.has_key('CONFIG_VDE')}
1919 summary_info += {'netmap support':    config_host.has_key('CONFIG_NETMAP')}
1920 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1921 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1922 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1923 summary_info += {'Install blobs':     config_host.has_key('INSTALL_BLOBS')}
1924 summary_info += {'KVM support':       config_all.has_key('CONFIG_KVM')}
1925 summary_info += {'HAX support':       config_all.has_key('CONFIG_HAX')}
1926 summary_info += {'HVF support':       config_all.has_key('CONFIG_HVF')}
1927 summary_info += {'WHPX support':      config_all.has_key('CONFIG_WHPX')}
1928 summary_info += {'TCG support':       config_all.has_key('CONFIG_TCG')}
1929 if config_all.has_key('CONFIG_TCG')
1930   summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1931   summary_info += {'TCG interpreter':   config_host.has_key('CONFIG_TCG_INTERPRETER')}
1932 endif
1933 summary_info += {'malloc trim support': has_malloc_trim}
1934 summary_info += {'RDMA support':      config_host.has_key('CONFIG_RDMA')}
1935 summary_info += {'PVRDMA support':    config_host.has_key('CONFIG_PVRDMA')}
1936 summary_info += {'fdt support':       fdt_opt == 'disabled' ? false : fdt_opt}
1937 summary_info += {'membarrier':        config_host.has_key('CONFIG_MEMBARRIER')}
1938 summary_info += {'preadv support':    config_host.has_key('CONFIG_PREADV')}
1939 summary_info += {'fdatasync':         config_host.has_key('CONFIG_FDATASYNC')}
1940 summary_info += {'madvise':           config_host.has_key('CONFIG_MADVISE')}
1941 summary_info += {'posix_madvise':     config_host.has_key('CONFIG_POSIX_MADVISE')}
1942 summary_info += {'posix_memalign':    config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1943 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1944 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1945 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1946 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1947 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1948 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1949 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1950 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1951 summary_info += {'Trace backends':    config_host['TRACE_BACKENDS']}
1952 if config_host['TRACE_BACKENDS'].split().contains('simple')
1953   summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1954 endif
1955 # TODO: add back protocol and server version
1956 summary_info += {'spice support':     config_host.has_key('CONFIG_SPICE')}
1957 summary_info += {'rbd support':       config_host.has_key('CONFIG_RBD')}
1958 summary_info += {'xfsctl support':    config_host.has_key('CONFIG_XFS')}
1959 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1960 summary_info += {'U2F support':       u2f.found()}
1961 summary_info += {'libusb':            config_host.has_key('CONFIG_USB_LIBUSB')}
1962 summary_info += {'usb net redir':     config_host.has_key('CONFIG_USB_REDIR')}
1963 summary_info += {'OpenGL support':    config_host.has_key('CONFIG_OPENGL')}
1964 summary_info += {'OpenGL dmabufs':    config_host.has_key('CONFIG_OPENGL_DMABUF')}
1965 summary_info += {'libiscsi support':  config_host.has_key('CONFIG_LIBISCSI')}
1966 summary_info += {'libnfs support':    config_host.has_key('CONFIG_LIBNFS')}
1967 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1968 if targetos == 'windows'
1969   if 'WIN_SDK' in config_host
1970     summary_info += {'Windows SDK':       config_host['WIN_SDK']}
1971   endif
1972   summary_info += {'QGA VSS support':   config_host.has_key('CONFIG_QGA_VSS')}
1973   summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1974   summary_info += {'QGA MSI support':   config_host.has_key('CONFIG_QGA_MSI')}
1975 endif
1976 summary_info += {'seccomp support':   config_host.has_key('CONFIG_SECCOMP')}
1977 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1978 summary_info += {'coroutine pool':    config_host['CONFIG_COROUTINE_POOL'] == '1'}
1979 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1980 summary_info += {'mutex debugging':   config_host.has_key('CONFIG_DEBUG_MUTEX')}
1981 summary_info += {'crypto afalg':      config_host.has_key('CONFIG_AF_ALG')}
1982 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1983 summary_info += {'gcov':              get_option('b_coverage')}
1984 summary_info += {'TPM support':       config_host.has_key('CONFIG_TPM')}
1985 summary_info += {'libssh support':    config_host.has_key('CONFIG_LIBSSH')}
1986 summary_info += {'QOM debugging':     config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1987 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1988 summary_info += {'lzo support':       config_host.has_key('CONFIG_LZO')}
1989 summary_info += {'snappy support':    config_host.has_key('CONFIG_SNAPPY')}
1990 summary_info += {'bzip2 support':     config_host.has_key('CONFIG_BZIP2')}
1991 summary_info += {'lzfse support':     config_host.has_key('CONFIG_LZFSE')}
1992 summary_info += {'zstd support':      config_host.has_key('CONFIG_ZSTD')}
1993 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1994 summary_info += {'libxml2':           config_host.has_key('CONFIG_LIBXML2')}
1995 summary_info += {'memory allocator':  get_option('malloc')}
1996 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1997 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1998 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1999 summary_info += {'bochs support':     config_host.has_key('CONFIG_BOCHS')}
2000 summary_info += {'cloop support':     config_host.has_key('CONFIG_CLOOP')}
2001 summary_info += {'dmg support':       config_host.has_key('CONFIG_DMG')}
2002 summary_info += {'qcow v1 support':   config_host.has_key('CONFIG_QCOW1')}
2003 summary_info += {'vdi support':       config_host.has_key('CONFIG_VDI')}
2004 summary_info += {'vvfat support':     config_host.has_key('CONFIG_VVFAT')}
2005 summary_info += {'qed support':       config_host.has_key('CONFIG_QED')}
2006 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2007 summary_info += {'sheepdog support':  config_host.has_key('CONFIG_SHEEPDOG')}
2008 summary_info += {'capstone':          capstone_opt == 'disabled' ? false : capstone_opt}
2009 summary_info += {'libpmem support':   config_host.has_key('CONFIG_LIBPMEM')}
2010 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
2011 summary_info += {'libudev':           libudev.found()}
2012 summary_info += {'default devices':   config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
2013 summary_info += {'plugin support':    config_host.has_key('CONFIG_PLUGIN')}
2014 summary_info += {'fuzzing support':   config_host.has_key('CONFIG_FUZZ')}
2015 if config_host.has_key('HAVE_GDB_BIN')
2016   summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
2017 endif
2018 summary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
2019 summary_info += {'rng-none':          config_host.has_key('CONFIG_RNG_NONE')}
2020 summary_info += {'Linux keyring':     config_host.has_key('CONFIG_SECRET_KEYRING')}
2021 summary(summary_info, bool_yn: true)
2023 if not supported_cpus.contains(cpu)
2024   message()
2025   warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2026   message()
2027   message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2028   message('The QEMU project intends to remove support for this host CPU in')
2029   message('a future release if nobody volunteers to maintain it and to')
2030   message('provide a build host for our continuous integration setup.')
2031   message('configure has succeeded and you can continue to build, but')
2032   message('if you care about QEMU on this platform you should contact')
2033   message('us upstream at qemu-devel@nongnu.org.')
2034 endif
2036 if not supported_oses.contains(targetos)
2037   message()
2038   warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2039   message()
2040   message('Host OS ' + targetos + 'support is not currently maintained.')
2041   message('The QEMU project intends to remove support for this host OS in')
2042   message('a future release if nobody volunteers to maintain it and to')
2043   message('provide a build host for our continuous integration setup.')
2044   message('configure has succeeded and you can continue to build, but')
2045   message('if you care about QEMU on this platform you should contact')
2046   message('us upstream at qemu-devel@nongnu.org.')
2047 endif