meson: Fix chardev-baum.so name
[qemu/ar7.git] / meson.build
blobb44901dfe17fcc270b25b62a9fd61bf31781003f
1 project('qemu', ['c'], meson_version: '>=0.55.0',
2         default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_lundef=false'],
3         version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5 not_found = dependency('', required: false)
6 if meson.version().version_compare('>=0.56.0')
7   keyval = import('keyval')
8 else
9   keyval = import('unstable-keyval')
10 endif
11 ss = import('sourceset')
13 sh = find_program('sh')
14 cc = meson.get_compiler('c')
15 config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
16 config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
17 enable_modules = 'CONFIG_MODULES' in config_host
18 enable_static = 'CONFIG_STATIC' in config_host
19 build_docs = 'BUILD_DOCS' in config_host
20 config_host_data = configuration_data()
21 genh = []
23 add_project_arguments(config_host['QEMU_CFLAGS'].split(),
24                       native: false, language: ['c', 'objc'])
25 add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
26                       native: false, language: 'cpp')
27 add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
28                            native: false, language: ['c', 'cpp', 'objc'])
29 add_project_arguments(config_host['QEMU_INCLUDES'].split(),
30                       language: ['c', 'cpp', 'objc'])
32 python = import('python').find_installation()
34 link_language = meson.get_external_property('link_language', 'cpp')
35 if link_language == 'cpp'
36   add_languages('cpp', required: true, native: false)
37 endif
38 if host_machine.system() == 'darwin'
39   add_languages('objc', required: false, native: false)
40 endif
42 if 'SPARSE_CFLAGS' in config_host
43   run_target('sparse',
44              command: [find_program('scripts/check_sparse.py'),
45                        config_host['SPARSE_CFLAGS'].split(),
46                        'compile_commands.json'])
47 endif
49 configure_file(input: files('scripts/ninjatool.py'),
50                output: 'ninjatool',
51                configuration: config_host)
53 supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
54 supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
55   'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
57 cpu = host_machine.cpu_family()
58 targetos = host_machine.system()
60 m = cc.find_library('m', required: false)
61 util = cc.find_library('util', required: false)
62 winmm = []
63 socket = []
64 version_res = []
65 coref = []
66 iokit = []
67 cocoa = []
68 hvf = []
69 if targetos == 'windows'
70   socket = cc.find_library('ws2_32')
71   winmm = cc.find_library('winmm')
73   win = import('windows')
74   version_res = win.compile_resources('version.rc',
75                                       depend_files: files('pc-bios/qemu-nsis.ico'),
76                                       include_directories: include_directories('.'))
77 elif targetos == 'darwin'
78   coref = dependency('appleframeworks', modules: 'CoreFoundation')
79   iokit = dependency('appleframeworks', modules: 'IOKit')
80   cocoa = dependency('appleframeworks', modules: 'Cocoa')
81   hvf = dependency('appleframeworks', modules: 'Hypervisor')
82 elif targetos == 'sunos'
83   socket = [cc.find_library('socket'),
84             cc.find_library('nsl'),
85             cc.find_library('resolv')]
86 elif targetos == 'haiku'
87   socket = [cc.find_library('posix_error_mapper'),
88             cc.find_library('network'),
89             cc.find_library('bsd')]
90 endif
91 glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
92                           link_args: config_host['GLIB_LIBS'].split())
93 gio = not_found
94 if 'CONFIG_GIO' in config_host
95   gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
96                            link_args: config_host['GIO_LIBS'].split())
97 endif
98 lttng = not_found
99 if 'CONFIG_TRACE_UST' in config_host
100   lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
101 endif
102 urcubp = not_found
103 if 'CONFIG_TRACE_UST' in config_host
104   urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
105 endif
106 nettle = not_found
107 if 'CONFIG_NETTLE' in config_host
108   nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
109                               link_args: config_host['NETTLE_LIBS'].split())
110 endif
111 gnutls = not_found
112 if 'CONFIG_GNUTLS' in config_host
113   gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
114                               link_args: config_host['GNUTLS_LIBS'].split())
115 endif
116 pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
117                             link_args: config_host['PIXMAN_LIBS'].split())
118 pam = not_found
119 if 'CONFIG_AUTH_PAM' in config_host
120   pam = cc.find_library('pam')
121 endif
122 libaio = cc.find_library('aio', required: false)
123 zlib = not_found
124 if 'CONFIG_ZLIB' in config_host
125   zlib = declare_dependency(compile_args: config_host['ZLIB_CFLAGS'].split(),
126                             link_args: config_host['ZLIB_LIBS'].split())
127 endif
128 linux_io_uring = not_found
129 if 'CONFIG_LINUX_IO_URING' in config_host
130   linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
131                                       link_args: config_host['LINUX_IO_URING_LIBS'].split())
132 endif
133 libxml2 = not_found
134 if 'CONFIG_LIBXML2' in config_host
135   libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
136                                link_args: config_host['LIBXML2_LIBS'].split())
137 endif
138 libnfs = not_found
139 if 'CONFIG_LIBNFS' in config_host
140   libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
141 endif
142 libattr = not_found
143 if 'CONFIG_ATTR' in config_host
144   libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
145 endif
146 seccomp = not_found
147 if 'CONFIG_SECCOMP' in config_host
148   seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
149                                link_args: config_host['SECCOMP_LIBS'].split())
150 endif
151 libcap_ng = not_found
152 if 'CONFIG_LIBCAP_NG' in config_host
153   libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
154 endif
155 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'), static: enable_static,
156                        include_type: 'system')
157 if xkbcommon.found()
158   xkbcommon = declare_dependency(dependencies: xkbcommon)
159 endif
160 slirp = not_found
161 if config_host.has_key('CONFIG_SLIRP')
162   slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
163                              link_args: config_host['SLIRP_LIBS'].split())
164 endif
165 vde = not_found
166 if config_host.has_key('CONFIG_VDE')
167   vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
168 endif
169 pulse = not_found
170 if 'CONFIG_LIBPULSE' in config_host
171   pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
172                              link_args: config_host['PULSE_LIBS'].split())
173 endif
174 alsa = not_found
175 if 'CONFIG_ALSA' in config_host
176   alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
177                             link_args: config_host['ALSA_LIBS'].split())
178 endif
179 jack = not_found
180 if 'CONFIG_LIBJACK' in config_host
181   jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
182 endif
183 spice = not_found
184 if 'CONFIG_SPICE' in config_host
185   spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
186                              link_args: config_host['SPICE_LIBS'].split())
187 endif
188 rt = cc.find_library('rt', required: false)
189 libmpathpersist = not_found
190 if config_host.has_key('CONFIG_MPATH')
191   libmpathpersist = cc.find_library('mpathpersist')
192 endif
193 libiscsi = not_found
194 if 'CONFIG_LIBISCSI' in config_host
195   libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
196                                 link_args: config_host['LIBISCSI_LIBS'].split())
197 endif
198 zstd = not_found
199 if 'CONFIG_ZSTD' in config_host
200   zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
201                             link_args: config_host['ZSTD_LIBS'].split())
202 endif
203 gbm = not_found
204 if 'CONFIG_GBM' in config_host
205   gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
206                            link_args: config_host['GBM_LIBS'].split())
207 endif
208 virgl = not_found
209 if 'CONFIG_VIRGL' in config_host
210   virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
211                              link_args: config_host['VIRGL_LIBS'].split())
212 endif
213 curl = not_found
214 if 'CONFIG_CURL' in config_host
215   curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
216                             link_args: config_host['CURL_LIBS'].split())
217 endif
218 libudev = not_found
219 if 'CONFIG_LIBUDEV' in config_host
220   libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
221 endif
222 brlapi = not_found
223 if 'CONFIG_BRLAPI' in config_host
224   brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
225 endif
227 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static,
228                  include_type: 'system')
229 sdl_image = not_found
230 if sdl.found()
231   # work around 2.0.8 bug
232   sdl = declare_dependency(compile_args: '-Wno-undef',
233                            dependencies: sdl)
234   sdl_image = dependency('sdl-image', required: get_option('sdl_image'),
235                          static: enable_static)
236 else
237   if get_option('sdl_image').enabled()
238     error('sdl-image required, but SDL was @0@',
239           get_option('sdl').disabled() ? 'disabled' : 'not found')
240   endif
241   sdl_image = not_found
242 endif
244 rbd = not_found
245 if 'CONFIG_RBD' in config_host
246   rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
247 endif
248 glusterfs = not_found
249 if 'CONFIG_GLUSTERFS' in config_host
250   glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
251                                  link_args: config_host['GLUSTERFS_LIBS'].split())
252 endif
253 libssh = not_found
254 if 'CONFIG_LIBSSH' in config_host
255   libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
256                               link_args: config_host['LIBSSH_LIBS'].split())
257 endif
258 libbzip2 = not_found
259 if 'CONFIG_BZIP2' in config_host
260   libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
261 endif
262 liblzfse = not_found
263 if 'CONFIG_LZFSE' in config_host
264   liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
265 endif
266 oss = not_found
267 if 'CONFIG_AUDIO_OSS' in config_host
268   oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
269 endif
270 dsound = not_found
271 if 'CONFIG_AUDIO_DSOUND' in config_host
272   dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
273 endif
274 coreaudio = not_found
275 if 'CONFIG_AUDIO_COREAUDIO' in config_host
276   coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
277 endif
278 opengl = not_found
279 if 'CONFIG_OPENGL' in config_host
280   opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
281 else
282 endif
283 gtk = not_found
284 if 'CONFIG_GTK' in config_host
285   gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
286                               link_args: config_host['GTK_LIBS'].split())
287 endif
288 vte = not_found
289 if 'CONFIG_VTE' in config_host
290   vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
291                            link_args: config_host['VTE_LIBS'].split())
292 endif
293 x11 = not_found
294 if 'CONFIG_X11' in config_host
295   x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
296                            link_args: config_host['X11_LIBS'].split())
297 endif
298 curses = not_found
299 if 'CONFIG_CURSES' in config_host
300   curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
301                               link_args: config_host['CURSES_LIBS'].split())
302 endif
303 iconv = not_found
304 if 'CONFIG_ICONV' in config_host
305   iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
306                              link_args: config_host['ICONV_LIBS'].split())
307 endif
308 gio = not_found
309 if 'CONFIG_GIO' in config_host
310   gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
311                            link_args: config_host['GIO_LIBS'].split())
312 endif
313 vnc = not_found
314 png = not_found
315 jpeg = not_found
316 sasl = not_found
317 if get_option('vnc').enabled()
318   vnc = declare_dependency() # dummy dependency
319   png = dependency('libpng', required: get_option('vnc_png'),
320                    static: enable_static)
321   jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
322                          required: get_option('vnc_jpeg'),
323                          static: enable_static)
324   sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
325                          required: get_option('vnc_sasl'),
326                          static: enable_static)
327   if sasl.found()
328     sasl = declare_dependency(dependencies: sasl,
329                               compile_args: '-DSTRUCT_IOVEC_DEFINED')
330   endif
331 endif
332 fdt = not_found
333 if 'CONFIG_FDT' in config_host
334   fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
335                            link_args: config_host['FDT_LIBS'].split())
336 endif
337 snappy = not_found
338 if 'CONFIG_SNAPPY' in config_host
339   snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
340 endif
341 lzo = not_found
342 if 'CONFIG_LZO' in config_host
343   lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
344 endif
345 rdma = not_found
346 if 'CONFIG_RDMA' in config_host
347   rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
348 endif
349 numa = not_found
350 if 'CONFIG_NUMA' in config_host
351   numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
352 endif
353 xen = not_found
354 if 'CONFIG_XEN_BACKEND' in config_host
355   xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
356                            link_args: config_host['XEN_LIBS'].split())
357 endif
358 cacard = not_found
359 if 'CONFIG_SMARTCARD' in config_host
360   cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
361                               link_args: config_host['SMARTCARD_LIBS'].split())
362 endif
363 usbredir = not_found
364 if 'CONFIG_USB_REDIR' in config_host
365   usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
366                                 link_args: config_host['USB_REDIR_LIBS'].split())
367 endif
368 libusb = not_found
369 if 'CONFIG_USB_LIBUSB' in config_host
370   libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
371                               link_args: config_host['LIBUSB_LIBS'].split())
372 endif
373 capstone = not_found
374 if 'CONFIG_CAPSTONE' in config_host
375   capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(),
376                                 link_args: config_host['CAPSTONE_LIBS'].split())
377 endif
378 libpmem = not_found
379 if 'CONFIG_LIBPMEM' in config_host
380   libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
381                                link_args: config_host['LIBPMEM_LIBS'].split())
382 endif
383 libdaxctl = not_found
384 if 'CONFIG_LIBDAXCTL' in config_host
385   libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
386 endif
388 # Create config-host.h
390 config_host_data.set('CONFIG_SDL', sdl.found())
391 config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
392 config_host_data.set('CONFIG_VNC', vnc.found())
393 config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
394 config_host_data.set('CONFIG_VNC_PNG', png.found())
395 config_host_data.set('CONFIG_VNC_SASL', sasl.found())
396 config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
397 config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
398 config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
399 config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
400 config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
402 arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
403 strings = ['HOST_DSOSUF', 'CONFIG_IASL', 'qemu_confdir', 'qemu_datadir',
404            'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
405            'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath']
406 foreach k, v: config_host
407   if arrays.contains(k)
408     if v != ''
409       v = '"' + '", "'.join(v.split()) + '", '
410     endif
411     config_host_data.set(k, v)
412   elif k == 'ARCH'
413     config_host_data.set('HOST_' + v.to_upper(), 1)
414   elif strings.contains(k)
415     if not k.startswith('CONFIG_')
416       k = 'CONFIG_' + k.to_upper()
417     endif
418     config_host_data.set_quoted(k, v)
419   elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
420     config_host_data.set(k, v == 'y' ? 1 : v)
421   endif
422 endforeach
423 genh += configure_file(output: 'config-host.h', configuration: config_host_data)
425 minikconf = find_program('scripts/minikconf.py')
426 target_dirs = config_host['TARGET_DIRS'].split()
427 have_user = false
428 have_system = false
429 config_devices_mak_list = []
430 config_devices_h = {}
431 config_target_h = {}
432 config_target_mak = {}
433 kconfig_external_symbols = [
434   'CONFIG_KVM',
435   'CONFIG_XEN',
436   'CONFIG_TPM',
437   'CONFIG_SPICE',
438   'CONFIG_IVSHMEM',
439   'CONFIG_OPENGL',
440   'CONFIG_X11',
441   'CONFIG_VHOST_USER',
442   'CONFIG_VHOST_KERNEL',
443   'CONFIG_VIRTFS',
444   'CONFIG_LINUX',
445   'CONFIG_PVRDMA',
447 ignored = ['TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_DIRS']
448 foreach target : target_dirs
449   have_user = have_user or target.endswith('-user')
450   config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak')
452   config_target_data = configuration_data()
453   foreach k, v: config_target
454     if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
455       # do nothing
456     elif ignored.contains(k)
457       # do nothing
458     elif k == 'TARGET_BASE_ARCH'
459       config_target_data.set('TARGET_' + v.to_upper(), 1)
460     elif k == 'TARGET_NAME'
461       config_target_data.set_quoted(k, v)
462     elif v == 'y'
463       config_target_data.set(k, 1)
464     else
465       config_target_data.set(k, v)
466     endif
467   endforeach
468   config_target_h += {target: configure_file(output: target + '-config-target.h',
469                                                configuration: config_target_data)}
471   if target.endswith('-softmmu')
472     have_system = true
474     base_kconfig = []
475     foreach sym : kconfig_external_symbols
476       if sym in config_target or sym in config_host
477         base_kconfig += '@0@=y'.format(sym)
478       endif
479     endforeach
481     config_devices_mak = target + '-config-devices.mak'
482     config_devices_mak = configure_file(
483       input: ['default-configs' / target + '.mak', 'Kconfig'],
484       output: config_devices_mak,
485       depfile: config_devices_mak + '.d',
486       capture: true,
487       command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
488                 config_devices_mak, '@DEPFILE@', '@INPUT@',
489                 base_kconfig])
491     config_devices_data = configuration_data()
492     config_devices = keyval.load(config_devices_mak)
493     foreach k, v: config_devices
494       config_devices_data.set(k, 1)
495     endforeach
496     config_devices_mak_list += config_devices_mak
497     config_devices_h += {target: configure_file(output: target + '-config-devices.h',
498                                                 configuration: config_devices_data)}
499     config_target += config_devices
500   endif
501   config_target_mak += {target: config_target}
502 endforeach
503 have_tools = 'CONFIG_TOOLS' in config_host
504 have_block = have_system or have_tools
506 grepy = find_program('scripts/grepy.sh')
507 # This configuration is used to build files that are shared by
508 # multiple binaries, and then extracted out of the "common"
509 # static_library target.
511 # We do not use all_sources()/all_dependencies(), because it would
512 # build literally all source files, including devices only used by
513 # targets that are not built for this compilation.  The CONFIG_ALL
514 # pseudo symbol replaces it.
516 if have_system
517   config_all_devices_mak = configure_file(
518     output: 'config-all-devices.mak',
519     input: config_devices_mak_list,
520     capture: true,
521     command: [grepy, '@INPUT@'],
522   )
523   config_all_devices = keyval.load(config_all_devices_mak)
524 else
525   config_all_devices = {}
526 endif
527 config_all = config_all_devices
528 config_all += config_host
529 config_all += config_all_disas
530 config_all += {
531   'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
532   'CONFIG_SOFTMMU': have_system,
533   'CONFIG_USER_ONLY': have_user,
534   'CONFIG_ALL': true,
537 # Generators
539 hxtool = find_program('scripts/hxtool')
540 shaderinclude = find_program('scripts/shaderinclude.pl')
541 qapi_gen = find_program('scripts/qapi-gen.py')
542 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
543                      meson.source_root() / 'scripts/qapi/commands.py',
544                      meson.source_root() / 'scripts/qapi/common.py',
545                      meson.source_root() / 'scripts/qapi/doc.py',
546                      meson.source_root() / 'scripts/qapi/error.py',
547                      meson.source_root() / 'scripts/qapi/events.py',
548                      meson.source_root() / 'scripts/qapi/expr.py',
549                      meson.source_root() / 'scripts/qapi/gen.py',
550                      meson.source_root() / 'scripts/qapi/introspect.py',
551                      meson.source_root() / 'scripts/qapi/parser.py',
552                      meson.source_root() / 'scripts/qapi/schema.py',
553                      meson.source_root() / 'scripts/qapi/source.py',
554                      meson.source_root() / 'scripts/qapi/types.py',
555                      meson.source_root() / 'scripts/qapi/visit.py',
556                      meson.source_root() / 'scripts/qapi/common.py',
557                      meson.source_root() / 'scripts/qapi/doc.py',
558                      meson.source_root() / 'scripts/qapi-gen.py'
561 tracetool = [
562   python, files('scripts/tracetool.py'),
563    '--backend=' + config_host['TRACE_BACKENDS']
566 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
567                     meson.current_source_dir(),
568                     config_host['PKGVERSION'], meson.project_version()]
569 qemu_version = custom_target('qemu-version.h',
570                              output: 'qemu-version.h',
571                              command: qemu_version_cmd,
572                              capture: true,
573                              build_by_default: true,
574                              build_always_stale: true)
575 genh += qemu_version
577 hxdep = []
578 hx_headers = [
579   ['qemu-options.hx', 'qemu-options.def'],
580   ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
582 if have_system
583   hx_headers += [
584     ['hmp-commands.hx', 'hmp-commands.h'],
585     ['hmp-commands-info.hx', 'hmp-commands-info.h'],
586   ]
587 endif
588 foreach d : hx_headers
589   hxdep += custom_target(d[1],
590                 input: files(d[0]),
591                 output: d[1],
592                 capture: true,
593                 build_by_default: true, # to be removed when added to a target
594                 command: [hxtool, '-h', '@INPUT0@'])
595 endforeach
596 genh += hxdep
598 # Collect sourcesets.
600 util_ss = ss.source_set()
601 stub_ss = ss.source_set()
602 trace_ss = ss.source_set()
603 block_ss = ss.source_set()
604 blockdev_ss = ss.source_set()
605 qmp_ss = ss.source_set()
606 common_ss = ss.source_set()
607 softmmu_ss = ss.source_set()
608 user_ss = ss.source_set()
609 bsd_user_ss = ss.source_set()
610 linux_user_ss = ss.source_set()
611 specific_ss = ss.source_set()
612 specific_fuzz_ss = ss.source_set()
614 modules = {}
615 hw_arch = {}
616 target_arch = {}
617 target_softmmu_arch = {}
619 ###############
620 # Trace files #
621 ###############
623 # TODO: add each directory to the subdirs from its own meson.build, once
624 # we have those
625 trace_events_subdirs = [
626   'accel/kvm',
627   'accel/tcg',
628   'crypto',
629   'monitor',
631 if have_user
632   trace_events_subdirs += [ 'linux-user' ]
633 endif
634 if have_block
635   trace_events_subdirs += [
636     'authz',
637     'block',
638     'io',
639     'nbd',
640     'scsi',
641   ]
642 endif
643 if have_system
644   trace_events_subdirs += [
645     'audio',
646     'backends',
647     'backends/tpm',
648     'chardev',
649     'hw/9pfs',
650     'hw/acpi',
651     'hw/alpha',
652     'hw/arm',
653     'hw/audio',
654     'hw/block',
655     'hw/block/dataplane',
656     'hw/char',
657     'hw/display',
658     'hw/dma',
659     'hw/hppa',
660     'hw/hyperv',
661     'hw/i2c',
662     'hw/i386',
663     'hw/i386/xen',
664     'hw/ide',
665     'hw/input',
666     'hw/intc',
667     'hw/isa',
668     'hw/mem',
669     'hw/mips',
670     'hw/misc',
671     'hw/misc/macio',
672     'hw/net',
673     'hw/nvram',
674     'hw/pci',
675     'hw/pci-host',
676     'hw/ppc',
677     'hw/rdma',
678     'hw/rdma/vmw',
679     'hw/rtc',
680     'hw/s390x',
681     'hw/scsi',
682     'hw/sd',
683     'hw/sparc',
684     'hw/sparc64',
685     'hw/ssi',
686     'hw/timer',
687     'hw/tpm',
688     'hw/usb',
689     'hw/vfio',
690     'hw/virtio',
691     'hw/watchdog',
692     'hw/xen',
693     'hw/gpio',
694     'hw/riscv',
695     'migration',
696     'net',
697     'ui',
698   ]
699 endif
700 trace_events_subdirs += [
701   'hw/core',
702   'qapi',
703   'qom',
704   'target/arm',
705   'target/hppa',
706   'target/i386',
707   'target/mips',
708   'target/ppc',
709   'target/riscv',
710   'target/s390x',
711   'target/sparc',
712   'util',
715 subdir('qapi')
716 subdir('qobject')
717 subdir('stubs')
718 subdir('trace')
719 subdir('util')
720 subdir('qom')
721 subdir('authz')
722 subdir('crypto')
723 subdir('ui')
726 if enable_modules
727   libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
728   modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
729 endif
731 # Build targets from sourcesets
733 stub_ss = stub_ss.apply(config_all, strict: false)
735 util_ss.add_all(trace_ss)
736 util_ss = util_ss.apply(config_all, strict: false)
737 libqemuutil = static_library('qemuutil',
738                              sources: util_ss.sources() + stub_ss.sources() + genh,
739                              dependencies: [util_ss.dependencies(), m, glib, socket])
740 qemuutil = declare_dependency(link_with: libqemuutil,
741                               sources: genh + version_res)
743 decodetree = generator(find_program('scripts/decodetree.py'),
744                        output: 'decode-@BASENAME@.c.inc',
745                        arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
747 subdir('audio')
748 subdir('io')
749 subdir('chardev')
750 subdir('fsdev')
751 subdir('libdecnumber')
752 subdir('target')
753 subdir('dump')
755 block_ss.add(files(
756   'block.c',
757   'blockjob.c',
758   'job.c',
759   'qemu-io-cmds.c',
761 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
763 subdir('nbd')
764 subdir('scsi')
765 subdir('block')
767 blockdev_ss.add(files(
768   'blockdev.c',
769   'blockdev-nbd.c',
770   'iothread.c',
771   'job-qmp.c',
774 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
775 # os-win32.c does not
776 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
777 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
779 softmmu_ss.add_all(blockdev_ss)
780 softmmu_ss.add(files(
781   'bootdevice.c',
782   'dma-helpers.c',
783   'qdev-monitor.c',
784 ), sdl)
786 softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
787 softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
788 softmmu_ss.add(when: ['CONFIG_FDT', fdt],  if_true: [files('device_tree.c')])
790 common_ss.add(files('cpus-common.c'))
792 subdir('softmmu')
794 specific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem, libdaxctl)
795 specific_ss.add(files('exec-vary.c'))
796 specific_ss.add(when: 'CONFIG_TCG', if_true: files(
797   'fpu/softfloat.c',
798   'tcg/optimize.c',
799   'tcg/tcg-common.c',
800   'tcg/tcg-op-gvec.c',
801   'tcg/tcg-op-vec.c',
802   'tcg/tcg-op.c',
803   'tcg/tcg.c',
805 specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
807 subdir('backends')
808 subdir('disas')
809 subdir('migration')
810 subdir('monitor')
811 subdir('net')
812 subdir('replay')
813 subdir('hw')
814 subdir('accel')
815 subdir('plugins')
816 subdir('bsd-user')
817 subdir('linux-user')
819 bsd_user_ss.add(files('gdbstub.c'))
820 specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
822 linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
823 specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
825 # needed for fuzzing binaries
826 subdir('tests/qtest/libqos')
827 subdir('tests/qtest/fuzz')
829 block_mods = []
830 softmmu_mods = []
831 foreach d, list : modules
832   foreach m, module_ss : list
833     if enable_modules and targetos != 'windows'
834       module_ss = module_ss.apply(config_host, strict: false)
835       sl = static_library(d + '-' + m, [genh, module_ss.sources()],
836                           dependencies: [modulecommon, module_ss.dependencies()], pic: true)
837       if d == 'block'
838         block_mods += sl
839       else
840         softmmu_mods += sl
841       endif
842     else
843       if d == 'block'
844         block_ss.add_all(module_ss)
845       else
846         softmmu_ss.add_all(module_ss)
847       endif
848     endif
849   endforeach
850 endforeach
852 nm = find_program('nm')
853 undefsym = find_program('scripts/undefsym.sh')
854 block_syms = custom_target('block.syms', output: 'block.syms',
855                              input: [libqemuutil, block_mods],
856                              capture: true,
857                              command: [undefsym, nm, '@INPUT@'])
858 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
859                              input: [libqemuutil, softmmu_mods],
860                              capture: true,
861                              command: [undefsym, nm, '@INPUT@'])
863 block_ss = block_ss.apply(config_host, strict: false)
864 libblock = static_library('block', block_ss.sources() + genh,
865                           dependencies: block_ss.dependencies(),
866                           link_depends: block_syms,
867                           name_suffix: 'fa',
868                           build_by_default: false)
870 block = declare_dependency(link_whole: [libblock],
871                            link_args: '@block.syms',
872                            dependencies: [crypto, io])
874 qmp_ss = qmp_ss.apply(config_host, strict: false)
875 libqmp = static_library('qmp', qmp_ss.sources() + genh,
876                         dependencies: qmp_ss.dependencies(),
877                         name_suffix: 'fa',
878                         build_by_default: false)
880 qmp = declare_dependency(link_whole: [libqmp])
882 foreach m : block_mods + softmmu_mods
883   shared_module(m.name(),
884                 name_prefix: '',
885                 link_whole: m,
886                 install: true,
887                 install_dir: config_host['qemu_moddir'])
888 endforeach
890 softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
891 common_ss.add(qom, qemuutil)
893 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
894 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
896 common_all = common_ss.apply(config_all, strict: false)
897 common_all = static_library('common',
898                             build_by_default: false,
899                             sources: common_all.sources() + genh,
900                             dependencies: common_all.dependencies(),
901                             name_suffix: 'fa')
903 feature_to_c = find_program('scripts/feature_to_c.sh')
905 emulators = []
906 foreach target : target_dirs
907   config_target = config_target_mak[target]
908   target_name = config_target['TARGET_NAME']
909   arch = config_target['TARGET_BASE_ARCH']
910   arch_srcs = [config_target_h[target]]
911   arch_deps = []
912   c_args = ['-DNEED_CPU_H',
913             '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
914             '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
915   link_args = []
917   config_target += config_host
918   target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
919   if targetos == 'linux'
920     target_inc += include_directories('linux-headers', is_system: true)
921   endif
922   if target.endswith('-softmmu')
923     qemu_target_name = 'qemu-system-' + target_name
924     target_type='system'
925     t = target_softmmu_arch[arch].apply(config_target, strict: false)
926     arch_srcs += t.sources()
927     arch_deps += t.dependencies()
929     hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
930     hw = hw_arch[hw_dir].apply(config_target, strict: false)
931     arch_srcs += hw.sources()
932     arch_deps += hw.dependencies()
934     arch_srcs += config_devices_h[target]
935     link_args += ['@block.syms', '@qemu.syms']
936   else
937     abi = config_target['TARGET_ABI_DIR']
938     target_type='user'
939     qemu_target_name = 'qemu-' + target_name
940     if 'CONFIG_LINUX_USER' in config_target
941       base_dir = 'linux-user'
942       target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
943     else
944       base_dir = 'bsd-user'
945     endif
946     target_inc += include_directories(
947       base_dir,
948       base_dir / abi,
949     )
950     if 'CONFIG_LINUX_USER' in config_target
951       dir = base_dir / abi
952       arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
953       if config_target.has_key('TARGET_SYSTBL_ABI')
954         arch_srcs += \
955           syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
956                                              extra_args : config_target['TARGET_SYSTBL_ABI'])
957       endif
958     endif
959   endif
961   if 'TARGET_XML_FILES' in config_target
962     gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
963                                 output: target + '-gdbstub-xml.c',
964                                 input: files(config_target['TARGET_XML_FILES'].split()),
965                                 command: [feature_to_c, '@INPUT@'],
966                                 capture: true)
967     arch_srcs += gdbstub_xml
968   endif
970   t = target_arch[arch].apply(config_target, strict: false)
971   arch_srcs += t.sources()
972   arch_deps += t.dependencies()
974   target_common = common_ss.apply(config_target, strict: false)
975   objects = common_all.extract_objects(target_common.sources())
976   deps = target_common.dependencies()
978   target_specific = specific_ss.apply(config_target, strict: false)
979   arch_srcs += target_specific.sources()
980   arch_deps += target_specific.dependencies()
982   lib = static_library('qemu-' + target,
983                  sources: arch_srcs + genh,
984                  objects: objects,
985                  include_directories: target_inc,
986                  c_args: c_args,
987                  build_by_default: false,
988                  name_suffix: 'fa')
990   if target.endswith('-softmmu')
991     execs = [{
992       'name': 'qemu-system-' + target_name,
993       'gui': false,
994       'sources': files('softmmu/main.c'),
995       'dependencies': []
996     }]
997     if targetos == 'windows' and (sdl.found() or gtk.found())
998       execs += [{
999         'name': 'qemu-system-' + target_name + 'w',
1000         'gui': true,
1001         'sources': files('softmmu/main.c'),
1002         'dependencies': []
1003       }]
1004     endif
1005     if config_host.has_key('CONFIG_FUZZ')
1006       specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1007       execs += [{
1008         'name': 'qemu-fuzz-' + target_name,
1009         'gui': false,
1010         'sources': specific_fuzz.sources(),
1011         'dependencies': specific_fuzz.dependencies(),
1012         'link_depends': [files('tests/qtest/fuzz/fork_fuzz.ld')],
1013       }]
1014     endif
1015   else
1016     execs = [{
1017       'name': 'qemu-' + target_name,
1018       'gui': false,
1019       'sources': [],
1020       'dependencies': []
1021     }]
1022   endif
1023   foreach exe: execs
1024     emulators += executable(exe['name'], exe['sources'],
1025                install: true,
1026                c_args: c_args,
1027                dependencies: arch_deps + deps + exe['dependencies'],
1028                objects: lib.extract_all_objects(recursive: true),
1029                link_language: link_language,
1030                link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1031                link_args: link_args,
1032                gui_app: exe['gui'])
1034     if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1035       foreach stp: [
1036         {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1037         {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
1038         {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1039         {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1040       ]
1041         custom_target(exe['name'] + stp['ext'],
1042                       input: trace_events_all,
1043                       output: exe['name'] + stp['ext'],
1044                       capture: true,
1045                       install: stp['install'],
1046                       install_dir: config_host['qemu_datadir'] / '../systemtap/tapset',
1047                       command: [
1048                         tracetool, '--group=all', '--format=' + stp['fmt'],
1049                         '--binary=' + stp['bin'],
1050                         '--target-name=' + target_name,
1051                         '--target-type=' + target_type,
1052                         '--probe-prefix=qemu.' + target_type + '.' + target_name,
1053                         '@INPUT@',
1054                       ])
1055       endforeach
1056     endif
1057   endforeach
1058 endforeach
1060 # Other build targets
1062 if 'CONFIG_PLUGIN' in config_host
1063   install_headers('include/qemu/qemu-plugin.h')
1064 endif
1066 if 'CONFIG_GUEST_AGENT' in config_host
1067   subdir('qga')
1068 endif
1070 # Don't build qemu-keymap if xkbcommon is not explicitly enabled
1071 # when we don't build tools or system
1072 if get_option('xkbcommon').auto() and not have_system and not have_tools
1073   xkbcommon = not_found
1074 endif
1075 if xkbcommon.found()
1076   # used for the update-keymaps target, so include rules even if !have_tools
1077   qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1078                            dependencies: [qemuutil, xkbcommon], install: have_tools)
1079 endif
1081 qemu_block_tools = []
1082 if have_tools
1083   qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1084              dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1085   qemu_io = executable('qemu-io', files('qemu-io.c'),
1086              dependencies: [block, qemuutil], install: true)
1087   qemu_block_tools += [qemu_img, qemu_io]
1088   if targetos != 'windows'
1089     qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1090                dependencies: [block, qemuutil], install: true)
1091     qemu_block_tools += [qemu_nbd]
1092   endif
1094   subdir('storage-daemon')
1095   subdir('contrib/rdmacm-mux')
1096   subdir('contrib/elf2dmp')
1098   executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1099              dependencies: qemuutil,
1100              install: true)
1102   if 'CONFIG_VHOST_USER' in config_host
1103     subdir('contrib/libvhost-user')
1104     subdir('contrib/vhost-user-blk')
1105     if 'CONFIG_LINUX' in config_host
1106       subdir('contrib/vhost-user-gpu')
1107     endif
1108     subdir('contrib/vhost-user-input')
1109     subdir('contrib/vhost-user-scsi')
1110   endif
1112   if targetos == 'linux'
1113     executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1114                dependencies: [qemuutil, libcap_ng],
1115                install: true,
1116                install_dir: get_option('libexecdir'))
1118     executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1119                dependencies: [authz, crypto, io, qom, qemuutil,
1120                               libcap_ng, libudev, libmpathpersist],
1121                install: true)
1122   endif
1124   if 'CONFIG_IVSHMEM' in config_host
1125     subdir('contrib/ivshmem-client')
1126     subdir('contrib/ivshmem-server')
1127   endif
1128 endif
1130 subdir('tools')
1131 subdir('pc-bios')
1132 subdir('tests')
1133 subdir('docs')
1134 if 'CONFIG_GTK' in config_host
1135   subdir('po')
1136 endif
1138 if build_docs
1139   makeinfo = find_program('makeinfo', required: build_docs)
1141   docs_inc = [
1142     '-I', meson.current_source_dir(),
1143     '-I', meson.current_build_dir() / 'docs',
1144     '-I', '@OUTDIR@',
1145   ]
1147   version_texi = configure_file(output: 'version.texi',
1148                               input: 'version.texi.in',
1149                               configuration: {'VERSION': meson.project_version(),
1150                                               'qemu_confdir': config_host['qemu_confdir']})
1152   texi = {
1153     'qemu-qmp-ref': ['docs/interop/qemu-qmp-ref.texi', qapi_doc_texi, version_texi],
1154   }
1155   if 'CONFIG_GUEST_AGENT' in config_host
1156     texi += {'qemu-ga-ref': ['docs/interop/qemu-ga-ref.texi', qga_qapi_doc_texi, version_texi]}
1157   endif
1159   if makeinfo.found()
1160     cmd = [
1161       'env', 'LC_ALL=C', makeinfo, '--no-split', '--number-sections', docs_inc,
1162       '@INPUT0@', '-o', '@OUTPUT@',
1163     ]
1164     foreach ext, args: {
1165         'info': [],
1166         'html': ['--no-headers', '--html'],
1167         'txt': ['--no-headers', '--plaintext'],
1168     }
1169       t = []
1170       foreach doc, input: texi
1171         output = doc + '.' + ext
1172         t += custom_target(output,
1173                       input: input,
1174                       output: output,
1175                       install: true,
1176                       install_dir: config_host['qemu_docdir'] / 'interop',
1177                       command: cmd + args)
1178       endforeach
1179       alias_target(ext, t)
1180     endforeach
1181   endif
1183   texi2pdf = find_program('texi2pdf', required: false)
1185   if texi2pdf.found()
1186     pdfs = []
1187     foreach doc, input: texi
1188       output = doc + '.pdf'
1189       pdfs += custom_target(output,
1190                     input: input,
1191                     output: output,
1192                     command: [texi2pdf, '-q', docs_inc, '@INPUT0@', '-o', '@OUTPUT@'],
1193                     build_by_default: false)
1194     endforeach
1195     alias_target('pdf', pdfs)
1196   endif
1198   texi2pod = find_program('scripts/texi2pod.pl')
1199   pod2man = find_program('pod2man', required: build_docs)
1201   if pod2man.found()
1202     foreach doc, input: texi
1203       man = doc + '.7'
1204       pod = custom_target(man + '.pod',
1205                           input: input,
1206                           output: man + '.pod',
1207                           command: [texi2pod,
1208                                     '-DVERSION="' + meson.project_version() + '"',
1209                                     '-DCONFDIR="' + config_host['qemu_confdir'] + '"',
1210                                     '@INPUT0@', '@OUTPUT@'])
1211       man = custom_target(man,
1212                           input: pod,
1213                           output: man,
1214                           capture: true,
1215                           install: true,
1216                           install_dir: config_host['mandir'] / 'man7',
1217                           command: [pod2man, '--utf8', '--section=7', '--center=" "',
1218                                     '--release=" "', '@INPUT@'])
1219     endforeach
1220   endif
1221 endif
1223 summary_info = {}
1224 summary_info += {'Install prefix':    config_host['prefix']}
1225 summary_info += {'BIOS directory':    config_host['qemu_datadir']}
1226 summary_info += {'firmware path':     config_host['qemu_firmwarepath']}
1227 summary_info += {'binary directory':  config_host['bindir']}
1228 summary_info += {'library directory': config_host['libdir']}
1229 summary_info += {'module directory':  config_host['qemu_moddir']}
1230 summary_info += {'libexec directory': config_host['libexecdir']}
1231 summary_info += {'include directory': config_host['includedir']}
1232 summary_info += {'config directory':  config_host['sysconfdir']}
1233 if targetos != 'windows'
1234   summary_info += {'local state directory': config_host['qemu_localstatedir']}
1235   summary_info += {'Manual directory':      config_host['mandir']}
1236 else
1237   summary_info += {'local state directory': 'queried at runtime'}
1238 endif
1239 summary_info += {'Build directory':   meson.current_build_dir()}
1240 summary_info += {'Source path':       meson.current_source_dir()}
1241 summary_info += {'GIT binary':        config_host['GIT']}
1242 summary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
1243 summary_info += {'C compiler':        meson.get_compiler('c').cmd_array()[0]}
1244 summary_info += {'Host C compiler':   meson.get_compiler('c', native: true).cmd_array()[0]}
1245 if link_language == 'cpp'
1246   summary_info += {'C++ compiler':      meson.get_compiler('cpp').cmd_array()[0]}
1247 else
1248   summary_info += {'C++ compiler':      false}
1249 endif
1250 if targetos == 'darwin'
1251   summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1252 endif
1253 summary_info += {'ARFLAGS':           config_host['ARFLAGS']}
1254 summary_info += {'CFLAGS':            config_host['CFLAGS']}
1255 summary_info += {'QEMU_CFLAGS':       config_host['QEMU_CFLAGS']}
1256 summary_info += {'QEMU_LDFLAGS':      config_host['QEMU_LDFLAGS']}
1257 summary_info += {'make':              config_host['MAKE']}
1258 summary_info += {'install':           config_host['INSTALL']}
1259 summary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1260 summary_info += {'sphinx-build':      config_host['SPHINX_BUILD']}
1261 summary_info += {'genisoimage':       config_host['GENISOIMAGE']}
1262 # TODO: add back version
1263 summary_info += {'slirp support':     config_host.has_key('CONFIG_SLIRP')}
1264 if config_host.has_key('CONFIG_SLIRP')
1265   summary_info += {'smbd':            config_host['CONFIG_SMBD_COMMAND']}
1266 endif
1267 summary_info += {'module support':    config_host.has_key('CONFIG_MODULES')}
1268 if config_host.has_key('CONFIG_MODULES')
1269   summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1270 endif
1271 summary_info += {'host CPU':          cpu}
1272 summary_info += {'host endianness':   build_machine.endian()}
1273 summary_info += {'target list':       config_host['TARGET_DIRS']}
1274 summary_info += {'gprof enabled':     config_host.has_key('CONFIG_GPROF')}
1275 summary_info += {'sparse enabled':    meson.get_compiler('c').cmd_array().contains('cgcc')}
1276 summary_info += {'strip binaries':    get_option('strip')}
1277 summary_info += {'profiler':          config_host.has_key('CONFIG_PROFILER')}
1278 summary_info += {'static build':      config_host.has_key('CONFIG_TOOLS')}
1279 if targetos == 'darwin'
1280   summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1281 endif
1282 # TODO: add back version
1283 summary_info += {'SDL support':       sdl.found()}
1284 summary_info += {'SDL image support': sdl_image.found()}
1285 # TODO: add back version
1286 summary_info += {'GTK support':       config_host.has_key('CONFIG_GTK')}
1287 summary_info += {'GTK GL support':    config_host.has_key('CONFIG_GTK_GL')}
1288 # TODO: add back version
1289 summary_info += {'VTE support':       config_host.has_key('CONFIG_VTE')}
1290 summary_info += {'TLS priority':      config_host['CONFIG_TLS_PRIORITY']}
1291 summary_info += {'GNUTLS support':    config_host.has_key('CONFIG_GNUTLS')}
1292 # TODO: add back version
1293 summary_info += {'libgcrypt':         config_host.has_key('CONFIG_GCRYPT')}
1294 if config_host.has_key('CONFIG_GCRYPT')
1295    summary_info += {'  hmac':            config_host.has_key('CONFIG_GCRYPT_HMAC')}
1296    summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1297 endif
1298 # TODO: add back version
1299 summary_info += {'nettle':            config_host.has_key('CONFIG_NETTLE')}
1300 if config_host.has_key('CONFIG_NETTLE')
1301    summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1302 endif
1303 summary_info += {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
1304 summary_info += {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
1305 summary_info += {'iconv support':     config_host.has_key('CONFIG_ICONV')}
1306 summary_info += {'curses support':    config_host.has_key('CONFIG_CURSES')}
1307 # TODO: add back version
1308 summary_info += {'virgl support':     config_host.has_key('CONFIG_VIRGL')}
1309 summary_info += {'curl support':      config_host.has_key('CONFIG_CURL')}
1310 summary_info += {'mingw32 support':   targetos == 'windows'}
1311 summary_info += {'Audio drivers':     config_host['CONFIG_AUDIO_DRIVERS']}
1312 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1313 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1314 summary_info += {'VirtFS support':    config_host.has_key('CONFIG_VIRTFS')}
1315 summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
1316 summary_info += {'VNC support':       vnc.found()}
1317 if vnc.found()
1318   summary_info += {'VNC SASL support':  sasl.found()}
1319   summary_info += {'VNC JPEG support':  jpeg.found()}
1320   summary_info += {'VNC PNG support':   png.found()}
1321 endif
1322 summary_info += {'xen support':       config_host.has_key('CONFIG_XEN_BACKEND')}
1323 if config_host.has_key('CONFIG_XEN_BACKEND')
1324   summary_info += {'xen ctrl version':  config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1325 endif
1326 summary_info += {'brlapi support':    config_host.has_key('CONFIG_BRLAPI')}
1327 summary_info += {'Documentation':     config_host.has_key('BUILD_DOCS')}
1328 summary_info += {'PIE':               get_option('b_pie')}
1329 summary_info += {'vde support':       config_host.has_key('CONFIG_VDE')}
1330 summary_info += {'netmap support':    config_host.has_key('CONFIG_NETMAP')}
1331 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1332 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1333 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1334 summary_info += {'Install blobs':     config_host.has_key('INSTALL_BLOBS')}
1335 # TODO: add back KVM/HAX/HVF/WHPX/TCG
1336 #summary_info += {'KVM support':       have_kvm'}
1337 #summary_info += {'HAX support':       have_hax'}
1338 #summary_info += {'HVF support':       have_hvf'}
1339 #summary_info += {'WHPX support':      have_whpx'}
1340 #summary_info += {'TCG support':       have_tcg'}
1341 #if get_option('tcg')
1342 #  summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1343 #  summary_info += {'TCG interpreter':   config_host.has_key('CONFIG_TCG_INTERPRETER')}
1344 #endif
1345 summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1346 summary_info += {'RDMA support':      config_host.has_key('CONFIG_RDMA')}
1347 summary_info += {'PVRDMA support':    config_host.has_key('CONFIG_PVRDMA')}
1348 summary_info += {'fdt support':       config_host.has_key('CONFIG_FDT')}
1349 summary_info += {'membarrier':        config_host.has_key('CONFIG_MEMBARRIER')}
1350 summary_info += {'preadv support':    config_host.has_key('CONFIG_PREADV')}
1351 summary_info += {'fdatasync':         config_host.has_key('CONFIG_FDATASYNC')}
1352 summary_info += {'madvise':           config_host.has_key('CONFIG_MADVISE')}
1353 summary_info += {'posix_madvise':     config_host.has_key('CONFIG_POSIX_MADVISE')}
1354 summary_info += {'posix_memalign':    config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1355 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1356 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1357 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1358 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1359 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1360 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1361 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1362 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1363 summary_info += {'Trace backends':    config_host['TRACE_BACKENDS']}
1364 if config_host['TRACE_BACKENDS'].split().contains('simple')
1365   summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1366 endif
1367 # TODO: add back protocol and server version
1368 summary_info += {'spice support':     config_host.has_key('CONFIG_SPICE')}
1369 summary_info += {'rbd support':       config_host.has_key('CONFIG_RBD')}
1370 summary_info += {'xfsctl support':    config_host.has_key('CONFIG_XFS')}
1371 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1372 summary_info += {'libusb':            config_host.has_key('CONFIG_USB_LIBUSB')}
1373 summary_info += {'usb net redir':     config_host.has_key('CONFIG_USB_REDIR')}
1374 summary_info += {'OpenGL support':    config_host.has_key('CONFIG_OPENGL')}
1375 summary_info += {'OpenGL dmabufs':    config_host.has_key('CONFIG_OPENGL_DMABUF')}
1376 summary_info += {'libiscsi support':  config_host.has_key('CONFIG_LIBISCSI')}
1377 summary_info += {'libnfs support':    config_host.has_key('CONFIG_LIBNFS')}
1378 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1379 if targetos == 'windows'
1380   if 'WIN_SDK' in config_host
1381     summary_info += {'Windows SDK':       config_host['WIN_SDK']}
1382   endif
1383   summary_info += {'QGA VSS support':   config_host.has_key('CONFIG_QGA_VSS')}
1384   summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1385   summary_info += {'QGA MSI support':   config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1386 endif
1387 summary_info += {'seccomp support':   config_host.has_key('CONFIG_SECCOMP')}
1388 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1389 summary_info += {'coroutine pool':    config_host['CONFIG_COROUTINE_POOL'] == '1'}
1390 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1391 summary_info += {'mutex debugging':   config_host.has_key('CONFIG_DEBUG_MUTEX')}
1392 summary_info += {'crypto afalg':      config_host.has_key('CONFIG_AF_ALG')}
1393 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1394 summary_info += {'gcov':              get_option('b_coverage')}
1395 summary_info += {'TPM support':       config_host.has_key('CONFIG_TPM')}
1396 summary_info += {'libssh support':    config_host.has_key('CONFIG_LIBSSH')}
1397 summary_info += {'QOM debugging':     config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1398 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1399 summary_info += {'lzo support':       config_host.has_key('CONFIG_LZO')}
1400 summary_info += {'snappy support':    config_host.has_key('CONFIG_SNAPPY')}
1401 summary_info += {'bzip2 support':     config_host.has_key('CONFIG_BZIP2')}
1402 summary_info += {'lzfse support':     config_host.has_key('CONFIG_LZFSE')}
1403 summary_info += {'zstd support':      config_host.has_key('CONFIG_ZSTD')}
1404 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1405 summary_info += {'libxml2':           config_host.has_key('CONFIG_LIBXML2')}
1406 summary_info += {'tcmalloc support':  config_host.has_key('CONFIG_TCMALLOC')}
1407 summary_info += {'jemalloc support':  config_host.has_key('CONFIG_JEMALLOC')}
1408 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1409 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1410 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1411 summary_info += {'bochs support':     config_host.has_key('CONFIG_BOCHS')}
1412 summary_info += {'cloop support':     config_host.has_key('CONFIG_CLOOP')}
1413 summary_info += {'dmg support':       config_host.has_key('CONFIG_DMG')}
1414 summary_info += {'qcow v1 support':   config_host.has_key('CONFIG_QCOW1')}
1415 summary_info += {'vdi support':       config_host.has_key('CONFIG_VDI')}
1416 summary_info += {'vvfat support':     config_host.has_key('CONFIG_VVFAT')}
1417 summary_info += {'qed support':       config_host.has_key('CONFIG_QED')}
1418 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1419 summary_info += {'sheepdog support':  config_host.has_key('CONFIG_SHEEPDOG')}
1420 summary_info += {'capstone':          config_host.has_key('CONFIG_CAPSTONE')}
1421 summary_info += {'libpmem support':   config_host.has_key('CONFIG_LIBPMEM')}
1422 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1423 summary_info += {'libudev':           config_host.has_key('CONFIG_LIBUDEV')}
1424 summary_info += {'default devices':   config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1425 summary_info += {'plugin support':    config_host.has_key('CONFIG_PLUGIN')}
1426 summary_info += {'fuzzing support':   config_host.has_key('CONFIG_FUZZ')}
1427 if config_host.has_key('HAVE_GDB_BIN')
1428   summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
1429 endif
1430 summary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
1431 summary_info += {'rng-none':          config_host.has_key('CONFIG_RNG_NONE')}
1432 summary_info += {'Linux keyring':     config_host.has_key('CONFIG_SECRET_KEYRING')}
1433 summary(summary_info, bool_yn: true)
1435 if not supported_cpus.contains(cpu)
1436   message()
1437   warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1438   message()
1439   message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1440   message('The QEMU project intends to remove support for this host CPU in')
1441   message('a future release if nobody volunteers to maintain it and to')
1442   message('provide a build host for our continuous integration setup.')
1443   message('configure has succeeded and you can continue to build, but')
1444   message('if you care about QEMU on this platform you should contact')
1445   message('us upstream at qemu-devel@nongnu.org.')
1446 endif
1448 if not supported_oses.contains(targetos)
1449   message()
1450   warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1451   message()
1452   message('Host OS ' + targetos + 'support is not currently maintained.')
1453   message('The QEMU project intends to remove support for this host OS in')
1454   message('a future release if nobody volunteers to maintain it and to')
1455   message('provide a build host for our continuous integration setup.')
1456   message('configure has succeeded and you can continue to build, but')
1457   message('if you care about QEMU on this platform you should contact')
1458   message('us upstream at qemu-devel@nongnu.org.')
1459 endif