]> git.ipfire.org Git - thirdparty/qemu.git/blame - meson.build
meson: qemu-{img,io,nbd}
[thirdparty/qemu.git] / meson.build
CommitLineData
a5665051
PB
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')
a81df1b6
PB
7ss = import('sourceset')
8
ce1c1e7a 9sh = find_program('sh')
a81df1b6 10cc = meson.get_compiler('c')
a5665051 11config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
2becc36a 12config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
3154fee4 13enable_modules = 'CONFIG_MODULES' in config_host
a5665051
PB
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
fc929892
MAL
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
a5665051
PB
30if host_machine.system() == 'darwin'
31 add_languages('objc', required: false, native: false)
32endif
33
968b4db3
PB
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
a5665051
PB
41configure_file(input: files('scripts/ninjatool.py'),
42 output: 'ninjatool',
43 configuration: config_host)
f9332757
PB
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
a81df1b6
PB
52m = cc.find_library('m', required: false)
53util = cc.find_library('util', required: false)
54socket = []
04c6f1e7 55version_res = []
d92989aa
MAL
56coref = []
57iokit = []
58cocoa = []
59hvf = []
a81df1b6
PB
60if targetos == 'windows'
61 socket = cc.find_library('ws2_32')
04c6f1e7
MAL
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('.'))
d92989aa
MAL
67elif 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')
cfad62f1
PB
72elif targetos == 'sunos'
73 socket = [cc.find_library('socket'),
74 cc.find_library('nsl'),
75 cc.find_library('resolv')]
76elif targetos == 'haiku'
77 socket = [cc.find_library('posix_error_mapper'),
78 cc.find_library('network'),
79 cc.find_library('bsd')]
a81df1b6
PB
80endif
81glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
82 link_args: config_host['GLIB_LIBS'].split())
83gio = not_found
84if 'CONFIG_GIO' in config_host
85 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
86 link_args: config_host['GIO_LIBS'].split())
87endif
88lttng = not_found
89if 'CONFIG_TRACE_UST' in config_host
90 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
91endif
92urcubp = not_found
93if 'CONFIG_TRACE_UST' in config_host
94 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
95endif
96nettle = not_found
97if 'CONFIG_NETTLE' in config_host
98 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
99 link_args: config_host['NETTLE_LIBS'].split())
100endif
101gnutls = not_found
102if 'CONFIG_GNUTLS' in config_host
103 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
104 link_args: config_host['GNUTLS_LIBS'].split())
105endif
ea458960
MAL
106pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
107 link_args: config_host['PIXMAN_LIBS'].split())
5e7fbd25
MAL
108pam = not_found
109if 'CONFIG_AUTH_PAM' in config_host
110 pam = cc.find_library('pam')
111endif
5e5733e5
MAL
112libaio = cc.find_library('aio', required: false)
113zlib = not_found
114if 'CONFIG_ZLIB' in config_host
115 zlib = declare_dependency(compile_args: config_host['ZLIB_CFLAGS'].split(),
116 link_args: config_host['ZLIB_LIBS'].split())
117endif
118linux_io_uring = not_found
119if '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())
122endif
123libxml2 = not_found
124if 'CONFIG_LIBXML2' in config_host
125 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
126 link_args: config_host['LIBXML2_LIBS'].split())
127endif
128libnfs = not_found
129if 'CONFIG_LIBNFS' in config_host
130 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
131endif
ec0d5893
MAL
132libattr = not_found
133if 'CONFIG_ATTR' in config_host
134 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
135endif
3f99cf57
PB
136seccomp = not_found
137if 'CONFIG_SECCOMP' in config_host
138 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
139 link_args: config_host['SECCOMP_LIBS'].split())
140endif
141libcap_ng = not_found
142if 'CONFIG_LIBCAP_NG' in config_host
143 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
144endif
ade60d4f
MAL
145xkbcommon = not_found
146if 'CONFIG_XKBCOMMON' in config_host
147 xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(),
148 link_args: config_host['XKBCOMMON_LIBS'].split())
149endif
5ee24e78 150rt = cc.find_library('rt', required: false)
99650b62
PB
151libiscsi = not_found
152if 'CONFIG_LIBISCSI' in config_host
153 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
154 link_args: config_host['LIBISCSI_LIBS'].split())
155endif
5e5733e5
MAL
156zstd = not_found
157if 'CONFIG_ZSTD' in config_host
158 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
159 link_args: config_host['ZSTD_LIBS'].split())
160endif
ea458960
MAL
161gbm = not_found
162if 'CONFIG_GBM' in config_host
163 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
164 link_args: config_host['GBM_LIBS'].split())
165endif
166virgl = not_found
167if 'CONFIG_VIRGL' in config_host
168 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
169 link_args: config_host['VIRGL_LIBS'].split())
170endif
1d7bb6ab
MAL
171curl = not_found
172if 'CONFIG_CURL' in config_host
173 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
174 link_args: config_host['CURL_LIBS'].split())
175endif
f15bff25
PB
176libudev = not_found
177if 'CONFIG_LIBUDEV' in config_host
178 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
179endif
5e5733e5
MAL
180rbd = not_found
181if 'CONFIG_RBD' in config_host
182 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
183endif
184glusterfs = not_found
185if 'CONFIG_GLUSTERFS' in config_host
186 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
187 link_args: config_host['GLUSTERFS_LIBS'].split())
188endif
189libssh = not_found
190if 'CONFIG_LIBSSH' in config_host
191 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
192 link_args: config_host['LIBSSH_LIBS'].split())
193endif
194libbzip2 = not_found
195if 'CONFIG_BZIP2' in config_host
196 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
197endif
198liblzfse = not_found
199if 'CONFIG_LZFSE' in config_host
200 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
201endif
a81df1b6 202
2becc36a
PB
203create_config = find_program('scripts/create_config')
204minikconf = find_program('scripts/minikconf.py')
a81df1b6
PB
205target_dirs = config_host['TARGET_DIRS'].split()
206have_user = false
207have_system = false
2becc36a
PB
208config_devices_mak_list = []
209config_devices_h = {}
210config_target_mak = {}
211kconfig_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]
a81df1b6
PB
225foreach target : target_dirs
226 have_user = have_user or target.endswith('-user')
2becc36a
PB
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}
a81df1b6
PB
258endforeach
259have_tools = 'CONFIG_TOOLS' in config_host
260have_block = have_system or have_tools
261
2becc36a
PB
262grepy = 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
272if 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)
280else
281 config_all_devices = {}
282endif
283config_all = config_all_devices
284config_all += config_host
285config_all += config_all_disas
286config_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
a81df1b6
PB
293# Generators
294
2c273f32 295genh = []
3f885659 296hxtool = find_program('scripts/hxtool')
650b5d54 297shaderinclude = find_program('scripts/shaderinclude.pl')
a81df1b6
PB
298qapi_gen = find_program('scripts/qapi-gen.py')
299qapi_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
318tracetool = [
319 python, files('scripts/tracetool.py'),
320 '--backend=' + config_host['TRACE_BACKENDS']
321]
322
2c273f32
MAL
323qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
324 meson.current_source_dir(),
325 config_host['PKGVERSION'], config_host['VERSION']]
326qemu_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)
332genh += qemu_version
333
2becc36a
PB
334config_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@'])
339genh += config_host_h
340
3f885659
MAL
341hxdep = []
342hx_headers = [
343 ['qemu-options.hx', 'qemu-options.def'],
344 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
345]
346if have_system
347 hx_headers += [
348 ['hmp-commands.hx', 'hmp-commands.h'],
349 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
350 ]
351endif
352foreach d : hx_headers
b7c70bf2 353 hxdep += custom_target(d[1],
3f885659
MAL
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@'])
359endforeach
360genh += hxdep
361
a81df1b6
PB
362# Collect sourcesets.
363
364util_ss = ss.source_set()
365stub_ss = ss.source_set()
366trace_ss = ss.source_set()
3154fee4 367block_ss = ss.source_set()
2becc36a
PB
368common_ss = ss.source_set()
369softmmu_ss = ss.source_set()
370user_ss = ss.source_set()
371bsd_user_ss = ss.source_set()
372linux_user_ss = ss.source_set()
373specific_ss = ss.source_set()
374
3154fee4 375modules = {}
2becc36a
PB
376hw_arch = {}
377target_arch = {}
378target_softmmu_arch = {}
a81df1b6
PB
379
380###############
381# Trace files #
382###############
383
384trace_events_subdirs = [
385 'accel/kvm',
386 'accel/tcg',
387 'crypto',
388 'monitor',
389]
390if have_user
391 trace_events_subdirs += [ 'linux-user' ]
392endif
393if have_block
394 trace_events_subdirs += [
395 'authz',
396 'block',
397 'io',
398 'nbd',
399 'scsi',
400 ]
401endif
402if 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 ]
458endif
459trace_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
a81df1b6
PB
474subdir('qapi')
475subdir('qobject')
476subdir('stubs')
477subdir('trace')
478subdir('util')
5582c58f
MAL
479subdir('qom')
480subdir('authz')
a81df1b6
PB
481subdir('crypto')
482subdir('storage-daemon')
2d78b56e 483subdir('ui')
a81df1b6 484
3154fee4
MAL
485
486if 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')
489endif
490
a81df1b6
PB
491# Build targets from sourcesets
492
2becc36a 493stub_ss = stub_ss.apply(config_all, strict: false)
a81df1b6
PB
494
495util_ss.add_all(trace_ss)
2becc36a 496util_ss = util_ss.apply(config_all, strict: false)
a81df1b6
PB
497libqemuutil = static_library('qemuutil',
498 sources: util_ss.sources() + stub_ss.sources() + genh,
499 dependencies: [util_ss.dependencies(), m, glib, socket])
500qemuutil = declare_dependency(link_with: libqemuutil,
04c6f1e7 501 sources: genh + version_res)
a81df1b6 502
7fcfd456 503subdir('io')
848e8ff6 504subdir('chardev')
ec0d5893 505subdir('fsdev')
d3b18480 506subdir('target')
ec0d5893 507
5e5733e5
MAL
508block_ss.add(files(
509 'block.c',
510 'blockjob.c',
511 'job.c',
512 'qemu-io-cmds.c',
513))
514block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
515
516subdir('nbd')
517subdir('scsi')
518subdir('block')
519
3154fee4
MAL
520block_mods = []
521softmmu_mods = []
522foreach 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
541endforeach
542
543nm = find_program('nm')
544undefsym = find_program('scripts/undefsym.sh')
545block_syms = custom_target('block.syms', output: 'block.syms',
546 input: [libqemuutil, block_mods],
547 capture: true,
548 command: [undefsym, nm, '@INPUT@'])
549qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
550 input: [libqemuutil, softmmu_mods],
551 capture: true,
552 command: [undefsym, nm, '@INPUT@'])
553
5e5733e5
MAL
554block_ss = block_ss.apply(config_host, strict: false)
555libblock = 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
561block = declare_dependency(link_whole: [libblock],
b7c70bf2
MAL
562 link_args: '@block.syms',
563 dependencies: [crypto, io])
5e5733e5 564
3154fee4
MAL
565foreach 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'])
571endforeach
572
2becc36a
PB
573common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
574common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
575
576common_all = common_ss.apply(config_all, strict: false)
577common_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
583foreach 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="@0@-config-target.h"'.format(target),
631 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
632 name_suffix: 'fa')
633endforeach
634
931049b4 635# Other build targets
f15bff25
PB
636if 'CONFIG_GUEST_AGENT' in config_host
637 subdir('qga')
638endif
639
931049b4 640if have_tools
b7c70bf2
MAL
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
a9c9727c 650 subdir('contrib/rdmacm-mux')
1d7bb6ab 651 subdir('contrib/elf2dmp')
a9c9727c 652
ade60d4f
MAL
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
157e7b13
MAL
658 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
659 dependencies: qemuutil,
660 install: true)
661
931049b4
PB
662 if 'CONFIG_VHOST_USER' in config_host
663 subdir('contrib/libvhost-user')
2d7ac0af 664 subdir('contrib/vhost-user-blk')
ea458960
MAL
665 if 'CONFIG_LINUX' in config_host
666 subdir('contrib/vhost-user-gpu')
667 endif
32fcc624 668 subdir('contrib/vhost-user-input')
99650b62 669 subdir('contrib/vhost-user-scsi')
931049b4 670 endif
8f51e01c
MAL
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
5ee24e78
MAL
679 if 'CONFIG_IVSHMEM' in config_host
680 subdir('contrib/ivshmem-client')
681 subdir('contrib/ivshmem-server')
682 endif
931049b4
PB
683endif
684
3f99cf57 685subdir('tools')
bdcbea7a 686subdir('pc-bios')
ce1c1e7a 687subdir('tests')
3f99cf57 688
f9332757
PB
689summary_info = {}
690summary_info += {'Install prefix': config_host['prefix']}
691summary_info += {'BIOS directory': config_host['qemu_datadir']}
692summary_info += {'firmware path': config_host['qemu_firmwarepath']}
693summary_info += {'binary directory': config_host['bindir']}
694summary_info += {'library directory': config_host['libdir']}
695summary_info += {'module directory': config_host['qemu_moddir']}
696summary_info += {'libexec directory': config_host['libexecdir']}
697summary_info += {'include directory': config_host['includedir']}
698summary_info += {'config directory': config_host['sysconfdir']}
699if targetos != 'windows'
700 summary_info += {'local state directory': config_host['qemu_localstatedir']}
701 summary_info += {'Manual directory': config_host['mandir']}
702else
703 summary_info += {'local state directory': 'queried at runtime'}
704endif
705summary_info += {'Build directory': meson.current_build_dir()}
706summary_info += {'Source path': meson.current_source_dir()}
707summary_info += {'GIT binary': config_host['GIT']}
708summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
709summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
710summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
711if link_language == 'cpp'
712 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
713else
714 summary_info += {'C++ compiler': false}
715endif
716if targetos == 'darwin'
717 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
718endif
719summary_info += {'ARFLAGS': config_host['ARFLAGS']}
720summary_info += {'CFLAGS': config_host['CFLAGS']}
721summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
722summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
723summary_info += {'make': config_host['MAKE']}
724summary_info += {'install': config_host['INSTALL']}
725summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
726summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
727summary_info += {'genisoimage': config_host['GENISOIMAGE']}
728# TODO: add back version
729summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
730if config_host.has_key('CONFIG_SLIRP')
731 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
732endif
733summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
734if config_host.has_key('CONFIG_MODULES')
735 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
736endif
737summary_info += {'host CPU': cpu}
738summary_info += {'host endianness': build_machine.endian()}
739summary_info += {'target list': config_host['TARGET_DIRS']}
740summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
741summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
742summary_info += {'strip binaries': get_option('strip')}
743summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
744summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
745if targetos == 'darwin'
746 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
747endif
748# TODO: add back version
749summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
750summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
751# TODO: add back version
752summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
753summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
754# TODO: add back version
755summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
756summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
757summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
758# TODO: add back version
759summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
760if 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')}
763endif
764# TODO: add back version
765summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
766if config_host.has_key('CONFIG_NETTLE')
767 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
768endif
769summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
770summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
771summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
772summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
773# TODO: add back version
774summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
775summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
776summary_info += {'mingw32 support': targetos == 'windows'}
777summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
778summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
779summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
780summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
781summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
782summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
783if 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')}
787endif
788summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
789if config_host.has_key('CONFIG_XEN_BACKEND')
790 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
791endif
792summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
793summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
794summary_info += {'PIE': get_option('b_pie')}
795summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
796summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
797summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
798summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
799summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
800summary_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
811summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
812summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
813summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
814summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
815summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
816summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
817summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
818summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
819summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
820summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
821summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
822summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
823summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
824summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
825summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
826summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
827summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
828summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
829summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
830if config_host['TRACE_BACKENDS'].split().contains('simple')
831 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
832endif
833# TODO: add back protocol and server version
834summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
835summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
836summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
837summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
838summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
839summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
840summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
841summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
842summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
843summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
844summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
845if 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')}
852endif
853summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
854summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
855summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
856summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
857summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
858summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
859summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
bf0e56a3 860summary_info += {'gcov': get_option('b_coverage')}
f9332757
PB
861summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
862summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
863summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
864summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
865summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
866summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
867summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
868summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
869summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
870summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
871summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
872summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
873summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
874summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
875summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
876summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
877summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
878summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
879summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
880summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
881summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
882summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
883summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
884summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
885summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
886summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
887summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
888summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
889summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
890summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
891summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
892summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
893if config_host.has_key('HAVE_GDB_BIN')
894 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
895endif
896summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
897summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
898summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
899summary(summary_info, bool_yn: true)
900
901if 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 qemu-devel@nongnu.org.')
912endif
913
914if 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 qemu-devel@nongnu.org.')
925endif