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