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