]> git.ipfire.org Git - thirdparty/qemu.git/blame - meson.build
meson: do not make qga/vss-win32/meson.build conditional on C++ presence
[thirdparty/qemu.git] / meson.build
CommitLineData
43a363ae 1project('qemu', ['c'], meson_version: '>=0.59.3',
654d6b04 2 default_options: ['warning_level=1', 'c_std=gnu11', 'cpp_std=gnu++11', 'b_colorout=auto',
3d2f73ef 3 'b_staticpic=false', 'stdsplit=false'],
654d6b04 4 version: files('VERSION'))
a5665051 5
98487b90
PB
6add_test_setup('quick', exclude_suites: ['block', 'slow', 'thorough'], is_default: true)
7add_test_setup('slow', exclude_suites: ['block', 'thorough'], env: ['G_TEST_SLOW=1', 'SPEED=slow'])
8add_test_setup('thorough', exclude_suites: ['block'], env: ['G_TEST_SLOW=1', 'SPEED=thorough'])
3d2f73ef 9
a5665051 10not_found = dependency('', required: false)
654d6b04 11keyval = import('keyval')
a81df1b6 12ss = import('sourceset')
8b18cdbf 13fs = import('fs')
a81df1b6 14
ce1c1e7a 15sh = find_program('sh')
a81df1b6 16cc = meson.get_compiler('c')
a5665051 17config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
3154fee4 18enable_modules = 'CONFIG_MODULES' in config_host
35be72ba 19enable_static = 'CONFIG_STATIC' in config_host
e3667660 20
d7dedf42
PB
21# Allow both shared and static libraries unless --enable-static
22static_kwargs = enable_static ? {'static': true} : {}
23
e3667660
YL
24# Temporary directory used for files created while
25# configure runs. Since it is in the build directory
26# we can safely blow away any previous version of it
27# (and we need not jump through hoops to try to delete
28# it when configure exits.)
29tmpdir = meson.current_build_dir() / 'meson-private/temp'
8fe11232
MAL
30
31if get_option('qemu_suffix').startswith('/')
32 error('qemu_suffix cannot start with a /')
33endif
34
16bf7a33 35qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
ab4c0996 36qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
491e74c1 37qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
16bf7a33
PB
38qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
39
40qemu_desktopdir = get_option('datadir') / 'applications'
41qemu_icondir = get_option('datadir') / 'icons'
42
859aef02
PB
43config_host_data = configuration_data()
44genh = []
b83a80e8 45qapi_trace_events = []
a5665051 46
20cf5cb4
PB
47bsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin']
48supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
49supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv', 'x86', 'x86_64',
50 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc', 'sparc64']
51
52cpu = host_machine.cpu_family()
53
54# Unify riscv* to a single family.
55if cpu in ['riscv32', 'riscv64']
56 cpu = 'riscv'
57endif
58
59targetos = host_machine.system()
60
760e4327 61target_dirs = config_host['TARGET_DIRS'].split()
dda2da6c
WL
62have_linux_user = false
63have_bsd_user = false
760e4327
PB
64have_system = false
65foreach target : target_dirs
dda2da6c
WL
66 have_linux_user = have_linux_user or target.endswith('linux-user')
67 have_bsd_user = have_bsd_user or target.endswith('bsd-user')
760e4327
PB
68 have_system = have_system or target.endswith('-softmmu')
69endforeach
dda2da6c 70have_user = have_linux_user or have_bsd_user
20cf5cb4
PB
71have_tools = get_option('tools') \
72 .disable_auto_if(not have_system) \
73 .allowed()
74have_ga = get_option('guest_agent') \
75 .disable_auto_if(not have_system and not have_tools) \
76 .require(targetos in ['sunos', 'linux', 'windows'],
77 error_message: 'unsupported OS for QEMU guest agent') \
78 .allowed()
760e4327
PB
79have_block = have_system or have_tools
80
201e8ed7
PB
81python = import('python').find_installation()
82
823eb013
PB
83if cpu not in supported_cpus
84 host_arch = 'unknown'
85elif cpu == 'x86'
86 host_arch = 'i386'
0e3ed77d
RH
87elif cpu == 'mips64'
88 host_arch = 'mips'
823eb013
PB
89else
90 host_arch = cpu
91endif
92
8a19980e
PB
93if cpu in ['x86', 'x86_64']
94 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
95elif cpu == 'aarch64'
96 kvm_targets = ['aarch64-softmmu']
97elif cpu == 's390x'
98 kvm_targets = ['s390x-softmmu']
99elif cpu in ['ppc', 'ppc64']
100 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
fbc5884c
HC
101elif cpu in ['mips', 'mips64']
102 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
fbf43c7d
YJ
103elif cpu in ['riscv']
104 kvm_targets = ['riscv32-softmmu', 'riscv64-softmmu']
8a19980e
PB
105else
106 kvm_targets = []
107endif
108
44d3d898 109kvm_targets_c = '""'
43a363ae 110if get_option('kvm').allowed() and targetos == 'linux'
e741aff0
IM
111 kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
112endif
113config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
114
8a19980e 115accelerator_targets = { 'CONFIG_KVM': kvm_targets }
844a06bb
AG
116
117if cpu in ['aarch64']
118 accelerator_targets += {
119 'CONFIG_HVF': ['aarch64-softmmu']
120 }
121endif
122
0c3e41d4 123if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
2a2d51bc 124 # i386 emulator provides xenpv machine type for multiple architectures
0c3e41d4
AB
125 accelerator_targets += {
126 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
127 }
128endif
8a19980e
PB
129if cpu in ['x86', 'x86_64']
130 accelerator_targets += {
131 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
8a19980e 132 'CONFIG_HVF': ['x86_64-softmmu'],
74a414a1 133 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
8a19980e
PB
134 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
135 }
136endif
137
a1b176f9
PB
138modular_tcg = []
139# Darwin does not support references to thread-local variables in modules
140if targetos != 'darwin'
141 modular_tcg = ['i386-softmmu', 'x86_64-softmmu']
142endif
dae0ec15 143
eae9a1d1 144edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
e49c0ef6
PB
145unpack_edk2_blobs = false
146foreach target : edk2_targets
147 if target in target_dirs
148 bzip2 = find_program('bzip2', required: get_option('install_blobs'))
149 unpack_edk2_blobs = bzip2.found()
150 break
151 endif
152endforeach
45b545dd 153
9c29b741
PB
154dtrace = not_found
155stap = not_found
156if 'dtrace' in get_option('trace_backends')
157 dtrace = find_program('dtrace', required: true)
158 stap = find_program('stap', required: false)
159 if stap.found()
160 # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
161 # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
162 # instead. QEMU --enable-modules depends on this because the SystemTap
163 # semaphores are linked into the main binary and not the module's shared
164 # object.
165 add_global_arguments('-DSTAP_SDT_V2',
166 native: false, language: ['c', 'cpp', 'objc'])
167 endif
168endif
169
201e8ed7
PB
170##################
171# Compiler flags #
172##################
173
8cc2d231
PB
174qemu_cflags = config_host['QEMU_CFLAGS'].split()
175qemu_cxxflags = config_host['QEMU_CXXFLAGS'].split()
176qemu_ldflags = config_host['QEMU_LDFLAGS'].split()
177
c55cf6ab
PB
178if get_option('gprof')
179 qemu_cflags += ['-p']
180 qemu_cxxflags += ['-p']
181 qemu_ldflags += ['-p']
182endif
183
ff9ed62b
AB
184# Specify linker-script with add_project_link_arguments so that it is not placed
185# within a linker --start-group/--end-group pair
537b7248
PB
186if get_option('fuzzing')
187 add_project_link_arguments(['-Wl,-T,',
188 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
189 native: false, language: ['c', 'cpp', 'objc'])
190
191 # Specify a filter to only instrument code that is directly related to
192 # virtual-devices.
193 configure_file(output: 'instrumentation-filter',
194 input: 'scripts/oss-fuzz/instrumentation-filter-template',
195 copy: true)
196 add_global_arguments(
197 cc.get_supported_arguments('-fsanitize-coverage-allowlist=instrumentation-filter'),
198 native: false, language: ['c', 'cpp', 'objc'])
199
200 if get_option('fuzzing_engine') == ''
201 # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
202 # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link
203 # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
204 # unable to bind the fuzzer-related callbacks added by instrumentation.
205 add_global_arguments('-fsanitize=fuzzer-no-link',
206 native: false, language: ['c', 'cpp', 'objc'])
207 add_global_link_arguments('-fsanitize=fuzzer-no-link',
ff9ed62b 208 native: false, language: ['c', 'cpp', 'objc'])
537b7248
PB
209 # For the actual fuzzer binaries, we need to link against the libfuzzer
210 # library. They need to be configurable, to support OSS-Fuzz
211 fuzz_exe_ldflags = ['-fsanitize=fuzzer']
212 else
213 # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
214 # the needed CFLAGS have already been provided
215 fuzz_exe_ldflags = get_option('fuzzing_engine').split()
216 endif
ff9ed62b
AB
217endif
218
8cc2d231
PB
219add_global_arguments(qemu_cflags, native: false, language: ['c', 'objc'])
220add_global_arguments(qemu_cxxflags, native: false, language: ['cpp'])
221add_global_link_arguments(qemu_ldflags, native: false, language: ['c', 'cpp', 'objc'])
a5665051 222
1e6e616d
PB
223if targetos == 'linux'
224 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
225 '-isystem', 'linux-headers',
226 language: ['c', 'cpp'])
227endif
228
23a77b2d 229add_project_arguments('-iquote', '.',
1e6e616d 230 '-iquote', meson.current_source_dir(),
1e6e616d
PB
231 '-iquote', meson.current_source_dir() / 'include',
232 '-iquote', meson.current_source_dir() / 'disas/libvixl',
233 language: ['c', 'cpp', 'objc'])
c46f76d1 234
fc929892
MAL
235link_language = meson.get_external_property('link_language', 'cpp')
236if link_language == 'cpp'
237 add_languages('cpp', required: true, native: false)
565174d0
PB
238 cxx = meson.get_compiler('cpp')
239 linker = cxx
240else
241 linker = cc
fc929892 242endif
a5665051
PB
243if host_machine.system() == 'darwin'
244 add_languages('objc', required: false, native: false)
245endif
246
deb62371
PB
247sparse = find_program('cgcc', required: get_option('sparse'))
248if sparse.found()
968b4db3
PB
249 run_target('sparse',
250 command: [find_program('scripts/check_sparse.py'),
deb62371
PB
251 'compile_commands.json', sparse.full_path(), '-Wbitwise',
252 '-Wno-transparent-union', '-Wno-old-initializer',
253 '-Wno-non-pointer-null'])
968b4db3
PB
254endif
255
6ec0e15d
PB
256###########################################
257# Target-specific checks and dependencies #
258###########################################
259
b7a75c8c 260# Fuzzing
537b7248
PB
261if get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
262 not cc.links('''
263 #include <stdint.h>
264 #include <sys/types.h>
265 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
266 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
267 ''',
268 args: ['-Werror', '-fsanitize=fuzzer'])
269 error('Your compiler does not support -fsanitize=fuzzer')
270endif
271
b7a75c8c 272# Tracing backends
9c29b741
PB
273if 'ftrace' in get_option('trace_backends') and targetos != 'linux'
274 error('ftrace is supported only on Linux')
275endif
276if 'syslog' in get_option('trace_backends') and not cc.compiles('''
277 #include <syslog.h>
278 int main(void) {
279 openlog("qemu", LOG_PID, LOG_DAEMON);
280 syslog(LOG_INFO, "configure");
281 return 0;
282 }''')
283 error('syslog is not supported on this system')
284endif
285
b7a75c8c 286# Miscellaneous Linux-only features
a436d6d4
PB
287get_option('mpath') \
288 .require(targetos == 'linux', error_message: 'Multipath is supported only on Linux')
6ec0e15d 289
a436d6d4
PB
290multiprocess_allowed = get_option('multiprocess') \
291 .require(targetos == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \
292 .allowed()
106ad1f9 293
0d04c4c9
PB
294have_tpm = get_option('tpm') \
295 .require(targetos != 'windows', error_message: 'TPM emulation only available on POSIX systems') \
296 .allowed()
297
b7a75c8c 298# Target-specific libraries and flags
7fa1c635 299libm = cc.find_library('m', required: false)
6d7c7c2d 300threads = dependency('threads')
a81df1b6 301util = cc.find_library('util', required: false)
4a96337d 302winmm = []
a81df1b6 303socket = []
04c6f1e7 304version_res = []
d92989aa
MAL
305coref = []
306iokit = []
b6c7cfd4 307emulator_link_args = []
74a414a1 308nvmm =not_found
8a19980e 309hvf = not_found
a6305081 310host_dsosuf = '.so'
a81df1b6
PB
311if targetos == 'windows'
312 socket = cc.find_library('ws2_32')
4a96337d 313 winmm = cc.find_library('winmm')
04c6f1e7
MAL
314
315 win = import('windows')
316 version_res = win.compile_resources('version.rc',
317 depend_files: files('pc-bios/qemu-nsis.ico'),
318 include_directories: include_directories('.'))
a6305081 319 host_dsosuf = '.dll'
d92989aa
MAL
320elif targetos == 'darwin'
321 coref = dependency('appleframeworks', modules: 'CoreFoundation')
14176c8d 322 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
a6305081 323 host_dsosuf = '.dylib'
cfad62f1
PB
324elif targetos == 'sunos'
325 socket = [cc.find_library('socket'),
326 cc.find_library('nsl'),
327 cc.find_library('resolv')]
328elif targetos == 'haiku'
329 socket = [cc.find_library('posix_error_mapper'),
330 cc.find_library('network'),
331 cc.find_library('bsd')]
b6c7cfd4 332elif targetos == 'openbsd'
43a363ae 333 if get_option('tcg').allowed() and target_dirs.length() > 0
b6c7cfd4
PB
334 # Disable OpenBSD W^X if available
335 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
336 endif
a81df1b6 337endif
6ec0e15d 338
b7a75c8c 339# Target-specific configuration of accelerators
8a19980e 340accelerators = []
43a363ae 341if get_option('kvm').allowed() and targetos == 'linux'
8a19980e
PB
342 accelerators += 'CONFIG_KVM'
343endif
43a363ae 344if get_option('xen').allowed() and 'CONFIG_XEN_BACKEND' in config_host
8a19980e 345 accelerators += 'CONFIG_XEN'
43a363ae 346 have_xen_pci_passthrough = get_option('xen_pci_passthrough').allowed() and targetos == 'linux'
8a19980e
PB
347else
348 have_xen_pci_passthrough = false
349endif
43a363ae 350if get_option('whpx').allowed() and targetos == 'windows'
57e2a1f8 351 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
8a19980e
PB
352 error('WHPX requires 64-bit host')
353 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
354 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
355 accelerators += 'CONFIG_WHPX'
356 endif
357endif
43a363ae 358if get_option('hvf').allowed()
8a19980e
PB
359 hvf = dependency('appleframeworks', modules: 'Hypervisor',
360 required: get_option('hvf'))
361 if hvf.found()
362 accelerators += 'CONFIG_HVF'
363 endif
364endif
43a363ae 365if get_option('hax').allowed()
8a19980e
PB
366 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
367 accelerators += 'CONFIG_HAX'
368 endif
369endif
74a414a1 370if targetos == 'netbsd'
0cc49650 371 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
74a414a1
RZ
372 if nvmm.found()
373 accelerators += 'CONFIG_NVMM'
374 endif
375endif
23a77b2d 376
823eb013 377tcg_arch = host_arch
43a363ae 378if get_option('tcg').allowed()
823eb013 379 if host_arch == 'unknown'
23a77b2d 380 if get_option('tcg_interpreter')
f1f727ac 381 warning('Unsupported CPU @0@, will use TCG with TCI (slow)'.format(cpu))
8a19980e
PB
382 else
383 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
384 endif
fa2f7b0b 385 elif get_option('tcg_interpreter')
1c282da3 386 warning('Use of the TCG interpreter is not recommended on this host')
fa2f7b0b
PMD
387 warning('architecture. There is a native TCG execution backend available')
388 warning('which provides substantially better performance and reliability.')
389 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
390 warning('configuration option on this architecture to use the native')
391 warning('backend.')
8a19980e 392 endif
23a77b2d
PB
393 if get_option('tcg_interpreter')
394 tcg_arch = 'tci'
823eb013 395 elif host_arch == 'sparc64'
23a77b2d 396 tcg_arch = 'sparc'
823eb013 397 elif host_arch == 'x86_64'
23a77b2d 398 tcg_arch = 'i386'
823eb013 399 elif host_arch == 'ppc64'
23a77b2d 400 tcg_arch = 'ppc'
23a77b2d
PB
401 endif
402 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
23a77b2d
PB
403 language: ['c', 'cpp', 'objc'])
404
8a19980e
PB
405 accelerators += 'CONFIG_TCG'
406 config_host += { 'CONFIG_TCG': 'y' }
407endif
408
409if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
410 error('KVM not available on this platform')
411endif
412if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
413 error('HVF not available on this platform')
414endif
74a414a1
RZ
415if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
416 error('NVMM not available on this platform')
417endif
8a19980e
PB
418if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
419 error('WHPX not available on this platform')
420endif
421if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
422 if 'CONFIG_XEN' in accelerators
423 error('Xen PCI passthrough not available on this platform')
424 else
425 error('Xen PCI passthrough requested but Xen not enabled')
426 endif
427endif
b4e312e9 428
6ec0e15d
PB
429################
430# Dependencies #
431################
432
215b0c2f
PB
433# The path to glib.h is added to all compilation commands. This was
434# grandfathered in from the QEMU Makefiles.
435add_project_arguments(config_host['GLIB_CFLAGS'].split(),
436 native: false, language: ['c', 'cpp', 'objc'])
953d5a9e 437glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
d83acfd0
MAL
438 link_args: config_host['GLIB_LIBS'].split(),
439 version: config_host['GLIB_VERSION'])
953d5a9e
MAL
440# override glib dep with the configure results (for subprojects)
441meson.override_dependency('glib-2.0', glib)
442
a81df1b6
PB
443gio = not_found
444if 'CONFIG_GIO' in config_host
445 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
d83acfd0
MAL
446 link_args: config_host['GIO_LIBS'].split(),
447 version: config_host['GLIB_VERSION'])
a81df1b6
PB
448endif
449lttng = not_found
9c29b741
PB
450if 'ust' in get_option('trace_backends')
451 lttng = dependency('lttng-ust', required: true, method: 'pkg-config',
452 kwargs: static_kwargs)
a81df1b6 453endif
b7612f45
PB
454pixman = not_found
455if have_system or have_tools
456 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
d7dedf42 457 method: 'pkg-config', kwargs: static_kwargs)
b7612f45 458endif
d7dedf42 459zlib = dependency('zlib', required: true, kwargs: static_kwargs)
53c22b68 460
ff66f3e5
PB
461libaio = not_found
462if not get_option('linux_aio').auto() or have_block
463 libaio = cc.find_library('aio', has_headers: ['libaio.h'],
464 required: get_option('linux_aio'),
465 kwargs: static_kwargs)
466endif
5e5733e5 467linux_io_uring = not_found
53c22b68 468if not get_option('linux_io_uring').auto() or have_block
a41b4fdc
DB
469 linux_io_uring = dependency('liburing', version: '>=0.3',
470 required: get_option('linux_io_uring'),
53c22b68 471 method: 'pkg-config', kwargs: static_kwargs)
5e5733e5 472endif
5e5733e5 473libnfs = not_found
30045c05
PB
474if not get_option('libnfs').auto() or have_block
475 libnfs = dependency('libnfs', version: '>=1.9.3',
476 required: get_option('libnfs'),
d7dedf42 477 method: 'pkg-config', kwargs: static_kwargs)
5e5733e5 478endif
f7f2d651
PB
479
480libattr_test = '''
481 #include <stddef.h>
482 #include <sys/types.h>
483 #ifdef CONFIG_LIBATTR
484 #include <attr/xattr.h>
485 #else
486 #include <sys/xattr.h>
487 #endif
488 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
489
ec0d5893 490libattr = not_found
f7f2d651 491have_old_libattr = false
43a363ae 492if get_option('attr').allowed()
f7f2d651
PB
493 if cc.links(libattr_test)
494 libattr = declare_dependency()
495 else
496 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
497 required: get_option('attr'),
d7dedf42 498 kwargs: static_kwargs)
f7f2d651
PB
499 if libattr.found() and not \
500 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
501 libattr = not_found
502 if get_option('attr').enabled()
503 error('could not link libattr')
504 else
505 warning('could not link libattr, disabling')
506 endif
507 else
508 have_old_libattr = libattr.found()
509 endif
510 endif
ec0d5893 511endif
f7f2d651 512
c1ec4941
PB
513cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
514if cocoa.found() and get_option('sdl').enabled()
515 error('Cocoa and SDL cannot be enabled at the same time')
516endif
517if cocoa.found() and get_option('gtk').enabled()
518 error('Cocoa and GTK+ cannot be enabled at the same time')
519endif
520
3f99cf57 521seccomp = not_found
90835c2b
PB
522if not get_option('seccomp').auto() or have_system or have_tools
523 seccomp = dependency('libseccomp', version: '>=2.3.0',
524 required: get_option('seccomp'),
d7dedf42 525 method: 'pkg-config', kwargs: static_kwargs)
3f99cf57 526endif
727c8bb8 527
3f99cf57 528libcap_ng = not_found
727c8bb8
PB
529if not get_option('cap_ng').auto() or have_system or have_tools
530 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
531 required: get_option('cap_ng'),
d7dedf42 532 kwargs: static_kwargs)
727c8bb8
PB
533endif
534if libcap_ng.found() and not cc.links('''
535 #include <cap-ng.h>
536 int main(void)
537 {
538 capng_capability_to_name(CAPNG_EFFECTIVE);
539 return 0;
540 }''', dependencies: libcap_ng)
541 libcap_ng = not_found
542 if get_option('cap_ng').enabled()
543 error('could not link libcap-ng')
544 else
545 warning('could not link libcap-ng, disabling')
546 endif
3f99cf57 547endif
727c8bb8 548
1917ec6d
PB
549if get_option('xkbcommon').auto() and not have_system and not have_tools
550 xkbcommon = not_found
551else
552 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
d7dedf42 553 method: 'pkg-config', kwargs: static_kwargs)
ade60d4f 554endif
e1723999 555
cdaf0722 556vde = not_found
e1723999
PB
557if not get_option('vde').auto() or have_system or have_tools
558 vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
559 required: get_option('vde'),
560 kwargs: static_kwargs)
561endif
562if vde.found() and not cc.links('''
563 #include <libvdeplug.h>
564 int main(void)
565 {
566 struct vde_open_args a = {0, 0, 0};
567 char s[] = "";
568 vde_open(s, s, &a);
569 return 0;
570 }''', dependencies: vde)
571 vde = not_found
572 if get_option('cap_ng').enabled()
573 error('could not link libvdeplug')
574 else
575 warning('could not link libvdeplug, disabling')
576 endif
cdaf0722 577endif
87430d5b 578
478e943f 579pulse = not_found
87430d5b
PB
580if not get_option('pa').auto() or (targetos == 'linux' and have_system)
581 pulse = dependency('libpulse', required: get_option('pa'),
582 method: 'pkg-config', kwargs: static_kwargs)
478e943f
PB
583endif
584alsa = not_found
87430d5b
PB
585if not get_option('alsa').auto() or (targetos == 'linux' and have_system)
586 alsa = dependency('alsa', required: get_option('alsa'),
587 method: 'pkg-config', kwargs: static_kwargs)
478e943f
PB
588endif
589jack = not_found
87430d5b
PB
590if not get_option('jack').auto() or have_system
591 jack = dependency('jack', required: get_option('jack'),
592 method: 'pkg-config', kwargs: static_kwargs)
478e943f 593endif
87430d5b 594
58d3f3ff 595spice_protocol = not_found
3f0a5d55
MAL
596if not get_option('spice_protocol').auto() or have_system
597 spice_protocol = dependency('spice-protocol', version: '>=0.12.3',
598 required: get_option('spice_protocol'),
599 method: 'pkg-config', kwargs: static_kwargs)
2634733c 600endif
3f0a5d55
MAL
601spice = not_found
602if not get_option('spice').auto() or have_system
603 spice = dependency('spice-server', version: '>=0.12.5',
604 required: get_option('spice'),
605 method: 'pkg-config', kwargs: static_kwargs)
58d3f3ff 606endif
3f0a5d55
MAL
607spice_headers = spice.partial_dependency(compile_args: true, includes: true)
608
5ee24e78 609rt = cc.find_library('rt', required: false)
a399f914 610
99650b62 611libiscsi = not_found
9db405a3
PB
612if not get_option('libiscsi').auto() or have_block
613 libiscsi = dependency('libiscsi', version: '>=1.9.0',
614 required: get_option('libiscsi'),
d7dedf42 615 method: 'pkg-config', kwargs: static_kwargs)
99650b62 616endif
5e5733e5 617zstd = not_found
b1def33d
PB
618if not get_option('zstd').auto() or have_block
619 zstd = dependency('libzstd', version: '>=1.4.0',
620 required: get_option('zstd'),
d7dedf42 621 method: 'pkg-config', kwargs: static_kwargs)
5e5733e5 622endif
ea458960 623virgl = not_found
0265fe9e
PB
624
625have_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found()
626if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
587d59d6
PB
627 virgl = dependency('virglrenderer',
628 method: 'pkg-config',
629 required: get_option('virglrenderer'),
630 kwargs: static_kwargs)
ea458960 631endif
1d7bb6ab 632curl = not_found
f9cd86fe
PB
633if not get_option('curl').auto() or have_block
634 curl = dependency('libcurl', version: '>=7.29.0',
635 method: 'pkg-config',
636 required: get_option('curl'),
d7dedf42 637 kwargs: static_kwargs)
1d7bb6ab 638endif
f15bff25 639libudev = not_found
f01496a3 640if targetos == 'linux' and (have_system or have_tools)
6ec0e15d 641 libudev = dependency('libudev',
a0fbbb6e 642 method: 'pkg-config',
5c53015a 643 required: get_option('libudev'),
d7dedf42 644 kwargs: static_kwargs)
6ec0e15d
PB
645endif
646
5c53015a 647mpathlibs = [libudev]
6ec0e15d
PB
648mpathpersist = not_found
649mpathpersist_new_api = false
43a363ae 650if targetos == 'linux' and have_tools and get_option('mpath').allowed()
6ec0e15d
PB
651 mpath_test_source_new = '''
652 #include <libudev.h>
653 #include <mpath_persist.h>
654 unsigned mpath_mx_alloc_len = 1024;
655 int logsink;
656 static struct config *multipath_conf;
657 extern struct udev *udev;
658 extern struct config *get_multipath_config(void);
659 extern void put_multipath_config(struct config *conf);
660 struct udev *udev;
661 struct config *get_multipath_config(void) { return multipath_conf; }
662 void put_multipath_config(struct config *conf) { }
663 int main(void) {
664 udev = udev_new();
665 multipath_conf = mpath_lib_init();
666 return 0;
667 }'''
668 mpath_test_source_old = '''
669 #include <libudev.h>
670 #include <mpath_persist.h>
671 unsigned mpath_mx_alloc_len = 1024;
672 int logsink;
673 int main(void) {
674 struct udev *udev = udev_new();
675 mpath_lib_init(udev);
676 return 0;
677 }'''
5c53015a
PB
678 libmpathpersist = cc.find_library('mpathpersist',
679 required: get_option('mpath'),
d7dedf42 680 kwargs: static_kwargs)
5c53015a
PB
681 if libmpathpersist.found()
682 mpathlibs += libmpathpersist
683 if enable_static
684 mpathlibs += cc.find_library('devmapper',
685 required: get_option('mpath'),
d7dedf42 686 kwargs: static_kwargs)
43b43a40 687 endif
5c53015a
PB
688 mpathlibs += cc.find_library('multipath',
689 required: get_option('mpath'),
d7dedf42 690 kwargs: static_kwargs)
5c53015a
PB
691 foreach lib: mpathlibs
692 if not lib.found()
693 mpathlibs = []
694 break
695 endif
696 endforeach
697 if mpathlibs.length() == 0
698 msg = 'Dependencies missing for libmpathpersist'
699 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
6ec0e15d
PB
700 mpathpersist = declare_dependency(dependencies: mpathlibs)
701 mpathpersist_new_api = true
702 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
703 mpathpersist = declare_dependency(dependencies: mpathlibs)
704 else
5c53015a
PB
705 msg = 'Cannot detect libmpathpersist API'
706 endif
707 if not mpathpersist.found()
6ec0e15d 708 if get_option('mpath').enabled()
5c53015a 709 error(msg)
6ec0e15d 710 else
5c53015a 711 warning(msg + ', disabling')
6ec0e15d
PB
712 endif
713 endif
714 endif
f15bff25 715endif
6ec0e15d 716
5285e593 717iconv = not_found
5285e593 718curses = not_found
43a363ae 719if have_system and get_option('curses').allowed()
925a40df 720 curses_test = '''
fbab8cc2
SW
721 #if defined(__APPLE__) || defined(__OpenBSD__)
722 #define _XOPEN_SOURCE_EXTENDED 1
723 #endif
925a40df
PB
724 #include <locale.h>
725 #include <curses.h>
726 #include <wchar.h>
727 int main(void) {
728 wchar_t wch = L'w';
729 setlocale(LC_ALL, "");
730 resize_term(0, 0);
731 addwstr(L"wide chars\n");
732 addnwstr(&wch, 1);
733 add_wch(WACS_DEGREE);
734 return 0;
735 }'''
736
ca31e307
YL
737 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
738 foreach curses_dep : curses_dep_list
739 if not curses.found()
740 curses = dependency(curses_dep,
741 required: false,
742 method: 'pkg-config',
d7dedf42 743 kwargs: static_kwargs)
ca31e307
YL
744 endif
745 endforeach
925a40df 746 msg = get_option('curses').enabled() ? 'curses library not found' : ''
fbab8cc2 747 curses_compile_args = ['-DNCURSES_WIDECHAR=1']
925a40df 748 if curses.found()
0dbce6ef
PB
749 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
750 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
925a40df
PB
751 else
752 msg = 'curses package not usable'
753 curses = not_found
5285e593
YL
754 endif
755 endif
925a40df 756 if not curses.found()
925a40df
PB
757 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
758 if targetos != 'windows' and not has_curses_h
759 message('Trying with /usr/include/ncursesw')
760 curses_compile_args += ['-I/usr/include/ncursesw']
761 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
762 endif
763 if has_curses_h
764 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
765 foreach curses_libname : curses_libname_list
5285e593
YL
766 libcurses = cc.find_library(curses_libname,
767 required: false,
d7dedf42 768 kwargs: static_kwargs)
925a40df
PB
769 if libcurses.found()
770 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
771 curses = declare_dependency(compile_args: curses_compile_args,
772 dependencies: [libcurses])
773 break
774 else
775 msg = 'curses library not usable'
776 endif
5285e593 777 endif
925a40df
PB
778 endforeach
779 endif
780 endif
43a363ae 781 if get_option('iconv').allowed()
925a40df
PB
782 foreach link_args : [ ['-liconv'], [] ]
783 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
784 # We need to use libiconv if available because mixing libiconv's headers with
785 # the system libc does not work.
786 # However, without adding glib to the dependencies -L/usr/local/lib will not be
787 # included in the command line and libiconv will not be found.
788 if cc.links('''
789 #include <iconv.h>
790 int main(void) {
791 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
792 return conv != (iconv_t) -1;
793 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
794 iconv = declare_dependency(link_args: link_args, dependencies: glib)
795 break
5285e593 796 endif
30fe76b1
PB
797 endforeach
798 endif
925a40df
PB
799 if curses.found() and not iconv.found()
800 if get_option('iconv').enabled()
801 error('iconv not available')
802 endif
803 msg = 'iconv required for curses UI but not available'
804 curses = not_found
805 endif
806 if not curses.found() and msg != ''
807 if get_option('curses').enabled()
808 error(msg)
30fe76b1 809 else
925a40df 810 warning(msg + ', disabling')
30fe76b1 811 endif
5285e593
YL
812 endif
813endif
814
2634733c 815brlapi = not_found
8c6d4ff4
PB
816if not get_option('brlapi').auto() or have_system
817 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
818 required: get_option('brlapi'),
d7dedf42 819 kwargs: static_kwargs)
8c6d4ff4
PB
820 if brlapi.found() and not cc.links('''
821 #include <brlapi.h>
822 #include <stddef.h>
823 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
824 brlapi = not_found
825 if get_option('brlapi').enabled()
826 error('could not link brlapi')
827 else
828 warning('could not link brlapi, disabling')
829 endif
830 endif
2634733c 831endif
35be72ba 832
760e4327 833sdl = not_found
c1ec4941 834if not get_option('sdl').auto() or (have_system and not cocoa.found())
d7dedf42 835 sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
760e4327
PB
836 sdl_image = not_found
837endif
35be72ba
PB
838if sdl.found()
839 # work around 2.0.8 bug
840 sdl = declare_dependency(compile_args: '-Wno-undef',
841 dependencies: sdl)
7161a433 842 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
d7dedf42 843 method: 'pkg-config', kwargs: static_kwargs)
35be72ba
PB
844else
845 if get_option('sdl_image').enabled()
a8dc2ace
ST
846 error('sdl-image required, but SDL was @0@'.format(
847 get_option('sdl').disabled() ? 'disabled' : 'not found'))
35be72ba
PB
848 endif
849 sdl_image = not_found
2634733c 850endif
35be72ba 851
5e5733e5 852rbd = not_found
fabd1e93
PB
853if not get_option('rbd').auto() or have_block
854 librados = cc.find_library('rados', required: get_option('rbd'),
d7dedf42 855 kwargs: static_kwargs)
fabd1e93
PB
856 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
857 required: get_option('rbd'),
d7dedf42 858 kwargs: static_kwargs)
c518d6c2
PB
859 if librados.found() and librbd.found()
860 if cc.links('''
861 #include <stdio.h>
862 #include <rbd/librbd.h>
863 int main(void) {
864 rados_t cluster;
865 rados_create(&cluster, NULL);
48672ac0
PL
866 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
867 #error
868 #endif
c518d6c2
PB
869 return 0;
870 }''', dependencies: [librbd, librados])
871 rbd = declare_dependency(dependencies: [librbd, librados])
872 elif get_option('rbd').enabled()
48672ac0 873 error('librbd >= 1.12.0 required')
c518d6c2 874 else
48672ac0 875 warning('librbd >= 1.12.0 not found, disabling')
c518d6c2 876 endif
fabd1e93 877 endif
5e5733e5 878endif
fabd1e93 879
5e5733e5 880glusterfs = not_found
08821ca2
PB
881glusterfs_ftruncate_has_stat = false
882glusterfs_iocb_has_stat = false
883if not get_option('glusterfs').auto() or have_block
884 glusterfs = dependency('glusterfs-api', version: '>=3',
885 required: get_option('glusterfs'),
d7dedf42 886 method: 'pkg-config', kwargs: static_kwargs)
08821ca2
PB
887 if glusterfs.found()
888 glusterfs_ftruncate_has_stat = cc.links('''
889 #include <glusterfs/api/glfs.h>
890
891 int
892 main(void)
893 {
894 /* new glfs_ftruncate() passes two additional args */
895 return glfs_ftruncate(NULL, 0, NULL, NULL);
896 }
897 ''', dependencies: glusterfs)
898 glusterfs_iocb_has_stat = cc.links('''
899 #include <glusterfs/api/glfs.h>
900
901 /* new glfs_io_cbk() passes two additional glfs_stat structs */
902 static void
903 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
904 {}
905
906 int
907 main(void)
908 {
909 glfs_io_cbk iocb = &glusterfs_iocb;
910 iocb(NULL, 0 , NULL, NULL, NULL);
911 return 0;
912 }
913 ''', dependencies: glusterfs)
914 endif
5e5733e5 915endif
e6a52b36 916
5e5733e5 917libssh = not_found
e6a52b36
TH
918if not get_option('libssh').auto() or have_block
919 libssh = dependency('libssh', version: '>=0.8.7',
920 method: 'pkg-config',
921 required: get_option('libssh'),
922 kwargs: static_kwargs)
5e5733e5 923endif
e6a52b36 924
5e5733e5 925libbzip2 = not_found
29ba6116
PB
926if not get_option('bzip2').auto() or have_block
927 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
928 required: get_option('bzip2'),
d7dedf42 929 kwargs: static_kwargs)
29ba6116
PB
930 if libbzip2.found() and not cc.links('''
931 #include <bzlib.h>
932 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
933 libbzip2 = not_found
934 if get_option('bzip2').enabled()
935 error('could not link libbzip2')
936 else
937 warning('could not link libbzip2, disabling')
938 endif
939 endif
5e5733e5 940endif
ecea3696 941
5e5733e5 942liblzfse = not_found
ecea3696
PB
943if not get_option('lzfse').auto() or have_block
944 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
945 required: get_option('lzfse'),
d7dedf42 946 kwargs: static_kwargs)
ecea3696
PB
947endif
948if liblzfse.found() and not cc.links('''
949 #include <lzfse.h>
950 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
951 liblzfse = not_found
952 if get_option('lzfse').enabled()
953 error('could not link liblzfse')
954 else
955 warning('could not link liblzfse, disabling')
956 endif
5e5733e5 957endif
ecea3696 958
478e943f 959oss = not_found
43a363ae 960if get_option('oss').allowed() and have_system
87430d5b
PB
961 if not cc.has_header('sys/soundcard.h')
962 # not found
963 elif targetos == 'netbsd'
964 oss = cc.find_library('ossaudio', required: get_option('oss'),
965 kwargs: static_kwargs)
966 else
967 oss = declare_dependency()
968 endif
969
970 if not oss.found()
971 if get_option('oss').enabled()
972 error('OSS not found')
87430d5b
PB
973 endif
974 endif
478e943f
PB
975endif
976dsound = not_found
87430d5b
PB
977if not get_option('dsound').auto() or (targetos == 'windows' and have_system)
978 if cc.has_header('dsound.h')
979 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
980 endif
981
982 if not dsound.found()
983 if get_option('dsound').enabled()
984 error('DirectSound not found')
87430d5b
PB
985 endif
986 endif
478e943f 987endif
87430d5b 988
478e943f 989coreaudio = not_found
87430d5b
PB
990if not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system)
991 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
992 required: get_option('coreaudio'))
2b1ccdf4 993endif
8bc5184d 994
2b1ccdf4
MAL
995opengl = not_found
996if 'CONFIG_OPENGL' in config_host
de2d3005
PB
997 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
998 link_args: config_host['OPENGL_LIBS'].split())
2b1ccdf4 999endif
8bc5184d
TH
1000gbm = not_found
1001if (have_system or have_tools) and (virgl.found() or opengl.found())
1002 gbm = dependency('gbm', method: 'pkg-config', required: false,
1003 kwargs: static_kwargs)
1004endif
0265fe9e 1005have_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and gbm.found()
1b695471 1006
57612511 1007gnutls = not_found
cc4c7c73 1008gnutls_crypto = not_found
abc14fd0 1009if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
cc4c7c73
DB
1010 # For general TLS support our min gnutls matches
1011 # that implied by our platform support matrix
1012 #
1013 # For the crypto backends, we look for a newer
1014 # gnutls:
1015 #
1016 # Version 3.6.8 is needed to get XTS
1017 # Version 3.6.13 is needed to get PBKDF
1018 # Version 3.6.14 is needed to get HW accelerated XTS
1019 #
1020 # If newer enough gnutls isn't available, we can
1021 # still use a different crypto backend to satisfy
1022 # the platform support requirements
1023 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1024 method: 'pkg-config',
1025 required: false,
1026 kwargs: static_kwargs)
1027 if gnutls_crypto.found()
1028 gnutls = gnutls_crypto
1029 else
1030 # Our min version if all we need is TLS
1031 gnutls = dependency('gnutls', version: '>=3.5.18',
1032 method: 'pkg-config',
1033 required: get_option('gnutls'),
1034 kwargs: static_kwargs)
1035 endif
57612511
PB
1036endif
1037
8bd0931f
DB
1038# We prefer use of gnutls for crypto, unless the options
1039# explicitly asked for nettle or gcrypt.
1040#
1041# If gnutls isn't available for crypto, then we'll prefer
1042# gcrypt over nettle for performance reasons.
57612511
PB
1043gcrypt = not_found
1044nettle = not_found
68014044 1045xts = 'none'
8bd0931f 1046
57612511
PB
1047if get_option('nettle').enabled() and get_option('gcrypt').enabled()
1048 error('Only one of gcrypt & nettle can be enabled')
57612511 1049endif
8bd0931f
DB
1050
1051# Explicit nettle/gcrypt request, so ignore gnutls for crypto
1052if get_option('nettle').enabled() or get_option('gcrypt').enabled()
cc4c7c73
DB
1053 gnutls_crypto = not_found
1054endif
57612511 1055
8bd0931f
DB
1056if not gnutls_crypto.found()
1057 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
1058 gcrypt = dependency('libgcrypt', version: '>=1.8',
1059 method: 'config-tool',
1060 required: get_option('gcrypt'),
1061 kwargs: static_kwargs)
1062 # Debian has removed -lgpg-error from libgcrypt-config
1063 # as it "spreads unnecessary dependencies" which in
1064 # turn breaks static builds...
1065 if gcrypt.found() and enable_static
1066 gcrypt = declare_dependency(dependencies: [
1067 gcrypt,
1068 cc.find_library('gpg-error', required: true, kwargs: static_kwargs)])
1069 endif
57612511 1070 endif
8bd0931f
DB
1071 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1072 nettle = dependency('nettle', version: '>=3.4',
1073 method: 'pkg-config',
1074 required: get_option('nettle'),
1075 kwargs: static_kwargs)
1076 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1077 xts = 'private'
1078 endif
57612511
PB
1079 endif
1080endif
1081
2b1ccdf4 1082gtk = not_found
1b695471 1083gtkx11 = not_found
c23d7b4e 1084vte = not_found
c1ec4941 1085if not get_option('gtk').auto() or (have_system and not cocoa.found())
1b695471
PB
1086 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1087 method: 'pkg-config',
1088 required: get_option('gtk'),
d7dedf42 1089 kwargs: static_kwargs)
1b695471
PB
1090 if gtk.found()
1091 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1092 method: 'pkg-config',
1093 required: false,
d7dedf42 1094 kwargs: static_kwargs)
1b695471 1095 gtk = declare_dependency(dependencies: [gtk, gtkx11])
c23d7b4e
PB
1096
1097 if not get_option('vte').auto() or have_system
1098 vte = dependency('vte-2.91',
1099 method: 'pkg-config',
1100 required: get_option('vte'),
1101 kwargs: static_kwargs)
1102 endif
1b695471 1103 endif
2b1ccdf4 1104endif
1b695471 1105
2b1ccdf4 1106x11 = not_found
9d49bcf6 1107if gtkx11.found()
1b695471 1108 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
d7dedf42 1109 kwargs: static_kwargs)
2b1ccdf4 1110endif
a0b93237 1111vnc = not_found
2b1ccdf4 1112png = not_found
2b1ccdf4 1113jpeg = not_found
2b1ccdf4 1114sasl = not_found
43a363ae 1115if get_option('vnc').allowed() and have_system
a0b93237
PB
1116 vnc = declare_dependency() # dummy dependency
1117 png = dependency('libpng', required: get_option('vnc_png'),
d7dedf42 1118 method: 'pkg-config', kwargs: static_kwargs)
8e242b3c 1119 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
d7dedf42 1120 method: 'pkg-config', kwargs: static_kwargs)
a0b93237
PB
1121 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
1122 required: get_option('vnc_sasl'),
d7dedf42 1123 kwargs: static_kwargs)
a0b93237
PB
1124 if sasl.found()
1125 sasl = declare_dependency(dependencies: sasl,
1126 compile_args: '-DSTRUCT_IOVEC_DEFINED')
1127 endif
478e943f 1128endif
241611ea 1129
05e391ae
PB
1130pam = not_found
1131if not get_option('auth_pam').auto() or have_system
1132 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
1133 required: get_option('auth_pam'),
1134 kwargs: static_kwargs)
1135endif
1136if pam.found() and not cc.links('''
1137 #include <stddef.h>
1138 #include <security/pam_appl.h>
1139 int main(void) {
1140 const char *service_name = "qemu";
1141 const char *user = "frank";
1142 const struct pam_conv pam_conv = { 0 };
1143 pam_handle_t *pamh = NULL;
1144 pam_start(service_name, user, &pam_conv, &pamh);
1145 return 0;
1146 }''', dependencies: pam)
1147 pam = not_found
1148 if get_option('auth_pam').enabled()
1149 error('could not link libpam')
1150 else
1151 warning('could not link libpam, disabling')
1152 endif
1153endif
1154
708eab42 1155snappy = not_found
241611ea
PB
1156if not get_option('snappy').auto() or have_system
1157 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
1158 required: get_option('snappy'),
d7dedf42 1159 kwargs: static_kwargs)
241611ea 1160endif
565174d0 1161if snappy.found() and not linker.links('''
241611ea
PB
1162 #include <snappy-c.h>
1163 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
1164 snappy = not_found
1165 if get_option('snappy').enabled()
1166 error('could not link libsnappy')
1167 else
1168 warning('could not link libsnappy, disabling')
1169 endif
708eab42 1170endif
0c32a0ae 1171
708eab42 1172lzo = not_found
0c32a0ae
PB
1173if not get_option('lzo').auto() or have_system
1174 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
1175 required: get_option('lzo'),
d7dedf42 1176 kwargs: static_kwargs)
0c32a0ae
PB
1177endif
1178if lzo.found() and not cc.links('''
1179 #include <lzo/lzo1x.h>
1180 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
1181 lzo = not_found
1182 if get_option('lzo').enabled()
1183 error('could not link liblzo2')
1184 else
1185 warning('could not link liblzo2, disabling')
1186 endif
708eab42 1187endif
0c32a0ae 1188
488a8c73
PB
1189numa = not_found
1190if not get_option('numa').auto() or have_system or have_tools
1191 numa = cc.find_library('numa', has_headers: ['numa.h'],
1192 required: get_option('numa'),
1193 kwargs: static_kwargs)
1194endif
1195if numa.found() and not cc.links('''
1196 #include <numa.h>
1197 int main(void) { return numa_available(); }
1198 ''', dependencies: numa)
1199 numa = not_found
1200 if get_option('numa').enabled()
1201 error('could not link numa')
1202 else
1203 warning('could not link numa, disabling')
1204 endif
1205endif
1206
55166230
MAL
1207rdma = not_found
1208if 'CONFIG_RDMA' in config_host
1209 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
1210endif
582ea95f
MAL
1211xen = not_found
1212if 'CONFIG_XEN_BACKEND' in config_host
1213 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
1214 link_args: config_host['XEN_LIBS'].split())
1215endif
06677ce1 1216cacard = not_found
5f364c57
PB
1217if not get_option('smartcard').auto() or have_system
1218 cacard = dependency('libcacard', required: get_option('smartcard'),
1219 version: '>=2.5.1', method: 'pkg-config',
1220 kwargs: static_kwargs)
06677ce1 1221endif
0a40bcb7
CB
1222u2f = not_found
1223if have_system
1224 u2f = dependency('u2f-emu', required: get_option('u2f'),
1225 method: 'pkg-config',
d7dedf42 1226 kwargs: static_kwargs)
0a40bcb7 1227endif
06677ce1 1228usbredir = not_found
18f31e60
PB
1229if not get_option('usb_redir').auto() or have_system
1230 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
1231 version: '>=0.6', method: 'pkg-config',
1232 kwargs: static_kwargs)
06677ce1
PB
1233endif
1234libusb = not_found
90540f32
PB
1235if not get_option('libusb').auto() or have_system
1236 libusb = dependency('libusb-1.0', required: get_option('libusb'),
1237 version: '>=1.0.13', method: 'pkg-config',
1238 kwargs: static_kwargs)
06677ce1 1239endif
90540f32 1240
c9322ab5 1241libpmem = not_found
e36e8c70
PB
1242if not get_option('libpmem').auto() or have_system
1243 libpmem = dependency('libpmem', required: get_option('libpmem'),
1244 method: 'pkg-config', kwargs: static_kwargs)
c9322ab5 1245endif
c7c91a74 1246libdaxctl = not_found
83ef1682
PB
1247if not get_option('libdaxctl').auto() or have_system
1248 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
1249 version: '>=57', method: 'pkg-config',
1250 kwargs: static_kwargs)
c7c91a74 1251endif
8ce0a45f 1252tasn1 = not_found
ba7ed407
PB
1253if gnutls.found()
1254 tasn1 = dependency('libtasn1',
1255 method: 'pkg-config',
1256 kwargs: static_kwargs)
8ce0a45f 1257endif
af04e89d 1258keyutils = dependency('libkeyutils', required: false,
d7dedf42 1259 method: 'pkg-config', kwargs: static_kwargs)
a81df1b6 1260
3909def8
MAL
1261has_gettid = cc.has_function('gettid')
1262
3d212b41
RJ
1263# libselinux
1264selinux = dependency('libselinux',
1265 required: get_option('selinux'),
1266 method: 'pkg-config', kwargs: static_kwargs)
1267
aa087962
PB
1268# Malloc tests
1269
1270malloc = []
1271if get_option('malloc') == 'system'
1272 has_malloc_trim = \
43a363ae 1273 get_option('malloc_trim').allowed() and \
aa087962
PB
1274 cc.links('''#include <malloc.h>
1275 int main(void) { malloc_trim(0); return 0; }''')
1276else
1277 has_malloc_trim = false
1278 malloc = cc.find_library(get_option('malloc'), required: true)
1279endif
1280if not has_malloc_trim and get_option('malloc_trim').enabled()
1281 if get_option('malloc') == 'system'
1282 error('malloc_trim not available on this platform.')
1283 else
1284 error('malloc_trim not available with non-libc memory allocator')
1285 endif
1286endif
1287
84e319a5
HR
1288# Check whether the glibc provides statx()
1289
e66420ac 1290gnu_source_prefix = '''
84e319a5
HR
1291 #ifndef _GNU_SOURCE
1292 #define _GNU_SOURCE
1293 #endif
e66420ac
PB
1294'''
1295statx_test = gnu_source_prefix + '''
84e319a5
HR
1296 #include <sys/stat.h>
1297 int main(void) {
1298 struct statx statxbuf;
1299 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
1300 return 0;
1301 }'''
1302
1303has_statx = cc.links(statx_test)
1304
a436d6d4
PB
1305have_vhost_user_blk_server = get_option('vhost_user_blk_server') \
1306 .require(targetos == 'linux',
1307 error_message: 'vhost_user_blk_server requires linux') \
1308 .require('CONFIG_VHOST_USER' in config_host,
1309 error_message: 'vhost_user_blk_server requires vhost-user support') \
1310 .disable_auto_if(not have_system) \
1311 .allowed()
9e62ba48 1312
df4ea709
HR
1313if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1314 error('Cannot enable fuse-lseek while fuse is disabled')
1315endif
1316
a484a719
HR
1317fuse = dependency('fuse3', required: get_option('fuse'),
1318 version: '>=3.1', method: 'pkg-config',
d7dedf42 1319 kwargs: static_kwargs)
a484a719 1320
df4ea709 1321fuse_lseek = not_found
43a363ae 1322if get_option('fuse_lseek').allowed()
df4ea709
HR
1323 if fuse.version().version_compare('>=3.8')
1324 # Dummy dependency
1325 fuse_lseek = declare_dependency()
1326 elif get_option('fuse_lseek').enabled()
1327 if fuse.found()
1328 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1329 else
1330 error('fuse-lseek requires libfuse, which was not found')
1331 endif
1332 endif
1333endif
1334
46627f41
AM
1335# libbpf
1336libbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
1337if libbpf.found() and not cc.links('''
1338 #include <bpf/libbpf.h>
1339 int main(void)
1340 {
1341 bpf_object__destroy_skeleton(NULL);
1342 return 0;
1343 }''', dependencies: libbpf)
1344 libbpf = not_found
1345 if get_option('bpf').enabled()
1346 error('libbpf skeleton test failed')
1347 else
1348 warning('libbpf skeleton test failed, disabling')
1349 endif
1350endif
1351
87430d5b
PB
1352#################
1353# config-host.h #
1354#################
1355
1356audio_drivers_selected = []
1357if have_system
1358 audio_drivers_available = {
1359 'alsa': alsa.found(),
1360 'coreaudio': coreaudio.found(),
1361 'dsound': dsound.found(),
1362 'jack': jack.found(),
1363 'oss': oss.found(),
1364 'pa': pulse.found(),
1365 'sdl': sdl.found(),
1366 }
e5424a29
PB
1367 foreach k, v: audio_drivers_available
1368 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
1369 endforeach
87430d5b
PB
1370
1371 # Default to native drivers first, OSS second, SDL third
1372 audio_drivers_priority = \
1373 [ 'pa', 'coreaudio', 'dsound', 'oss' ] + \
1374 (targetos == 'linux' ? [] : [ 'sdl' ])
1375 audio_drivers_default = []
1376 foreach k: audio_drivers_priority
1377 if audio_drivers_available[k]
1378 audio_drivers_default += k
1379 endif
1380 endforeach
1381
1382 foreach k: get_option('audio_drv_list')
1383 if k == 'default'
1384 audio_drivers_selected += audio_drivers_default
1385 elif not audio_drivers_available[k]
1386 error('Audio driver "@0@" not available.'.format(k))
1387 else
1388 audio_drivers_selected += k
1389 endif
1390 endforeach
1391endif
87430d5b
PB
1392config_host_data.set('CONFIG_AUDIO_DRIVERS',
1393 '"' + '", "'.join(audio_drivers_selected) + '", ')
1394
9e62ba48
DB
1395if get_option('cfi')
1396 cfi_flags=[]
1397 # Check for dependency on LTO
1398 if not get_option('b_lto')
1399 error('Selected Control-Flow Integrity but LTO is disabled')
1400 endif
1401 if config_host.has_key('CONFIG_MODULES')
1402 error('Selected Control-Flow Integrity is not compatible with modules')
1403 endif
1404 # Check for cfi flags. CFI requires LTO so we can't use
1405 # get_supported_arguments, but need a more complex "compiles" which allows
1406 # custom arguments
1407 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1408 args: ['-flto', '-fsanitize=cfi-icall'] )
1409 cfi_flags += '-fsanitize=cfi-icall'
1410 else
1411 error('-fsanitize=cfi-icall is not supported by the compiler')
1412 endif
1413 if cc.compiles('int main () { return 0; }',
1414 name: '-fsanitize-cfi-icall-generalize-pointers',
1415 args: ['-flto', '-fsanitize=cfi-icall',
1416 '-fsanitize-cfi-icall-generalize-pointers'] )
1417 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1418 else
1419 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1420 endif
1421 if get_option('cfi_debug')
1422 if cc.compiles('int main () { return 0; }',
1423 name: '-fno-sanitize-trap=cfi-icall',
1424 args: ['-flto', '-fsanitize=cfi-icall',
1425 '-fno-sanitize-trap=cfi-icall'] )
1426 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1427 else
1428 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1429 endif
1430 endif
5fc0617f
MAL
1431 add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1432 add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
9e62ba48
DB
1433endif
1434
14176c8d
JD
1435have_host_block_device = (targetos != 'darwin' or
1436 cc.has_header('IOKit/storage/IOMedia.h'))
1437
a436d6d4
PB
1438# FIXME enable_modules shouldn't be necessary, but: https://github.com/mesonbuild/meson/issues/8333
1439dbus_display = get_option('dbus_display') \
1440 .require(gio.version().version_compare('>=2.64'),
1441 error_message: '-display dbus requires glib>=2.64') \
1442 .require(enable_modules,
1443 error_message: '-display dbus requires --enable-modules') \
1444 .require(config_host.has_key('GDBUS_CODEGEN'),
1445 error_message: '-display dbus requires gdbus-codegen') \
1446 .allowed()
1447
1448have_virtfs = get_option('virtfs') \
1449 .require(targetos == 'linux',
1450 error_message: 'virtio-9p (virtfs) requires Linux') \
1451 .require(libattr.found() and libcap_ng.found(),
1452 error_message: 'virtio-9p (virtfs) requires libcap-ng-devel and libattr-devel') \
1453 .disable_auto_if(not have_tools and not have_system) \
1454 .allowed()
69202b40 1455
3a489d38
PMD
1456have_virtfs_proxy_helper = have_virtfs and have_tools
1457
9c29b741
PB
1458foreach k : get_option('trace_backends')
1459 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
1460endforeach
1461config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
1462
16bf7a33
PB
1463config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1464config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1465config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1466config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1467config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
1468config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
1469config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1470config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1471config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1472config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1473config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1474config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1475
35acbb30
PB
1476have_slirp_smbd = get_option('slirp_smbd') \
1477 .require(targetos != 'windows', error_message: 'Host smbd not supported on this platform.') \
1478 .allowed()
1479if have_slirp_smbd
1480 smbd_path = get_option('smbd')
1481 if smbd_path == ''
1482 smbd_path = (targetos == 'solaris' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
1483 endif
1484 config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
1485endif
1486
823eb013
PB
1487config_host_data.set('HOST_' + host_arch.to_upper(), 1)
1488
f7f2d651 1489config_host_data.set('CONFIG_ATTR', libattr.found())
c55cf6ab 1490config_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
8c6d4ff4 1491config_host_data.set('CONFIG_BRLAPI', brlapi.found())
b4e312e9 1492config_host_data.set('CONFIG_COCOA', cocoa.found())
537b7248 1493config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
af2bb99b 1494config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
f01496a3 1495config_host_data.set('CONFIG_LIBUDEV', libudev.found())
0c32a0ae 1496config_host_data.set('CONFIG_LZO', lzo.found())
6ec0e15d
PB
1497config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1498config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
f9cd86fe 1499config_host_data.set('CONFIG_CURL', curl.found())
5285e593 1500config_host_data.set('CONFIG_CURSES', curses.found())
8bc5184d 1501config_host_data.set('CONFIG_GBM', gbm.found())
08821ca2
PB
1502config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1503if glusterfs.found()
1504 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1505 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1506 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1507 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1508 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1509 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1510endif
1b695471 1511config_host_data.set('CONFIG_GTK', gtk.found())
c23d7b4e 1512config_host_data.set('CONFIG_VTE', vte.found())
f7f2d651 1513config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
727c8bb8 1514config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
46627f41 1515config_host_data.set('CONFIG_EBPF', libbpf.found())
63a7f853 1516config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
9db405a3 1517config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
30045c05 1518config_host_data.set('CONFIG_LIBNFS', libnfs.found())
e6a52b36 1519config_host_data.set('CONFIG_LIBSSH', libssh.found())
ff66f3e5 1520config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
63a7f853
PB
1521config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
1522config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
488a8c73 1523config_host_data.set('CONFIG_NUMA', numa.found())
c55cf6ab 1524config_host_data.set('CONFIG_PROFILER', get_option('profiler'))
fabd1e93 1525config_host_data.set('CONFIG_RBD', rbd.found())
35be72ba
PB
1526config_host_data.set('CONFIG_SDL', sdl.found())
1527config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
90835c2b 1528config_host_data.set('CONFIG_SECCOMP', seccomp.found())
241611ea 1529config_host_data.set('CONFIG_SNAPPY', snappy.found())
0d04c4c9 1530config_host_data.set('CONFIG_TPM', have_tpm)
90540f32 1531config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
e1723999 1532config_host_data.set('CONFIG_VDE', vde.found())
e5e856c1 1533config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
a0b93237
PB
1534config_host_data.set('CONFIG_VNC', vnc.found())
1535config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1536config_host_data.set('CONFIG_VNC_PNG', png.found())
1537config_host_data.set('CONFIG_VNC_SASL', sasl.found())
69202b40 1538config_host_data.set('CONFIG_VIRTFS', have_virtfs)
63a7f853 1539config_host_data.set('CONFIG_VTE', vte.found())
4113f4cf 1540config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
af04e89d 1541config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
3909def8 1542config_host_data.set('CONFIG_GETTID', has_gettid)
57612511 1543config_host_data.set('CONFIG_GNUTLS', gnutls.found())
cc4c7c73 1544config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
57612511
PB
1545config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
1546config_host_data.set('CONFIG_NETTLE', nettle.found())
1547config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
aa087962 1548config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
84e319a5 1549config_host_data.set('CONFIG_STATX', has_statx)
b1def33d 1550config_host_data.set('CONFIG_ZSTD', zstd.found())
a484a719 1551config_host_data.set('CONFIG_FUSE', fuse.found())
df4ea709 1552config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
3f0a5d55 1553config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
ddece465
MAL
1554if spice_protocol.found()
1555config_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
1556config_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
1557config_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
1558endif
3f0a5d55 1559config_host_data.set('CONFIG_SPICE', spice.found())
9d71037f 1560config_host_data.set('CONFIG_X11', x11.found())
142ca628 1561config_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
9e62ba48 1562config_host_data.set('CONFIG_CFI', get_option('cfi'))
3d212b41 1563config_host_data.set('CONFIG_SELINUX', selinux.found())
859aef02
PB
1564config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1565config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1566config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1567config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1568
a6305081 1569config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
69d8de7a 1570config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
269506d2 1571config_host_data.set('HOST_WORDS_BIGENDIAN', host_machine.endian() == 'big')
69d8de7a 1572
728c0a2f
PB
1573have_coroutine_pool = get_option('coroutine_pool')
1574if get_option('debug_stack_usage') and have_coroutine_pool
1575 message('Disabling coroutine pool to measure stack usage')
1576 have_coroutine_pool = false
1577endif
1578config_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool)
c55cf6ab 1579config_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
728c0a2f 1580config_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
c55cf6ab 1581config_host_data.set('CONFIG_GPROF', get_option('gprof'))
406523f6 1582config_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed())
c55cf6ab 1583config_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
406523f6
PB
1584config_host_data.set('CONFIG_REPLICATION', get_option('live_block_migration').allowed())
1585
69d8de7a 1586# has_header
e66420ac 1587config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
d47a8b3b
PB
1588config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
1589config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
48f670ec 1590config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
2964be52 1591config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
2802d91d 1592config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
69d8de7a 1593config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
ded5d78c 1594config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
4a9d5f89 1595config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
ded5d78c 1596
69d8de7a 1597# has_function
a620fbe9 1598config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
e66420ac
PB
1599config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
1600config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
1601config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
1602config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
e1fbd2c4 1603config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign'))
e66420ac 1604config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
2b9f74ef 1605config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
ed3b3f17 1606config_host_data.set('CONFIG_SEM_TIMEDWAIT', cc.has_function('sem_timedwait', dependencies: threads))
e66420ac
PB
1607config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
1608config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
1609config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
1610config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
1611config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
be7e89f6 1612config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
e66420ac 1613config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
ed3b3f17 1614config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
69d8de7a 1615config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
911965ac
LZ
1616if rdma.found()
1617 config_host_data.set('HAVE_IBV_ADVISE_MR',
1618 cc.has_function('ibv_advise_mr',
1619 args: config_host['RDMA_LIBS'].split(),
1620 prefix: '#include <infiniband/verbs.h>'))
1621endif
2b9f74ef 1622
e66420ac
PB
1623# has_header_symbol
1624config_host_data.set('CONFIG_BYTESWAP_H',
1625 cc.has_header_symbol('byteswap.h', 'bswap_32'))
1626config_host_data.set('CONFIG_EPOLL_CREATE1',
1627 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
d47a8b3b
PB
1628config_host_data.set('CONFIG_HAS_ENVIRON',
1629 cc.has_header_symbol('unistd.h', 'environ', prefix: gnu_source_prefix))
e66420ac
PB
1630config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
1631 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
1632 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
1633config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
1634 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
1635config_host_data.set('CONFIG_FIEMAP',
1636 cc.has_header('linux/fiemap.h') and
1637 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
be7e89f6
PB
1638config_host_data.set('CONFIG_GETRANDOM',
1639 cc.has_function('getrandom') and
1640 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
a620fbe9
PB
1641config_host_data.set('CONFIG_INOTIFY',
1642 cc.has_header_symbol('sys/inotify.h', 'inotify_init'))
1643config_host_data.set('CONFIG_INOTIFY1',
1644 cc.has_header_symbol('sys/inotify.h', 'inotify_init1'))
e66420ac
PB
1645config_host_data.set('CONFIG_MACHINE_BSWAP_H',
1646 cc.has_header_symbol('machine/bswap.h', 'bswap32',
1647 prefix: '''#include <sys/endian.h>
1648 #include <sys/types.h>'''))
1649config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
1650 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
be7e89f6
PB
1651config_host_data.set('CONFIG_RTNETLINK',
1652 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
1653config_host_data.set('CONFIG_SYSMACROS',
1654 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
e1fbd2c4
PB
1655config_host_data.set('HAVE_OPTRESET',
1656 cc.has_header_symbol('getopt.h', 'optreset'))
653163fc
MAL
1657config_host_data.set('HAVE_IPPROTO_MPTCP',
1658 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
e66420ac
PB
1659
1660# has_member
1661config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
1662 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
1663 prefix: '#include <signal.h>'))
ed3b3f17
PB
1664config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
1665 cc.has_member('struct stat', 'st_atim',
1666 prefix: '#include <sys/stat.h>'))
e66420ac 1667
6a23f819
PB
1668# has_type
1669config_host_data.set('CONFIG_IOVEC',
1670 cc.has_type('struct iovec',
1671 prefix: '#include <sys/uio.h>'))
1672config_host_data.set('HAVE_UTMPX',
1673 cc.has_type('struct utmpx',
1674 prefix: '#include <utmpx.h>'))
1675
904ad5ec 1676config_host_data.set('CONFIG_EVENTFD', cc.links('''
e1fbd2c4
PB
1677 #include <sys/eventfd.h>
1678 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
904ad5ec 1679config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
e1fbd2c4
PB
1680 #include <unistd.h>
1681 int main(void) {
1682 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
1683 return fdatasync(0);
1684 #else
1685 #error Not supported
1686 #endif
1687 }'''))
904ad5ec 1688config_host_data.set('CONFIG_MADVISE', cc.links(gnu_source_prefix + '''
e1fbd2c4
PB
1689 #include <sys/types.h>
1690 #include <sys/mman.h>
1691 #include <stddef.h>
1692 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }'''))
904ad5ec 1693config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
e1fbd2c4
PB
1694 #include <sys/mman.h>
1695 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
904ad5ec 1696config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
d47a8b3b
PB
1697 #include <fcntl.h>
1698 #if !defined(AT_EMPTY_PATH)
1699 # error missing definition
1700 #else
1701 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
1702 #endif'''))
904ad5ec 1703config_host_data.set('CONFIG_PIPE2', cc.links(gnu_source_prefix + '''
a620fbe9
PB
1704 #include <unistd.h>
1705 #include <fcntl.h>
1706
1707 int main(void)
1708 {
1709 int pipefd[2];
1710 return pipe2(pipefd, O_CLOEXEC);
1711 }'''))
904ad5ec 1712config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
e1fbd2c4
PB
1713 #include <sys/mman.h>
1714 #include <stddef.h>
1715 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
10f6b231 1716
6a23f819 1717config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
10f6b231
PB
1718 #include <pthread.h>
1719
1720 static void *f(void *p) { return NULL; }
1721 int main(void)
1722 {
1723 pthread_t thread;
1724 pthread_create(&thread, 0, f, 0);
1725 pthread_setname_np(thread, "QEMU");
1726 return 0;
1727 }''', dependencies: threads))
6a23f819 1728config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
10f6b231
PB
1729 #include <pthread.h>
1730
1731 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
1732 int main(void)
1733 {
1734 pthread_t thread;
1735 pthread_create(&thread, 0, f, 0);
1736 return 0;
1737 }''', dependencies: threads))
1738
904ad5ec 1739config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
6bd17dcc
KS
1740 #include <sys/signalfd.h>
1741 #include <stddef.h>
1742 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
904ad5ec 1743config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
a620fbe9
PB
1744 #include <unistd.h>
1745 #include <fcntl.h>
1746 #include <limits.h>
1747
1748 int main(void)
1749 {
1750 int len, fd = 0;
1751 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
1752 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
1753 return 0;
1754 }'''))
e1fbd2c4 1755
96a63aeb
PB
1756config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
1757 #include <sys/mman.h>
1758 int main(int argc, char *argv[]) {
1759 return mlockall(MCL_FUTURE);
1760 }'''))
1761
eea9453a 1762have_l2tpv3 = false
43a363ae 1763if get_option('l2tpv3').allowed() and have_system
6a23f819
PB
1764 have_l2tpv3 = cc.has_type('struct mmsghdr',
1765 prefix: gnu_source_prefix + '''
1766 #include <sys/socket.h>
1767 #include <linux/ip.h>''')
eea9453a
TH
1768endif
1769config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
1770
837b84b1 1771have_netmap = false
43a363ae 1772if get_option('netmap').allowed() and have_system
837b84b1
PB
1773 have_netmap = cc.compiles('''
1774 #include <inttypes.h>
1775 #include <net/if.h>
1776 #include <net/netmap.h>
1777 #include <net/netmap_user.h>
1778 #if (NETMAP_API < 11) || (NETMAP_API > 15)
1779 #error
1780 #endif
1781 int main(void) { return 0; }''')
1782 if not have_netmap and get_option('netmap').enabled()
1783 error('Netmap headers not available')
1784 endif
1785endif
1786config_host_data.set('CONFIG_NETMAP', have_netmap)
1787
96a63aeb
PB
1788# Work around a system header bug with some kernel/XFS header
1789# versions where they both try to define 'struct fsxattr':
1790# xfs headers will not try to redefine structs from linux headers
1791# if this macro is set.
1792config_host_data.set('HAVE_FSXATTR', cc.links('''
6a23f819 1793 #include <linux/fs.h>
96a63aeb
PB
1794 struct fsxattr foo;
1795 int main(void) {
1796 return 0;
1797 }'''))
1798
e46bd55d
PB
1799# Some versions of Mac OS X incorrectly define SIZE_MAX
1800config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
1801 #include <stdint.h>
1802 #include <stdio.h>
1803 int main(int argc, char *argv[]) {
1804 return printf("%zu", SIZE_MAX);
1805 }''', args: ['-Werror']))
1806
bd87a367
PB
1807# See if 64-bit atomic operations are supported.
1808# Note that without __atomic builtins, we can only
1809# assume atomic loads/stores max at pointer size.
1810config_host_data.set('CONFIG_ATOMIC64', cc.links('''
1811 #include <stdint.h>
1812 int main(void)
1813 {
1814 uint64_t x = 0, y = 0;
1815 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
1816 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
1817 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
1818 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
1819 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
1820 return 0;
1821 }'''))
1822
1823config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
1824 #include <sys/auxv.h>
1825 int main(void) {
1826 return getauxval(AT_HWCAP) == 0;
1827 }'''))
1828
622753d2
PB
1829have_cpuid_h = cc.links('''
1830 #include <cpuid.h>
1831 int main(void) {
1832 unsigned a, b, c, d;
1833 unsigned max = __get_cpuid_max(0, 0);
1834
1835 if (max >= 1) {
1836 __cpuid(1, a, b, c, d);
1837 }
1838
1839 if (max >= 7) {
1840 __cpuid_count(7, 0, a, b, c, d);
1841 }
1842
1843 return 0;
1844 }''')
1845config_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
1846
1847config_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
1848 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
1849 .require(cc.links('''
1850 #pragma GCC push_options
1851 #pragma GCC target("avx2")
1852 #include <cpuid.h>
1853 #include <immintrin.h>
1854 static int bar(void *a) {
1855 __m256i x = *(__m256i *)a;
1856 return _mm256_testz_si256(x, x);
1857 }
1858 int main(int argc, char *argv[]) { return bar(argv[0]); }
1859 '''), error_message: 'AVX2 not available').allowed())
1860
1861config_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \
1862 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \
1863 .require(cc.links('''
1864 #pragma GCC push_options
1865 #pragma GCC target("avx512f")
1866 #include <cpuid.h>
1867 #include <immintrin.h>
1868 static int bar(void *a) {
1869 __m512i x = *(__m512i *)a;
1870 return _mm512_test_epi64_mask(x, x);
1871 }
1872 int main(int argc, char *argv[]) { return bar(argv[0]); }
1873 '''), error_message: 'AVX512F not available').allowed())
1874
b87df904
PB
1875if get_option('membarrier').disabled()
1876 have_membarrier = false
1877elif targetos == 'windows'
1878 have_membarrier = true
1879elif targetos == 'linux'
1880 have_membarrier = cc.compiles('''
1881 #include <linux/membarrier.h>
1882 #include <sys/syscall.h>
1883 #include <unistd.h>
1884 #include <stdlib.h>
1885 int main(void) {
1886 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
1887 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
1888 exit(0);
1889 }''')
1890endif
1891config_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
1892 .require(have_membarrier, error_message: 'membarrier system call not available') \
1893 .allowed())
1894
34b52615
PB
1895have_afalg = get_option('crypto_afalg') \
1896 .require(cc.compiles(gnu_source_prefix + '''
1897 #include <errno.h>
1898 #include <sys/types.h>
1899 #include <sys/socket.h>
1900 #include <linux/if_alg.h>
1901 int main(void) {
1902 int sock;
1903 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
1904 return sock;
1905 }
1906 '''), error_message: 'AF_ALG requested but could not be detected').allowed()
1907config_host_data.set('CONFIG_AF_ALG', have_afalg)
1908
bd87a367
PB
1909config_host_data.set('CONFIG_AF_VSOCK', cc.compiles(gnu_source_prefix + '''
1910 #include <errno.h>
1911 #include <sys/types.h>
1912 #include <sys/socket.h>
1913 #if !defined(AF_VSOCK)
1914 # error missing AF_VSOCK flag
1915 #endif
1916 #include <linux/vm_sockets.h>
1917 int main(void) {
1918 int sock, ret;
1919 struct sockaddr_vm svm;
1920 socklen_t len = sizeof(svm);
1921 sock = socket(AF_VSOCK, SOCK_STREAM, 0);
1922 ret = getpeername(sock, (struct sockaddr *)&svm, &len);
1923 if ((ret == -1) && (errno == ENOTCONN)) {
1924 return 0;
1925 }
1926 return -1;
1927 }'''))
1928
8821a389
MAL
1929have_vss = false
1930if targetos == 'windows' and link_language == 'cpp'
1931 have_vss = cxx.compiles('''
1932 #define __MIDL_user_allocate_free_DEFINED__
1933 #include <inc/win2003/vss.h>
1934 int main(void) { return VSS_CTX_BACKUP; }''')
1935endif
1936
a76a1f6b
PB
1937ignored = ['CONFIG_QEMU_INTERP_PREFIX', # actually per-target
1938 'HAVE_GDB_BIN']
87430d5b 1939arrays = ['CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
a6305081 1940strings = ['CONFIG_IASL']
859aef02 1941foreach k, v: config_host
765686d6
PB
1942 if ignored.contains(k)
1943 # do nothing
1944 elif arrays.contains(k)
859aef02
PB
1945 if v != ''
1946 v = '"' + '", "'.join(v.split()) + '", '
1947 endif
1948 config_host_data.set(k, v)
859aef02 1949 elif strings.contains(k)
859aef02 1950 config_host_data.set_quoted(k, v)
96a63aeb 1951 elif k.startswith('CONFIG_')
859aef02
PB
1952 config_host_data.set(k, v == 'y' ? 1 : v)
1953 endif
1954endforeach
859aef02 1955
a0c9162c
PB
1956########################
1957# Target configuration #
1958########################
1959
2becc36a 1960minikconf = find_program('scripts/minikconf.py')
05512f55 1961config_all = {}
a98006bc 1962config_all_devices = {}
ca0fc784 1963config_all_disas = {}
2becc36a
PB
1964config_devices_mak_list = []
1965config_devices_h = {}
859aef02 1966config_target_h = {}
2becc36a 1967config_target_mak = {}
ca0fc784
PB
1968
1969disassemblers = {
1970 'alpha' : ['CONFIG_ALPHA_DIS'],
1971 'arm' : ['CONFIG_ARM_DIS'],
1972 'avr' : ['CONFIG_AVR_DIS'],
1973 'cris' : ['CONFIG_CRIS_DIS'],
3e7a84ee 1974 'hexagon' : ['CONFIG_HEXAGON_DIS'],
ca0fc784
PB
1975 'hppa' : ['CONFIG_HPPA_DIS'],
1976 'i386' : ['CONFIG_I386_DIS'],
1977 'x86_64' : ['CONFIG_I386_DIS'],
ca0fc784
PB
1978 'm68k' : ['CONFIG_M68K_DIS'],
1979 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1980 'mips' : ['CONFIG_MIPS_DIS'],
ca0fc784
PB
1981 'nios2' : ['CONFIG_NIOS2_DIS'],
1982 'or1k' : ['CONFIG_OPENRISC_DIS'],
1983 'ppc' : ['CONFIG_PPC_DIS'],
1984 'riscv' : ['CONFIG_RISCV_DIS'],
1985 'rx' : ['CONFIG_RX_DIS'],
1986 's390' : ['CONFIG_S390_DIS'],
1987 'sh4' : ['CONFIG_SH4_DIS'],
1988 'sparc' : ['CONFIG_SPARC_DIS'],
1989 'xtensa' : ['CONFIG_XTENSA_DIS'],
1990}
1991if link_language == 'cpp'
1992 disassemblers += {
1993 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1994 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1995 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1996 }
1997endif
1998
e1fbd2c4 1999have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
0a189110 2000host_kconfig = \
537b7248 2001 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
0d04c4c9 2002 (have_tpm ? ['CONFIG_TPM=y'] : []) + \
3f0a5d55 2003 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
ccd250aa 2004 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
0a189110 2005 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
9d71037f 2006 (x11.found() ? ['CONFIG_X11=y'] : []) + \
0a189110
PB
2007 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
2008 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
2009 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
69202b40 2010 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
0a189110 2011 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
3090de69 2012 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : []) + \
106ad1f9 2013 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : [])
0a189110 2014
a9a74907 2015ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
05512f55 2016
fdb75aef
PB
2017default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
2018actual_target_dirs = []
fbb4121d 2019fdt_required = []
a81df1b6 2020foreach target : target_dirs
765686d6
PB
2021 config_target = { 'TARGET_NAME': target.split('-')[0] }
2022 if target.endswith('linux-user')
fdb75aef
PB
2023 if targetos != 'linux'
2024 if default_targets
2025 continue
2026 endif
2027 error('Target @0@ is only available on a Linux host'.format(target))
2028 endif
765686d6
PB
2029 config_target += { 'CONFIG_LINUX_USER': 'y' }
2030 elif target.endswith('bsd-user')
fdb75aef
PB
2031 if 'CONFIG_BSD' not in config_host
2032 if default_targets
2033 continue
2034 endif
2035 error('Target @0@ is only available on a BSD host'.format(target))
2036 endif
765686d6
PB
2037 config_target += { 'CONFIG_BSD_USER': 'y' }
2038 elif target.endswith('softmmu')
2039 config_target += { 'CONFIG_SOFTMMU': 'y' }
2040 endif
2041 if target.endswith('-user')
2042 config_target += {
2043 'CONFIG_USER_ONLY': 'y',
2044 'CONFIG_QEMU_INTERP_PREFIX':
2045 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
2046 }
2047 endif
859aef02 2048
0a189110 2049 accel_kconfig = []
8a19980e
PB
2050 foreach sym: accelerators
2051 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
2052 config_target += { sym: 'y' }
2053 config_all += { sym: 'y' }
23a77b2d
PB
2054 if sym == 'CONFIG_TCG' and tcg_arch == 'tci'
2055 config_target += { 'CONFIG_TCG_INTERPRETER': 'y' }
2056 elif sym == 'CONFIG_XEN' and have_xen_pci_passthrough
8a19980e
PB
2057 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
2058 endif
dae0ec15
GH
2059 if target in modular_tcg
2060 config_target += { 'CONFIG_TCG_MODULAR': 'y' }
2061 else
2062 config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
2063 endif
0a189110 2064 accel_kconfig += [ sym + '=y' ]
8a19980e
PB
2065 endif
2066 endforeach
0a189110 2067 if accel_kconfig.length() == 0
fdb75aef
PB
2068 if default_targets
2069 continue
2070 endif
2071 error('No accelerator available for target @0@'.format(target))
2072 endif
8a19980e 2073
fdb75aef 2074 actual_target_dirs += target
812b31d3 2075 config_target += keyval.load('configs/targets' / target + '.mak')
a9a74907 2076 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
765686d6 2077
fbb4121d
PB
2078 if 'TARGET_NEED_FDT' in config_target
2079 fdt_required += target
2080 endif
2081
fa73168b
PB
2082 # Add default keys
2083 if 'TARGET_BASE_ARCH' not in config_target
2084 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
2085 endif
2086 if 'TARGET_ABI_DIR' not in config_target
2087 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
2088 endif
859aef02 2089
ca0fc784 2090 foreach k, v: disassemblers
823eb013 2091 if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
ca0fc784
PB
2092 foreach sym: v
2093 config_target += { sym: 'y' }
2094 config_all_disas += { sym: 'y' }
2095 endforeach
2096 endif
2097 endforeach
2098
859aef02
PB
2099 config_target_data = configuration_data()
2100 foreach k, v: config_target
2101 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
2102 # do nothing
2103 elif ignored.contains(k)
2104 # do nothing
2105 elif k == 'TARGET_BASE_ARCH'
a9a74907
PB
2106 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
2107 # not used to select files from sourcesets.
859aef02 2108 config_target_data.set('TARGET_' + v.to_upper(), 1)
765686d6 2109 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
859aef02
PB
2110 config_target_data.set_quoted(k, v)
2111 elif v == 'y'
2112 config_target_data.set(k, 1)
2113 else
2114 config_target_data.set(k, v)
2115 endif
2116 endforeach
cb2c5531
PM
2117 config_target_data.set('QEMU_ARCH',
2118 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
859aef02
PB
2119 config_target_h += {target: configure_file(output: target + '-config-target.h',
2120 configuration: config_target_data)}
2becc36a
PB
2121
2122 if target.endswith('-softmmu')
d1d5e9ee 2123 config_input = meson.get_external_property(target, 'default')
2becc36a
PB
2124 config_devices_mak = target + '-config-devices.mak'
2125 config_devices_mak = configure_file(
d1d5e9ee 2126 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
2becc36a
PB
2127 output: config_devices_mak,
2128 depfile: config_devices_mak + '.d',
2129 capture: true,
7bc3ca7f
PB
2130 command: [minikconf,
2131 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
2becc36a 2132 config_devices_mak, '@DEPFILE@', '@INPUT@',
f4063f9c
PMD
2133 host_kconfig, accel_kconfig,
2134 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'])
859aef02
PB
2135
2136 config_devices_data = configuration_data()
2137 config_devices = keyval.load(config_devices_mak)
2138 foreach k, v: config_devices
2139 config_devices_data.set(k, 1)
2140 endforeach
2becc36a 2141 config_devices_mak_list += config_devices_mak
859aef02
PB
2142 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
2143 configuration: config_devices_data)}
2144 config_target += config_devices
a98006bc 2145 config_all_devices += config_devices
2becc36a
PB
2146 endif
2147 config_target_mak += {target: config_target}
a81df1b6 2148endforeach
fdb75aef 2149target_dirs = actual_target_dirs
a81df1b6 2150
2becc36a
PB
2151# This configuration is used to build files that are shared by
2152# multiple binaries, and then extracted out of the "common"
2153# static_library target.
2154#
2155# We do not use all_sources()/all_dependencies(), because it would
2156# build literally all source files, including devices only used by
2157# targets that are not built for this compilation. The CONFIG_ALL
2158# pseudo symbol replaces it.
2159
05512f55 2160config_all += config_all_devices
2becc36a
PB
2161config_all += config_host
2162config_all += config_all_disas
2163config_all += {
2164 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
2165 'CONFIG_SOFTMMU': have_system,
2166 'CONFIG_USER_ONLY': have_user,
2167 'CONFIG_ALL': true,
2168}
2169
eed56e9a
PB
2170target_configs_h = []
2171foreach target: target_dirs
2172 target_configs_h += config_target_h[target]
2173 target_configs_h += config_devices_h.get(target, [])
2174endforeach
2175genh += custom_target('config-poison.h',
2176 input: [target_configs_h],
2177 output: 'config-poison.h',
2178 capture: true,
2179 command: [find_program('scripts/make-config-poison.sh'),
2180 target_configs_h])
2181
a0c9162c
PB
2182##############
2183# Submodules #
2184##############
8b18cdbf
RH
2185
2186capstone = not_found
2187capstone_opt = get_option('capstone')
2188if capstone_opt in ['enabled', 'auto', 'system']
2189 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
bcf36862 2190 capstone = dependency('capstone', version: '>=4.0',
d7dedf42 2191 kwargs: static_kwargs, method: 'pkg-config',
8b18cdbf
RH
2192 required: capstone_opt == 'system' or
2193 capstone_opt == 'enabled' and not have_internal)
8f4aea71
DB
2194
2195 # Some versions of capstone have broken pkg-config file
2196 # that reports a wrong -I path, causing the #include to
2197 # fail later. If the system has such a broken version
2198 # do not use it.
2199 if capstone.found() and not cc.compiles('#include <capstone.h>',
2200 dependencies: [capstone])
2201 capstone = not_found
2202 if capstone_opt == 'system'
2203 error('system capstone requested, it does not appear to work')
2204 endif
2205 endif
2206
8b18cdbf
RH
2207 if capstone.found()
2208 capstone_opt = 'system'
2209 elif have_internal
2210 capstone_opt = 'internal'
2211 else
2212 capstone_opt = 'disabled'
2213 endif
2214endif
2215if capstone_opt == 'internal'
2216 capstone_data = configuration_data()
2217 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
2218
2219 capstone_files = files(
2220 'capstone/cs.c',
2221 'capstone/MCInst.c',
2222 'capstone/MCInstrDesc.c',
2223 'capstone/MCRegisterInfo.c',
2224 'capstone/SStream.c',
2225 'capstone/utils.c'
2226 )
2227
2228 if 'CONFIG_ARM_DIS' in config_all_disas
2229 capstone_data.set('CAPSTONE_HAS_ARM', '1')
2230 capstone_files += files(
2231 'capstone/arch/ARM/ARMDisassembler.c',
2232 'capstone/arch/ARM/ARMInstPrinter.c',
2233 'capstone/arch/ARM/ARMMapping.c',
2234 'capstone/arch/ARM/ARMModule.c'
2235 )
2236 endif
2237
2238 # FIXME: This config entry currently depends on a c++ compiler.
2239 # Which is needed for building libvixl, but not for capstone.
2240 if 'CONFIG_ARM_A64_DIS' in config_all_disas
2241 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
2242 capstone_files += files(
2243 'capstone/arch/AArch64/AArch64BaseInfo.c',
2244 'capstone/arch/AArch64/AArch64Disassembler.c',
2245 'capstone/arch/AArch64/AArch64InstPrinter.c',
2246 'capstone/arch/AArch64/AArch64Mapping.c',
2247 'capstone/arch/AArch64/AArch64Module.c'
2248 )
2249 endif
2250
2251 if 'CONFIG_PPC_DIS' in config_all_disas
2252 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
2253 capstone_files += files(
2254 'capstone/arch/PowerPC/PPCDisassembler.c',
2255 'capstone/arch/PowerPC/PPCInstPrinter.c',
2256 'capstone/arch/PowerPC/PPCMapping.c',
2257 'capstone/arch/PowerPC/PPCModule.c'
2258 )
2259 endif
2260
3d562845
RH
2261 if 'CONFIG_S390_DIS' in config_all_disas
2262 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
2263 capstone_files += files(
2264 'capstone/arch/SystemZ/SystemZDisassembler.c',
2265 'capstone/arch/SystemZ/SystemZInstPrinter.c',
2266 'capstone/arch/SystemZ/SystemZMapping.c',
2267 'capstone/arch/SystemZ/SystemZModule.c',
2268 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
2269 )
2270 endif
2271
8b18cdbf
RH
2272 if 'CONFIG_I386_DIS' in config_all_disas
2273 capstone_data.set('CAPSTONE_HAS_X86', 1)
2274 capstone_files += files(
2275 'capstone/arch/X86/X86Disassembler.c',
2276 'capstone/arch/X86/X86DisassemblerDecoder.c',
2277 'capstone/arch/X86/X86ATTInstPrinter.c',
2278 'capstone/arch/X86/X86IntelInstPrinter.c',
eef20e40 2279 'capstone/arch/X86/X86InstPrinterCommon.c',
8b18cdbf
RH
2280 'capstone/arch/X86/X86Mapping.c',
2281 'capstone/arch/X86/X86Module.c'
2282 )
2283 endif
2284
2285 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
2286
2287 capstone_cargs = [
2288 # FIXME: There does not seem to be a way to completely replace the c_args
2289 # that come from add_project_arguments() -- we can only add to them.
2290 # So: disable all warnings with a big hammer.
2291 '-Wno-error', '-w',
2292
2293 # Include all configuration defines via a header file, which will wind up
2294 # as a dependency on the object file, and thus changes here will result
2295 # in a rebuild.
2296 '-include', 'capstone-defs.h'
2297 ]
2298
2299 libcapstone = static_library('capstone',
610e7e0e 2300 build_by_default: false,
8b18cdbf
RH
2301 sources: capstone_files,
2302 c_args: capstone_cargs,
2303 include_directories: 'capstone/include')
2304 capstone = declare_dependency(link_with: libcapstone,
eef20e40 2305 include_directories: 'capstone/include/capstone')
8b18cdbf 2306endif
4d34a86b
PB
2307
2308slirp = not_found
2309slirp_opt = 'disabled'
2310if have_system
2311 slirp_opt = get_option('slirp')
2312 if slirp_opt in ['enabled', 'auto', 'system']
2313 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
d7dedf42 2314 slirp = dependency('slirp', kwargs: static_kwargs,
4d34a86b
PB
2315 method: 'pkg-config',
2316 required: slirp_opt == 'system' or
2317 slirp_opt == 'enabled' and not have_internal)
2318 if slirp.found()
2319 slirp_opt = 'system'
2320 elif have_internal
2321 slirp_opt = 'internal'
2322 else
2323 slirp_opt = 'disabled'
2324 endif
2325 endif
2326 if slirp_opt == 'internal'
2327 slirp_deps = []
2328 if targetos == 'windows'
2329 slirp_deps = cc.find_library('iphlpapi')
43f547b7
MAL
2330 elif targetos == 'darwin'
2331 slirp_deps = cc.find_library('resolv')
4d34a86b
PB
2332 endif
2333 slirp_conf = configuration_data()
2334 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
2335 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
2336 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
2337 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
2338 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
2339 slirp_files = [
2340 'slirp/src/arp_table.c',
2341 'slirp/src/bootp.c',
2342 'slirp/src/cksum.c',
2343 'slirp/src/dhcpv6.c',
2344 'slirp/src/dnssearch.c',
2345 'slirp/src/if.c',
2346 'slirp/src/ip6_icmp.c',
2347 'slirp/src/ip6_input.c',
2348 'slirp/src/ip6_output.c',
2349 'slirp/src/ip_icmp.c',
2350 'slirp/src/ip_input.c',
2351 'slirp/src/ip_output.c',
2352 'slirp/src/mbuf.c',
2353 'slirp/src/misc.c',
2354 'slirp/src/ncsi.c',
2355 'slirp/src/ndp_table.c',
2356 'slirp/src/sbuf.c',
2357 'slirp/src/slirp.c',
2358 'slirp/src/socket.c',
2359 'slirp/src/state.c',
2360 'slirp/src/stream.c',
2361 'slirp/src/tcp_input.c',
2362 'slirp/src/tcp_output.c',
2363 'slirp/src/tcp_subr.c',
2364 'slirp/src/tcp_timer.c',
2365 'slirp/src/tftp.c',
2366 'slirp/src/udp.c',
2367 'slirp/src/udp6.c',
2368 'slirp/src/util.c',
2369 'slirp/src/version.c',
2370 'slirp/src/vmstate.c',
2371 ]
2372
2373 configure_file(
2374 input : 'slirp/src/libslirp-version.h.in',
2375 output : 'libslirp-version.h',
2376 configuration: slirp_conf)
2377
2378 slirp_inc = include_directories('slirp', 'slirp/src')
2379 libslirp = static_library('slirp',
610e7e0e 2380 build_by_default: false,
4d34a86b
PB
2381 sources: slirp_files,
2382 c_args: slirp_cargs,
2383 include_directories: slirp_inc)
2384 slirp = declare_dependency(link_with: libslirp,
2385 dependencies: slirp_deps,
2386 include_directories: slirp_inc)
2387 endif
2388endif
2389
c715343f
DB
2390# For CFI, we need to compile slirp as a static library together with qemu.
2391# This is because we register slirp functions as callbacks for QEMU Timers.
2392# When using a system-wide shared libslirp, the type information for the
2393# callback is missing and the timer call produces a false positive with CFI.
2394#
2395# Now that slirp_opt has been defined, check if the selected slirp is compatible
2396# with control-flow integrity.
2397if get_option('cfi') and slirp_opt == 'system'
2398 error('Control-Flow Integrity is not compatible with system-wide slirp.' \
2399 + ' Please configure with --enable-slirp=git')
2400endif
2401
fbb4121d
PB
2402fdt = not_found
2403fdt_opt = get_option('fdt')
2404if have_system
2405 if fdt_opt in ['enabled', 'auto', 'system']
2406 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
d7dedf42 2407 fdt = cc.find_library('fdt', kwargs: static_kwargs,
fbb4121d
PB
2408 required: fdt_opt == 'system' or
2409 fdt_opt == 'enabled' and not have_internal)
2410 if fdt.found() and cc.links('''
2411 #include <libfdt.h>
2412 #include <libfdt_env.h>
de47b0ff 2413 int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
fbb4121d
PB
2414 dependencies: fdt)
2415 fdt_opt = 'system'
6c22853c
TH
2416 elif fdt_opt == 'system'
2417 error('system libfdt requested, but it is too old (1.5.1 or newer required)')
fbb4121d
PB
2418 elif have_internal
2419 fdt_opt = 'internal'
2420 else
2421 fdt_opt = 'disabled'
87daf898 2422 fdt = not_found
fbb4121d
PB
2423 endif
2424 endif
2425 if fdt_opt == 'internal'
2426 fdt_files = files(
2427 'dtc/libfdt/fdt.c',
2428 'dtc/libfdt/fdt_ro.c',
2429 'dtc/libfdt/fdt_wip.c',
2430 'dtc/libfdt/fdt_sw.c',
2431 'dtc/libfdt/fdt_rw.c',
2432 'dtc/libfdt/fdt_strerror.c',
2433 'dtc/libfdt/fdt_empty_tree.c',
2434 'dtc/libfdt/fdt_addresses.c',
2435 'dtc/libfdt/fdt_overlay.c',
2436 'dtc/libfdt/fdt_check.c',
2437 )
2438
2439 fdt_inc = include_directories('dtc/libfdt')
2440 libfdt = static_library('fdt',
610e7e0e 2441 build_by_default: false,
fbb4121d
PB
2442 sources: fdt_files,
2443 include_directories: fdt_inc)
2444 fdt = declare_dependency(link_with: libfdt,
2445 include_directories: fdt_inc)
2446 endif
2447endif
2448if not fdt.found() and fdt_required.length() > 0
2449 error('fdt not available but required by targets ' + ', '.join(fdt_required))
2450endif
2451
8b18cdbf 2452config_host_data.set('CONFIG_CAPSTONE', capstone.found())
fbb4121d 2453config_host_data.set('CONFIG_FDT', fdt.found())
4d34a86b 2454config_host_data.set('CONFIG_SLIRP', slirp.found())
8b18cdbf 2455
a0c9162c
PB
2456#####################
2457# Generated sources #
2458#####################
8b18cdbf 2459
a0c9162c 2460genh += configure_file(output: 'config-host.h', configuration: config_host_data)
a81df1b6 2461
3f885659 2462hxtool = find_program('scripts/hxtool')
650b5d54 2463shaderinclude = find_program('scripts/shaderinclude.pl')
a81df1b6 2464qapi_gen = find_program('scripts/qapi-gen.py')
654d6b04
PB
2465qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
2466 meson.current_source_dir() / 'scripts/qapi/commands.py',
2467 meson.current_source_dir() / 'scripts/qapi/common.py',
2468 meson.current_source_dir() / 'scripts/qapi/error.py',
2469 meson.current_source_dir() / 'scripts/qapi/events.py',
2470 meson.current_source_dir() / 'scripts/qapi/expr.py',
2471 meson.current_source_dir() / 'scripts/qapi/gen.py',
2472 meson.current_source_dir() / 'scripts/qapi/introspect.py',
2473 meson.current_source_dir() / 'scripts/qapi/parser.py',
2474 meson.current_source_dir() / 'scripts/qapi/schema.py',
2475 meson.current_source_dir() / 'scripts/qapi/source.py',
2476 meson.current_source_dir() / 'scripts/qapi/types.py',
2477 meson.current_source_dir() / 'scripts/qapi/visit.py',
2478 meson.current_source_dir() / 'scripts/qapi/common.py',
2479 meson.current_source_dir() / 'scripts/qapi-gen.py'
a81df1b6
PB
2480]
2481
2482tracetool = [
2483 python, files('scripts/tracetool.py'),
9c29b741 2484 '--backend=' + ','.join(get_option('trace_backends'))
a81df1b6 2485]
0572d6cd
SH
2486tracetool_depends = files(
2487 'scripts/tracetool/backend/log.py',
2488 'scripts/tracetool/backend/__init__.py',
2489 'scripts/tracetool/backend/dtrace.py',
2490 'scripts/tracetool/backend/ftrace.py',
2491 'scripts/tracetool/backend/simple.py',
2492 'scripts/tracetool/backend/syslog.py',
2493 'scripts/tracetool/backend/ust.py',
0572d6cd
SH
2494 'scripts/tracetool/format/ust_events_c.py',
2495 'scripts/tracetool/format/ust_events_h.py',
2496 'scripts/tracetool/format/__init__.py',
2497 'scripts/tracetool/format/d.py',
0572d6cd
SH
2498 'scripts/tracetool/format/simpletrace_stap.py',
2499 'scripts/tracetool/format/c.py',
2500 'scripts/tracetool/format/h.py',
0572d6cd
SH
2501 'scripts/tracetool/format/log_stap.py',
2502 'scripts/tracetool/format/stap.py',
0572d6cd
SH
2503 'scripts/tracetool/__init__.py',
2504 'scripts/tracetool/transform.py',
2505 'scripts/tracetool/vcpu.py'
2506)
a81df1b6 2507
2c273f32
MAL
2508qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
2509 meson.current_source_dir(),
859aef02 2510 config_host['PKGVERSION'], meson.project_version()]
2c273f32
MAL
2511qemu_version = custom_target('qemu-version.h',
2512 output: 'qemu-version.h',
2513 command: qemu_version_cmd,
2514 capture: true,
2515 build_by_default: true,
2516 build_always_stale: true)
2517genh += qemu_version
2518
3f885659
MAL
2519hxdep = []
2520hx_headers = [
2521 ['qemu-options.hx', 'qemu-options.def'],
2522 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
2523]
2524if have_system
2525 hx_headers += [
2526 ['hmp-commands.hx', 'hmp-commands.h'],
2527 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
2528 ]
2529endif
2530foreach d : hx_headers
b7c70bf2 2531 hxdep += custom_target(d[1],
3f885659
MAL
2532 input: files(d[0]),
2533 output: d[1],
2534 capture: true,
2535 build_by_default: true, # to be removed when added to a target
2536 command: [hxtool, '-h', '@INPUT0@'])
2537endforeach
2538genh += hxdep
2539
a0c9162c
PB
2540###################
2541# Collect sources #
2542###################
a81df1b6 2543
55567891 2544authz_ss = ss.source_set()
4a96337d 2545blockdev_ss = ss.source_set()
7e2b888f 2546block_ss = ss.source_set()
c2306d71 2547chardev_ss = ss.source_set()
7e2b888f 2548common_ss = ss.source_set()
2389304a 2549crypto_ss = ss.source_set()
f73fb063 2550hwcore_ss = ss.source_set()
f78536b1 2551io_ss = ss.source_set()
7e2b888f 2552qmp_ss = ss.source_set()
da33fc09 2553qom_ss = ss.source_set()
7e2b888f 2554softmmu_ss = ss.source_set()
64ed6f92 2555specific_fuzz_ss = ss.source_set()
7e2b888f
PMD
2556specific_ss = ss.source_set()
2557stub_ss = ss.source_set()
2558trace_ss = ss.source_set()
2559user_ss = ss.source_set()
2560util_ss = ss.source_set()
2becc36a 2561
c94a7b88
GH
2562# accel modules
2563qtest_module_ss = ss.source_set()
dae0ec15 2564tcg_module_ss = ss.source_set()
c94a7b88 2565
3154fee4 2566modules = {}
db2e89df 2567target_modules = {}
2becc36a
PB
2568hw_arch = {}
2569target_arch = {}
2570target_softmmu_arch = {}
46369b50 2571target_user_arch = {}
a81df1b6
PB
2572
2573###############
2574# Trace files #
2575###############
2576
c9322ab5
MAL
2577# TODO: add each directory to the subdirs from its own meson.build, once
2578# we have those
a81df1b6 2579trace_events_subdirs = [
a81df1b6 2580 'crypto',
69ff4d0a
PMD
2581 'qapi',
2582 'qom',
a81df1b6 2583 'monitor',
69ff4d0a 2584 'util',
a81df1b6 2585]
6ddc1abe 2586if have_linux_user
a81df1b6
PB
2587 trace_events_subdirs += [ 'linux-user' ]
2588endif
6ddc1abe
WL
2589if have_bsd_user
2590 trace_events_subdirs += [ 'bsd-user' ]
2591endif
a81df1b6
PB
2592if have_block
2593 trace_events_subdirs += [
2594 'authz',
2595 'block',
2596 'io',
2597 'nbd',
2598 'scsi',
2599 ]
2600endif
2601if have_system
2602 trace_events_subdirs += [
8985db26 2603 'accel/kvm',
a81df1b6
PB
2604 'audio',
2605 'backends',
2606 'backends/tpm',
2607 'chardev',
46627f41 2608 'ebpf',
a81df1b6
PB
2609 'hw/9pfs',
2610 'hw/acpi',
77c05b0b 2611 'hw/adc',
a81df1b6
PB
2612 'hw/alpha',
2613 'hw/arm',
2614 'hw/audio',
2615 'hw/block',
2616 'hw/block/dataplane',
2617 'hw/char',
2618 'hw/display',
2619 'hw/dma',
2620 'hw/hppa',
2621 'hw/hyperv',
2622 'hw/i2c',
2623 'hw/i386',
2624 'hw/i386/xen',
2625 'hw/ide',
2626 'hw/input',
2627 'hw/intc',
2628 'hw/isa',
2629 'hw/mem',
2630 'hw/mips',
2631 'hw/misc',
2632 'hw/misc/macio',
2633 'hw/net',
98e5d7a2 2634 'hw/net/can',
ce0e6a2c 2635 'hw/nubus',
88eea45c 2636 'hw/nvme',
a81df1b6
PB
2637 'hw/nvram',
2638 'hw/pci',
2639 'hw/pci-host',
2640 'hw/ppc',
2641 'hw/rdma',
2642 'hw/rdma/vmw',
2643 'hw/rtc',
2644 'hw/s390x',
2645 'hw/scsi',
2646 'hw/sd',
ad52cfc1 2647 'hw/sh4',
a81df1b6
PB
2648 'hw/sparc',
2649 'hw/sparc64',
2650 'hw/ssi',
2651 'hw/timer',
2652 'hw/tpm',
2653 'hw/usb',
2654 'hw/vfio',
2655 'hw/virtio',
2656 'hw/watchdog',
2657 'hw/xen',
2658 'hw/gpio',
a81df1b6
PB
2659 'migration',
2660 'net',
8b7a5507 2661 'softmmu',
a81df1b6 2662 'ui',
ad22c308 2663 'hw/remote',
a81df1b6
PB
2664 ]
2665endif
8985db26
PMD
2666if have_system or have_user
2667 trace_events_subdirs += [
2668 'accel/tcg',
2669 'hw/core',
2670 'target/arm',
a1477da3 2671 'target/arm/hvf',
8985db26
PMD
2672 'target/hppa',
2673 'target/i386',
2674 'target/i386/kvm',
34b8ff25 2675 'target/mips/tcg',
8985db26
PMD
2676 'target/ppc',
2677 'target/riscv',
2678 'target/s390x',
67043607 2679 'target/s390x/kvm',
8985db26
PMD
2680 'target/sparc',
2681 ]
2682endif
a81df1b6 2683
0df750e9
MAL
2684vhost_user = not_found
2685if 'CONFIG_VHOST_USER' in config_host
2686 libvhost_user = subproject('libvhost-user')
2687 vhost_user = libvhost_user.get_variable('vhost_user_dep')
2688endif
2689
b83a80e8
VSO
2690# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
2691# that is filled in by qapi/.
a81df1b6
PB
2692subdir('qapi')
2693subdir('qobject')
2694subdir('stubs')
2695subdir('trace')
2696subdir('util')
5582c58f
MAL
2697subdir('qom')
2698subdir('authz')
a81df1b6 2699subdir('crypto')
2d78b56e 2700subdir('ui')
a81df1b6 2701
3154fee4
MAL
2702
2703if enable_modules
2704 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
2705 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
2706endif
2707
2becc36a 2708stub_ss = stub_ss.apply(config_all, strict: false)
a81df1b6
PB
2709
2710util_ss.add_all(trace_ss)
2becc36a 2711util_ss = util_ss.apply(config_all, strict: false)
a81df1b6
PB
2712libqemuutil = static_library('qemuutil',
2713 sources: util_ss.sources() + stub_ss.sources() + genh,
6d7c7c2d 2714 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
a81df1b6 2715qemuutil = declare_dependency(link_with: libqemuutil,
04c6f1e7 2716 sources: genh + version_res)
a81df1b6 2717
957b31f6
PMD
2718if have_system or have_user
2719 decodetree = generator(find_program('scripts/decodetree.py'),
2720 output: 'decode-@BASENAME@.c.inc',
2721 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
2722 subdir('libdecnumber')
2723 subdir('target')
2724endif
abff1abf 2725
478e943f 2726subdir('audio')
7fcfd456 2727subdir('io')
848e8ff6 2728subdir('chardev')
ec0d5893 2729subdir('fsdev')
708eab42 2730subdir('dump')
ec0d5893 2731
f285bd3f
PMD
2732if have_block
2733 block_ss.add(files(
2734 'block.c',
2735 'blockjob.c',
2736 'job.c',
2737 'qemu-io-cmds.c',
2738 ))
406523f6
PB
2739 if config_host_data.get('CONFIG_REPLICATION')
2740 block_ss.add(files('replication.c'))
2741 endif
f285bd3f
PMD
2742
2743 subdir('nbd')
2744 subdir('scsi')
2745 subdir('block')
2746
2747 blockdev_ss.add(files(
2748 'blockdev.c',
2749 'blockdev-nbd.c',
2750 'iothread.c',
2751 'job-qmp.c',
2752 ), gnutls)
2753
2754 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
2755 # os-win32.c does not
2756 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
2757 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
2758endif
4a96337d
PB
2759
2760common_ss.add(files('cpus-common.c'))
2761
5d3ea0e1 2762subdir('softmmu')
c9322ab5 2763
f343346b 2764common_ss.add(capstone)
d9f24bf5 2765specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
c9322ab5 2766
44b99a6d
RH
2767# Work around a gcc bug/misfeature wherein constant propagation looks
2768# through an alias:
2769# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
2770# to guess that a const variable is always zero. Without lto, this is
2771# impossible, as the alias is restricted to page-vary-common.c. Indeed,
2772# without lto, not even the alias is required -- we simply use different
2773# declarations in different compilation units.
2774pagevary = files('page-vary-common.c')
2775if get_option('b_lto')
2776 pagevary_flags = ['-fno-lto']
2777 if get_option('cfi')
2778 pagevary_flags += '-fno-sanitize=cfi-icall'
2779 endif
2780 pagevary = static_library('page-vary-common', sources: pagevary,
2781 c_args: pagevary_flags)
2782 pagevary = declare_dependency(link_with: pagevary)
2783endif
2784common_ss.add(pagevary)
6670d4d0
RH
2785specific_ss.add(files('page-vary.c'))
2786
ab318051 2787subdir('backends')
c574e161 2788subdir('disas')
55166230 2789subdir('migration')
ff219dca 2790subdir('monitor')
cdaf0722 2791subdir('net')
17ef2af6 2792subdir('replay')
8df9f0c3 2793subdir('semihosting')
582ea95f 2794subdir('hw')
104cc2c0 2795subdir('tcg')
c6347541 2796subdir('fpu')
1a82878a 2797subdir('accel')
f556b4a1 2798subdir('plugins')
bbf15aaf
RH
2799subdir('ebpf')
2800
2801common_user_inc = []
2802
2803subdir('common-user')
b309c321 2804subdir('bsd-user')
3a30446a 2805subdir('linux-user')
46627f41 2806
a2ce7dbd
PB
2807# needed for fuzzing binaries
2808subdir('tests/qtest/libqos')
64ed6f92 2809subdir('tests/qtest/fuzz')
a2ce7dbd 2810
c94a7b88 2811# accel modules
dae0ec15
GH
2812tcg_real_module_ss = ss.source_set()
2813tcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
2814specific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
2815target_modules += { 'accel' : { 'qtest': qtest_module_ss,
2816 'tcg': tcg_real_module_ss }}
c94a7b88 2817
a0c9162c
PB
2818########################
2819# Library dependencies #
2820########################
2821
f5723ab6 2822modinfo_collect = find_program('scripts/modinfo-collect.py')
5ebbfecc 2823modinfo_generate = find_program('scripts/modinfo-generate.py')
f5723ab6
GH
2824modinfo_files = []
2825
3154fee4
MAL
2826block_mods = []
2827softmmu_mods = []
2828foreach d, list : modules
2829 foreach m, module_ss : list
2830 if enable_modules and targetos != 'windows'
3e292c51 2831 module_ss = module_ss.apply(config_all, strict: false)
3154fee4
MAL
2832 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
2833 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
2834 if d == 'block'
2835 block_mods += sl
2836 else
2837 softmmu_mods += sl
2838 endif
f5723ab6
GH
2839 if module_ss.sources() != []
2840 # FIXME: Should use sl.extract_all_objects(recursive: true) as
2841 # input. Sources can be used multiple times but objects are
2842 # unique when it comes to lookup in compile_commands.json.
2843 # Depnds on a mesion version with
2844 # https://github.com/mesonbuild/meson/pull/8900
2845 modinfo_files += custom_target(d + '-' + m + '.modinfo',
2846 output: d + '-' + m + '.modinfo',
ac347111 2847 input: module_ss.sources() + genh,
f5723ab6 2848 capture: true,
ac347111 2849 command: [modinfo_collect, module_ss.sources()])
f5723ab6 2850 endif
3154fee4
MAL
2851 else
2852 if d == 'block'
2853 block_ss.add_all(module_ss)
2854 else
2855 softmmu_ss.add_all(module_ss)
2856 endif
2857 endif
2858 endforeach
2859endforeach
2860
db2e89df
GH
2861foreach d, list : target_modules
2862 foreach m, module_ss : list
2863 if enable_modules and targetos != 'windows'
2864 foreach target : target_dirs
2865 if target.endswith('-softmmu')
2866 config_target = config_target_mak[target]
2867 config_target += config_host
2868 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2869 c_args = ['-DNEED_CPU_H',
2870 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2871 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
2872 target_module_ss = module_ss.apply(config_target, strict: false)
2873 if target_module_ss.sources() != []
2874 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
2875 sl = static_library(module_name,
2876 [genh, target_module_ss.sources()],
2877 dependencies: [modulecommon, target_module_ss.dependencies()],
2878 include_directories: target_inc,
2879 c_args: c_args,
2880 pic: true)
2881 softmmu_mods += sl
2882 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
2883 modinfo_files += custom_target(module_name + '.modinfo',
2884 output: module_name + '.modinfo',
917ddc27 2885 input: target_module_ss.sources() + genh,
db2e89df 2886 capture: true,
917ddc27 2887 command: [modinfo_collect, '--target', target, target_module_ss.sources()])
db2e89df
GH
2888 endif
2889 endif
2890 endforeach
2891 else
2892 specific_ss.add_all(module_ss)
2893 endif
2894 endforeach
2895endforeach
2896
5ebbfecc
GH
2897if enable_modules
2898 modinfo_src = custom_target('modinfo.c',
2899 output: 'modinfo.c',
2900 input: modinfo_files,
2901 command: [modinfo_generate, '@INPUT@'],
2902 capture: true)
2903 modinfo_lib = static_library('modinfo', modinfo_src)
2904 modinfo_dep = declare_dependency(link_whole: modinfo_lib)
2905 softmmu_ss.add(modinfo_dep)
2906endif
2907
3154fee4 2908nm = find_program('nm')
604f3e4e 2909undefsym = find_program('scripts/undefsym.py')
3154fee4
MAL
2910block_syms = custom_target('block.syms', output: 'block.syms',
2911 input: [libqemuutil, block_mods],
2912 capture: true,
2913 command: [undefsym, nm, '@INPUT@'])
2914qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
2915 input: [libqemuutil, softmmu_mods],
2916 capture: true,
2917 command: [undefsym, nm, '@INPUT@'])
2918
da33fc09
PMD
2919qom_ss = qom_ss.apply(config_host, strict: false)
2920libqom = static_library('qom', qom_ss.sources() + genh,
2921 dependencies: [qom_ss.dependencies()],
2922 name_suffix: 'fa')
2923
2924qom = declare_dependency(link_whole: libqom)
2925
55567891
PMD
2926authz_ss = authz_ss.apply(config_host, strict: false)
2927libauthz = static_library('authz', authz_ss.sources() + genh,
2928 dependencies: [authz_ss.dependencies()],
2929 name_suffix: 'fa',
2930 build_by_default: false)
2931
2932authz = declare_dependency(link_whole: libauthz,
2933 dependencies: qom)
2934
2389304a
PMD
2935crypto_ss = crypto_ss.apply(config_host, strict: false)
2936libcrypto = static_library('crypto', crypto_ss.sources() + genh,
2937 dependencies: [crypto_ss.dependencies()],
2938 name_suffix: 'fa',
2939 build_by_default: false)
2940
2941crypto = declare_dependency(link_whole: libcrypto,
2942 dependencies: [authz, qom])
2943
f78536b1
PMD
2944io_ss = io_ss.apply(config_host, strict: false)
2945libio = static_library('io', io_ss.sources() + genh,
2946 dependencies: [io_ss.dependencies()],
2947 link_with: libqemuutil,
2948 name_suffix: 'fa',
2949 build_by_default: false)
2950
2951io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
2952
7e6edef3
PMD
2953libmigration = static_library('migration', sources: migration_files + genh,
2954 name_suffix: 'fa',
2955 build_by_default: false)
2956migration = declare_dependency(link_with: libmigration,
2957 dependencies: [zlib, qom, io])
2958softmmu_ss.add(migration)
2959
5e5733e5
MAL
2960block_ss = block_ss.apply(config_host, strict: false)
2961libblock = static_library('block', block_ss.sources() + genh,
2962 dependencies: block_ss.dependencies(),
2963 link_depends: block_syms,
2964 name_suffix: 'fa',
2965 build_by_default: false)
2966
2967block = declare_dependency(link_whole: [libblock],
b7c70bf2
MAL
2968 link_args: '@block.syms',
2969 dependencies: [crypto, io])
5e5733e5 2970
4fb9071f
SH
2971blockdev_ss = blockdev_ss.apply(config_host, strict: false)
2972libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
2973 dependencies: blockdev_ss.dependencies(),
2974 name_suffix: 'fa',
2975 build_by_default: false)
2976
2977blockdev = declare_dependency(link_whole: [libblockdev],
2978 dependencies: [block])
2979
ff219dca
PB
2980qmp_ss = qmp_ss.apply(config_host, strict: false)
2981libqmp = static_library('qmp', qmp_ss.sources() + genh,
2982 dependencies: qmp_ss.dependencies(),
2983 name_suffix: 'fa',
2984 build_by_default: false)
2985
2986qmp = declare_dependency(link_whole: [libqmp])
2987
c2306d71
PMD
2988libchardev = static_library('chardev', chardev_ss.sources() + genh,
2989 name_suffix: 'fa',
3eacf70b 2990 dependencies: [gnutls],
c2306d71
PMD
2991 build_by_default: false)
2992
2993chardev = declare_dependency(link_whole: libchardev)
2994
f73fb063
PMD
2995hwcore_ss = hwcore_ss.apply(config_host, strict: false)
2996libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
e28ab096
PMD
2997 name_suffix: 'fa',
2998 build_by_default: false)
2999hwcore = declare_dependency(link_whole: libhwcore)
3000common_ss.add(hwcore)
3001
064f8ee7
PMD
3002###########
3003# Targets #
3004###########
3005
fb72176b 3006emulator_modules = []
3154fee4 3007foreach m : block_mods + softmmu_mods
fb72176b
PB
3008 emulator_modules += shared_module(m.name(),
3009 build_by_default: true,
3154fee4
MAL
3010 name_prefix: '',
3011 link_whole: m,
3012 install: true,
16bf7a33 3013 install_dir: qemu_moddir)
3154fee4
MAL
3014endforeach
3015
4fb9071f 3016softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
64ed6f92
PB
3017common_ss.add(qom, qemuutil)
3018
3019common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
2becc36a
PB
3020common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
3021
3022common_all = common_ss.apply(config_all, strict: false)
3023common_all = static_library('common',
3024 build_by_default: false,
3025 sources: common_all.sources() + genh,
9d24fb73 3026 include_directories: common_user_inc,
75eebe0b 3027 implicit_include_directories: false,
2becc36a
PB
3028 dependencies: common_all.dependencies(),
3029 name_suffix: 'fa')
3030
c9322ab5
MAL
3031feature_to_c = find_program('scripts/feature_to_c.sh')
3032
fd5eef85 3033emulators = {}
2becc36a
PB
3034foreach target : target_dirs
3035 config_target = config_target_mak[target]
3036 target_name = config_target['TARGET_NAME']
ffb91f68 3037 target_base_arch = config_target['TARGET_BASE_ARCH']
859aef02 3038 arch_srcs = [config_target_h[target]]
64ed6f92
PB
3039 arch_deps = []
3040 c_args = ['-DNEED_CPU_H',
3041 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3042 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
b6c7cfd4 3043 link_args = emulator_link_args
2becc36a 3044
859aef02 3045 config_target += config_host
2becc36a
PB
3046 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3047 if targetos == 'linux'
3048 target_inc += include_directories('linux-headers', is_system: true)
3049 endif
3050 if target.endswith('-softmmu')
3051 qemu_target_name = 'qemu-system-' + target_name
3052 target_type='system'
ffb91f68 3053 t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false)
abff1abf 3054 arch_srcs += t.sources()
64ed6f92 3055 arch_deps += t.dependencies()
abff1abf 3056
ffb91f68 3057 hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
2c44220d
MAL
3058 hw = hw_arch[hw_dir].apply(config_target, strict: false)
3059 arch_srcs += hw.sources()
64ed6f92 3060 arch_deps += hw.dependencies()
2c44220d 3061
2becc36a 3062 arch_srcs += config_devices_h[target]
64ed6f92 3063 link_args += ['@block.syms', '@qemu.syms']
2becc36a 3064 else
3a30446a 3065 abi = config_target['TARGET_ABI_DIR']
2becc36a 3066 target_type='user'
a3a576b0 3067 target_inc += common_user_inc
2becc36a 3068 qemu_target_name = 'qemu-' + target_name
ffb91f68
PB
3069 if target_base_arch in target_user_arch
3070 t = target_user_arch[target_base_arch].apply(config_target, strict: false)
46369b50
PMD
3071 arch_srcs += t.sources()
3072 arch_deps += t.dependencies()
3073 endif
2becc36a
PB
3074 if 'CONFIG_LINUX_USER' in config_target
3075 base_dir = 'linux-user'
e2a74729
WL
3076 endif
3077 if 'CONFIG_BSD_USER' in config_target
2becc36a 3078 base_dir = 'bsd-user'
e2a74729 3079 target_inc += include_directories('bsd-user/' / targetos)
85fc1b5d 3080 target_inc += include_directories('bsd-user/host/' / host_arch)
e2a74729 3081 dir = base_dir / abi
19bf129f 3082 arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
2becc36a
PB
3083 endif
3084 target_inc += include_directories(
3085 base_dir,
3a30446a 3086 base_dir / abi,
2becc36a 3087 )
3a30446a
MAL
3088 if 'CONFIG_LINUX_USER' in config_target
3089 dir = base_dir / abi
3090 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
3091 if config_target.has_key('TARGET_SYSTBL_ABI')
3092 arch_srcs += \
3093 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
3094 extra_args : config_target['TARGET_SYSTBL_ABI'])
3095 endif
3096 endif
2becc36a
PB
3097 endif
3098
c9322ab5
MAL
3099 if 'TARGET_XML_FILES' in config_target
3100 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
3101 output: target + '-gdbstub-xml.c',
3102 input: files(config_target['TARGET_XML_FILES'].split()),
3103 command: [feature_to_c, '@INPUT@'],
3104 capture: true)
3105 arch_srcs += gdbstub_xml
3106 endif
3107
ffb91f68 3108 t = target_arch[target_base_arch].apply(config_target, strict: false)
abff1abf 3109 arch_srcs += t.sources()
64ed6f92 3110 arch_deps += t.dependencies()
abff1abf 3111
2becc36a
PB
3112 target_common = common_ss.apply(config_target, strict: false)
3113 objects = common_all.extract_objects(target_common.sources())
64ed6f92 3114 deps = target_common.dependencies()
2becc36a 3115
2becc36a
PB
3116 target_specific = specific_ss.apply(config_target, strict: false)
3117 arch_srcs += target_specific.sources()
64ed6f92 3118 arch_deps += target_specific.dependencies()
2becc36a 3119
64ed6f92 3120 lib = static_library('qemu-' + target,
859aef02 3121 sources: arch_srcs + genh,
b7612f45 3122 dependencies: arch_deps,
2becc36a
PB
3123 objects: objects,
3124 include_directories: target_inc,
64ed6f92
PB
3125 c_args: c_args,
3126 build_by_default: false,
2becc36a 3127 name_suffix: 'fa')
64ed6f92
PB
3128
3129 if target.endswith('-softmmu')
3130 execs = [{
3131 'name': 'qemu-system-' + target_name,
654d6b04 3132 'win_subsystem': 'console',
64ed6f92
PB
3133 'sources': files('softmmu/main.c'),
3134 'dependencies': []
3135 }]
35be72ba 3136 if targetos == 'windows' and (sdl.found() or gtk.found())
64ed6f92
PB
3137 execs += [{
3138 'name': 'qemu-system-' + target_name + 'w',
654d6b04 3139 'win_subsystem': 'windows',
64ed6f92
PB
3140 'sources': files('softmmu/main.c'),
3141 'dependencies': []
3142 }]
3143 endif
537b7248 3144 if get_option('fuzzing')
64ed6f92
PB
3145 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
3146 execs += [{
3147 'name': 'qemu-fuzz-' + target_name,
654d6b04 3148 'win_subsystem': 'console',
64ed6f92
PB
3149 'sources': specific_fuzz.sources(),
3150 'dependencies': specific_fuzz.dependencies(),
64ed6f92
PB
3151 }]
3152 endif
3153 else
3154 execs = [{
3155 'name': 'qemu-' + target_name,
654d6b04 3156 'win_subsystem': 'console',
64ed6f92
PB
3157 'sources': [],
3158 'dependencies': []
3159 }]
3160 endif
3161 foreach exe: execs
8a74ce61 3162 exe_name = exe['name']
3983a767 3163 if targetos == 'darwin'
8a74ce61
AG
3164 exe_name += '-unsigned'
3165 endif
3166
3167 emulator = executable(exe_name, exe['sources'],
237377ac 3168 install: true,
64ed6f92
PB
3169 c_args: c_args,
3170 dependencies: arch_deps + deps + exe['dependencies'],
3171 objects: lib.extract_all_objects(recursive: true),
3172 link_language: link_language,
3173 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
3174 link_args: link_args,
654d6b04 3175 win_subsystem: exe['win_subsystem'])
8a74ce61 3176
3983a767 3177 if targetos == 'darwin'
411ad8dd
AO
3178 icon = 'pc-bios/qemu.rsrc'
3179 build_input = [emulator, files(icon)]
3180 install_input = [
3181 get_option('bindir') / exe_name,
3182 meson.current_source_dir() / icon
3183 ]
3184 if 'CONFIG_HVF' in config_target
3185 entitlements = 'accel/hvf/entitlements.plist'
3186 build_input += files(entitlements)
3187 install_input += meson.current_source_dir() / entitlements
3188 endif
3189
235b523d 3190 entitlement = find_program('scripts/entitlement.sh')
8a74ce61 3191 emulators += {exe['name'] : custom_target(exe['name'],
411ad8dd 3192 input: build_input,
8a74ce61 3193 output: exe['name'],
235b523d 3194 command: [entitlement, '@OUTPUT@', '@INPUT@'])
8a74ce61 3195 }
237377ac 3196
235b523d 3197 meson.add_install_script(entitlement, '--install',
237377ac 3198 get_option('bindir') / exe['name'],
411ad8dd 3199 install_input)
8a74ce61
AG
3200 else
3201 emulators += {exe['name']: emulator}
3202 endif
10e1d263 3203
9c29b741 3204 if stap.found()
10e1d263 3205 foreach stp: [
bd5f973a
SH
3206 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
3207 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
10e1d263
MAL
3208 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
3209 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
3210 ]
bd5f973a 3211 custom_target(exe['name'] + stp['ext'],
10e1d263 3212 input: trace_events_all,
bd5f973a 3213 output: exe['name'] + stp['ext'],
10e1d263 3214 install: stp['install'],
16bf7a33 3215 install_dir: get_option('datadir') / 'systemtap/tapset',
10e1d263
MAL
3216 command: [
3217 tracetool, '--group=all', '--format=' + stp['fmt'],
3218 '--binary=' + stp['bin'],
3219 '--target-name=' + target_name,
3220 '--target-type=' + target_type,
3221 '--probe-prefix=qemu.' + target_type + '.' + target_name,
c05012a3 3222 '@INPUT@', '@OUTPUT@'
0572d6cd
SH
3223 ],
3224 depend_files: tracetool_depends)
10e1d263
MAL
3225 endforeach
3226 endif
64ed6f92 3227 endforeach
2becc36a
PB
3228endforeach
3229
931049b4 3230# Other build targets
897b5afa 3231
f556b4a1
PB
3232if 'CONFIG_PLUGIN' in config_host
3233 install_headers('include/qemu/qemu-plugin.h')
3234endif
3235
20cf5cb4 3236subdir('qga')
f15bff25 3237
9755c94a
LV
3238# Don't build qemu-keymap if xkbcommon is not explicitly enabled
3239# when we don't build tools or system
4113f4cf 3240if xkbcommon.found()
28742467
MAL
3241 # used for the update-keymaps target, so include rules even if !have_tools
3242 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
3243 dependencies: [qemuutil, xkbcommon], install: have_tools)
3244endif
3245
931049b4 3246if have_tools
b7c70bf2
MAL
3247 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
3248 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
3249 qemu_io = executable('qemu-io', files('qemu-io.c'),
3250 dependencies: [block, qemuutil], install: true)
eb705985 3251 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
3d212b41
RJ
3252 dependencies: [blockdev, qemuutil, gnutls, selinux],
3253 install: true)
b7c70bf2 3254
7c58bb76 3255 subdir('storage-daemon')
a9c9727c 3256 subdir('contrib/rdmacm-mux')
1d7bb6ab 3257 subdir('contrib/elf2dmp')
a9c9727c 3258
157e7b13
MAL
3259 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
3260 dependencies: qemuutil,
3261 install: true)
3262
931049b4 3263 if 'CONFIG_VHOST_USER' in config_host
2d7ac0af 3264 subdir('contrib/vhost-user-blk')
b7612f45 3265 subdir('contrib/vhost-user-gpu')
32fcc624 3266 subdir('contrib/vhost-user-input')
99650b62 3267 subdir('contrib/vhost-user-scsi')
931049b4 3268 endif
8f51e01c
MAL
3269
3270 if targetos == 'linux'
3271 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
3272 dependencies: [qemuutil, libcap_ng],
3273 install: true,
3274 install_dir: get_option('libexecdir'))
897b5afa
MAL
3275
3276 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
3277 dependencies: [authz, crypto, io, qom, qemuutil,
6ec0e15d 3278 libcap_ng, mpathpersist],
897b5afa 3279 install: true)
8f51e01c
MAL
3280 endif
3281
ccd250aa 3282 if have_ivshmem
5ee24e78
MAL
3283 subdir('contrib/ivshmem-client')
3284 subdir('contrib/ivshmem-server')
3285 endif
931049b4
PB
3286endif
3287
f5aa6320 3288subdir('scripts')
3f99cf57 3289subdir('tools')
bdcbea7a 3290subdir('pc-bios')
f8aa24ea 3291subdir('docs')
e3667660 3292subdir('tests')
1b695471 3293if gtk.found()
e8f3bd71
MAL
3294 subdir('po')
3295endif
3f99cf57 3296
8adfeba9
MAL
3297if host_machine.system() == 'windows'
3298 nsis_cmd = [
3299 find_program('scripts/nsis.py'),
3300 '@OUTPUT@',
3301 get_option('prefix'),
3302 meson.current_source_dir(),
24bdcc96 3303 host_machine.cpu(),
8adfeba9
MAL
3304 '--',
3305 '-DDISPLAYVERSION=' + meson.project_version(),
3306 ]
3307 if build_docs
3308 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
3309 endif
1b695471 3310 if gtk.found()
8adfeba9
MAL
3311 nsis_cmd += '-DCONFIG_GTK=y'
3312 endif
3313
3314 nsis = custom_target('nsis',
3315 output: 'qemu-setup-' + meson.project_version() + '.exe',
3316 input: files('qemu.nsi'),
3317 build_always_stale: true,
3318 command: nsis_cmd + ['@INPUT@'])
3319 alias_target('installer', nsis)
3320endif
3321
a0c9162c
PB
3322#########################
3323# Configuration summary #
3324#########################
3325
983d0a75 3326# Directories
f9332757 3327summary_info = {}
16bf7a33
PB
3328summary_info += {'Install prefix': get_option('prefix')}
3329summary_info += {'BIOS directory': qemu_datadir}
3330summary_info += {'firmware path': get_option('qemu_firmwarepath')}
3331summary_info += {'binary directory': get_option('bindir')}
3332summary_info += {'library directory': get_option('libdir')}
3333summary_info += {'module directory': qemu_moddir}
3334summary_info += {'libexec directory': get_option('libexecdir')}
3335summary_info += {'include directory': get_option('includedir')}
3336summary_info += {'config directory': get_option('sysconfdir')}
f9332757 3337if targetos != 'windows'
16bf7a33 3338 summary_info += {'local state directory': get_option('localstatedir')}
b81efab7 3339 summary_info += {'Manual directory': get_option('mandir')}
f9332757
PB
3340else
3341 summary_info += {'local state directory': 'queried at runtime'}
3342endif
491e74c1 3343summary_info += {'Doc directory': get_option('docdir')}
f9332757
PB
3344summary_info += {'Build directory': meson.current_build_dir()}
3345summary_info += {'Source path': meson.current_source_dir()}
f9332757 3346summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
983d0a75
PMD
3347summary(summary_info, bool_yn: true, section: 'Directories')
3348
e11a0e17
PMD
3349# Host binaries
3350summary_info = {}
3351summary_info += {'git': config_host['GIT']}
3352summary_info += {'make': config_host['MAKE']}
3353summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
bb647c49 3354summary_info += {'sphinx-build': sphinx_build}
e11a0e17
PMD
3355if config_host.has_key('HAVE_GDB_BIN')
3356 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
3357endif
3358summary_info += {'genisoimage': config_host['GENISOIMAGE']}
20cf5cb4 3359if targetos == 'windows' and have_ga
bb647c49 3360 summary_info += {'wixl': wixl}
e11a0e17 3361endif
35acbb30
PB
3362if slirp_opt != 'disabled' and have_system
3363 summary_info += {'smbd': have_slirp_smbd ? smbd_path : false}
e11a0e17
PMD
3364endif
3365summary(summary_info, bool_yn: true, section: 'Host binaries')
3366
1d718865
PMD
3367# Configurable features
3368summary_info = {}
3369summary_info += {'Documentation': build_docs}
aa3ca634
PMD
3370summary_info += {'system-mode emulation': have_system}
3371summary_info += {'user-mode emulation': have_user}
813803aa 3372summary_info += {'block layer': have_block}
1d718865
PMD
3373summary_info += {'Install blobs': get_option('install_blobs')}
3374summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
3375if config_host.has_key('CONFIG_MODULES')
3376 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
3377endif
537b7248 3378summary_info += {'fuzzing support': get_option('fuzzing')}
1d718865 3379if have_system
87430d5b 3380 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
1d718865 3381endif
9c29b741
PB
3382summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
3383if 'simple' in get_option('trace_backends')
3384 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
1d718865 3385endif
142ca628 3386summary_info += {'D-Bus display': dbus_display}
c55cf6ab 3387summary_info += {'QOM debugging': get_option('qom_cast_debug')}
1d718865
PMD
3388summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
3389summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
3390summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
3391summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
3392summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
3393summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
3394summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
3395summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
3396summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
20cf5cb4 3397summary_info += {'build guest agent': have_ga}
1d718865
PMD
3398summary(summary_info, bool_yn: true, section: 'Configurable features')
3399
2e864b8b 3400# Compilation information
983d0a75 3401summary_info = {}
2e864b8b
PMD
3402summary_info += {'host CPU': cpu}
3403summary_info += {'host endianness': build_machine.endian()}
63de9353
AB
3404summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
3405summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
f9332757 3406if link_language == 'cpp'
63de9353 3407 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
f9332757
PB
3408else
3409 summary_info += {'C++ compiler': false}
3410endif
3411if targetos == 'darwin'
63de9353 3412 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
f9332757 3413endif
47b30835
PB
3414summary_info += {'CFLAGS': ' '.join(get_option('c_args')
3415 + ['-O' + get_option('optimization')]
3416 + (get_option('debug') ? ['-g'] : []))}
3417if link_language == 'cpp'
3418 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
3419 + ['-O' + get_option('optimization')]
3420 + (get_option('debug') ? ['-g'] : []))}
3421endif
3422link_args = get_option(link_language + '_link_args')
3423if link_args.length() > 0
3424 summary_info += {'LDFLAGS': ' '.join(link_args)}
3425endif
f9332757
PB
3426summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
3427summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
c55cf6ab 3428summary_info += {'profiler': get_option('profiler')}
cdad781d 3429summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
2e864b8b 3430summary_info += {'PIE': get_option('b_pie')}
3e8529dd 3431summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
2e864b8b 3432summary_info += {'malloc trim support': has_malloc_trim}
b87df904 3433summary_info += {'membarrier': have_membarrier}
728c0a2f 3434summary_info += {'debug stack usage': get_option('debug_stack_usage')}
c55cf6ab 3435summary_info += {'mutex debugging': get_option('debug_mutex')}
2e864b8b 3436summary_info += {'memory allocator': get_option('malloc')}
622753d2
PB
3437summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
3438summary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')}
c55cf6ab 3439summary_info += {'gprof enabled': get_option('gprof')}
2e864b8b
PMD
3440summary_info += {'gcov': get_option('b_coverage')}
3441summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
3442summary_info += {'CFI support': get_option('cfi')}
3443if get_option('cfi')
3444 summary_info += {'CFI debug support': get_option('cfi_debug')}
3445endif
3446summary_info += {'strip binaries': get_option('strip')}
bb647c49 3447summary_info += {'sparse': sparse}
2e864b8b 3448summary_info += {'mingw32 support': targetos == 'windows'}
49e8565b
AB
3449
3450# snarf the cross-compilation information for tests
3451foreach target: target_dirs
3452 tcg_mak = meson.current_build_dir() / 'tests/tcg' / 'config-' + target + '.mak'
3453 if fs.exists(tcg_mak)
3454 config_cross_tcg = keyval.load(tcg_mak)
3455 target = config_cross_tcg['TARGET_NAME']
3456 compiler = ''
3457 if 'DOCKER_CROSS_CC_GUEST' in config_cross_tcg
3458 summary_info += {target + ' tests': config_cross_tcg['DOCKER_CROSS_CC_GUEST'] +
3459 ' via ' + config_cross_tcg['DOCKER_IMAGE']}
3460 elif 'CROSS_CC_GUEST' in config_cross_tcg
3461 summary_info += {target + ' tests'
3462 : config_cross_tcg['CROSS_CC_GUEST'] }
3463 endif
3464 endif
3465endforeach
3466
2e864b8b
PMD
3467summary(summary_info, bool_yn: true, section: 'Compilation')
3468
aa3ca634 3469# Targets and accelerators
2e864b8b 3470summary_info = {}
aa3ca634
PMD
3471if have_system
3472 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
3473 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
3474 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
3475 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
74a414a1 3476 summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')}
aa3ca634
PMD
3477 summary_info += {'Xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
3478 if config_host.has_key('CONFIG_XEN_BACKEND')
3479 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
3480 endif
3481endif
3482summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
3483if config_all.has_key('CONFIG_TCG')
39687aca 3484 if get_option('tcg_interpreter')
f1f727ac 3485 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
39687aca
PMD
3486 else
3487 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
3488 endif
029aa68f 3489 summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')}
aa3ca634 3490 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
aa3ca634 3491endif
2e864b8b 3492summary_info += {'target list': ' '.join(target_dirs)}
aa3ca634
PMD
3493if have_system
3494 summary_info += {'default devices': get_option('default_devices')}
106ad1f9 3495 summary_info += {'out of process emulation': multiprocess_allowed}
aa3ca634
PMD
3496endif
3497summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
3498
813803aa
PMD
3499# Block layer
3500summary_info = {}
3501summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
728c0a2f 3502summary_info += {'coroutine pool': have_coroutine_pool}
813803aa
PMD
3503if have_block
3504 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
3505 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
c55cf6ab 3506 summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
813803aa
PMD
3507 summary_info += {'VirtFS support': have_virtfs}
3508 summary_info += {'build virtiofs daemon': have_virtiofsd}
406523f6
PB
3509 summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')}
3510 summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
ed793c2c
PB
3511 summary_info += {'bochs support': get_option('bochs').allowed()}
3512 summary_info += {'cloop support': get_option('cloop').allowed()}
3513 summary_info += {'dmg support': get_option('dmg').allowed()}
3514 summary_info += {'qcow v1 support': get_option('qcow1').allowed()}
3515 summary_info += {'vdi support': get_option('vdi').allowed()}
3516 summary_info += {'vvfat support': get_option('vvfat').allowed()}
3517 summary_info += {'qed support': get_option('qed').allowed()}
3518 summary_info += {'parallels support': get_option('parallels').allowed()}
bb647c49 3519 summary_info += {'FUSE exports': fuse}
813803aa
PMD
3520endif
3521summary(summary_info, bool_yn: true, section: 'Block layer support')
3522
aa58028a 3523# Crypto
aa3ca634 3524summary_info = {}
f9332757 3525summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
bb647c49
PB
3526summary_info += {'GNUTLS support': gnutls}
3527if gnutls.found()
3528 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
3529endif
3530summary_info += {'libgcrypt': gcrypt}
3531summary_info += {'nettle': nettle}
57612511
PB
3532if nettle.found()
3533 summary_info += {' XTS': xts != 'private'}
f9332757 3534endif
34b52615 3535summary_info += {'AF_ALG support': have_afalg}
c55cf6ab 3536summary_info += {'rng-none': get_option('rng_none')}
aa58028a
PMD
3537summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
3538summary(summary_info, bool_yn: true, section: 'Crypto')
3539
69a78cce 3540# Libraries
aa58028a
PMD
3541summary_info = {}
3542if targetos == 'darwin'
bb647c49
PB
3543 summary_info += {'Cocoa support': cocoa}
3544endif
3545summary_info += {'SDL support': sdl}
3546summary_info += {'SDL image support': sdl_image}
3547summary_info += {'GTK support': gtk}
3548summary_info += {'pixman': pixman}
3549summary_info += {'VTE support': vte}
3550summary_info += {'slirp support': slirp_opt == 'internal' ? slirp_opt : slirp}
3551summary_info += {'libtasn1': tasn1}
3552summary_info += {'PAM': pam}
3553summary_info += {'iconv support': iconv}
3554summary_info += {'curses support': curses}
3555summary_info += {'virgl support': virgl}
3556summary_info += {'curl support': curl}
3557summary_info += {'Multipath support': mpathpersist}
3558summary_info += {'VNC support': vnc}
a0b93237 3559if vnc.found()
bb647c49
PB
3560 summary_info += {'VNC SASL support': sasl}
3561 summary_info += {'VNC JPEG support': jpeg}
3562 summary_info += {'VNC PNG support': png}
f9332757 3563endif
87430d5b
PB
3564if targetos not in ['darwin', 'haiku', 'windows']
3565 summary_info += {'OSS support': oss}
3566elif targetos == 'darwin'
3567 summary_info += {'CoreAudio support': coreaudio}
3568elif targetos == 'windows'
3569 summary_info += {'DirectSound support': dsound}
3570endif
3571if targetos == 'linux'
3572 summary_info += {'ALSA support': alsa}
3573 summary_info += {'PulseAudio support': pulse}
3574endif
3575summary_info += {'JACK support': jack}
bb647c49 3576summary_info += {'brlapi support': brlapi}
e1723999 3577summary_info += {'vde support': vde}
837b84b1 3578summary_info += {'netmap support': have_netmap}
eea9453a 3579summary_info += {'l2tpv3 support': have_l2tpv3}
ff66f3e5 3580summary_info += {'Linux AIO support': libaio}
bb647c49
PB
3581summary_info += {'Linux io_uring support': linux_io_uring}
3582summary_info += {'ATTR/XATTR support': libattr}
f9332757
PB
3583summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
3584summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
fbb4121d 3585summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
bb647c49
PB
3586summary_info += {'libcap-ng support': libcap_ng}
3587summary_info += {'bpf support': libbpf}
3f0a5d55
MAL
3588summary_info += {'spice protocol support': spice_protocol}
3589if spice_protocol.found()
3590 summary_info += {' spice server support': spice}
3591endif
bb647c49 3592summary_info += {'rbd support': rbd}
bb647c49
PB
3593summary_info += {'smartcard support': cacard}
3594summary_info += {'U2F support': u2f}
3595summary_info += {'libusb': libusb}
3596summary_info += {'usb net redir': usbredir}
f9332757 3597summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
bb647c49
PB
3598summary_info += {'GBM': gbm}
3599summary_info += {'libiscsi support': libiscsi}
3600summary_info += {'libnfs support': libnfs}
f9332757 3601if targetos == 'windows'
20cf5cb4 3602 if have_ga
8821a389 3603 summary_info += {'QGA VSS support': have_qga_vss}
b846ab7c 3604 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
b846ab7c 3605 endif
f9332757 3606endif
bb647c49
PB
3607summary_info += {'seccomp support': seccomp}
3608summary_info += {'GlusterFS support': glusterfs}
0d04c4c9 3609summary_info += {'TPM support': have_tpm}
e6a52b36 3610summary_info += {'libssh support': libssh}
bb647c49
PB
3611summary_info += {'lzo support': lzo}
3612summary_info += {'snappy support': snappy}
3613summary_info += {'bzip2 support': libbzip2}
3614summary_info += {'lzfse support': liblzfse}
3615summary_info += {'zstd support': zstd}
488a8c73 3616summary_info += {'NUMA host support': numa}
bb647c49
PB
3617summary_info += {'capstone': capstone_opt == 'internal' ? capstone_opt : capstone}
3618summary_info += {'libpmem support': libpmem}
3619summary_info += {'libdaxctl support': libdaxctl}
3620summary_info += {'libudev': libudev}
3621# Dummy dependency, keep .found()
df4ea709 3622summary_info += {'FUSE lseek': fuse_lseek.found()}
3d212b41 3623summary_info += {'selinux': selinux}
69a78cce 3624summary(summary_info, bool_yn: true, section: 'Dependencies')
f9332757
PB
3625
3626if not supported_cpus.contains(cpu)
3627 message()
3628 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
3629 message()
3630 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
3631 message('The QEMU project intends to remove support for this host CPU in')
3632 message('a future release if nobody volunteers to maintain it and to')
3633 message('provide a build host for our continuous integration setup.')
3634 message('configure has succeeded and you can continue to build, but')
3635 message('if you care about QEMU on this platform you should contact')
3636 message('us upstream at qemu-devel@nongnu.org.')
3637endif
3638
3639if not supported_oses.contains(targetos)
3640 message()
3641 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
3642 message()
3643 message('Host OS ' + targetos + 'support is not currently maintained.')
3644 message('The QEMU project intends to remove support for this host OS in')
3645 message('a future release if nobody volunteers to maintain it and to')
3646 message('provide a build host for our continuous integration setup.')
3647 message('configure has succeeded and you can continue to build, but')
3648 message('if you care about QEMU on this platform you should contact')
3649 message('us upstream at qemu-devel@nongnu.org.')
3650endif