xref: /openbmc/qemu/meson.build (revision 17ef2af6b67f29bb5c5c687f07216544830f167a)
1project('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
5not_found = dependency('', required: false)
6keyval = import('unstable-keyval')
7ss = import('sourceset')
8
9sh = find_program('sh')
10cc = meson.get_compiler('c')
11config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
12config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
13enable_modules = 'CONFIG_MODULES' in config_host
14
15add_project_arguments(config_host['QEMU_CFLAGS'].split(),
16                      native: false, language: ['c', 'objc'])
17add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
18                      native: false, language: 'cpp')
19add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
20                           native: false, language: ['c', 'cpp', 'objc'])
21add_project_arguments(config_host['QEMU_INCLUDES'].split(),
22                      language: ['c', 'cpp', 'objc'])
23
24python = import('python').find_installation()
25
26link_language = meson.get_external_property('link_language', 'cpp')
27if link_language == 'cpp'
28  add_languages('cpp', required: true, native: false)
29endif
30if host_machine.system() == 'darwin'
31  add_languages('objc', required: false, native: false)
32endif
33
34if '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'])
39endif
40
41configure_file(input: files('scripts/ninjatool.py'),
42               output: 'ninjatool',
43               configuration: config_host)
44
45supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
46supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
47  'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
48
49cpu = host_machine.cpu_family()
50targetos = host_machine.system()
51
52m = cc.find_library('m', required: false)
53util = cc.find_library('util', required: false)
54winmm = []
55socket = []
56version_res = []
57coref = []
58iokit = []
59cocoa = []
60hvf = []
61if 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('.'))
69elif 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')
74elif targetos == 'sunos'
75  socket = [cc.find_library('socket'),
76            cc.find_library('nsl'),
77            cc.find_library('resolv')]
78elif targetos == 'haiku'
79  socket = [cc.find_library('posix_error_mapper'),
80            cc.find_library('network'),
81            cc.find_library('bsd')]
82endif
83glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
84                          link_args: config_host['GLIB_LIBS'].split())
85gio = not_found
86if 'CONFIG_GIO' in config_host
87  gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
88                           link_args: config_host['GIO_LIBS'].split())
89endif
90lttng = not_found
91if 'CONFIG_TRACE_UST' in config_host
92  lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
93endif
94urcubp = not_found
95if 'CONFIG_TRACE_UST' in config_host
96  urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
97endif
98nettle = not_found
99if 'CONFIG_NETTLE' in config_host
100  nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
101                              link_args: config_host['NETTLE_LIBS'].split())
102endif
103gnutls = not_found
104if 'CONFIG_GNUTLS' in config_host
105  gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
106                              link_args: config_host['GNUTLS_LIBS'].split())
107endif
108pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
109                            link_args: config_host['PIXMAN_LIBS'].split())
110pam = not_found
111if 'CONFIG_AUTH_PAM' in config_host
112  pam = cc.find_library('pam')
113endif
114libaio = cc.find_library('aio', required: false)
115zlib = not_found
116if 'CONFIG_ZLIB' in config_host
117  zlib = declare_dependency(compile_args: config_host['ZLIB_CFLAGS'].split(),
118                            link_args: config_host['ZLIB_LIBS'].split())
119endif
120linux_io_uring = not_found
121if '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())
124endif
125libxml2 = not_found
126if 'CONFIG_LIBXML2' in config_host
127  libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
128                               link_args: config_host['LIBXML2_LIBS'].split())
129endif
130libnfs = not_found
131if 'CONFIG_LIBNFS' in config_host
132  libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
133endif
134libattr = not_found
135if 'CONFIG_ATTR' in config_host
136  libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
137endif
138seccomp = not_found
139if 'CONFIG_SECCOMP' in config_host
140  seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
141                               link_args: config_host['SECCOMP_LIBS'].split())
142endif
143libcap_ng = not_found
144if 'CONFIG_LIBCAP_NG' in config_host
145  libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
146endif
147xkbcommon = not_found
148if 'CONFIG_XKBCOMMON' in config_host
149  xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(),
150                                 link_args: config_host['XKBCOMMON_LIBS'].split())
151endif
152pulse = not_found
153if 'CONFIG_LIBPULSE' in config_host
154  pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
155                             link_args: config_host['PULSE_LIBS'].split())
156endif
157alsa = not_found
158if 'CONFIG_ALSA' in config_host
159  alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
160                            link_args: config_host['ALSA_LIBS'].split())
161endif
162jack = not_found
163if 'CONFIG_LIBJACK' in config_host
164  jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
165endif
166spice = not_found
167if 'CONFIG_SPICE' in config_host
168  spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
169                             link_args: config_host['SPICE_LIBS'].split())
170endif
171rt = cc.find_library('rt', required: false)
172libmpathpersist = not_found
173if config_host.has_key('CONFIG_MPATH')
174  libmpathpersist = cc.find_library('mpathpersist')
175endif
176libiscsi = not_found
177if 'CONFIG_LIBISCSI' in config_host
178  libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
179                                link_args: config_host['LIBISCSI_LIBS'].split())
180endif
181zstd = not_found
182if 'CONFIG_ZSTD' in config_host
183  zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
184                            link_args: config_host['ZSTD_LIBS'].split())
185endif
186gbm = not_found
187if 'CONFIG_GBM' in config_host
188  gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
189                           link_args: config_host['GBM_LIBS'].split())
190endif
191virgl = not_found
192if 'CONFIG_VIRGL' in config_host
193  virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
194                             link_args: config_host['VIRGL_LIBS'].split())
195endif
196curl = not_found
197if 'CONFIG_CURL' in config_host
198  curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
199                            link_args: config_host['CURL_LIBS'].split())
200endif
201libudev = not_found
202if 'CONFIG_LIBUDEV' in config_host
203  libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
204endif
205brlapi = not_found
206if 'CONFIG_BRLAPI' in config_host
207  brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
208endif
209sdl = not_found
210if 'CONFIG_SDL' in config_host
211  sdl = declare_dependency(compile_args: config_host['SDL_CFLAGS'].split(),
212                           link_args: config_host['SDL_LIBS'].split())
213endif
214rbd = not_found
215if 'CONFIG_RBD' in config_host
216  rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
217endif
218glusterfs = not_found
219if 'CONFIG_GLUSTERFS' in config_host
220  glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
221                                 link_args: config_host['GLUSTERFS_LIBS'].split())
222endif
223libssh = not_found
224if 'CONFIG_LIBSSH' in config_host
225  libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
226                              link_args: config_host['LIBSSH_LIBS'].split())
227endif
228libbzip2 = not_found
229if 'CONFIG_BZIP2' in config_host
230  libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
231endif
232liblzfse = not_found
233if 'CONFIG_LZFSE' in config_host
234  liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
235endif
236oss = not_found
237if 'CONFIG_AUDIO_OSS' in config_host
238  oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
239endif
240dsound = not_found
241if 'CONFIG_AUDIO_DSOUND' in config_host
242  dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
243endif
244coreaudio = not_found
245if 'CONFIG_AUDIO_COREAUDIO' in config_host
246  coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
247endif
248opengl = not_found
249if 'CONFIG_OPENGL' in config_host
250  opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
251else
252endif
253gtk = not_found
254if 'CONFIG_GTK' in config_host
255  gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
256                              link_args: config_host['GTK_LIBS'].split())
257endif
258vte = not_found
259if 'CONFIG_VTE' in config_host
260  vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
261                           link_args: config_host['VTE_LIBS'].split())
262endif
263x11 = not_found
264if 'CONFIG_X11' in config_host
265  x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
266                           link_args: config_host['X11_LIBS'].split())
267endif
268curses = not_found
269if 'CONFIG_CURSES' in config_host
270  curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
271                              link_args: config_host['CURSES_LIBS'].split())
272endif
273iconv = not_found
274if 'CONFIG_ICONV' in config_host
275  iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
276                             link_args: config_host['ICONV_LIBS'].split())
277endif
278gio = not_found
279if 'CONFIG_GIO' in config_host
280  gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
281                           link_args: config_host['GIO_LIBS'].split())
282endif
283png = not_found
284if '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())
287endif
288jpeg = not_found
289if '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())
292endif
293sasl = not_found
294if '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())
297endif
298fdt = not_found
299if 'CONFIG_FDT' in config_host
300  fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
301                           link_args: config_host['FDT_LIBS'].split())
302endif
303snappy = not_found
304if 'CONFIG_SNAPPY' in config_host
305  snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
306endif
307lzo = not_found
308if 'CONFIG_LZO' in config_host
309  lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
310endif
311
312create_config = find_program('scripts/create_config')
313minikconf = find_program('scripts/minikconf.py')
314target_dirs = config_host['TARGET_DIRS'].split()
315have_user = false
316have_system = false
317config_devices_mak_list = []
318config_devices_h = {}
319config_target_mak = {}
320kconfig_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]
334foreach 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}
367endforeach
368have_tools = 'CONFIG_TOOLS' in config_host
369have_block = have_system or have_tools
370
371grepy = 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
381if 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)
389else
390  config_all_devices = {}
391endif
392config_all = config_all_devices
393config_all += config_host
394config_all += config_all_disas
395config_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
404genh = []
405hxtool = find_program('scripts/hxtool')
406shaderinclude = find_program('scripts/shaderinclude.pl')
407qapi_gen = find_program('scripts/qapi-gen.py')
408qapi_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
427tracetool = [
428  python, files('scripts/tracetool.py'),
429   '--backend=' + config_host['TRACE_BACKENDS']
430]
431
432qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
433                    meson.current_source_dir(),
434                    config_host['PKGVERSION'], config_host['VERSION']]
435qemu_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)
441genh += qemu_version
442
443config_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@'])
448genh += config_host_h
449
450hxdep = []
451hx_headers = [
452  ['qemu-options.hx', 'qemu-options.def'],
453  ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
454]
455if have_system
456  hx_headers += [
457    ['hmp-commands.hx', 'hmp-commands.h'],
458    ['hmp-commands-info.hx', 'hmp-commands-info.h'],
459  ]
460endif
461foreach 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@'])
468endforeach
469genh += hxdep
470
471# Collect sourcesets.
472
473util_ss = ss.source_set()
474stub_ss = ss.source_set()
475trace_ss = ss.source_set()
476block_ss = ss.source_set()
477blockdev_ss = ss.source_set()
478qmp_ss = ss.source_set()
479common_ss = ss.source_set()
480softmmu_ss = ss.source_set()
481user_ss = ss.source_set()
482bsd_user_ss = ss.source_set()
483linux_user_ss = ss.source_set()
484specific_ss = ss.source_set()
485
486modules = {}
487hw_arch = {}
488target_arch = {}
489target_softmmu_arch = {}
490
491###############
492# Trace files #
493###############
494
495trace_events_subdirs = [
496  'accel/kvm',
497  'accel/tcg',
498  'crypto',
499  'monitor',
500]
501if have_user
502  trace_events_subdirs += [ 'linux-user' ]
503endif
504if have_block
505  trace_events_subdirs += [
506    'authz',
507    'block',
508    'io',
509    'nbd',
510    'scsi',
511  ]
512endif
513if 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  ]
569endif
570trace_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
585subdir('qapi')
586subdir('qobject')
587subdir('stubs')
588subdir('trace')
589subdir('util')
590subdir('qom')
591subdir('authz')
592subdir('crypto')
593subdir('ui')
594
595
596if 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')
599endif
600
601# Build targets from sourcesets
602
603stub_ss = stub_ss.apply(config_all, strict: false)
604
605util_ss.add_all(trace_ss)
606util_ss = util_ss.apply(config_all, strict: false)
607libqemuutil = static_library('qemuutil',
608                             sources: util_ss.sources() + stub_ss.sources() + genh,
609                             dependencies: [util_ss.dependencies(), m, glib, socket])
610qemuutil = declare_dependency(link_with: libqemuutil,
611                              sources: genh + version_res)
612
613subdir('audio')
614subdir('io')
615subdir('chardev')
616subdir('fsdev')
617subdir('target')
618subdir('dump')
619
620block_ss.add(files(
621  'block.c',
622  'blockjob.c',
623  'job.c',
624  'qemu-io-cmds.c',
625))
626block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
627
628subdir('nbd')
629subdir('scsi')
630subdir('block')
631
632blockdev_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
641blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
642softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
643
644softmmu_ss.add_all(blockdev_ss)
645softmmu_ss.add(files(
646  'bootdevice.c',
647  'dma-helpers.c',
648  'qdev-monitor.c',
649), sdl)
650
651softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
652softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
653softmmu_ss.add(when: ['CONFIG_FDT', fdt],  if_true: [files('device_tree.c')])
654
655common_ss.add(files('cpus-common.c'))
656
657subdir('softmmu')
658subdir('monitor')
659subdir('replay')
660
661# needed for fuzzing binaries
662subdir('tests/qtest/libqos')
663
664block_mods = []
665softmmu_mods = []
666foreach 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
685endforeach
686
687nm = find_program('nm')
688undefsym = find_program('scripts/undefsym.sh')
689block_syms = custom_target('block.syms', output: 'block.syms',
690                             input: [libqemuutil, block_mods],
691                             capture: true,
692                             command: [undefsym, nm, '@INPUT@'])
693qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
694                             input: [libqemuutil, softmmu_mods],
695                             capture: true,
696                             command: [undefsym, nm, '@INPUT@'])
697
698block_ss = block_ss.apply(config_host, strict: false)
699libblock = 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
705block = declare_dependency(link_whole: [libblock],
706                           link_args: '@block.syms',
707                           dependencies: [crypto, io])
708
709qmp_ss = qmp_ss.apply(config_host, strict: false)
710libqmp = static_library('qmp', qmp_ss.sources() + genh,
711                        dependencies: qmp_ss.dependencies(),
712                        name_suffix: 'fa',
713                        build_by_default: false)
714
715qmp = declare_dependency(link_whole: [libqmp])
716
717foreach 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'])
723endforeach
724
725common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
726common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
727
728common_all = common_ss.apply(config_all, strict: false)
729common_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
735foreach 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')
785endforeach
786
787# Other build targets
788
789if 'CONFIG_GUEST_AGENT' in config_host
790  subdir('qga')
791endif
792
793if 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
842endif
843
844subdir('tools')
845subdir('pc-bios')
846subdir('tests')
847
848summary_info = {}
849summary_info += {'Install prefix':    config_host['prefix']}
850summary_info += {'BIOS directory':    config_host['qemu_datadir']}
851summary_info += {'firmware path':     config_host['qemu_firmwarepath']}
852summary_info += {'binary directory':  config_host['bindir']}
853summary_info += {'library directory': config_host['libdir']}
854summary_info += {'module directory':  config_host['qemu_moddir']}
855summary_info += {'libexec directory': config_host['libexecdir']}
856summary_info += {'include directory': config_host['includedir']}
857summary_info += {'config directory':  config_host['sysconfdir']}
858if targetos != 'windows'
859  summary_info += {'local state directory': config_host['qemu_localstatedir']}
860  summary_info += {'Manual directory':      config_host['mandir']}
861else
862  summary_info += {'local state directory': 'queried at runtime'}
863endif
864summary_info += {'Build directory':   meson.current_build_dir()}
865summary_info += {'Source path':       meson.current_source_dir()}
866summary_info += {'GIT binary':        config_host['GIT']}
867summary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
868summary_info += {'C compiler':        meson.get_compiler('c').cmd_array()[0]}
869summary_info += {'Host C compiler':   meson.get_compiler('c', native: true).cmd_array()[0]}
870if link_language == 'cpp'
871  summary_info += {'C++ compiler':      meson.get_compiler('cpp').cmd_array()[0]}
872else
873  summary_info += {'C++ compiler':      false}
874endif
875if targetos == 'darwin'
876  summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
877endif
878summary_info += {'ARFLAGS':           config_host['ARFLAGS']}
879summary_info += {'CFLAGS':            config_host['CFLAGS']}
880summary_info += {'QEMU_CFLAGS':       config_host['QEMU_CFLAGS']}
881summary_info += {'QEMU_LDFLAGS':      config_host['QEMU_LDFLAGS']}
882summary_info += {'make':              config_host['MAKE']}
883summary_info += {'install':           config_host['INSTALL']}
884summary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
885summary_info += {'sphinx-build':      config_host['SPHINX_BUILD']}
886summary_info += {'genisoimage':       config_host['GENISOIMAGE']}
887# TODO: add back version
888summary_info += {'slirp support':     config_host.has_key('CONFIG_SLIRP')}
889if config_host.has_key('CONFIG_SLIRP')
890  summary_info += {'smbd':            config_host['CONFIG_SMBD_COMMAND']}
891endif
892summary_info += {'module support':    config_host.has_key('CONFIG_MODULES')}
893if config_host.has_key('CONFIG_MODULES')
894  summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
895endif
896summary_info += {'host CPU':          cpu}
897summary_info += {'host endianness':   build_machine.endian()}
898summary_info += {'target list':       config_host['TARGET_DIRS']}
899summary_info += {'gprof enabled':     config_host.has_key('CONFIG_GPROF')}
900summary_info += {'sparse enabled':    meson.get_compiler('c').cmd_array().contains('cgcc')}
901summary_info += {'strip binaries':    get_option('strip')}
902summary_info += {'profiler':          config_host.has_key('CONFIG_PROFILER')}
903summary_info += {'static build':      config_host.has_key('CONFIG_TOOLS')}
904if targetos == 'darwin'
905  summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
906endif
907# TODO: add back version
908summary_info += {'SDL support':       config_host.has_key('CONFIG_SDL')}
909summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
910# TODO: add back version
911summary_info += {'GTK support':       config_host.has_key('CONFIG_GTK')}
912summary_info += {'GTK GL support':    config_host.has_key('CONFIG_GTK_GL')}
913# TODO: add back version
914summary_info += {'VTE support':       config_host.has_key('CONFIG_VTE')}
915summary_info += {'TLS priority':      config_host['CONFIG_TLS_PRIORITY']}
916summary_info += {'GNUTLS support':    config_host.has_key('CONFIG_GNUTLS')}
917# TODO: add back version
918summary_info += {'libgcrypt':         config_host.has_key('CONFIG_GCRYPT')}
919if 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')}
922endif
923# TODO: add back version
924summary_info += {'nettle':            config_host.has_key('CONFIG_NETTLE')}
925if config_host.has_key('CONFIG_NETTLE')
926   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
927endif
928summary_info += {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
929summary_info += {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
930summary_info += {'iconv support':     config_host.has_key('CONFIG_ICONV')}
931summary_info += {'curses support':    config_host.has_key('CONFIG_CURSES')}
932# TODO: add back version
933summary_info += {'virgl support':     config_host.has_key('CONFIG_VIRGL')}
934summary_info += {'curl support':      config_host.has_key('CONFIG_CURL')}
935summary_info += {'mingw32 support':   targetos == 'windows'}
936summary_info += {'Audio drivers':     config_host['CONFIG_AUDIO_DRIVERS']}
937summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
938summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
939summary_info += {'VirtFS support':    config_host.has_key('CONFIG_VIRTFS')}
940summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
941summary_info += {'VNC support':       config_host.has_key('CONFIG_VNC')}
942if 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')}
946endif
947summary_info += {'xen support':       config_host.has_key('CONFIG_XEN_BACKEND')}
948if config_host.has_key('CONFIG_XEN_BACKEND')
949  summary_info += {'xen ctrl version':  config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
950endif
951summary_info += {'brlapi support':    config_host.has_key('CONFIG_BRLAPI')}
952summary_info += {'Documentation':     config_host.has_key('BUILD_DOCS')}
953summary_info += {'PIE':               get_option('b_pie')}
954summary_info += {'vde support':       config_host.has_key('CONFIG_VDE')}
955summary_info += {'netmap support':    config_host.has_key('CONFIG_NETMAP')}
956summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
957summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
958summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
959summary_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
970summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
971summary_info += {'RDMA support':      config_host.has_key('CONFIG_RDMA')}
972summary_info += {'PVRDMA support':    config_host.has_key('CONFIG_PVRDMA')}
973summary_info += {'fdt support':       config_host.has_key('CONFIG_FDT')}
974summary_info += {'membarrier':        config_host.has_key('CONFIG_MEMBARRIER')}
975summary_info += {'preadv support':    config_host.has_key('CONFIG_PREADV')}
976summary_info += {'fdatasync':         config_host.has_key('CONFIG_FDATASYNC')}
977summary_info += {'madvise':           config_host.has_key('CONFIG_MADVISE')}
978summary_info += {'posix_madvise':     config_host.has_key('CONFIG_POSIX_MADVISE')}
979summary_info += {'posix_memalign':    config_host.has_key('CONFIG_POSIX_MEMALIGN')}
980summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
981summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
982summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
983summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
984summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
985summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
986summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
987summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
988summary_info += {'Trace backends':    config_host['TRACE_BACKENDS']}
989if config_host['TRACE_BACKENDS'].split().contains('simple')
990  summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
991endif
992# TODO: add back protocol and server version
993summary_info += {'spice support':     config_host.has_key('CONFIG_SPICE')}
994summary_info += {'rbd support':       config_host.has_key('CONFIG_RBD')}
995summary_info += {'xfsctl support':    config_host.has_key('CONFIG_XFS')}
996summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
997summary_info += {'libusb':            config_host.has_key('CONFIG_USB_LIBUSB')}
998summary_info += {'usb net redir':     config_host.has_key('CONFIG_USB_REDIR')}
999summary_info += {'OpenGL support':    config_host.has_key('CONFIG_OPENGL')}
1000summary_info += {'OpenGL dmabufs':    config_host.has_key('CONFIG_OPENGL_DMABUF')}
1001summary_info += {'libiscsi support':  config_host.has_key('CONFIG_LIBISCSI')}
1002summary_info += {'libnfs support':    config_host.has_key('CONFIG_LIBNFS')}
1003summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1004if 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')}
1011endif
1012summary_info += {'seccomp support':   config_host.has_key('CONFIG_SECCOMP')}
1013summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1014summary_info += {'coroutine pool':    config_host['CONFIG_COROUTINE_POOL'] == '1'}
1015summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1016summary_info += {'mutex debugging':   config_host.has_key('CONFIG_DEBUG_MUTEX')}
1017summary_info += {'crypto afalg':      config_host.has_key('CONFIG_AF_ALG')}
1018summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1019summary_info += {'gcov':              get_option('b_coverage')}
1020summary_info += {'TPM support':       config_host.has_key('CONFIG_TPM')}
1021summary_info += {'libssh support':    config_host.has_key('CONFIG_LIBSSH')}
1022summary_info += {'QOM debugging':     config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1023summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1024summary_info += {'lzo support':       config_host.has_key('CONFIG_LZO')}
1025summary_info += {'snappy support':    config_host.has_key('CONFIG_SNAPPY')}
1026summary_info += {'bzip2 support':     config_host.has_key('CONFIG_BZIP2')}
1027summary_info += {'lzfse support':     config_host.has_key('CONFIG_LZFSE')}
1028summary_info += {'zstd support':      config_host.has_key('CONFIG_ZSTD')}
1029summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1030summary_info += {'libxml2':           config_host.has_key('CONFIG_LIBXML2')}
1031summary_info += {'tcmalloc support':  config_host.has_key('CONFIG_TCMALLOC')}
1032summary_info += {'jemalloc support':  config_host.has_key('CONFIG_JEMALLOC')}
1033summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1034summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1035summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1036summary_info += {'bochs support':     config_host.has_key('CONFIG_BOCHS')}
1037summary_info += {'cloop support':     config_host.has_key('CONFIG_CLOOP')}
1038summary_info += {'dmg support':       config_host.has_key('CONFIG_DMG')}
1039summary_info += {'qcow v1 support':   config_host.has_key('CONFIG_QCOW1')}
1040summary_info += {'vdi support':       config_host.has_key('CONFIG_VDI')}
1041summary_info += {'vvfat support':     config_host.has_key('CONFIG_VVFAT')}
1042summary_info += {'qed support':       config_host.has_key('CONFIG_QED')}
1043summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1044summary_info += {'sheepdog support':  config_host.has_key('CONFIG_SHEEPDOG')}
1045summary_info += {'capstone':          config_host.has_key('CONFIG_CAPSTONE')}
1046summary_info += {'libpmem support':   config_host.has_key('CONFIG_LIBPMEM')}
1047summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1048summary_info += {'libudev':           config_host.has_key('CONFIG_LIBUDEV')}
1049summary_info += {'default devices':   config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1050summary_info += {'plugin support':    config_host.has_key('CONFIG_PLUGIN')}
1051summary_info += {'fuzzing support':   config_host.has_key('CONFIG_FUZZ')}
1052if config_host.has_key('HAVE_GDB_BIN')
1053  summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
1054endif
1055summary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
1056summary_info += {'rng-none':          config_host.has_key('CONFIG_RNG_NONE')}
1057summary_info += {'Linux keyring':     config_host.has_key('CONFIG_SECRET_KEYRING')}
1058summary(summary_info, bool_yn: true)
1059
1060if 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.')
1071endif
1072
1073if 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.')
1084endif
1085