]> git.proxmox.com Git - mirror_qemu.git/blob - meson.build
meson: convert replay 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
312 create_config = find_program('scripts/create_config')
313 minikconf = find_program('scripts/minikconf.py')
314 target_dirs = config_host['TARGET_DIRS'].split()
315 have_user = false
316 have_system = false
317 config_devices_mak_list = []
318 config_devices_h = {}
319 config_target_mak = {}
320 kconfig_external_symbols = [
321 'CONFIG_KVM',
322 'CONFIG_XEN',
323 'CONFIG_TPM',
324 'CONFIG_SPICE',
325 'CONFIG_IVSHMEM',
326 'CONFIG_OPENGL',
327 'CONFIG_X11',
328 'CONFIG_VHOST_USER',
329 'CONFIG_VHOST_KERNEL',
330 'CONFIG_VIRTFS',
331 'CONFIG_LINUX',
332 'CONFIG_PVRDMA',
333 ]
334 foreach target : target_dirs
335 have_user = have_user or target.endswith('-user')
336 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
337
338 if target.endswith('-softmmu')
339 have_system = true
340
341 base_kconfig = []
342 foreach sym : kconfig_external_symbols
343 if sym in config_target
344 base_kconfig += '@0@=y'.format(sym)
345 endif
346 endforeach
347
348 config_devices_mak = target + '-config-devices.mak'
349 config_devices_mak = configure_file(
350 input: ['default-configs' / target + '.mak', 'Kconfig'],
351 output: config_devices_mak,
352 depfile: config_devices_mak + '.d',
353 capture: true,
354 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
355 config_devices_mak, '@DEPFILE@', '@INPUT@',
356 base_kconfig])
357 config_devices_h += {target: custom_target(
358 target + '-config-devices.h',
359 input: config_devices_mak,
360 output: target + '-config-devices.h',
361 capture: true,
362 command: [create_config, '@INPUT@'])}
363 config_devices_mak_list += config_devices_mak
364 config_target += keyval.load(config_devices_mak)
365 endif
366 config_target_mak += {target: config_target}
367 endforeach
368 have_tools = 'CONFIG_TOOLS' in config_host
369 have_block = have_system or have_tools
370
371 grepy = find_program('scripts/grepy.sh')
372 # This configuration is used to build files that are shared by
373 # multiple binaries, and then extracted out of the "common"
374 # static_library target.
375 #
376 # We do not use all_sources()/all_dependencies(), because it would
377 # build literally all source files, including devices only used by
378 # targets that are not built for this compilation. The CONFIG_ALL
379 # pseudo symbol replaces it.
380
381 if have_system
382 config_all_devices_mak = configure_file(
383 output: 'config-all-devices.mak',
384 input: config_devices_mak_list,
385 capture: true,
386 command: [grepy, '@INPUT@'],
387 )
388 config_all_devices = keyval.load(config_all_devices_mak)
389 else
390 config_all_devices = {}
391 endif
392 config_all = config_all_devices
393 config_all += config_host
394 config_all += config_all_disas
395 config_all += {
396 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
397 'CONFIG_SOFTMMU': have_system,
398 'CONFIG_USER_ONLY': have_user,
399 'CONFIG_ALL': true,
400 }
401
402 # Generators
403
404 genh = []
405 hxtool = find_program('scripts/hxtool')
406 shaderinclude = find_program('scripts/shaderinclude.pl')
407 qapi_gen = find_program('scripts/qapi-gen.py')
408 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
409 meson.source_root() / 'scripts/qapi/commands.py',
410 meson.source_root() / 'scripts/qapi/common.py',
411 meson.source_root() / 'scripts/qapi/doc.py',
412 meson.source_root() / 'scripts/qapi/error.py',
413 meson.source_root() / 'scripts/qapi/events.py',
414 meson.source_root() / 'scripts/qapi/expr.py',
415 meson.source_root() / 'scripts/qapi/gen.py',
416 meson.source_root() / 'scripts/qapi/introspect.py',
417 meson.source_root() / 'scripts/qapi/parser.py',
418 meson.source_root() / 'scripts/qapi/schema.py',
419 meson.source_root() / 'scripts/qapi/source.py',
420 meson.source_root() / 'scripts/qapi/types.py',
421 meson.source_root() / 'scripts/qapi/visit.py',
422 meson.source_root() / 'scripts/qapi/common.py',
423 meson.source_root() / 'scripts/qapi/doc.py',
424 meson.source_root() / 'scripts/qapi-gen.py'
425 ]
426
427 tracetool = [
428 python, files('scripts/tracetool.py'),
429 '--backend=' + config_host['TRACE_BACKENDS']
430 ]
431
432 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
433 meson.current_source_dir(),
434 config_host['PKGVERSION'], config_host['VERSION']]
435 qemu_version = custom_target('qemu-version.h',
436 output: 'qemu-version.h',
437 command: qemu_version_cmd,
438 capture: true,
439 build_by_default: true,
440 build_always_stale: true)
441 genh += qemu_version
442
443 config_host_h = custom_target('config-host.h',
444 input: meson.current_build_dir() / 'config-host.mak',
445 output: 'config-host.h',
446 capture: true,
447 command: [create_config, '@INPUT@'])
448 genh += config_host_h
449
450 hxdep = []
451 hx_headers = [
452 ['qemu-options.hx', 'qemu-options.def'],
453 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
454 ]
455 if have_system
456 hx_headers += [
457 ['hmp-commands.hx', 'hmp-commands.h'],
458 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
459 ]
460 endif
461 foreach d : hx_headers
462 hxdep += custom_target(d[1],
463 input: files(d[0]),
464 output: d[1],
465 capture: true,
466 build_by_default: true, # to be removed when added to a target
467 command: [hxtool, '-h', '@INPUT0@'])
468 endforeach
469 genh += hxdep
470
471 # Collect sourcesets.
472
473 util_ss = ss.source_set()
474 stub_ss = ss.source_set()
475 trace_ss = ss.source_set()
476 block_ss = ss.source_set()
477 blockdev_ss = ss.source_set()
478 qmp_ss = ss.source_set()
479 common_ss = ss.source_set()
480 softmmu_ss = ss.source_set()
481 user_ss = ss.source_set()
482 bsd_user_ss = ss.source_set()
483 linux_user_ss = ss.source_set()
484 specific_ss = ss.source_set()
485
486 modules = {}
487 hw_arch = {}
488 target_arch = {}
489 target_softmmu_arch = {}
490
491 ###############
492 # Trace files #
493 ###############
494
495 trace_events_subdirs = [
496 'accel/kvm',
497 'accel/tcg',
498 'crypto',
499 'monitor',
500 ]
501 if have_user
502 trace_events_subdirs += [ 'linux-user' ]
503 endif
504 if have_block
505 trace_events_subdirs += [
506 'authz',
507 'block',
508 'io',
509 'nbd',
510 'scsi',
511 ]
512 endif
513 if have_system
514 trace_events_subdirs += [
515 'audio',
516 'backends',
517 'backends/tpm',
518 'chardev',
519 'hw/9pfs',
520 'hw/acpi',
521 'hw/alpha',
522 'hw/arm',
523 'hw/audio',
524 'hw/block',
525 'hw/block/dataplane',
526 'hw/char',
527 'hw/display',
528 'hw/dma',
529 'hw/hppa',
530 'hw/hyperv',
531 'hw/i2c',
532 'hw/i386',
533 'hw/i386/xen',
534 'hw/ide',
535 'hw/input',
536 'hw/intc',
537 'hw/isa',
538 'hw/mem',
539 'hw/mips',
540 'hw/misc',
541 'hw/misc/macio',
542 'hw/net',
543 'hw/nvram',
544 'hw/pci',
545 'hw/pci-host',
546 'hw/ppc',
547 'hw/rdma',
548 'hw/rdma/vmw',
549 'hw/rtc',
550 'hw/s390x',
551 'hw/scsi',
552 'hw/sd',
553 'hw/sparc',
554 'hw/sparc64',
555 'hw/ssi',
556 'hw/timer',
557 'hw/tpm',
558 'hw/usb',
559 'hw/vfio',
560 'hw/virtio',
561 'hw/watchdog',
562 'hw/xen',
563 'hw/gpio',
564 'hw/riscv',
565 'migration',
566 'net',
567 'ui',
568 ]
569 endif
570 trace_events_subdirs += [
571 'hw/core',
572 'qapi',
573 'qom',
574 'target/arm',
575 'target/hppa',
576 'target/i386',
577 'target/mips',
578 'target/ppc',
579 'target/riscv',
580 'target/s390x',
581 'target/sparc',
582 'util',
583 ]
584
585 subdir('qapi')
586 subdir('qobject')
587 subdir('stubs')
588 subdir('trace')
589 subdir('util')
590 subdir('qom')
591 subdir('authz')
592 subdir('crypto')
593 subdir('ui')
594
595
596 if enable_modules
597 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
598 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
599 endif
600
601 # Build targets from sourcesets
602
603 stub_ss = stub_ss.apply(config_all, strict: false)
604
605 util_ss.add_all(trace_ss)
606 util_ss = util_ss.apply(config_all, strict: false)
607 libqemuutil = static_library('qemuutil',
608 sources: util_ss.sources() + stub_ss.sources() + genh,
609 dependencies: [util_ss.dependencies(), m, glib, socket])
610 qemuutil = declare_dependency(link_with: libqemuutil,
611 sources: genh + version_res)
612
613 subdir('audio')
614 subdir('io')
615 subdir('chardev')
616 subdir('fsdev')
617 subdir('target')
618 subdir('dump')
619
620 block_ss.add(files(
621 'block.c',
622 'blockjob.c',
623 'job.c',
624 'qemu-io-cmds.c',
625 ))
626 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
627
628 subdir('nbd')
629 subdir('scsi')
630 subdir('block')
631
632 blockdev_ss.add(files(
633 'blockdev.c',
634 'blockdev-nbd.c',
635 'iothread.c',
636 'job-qmp.c',
637 ))
638
639 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
640 # os-win32.c does not
641 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
642 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
643
644 softmmu_ss.add_all(blockdev_ss)
645 softmmu_ss.add(files(
646 'bootdevice.c',
647 'dma-helpers.c',
648 'qdev-monitor.c',
649 ), sdl)
650
651 softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
652 softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
653 softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
654
655 common_ss.add(files('cpus-common.c'))
656
657 subdir('softmmu')
658 subdir('monitor')
659 subdir('replay')
660
661 # needed for fuzzing binaries
662 subdir('tests/qtest/libqos')
663
664 block_mods = []
665 softmmu_mods = []
666 foreach d, list : modules
667 foreach m, module_ss : list
668 if enable_modules and targetos != 'windows'
669 module_ss = module_ss.apply(config_host, strict: false)
670 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
671 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
672 if d == 'block'
673 block_mods += sl
674 else
675 softmmu_mods += sl
676 endif
677 else
678 if d == 'block'
679 block_ss.add_all(module_ss)
680 else
681 softmmu_ss.add_all(module_ss)
682 endif
683 endif
684 endforeach
685 endforeach
686
687 nm = find_program('nm')
688 undefsym = find_program('scripts/undefsym.sh')
689 block_syms = custom_target('block.syms', output: 'block.syms',
690 input: [libqemuutil, block_mods],
691 capture: true,
692 command: [undefsym, nm, '@INPUT@'])
693 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
694 input: [libqemuutil, softmmu_mods],
695 capture: true,
696 command: [undefsym, nm, '@INPUT@'])
697
698 block_ss = block_ss.apply(config_host, strict: false)
699 libblock = static_library('block', block_ss.sources() + genh,
700 dependencies: block_ss.dependencies(),
701 link_depends: block_syms,
702 name_suffix: 'fa',
703 build_by_default: false)
704
705 block = declare_dependency(link_whole: [libblock],
706 link_args: '@block.syms',
707 dependencies: [crypto, io])
708
709 qmp_ss = qmp_ss.apply(config_host, strict: false)
710 libqmp = static_library('qmp', qmp_ss.sources() + genh,
711 dependencies: qmp_ss.dependencies(),
712 name_suffix: 'fa',
713 build_by_default: false)
714
715 qmp = declare_dependency(link_whole: [libqmp])
716
717 foreach m : block_mods + softmmu_mods
718 shared_module(m.name(),
719 name_prefix: '',
720 link_whole: m,
721 install: true,
722 install_dir: config_host['qemu_moddir'])
723 endforeach
724
725 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
726 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
727
728 common_all = common_ss.apply(config_all, strict: false)
729 common_all = static_library('common',
730 build_by_default: false,
731 sources: common_all.sources() + genh,
732 dependencies: common_all.dependencies(),
733 name_suffix: 'fa')
734
735 foreach target : target_dirs
736 config_target = config_target_mak[target]
737 target_name = config_target['TARGET_NAME']
738 arch = config_target['TARGET_BASE_ARCH']
739 arch_srcs = []
740
741 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
742 if targetos == 'linux'
743 target_inc += include_directories('linux-headers', is_system: true)
744 endif
745 if target.endswith('-softmmu')
746 qemu_target_name = 'qemu-system-' + target_name
747 target_type='system'
748 arch_srcs += config_devices_h[target]
749 else
750 target_type='user'
751 qemu_target_name = 'qemu-' + target_name
752 if 'CONFIG_LINUX_USER' in config_target
753 base_dir = 'linux-user'
754 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
755 else
756 base_dir = 'bsd-user'
757 endif
758 target_inc += include_directories(
759 base_dir,
760 base_dir / config_target['TARGET_ABI_DIR'],
761 )
762 endif
763
764 target_common = common_ss.apply(config_target, strict: false)
765 objects = common_all.extract_objects(target_common.sources())
766
767 # TODO: Change to generator once obj-y goes away
768 config_target_h = custom_target(target + '-config-target.h',
769 input: meson.current_build_dir() / target / 'config-target.mak',
770 output: target + '-config-target.h',
771 capture: true,
772 command: [create_config, '@INPUT@'])
773
774 target_specific = specific_ss.apply(config_target, strict: false)
775 arch_srcs += target_specific.sources()
776
777 static_library('qemu-' + target,
778 sources: arch_srcs + [config_target_h] + genh,
779 objects: objects,
780 include_directories: target_inc,
781 c_args: ['-DNEED_CPU_H',
782 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
783 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
784 name_suffix: 'fa')
785 endforeach
786
787 # Other build targets
788
789 if 'CONFIG_GUEST_AGENT' in config_host
790 subdir('qga')
791 endif
792
793 if have_tools
794 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
795 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
796 qemu_io = executable('qemu-io', files('qemu-io.c'),
797 dependencies: [block, qemuutil], install: true)
798 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
799 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
800 dependencies: [block, qemuutil], install: true)
801 endif
802
803 subdir('storage-daemon')
804 subdir('contrib/rdmacm-mux')
805 subdir('contrib/elf2dmp')
806
807 if 'CONFIG_XKBCOMMON' in config_host
808 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
809 dependencies: [qemuutil, xkbcommon], install: true)
810 endif
811
812 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
813 dependencies: qemuutil,
814 install: true)
815
816 if 'CONFIG_VHOST_USER' in config_host
817 subdir('contrib/libvhost-user')
818 subdir('contrib/vhost-user-blk')
819 if 'CONFIG_LINUX' in config_host
820 subdir('contrib/vhost-user-gpu')
821 endif
822 subdir('contrib/vhost-user-input')
823 subdir('contrib/vhost-user-scsi')
824 endif
825
826 if targetos == 'linux'
827 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
828 dependencies: [qemuutil, libcap_ng],
829 install: true,
830 install_dir: get_option('libexecdir'))
831
832 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
833 dependencies: [authz, crypto, io, qom, qemuutil,
834 libcap_ng, libudev, libmpathpersist],
835 install: true)
836 endif
837
838 if 'CONFIG_IVSHMEM' in config_host
839 subdir('contrib/ivshmem-client')
840 subdir('contrib/ivshmem-server')
841 endif
842 endif
843
844 subdir('tools')
845 subdir('pc-bios')
846 subdir('tests')
847
848 summary_info = {}
849 summary_info += {'Install prefix': config_host['prefix']}
850 summary_info += {'BIOS directory': config_host['qemu_datadir']}
851 summary_info += {'firmware path': config_host['qemu_firmwarepath']}
852 summary_info += {'binary directory': config_host['bindir']}
853 summary_info += {'library directory': config_host['libdir']}
854 summary_info += {'module directory': config_host['qemu_moddir']}
855 summary_info += {'libexec directory': config_host['libexecdir']}
856 summary_info += {'include directory': config_host['includedir']}
857 summary_info += {'config directory': config_host['sysconfdir']}
858 if targetos != 'windows'
859 summary_info += {'local state directory': config_host['qemu_localstatedir']}
860 summary_info += {'Manual directory': config_host['mandir']}
861 else
862 summary_info += {'local state directory': 'queried at runtime'}
863 endif
864 summary_info += {'Build directory': meson.current_build_dir()}
865 summary_info += {'Source path': meson.current_source_dir()}
866 summary_info += {'GIT binary': config_host['GIT']}
867 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
868 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
869 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
870 if link_language == 'cpp'
871 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
872 else
873 summary_info += {'C++ compiler': false}
874 endif
875 if targetos == 'darwin'
876 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
877 endif
878 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
879 summary_info += {'CFLAGS': config_host['CFLAGS']}
880 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
881 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
882 summary_info += {'make': config_host['MAKE']}
883 summary_info += {'install': config_host['INSTALL']}
884 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
885 summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
886 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
887 # TODO: add back version
888 summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
889 if config_host.has_key('CONFIG_SLIRP')
890 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
891 endif
892 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
893 if config_host.has_key('CONFIG_MODULES')
894 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
895 endif
896 summary_info += {'host CPU': cpu}
897 summary_info += {'host endianness': build_machine.endian()}
898 summary_info += {'target list': config_host['TARGET_DIRS']}
899 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
900 summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
901 summary_info += {'strip binaries': get_option('strip')}
902 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
903 summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
904 if targetos == 'darwin'
905 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
906 endif
907 # TODO: add back version
908 summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
909 summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
910 # TODO: add back version
911 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
912 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
913 # TODO: add back version
914 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
915 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
916 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
917 # TODO: add back version
918 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
919 if config_host.has_key('CONFIG_GCRYPT')
920 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
921 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
922 endif
923 # TODO: add back version
924 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
925 if config_host.has_key('CONFIG_NETTLE')
926 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
927 endif
928 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
929 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
930 summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
931 summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
932 # TODO: add back version
933 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
934 summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
935 summary_info += {'mingw32 support': targetos == 'windows'}
936 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
937 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
938 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
939 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
940 summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
941 summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
942 if config_host.has_key('CONFIG_VNC')
943 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
944 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
945 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
946 endif
947 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
948 if config_host.has_key('CONFIG_XEN_BACKEND')
949 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
950 endif
951 summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
952 summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
953 summary_info += {'PIE': get_option('b_pie')}
954 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
955 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
956 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
957 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
958 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
959 summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
960 # TODO: add back KVM/HAX/HVF/WHPX/TCG
961 #summary_info += {'KVM support': have_kvm'}
962 #summary_info += {'HAX support': have_hax'}
963 #summary_info += {'HVF support': have_hvf'}
964 #summary_info += {'WHPX support': have_whpx'}
965 #summary_info += {'TCG support': have_tcg'}
966 #if get_option('tcg')
967 # summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
968 # summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
969 #endif
970 summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
971 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
972 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
973 summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
974 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
975 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
976 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
977 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
978 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
979 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
980 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
981 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
982 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
983 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
984 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
985 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
986 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
987 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
988 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
989 if config_host['TRACE_BACKENDS'].split().contains('simple')
990 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
991 endif
992 # TODO: add back protocol and server version
993 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
994 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
995 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
996 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
997 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
998 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
999 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1000 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1001 summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1002 summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1003 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1004 if targetos == 'windows'
1005 if 'WIN_SDK' in config_host
1006 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1007 endif
1008 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1009 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1010 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1011 endif
1012 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1013 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1014 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1015 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1016 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1017 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1018 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1019 summary_info += {'gcov': get_option('b_coverage')}
1020 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1021 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1022 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1023 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1024 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1025 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1026 summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1027 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1028 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1029 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1030 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1031 summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1032 summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1033 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1034 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1035 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1036 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1037 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1038 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1039 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1040 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1041 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1042 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1043 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1044 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1045 summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1046 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1047 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1048 summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1049 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1050 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1051 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1052 if config_host.has_key('HAVE_GDB_BIN')
1053 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1054 endif
1055 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1056 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1057 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1058 summary(summary_info, bool_yn: true)
1059
1060 if not supported_cpus.contains(cpu)
1061 message()
1062 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1063 message()
1064 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1065 message('The QEMU project intends to remove support for this host CPU in')
1066 message('a future release if nobody volunteers to maintain it and to')
1067 message('provide a build host for our continuous integration setup.')
1068 message('configure has succeeded and you can continue to build, but')
1069 message('if you care about QEMU on this platform you should contact')
1070 message('us upstream at qemu-devel@nongnu.org.')
1071 endif
1072
1073 if not supported_oses.contains(targetos)
1074 message()
1075 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1076 message()
1077 message('Host OS ' + targetos + 'support is not currently maintained.')
1078 message('The QEMU project intends to remove support for this host OS in')
1079 message('a future release if nobody volunteers to maintain it and to')
1080 message('provide a build host for our continuous integration setup.')
1081 message('configure has succeeded and you can continue to build, but')
1082 message('if you care about QEMU on this platform you should contact')
1083 message('us upstream at qemu-devel@nongnu.org.')
1084 endif