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