]> git.proxmox.com Git - mirror_qemu.git/blob - meson.build
meson: convert root directory to Meson
[mirror_qemu.git] / meson.build
1 project('qemu', ['c'], meson_version: '>=0.55.0',
2 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_lundef=false'],
3 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
4
5 not_found = dependency('', required: false)
6 keyval = import('unstable-keyval')
7 ss = import('sourceset')
8
9 sh = find_program('sh')
10 cc = meson.get_compiler('c')
11 config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
12 config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
13 enable_modules = 'CONFIG_MODULES' in config_host
14
15 add_project_arguments(config_host['QEMU_CFLAGS'].split(),
16 native: false, language: ['c', 'objc'])
17 add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
18 native: false, language: 'cpp')
19 add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
20 native: false, language: ['c', 'cpp', 'objc'])
21 add_project_arguments(config_host['QEMU_INCLUDES'].split(),
22 language: ['c', 'cpp', 'objc'])
23
24 python = import('python').find_installation()
25
26 link_language = meson.get_external_property('link_language', 'cpp')
27 if link_language == 'cpp'
28 add_languages('cpp', required: true, native: false)
29 endif
30 if host_machine.system() == 'darwin'
31 add_languages('objc', required: false, native: false)
32 endif
33
34 if 'SPARSE_CFLAGS' in config_host
35 run_target('sparse',
36 command: [find_program('scripts/check_sparse.py'),
37 config_host['SPARSE_CFLAGS'].split(),
38 'compile_commands.json'])
39 endif
40
41 configure_file(input: files('scripts/ninjatool.py'),
42 output: 'ninjatool',
43 configuration: config_host)
44
45 supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
46 supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
47 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
48
49 cpu = host_machine.cpu_family()
50 targetos = host_machine.system()
51
52 m = cc.find_library('m', required: false)
53 util = cc.find_library('util', required: false)
54 winmm = []
55 socket = []
56 version_res = []
57 coref = []
58 iokit = []
59 cocoa = []
60 hvf = []
61 if targetos == 'windows'
62 socket = cc.find_library('ws2_32')
63 winmm = cc.find_library('winmm')
64
65 win = import('windows')
66 version_res = win.compile_resources('version.rc',
67 depend_files: files('pc-bios/qemu-nsis.ico'),
68 include_directories: include_directories('.'))
69 elif targetos == 'darwin'
70 coref = dependency('appleframeworks', modules: 'CoreFoundation')
71 iokit = dependency('appleframeworks', modules: 'IOKit')
72 cocoa = dependency('appleframeworks', modules: 'Cocoa')
73 hvf = dependency('appleframeworks', modules: 'Hypervisor')
74 elif targetos == 'sunos'
75 socket = [cc.find_library('socket'),
76 cc.find_library('nsl'),
77 cc.find_library('resolv')]
78 elif targetos == 'haiku'
79 socket = [cc.find_library('posix_error_mapper'),
80 cc.find_library('network'),
81 cc.find_library('bsd')]
82 endif
83 glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
84 link_args: config_host['GLIB_LIBS'].split())
85 gio = not_found
86 if 'CONFIG_GIO' in config_host
87 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
88 link_args: config_host['GIO_LIBS'].split())
89 endif
90 lttng = not_found
91 if 'CONFIG_TRACE_UST' in config_host
92 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
93 endif
94 urcubp = not_found
95 if 'CONFIG_TRACE_UST' in config_host
96 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
97 endif
98 nettle = not_found
99 if 'CONFIG_NETTLE' in config_host
100 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
101 link_args: config_host['NETTLE_LIBS'].split())
102 endif
103 gnutls = not_found
104 if 'CONFIG_GNUTLS' in config_host
105 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
106 link_args: config_host['GNUTLS_LIBS'].split())
107 endif
108 pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
109 link_args: config_host['PIXMAN_LIBS'].split())
110 pam = not_found
111 if 'CONFIG_AUTH_PAM' in config_host
112 pam = cc.find_library('pam')
113 endif
114 libaio = cc.find_library('aio', required: false)
115 zlib = not_found
116 if 'CONFIG_ZLIB' in config_host
117 zlib = declare_dependency(compile_args: config_host['ZLIB_CFLAGS'].split(),
118 link_args: config_host['ZLIB_LIBS'].split())
119 endif
120 linux_io_uring = not_found
121 if 'CONFIG_LINUX_IO_URING' in config_host
122 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
123 link_args: config_host['LINUX_IO_URING_LIBS'].split())
124 endif
125 libxml2 = not_found
126 if 'CONFIG_LIBXML2' in config_host
127 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
128 link_args: config_host['LIBXML2_LIBS'].split())
129 endif
130 libnfs = not_found
131 if 'CONFIG_LIBNFS' in config_host
132 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
133 endif
134 libattr = not_found
135 if 'CONFIG_ATTR' in config_host
136 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
137 endif
138 seccomp = not_found
139 if 'CONFIG_SECCOMP' in config_host
140 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
141 link_args: config_host['SECCOMP_LIBS'].split())
142 endif
143 libcap_ng = not_found
144 if 'CONFIG_LIBCAP_NG' in config_host
145 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
146 endif
147 xkbcommon = not_found
148 if 'CONFIG_XKBCOMMON' in config_host
149 xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(),
150 link_args: config_host['XKBCOMMON_LIBS'].split())
151 endif
152 pulse = not_found
153 if 'CONFIG_LIBPULSE' in config_host
154 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
155 link_args: config_host['PULSE_LIBS'].split())
156 endif
157 alsa = not_found
158 if 'CONFIG_ALSA' in config_host
159 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
160 link_args: config_host['ALSA_LIBS'].split())
161 endif
162 jack = not_found
163 if 'CONFIG_LIBJACK' in config_host
164 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
165 endif
166 spice = not_found
167 if 'CONFIG_SPICE' in config_host
168 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
169 link_args: config_host['SPICE_LIBS'].split())
170 endif
171 rt = cc.find_library('rt', required: false)
172 libmpathpersist = not_found
173 if config_host.has_key('CONFIG_MPATH')
174 libmpathpersist = cc.find_library('mpathpersist')
175 endif
176 libiscsi = not_found
177 if 'CONFIG_LIBISCSI' in config_host
178 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
179 link_args: config_host['LIBISCSI_LIBS'].split())
180 endif
181 zstd = not_found
182 if 'CONFIG_ZSTD' in config_host
183 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
184 link_args: config_host['ZSTD_LIBS'].split())
185 endif
186 gbm = not_found
187 if 'CONFIG_GBM' in config_host
188 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
189 link_args: config_host['GBM_LIBS'].split())
190 endif
191 virgl = not_found
192 if 'CONFIG_VIRGL' in config_host
193 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
194 link_args: config_host['VIRGL_LIBS'].split())
195 endif
196 curl = not_found
197 if 'CONFIG_CURL' in config_host
198 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
199 link_args: config_host['CURL_LIBS'].split())
200 endif
201 libudev = not_found
202 if 'CONFIG_LIBUDEV' in config_host
203 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
204 endif
205 brlapi = not_found
206 if 'CONFIG_BRLAPI' in config_host
207 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
208 endif
209 sdl = not_found
210 if 'CONFIG_SDL' in config_host
211 sdl = declare_dependency(compile_args: config_host['SDL_CFLAGS'].split(),
212 link_args: config_host['SDL_LIBS'].split())
213 endif
214 rbd = not_found
215 if 'CONFIG_RBD' in config_host
216 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
217 endif
218 glusterfs = not_found
219 if 'CONFIG_GLUSTERFS' in config_host
220 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
221 link_args: config_host['GLUSTERFS_LIBS'].split())
222 endif
223 libssh = not_found
224 if 'CONFIG_LIBSSH' in config_host
225 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
226 link_args: config_host['LIBSSH_LIBS'].split())
227 endif
228 libbzip2 = not_found
229 if 'CONFIG_BZIP2' in config_host
230 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
231 endif
232 liblzfse = not_found
233 if 'CONFIG_LZFSE' in config_host
234 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
235 endif
236 oss = not_found
237 if 'CONFIG_AUDIO_OSS' in config_host
238 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
239 endif
240 dsound = not_found
241 if 'CONFIG_AUDIO_DSOUND' in config_host
242 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
243 endif
244 coreaudio = not_found
245 if 'CONFIG_AUDIO_COREAUDIO' in config_host
246 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
247 endif
248 opengl = not_found
249 if 'CONFIG_OPENGL' in config_host
250 opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
251 else
252 endif
253 gtk = not_found
254 if 'CONFIG_GTK' in config_host
255 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
256 link_args: config_host['GTK_LIBS'].split())
257 endif
258 vte = not_found
259 if 'CONFIG_VTE' in config_host
260 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
261 link_args: config_host['VTE_LIBS'].split())
262 endif
263 x11 = not_found
264 if 'CONFIG_X11' in config_host
265 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
266 link_args: config_host['X11_LIBS'].split())
267 endif
268 curses = not_found
269 if 'CONFIG_CURSES' in config_host
270 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
271 link_args: config_host['CURSES_LIBS'].split())
272 endif
273 iconv = not_found
274 if 'CONFIG_ICONV' in config_host
275 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
276 link_args: config_host['ICONV_LIBS'].split())
277 endif
278 gio = not_found
279 if 'CONFIG_GIO' in config_host
280 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
281 link_args: config_host['GIO_LIBS'].split())
282 endif
283 png = not_found
284 if 'CONFIG_VNC_PNG' in config_host
285 png = declare_dependency(compile_args: config_host['PNG_CFLAGS'].split(),
286 link_args: config_host['PNG_LIBS'].split())
287 endif
288 jpeg = not_found
289 if 'CONFIG_VNC_JPEG' in config_host
290 jpeg = declare_dependency(compile_args: config_host['JPEG_CFLAGS'].split(),
291 link_args: config_host['JPEG_LIBS'].split())
292 endif
293 sasl = not_found
294 if 'CONFIG_VNC_SASL' in config_host
295 sasl = declare_dependency(compile_args: config_host['SASL_CFLAGS'].split(),
296 link_args: config_host['SASL_LIBS'].split())
297 endif
298 fdt = not_found
299 if 'CONFIG_FDT' in config_host
300 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
301 link_args: config_host['FDT_LIBS'].split())
302 endif
303
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 # needed for fuzzing binaries
649 subdir('tests/qtest/libqos')
650
651 block_mods = []
652 softmmu_mods = []
653 foreach d, list : modules
654 foreach m, module_ss : list
655 if enable_modules and targetos != 'windows'
656 module_ss = module_ss.apply(config_host, strict: false)
657 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
658 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
659 if d == 'block'
660 block_mods += sl
661 else
662 softmmu_mods += sl
663 endif
664 else
665 if d == 'block'
666 block_ss.add_all(module_ss)
667 else
668 softmmu_ss.add_all(module_ss)
669 endif
670 endif
671 endforeach
672 endforeach
673
674 nm = find_program('nm')
675 undefsym = find_program('scripts/undefsym.sh')
676 block_syms = custom_target('block.syms', output: 'block.syms',
677 input: [libqemuutil, block_mods],
678 capture: true,
679 command: [undefsym, nm, '@INPUT@'])
680 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
681 input: [libqemuutil, softmmu_mods],
682 capture: true,
683 command: [undefsym, nm, '@INPUT@'])
684
685 block_ss = block_ss.apply(config_host, strict: false)
686 libblock = static_library('block', block_ss.sources() + genh,
687 dependencies: block_ss.dependencies(),
688 link_depends: block_syms,
689 name_suffix: 'fa',
690 build_by_default: false)
691
692 block = declare_dependency(link_whole: [libblock],
693 link_args: '@block.syms',
694 dependencies: [crypto, io])
695
696 foreach m : block_mods + softmmu_mods
697 shared_module(m.name(),
698 name_prefix: '',
699 link_whole: m,
700 install: true,
701 install_dir: config_host['qemu_moddir'])
702 endforeach
703
704 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
705 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
706
707 common_all = common_ss.apply(config_all, strict: false)
708 common_all = static_library('common',
709 build_by_default: false,
710 sources: common_all.sources() + genh,
711 dependencies: common_all.dependencies(),
712 name_suffix: 'fa')
713
714 foreach target : target_dirs
715 config_target = config_target_mak[target]
716 target_name = config_target['TARGET_NAME']
717 arch = config_target['TARGET_BASE_ARCH']
718 arch_srcs = []
719
720 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
721 if targetos == 'linux'
722 target_inc += include_directories('linux-headers', is_system: true)
723 endif
724 if target.endswith('-softmmu')
725 qemu_target_name = 'qemu-system-' + target_name
726 target_type='system'
727 arch_srcs += config_devices_h[target]
728 else
729 target_type='user'
730 qemu_target_name = 'qemu-' + target_name
731 if 'CONFIG_LINUX_USER' in config_target
732 base_dir = 'linux-user'
733 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
734 else
735 base_dir = 'bsd-user'
736 endif
737 target_inc += include_directories(
738 base_dir,
739 base_dir / config_target['TARGET_ABI_DIR'],
740 )
741 endif
742
743 target_common = common_ss.apply(config_target, strict: false)
744 objects = common_all.extract_objects(target_common.sources())
745
746 # TODO: Change to generator once obj-y goes away
747 config_target_h = custom_target(target + '-config-target.h',
748 input: meson.current_build_dir() / target / 'config-target.mak',
749 output: target + '-config-target.h',
750 capture: true,
751 command: [create_config, '@INPUT@'])
752
753 target_specific = specific_ss.apply(config_target, strict: false)
754 arch_srcs += target_specific.sources()
755
756 static_library('qemu-' + target,
757 sources: arch_srcs + [config_target_h] + genh,
758 objects: objects,
759 include_directories: target_inc,
760 c_args: ['-DNEED_CPU_H',
761 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
762 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
763 name_suffix: 'fa')
764 endforeach
765
766 # Other build targets
767
768 if 'CONFIG_GUEST_AGENT' in config_host
769 subdir('qga')
770 endif
771
772 if have_tools
773 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
774 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
775 qemu_io = executable('qemu-io', files('qemu-io.c'),
776 dependencies: [block, qemuutil], install: true)
777 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
778 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
779 dependencies: [block, qemuutil], install: true)
780 endif
781
782 subdir('contrib/rdmacm-mux')
783 subdir('contrib/elf2dmp')
784
785 if 'CONFIG_XKBCOMMON' in config_host
786 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
787 dependencies: [qemuutil, xkbcommon], install: true)
788 endif
789
790 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
791 dependencies: qemuutil,
792 install: true)
793
794 if 'CONFIG_VHOST_USER' in config_host
795 subdir('contrib/libvhost-user')
796 subdir('contrib/vhost-user-blk')
797 if 'CONFIG_LINUX' in config_host
798 subdir('contrib/vhost-user-gpu')
799 endif
800 subdir('contrib/vhost-user-input')
801 subdir('contrib/vhost-user-scsi')
802 endif
803
804 if targetos == 'linux'
805 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
806 dependencies: [qemuutil, libcap_ng],
807 install: true,
808 install_dir: get_option('libexecdir'))
809
810 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
811 dependencies: [authz, crypto, io, qom, qemuutil,
812 libcap_ng, libudev, libmpathpersist],
813 install: true)
814 endif
815
816 if 'CONFIG_IVSHMEM' in config_host
817 subdir('contrib/ivshmem-client')
818 subdir('contrib/ivshmem-server')
819 endif
820 endif
821
822 subdir('tools')
823 subdir('pc-bios')
824 subdir('tests')
825
826 summary_info = {}
827 summary_info += {'Install prefix': config_host['prefix']}
828 summary_info += {'BIOS directory': config_host['qemu_datadir']}
829 summary_info += {'firmware path': config_host['qemu_firmwarepath']}
830 summary_info += {'binary directory': config_host['bindir']}
831 summary_info += {'library directory': config_host['libdir']}
832 summary_info += {'module directory': config_host['qemu_moddir']}
833 summary_info += {'libexec directory': config_host['libexecdir']}
834 summary_info += {'include directory': config_host['includedir']}
835 summary_info += {'config directory': config_host['sysconfdir']}
836 if targetos != 'windows'
837 summary_info += {'local state directory': config_host['qemu_localstatedir']}
838 summary_info += {'Manual directory': config_host['mandir']}
839 else
840 summary_info += {'local state directory': 'queried at runtime'}
841 endif
842 summary_info += {'Build directory': meson.current_build_dir()}
843 summary_info += {'Source path': meson.current_source_dir()}
844 summary_info += {'GIT binary': config_host['GIT']}
845 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
846 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
847 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
848 if link_language == 'cpp'
849 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
850 else
851 summary_info += {'C++ compiler': false}
852 endif
853 if targetos == 'darwin'
854 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
855 endif
856 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
857 summary_info += {'CFLAGS': config_host['CFLAGS']}
858 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
859 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
860 summary_info += {'make': config_host['MAKE']}
861 summary_info += {'install': config_host['INSTALL']}
862 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
863 summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
864 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
865 # TODO: add back version
866 summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
867 if config_host.has_key('CONFIG_SLIRP')
868 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
869 endif
870 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
871 if config_host.has_key('CONFIG_MODULES')
872 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
873 endif
874 summary_info += {'host CPU': cpu}
875 summary_info += {'host endianness': build_machine.endian()}
876 summary_info += {'target list': config_host['TARGET_DIRS']}
877 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
878 summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
879 summary_info += {'strip binaries': get_option('strip')}
880 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
881 summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
882 if targetos == 'darwin'
883 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
884 endif
885 # TODO: add back version
886 summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
887 summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
888 # TODO: add back version
889 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
890 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
891 # TODO: add back version
892 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
893 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
894 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
895 # TODO: add back version
896 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
897 if config_host.has_key('CONFIG_GCRYPT')
898 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
899 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
900 endif
901 # TODO: add back version
902 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
903 if config_host.has_key('CONFIG_NETTLE')
904 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
905 endif
906 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
907 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
908 summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
909 summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
910 # TODO: add back version
911 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
912 summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
913 summary_info += {'mingw32 support': targetos == 'windows'}
914 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
915 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
916 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
917 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
918 summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
919 summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
920 if config_host.has_key('CONFIG_VNC')
921 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
922 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
923 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
924 endif
925 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
926 if config_host.has_key('CONFIG_XEN_BACKEND')
927 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
928 endif
929 summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
930 summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
931 summary_info += {'PIE': get_option('b_pie')}
932 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
933 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
934 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
935 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
936 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
937 summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
938 # TODO: add back KVM/HAX/HVF/WHPX/TCG
939 #summary_info += {'KVM support': have_kvm'}
940 #summary_info += {'HAX support': have_hax'}
941 #summary_info += {'HVF support': have_hvf'}
942 #summary_info += {'WHPX support': have_whpx'}
943 #summary_info += {'TCG support': have_tcg'}
944 #if get_option('tcg')
945 # summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
946 # summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
947 #endif
948 summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
949 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
950 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
951 summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
952 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
953 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
954 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
955 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
956 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
957 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
958 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
959 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
960 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
961 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
962 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
963 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
964 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
965 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
966 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
967 if config_host['TRACE_BACKENDS'].split().contains('simple')
968 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
969 endif
970 # TODO: add back protocol and server version
971 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
972 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
973 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
974 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
975 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
976 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
977 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
978 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
979 summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
980 summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
981 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
982 if targetos == 'windows'
983 if 'WIN_SDK' in config_host
984 summary_info += {'Windows SDK': config_host['WIN_SDK']}
985 endif
986 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
987 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
988 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
989 endif
990 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
991 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
992 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
993 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
994 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
995 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
996 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
997 summary_info += {'gcov': get_option('b_coverage')}
998 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
999 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1000 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1001 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1002 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1003 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1004 summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1005 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1006 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1007 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1008 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1009 summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1010 summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1011 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1012 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1013 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1014 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1015 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1016 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1017 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1018 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1019 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1020 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1021 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1022 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1023 summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1024 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1025 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1026 summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1027 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1028 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1029 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1030 if config_host.has_key('HAVE_GDB_BIN')
1031 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1032 endif
1033 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1034 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1035 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1036 summary(summary_info, bool_yn: true)
1037
1038 if not supported_cpus.contains(cpu)
1039 message()
1040 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1041 message()
1042 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1043 message('The QEMU project intends to remove support for this host CPU in')
1044 message('a future release if nobody volunteers to maintain it and to')
1045 message('provide a build host for our continuous integration setup.')
1046 message('configure has succeeded and you can continue to build, but')
1047 message('if you care about QEMU on this platform you should contact')
1048 message('us upstream at qemu-devel@nongnu.org.')
1049 endif
1050
1051 if not supported_oses.contains(targetos)
1052 message()
1053 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1054 message()
1055 message('Host OS ' + targetos + 'support is not currently maintained.')
1056 message('The QEMU project intends to remove support for this host OS in')
1057 message('a future release if nobody volunteers to maintain it and to')
1058 message('provide a build host for our continuous integration setup.')
1059 message('configure has succeeded and you can continue to build, but')
1060 message('if you care about QEMU on this platform you should contact')
1061 message('us upstream at qemu-devel@nongnu.org.')
1062 endif