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