]> git.proxmox.com Git - mirror_qemu.git/blob - meson.build
meson: convert migration directory to Meson
[mirror_qemu.git] / meson.build
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())
4
5 not_found = dependency('', required: false)
6 keyval = import('unstable-keyval')
7 ss = import('sourceset')
8
9 sh = find_program('sh')
10 cc = meson.get_compiler('c')
11 config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
12 config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
13 enable_modules = 'CONFIG_MODULES' in config_host
14
15 add_project_arguments(config_host['QEMU_CFLAGS'].split(),
16 native: false, language: ['c', 'objc'])
17 add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
18 native: false, language: 'cpp')
19 add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
20 native: false, language: ['c', 'cpp', 'objc'])
21 add_project_arguments(config_host['QEMU_INCLUDES'].split(),
22 language: ['c', 'cpp', 'objc'])
23
24 python = import('python').find_installation()
25
26 link_language = meson.get_external_property('link_language', 'cpp')
27 if link_language == 'cpp'
28 add_languages('cpp', required: true, native: false)
29 endif
30 if host_machine.system() == 'darwin'
31 add_languages('objc', required: false, native: false)
32 endif
33
34 if 'SPARSE_CFLAGS' in config_host
35 run_target('sparse',
36 command: [find_program('scripts/check_sparse.py'),
37 config_host['SPARSE_CFLAGS'].split(),
38 'compile_commands.json'])
39 endif
40
41 configure_file(input: files('scripts/ninjatool.py'),
42 output: 'ninjatool',
43 configuration: config_host)
44
45 supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
46 supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
47 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
48
49 cpu = host_machine.cpu_family()
50 targetos = host_machine.system()
51
52 m = cc.find_library('m', required: false)
53 util = cc.find_library('util', required: false)
54 winmm = []
55 socket = []
56 version_res = []
57 coref = []
58 iokit = []
59 cocoa = []
60 hvf = []
61 if targetos == 'windows'
62 socket = cc.find_library('ws2_32')
63 winmm = cc.find_library('winmm')
64
65 win = import('windows')
66 version_res = win.compile_resources('version.rc',
67 depend_files: files('pc-bios/qemu-nsis.ico'),
68 include_directories: include_directories('.'))
69 elif targetos == 'darwin'
70 coref = dependency('appleframeworks', modules: 'CoreFoundation')
71 iokit = dependency('appleframeworks', modules: 'IOKit')
72 cocoa = dependency('appleframeworks', modules: 'Cocoa')
73 hvf = dependency('appleframeworks', modules: 'Hypervisor')
74 elif targetos == 'sunos'
75 socket = [cc.find_library('socket'),
76 cc.find_library('nsl'),
77 cc.find_library('resolv')]
78 elif targetos == 'haiku'
79 socket = [cc.find_library('posix_error_mapper'),
80 cc.find_library('network'),
81 cc.find_library('bsd')]
82 endif
83 glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
84 link_args: config_host['GLIB_LIBS'].split())
85 gio = not_found
86 if 'CONFIG_GIO' in config_host
87 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
88 link_args: config_host['GIO_LIBS'].split())
89 endif
90 lttng = not_found
91 if 'CONFIG_TRACE_UST' in config_host
92 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
93 endif
94 urcubp = not_found
95 if 'CONFIG_TRACE_UST' in config_host
96 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
97 endif
98 nettle = not_found
99 if 'CONFIG_NETTLE' in config_host
100 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
101 link_args: config_host['NETTLE_LIBS'].split())
102 endif
103 gnutls = not_found
104 if 'CONFIG_GNUTLS' in config_host
105 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
106 link_args: config_host['GNUTLS_LIBS'].split())
107 endif
108 pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
109 link_args: config_host['PIXMAN_LIBS'].split())
110 pam = not_found
111 if 'CONFIG_AUTH_PAM' in config_host
112 pam = cc.find_library('pam')
113 endif
114 libaio = cc.find_library('aio', required: false)
115 zlib = not_found
116 if 'CONFIG_ZLIB' in config_host
117 zlib = declare_dependency(compile_args: config_host['ZLIB_CFLAGS'].split(),
118 link_args: config_host['ZLIB_LIBS'].split())
119 endif
120 linux_io_uring = not_found
121 if 'CONFIG_LINUX_IO_URING' in config_host
122 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
123 link_args: config_host['LINUX_IO_URING_LIBS'].split())
124 endif
125 libxml2 = not_found
126 if 'CONFIG_LIBXML2' in config_host
127 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
128 link_args: config_host['LIBXML2_LIBS'].split())
129 endif
130 libnfs = not_found
131 if 'CONFIG_LIBNFS' in config_host
132 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
133 endif
134 libattr = not_found
135 if 'CONFIG_ATTR' in config_host
136 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
137 endif
138 seccomp = not_found
139 if 'CONFIG_SECCOMP' in config_host
140 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
141 link_args: config_host['SECCOMP_LIBS'].split())
142 endif
143 libcap_ng = not_found
144 if 'CONFIG_LIBCAP_NG' in config_host
145 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
146 endif
147 xkbcommon = not_found
148 if 'CONFIG_XKBCOMMON' in config_host
149 xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(),
150 link_args: config_host['XKBCOMMON_LIBS'].split())
151 endif
152 pulse = not_found
153 if 'CONFIG_LIBPULSE' in config_host
154 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
155 link_args: config_host['PULSE_LIBS'].split())
156 endif
157 alsa = not_found
158 if 'CONFIG_ALSA' in config_host
159 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
160 link_args: config_host['ALSA_LIBS'].split())
161 endif
162 jack = not_found
163 if 'CONFIG_LIBJACK' in config_host
164 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
165 endif
166 spice = not_found
167 if 'CONFIG_SPICE' in config_host
168 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
169 link_args: config_host['SPICE_LIBS'].split())
170 endif
171 rt = cc.find_library('rt', required: false)
172 libmpathpersist = not_found
173 if config_host.has_key('CONFIG_MPATH')
174 libmpathpersist = cc.find_library('mpathpersist')
175 endif
176 libiscsi = not_found
177 if 'CONFIG_LIBISCSI' in config_host
178 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
179 link_args: config_host['LIBISCSI_LIBS'].split())
180 endif
181 zstd = not_found
182 if 'CONFIG_ZSTD' in config_host
183 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
184 link_args: config_host['ZSTD_LIBS'].split())
185 endif
186 gbm = not_found
187 if 'CONFIG_GBM' in config_host
188 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
189 link_args: config_host['GBM_LIBS'].split())
190 endif
191 virgl = not_found
192 if 'CONFIG_VIRGL' in config_host
193 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
194 link_args: config_host['VIRGL_LIBS'].split())
195 endif
196 curl = not_found
197 if 'CONFIG_CURL' in config_host
198 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
199 link_args: config_host['CURL_LIBS'].split())
200 endif
201 libudev = not_found
202 if 'CONFIG_LIBUDEV' in config_host
203 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
204 endif
205 brlapi = not_found
206 if 'CONFIG_BRLAPI' in config_host
207 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
208 endif
209 sdl = not_found
210 if 'CONFIG_SDL' in config_host
211 sdl = declare_dependency(compile_args: config_host['SDL_CFLAGS'].split(),
212 link_args: config_host['SDL_LIBS'].split())
213 endif
214 rbd = not_found
215 if 'CONFIG_RBD' in config_host
216 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
217 endif
218 glusterfs = not_found
219 if 'CONFIG_GLUSTERFS' in config_host
220 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
221 link_args: config_host['GLUSTERFS_LIBS'].split())
222 endif
223 libssh = not_found
224 if 'CONFIG_LIBSSH' in config_host
225 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
226 link_args: config_host['LIBSSH_LIBS'].split())
227 endif
228 libbzip2 = not_found
229 if 'CONFIG_BZIP2' in config_host
230 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
231 endif
232 liblzfse = not_found
233 if 'CONFIG_LZFSE' in config_host
234 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
235 endif
236 oss = not_found
237 if 'CONFIG_AUDIO_OSS' in config_host
238 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
239 endif
240 dsound = not_found
241 if 'CONFIG_AUDIO_DSOUND' in config_host
242 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
243 endif
244 coreaudio = not_found
245 if 'CONFIG_AUDIO_COREAUDIO' in config_host
246 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
247 endif
248 opengl = not_found
249 if 'CONFIG_OPENGL' in config_host
250 opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
251 else
252 endif
253 gtk = not_found
254 if 'CONFIG_GTK' in config_host
255 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
256 link_args: config_host['GTK_LIBS'].split())
257 endif
258 vte = not_found
259 if 'CONFIG_VTE' in config_host
260 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
261 link_args: config_host['VTE_LIBS'].split())
262 endif
263 x11 = not_found
264 if 'CONFIG_X11' in config_host
265 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
266 link_args: config_host['X11_LIBS'].split())
267 endif
268 curses = not_found
269 if 'CONFIG_CURSES' in config_host
270 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
271 link_args: config_host['CURSES_LIBS'].split())
272 endif
273 iconv = not_found
274 if 'CONFIG_ICONV' in config_host
275 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
276 link_args: config_host['ICONV_LIBS'].split())
277 endif
278 gio = not_found
279 if 'CONFIG_GIO' in config_host
280 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
281 link_args: config_host['GIO_LIBS'].split())
282 endif
283 png = not_found
284 if 'CONFIG_VNC_PNG' in config_host
285 png = declare_dependency(compile_args: config_host['PNG_CFLAGS'].split(),
286 link_args: config_host['PNG_LIBS'].split())
287 endif
288 jpeg = not_found
289 if 'CONFIG_VNC_JPEG' in config_host
290 jpeg = declare_dependency(compile_args: config_host['JPEG_CFLAGS'].split(),
291 link_args: config_host['JPEG_LIBS'].split())
292 endif
293 sasl = not_found
294 if 'CONFIG_VNC_SASL' in config_host
295 sasl = declare_dependency(compile_args: config_host['SASL_CFLAGS'].split(),
296 link_args: config_host['SASL_LIBS'].split())
297 endif
298 fdt = not_found
299 if 'CONFIG_FDT' in config_host
300 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
301 link_args: config_host['FDT_LIBS'].split())
302 endif
303 snappy = not_found
304 if 'CONFIG_SNAPPY' in config_host
305 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
306 endif
307 lzo = not_found
308 if 'CONFIG_LZO' in config_host
309 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
310 endif
311 rdma = not_found
312 if 'CONFIG_RDMA' in config_host
313 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
314 endif
315
316 create_config = find_program('scripts/create_config')
317 minikconf = find_program('scripts/minikconf.py')
318 target_dirs = config_host['TARGET_DIRS'].split()
319 have_user = false
320 have_system = false
321 config_devices_mak_list = []
322 config_devices_h = {}
323 config_target_mak = {}
324 kconfig_external_symbols = [
325 'CONFIG_KVM',
326 'CONFIG_XEN',
327 'CONFIG_TPM',
328 'CONFIG_SPICE',
329 'CONFIG_IVSHMEM',
330 'CONFIG_OPENGL',
331 'CONFIG_X11',
332 'CONFIG_VHOST_USER',
333 'CONFIG_VHOST_KERNEL',
334 'CONFIG_VIRTFS',
335 'CONFIG_LINUX',
336 'CONFIG_PVRDMA',
337 ]
338 foreach target : target_dirs
339 have_user = have_user or target.endswith('-user')
340 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
341
342 if target.endswith('-softmmu')
343 have_system = true
344
345 base_kconfig = []
346 foreach sym : kconfig_external_symbols
347 if sym in config_target
348 base_kconfig += '@0@=y'.format(sym)
349 endif
350 endforeach
351
352 config_devices_mak = target + '-config-devices.mak'
353 config_devices_mak = configure_file(
354 input: ['default-configs' / target + '.mak', 'Kconfig'],
355 output: config_devices_mak,
356 depfile: config_devices_mak + '.d',
357 capture: true,
358 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
359 config_devices_mak, '@DEPFILE@', '@INPUT@',
360 base_kconfig])
361 config_devices_h += {target: custom_target(
362 target + '-config-devices.h',
363 input: config_devices_mak,
364 output: target + '-config-devices.h',
365 capture: true,
366 command: [create_config, '@INPUT@'])}
367 config_devices_mak_list += config_devices_mak
368 config_target += keyval.load(config_devices_mak)
369 endif
370 config_target_mak += {target: config_target}
371 endforeach
372 have_tools = 'CONFIG_TOOLS' in config_host
373 have_block = have_system or have_tools
374
375 grepy = find_program('scripts/grepy.sh')
376 # This configuration is used to build files that are shared by
377 # multiple binaries, and then extracted out of the "common"
378 # static_library target.
379 #
380 # We do not use all_sources()/all_dependencies(), because it would
381 # build literally all source files, including devices only used by
382 # targets that are not built for this compilation. The CONFIG_ALL
383 # pseudo symbol replaces it.
384
385 if have_system
386 config_all_devices_mak = configure_file(
387 output: 'config-all-devices.mak',
388 input: config_devices_mak_list,
389 capture: true,
390 command: [grepy, '@INPUT@'],
391 )
392 config_all_devices = keyval.load(config_all_devices_mak)
393 else
394 config_all_devices = {}
395 endif
396 config_all = config_all_devices
397 config_all += config_host
398 config_all += config_all_disas
399 config_all += {
400 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
401 'CONFIG_SOFTMMU': have_system,
402 'CONFIG_USER_ONLY': have_user,
403 'CONFIG_ALL': true,
404 }
405
406 # Generators
407
408 genh = []
409 hxtool = find_program('scripts/hxtool')
410 shaderinclude = find_program('scripts/shaderinclude.pl')
411 qapi_gen = find_program('scripts/qapi-gen.py')
412 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
413 meson.source_root() / 'scripts/qapi/commands.py',
414 meson.source_root() / 'scripts/qapi/common.py',
415 meson.source_root() / 'scripts/qapi/doc.py',
416 meson.source_root() / 'scripts/qapi/error.py',
417 meson.source_root() / 'scripts/qapi/events.py',
418 meson.source_root() / 'scripts/qapi/expr.py',
419 meson.source_root() / 'scripts/qapi/gen.py',
420 meson.source_root() / 'scripts/qapi/introspect.py',
421 meson.source_root() / 'scripts/qapi/parser.py',
422 meson.source_root() / 'scripts/qapi/schema.py',
423 meson.source_root() / 'scripts/qapi/source.py',
424 meson.source_root() / 'scripts/qapi/types.py',
425 meson.source_root() / 'scripts/qapi/visit.py',
426 meson.source_root() / 'scripts/qapi/common.py',
427 meson.source_root() / 'scripts/qapi/doc.py',
428 meson.source_root() / 'scripts/qapi-gen.py'
429 ]
430
431 tracetool = [
432 python, files('scripts/tracetool.py'),
433 '--backend=' + config_host['TRACE_BACKENDS']
434 ]
435
436 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
437 meson.current_source_dir(),
438 config_host['PKGVERSION'], config_host['VERSION']]
439 qemu_version = custom_target('qemu-version.h',
440 output: 'qemu-version.h',
441 command: qemu_version_cmd,
442 capture: true,
443 build_by_default: true,
444 build_always_stale: true)
445 genh += qemu_version
446
447 config_host_h = custom_target('config-host.h',
448 input: meson.current_build_dir() / 'config-host.mak',
449 output: 'config-host.h',
450 capture: true,
451 command: [create_config, '@INPUT@'])
452 genh += config_host_h
453
454 hxdep = []
455 hx_headers = [
456 ['qemu-options.hx', 'qemu-options.def'],
457 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
458 ]
459 if have_system
460 hx_headers += [
461 ['hmp-commands.hx', 'hmp-commands.h'],
462 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
463 ]
464 endif
465 foreach d : hx_headers
466 hxdep += custom_target(d[1],
467 input: files(d[0]),
468 output: d[1],
469 capture: true,
470 build_by_default: true, # to be removed when added to a target
471 command: [hxtool, '-h', '@INPUT0@'])
472 endforeach
473 genh += hxdep
474
475 # Collect sourcesets.
476
477 util_ss = ss.source_set()
478 stub_ss = ss.source_set()
479 trace_ss = ss.source_set()
480 block_ss = ss.source_set()
481 blockdev_ss = ss.source_set()
482 qmp_ss = ss.source_set()
483 common_ss = ss.source_set()
484 softmmu_ss = ss.source_set()
485 user_ss = ss.source_set()
486 bsd_user_ss = ss.source_set()
487 linux_user_ss = ss.source_set()
488 specific_ss = ss.source_set()
489
490 modules = {}
491 hw_arch = {}
492 target_arch = {}
493 target_softmmu_arch = {}
494
495 ###############
496 # Trace files #
497 ###############
498
499 trace_events_subdirs = [
500 'accel/kvm',
501 'accel/tcg',
502 'crypto',
503 'monitor',
504 ]
505 if have_user
506 trace_events_subdirs += [ 'linux-user' ]
507 endif
508 if have_block
509 trace_events_subdirs += [
510 'authz',
511 'block',
512 'io',
513 'nbd',
514 'scsi',
515 ]
516 endif
517 if have_system
518 trace_events_subdirs += [
519 'audio',
520 'backends',
521 'backends/tpm',
522 'chardev',
523 'hw/9pfs',
524 'hw/acpi',
525 'hw/alpha',
526 'hw/arm',
527 'hw/audio',
528 'hw/block',
529 'hw/block/dataplane',
530 'hw/char',
531 'hw/display',
532 'hw/dma',
533 'hw/hppa',
534 'hw/hyperv',
535 'hw/i2c',
536 'hw/i386',
537 'hw/i386/xen',
538 'hw/ide',
539 'hw/input',
540 'hw/intc',
541 'hw/isa',
542 'hw/mem',
543 'hw/mips',
544 'hw/misc',
545 'hw/misc/macio',
546 'hw/net',
547 'hw/nvram',
548 'hw/pci',
549 'hw/pci-host',
550 'hw/ppc',
551 'hw/rdma',
552 'hw/rdma/vmw',
553 'hw/rtc',
554 'hw/s390x',
555 'hw/scsi',
556 'hw/sd',
557 'hw/sparc',
558 'hw/sparc64',
559 'hw/ssi',
560 'hw/timer',
561 'hw/tpm',
562 'hw/usb',
563 'hw/vfio',
564 'hw/virtio',
565 'hw/watchdog',
566 'hw/xen',
567 'hw/gpio',
568 'hw/riscv',
569 'migration',
570 'net',
571 'ui',
572 ]
573 endif
574 trace_events_subdirs += [
575 'hw/core',
576 'qapi',
577 'qom',
578 'target/arm',
579 'target/hppa',
580 'target/i386',
581 'target/mips',
582 'target/ppc',
583 'target/riscv',
584 'target/s390x',
585 'target/sparc',
586 'util',
587 ]
588
589 subdir('qapi')
590 subdir('qobject')
591 subdir('stubs')
592 subdir('trace')
593 subdir('util')
594 subdir('qom')
595 subdir('authz')
596 subdir('crypto')
597 subdir('ui')
598
599
600 if enable_modules
601 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
602 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
603 endif
604
605 # Build targets from sourcesets
606
607 stub_ss = stub_ss.apply(config_all, strict: false)
608
609 util_ss.add_all(trace_ss)
610 util_ss = util_ss.apply(config_all, strict: false)
611 libqemuutil = static_library('qemuutil',
612 sources: util_ss.sources() + stub_ss.sources() + genh,
613 dependencies: [util_ss.dependencies(), m, glib, socket])
614 qemuutil = declare_dependency(link_with: libqemuutil,
615 sources: genh + version_res)
616
617 subdir('audio')
618 subdir('io')
619 subdir('chardev')
620 subdir('fsdev')
621 subdir('target')
622 subdir('dump')
623
624 block_ss.add(files(
625 'block.c',
626 'blockjob.c',
627 'job.c',
628 'qemu-io-cmds.c',
629 ))
630 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
631
632 subdir('nbd')
633 subdir('scsi')
634 subdir('block')
635
636 blockdev_ss.add(files(
637 'blockdev.c',
638 'blockdev-nbd.c',
639 'iothread.c',
640 'job-qmp.c',
641 ))
642
643 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
644 # os-win32.c does not
645 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
646 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
647
648 softmmu_ss.add_all(blockdev_ss)
649 softmmu_ss.add(files(
650 'bootdevice.c',
651 'dma-helpers.c',
652 'qdev-monitor.c',
653 ), sdl)
654
655 softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
656 softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
657 softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
658
659 common_ss.add(files('cpus-common.c'))
660
661 subdir('softmmu')
662 subdir('migration')
663 subdir('monitor')
664 subdir('replay')
665
666 # needed for fuzzing binaries
667 subdir('tests/qtest/libqos')
668
669 block_mods = []
670 softmmu_mods = []
671 foreach d, list : modules
672 foreach m, module_ss : list
673 if enable_modules and targetos != 'windows'
674 module_ss = module_ss.apply(config_host, strict: false)
675 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
676 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
677 if d == 'block'
678 block_mods += sl
679 else
680 softmmu_mods += sl
681 endif
682 else
683 if d == 'block'
684 block_ss.add_all(module_ss)
685 else
686 softmmu_ss.add_all(module_ss)
687 endif
688 endif
689 endforeach
690 endforeach
691
692 nm = find_program('nm')
693 undefsym = find_program('scripts/undefsym.sh')
694 block_syms = custom_target('block.syms', output: 'block.syms',
695 input: [libqemuutil, block_mods],
696 capture: true,
697 command: [undefsym, nm, '@INPUT@'])
698 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
699 input: [libqemuutil, softmmu_mods],
700 capture: true,
701 command: [undefsym, nm, '@INPUT@'])
702
703 block_ss = block_ss.apply(config_host, strict: false)
704 libblock = static_library('block', block_ss.sources() + genh,
705 dependencies: block_ss.dependencies(),
706 link_depends: block_syms,
707 name_suffix: 'fa',
708 build_by_default: false)
709
710 block = declare_dependency(link_whole: [libblock],
711 link_args: '@block.syms',
712 dependencies: [crypto, io])
713
714 qmp_ss = qmp_ss.apply(config_host, strict: false)
715 libqmp = static_library('qmp', qmp_ss.sources() + genh,
716 dependencies: qmp_ss.dependencies(),
717 name_suffix: 'fa',
718 build_by_default: false)
719
720 qmp = declare_dependency(link_whole: [libqmp])
721
722 foreach m : block_mods + softmmu_mods
723 shared_module(m.name(),
724 name_prefix: '',
725 link_whole: m,
726 install: true,
727 install_dir: config_host['qemu_moddir'])
728 endforeach
729
730 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
731 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
732
733 common_all = common_ss.apply(config_all, strict: false)
734 common_all = static_library('common',
735 build_by_default: false,
736 sources: common_all.sources() + genh,
737 dependencies: common_all.dependencies(),
738 name_suffix: 'fa')
739
740 foreach target : target_dirs
741 config_target = config_target_mak[target]
742 target_name = config_target['TARGET_NAME']
743 arch = config_target['TARGET_BASE_ARCH']
744 arch_srcs = []
745
746 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
747 if targetos == 'linux'
748 target_inc += include_directories('linux-headers', is_system: true)
749 endif
750 if target.endswith('-softmmu')
751 qemu_target_name = 'qemu-system-' + target_name
752 target_type='system'
753 arch_srcs += config_devices_h[target]
754 else
755 target_type='user'
756 qemu_target_name = 'qemu-' + target_name
757 if 'CONFIG_LINUX_USER' in config_target
758 base_dir = 'linux-user'
759 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
760 else
761 base_dir = 'bsd-user'
762 endif
763 target_inc += include_directories(
764 base_dir,
765 base_dir / config_target['TARGET_ABI_DIR'],
766 )
767 endif
768
769 target_common = common_ss.apply(config_target, strict: false)
770 objects = common_all.extract_objects(target_common.sources())
771
772 # TODO: Change to generator once obj-y goes away
773 config_target_h = custom_target(target + '-config-target.h',
774 input: meson.current_build_dir() / target / 'config-target.mak',
775 output: target + '-config-target.h',
776 capture: true,
777 command: [create_config, '@INPUT@'])
778
779 target_specific = specific_ss.apply(config_target, strict: false)
780 arch_srcs += target_specific.sources()
781
782 static_library('qemu-' + target,
783 sources: arch_srcs + [config_target_h] + genh,
784 objects: objects,
785 include_directories: target_inc,
786 c_args: ['-DNEED_CPU_H',
787 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
788 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
789 name_suffix: 'fa')
790 endforeach
791
792 # Other build targets
793
794 if 'CONFIG_GUEST_AGENT' in config_host
795 subdir('qga')
796 endif
797
798 if have_tools
799 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
800 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
801 qemu_io = executable('qemu-io', files('qemu-io.c'),
802 dependencies: [block, qemuutil], install: true)
803 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
804 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
805 dependencies: [block, qemuutil], install: true)
806 endif
807
808 subdir('storage-daemon')
809 subdir('contrib/rdmacm-mux')
810 subdir('contrib/elf2dmp')
811
812 if 'CONFIG_XKBCOMMON' in config_host
813 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
814 dependencies: [qemuutil, xkbcommon], install: true)
815 endif
816
817 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
818 dependencies: qemuutil,
819 install: true)
820
821 if 'CONFIG_VHOST_USER' in config_host
822 subdir('contrib/libvhost-user')
823 subdir('contrib/vhost-user-blk')
824 if 'CONFIG_LINUX' in config_host
825 subdir('contrib/vhost-user-gpu')
826 endif
827 subdir('contrib/vhost-user-input')
828 subdir('contrib/vhost-user-scsi')
829 endif
830
831 if targetos == 'linux'
832 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
833 dependencies: [qemuutil, libcap_ng],
834 install: true,
835 install_dir: get_option('libexecdir'))
836
837 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
838 dependencies: [authz, crypto, io, qom, qemuutil,
839 libcap_ng, libudev, libmpathpersist],
840 install: true)
841 endif
842
843 if 'CONFIG_IVSHMEM' in config_host
844 subdir('contrib/ivshmem-client')
845 subdir('contrib/ivshmem-server')
846 endif
847 endif
848
849 subdir('tools')
850 subdir('pc-bios')
851 subdir('tests')
852
853 summary_info = {}
854 summary_info += {'Install prefix': config_host['prefix']}
855 summary_info += {'BIOS directory': config_host['qemu_datadir']}
856 summary_info += {'firmware path': config_host['qemu_firmwarepath']}
857 summary_info += {'binary directory': config_host['bindir']}
858 summary_info += {'library directory': config_host['libdir']}
859 summary_info += {'module directory': config_host['qemu_moddir']}
860 summary_info += {'libexec directory': config_host['libexecdir']}
861 summary_info += {'include directory': config_host['includedir']}
862 summary_info += {'config directory': config_host['sysconfdir']}
863 if targetos != 'windows'
864 summary_info += {'local state directory': config_host['qemu_localstatedir']}
865 summary_info += {'Manual directory': config_host['mandir']}
866 else
867 summary_info += {'local state directory': 'queried at runtime'}
868 endif
869 summary_info += {'Build directory': meson.current_build_dir()}
870 summary_info += {'Source path': meson.current_source_dir()}
871 summary_info += {'GIT binary': config_host['GIT']}
872 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
873 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
874 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
875 if link_language == 'cpp'
876 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
877 else
878 summary_info += {'C++ compiler': false}
879 endif
880 if targetos == 'darwin'
881 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
882 endif
883 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
884 summary_info += {'CFLAGS': config_host['CFLAGS']}
885 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
886 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
887 summary_info += {'make': config_host['MAKE']}
888 summary_info += {'install': config_host['INSTALL']}
889 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
890 summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
891 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
892 # TODO: add back version
893 summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
894 if config_host.has_key('CONFIG_SLIRP')
895 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
896 endif
897 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
898 if config_host.has_key('CONFIG_MODULES')
899 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
900 endif
901 summary_info += {'host CPU': cpu}
902 summary_info += {'host endianness': build_machine.endian()}
903 summary_info += {'target list': config_host['TARGET_DIRS']}
904 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
905 summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
906 summary_info += {'strip binaries': get_option('strip')}
907 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
908 summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
909 if targetos == 'darwin'
910 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
911 endif
912 # TODO: add back version
913 summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
914 summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
915 # TODO: add back version
916 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
917 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
918 # TODO: add back version
919 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
920 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
921 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
922 # TODO: add back version
923 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
924 if config_host.has_key('CONFIG_GCRYPT')
925 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
926 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
927 endif
928 # TODO: add back version
929 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
930 if config_host.has_key('CONFIG_NETTLE')
931 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
932 endif
933 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
934 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
935 summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
936 summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
937 # TODO: add back version
938 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
939 summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
940 summary_info += {'mingw32 support': targetos == 'windows'}
941 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
942 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
943 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
944 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
945 summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
946 summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
947 if config_host.has_key('CONFIG_VNC')
948 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
949 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
950 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
951 endif
952 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
953 if config_host.has_key('CONFIG_XEN_BACKEND')
954 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
955 endif
956 summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
957 summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
958 summary_info += {'PIE': get_option('b_pie')}
959 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
960 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
961 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
962 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
963 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
964 summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
965 # TODO: add back KVM/HAX/HVF/WHPX/TCG
966 #summary_info += {'KVM support': have_kvm'}
967 #summary_info += {'HAX support': have_hax'}
968 #summary_info += {'HVF support': have_hvf'}
969 #summary_info += {'WHPX support': have_whpx'}
970 #summary_info += {'TCG support': have_tcg'}
971 #if get_option('tcg')
972 # summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
973 # summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
974 #endif
975 summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
976 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
977 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
978 summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
979 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
980 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
981 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
982 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
983 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
984 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
985 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
986 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
987 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
988 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
989 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
990 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
991 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
992 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
993 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
994 if config_host['TRACE_BACKENDS'].split().contains('simple')
995 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
996 endif
997 # TODO: add back protocol and server version
998 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
999 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1000 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1001 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1002 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1003 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1004 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1005 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1006 summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1007 summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1008 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1009 if targetos == 'windows'
1010 if 'WIN_SDK' in config_host
1011 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1012 endif
1013 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1014 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1015 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1016 endif
1017 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1018 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1019 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1020 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1021 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1022 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1023 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1024 summary_info += {'gcov': get_option('b_coverage')}
1025 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1026 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1027 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1028 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1029 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1030 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1031 summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1032 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1033 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1034 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1035 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1036 summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1037 summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1038 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1039 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1040 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1041 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1042 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1043 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1044 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1045 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1046 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1047 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1048 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1049 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1050 summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1051 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1052 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1053 summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1054 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1055 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1056 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1057 if config_host.has_key('HAVE_GDB_BIN')
1058 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1059 endif
1060 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1061 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1062 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1063 summary(summary_info, bool_yn: true)
1064
1065 if not supported_cpus.contains(cpu)
1066 message()
1067 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1068 message()
1069 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1070 message('The QEMU project intends to remove support for this host CPU in')
1071 message('a future release if nobody volunteers to maintain it and to')
1072 message('provide a build host for our continuous integration setup.')
1073 message('configure has succeeded and you can continue to build, but')
1074 message('if you care about QEMU on this platform you should contact')
1075 message('us upstream at qemu-devel@nongnu.org.')
1076 endif
1077
1078 if not supported_oses.contains(targetos)
1079 message()
1080 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1081 message()
1082 message('Host OS ' + targetos + 'support is not currently maintained.')
1083 message('The QEMU project intends to remove support for this host OS in')
1084 message('a future release if nobody volunteers to maintain it and to')
1085 message('provide a build host for our continuous integration setup.')
1086 message('configure has succeeded and you can continue to build, but')
1087 message('if you care about QEMU on this platform you should contact')
1088 message('us upstream at qemu-devel@nongnu.org.')
1089 endif