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