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