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