blob: 2e0c2eaaa7276ed8e9728f9974186e2b0ea82420 [file] [log] [blame]
Paolo Bonzini3b087f72021-12-23 15:29:56 +01001project('qemu', ['c'], meson_version: '>=0.63.0',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002 default_options: ['warning_level=1', 'c_std=gnu11', 'cpp_std=gnu++11', 'b_colorout=auto',
Paolo Bonzini0a31e3a2022-04-20 17:33:59 +02003 'b_staticpic=false', 'stdsplit=false', 'optimization=2', 'b_pie=true'],
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004 version: files('VERSION'))
Paolo Bonzinia5665052019-06-10 12:05:14 +02005
Thomas Huthe2870722022-03-10 08:50:48 +01006add_test_setup('quick', exclude_suites: ['slow', 'thorough'], is_default: true)
7add_test_setup('slow', exclude_suites: ['thorough'], env: ['G_TEST_SLOW=1', 'SPEED=slow'])
8add_test_setup('thorough', env: ['G_TEST_SLOW=1', 'SPEED=thorough'])
Paolo Bonzini3d2f73e2021-02-11 06:15:12 -05009
Akihiko Odakicf60ccc2022-06-24 23:50:37 +090010meson.add_postconf_script(find_program('scripts/symlink-install-tree.py'))
11
Paolo Bonziniea444d92023-09-08 12:06:12 +020012####################
13# Global variables #
14####################
15
Paolo Bonzinia5665052019-06-10 12:05:14 +020016not_found = dependency('', required: false)
Paolo Bonzini654d6b02021-02-09 14:59:26 +010017keyval = import('keyval')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040018ss = import('sourceset')
Richard Henderson8b18cdb2020-09-13 12:19:25 -070019fs = import('fs')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040020
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +010021host_os = host_machine.system()
Paolo Bonzinia5665052019-06-10 12:05:14 +020022config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +010023
Yonggang Luoe3667662020-10-16 06:06:25 +080024# Temporary directory used for files created while
25# configure runs. Since it is in the build directory
26# we can safely blow away any previous version of it
27# (and we need not jump through hoops to try to delete
28# it when configure exits.)
29tmpdir = meson.current_build_dir() / 'meson-private/temp'
Marc-André Lureau8fe11232020-09-11 14:42:48 +020030
31if get_option('qemu_suffix').startswith('/')
32 error('qemu_suffix cannot start with a /')
33endif
34
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040035qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
Marc-André Lureauab4c0992020-08-26 15:04:16 +040036qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040037qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040038qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
39
40qemu_desktopdir = get_option('datadir') / 'applications'
41qemu_icondir = get_option('datadir') / 'icons'
42
Paolo Bonzini859aef02020-08-04 18:14:26 +020043genh = []
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +010044qapi_trace_events = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020045
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020046bsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin']
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040047supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Philippe Mathieu-Daudé278c1bc2023-06-27 16:32:34 +020048supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
Richard Henderson6d0b52e2022-10-17 08:00:57 +030049 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64']
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040050
51cpu = host_machine.cpu_family()
Richard Hendersonc94c2392021-11-16 10:50:42 +010052
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020053target_dirs = config_host['TARGET_DIRS'].split()
Paolo Bonzini44458a62023-09-08 12:06:57 +020054
55############
56# Programs #
57############
58
59sh = find_program('sh')
60python = import('python').find_installation()
61
62cc = meson.get_compiler('c')
63all_languages = ['c']
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +010064if host_os == 'windows' and add_languages('cpp', required: false, native: false)
Paolo Bonzini44458a62023-09-08 12:06:57 +020065 all_languages += ['cpp']
66 cxx = meson.get_compiler('cpp')
67endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +010068if host_os == 'darwin' and \
Paolo Bonzini44458a62023-09-08 12:06:57 +020069 add_languages('objc', required: get_option('cocoa'), native: false)
70 all_languages += ['objc']
71 objc = meson.get_compiler('objc')
72endif
73
74dtrace = not_found
75stap = not_found
76if 'dtrace' in get_option('trace_backends')
77 dtrace = find_program('dtrace', required: true)
78 stap = find_program('stap', required: false)
79 if stap.found()
80 # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
81 # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
82 # instead. QEMU --enable-modules depends on this because the SystemTap
83 # semaphores are linked into the main binary and not the module's shared
84 # object.
85 add_global_arguments('-DSTAP_SDT_V2',
86 native: false, language: all_languages)
87 endif
88endif
89
90if get_option('iasl') == ''
91 iasl = find_program('iasl', required: false)
92else
93 iasl = find_program(get_option('iasl'), required: true)
94endif
95
96edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
97unpack_edk2_blobs = false
98foreach target : edk2_targets
99 if target in target_dirs
100 bzip2 = find_program('bzip2', required: get_option('install_blobs'))
101 unpack_edk2_blobs = bzip2.found()
102 break
103 endif
104endforeach
105
106#####################
107# Option validation #
108#####################
109
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100110# Fuzzing
111if get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
112 not cc.links('''
113 #include <stdint.h>
114 #include <sys/types.h>
115 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
116 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
117 ''',
118 args: ['-Werror', '-fsanitize=fuzzer'])
119 error('Your compiler does not support -fsanitize=fuzzer')
120endif
121
122# Tracing backends
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100123if 'ftrace' in get_option('trace_backends') and host_os != 'linux'
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100124 error('ftrace is supported only on Linux')
125endif
126if 'syslog' in get_option('trace_backends') and not cc.compiles('''
127 #include <syslog.h>
128 int main(void) {
129 openlog("qemu", LOG_PID, LOG_DAEMON);
130 syslog(LOG_INFO, "configure");
131 return 0;
132 }''')
133 error('syslog is not supported on this system')
134endif
135
136# Miscellaneous Linux-only features
137get_option('mpath') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100138 .require(host_os == 'linux', error_message: 'Multipath is supported only on Linux')
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100139
140multiprocess_allowed = get_option('multiprocess') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100141 .require(host_os == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100142 .allowed()
143
144vfio_user_server_allowed = get_option('vfio_user_server') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100145 .require(host_os == 'linux', error_message: 'vfio-user server is supported only on Linux') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100146 .allowed()
147
148have_tpm = get_option('tpm') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100149 .require(host_os != 'windows', error_message: 'TPM emulation only available on POSIX systems') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100150 .allowed()
151
152# vhost
153have_vhost_user = get_option('vhost_user') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100154 .disable_auto_if(host_os != 'linux') \
155 .require(host_os != 'windows',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100156 error_message: 'vhost-user is not available on Windows').allowed()
157have_vhost_vdpa = get_option('vhost_vdpa') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100158 .require(host_os == 'linux',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100159 error_message: 'vhost-vdpa is only available on Linux').allowed()
160have_vhost_kernel = get_option('vhost_kernel') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100161 .require(host_os == 'linux',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100162 error_message: 'vhost-kernel is only available on Linux').allowed()
163have_vhost_user_crypto = get_option('vhost_crypto') \
164 .require(have_vhost_user,
165 error_message: 'vhost-crypto requires vhost-user to be enabled').allowed()
166
167have_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel
168
169have_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed()
170have_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed()
171have_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed()
172have_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa
173
174# type of binaries to build
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200175have_linux_user = false
176have_bsd_user = false
177have_system = false
178foreach target : target_dirs
179 have_linux_user = have_linux_user or target.endswith('linux-user')
180 have_bsd_user = have_bsd_user or target.endswith('bsd-user')
181 have_system = have_system or target.endswith('-softmmu')
182endforeach
183have_user = have_linux_user or have_bsd_user
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100184
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200185have_tools = get_option('tools') \
186 .disable_auto_if(not have_system) \
187 .allowed()
188have_ga = get_option('guest_agent') \
189 .disable_auto_if(not have_system and not have_tools) \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100190 .require(host_os in ['sunos', 'linux', 'windows', 'freebsd', 'netbsd', 'openbsd'],
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200191 error_message: 'unsupported OS for QEMU guest agent') \
192 .allowed()
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100193have_block = have_system or have_tools
194
Paolo Bonzini60027112022-10-20 14:53:10 +0200195enable_modules = get_option('modules') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100196 .require(host_os != 'windows',
Paolo Bonzini60027112022-10-20 14:53:10 +0200197 error_message: 'Modules are not available for Windows') \
198 .require(not get_option('prefer_static'),
199 error_message: 'Modules are incompatible with static linking') \
200 .allowed()
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200201
Paolo Bonziniea444d92023-09-08 12:06:12 +0200202#######################################
203# Variables for host and accelerators #
204#######################################
205
Paolo Bonzini823eb012021-11-08 14:18:17 +0100206if cpu not in supported_cpus
207 host_arch = 'unknown'
208elif cpu == 'x86'
209 host_arch = 'i386'
Richard Henderson0e3ed772021-12-31 05:25:11 +0000210elif cpu == 'mips64'
211 host_arch = 'mips'
Philippe Mathieu-Daudé278c1bc2023-06-27 16:32:34 +0200212elif cpu in ['riscv32', 'riscv64']
213 host_arch = 'riscv'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100214else
215 host_arch = cpu
216endif
217
Paolo Bonzini8a199802020-09-18 05:37:01 -0400218if cpu in ['x86', 'x86_64']
219 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
220elif cpu == 'aarch64'
221 kvm_targets = ['aarch64-softmmu']
222elif cpu == 's390x'
223 kvm_targets = ['s390x-softmmu']
224elif cpu in ['ppc', 'ppc64']
225 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Huacai Chenfbc58842020-10-07 16:39:28 +0800226elif cpu in ['mips', 'mips64']
227 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Philippe Mathieu-Daudé4de81092023-06-27 16:32:35 +0200228elif cpu in ['riscv32']
229 kvm_targets = ['riscv32-softmmu']
230elif cpu in ['riscv64']
231 kvm_targets = ['riscv64-softmmu']
Tianrui Zhao714b03c2024-01-05 15:58:04 +0800232elif cpu in ['loongarch64']
233 kvm_targets = ['loongarch64-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400234else
235 kvm_targets = []
236endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400237accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alexander Graf844a06b2021-09-16 17:54:02 +0200238
Paolo Bonzini16b62732023-12-09 15:31:15 +0100239if cpu in ['x86', 'x86_64']
240 xen_targets = ['i386-softmmu', 'x86_64-softmmu']
241elif cpu in ['arm', 'aarch64']
242 # i386 emulator provides xenpv machine type for multiple architectures
243 xen_targets = ['i386-softmmu', 'x86_64-softmmu', 'aarch64-softmmu']
244else
245 xen_targets = []
246endif
247accelerator_targets += { 'CONFIG_XEN': xen_targets }
248
Alexander Graf844a06b2021-09-16 17:54:02 +0200249if cpu in ['aarch64']
250 accelerator_targets += {
251 'CONFIG_HVF': ['aarch64-softmmu']
252 }
253endif
254
Paolo Bonzini8a199802020-09-18 05:37:01 -0400255if cpu in ['x86', 'x86_64']
256 accelerator_targets += {
Paolo Bonzini8a199802020-09-18 05:37:01 -0400257 'CONFIG_HVF': ['x86_64-softmmu'],
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200258 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400259 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
260 }
261endif
262
Paolo Bonzinia1b176f2021-07-12 14:22:08 +0200263modular_tcg = []
264# Darwin does not support references to thread-local variables in modules
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100265if host_os != 'darwin'
Paolo Bonzinia1b176f2021-07-12 14:22:08 +0200266 modular_tcg = ['i386-softmmu', 'x86_64-softmmu']
267endif
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +0200268
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400269##################
270# Compiler flags #
271##################
272
Paolo Bonzini13f60de2022-10-20 14:34:27 +0200273foreach lang : all_languages
274 compiler = meson.get_compiler(lang)
275 if compiler.get_id() == 'gcc' and compiler.version().version_compare('>=7.4')
276 # ok
277 elif compiler.get_id() == 'clang' and compiler.compiles('''
278 #ifdef __apple_build_version__
279 # if __clang_major__ < 12 || (__clang_major__ == 12 && __clang_minor__ < 0)
280 # error You need at least XCode Clang v12.0 to compile QEMU
281 # endif
282 #else
283 # if __clang_major__ < 10 || (__clang_major__ == 10 && __clang_minor__ < 0)
284 # error You need at least Clang v10.0 to compile QEMU
285 # endif
286 #endif''')
287 # ok
288 else
289 error('You either need GCC v7.4 or Clang v10.0 (or XCode Clang v12.0) to compile QEMU')
290 endif
291endforeach
292
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200293# default flags for all hosts
294# We use -fwrapv to tell the compiler that we require a C dialect where
295# left shift of signed integers is well defined and has the expected
296# 2s-complement style results. (Both clang and gcc agree that it
297# provides these semantics.)
298
299qemu_common_flags = [
300 '-D_GNU_SOURCE', '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE_SOURCE',
301 '-fno-strict-aliasing', '-fno-common', '-fwrapv' ]
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200302qemu_cflags = []
Paolo Bonzini911d4ca2022-10-12 12:46:23 +0200303qemu_ldflags = []
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100304
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100305if host_os == 'darwin'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200306 # Disable attempts to use ObjectiveC features in os/object.h since they
307 # won't work when we're compiling with gcc as a C compiler.
Alexander Graf2fc36532023-08-30 16:14:14 +0000308 if compiler.get_id() == 'gcc'
309 qemu_common_flags += '-DOS_OBJECT_USE_OBJC=0'
310 endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100311elif host_os == 'sunos'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200312 # needed for CMSG_ macros in sys/socket.h
313 qemu_common_flags += '-D_XOPEN_SOURCE=600'
314 # needed for TIOCWIN* defines in termios.h
315 qemu_common_flags += '-D__EXTENSIONS__'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100316elif host_os == 'haiku'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200317 qemu_common_flags += ['-DB_USE_POSITIVE_POSIX_ERRORS', '-D_BSD_SOURCE', '-fPIC']
318endif
319
320# __sync_fetch_and_and requires at least -march=i486. Many toolchains
321# use i686 as default anyway, but for those that don't, an explicit
322# specification is necessary
323if host_arch == 'i386' and not cc.links('''
324 static int sfaa(int *ptr)
325 {
326 return __sync_fetch_and_and(ptr, 0);
327 }
328
329 int main(void)
330 {
331 int val = 42;
332 val = __sync_val_compare_and_swap(&val, 0, 1);
333 sfaa(&val);
334 return val;
335 }''')
336 qemu_common_flags = ['-march=i486'] + qemu_common_flags
337endif
338
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +0200339if get_option('prefer_static')
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100340 qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
341endif
342
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200343# Meson currently only handles pie as a boolean for now, so if the user
344# has explicitly disabled PIE we need to extend our cflags.
Paolo Bonzinib03fcd62023-05-22 10:05:33 +0200345#
346# -no-pie is supposedly a linker flag that has no effect on the compiler
347# command line, but some distros, that didn't quite know what they were
348# doing, made local changes to gcc's specs file that turned it into
349# a compiler command-line flag.
350#
351# What about linker flags? For a static build, no PIE is implied by -static
352# which we added above (and if it's not because of the same specs patching,
353# there's nothing we can do: compilation will fail, report a bug to your
354# distro and do not use --disable-pie in the meanwhile). For dynamic linking,
355# instead, we can't add -no-pie because it overrides -shared: the linker then
356# tries to build an executable instead of a shared library and fails. So
357# don't add -no-pie anywhere and cross fingers. :(
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200358if not get_option('b_pie')
Paolo Bonzinib03fcd62023-05-22 10:05:33 +0200359 qemu_common_flags += cc.get_supported_arguments('-fno-pie', '-no-pie')
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200360endif
361
Paolo Bonzini911d4ca2022-10-12 12:46:23 +0200362if not get_option('stack_protector').disabled()
363 stack_protector_probe = '''
364 int main(int argc, char *argv[])
365 {
366 char arr[64], *p = arr, *c = argv[argc - 1];
367 while (*c) {
368 *p++ = *c++;
369 }
370 return 0;
371 }'''
372 have_stack_protector = false
373 foreach arg : ['-fstack-protector-strong', '-fstack-protector-all']
374 # We need to check both a compile and a link, since some compiler
375 # setups fail only on a .c->.o compile and some only at link time
376 if cc.compiles(stack_protector_probe, args: ['-Werror', arg]) and \
377 cc.links(stack_protector_probe, args: ['-Werror', arg])
378 have_stack_protector = true
379 qemu_cflags += arg
380 qemu_ldflags += arg
381 break
382 endif
383 endforeach
384 get_option('stack_protector') \
385 .require(have_stack_protector, error_message: 'Stack protector not supported')
386endif
387
Paolo Bonzini67398252022-10-12 13:19:35 +0200388coroutine_backend = get_option('coroutine_backend')
389ucontext_probe = '''
390 #include <ucontext.h>
391 #ifdef __stub_makecontext
392 #error Ignoring glibc stub makecontext which will always fail
393 #endif
394 int main(void) { makecontext(0, 0, 0); return 0; }'''
395
396# On Windows the only valid backend is the Windows specific one.
397# For POSIX prefer ucontext, but it's not always possible. The fallback
398# is sigcontext.
399supported_backends = []
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100400if host_os == 'windows'
Paolo Bonzini67398252022-10-12 13:19:35 +0200401 supported_backends += ['windows']
402else
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100403 if host_os != 'darwin' and cc.links(ucontext_probe)
Paolo Bonzini67398252022-10-12 13:19:35 +0200404 supported_backends += ['ucontext']
405 endif
406 supported_backends += ['sigaltstack']
407endif
408
409if coroutine_backend == 'auto'
410 coroutine_backend = supported_backends[0]
411elif coroutine_backend not in supported_backends
412 error('"@0@" backend requested but not available. Available backends: @1@' \
413 .format(coroutine_backend, ', '.join(supported_backends)))
414endif
415
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200416# Compiles if SafeStack *not* enabled
417safe_stack_probe = '''
418 int main(void)
419 {
420 #if defined(__has_feature)
421 #if __has_feature(safe_stack)
422 #error SafeStack Enabled
423 #endif
424 #endif
425 return 0;
426 }'''
427if get_option('safe_stack') != not cc.compiles(safe_stack_probe)
428 safe_stack_arg = get_option('safe_stack') ? '-fsanitize=safe-stack' : '-fno-sanitize=safe-stack'
429 if get_option('safe_stack') != not cc.compiles(safe_stack_probe, args: safe_stack_arg)
430 error(get_option('safe_stack') \
431 ? 'SafeStack not supported by your compiler' \
432 : 'Cannot disable SafeStack')
433 endif
434 qemu_cflags += safe_stack_arg
435 qemu_ldflags += safe_stack_arg
436endif
Paolo Bonzini67398252022-10-12 13:19:35 +0200437if get_option('safe_stack') and coroutine_backend != 'ucontext'
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200438 error('SafeStack is only supported with the ucontext coroutine backend')
439endif
440
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100441if get_option('sanitizers')
442 if cc.has_argument('-fsanitize=address')
443 qemu_cflags = ['-fsanitize=address'] + qemu_cflags
444 qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags
445 endif
446
447 # Detect static linking issue with ubsan - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
448 if cc.links('int main(int argc, char **argv) { return argc + 1; }',
449 args: [qemu_ldflags, '-fsanitize=undefined'])
450 qemu_cflags = ['-fsanitize=undefined'] + qemu_cflags
451 qemu_ldflags = ['-fsanitize=undefined'] + qemu_ldflags
452 endif
453endif
454
455# Thread sanitizer is, for now, much noisier than the other sanitizers;
456# keep it separate until that is not the case.
457if get_option('tsan')
458 if get_option('sanitizers')
459 error('TSAN is not supported with other sanitizers')
460 endif
461 if not cc.has_function('__tsan_create_fiber',
462 args: '-fsanitize=thread',
463 prefix: '#include <sanitizer/tsan_interface.h>')
464 error('Cannot enable TSAN due to missing fiber annotation interface')
465 endif
466 qemu_cflags = ['-fsanitize=thread'] + qemu_cflags
467 qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags
468endif
469
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100470# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
471# The combination is known as "full relro", because .got.plt is read-only too.
472qemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
473
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100474if host_os == 'windows'
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200475 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat')
Paolo Bonzini2d73fa72022-11-02 13:03:51 +0100476 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200477endif
478
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200479# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100480if host_os != 'sunos' and not get_option('tsan')
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200481 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--warn-common')
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +0200482endif
483
Paolo Bonzini537b7242021-10-07 15:08:12 +0200484if get_option('fuzzing')
Paolo Bonzini537b7242021-10-07 15:08:12 +0200485 # Specify a filter to only instrument code that is directly related to
486 # virtual-devices.
487 configure_file(output: 'instrumentation-filter',
488 input: 'scripts/oss-fuzz/instrumentation-filter-template',
489 copy: true)
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400490
491 if cc.compiles('int main () { return 0; }',
492 name: '-fsanitize-coverage-allowlist=/dev/null',
Alexander Bulekove56d0972022-06-21 16:45:07 -0400493 args: ['-fsanitize-coverage-allowlist=/dev/null',
494 '-fsanitize-coverage=trace-pc'] )
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200495 qemu_common_flags += ['-fsanitize-coverage-allowlist=instrumentation-filter']
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400496 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +0200497
498 if get_option('fuzzing_engine') == ''
499 # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
500 # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link
501 # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
502 # unable to bind the fuzzer-related callbacks added by instrumentation.
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200503 qemu_common_flags += ['-fsanitize=fuzzer-no-link']
504 qemu_ldflags += ['-fsanitize=fuzzer-no-link']
Paolo Bonzini537b7242021-10-07 15:08:12 +0200505 # For the actual fuzzer binaries, we need to link against the libfuzzer
506 # library. They need to be configurable, to support OSS-Fuzz
507 fuzz_exe_ldflags = ['-fsanitize=fuzzer']
508 else
509 # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
510 # the needed CFLAGS have already been provided
511 fuzz_exe_ldflags = get_option('fuzzing_engine').split()
512 endif
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400513endif
514
Paolo Bonzini82761292023-05-10 14:54:30 +0200515if get_option('cfi')
516 cfi_flags=[]
517 # Check for dependency on LTO
518 if not get_option('b_lto')
519 error('Selected Control-Flow Integrity but LTO is disabled')
520 endif
521 if enable_modules
522 error('Selected Control-Flow Integrity is not compatible with modules')
523 endif
524 # Check for cfi flags. CFI requires LTO so we can't use
525 # get_supported_arguments, but need a more complex "compiles" which allows
526 # custom arguments
527 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
528 args: ['-flto', '-fsanitize=cfi-icall'] )
529 cfi_flags += '-fsanitize=cfi-icall'
530 else
531 error('-fsanitize=cfi-icall is not supported by the compiler')
532 endif
533 if cc.compiles('int main () { return 0; }',
534 name: '-fsanitize-cfi-icall-generalize-pointers',
535 args: ['-flto', '-fsanitize=cfi-icall',
536 '-fsanitize-cfi-icall-generalize-pointers'] )
537 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
538 else
539 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
540 endif
541 if get_option('cfi_debug')
542 if cc.compiles('int main () { return 0; }',
543 name: '-fno-sanitize-trap=cfi-icall',
544 args: ['-flto', '-fsanitize=cfi-icall',
545 '-fno-sanitize-trap=cfi-icall'] )
546 cfi_flags += '-fno-sanitize-trap=cfi-icall'
547 else
548 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
549 endif
550 endif
551 add_global_arguments(cfi_flags, native: false, language: all_languages)
552 add_global_link_arguments(cfi_flags, native: false, language: all_languages)
553endif
554
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200555add_global_arguments(qemu_common_flags, native: false, language: all_languages)
556add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
557
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100558# Collect warnings that we want to enable
559
560warn_flags = [
561 '-Wundef',
562 '-Wwrite-strings',
563 '-Wmissing-prototypes',
564 '-Wstrict-prototypes',
565 '-Wredundant-decls',
566 '-Wold-style-declaration',
567 '-Wold-style-definition',
568 '-Wtype-limits',
569 '-Wformat-security',
570 '-Wformat-y2k',
571 '-Winit-self',
572 '-Wignored-qualifiers',
573 '-Wempty-body',
574 '-Wnested-externs',
575 '-Wendif-labels',
576 '-Wexpansion-to-defined',
577 '-Wimplicit-fallthrough=2',
578 '-Wmissing-format-attribute',
579 '-Wno-initializer-overrides',
580 '-Wno-missing-include-dirs',
581 '-Wno-shift-negative-value',
582 '-Wno-string-plus-int',
583 '-Wno-typedef-redefinition',
584 '-Wno-tautological-type-limit-compare',
585 '-Wno-psabi',
586 '-Wno-gnu-variable-sized-type-not-at-end',
Markus Armbruster569205e2023-10-26 07:31:15 +0200587 '-Wshadow=local',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100588]
589
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100590if host_os != 'darwin'
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100591 warn_flags += ['-Wthread-safety']
592endif
593
Thomas Huth785abf02023-07-06 08:47:36 +0200594# Set up C++ compiler flags
Paolo Bonzinib4854582021-11-08 12:31:52 +0100595qemu_cxxflags = []
Paolo Bonzinie5134022022-10-12 14:15:06 +0200596if 'cpp' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100597 qemu_cxxflags = ['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'] + qemu_cflags
Paolo Bonzinib4854582021-11-08 12:31:52 +0100598endif
599
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200600add_project_arguments(qemu_cflags, native: false, language: 'c')
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100601add_project_arguments(cc.get_supported_arguments(warn_flags), native: false, language: 'c')
602if 'cpp' in all_languages
603 add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
604 add_project_arguments(cxx.get_supported_arguments(warn_flags), native: false, language: 'cpp')
605endif
606if 'objc' in all_languages
607 # Note sanitizer flags are not applied to Objective-C sources!
608 add_project_arguments(objc.get_supported_arguments(warn_flags), native: false, language: 'objc')
609endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100610if host_os == 'linux'
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400611 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
612 '-isystem', 'linux-headers',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200613 language: all_languages)
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400614endif
615
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100616add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400617 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400618 '-iquote', meson.current_source_dir() / 'include',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200619 language: all_languages)
Paolo Bonzinia5665052019-06-10 12:05:14 +0200620
Richard Henderson44fc7162023-05-17 17:48:34 -0700621# If a host-specific include directory exists, list that first...
622host_include = meson.current_source_dir() / 'host/include/'
623if fs.is_dir(host_include / host_arch)
624 add_project_arguments('-iquote', host_include / host_arch,
625 language: all_languages)
626endif
627# ... followed by the generic fallback.
628add_project_arguments('-iquote', host_include / 'generic',
629 language: all_languages)
630
Paolo Bonzinideb62372020-09-01 07:51:16 -0400631sparse = find_program('cgcc', required: get_option('sparse'))
632if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100633 run_target('sparse',
634 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400635 'compile_commands.json', sparse.full_path(), '-Wbitwise',
636 '-Wno-transparent-union', '-Wno-old-initializer',
637 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100638endif
639
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200640#####################################
641# Host-specific libraries and flags #
642#####################################
643
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200644libm = cc.find_library('m', required: false)
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +0200645threads = dependency('threads')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400646util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200647winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400648socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400649version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400650coref = []
651iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400652emulator_link_args = []
Marc-André Lureau23011f42022-02-01 12:55:21 +0400653midl = not_found
654widl = not_found
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900655pathcch = not_found
Paolo Bonzinia6305082021-10-07 15:08:15 +0200656host_dsosuf = '.so'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100657if host_os == 'windows'
Marc-André Lureau23011f42022-02-01 12:55:21 +0400658 midl = find_program('midl', required: false)
659 widl = find_program('widl', required: false)
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900660 pathcch = cc.find_library('pathcch')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400661 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200662 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400663
664 win = import('windows')
665 version_res = win.compile_resources('version.rc',
666 depend_files: files('pc-bios/qemu-nsis.ico'),
667 include_directories: include_directories('.'))
Paolo Bonzinia6305082021-10-07 15:08:15 +0200668 host_dsosuf = '.dll'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100669elif host_os == 'darwin'
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400670 coref = dependency('appleframeworks', modules: 'CoreFoundation')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700671 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
Paolo Bonzinia6305082021-10-07 15:08:15 +0200672 host_dsosuf = '.dylib'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100673elif host_os == 'sunos'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200674 socket = [cc.find_library('socket'),
675 cc.find_library('nsl'),
676 cc.find_library('resolv')]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100677elif host_os == 'haiku'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200678 socket = [cc.find_library('posix_error_mapper'),
679 cc.find_library('network'),
680 cc.find_library('bsd')]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100681elif host_os == 'openbsd'
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100682 if get_option('tcg').allowed() and target_dirs.length() > 0
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400683 # Disable OpenBSD W^X if available
684 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
685 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400686endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200687
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200688###############################################
689# Host-specific configuration of accelerators #
690###############################################
691
Paolo Bonzini8a199802020-09-18 05:37:01 -0400692accelerators = []
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100693if get_option('kvm').allowed() and host_os == 'linux'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400694 accelerators += 'CONFIG_KVM'
695endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100696if get_option('whpx').allowed() and host_os == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000697 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400698 error('WHPX requires 64-bit host')
Philippe Mathieu-Daudé641b8412023-06-24 15:31:44 +0200699 elif cc.has_header('winhvplatform.h', required: get_option('whpx')) and \
700 cc.has_header('winhvemulation.h', required: get_option('whpx'))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400701 accelerators += 'CONFIG_WHPX'
702 endif
703endif
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200704
705hvf = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100706if get_option('hvf').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400707 hvf = dependency('appleframeworks', modules: 'Hypervisor',
708 required: get_option('hvf'))
709 if hvf.found()
710 accelerators += 'CONFIG_HVF'
711 endif
712endif
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200713
714nvmm = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100715if host_os == 'netbsd'
nia0cc49652021-10-13 13:54:17 +0000716 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200717 if nvmm.found()
718 accelerators += 'CONFIG_NVMM'
719 endif
720endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100721
Paolo Bonzini823eb012021-11-08 14:18:17 +0100722tcg_arch = host_arch
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100723if get_option('tcg').allowed()
Paolo Bonzini823eb012021-11-08 14:18:17 +0100724 if host_arch == 'unknown'
Paolo Bonzinia24f15d2023-08-04 11:29:05 +0200725 if not get_option('tcg_interpreter')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400726 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
727 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100728 elif get_option('tcg_interpreter')
Philippe Mathieu-Daudé1c282da2021-05-21 12:34:23 +0200729 warning('Use of the TCG interpreter is not recommended on this host')
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100730 warning('architecture. There is a native TCG execution backend available')
731 warning('which provides substantially better performance and reliability.')
732 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
733 warning('configuration option on this architecture to use the native')
734 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400735 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100736 if get_option('tcg_interpreter')
737 tcg_arch = 'tci'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100738 elif host_arch == 'x86_64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100739 tcg_arch = 'i386'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100740 elif host_arch == 'ppc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100741 tcg_arch = 'ppc'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100742 endif
743 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzinie5134022022-10-12 14:15:06 +0200744 language: all_languages)
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100745
Paolo Bonzini8a199802020-09-18 05:37:01 -0400746 accelerators += 'CONFIG_TCG'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400747endif
748
749if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
750 error('KVM not available on this platform')
751endif
752if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
753 error('HVF not available on this platform')
754endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200755if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
756 error('NVMM not available on this platform')
757endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400758if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
759 error('WHPX not available on this platform')
760endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400761
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200762xen = not_found
763if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
764 xencontrol = dependency('xencontrol', required: false,
765 method: 'pkg-config')
766 if xencontrol.found()
767 xen_pc = declare_dependency(version: xencontrol.version(),
768 dependencies: [
769 xencontrol,
770 # disabler: true makes xen_pc.found() return false if any is not found
771 dependency('xenstore', required: false,
772 method: 'pkg-config',
773 disabler: true),
774 dependency('xenforeignmemory', required: false,
775 method: 'pkg-config',
776 disabler: true),
777 dependency('xengnttab', required: false,
778 method: 'pkg-config',
779 disabler: true),
780 dependency('xenevtchn', required: false,
781 method: 'pkg-config',
782 disabler: true),
783 dependency('xendevicemodel', required: false,
784 method: 'pkg-config',
785 disabler: true),
786 # optional, no "disabler: true"
787 dependency('xentoolcore', required: false,
788 method: 'pkg-config')])
789 if xen_pc.found()
790 xen = xen_pc
791 endif
792 endif
793 if not xen.found()
794 xen_tests = [ '4.11.0', '4.10.0', '4.9.0', '4.8.0', '4.7.1' ]
795 xen_libs = {
796 '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
797 '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
798 '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
799 '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
800 '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
801 }
802 xen_deps = {}
803 foreach ver: xen_tests
804 # cache the various library tests to avoid polluting the logs
805 xen_test_deps = []
806 foreach l: xen_libs[ver]
807 if l not in xen_deps
808 xen_deps += { l: cc.find_library(l, required: false) }
809 endif
810 xen_test_deps += xen_deps[l]
811 endforeach
812
813 # Use -D to pick just one of the test programs in scripts/xen-detect.c
814 xen_version = ver.split('.')
815 xen_ctrl_version = xen_version[0] + \
816 ('0' + xen_version[1]).substring(-2) + \
817 ('0' + xen_version[2]).substring(-2)
818 if cc.links(files('scripts/xen-detect.c'),
819 args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
820 dependencies: xen_test_deps)
821 xen = declare_dependency(version: ver, dependencies: xen_test_deps)
822 break
823 endif
824 endforeach
825 endif
826 if xen.found()
827 accelerators += 'CONFIG_XEN'
828 elif get_option('xen').enabled()
829 error('could not compile and link Xen test program')
830 endif
831endif
832have_xen_pci_passthrough = get_option('xen_pci_passthrough') \
833 .require(xen.found(),
834 error_message: 'Xen PCI passthrough requested but Xen not enabled') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100835 .require(host_os == 'linux',
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200836 error_message: 'Xen PCI passthrough not available on this platform') \
837 .require(cpu == 'x86' or cpu == 'x86_64',
838 error_message: 'Xen PCI passthrough not available on this platform') \
839 .allowed()
840
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200841################
842# Dependencies #
843################
844
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200845# When bumping glib minimum version, please check also whether to increase
846# the _WIN32_WINNT setting in osdep.h according to the value from glib
847glib_req_ver = '>=2.56.0'
848glib_pc = dependency('glib-2.0', version: glib_req_ver, required: true,
849 method: 'pkg-config')
850glib_cflags = []
Paolo Bonzini60027112022-10-20 14:53:10 +0200851if enable_modules
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200852 gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true,
853 method: 'pkg-config')
Paolo Bonzini2c13c572023-08-30 12:20:53 +0200854elif get_option('plugins')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200855 gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true,
856 method: 'pkg-config')
857else
858 gmodule = not_found
Emilio Cotae3feb2c2023-02-05 11:37:57 -0500859endif
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400860
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200861# This workaround is required due to a bug in pkg-config file for glib as it
862# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100863if host_os == 'windows' and get_option('prefer_static')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200864 glib_cflags += ['-DGLIB_STATIC_COMPILATION']
865endif
866
867# Sanity check that the current size_t matches the
868# size that glib thinks it should be. This catches
869# problems on multi-arch where people try to build
870# 32-bit QEMU while pointing at 64-bit glib headers
871
872if not cc.compiles('''
873 #include <glib.h>
874 #include <unistd.h>
875
876 #define QEMU_BUILD_BUG_ON(x) \
877 typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
878
879 int main(void) {
880 QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
881 return 0;
882 }''', dependencies: glib_pc, args: glib_cflags)
883 error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T.
884 You probably need to set PKG_CONFIG_LIBDIR" to point
885 to the right pkg-config files for your build target.''')
886endif
887
888# Silence clang warnings triggered by glib < 2.57.2
889if not cc.compiles('''
890 #include <glib.h>
891 typedef struct Foo {
892 int i;
893 } Foo;
894 static void foo_free(Foo *f)
895 {
896 g_free(f);
897 }
898 G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free)
Nicolas Saenz Juliennef49d8832023-05-24 17:31:23 +0000899 int main(void) { return 0; }''', dependencies: glib_pc, args: ['-Wunused-function', '-Werror'])
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200900 glib_cflags += cc.get_supported_arguments('-Wno-unused-function')
901endif
902glib = declare_dependency(dependencies: [glib_pc, gmodule],
903 compile_args: glib_cflags,
904 version: glib_pc.version())
905
906# Check whether glib has gslice, which we have to avoid for correctness.
907# TODO: remove this check and the corresponding workaround (qtree) when
908# the minimum supported glib is >= 2.75.3
909glib_has_gslice = glib.version().version_compare('<2.75.3')
910
911# override glib dep to include the above refinements
912meson.override_dependency('glib-2.0', glib)
913
914# The path to glib.h is added to all compilation commands.
915add_project_dependencies(glib.partial_dependency(compile_args: true, includes: true),
916 native: false, language: all_languages)
917
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400918gio = not_found
Paolo Bonzini75440602022-04-20 17:33:44 +0200919gdbus_codegen = not_found
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +0200920gdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
Paolo Bonzini75440602022-04-20 17:33:44 +0200921if not get_option('gio').auto() or have_system
922 gio = dependency('gio-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200923 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +0200924 if gio.found() and not cc.links('''
925 #include <gio/gio.h>
926 int main(void)
927 {
928 g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
929 return 0;
930 }''', dependencies: [glib, gio])
931 if get_option('gio').enabled()
932 error('The installed libgio is broken for static linking')
933 endif
934 gio = not_found
935 endif
936 if gio.found()
937 gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'),
938 required: get_option('gio'))
939 gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200940 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +0200941 gio = declare_dependency(dependencies: [gio, gio_unix],
942 version: gio.version())
943 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400944endif
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +0200945if gdbus_codegen.found() and get_option('cfi')
946 gdbus_codegen = not_found
947 gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity'
948endif
Paolo Bonzini75440602022-04-20 17:33:44 +0200949
Marc-André Lureau6cc5a612023-06-06 15:56:42 +0400950xml_pp = find_program('scripts/xml-preprocess.py')
951
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400952lttng = not_found
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200953if 'ust' in get_option('trace_backends')
Marc-André Lureaue32aaa52022-03-28 12:47:13 +0400954 lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
Paolo Bonzini063d5112022-07-14 14:56:58 +0200955 method: 'pkg-config')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400956endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200957pixman = not_found
Marc-André Lureaucca15752023-08-30 13:38:25 +0400958if not get_option('pixman').auto() or have_system or have_tools
959 pixman = dependency('pixman-1', required: get_option('pixman'), version:'>=0.21.8',
Paolo Bonzini063d5112022-07-14 14:56:58 +0200960 method: 'pkg-config')
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200961endif
Marc-André Lureaucca15752023-08-30 13:38:25 +0400962
Paolo Bonzini063d5112022-07-14 14:56:58 +0200963zlib = dependency('zlib', required: true)
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200964
Paolo Bonziniff66f3e2021-10-07 15:08:20 +0200965libaio = not_found
966if not get_option('linux_aio').auto() or have_block
967 libaio = cc.find_library('aio', has_headers: ['libaio.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +0200968 required: get_option('linux_aio'))
Paolo Bonziniff66f3e2021-10-07 15:08:20 +0200969endif
Leonardo Bras354081d2022-05-13 03:28:30 -0300970
971linux_io_uring_test = '''
972 #include <liburing.h>
973 #include <linux/errqueue.h>
974
975 int main(void) { return 0; }'''
976
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400977linux_io_uring = not_found
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200978if not get_option('linux_io_uring').auto() or have_block
Daniel P. Berrangéa41b4fd2022-01-05 13:49:38 +0000979 linux_io_uring = dependency('liburing', version: '>=0.3',
980 required: get_option('linux_io_uring'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200981 method: 'pkg-config')
Leonardo Bras354081d2022-05-13 03:28:30 -0300982 if not cc.links(linux_io_uring_test)
983 linux_io_uring = not_found
984 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400985endif
Leonardo Bras354081d2022-05-13 03:28:30 -0300986
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400987libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +0100988if not get_option('libnfs').auto() or have_block
989 libnfs = dependency('libnfs', version: '>=1.9.3',
990 required: get_option('libnfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200991 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400992endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100993
994libattr_test = '''
995 #include <stddef.h>
996 #include <sys/types.h>
997 #ifdef CONFIG_LIBATTR
998 #include <attr/xattr.h>
999 #else
1000 #include <sys/xattr.h>
1001 #endif
1002 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
1003
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001004libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001005have_old_libattr = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001006if get_option('attr').allowed()
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001007 if cc.links(libattr_test)
1008 libattr = declare_dependency()
1009 else
1010 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001011 required: get_option('attr'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001012 if libattr.found() and not \
1013 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
1014 libattr = not_found
1015 if get_option('attr').enabled()
1016 error('could not link libattr')
1017 else
1018 warning('could not link libattr, disabling')
1019 endif
1020 else
1021 have_old_libattr = libattr.found()
1022 endif
1023 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001024endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001025
Akihiko Odaki52eaefd2022-07-02 23:25:19 +09001026cocoa = dependency('appleframeworks', modules: ['Cocoa', 'CoreVideo'],
1027 required: get_option('cocoa'))
Paolo Bonzinic1ec4942021-01-07 14:04:00 +01001028
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03001029vmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet'))
1030if vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h',
1031 'VMNET_BRIDGED_MODE',
1032 dependencies: vmnet)
1033 vmnet = not_found
1034 if get_option('vmnet').enabled()
1035 error('vmnet.framework API is outdated')
1036 else
1037 warning('vmnet.framework API is outdated, disabling')
1038 endif
1039endif
1040
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001041seccomp = not_found
Michal Privoznik73422d92022-10-26 09:30:24 +02001042seccomp_has_sysrawrc = false
Paolo Bonzini90835c22020-11-17 14:22:24 +01001043if not get_option('seccomp').auto() or have_system or have_tools
1044 seccomp = dependency('libseccomp', version: '>=2.3.0',
1045 required: get_option('seccomp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001046 method: 'pkg-config')
Michal Privoznik73422d92022-10-26 09:30:24 +02001047 if seccomp.found()
1048 seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h',
1049 'SCMP_FLTATR_API_SYSRAWRC',
1050 dependencies: seccomp)
1051 endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001052endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001053
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001054libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001055if not get_option('cap_ng').auto() or have_system or have_tools
1056 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001057 required: get_option('cap_ng'))
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001058endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001059if libcap_ng.found() and not cc.links('''
1060 #include <cap-ng.h>
1061 int main(void)
1062 {
1063 capng_capability_to_name(CAPNG_EFFECTIVE);
1064 return 0;
1065 }''', dependencies: libcap_ng)
1066 libcap_ng = not_found
1067 if get_option('cap_ng').enabled()
1068 error('could not link libcap-ng')
1069 else
1070 warning('could not link libcap-ng, disabling')
1071 endif
1072endif
1073
Paolo Bonzini1917ec62020-08-26 03:24:11 -04001074if get_option('xkbcommon').auto() and not have_system and not have_tools
1075 xkbcommon = not_found
1076else
1077 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001078 method: 'pkg-config')
Marc-André Lureauade60d42019-07-15 14:48:31 +04001079endif
Paolo Bonzinie1723992021-10-07 15:08:21 +02001080
Thomas Huth58902582022-04-08 18:20:47 +02001081slirp = not_found
1082if not get_option('slirp').auto() or have_system
1083 slirp = dependency('slirp', required: get_option('slirp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001084 method: 'pkg-config')
Thomas Huth58902582022-04-08 18:20:47 +02001085 # slirp < 4.7 is incompatible with CFI support in QEMU. This is because
1086 # it passes function pointers within libslirp as callbacks for timers.
1087 # When using a system-wide shared libslirp, the type information for the
1088 # callback is missing and the timer call produces a false positive with CFI.
1089 # Do not use the "version" keyword argument to produce a better error.
1090 # with control-flow integrity.
1091 if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7')
1092 if get_option('slirp').enabled()
1093 error('Control-Flow Integrity requires libslirp 4.7.')
1094 else
1095 warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.')
1096 slirp = not_found
1097 endif
1098 endif
1099endif
1100
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001101vde = not_found
Paolo Bonzinie1723992021-10-07 15:08:21 +02001102if not get_option('vde').auto() or have_system or have_tools
1103 vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001104 required: get_option('vde'))
Paolo Bonzinie1723992021-10-07 15:08:21 +02001105endif
1106if vde.found() and not cc.links('''
1107 #include <libvdeplug.h>
1108 int main(void)
1109 {
1110 struct vde_open_args a = {0, 0, 0};
1111 char s[] = "";
1112 vde_open(s, s, &a);
1113 return 0;
1114 }''', dependencies: vde)
1115 vde = not_found
1116 if get_option('cap_ng').enabled()
1117 error('could not link libvdeplug')
1118 else
1119 warning('could not link libvdeplug, disabling')
1120 endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001121endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001122
Paolo Bonzini478e9432020-08-17 12:47:55 +02001123pulse = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001124if not get_option('pa').auto() or (host_os == 'linux' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001125 pulse = dependency('libpulse', required: get_option('pa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001126 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001127endif
1128alsa = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001129if not get_option('alsa').auto() or (host_os == 'linux' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001130 alsa = dependency('alsa', required: get_option('alsa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001131 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001132endif
1133jack = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001134if not get_option('jack').auto() or have_system
1135 jack = dependency('jack', required: get_option('jack'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001136 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001137endif
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001138pipewire = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001139if not get_option('pipewire').auto() or (host_os == 'linux' and have_system)
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001140 pipewire = dependency('libpipewire-0.3', version: '>=0.3.60',
1141 required: get_option('pipewire'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001142 method: 'pkg-config')
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001143endif
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001144sndio = not_found
1145if not get_option('sndio').auto() or have_system
1146 sndio = dependency('sndio', required: get_option('sndio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001147 method: 'pkg-config')
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001148endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001149
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001150spice_protocol = not_found
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001151if not get_option('spice_protocol').auto() or have_system
Markus Armbruster5c167b52023-01-09 20:03:07 +01001152 spice_protocol = dependency('spice-protocol', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001153 required: get_option('spice_protocol'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001154 method: 'pkg-config')
Paolo Bonzini26347332019-07-29 15:40:07 +02001155endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001156spice = not_found
Marc-André Lureauc98791e2023-08-30 13:38:35 +04001157if get_option('spice') \
1158 .disable_auto_if(not have_system) \
1159 .require(pixman.found(),
1160 error_message: 'cannot enable SPICE if pixman is not available') \
1161 .allowed()
Markus Armbruster34d55722023-01-09 20:03:09 +01001162 spice = dependency('spice-server', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001163 required: get_option('spice'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001164 method: 'pkg-config')
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001165endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001166spice_headers = spice.partial_dependency(compile_args: true, includes: true)
1167
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04001168rt = cc.find_library('rt', required: false)
Paolo Bonzinia399f912021-11-15 14:29:13 +00001169
Paolo Bonzini99650b62019-06-10 12:21:14 +02001170libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001171if not get_option('libiscsi').auto() or have_block
1172 libiscsi = dependency('libiscsi', version: '>=1.9.0',
1173 required: get_option('libiscsi'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001174 method: 'pkg-config')
Paolo Bonzini99650b62019-06-10 12:21:14 +02001175endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001176zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +01001177if not get_option('zstd').auto() or have_block
1178 zstd = dependency('libzstd', version: '>=1.4.0',
1179 required: get_option('zstd'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001180 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001181endif
Marc-André Lureauea458962019-07-12 22:23:46 +04001182virgl = not_found
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001183
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001184have_vhost_user_gpu = have_tools and host_os == 'linux' and pixman.found()
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001185if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
Paolo Bonzini587d59d2021-06-03 11:31:35 +02001186 virgl = dependency('virglrenderer',
1187 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001188 required: get_option('virglrenderer'))
Marc-André Lureauea458962019-07-12 22:23:46 +04001189endif
Gurchetan Singhcd9adbe2023-03-21 09:47:36 -07001190rutabaga = not_found
1191if not get_option('rutabaga_gfx').auto() or have_system or have_vhost_user_gpu
1192 rutabaga = dependency('rutabaga_gfx_ffi',
1193 method: 'pkg-config',
1194 required: get_option('rutabaga_gfx'))
1195endif
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001196blkio = not_found
1197if not get_option('blkio').auto() or have_block
1198 blkio = dependency('blkio',
1199 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001200 required: get_option('blkio'))
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001201endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001202curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001203if not get_option('curl').auto() or have_block
1204 curl = dependency('libcurl', version: '>=7.29.0',
1205 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001206 required: get_option('curl'))
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001207endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001208libudev = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001209if host_os == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001210 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +01001211 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001212 required: get_option('libudev'))
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001213endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001214
Paolo Bonzini5c530152020-10-15 06:09:27 -04001215mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001216mpathpersist = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001217if host_os == 'linux' and have_tools and get_option('mpath').allowed()
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001218 mpath_test_source = '''
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001219 #include <libudev.h>
1220 #include <mpath_persist.h>
1221 unsigned mpath_mx_alloc_len = 1024;
1222 int logsink;
1223 static struct config *multipath_conf;
1224 extern struct udev *udev;
1225 extern struct config *get_multipath_config(void);
1226 extern void put_multipath_config(struct config *conf);
1227 struct udev *udev;
1228 struct config *get_multipath_config(void) { return multipath_conf; }
1229 void put_multipath_config(struct config *conf) { }
1230 int main(void) {
1231 udev = udev_new();
1232 multipath_conf = mpath_lib_init();
1233 return 0;
1234 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -04001235 libmpathpersist = cc.find_library('mpathpersist',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001236 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001237 if libmpathpersist.found()
1238 mpathlibs += libmpathpersist
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001239 if get_option('prefer_static')
Paolo Bonzini5c530152020-10-15 06:09:27 -04001240 mpathlibs += cc.find_library('devmapper',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001241 required: get_option('mpath'))
Paolo Bonzini43b43a42020-09-17 12:25:09 +02001242 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -04001243 mpathlibs += cc.find_library('multipath',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001244 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001245 foreach lib: mpathlibs
1246 if not lib.found()
1247 mpathlibs = []
1248 break
1249 endif
1250 endforeach
1251 if mpathlibs.length() == 0
1252 msg = 'Dependencies missing for libmpathpersist'
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001253 elif cc.links(mpath_test_source, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001254 mpathpersist = declare_dependency(dependencies: mpathlibs)
1255 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001256 msg = 'Cannot detect libmpathpersist API'
1257 endif
1258 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001259 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -04001260 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001261 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001262 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001263 endif
1264 endif
1265 endif
1266endif
1267
Yonggang Luo5285e592020-10-13 07:43:48 +08001268iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001269curses = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001270if have_system and get_option('curses').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001271 curses_test = '''
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001272 #if defined(__APPLE__) || defined(__OpenBSD__)
1273 #define _XOPEN_SOURCE_EXTENDED 1
1274 #endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001275 #include <locale.h>
1276 #include <curses.h>
1277 #include <wchar.h>
1278 int main(void) {
1279 wchar_t wch = L'w';
1280 setlocale(LC_ALL, "");
1281 resize_term(0, 0);
1282 addwstr(L"wide chars\n");
1283 addnwstr(&wch, 1);
1284 add_wch(WACS_DEGREE);
1285 return 0;
1286 }'''
1287
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001288 curses_dep_list = host_os == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
Paolo Bonzini6d322632022-03-27 16:05:58 +02001289 curses = dependency(curses_dep_list,
1290 required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001291 method: 'pkg-config')
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001292 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001293 curses_compile_args = ['-DNCURSES_WIDECHAR=1']
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001294 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -05001295 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001296 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses],
1297 version: curses.version())
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001298 else
1299 msg = 'curses package not usable'
1300 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001301 endif
1302 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001303 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001304 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001305 if host_os != 'windows' and not has_curses_h
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001306 message('Trying with /usr/include/ncursesw')
1307 curses_compile_args += ['-I/usr/include/ncursesw']
1308 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
1309 endif
1310 if has_curses_h
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001311 curses_libname_list = (host_os == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001312 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +08001313 libcurses = cc.find_library(curses_libname,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001314 required: false)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001315 if libcurses.found()
1316 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
1317 curses = declare_dependency(compile_args: curses_compile_args,
1318 dependencies: [libcurses])
1319 break
1320 else
1321 msg = 'curses library not usable'
1322 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001323 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001324 endforeach
1325 endif
1326 endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001327 if get_option('iconv').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001328 foreach link_args : [ ['-liconv'], [] ]
1329 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
1330 # We need to use libiconv if available because mixing libiconv's headers with
1331 # the system libc does not work.
1332 # However, without adding glib to the dependencies -L/usr/local/lib will not be
1333 # included in the command line and libiconv will not be found.
1334 if cc.links('''
1335 #include <iconv.h>
1336 int main(void) {
1337 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
1338 return conv != (iconv_t) -1;
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001339 }''', args: link_args, dependencies: glib)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001340 iconv = declare_dependency(link_args: link_args, dependencies: glib)
1341 break
Yonggang Luo5285e592020-10-13 07:43:48 +08001342 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001343 endforeach
1344 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001345 if curses.found() and not iconv.found()
1346 if get_option('iconv').enabled()
1347 error('iconv not available')
1348 endif
1349 msg = 'iconv required for curses UI but not available'
1350 curses = not_found
1351 endif
1352 if not curses.found() and msg != ''
1353 if get_option('curses').enabled()
1354 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001355 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001356 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001357 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001358 endif
1359endif
1360
Paolo Bonzini26347332019-07-29 15:40:07 +02001361brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001362if not get_option('brlapi').auto() or have_system
1363 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001364 required: get_option('brlapi'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001365 if brlapi.found() and not cc.links('''
1366 #include <brlapi.h>
1367 #include <stddef.h>
1368 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
1369 brlapi = not_found
1370 if get_option('brlapi').enabled()
1371 error('could not link brlapi')
1372 else
1373 warning('could not link brlapi, disabling')
1374 endif
1375 endif
Paolo Bonzini26347332019-07-29 15:40:07 +02001376endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001377
Paolo Bonzini760e4322020-08-26 08:09:48 +02001378sdl = not_found
Akihiko Odaki64d3fec2022-08-19 22:27:56 +09001379if not get_option('sdl').auto() or have_system
Paolo Bonzini063d5112022-07-14 14:56:58 +02001380 sdl = dependency('sdl2', required: get_option('sdl'))
Paolo Bonzini760e4322020-08-26 08:09:48 +02001381 sdl_image = not_found
1382endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001383if sdl.found()
Thomas Huth6da5f222023-06-05 13:45:23 +02001384 # Some versions of SDL have problems with -Wundef
1385 if not cc.compiles('''
1386 #include <SDL.h>
1387 #include <SDL_syswm.h>
1388 int main(int argc, char *argv[]) { return 0; }
1389 ''', dependencies: sdl, args: '-Werror=undef')
1390 sdl = declare_dependency(compile_args: '-Wno-undef',
1391 dependencies: sdl,
1392 version: sdl.version())
1393 endif
Volker Rümelin7161a432020-08-29 12:41:58 +02001394 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001395 method: 'pkg-config')
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001396else
1397 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +01001398 error('sdl-image required, but SDL was @0@'.format(
1399 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001400 endif
1401 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +02001402endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001403
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001404rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001405if not get_option('rbd').auto() or have_block
Paolo Bonzini063d5112022-07-14 14:56:58 +02001406 librados = cc.find_library('rados', required: get_option('rbd'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001407 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001408 required: get_option('rbd'))
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001409 if librados.found() and librbd.found()
1410 if cc.links('''
1411 #include <stdio.h>
1412 #include <rbd/librbd.h>
1413 int main(void) {
1414 rados_t cluster;
1415 rados_create(&cluster, NULL);
Peter Lieven48672ac2021-07-02 19:23:51 +02001416 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
1417 #error
1418 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001419 return 0;
1420 }''', dependencies: [librbd, librados])
1421 rbd = declare_dependency(dependencies: [librbd, librados])
1422 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +02001423 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001424 else
Peter Lieven48672ac2021-07-02 19:23:51 +02001425 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001426 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001427 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001428endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001429
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001430glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001431glusterfs_ftruncate_has_stat = false
1432glusterfs_iocb_has_stat = false
1433if not get_option('glusterfs').auto() or have_block
1434 glusterfs = dependency('glusterfs-api', version: '>=3',
1435 required: get_option('glusterfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001436 method: 'pkg-config')
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001437 if glusterfs.found()
1438 glusterfs_ftruncate_has_stat = cc.links('''
1439 #include <glusterfs/api/glfs.h>
1440
1441 int
1442 main(void)
1443 {
1444 /* new glfs_ftruncate() passes two additional args */
1445 return glfs_ftruncate(NULL, 0, NULL, NULL);
1446 }
1447 ''', dependencies: glusterfs)
1448 glusterfs_iocb_has_stat = cc.links('''
1449 #include <glusterfs/api/glfs.h>
1450
1451 /* new glfs_io_cbk() passes two additional glfs_stat structs */
1452 static void
1453 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
1454 {}
1455
1456 int
1457 main(void)
1458 {
1459 glfs_io_cbk iocb = &glusterfs_iocb;
1460 iocb(NULL, 0 , NULL, NULL, NULL);
1461 return 0;
1462 }
1463 ''', dependencies: glusterfs)
1464 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001465endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001466
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02001467hv_balloon = false
1468if get_option('hv_balloon').allowed() and have_system
1469 if cc.links('''
1470 #include <string.h>
1471 #include <gmodule.h>
1472 int main(void) {
1473 GTree *tree;
1474
1475 tree = g_tree_new((GCompareFunc)strcmp);
1476 (void)g_tree_node_first(tree);
1477 g_tree_destroy(tree);
1478 return 0;
1479 }
1480 ''', dependencies: glib)
1481 hv_balloon = true
1482 else
1483 if get_option('hv_balloon').enabled()
1484 error('could not enable hv-balloon, update your glib')
1485 else
1486 warning('could not find glib support for hv-balloon, disabling')
1487 endif
1488 endif
1489endif
1490
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001491libssh = not_found
Thomas Huthe6a52b32021-12-09 15:48:01 +01001492if not get_option('libssh').auto() or have_block
1493 libssh = dependency('libssh', version: '>=0.8.7',
1494 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001495 required: get_option('libssh'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001496endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001497
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001498libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001499if not get_option('bzip2').auto() or have_block
1500 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001501 required: get_option('bzip2'))
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001502 if libbzip2.found() and not cc.links('''
1503 #include <bzlib.h>
1504 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
1505 libbzip2 = not_found
1506 if get_option('bzip2').enabled()
1507 error('could not link libbzip2')
1508 else
1509 warning('could not link libbzip2, disabling')
1510 endif
1511 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001512endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001513
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001514liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +01001515if not get_option('lzfse').auto() or have_block
1516 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001517 required: get_option('lzfse'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001518endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001519if liblzfse.found() and not cc.links('''
1520 #include <lzfse.h>
1521 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
1522 liblzfse = not_found
1523 if get_option('lzfse').enabled()
1524 error('could not link liblzfse')
1525 else
1526 warning('could not link liblzfse, disabling')
1527 endif
1528endif
1529
Paolo Bonzini478e9432020-08-17 12:47:55 +02001530oss = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001531if get_option('oss').allowed() and have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02001532 if not cc.has_header('sys/soundcard.h')
1533 # not found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001534 elif host_os == 'netbsd'
Paolo Bonzini063d5112022-07-14 14:56:58 +02001535 oss = cc.find_library('ossaudio', required: get_option('oss'))
Paolo Bonzini87430d52021-10-07 15:06:09 +02001536 else
1537 oss = declare_dependency()
1538 endif
1539
1540 if not oss.found()
1541 if get_option('oss').enabled()
1542 error('OSS not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001543 endif
1544 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001545endif
1546dsound = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001547if not get_option('dsound').auto() or (host_os == 'windows' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001548 if cc.has_header('dsound.h')
1549 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1550 endif
1551
1552 if not dsound.found()
1553 if get_option('dsound').enabled()
1554 error('DirectSound not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001555 endif
1556 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001557endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001558
Paolo Bonzini478e9432020-08-17 12:47:55 +02001559coreaudio = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001560if not get_option('coreaudio').auto() or (host_os == 'darwin' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001561 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
1562 required: get_option('coreaudio'))
Paolo Bonzini478e9432020-08-17 12:47:55 +02001563endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001564
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001565opengl = not_found
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001566if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
1567 epoxy = dependency('epoxy', method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001568 required: get_option('opengl'))
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001569 if cc.has_header('epoxy/egl.h', dependencies: epoxy)
1570 opengl = epoxy
1571 elif get_option('opengl').enabled()
1572 error('epoxy/egl.h not found')
1573 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001574endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001575gbm = not_found
1576if (have_system or have_tools) and (virgl.found() or opengl.found())
Paolo Bonzini063d5112022-07-14 14:56:58 +02001577 gbm = dependency('gbm', method: 'pkg-config', required: false)
Thomas Huth8bc51842021-07-13 13:09:02 +02001578endif
Marc-André Lureauf0caba42022-06-28 17:23:15 +04001579have_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001580
Paolo Bonzini57612512021-06-03 11:15:26 +02001581gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001582gnutls_crypto = not_found
Alyssa Rossabc14fd2021-08-06 14:49:47 +00001583if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001584 # For general TLS support our min gnutls matches
1585 # that implied by our platform support matrix
1586 #
1587 # For the crypto backends, we look for a newer
1588 # gnutls:
1589 #
1590 # Version 3.6.8 is needed to get XTS
1591 # Version 3.6.13 is needed to get PBKDF
1592 # Version 3.6.14 is needed to get HW accelerated XTS
1593 #
1594 # If newer enough gnutls isn't available, we can
1595 # still use a different crypto backend to satisfy
1596 # the platform support requirements
1597 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1598 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001599 required: false)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001600 if gnutls_crypto.found()
1601 gnutls = gnutls_crypto
1602 else
1603 # Our min version if all we need is TLS
1604 gnutls = dependency('gnutls', version: '>=3.5.18',
1605 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001606 required: get_option('gnutls'))
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001607 endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001608endif
1609
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001610# We prefer use of gnutls for crypto, unless the options
1611# explicitly asked for nettle or gcrypt.
1612#
1613# If gnutls isn't available for crypto, then we'll prefer
1614# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +02001615gcrypt = not_found
1616nettle = not_found
Lei He4c5e5122022-05-25 17:01:14 +08001617hogweed = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +01001618xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001619
Paolo Bonzini57612512021-06-03 11:15:26 +02001620if get_option('nettle').enabled() and get_option('gcrypt').enabled()
1621 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +02001622endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001623
1624# Explicit nettle/gcrypt request, so ignore gnutls for crypto
1625if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001626 gnutls_crypto = not_found
1627endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001628
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001629if not gnutls_crypto.found()
1630 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
1631 gcrypt = dependency('libgcrypt', version: '>=1.8',
1632 method: 'config-tool',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001633 required: get_option('gcrypt'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001634 # Debian has removed -lgpg-error from libgcrypt-config
1635 # as it "spreads unnecessary dependencies" which in
1636 # turn breaks static builds...
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001637 if gcrypt.found() and get_option('prefer_static')
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001638 gcrypt = declare_dependency(dependencies:
1639 [gcrypt,
1640 cc.find_library('gpg-error', required: true)],
1641 version: gcrypt.version())
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001642 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001643 endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001644 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1645 nettle = dependency('nettle', version: '>=3.4',
1646 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001647 required: get_option('nettle'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001648 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1649 xts = 'private'
1650 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001651 endif
1652endif
1653
Paolo Bonzinia775c712023-09-08 12:09:22 +02001654capstone = not_found
1655if not get_option('capstone').auto() or have_system or have_user
1656 capstone = dependency('capstone', version: '>=3.0.5',
1657 method: 'pkg-config',
1658 required: get_option('capstone'))
1659
1660 # Some versions of capstone have broken pkg-config file
1661 # that reports a wrong -I path, causing the #include to
1662 # fail later. If the system has such a broken version
1663 # do not use it.
1664 if capstone.found() and not cc.compiles('#include <capstone.h>',
1665 dependencies: [capstone])
1666 capstone = not_found
1667 if get_option('capstone').enabled()
1668 error('capstone requested, but it does not appear to work')
1669 endif
1670 endif
1671endif
1672
Paolo Bonzini063d5112022-07-14 14:56:58 +02001673gmp = dependency('gmp', required: false, method: 'pkg-config')
Lei He4c5e5122022-05-25 17:01:14 +08001674if nettle.found() and gmp.found()
1675 hogweed = dependency('hogweed', version: '>=3.4',
1676 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001677 required: get_option('nettle'))
Lei He4c5e5122022-05-25 17:01:14 +08001678endif
1679
1680
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001681gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +01001682gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001683vte = not_found
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001684have_gtk_clipboard = get_option('gtk_clipboard').enabled()
1685
Marc-André Lureauda554e12023-08-30 13:38:36 +04001686if get_option('gtk') \
1687 .disable_auto_if(not have_system) \
1688 .require(pixman.found(),
1689 error_message: 'cannot enable GTK if pixman is not available') \
1690 .allowed()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001691 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1692 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001693 required: get_option('gtk'))
Paolo Bonzini1b695472021-01-07 14:02:29 +01001694 if gtk.found()
1695 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1696 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001697 required: false)
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001698 gtk = declare_dependency(dependencies: [gtk, gtkx11],
1699 version: gtk.version())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001700
1701 if not get_option('vte').auto() or have_system
1702 vte = dependency('vte-2.91',
1703 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001704 required: get_option('vte'))
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001705 endif
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001706 elif have_gtk_clipboard
1707 error('GTK clipboard requested, but GTK not found')
Paolo Bonzini1b695472021-01-07 14:02:29 +01001708 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001709endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001710
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001711x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +02001712if gtkx11.found()
Paolo Bonzini063d5112022-07-14 14:56:58 +02001713 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001714endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001715png = not_found
Kshitij Suri95f85102022-04-08 07:13:34 +00001716if get_option('png').allowed() and have_system
Thomas Huth1ec8c2c2022-06-23 19:49:41 +02001717 png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001718 method: 'pkg-config')
Kshitij Suri95f85102022-04-08 07:13:34 +00001719endif
1720vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001721jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001722sasl = not_found
Marc-André Lureau89fd3ea2023-08-30 13:38:34 +04001723if get_option('vnc') \
1724 .disable_auto_if(not have_system) \
1725 .require(pixman.found(),
1726 error_message: 'cannot enable VNC if pixman is not available') \
1727 .allowed()
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001728 vnc = declare_dependency() # dummy dependency
Paolo Bonzini8e242b32020-11-23 13:34:02 -05001729 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001730 method: 'pkg-config')
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001731 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001732 required: get_option('vnc_sasl'))
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001733 if sasl.found()
1734 sasl = declare_dependency(dependencies: sasl,
1735 compile_args: '-DSTRUCT_IOVEC_DEFINED')
1736 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001737endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01001738
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001739pam = not_found
1740if not get_option('auth_pam').auto() or have_system
1741 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001742 required: get_option('auth_pam'))
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001743endif
1744if pam.found() and not cc.links('''
1745 #include <stddef.h>
1746 #include <security/pam_appl.h>
1747 int main(void) {
1748 const char *service_name = "qemu";
1749 const char *user = "frank";
1750 const struct pam_conv pam_conv = { 0 };
1751 pam_handle_t *pamh = NULL;
1752 pam_start(service_name, user, &pam_conv, &pamh);
1753 return 0;
1754 }''', dependencies: pam)
1755 pam = not_found
1756 if get_option('auth_pam').enabled()
1757 error('could not link libpam')
1758 else
1759 warning('could not link libpam, disabling')
1760 endif
1761endif
1762
Marc-André Lureau708eab42019-09-03 16:59:33 +04001763snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +01001764if not get_option('snappy').auto() or have_system
1765 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001766 required: get_option('snappy'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04001767endif
Thomas Huth785abf02023-07-06 08:47:36 +02001768if snappy.found() and not cc.links('''
Paolo Bonzini241611e2020-11-17 13:32:34 +01001769 #include <snappy-c.h>
1770 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
1771 snappy = not_found
1772 if get_option('snappy').enabled()
1773 error('could not link libsnappy')
1774 else
1775 warning('could not link libsnappy, disabling')
1776 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +04001777endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001778
Marc-André Lureau708eab42019-09-03 16:59:33 +04001779lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001780if not get_option('lzo').auto() or have_system
1781 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001782 required: get_option('lzo'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04001783endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001784if lzo.found() and not cc.links('''
1785 #include <lzo/lzo1x.h>
1786 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
1787 lzo = not_found
1788 if get_option('lzo').enabled()
1789 error('could not link liblzo2')
1790 else
1791 warning('could not link liblzo2, disabling')
1792 endif
1793endif
1794
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001795numa = not_found
1796if not get_option('numa').auto() or have_system or have_tools
1797 numa = cc.find_library('numa', has_headers: ['numa.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001798 required: get_option('numa'))
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001799endif
1800if numa.found() and not cc.links('''
1801 #include <numa.h>
1802 int main(void) { return numa_available(); }
1803 ''', dependencies: numa)
1804 numa = not_found
1805 if get_option('numa').enabled()
1806 error('could not link numa')
1807 else
1808 warning('could not link numa, disabling')
1809 endif
1810endif
1811
Marc-André Lureau55166232019-07-24 19:16:22 +04001812rdma = not_found
Paolo Bonzini3730a732022-04-20 17:33:41 +02001813if not get_option('rdma').auto() or have_system
1814 libumad = cc.find_library('ibumad', required: get_option('rdma'))
1815 rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001816 required: get_option('rdma')),
1817 cc.find_library('ibverbs', required: get_option('rdma')),
Paolo Bonzini3730a732022-04-20 17:33:41 +02001818 libumad]
1819 rdma = declare_dependency(dependencies: rdma_libs)
1820 foreach lib: rdma_libs
1821 if not lib.found()
1822 rdma = not_found
1823 endif
1824 endforeach
Marc-André Lureau55166232019-07-24 19:16:22 +04001825endif
Paolo Bonzini3730a732022-04-20 17:33:41 +02001826
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001827cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02001828if not get_option('smartcard').auto() or have_system
1829 cacard = dependency('libcacard', required: get_option('smartcard'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001830 version: '>=2.5.1', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001831endif
César Belley0a40bcb2020-08-26 13:42:04 +02001832u2f = not_found
Paolo Bonzinie7c22ff2023-09-08 12:10:27 +02001833if not get_option('u2f').auto() or have_system
César Belley0a40bcb2020-08-26 13:42:04 +02001834 u2f = dependency('u2f-emu', required: get_option('u2f'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001835 method: 'pkg-config')
César Belley0a40bcb2020-08-26 13:42:04 +02001836endif
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08001837canokey = not_found
Paolo Bonzinie7c22ff2023-09-08 12:10:27 +02001838if not get_option('canokey').auto() or have_system
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08001839 canokey = dependency('canokey-qemu', required: get_option('canokey'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001840 method: 'pkg-config')
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08001841endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001842usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02001843if not get_option('usb_redir').auto() or have_system
1844 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001845 version: '>=0.6', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001846endif
1847libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02001848if not get_option('libusb').auto() or have_system
1849 libusb = dependency('libusb-1.0', required: get_option('libusb'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001850 version: '>=1.0.13', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001851endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02001852
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001853libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02001854if not get_option('libpmem').auto() or have_system
1855 libpmem = dependency('libpmem', required: get_option('libpmem'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001856 method: 'pkg-config')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001857endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001858libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02001859if not get_option('libdaxctl').auto() or have_system
1860 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001861 version: '>=57', method: 'pkg-config')
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001862endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001863tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02001864if gnutls.found()
1865 tasn1 = dependency('libtasn1',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001866 method: 'pkg-config')
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001867endif
Max Fritz0db0fbb2023-05-22 02:12:02 +02001868keyutils = not_found
Thomas Huthc64023b2023-08-24 11:42:08 +02001869if not get_option('libkeyutils').auto() or have_block
1870 keyutils = dependency('libkeyutils', required: get_option('libkeyutils'),
1871 method: 'pkg-config')
Max Fritz0db0fbb2023-05-22 02:12:02 +02001872endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001873
Marc-André Lureau3909def2020-08-28 15:07:33 +04001874has_gettid = cc.has_function('gettid')
1875
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001876# libselinux
1877selinux = dependency('libselinux',
1878 required: get_option('selinux'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001879 method: 'pkg-config')
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001880
Paolo Bonziniaa087962020-09-01 11:15:30 -04001881# Malloc tests
1882
1883malloc = []
1884if get_option('malloc') == 'system'
1885 has_malloc_trim = \
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001886 get_option('malloc_trim').allowed() and \
Michal Privoznik09a49af2023-05-30 12:31:23 +02001887 cc.has_function('malloc_trim', prefix: '#include <malloc.h>')
Paolo Bonziniaa087962020-09-01 11:15:30 -04001888else
1889 has_malloc_trim = false
1890 malloc = cc.find_library(get_option('malloc'), required: true)
1891endif
1892if not has_malloc_trim and get_option('malloc_trim').enabled()
1893 if get_option('malloc') == 'system'
1894 error('malloc_trim not available on this platform.')
1895 else
1896 error('malloc_trim not available with non-libc memory allocator')
1897 endif
1898endif
1899
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001900gnu_source_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01001901 #ifndef _GNU_SOURCE
1902 #define _GNU_SOURCE
1903 #endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001904'''
Max Reitz84e319a2020-11-02 17:18:55 +01001905
Michal Privoznik09a49af2023-05-30 12:31:23 +02001906# Check whether the glibc provides STATX_BASIC_STATS
1907
1908has_statx = cc.has_header_symbol('sys/stat.h', 'STATX_BASIC_STATS', prefix: gnu_source_prefix)
Max Reitz84e319a2020-11-02 17:18:55 +01001909
Hanna Reitz4ce7a082022-02-23 10:23:40 +01001910# Check whether statx() provides mount ID information
1911
Michal Privoznik09a49af2023-05-30 12:31:23 +02001912has_statx_mnt_id = cc.has_header_symbol('sys/stat.h', 'STATX_MNT_ID', prefix: gnu_source_prefix)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01001913
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001914have_vhost_user_blk_server = get_option('vhost_user_blk_server') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001915 .require(host_os == 'linux',
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001916 error_message: 'vhost_user_blk_server requires linux') \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02001917 .require(have_vhost_user,
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001918 error_message: 'vhost_user_blk_server requires vhost-user support') \
Alex Bennée26ed5012022-05-24 16:40:42 +01001919 .disable_auto_if(not have_tools and not have_system) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001920 .allowed()
Daniele Buono9e62ba42020-12-04 18:06:14 -05001921
Max Reitzdf4ea702020-10-27 20:05:46 +01001922if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1923 error('Cannot enable fuse-lseek while fuse is disabled')
1924endif
1925
Max Reitza484a712020-10-27 20:05:41 +01001926fuse = dependency('fuse3', required: get_option('fuse'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001927 version: '>=3.1', method: 'pkg-config')
Max Reitza484a712020-10-27 20:05:41 +01001928
Max Reitzdf4ea702020-10-27 20:05:46 +01001929fuse_lseek = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001930if get_option('fuse_lseek').allowed()
Max Reitzdf4ea702020-10-27 20:05:46 +01001931 if fuse.version().version_compare('>=3.8')
1932 # Dummy dependency
1933 fuse_lseek = declare_dependency()
1934 elif get_option('fuse_lseek').enabled()
1935 if fuse.found()
1936 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1937 else
1938 error('fuse-lseek requires libfuse, which was not found')
1939 endif
1940 endif
1941endif
1942
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001943have_libvduse = (host_os == 'linux')
Xie Yongjia6caeee2022-05-23 16:46:08 +08001944if get_option('libvduse').enabled()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001945 if host_os != 'linux'
Xie Yongjia6caeee2022-05-23 16:46:08 +08001946 error('libvduse requires linux')
1947 endif
1948elif get_option('libvduse').disabled()
1949 have_libvduse = false
1950endif
1951
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001952have_vduse_blk_export = (have_libvduse and host_os == 'linux')
Xie Yongji2a2359b2022-05-23 16:46:09 +08001953if get_option('vduse_blk_export').enabled()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001954 if host_os != 'linux'
Xie Yongji2a2359b2022-05-23 16:46:09 +08001955 error('vduse_blk_export requires linux')
1956 elif not have_libvduse
1957 error('vduse_blk_export requires libvduse support')
1958 endif
1959elif get_option('vduse_blk_export').disabled()
1960 have_vduse_blk_export = false
1961endif
1962
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001963# libbpf
1964libbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
1965if libbpf.found() and not cc.links('''
1966 #include <bpf/libbpf.h>
1967 int main(void)
1968 {
1969 bpf_object__destroy_skeleton(NULL);
1970 return 0;
1971 }''', dependencies: libbpf)
1972 libbpf = not_found
1973 if get_option('bpf').enabled()
1974 error('libbpf skeleton test failed')
1975 else
1976 warning('libbpf skeleton test failed, disabling')
1977 endif
1978endif
1979
Ilya Maximetscb039ef2023-09-13 20:34:37 +02001980# libxdp
1981libxdp = not_found
1982if not get_option('af_xdp').auto() or have_system
1983 libxdp = dependency('libxdp', required: get_option('af_xdp'),
1984 version: '>=1.4.0', method: 'pkg-config')
1985endif
1986
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01001987# libdw
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01001988libdw = not_found
Ilya Leoshkevich550c6d92023-02-10 01:52:08 +01001989if not get_option('libdw').auto() or \
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001990 (not get_option('prefer_static') and (have_system or have_user))
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01001991 libdw = dependency('libdw',
1992 method: 'pkg-config',
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01001993 required: get_option('libdw'))
1994endif
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01001995
Paolo Bonzini87430d52021-10-07 15:06:09 +02001996#################
1997# config-host.h #
1998#################
1999
Paolo Bonzini95933f12023-09-08 12:10:08 +02002000config_host_data = configuration_data()
2001
Paolo Bonzini87430d52021-10-07 15:06:09 +02002002audio_drivers_selected = []
2003if have_system
2004 audio_drivers_available = {
2005 'alsa': alsa.found(),
2006 'coreaudio': coreaudio.found(),
2007 'dsound': dsound.found(),
2008 'jack': jack.found(),
2009 'oss': oss.found(),
2010 'pa': pulse.found(),
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02002011 'pipewire': pipewire.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002012 'sdl': sdl.found(),
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002013 'sndio': sndio.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002014 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02002015 foreach k, v: audio_drivers_available
2016 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
2017 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02002018
2019 # Default to native drivers first, OSS second, SDL third
2020 audio_drivers_priority = \
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002021 [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002022 (host_os == 'linux' ? [] : [ 'sdl' ])
Paolo Bonzini87430d52021-10-07 15:06:09 +02002023 audio_drivers_default = []
2024 foreach k: audio_drivers_priority
2025 if audio_drivers_available[k]
2026 audio_drivers_default += k
2027 endif
2028 endforeach
2029
2030 foreach k: get_option('audio_drv_list')
2031 if k == 'default'
2032 audio_drivers_selected += audio_drivers_default
2033 elif not audio_drivers_available[k]
2034 error('Audio driver "@0@" not available.'.format(k))
2035 else
2036 audio_drivers_selected += k
2037 endif
2038 endforeach
2039endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02002040config_host_data.set('CONFIG_AUDIO_DRIVERS',
2041 '"' + '", "'.join(audio_drivers_selected) + '", ')
2042
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002043have_host_block_device = (host_os != 'darwin' or
Joelle van Dyne14176c82021-03-15 11:03:38 -07002044 cc.has_header('IOKit/storage/IOMedia.h'))
2045
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002046dbus_display = get_option('dbus_display') \
2047 .require(gio.version().version_compare('>=2.64'),
2048 error_message: '-display dbus requires glib>=2.64') \
Paolo Bonzini75440602022-04-20 17:33:44 +02002049 .require(gdbus_codegen.found(),
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02002050 error_message: gdbus_codegen_error.format('-display dbus')) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002051 .allowed()
Marc-André Lureau142ca622021-07-15 11:53:53 +04002052
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002053have_virtfs = get_option('virtfs') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002054 .require(host_os == 'linux' or host_os == 'darwin',
Keno Fischer0fb1e192022-02-27 17:35:22 -05002055 error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002056 .require(host_os == 'linux' or cc.has_function('pthread_fchdir_np'),
Keno Fischer0fb1e192022-02-27 17:35:22 -05002057 error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002058 .require(host_os == 'darwin' or libattr.found(),
Peter Foley1a67e072023-05-03 09:07:56 -04002059 error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002060 .disable_auto_if(not have_tools and not have_system) \
2061 .allowed()
Paolo Bonzini69202b42020-11-17 14:46:21 +01002062
Peter Foley1a67e072023-05-03 09:07:56 -04002063have_virtfs_proxy_helper = get_option('virtfs_proxy_helper') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002064 .require(host_os != 'darwin', error_message: 'the virtfs proxy helper is incompatible with macOS') \
Peter Foley1a67e072023-05-03 09:07:56 -04002065 .require(have_virtfs, error_message: 'the virtfs proxy helper requires that virtfs is enabled') \
2066 .disable_auto_if(not have_tools) \
2067 .require(libcap_ng.found(), error_message: 'the virtfs proxy helper requires libcap-ng') \
2068 .allowed()
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01002069
Paolo Bonzini622d64f2022-04-20 17:33:53 +02002070if get_option('block_drv_ro_whitelist') == ''
2071 config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
2072else
2073 config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
2074 '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
2075endif
2076if get_option('block_drv_rw_whitelist') == ''
2077 config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
2078else
2079 config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
2080 '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
2081endif
2082
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002083foreach k : get_option('trace_backends')
2084 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
2085endforeach
2086config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02002087config_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
Paolo Bonzini40c909f2022-04-20 17:33:49 +02002088if iasl.found()
2089 config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
Paolo Bonzini5dc46182021-10-13 13:19:00 +02002090endif
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002091config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
2092config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
2093config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
2094config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
2095config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09002096
2097qemu_firmwarepath = ''
2098foreach k : get_option('qemu_firmwarepath')
2099 qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
2100endforeach
2101config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
2102
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002103config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
2104config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
2105config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
2106config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
2107config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
2108config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
2109
Paolo Bonzini60027112022-10-20 14:53:10 +02002110if enable_modules
Paolo Bonzinib0b43232022-04-20 17:33:54 +02002111 config_host_data.set('CONFIG_STAMP', run_command(
2112 meson.current_source_dir() / 'scripts/qemu-stamp.py',
2113 meson.project_version(), get_option('pkgversion'), '--',
2114 meson.current_source_dir() / 'configure',
2115 capture: true, check: true).stdout().strip())
2116endif
2117
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002118have_slirp_smbd = get_option('slirp_smbd') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002119 .require(host_os != 'windows', error_message: 'Host smbd not supported on this platform.') \
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002120 .allowed()
2121if have_slirp_smbd
2122 smbd_path = get_option('smbd')
2123 if smbd_path == ''
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002124 smbd_path = (host_os == 'sunos' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002125 endif
2126 config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
2127endif
2128
Paolo Bonzini823eb012021-11-08 14:18:17 +01002129config_host_data.set('HOST_' + host_arch.to_upper(), 1)
2130
Paolo Bonzini95933f12023-09-08 12:10:08 +02002131kvm_targets_c = '""'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002132if get_option('kvm').allowed() and host_os == 'linux'
Paolo Bonzini95933f12023-09-08 12:10:08 +02002133 kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
2134endif
2135config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
2136
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02002137if get_option('module_upgrades') and not enable_modules
2138 error('Cannot enable module-upgrades as modules are not enabled')
2139endif
2140config_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
2141
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002142config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002143config_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002144config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002145config_host_data.set('CONFIG_BSD', host_os in bsd_oses)
Paolo Bonzinia775c712023-09-08 12:09:22 +02002146config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04002147config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002148config_host_data.set('CONFIG_DARWIN', host_os == 'darwin')
Paolo Bonzini537b7242021-10-07 15:08:12 +02002149config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02002150config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002151config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002152config_host_data.set('CONFIG_LINUX', host_os == 'linux')
2153config_host_data.set('CONFIG_POSIX', host_os != 'windows')
2154config_host_data.set('CONFIG_WIN32', host_os == 'windows')
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002155config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002156config_host_data.set('CONFIG_MPATH', mpathpersist.found())
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04002157config_host_data.set('CONFIG_BLKIO', blkio.found())
Stefano Garzarella98b126f2023-05-30 09:19:41 +02002158if blkio.found()
2159 config_host_data.set('CONFIG_BLKIO_VHOST_VDPA_FD',
2160 blkio.version().version_compare('>=1.3.0'))
2161endif
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002162config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08002163config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02002164config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini75440602022-04-20 17:33:44 +02002165config_host_data.set('CONFIG_GIO', gio.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002166config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
2167if glusterfs.found()
2168 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
2169 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
2170 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
2171 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
2172 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
2173 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
2174endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002175config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02002176config_host_data.set('CONFIG_VTE', vte.found())
Claudio Fontana29e0bff2022-11-21 14:55:38 +01002177config_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard)
Taylor Simpson63efb6a2023-04-27 15:59:52 -07002178config_host_data.set('CONFIG_HEXAGON_IDEF_PARSER', get_option('hexagon_idef_parser'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002179config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002180config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002181config_host_data.set('CONFIG_EBPF', libbpf.found())
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002182config_host_data.set('CONFIG_AF_XDP', libxdp.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002183config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002184config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01002185config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Thomas Huthe6a52b32021-12-09 15:48:01 +01002186config_host_data.set('CONFIG_LIBSSH', libssh.found())
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02002187config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002188config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
2189config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzini60027112022-10-20 14:53:10 +02002190config_host_data.set('CONFIG_MODULES', enable_modules)
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002191config_host_data.set('CONFIG_NUMA', numa.found())
Michal Privoznik6bb613f2022-12-15 10:55:03 +01002192if numa.found()
2193 config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY',
2194 cc.has_function('numa_has_preferred_many',
2195 dependencies: numa))
2196endif
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002197config_host_data.set('CONFIG_OPENGL', opengl.found())
Paolo Bonzini2c13c572023-08-30 12:20:53 +02002198config_host_data.set('CONFIG_PLUGIN', get_option('plugins'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002199config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini3730a732022-04-20 17:33:41 +02002200config_host_data.set('CONFIG_RDMA', rdma.found())
Paolo Bonzini655e2a72023-10-05 14:19:34 +02002201config_host_data.set('CONFIG_RELOCATABLE', get_option('relocatable'))
Paolo Bonzini721fa5e2022-10-12 11:59:51 +02002202config_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002203config_host_data.set('CONFIG_SDL', sdl.found())
2204config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01002205config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Michal Privoznik73422d92022-10-26 09:30:24 +02002206if seccomp.found()
2207 config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
2208endif
Marc-André Lureaucca15752023-08-30 13:38:25 +04002209config_host_data.set('CONFIG_PIXMAN', pixman.found())
Paolo Bonzinia775c712023-09-08 12:09:22 +02002210config_host_data.set('CONFIG_SLIRP', slirp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01002211config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002212config_host_data.set('CONFIG_SOLARIS', host_os == 'sunos')
Paolo Bonzini875be2872022-02-15 11:37:00 +01002213if get_option('tcg').allowed()
2214 config_host_data.set('CONFIG_TCG', 1)
2215 config_host_data.set('CONFIG_TCG_INTERPRETER', tcg_arch == 'tci')
2216endif
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002217config_host_data.set('CONFIG_TPM', have_tpm)
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002218config_host_data.set('CONFIG_TSAN', get_option('tsan'))
Paolo Bonzini90540f32021-06-03 11:15:26 +02002219config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Paolo Bonzinie1723992021-10-07 15:08:21 +02002220config_host_data.set('CONFIG_VDE', vde.found())
Stefan Hajnoczic0c4f142023-10-03 21:45:32 -04002221config_host_data.set('CONFIG_VHOST', have_vhost)
Paolo Bonzini2df89d52022-04-20 17:34:07 +02002222config_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
2223config_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
2224config_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
2225config_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
2226config_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
2227config_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
2228config_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03002229config_host_data.set('CONFIG_VMNET', vmnet.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002230config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Xie Yongji2a2359b2022-05-23 16:46:09 +08002231config_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
Kshitij Suri95f85102022-04-08 07:13:34 +00002232config_host_data.set('CONFIG_PNG', png.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002233config_host_data.set('CONFIG_VNC', vnc.found())
2234config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002235config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini95933f12023-09-08 12:10:08 +02002236if virgl.found()
2237 config_host_data.set('HAVE_VIRGL_D3D_INFO_EXT',
2238 cc.has_member('struct virgl_renderer_resource_info_ext', 'd3d_tex2d',
2239 prefix: '#include <virglrenderer.h>',
2240 dependencies: virgl))
2241endif
Paolo Bonzini69202b42020-11-17 14:46:21 +01002242config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002243config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002244config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04002245config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04002246config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02002247config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01002248config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Daniel P. Berrangéd47b83b2022-04-26 17:00:43 +01002249config_host_data.set('CONFIG_TASN1', tasn1.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002250config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
2251config_host_data.set('CONFIG_NETTLE', nettle.found())
Lei He4c5e5122022-05-25 17:01:14 +08002252config_host_data.set('CONFIG_HOGWEED', hogweed.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002253config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002254config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01002255config_host_data.set('CONFIG_STATX', has_statx)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002256config_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id)
Paolo Bonzinib1def332020-11-17 13:37:39 +01002257config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01002258config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01002259config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002260config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
Marc-André Lureauddece462021-10-06 14:18:09 +04002261if spice_protocol.found()
2262config_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
2263config_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
2264config_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
2265endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002266config_host_data.set('CONFIG_SPICE', spice.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01002267config_host_data.set('CONFIG_X11', x11.found())
Marc-André Lureau142ca622021-07-15 11:53:53 +04002268config_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
Daniele Buono9e62ba42020-12-04 18:06:14 -05002269config_host_data.set('CONFIG_CFI', get_option('cfi'))
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002270config_host_data.set('CONFIG_SELINUX', selinux.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002271config_host_data.set('CONFIG_XEN_BACKEND', xen.found())
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002272config_host_data.set('CONFIG_LIBDW', libdw.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002273if xen.found()
2274 # protect from xen.version() having less than three components
2275 xen_version = xen.version().split('.') + ['0', '0']
2276 xen_ctrl_version = xen_version[0] + \
2277 ('0' + xen_version[1]).substring(-2) + \
2278 ('0' + xen_version[2]).substring(-2)
2279 config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
2280endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002281config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
2282config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
2283config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
2284config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
2285
Paolo Bonzinia6305082021-10-07 15:08:15 +02002286config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002287config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
2288
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002289have_coroutine_pool = get_option('coroutine_pool')
2290if get_option('debug_stack_usage') and have_coroutine_pool
2291 message('Disabling coroutine pool to measure stack usage')
2292 have_coroutine_pool = false
2293endif
Paolo Bonzini230f6e02023-10-05 14:31:27 +02002294config_host_data.set('CONFIG_COROUTINE_POOL', have_coroutine_pool)
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04002295config_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002296config_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002297config_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
Paolo Bonzini1d558c92023-08-28 11:48:30 +02002298config_host_data.set('CONFIG_DEBUG_TCG', get_option('debug_tcg'))
Paolo Bonzini406523f2021-10-13 11:43:54 +02002299config_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002300config_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
Juan Quintelaabad1852022-09-02 18:51:25 +02002301config_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
Paolo Bonzini406523f2021-10-13 11:43:54 +02002302
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002303# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002304config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002305config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
2306config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
Thomas Huth48f670e2020-11-18 18:10:52 +01002307config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01002308config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01002309config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002310config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01002311config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01002312config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002313if host_os == 'windows'
Bin Mengd4093732022-08-02 15:51:58 +08002314 config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
2315endif
Thomas Huthded5d782020-11-14 11:10:11 +01002316
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002317# has_function
Claudio Imbrendac891c242022-08-12 15:34:53 +02002318config_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002319config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002320config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
2321config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
2322config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
2323config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Paolo Bonzini67504852023-06-21 00:47:31 +02002324config_host_data.set('CONFIG_GETCPU', cc.has_function('getcpu', prefix: gnu_source_prefix))
2325config_host_data.set('CONFIG_SCHED_GETCPU', cc.has_function('sched_getcpu', prefix: '#include <sched.h>'))
Peter Maydell86983432022-02-26 18:07:19 +00002326# Note that we need to specify prefix: here to avoid incorrectly
2327# thinking that Windows has posix_memalign()
2328config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
Peter Maydell5c8c7142022-02-26 18:07:20 +00002329config_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
Peter Maydell88454f82022-02-26 18:07:21 +00002330config_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
2331config_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002332config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002333config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Keno Fischer029ed1b2022-02-27 17:35:20 -05002334config_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002335config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
2336config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
2337config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
2338config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
2339config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002340config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Andrew Deason59e35c72022-04-26 14:55:22 -05002341config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02002342config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002343config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002344config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002345config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Michael S. Tsirkindc864d32023-11-07 04:20:55 -05002346config_host_data.set('HAVE_GETLOADAVG_FUNCTION', cc.has_function('getloadavg', prefix: '#include <stdlib.h>'))
Stefano Garzarella66dc5f92022-05-17 09:10:12 +02002347if rbd.found()
2348 config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
2349 cc.has_function('rbd_namespace_exists',
2350 dependencies: rbd,
2351 prefix: '#include <rbd/librbd.h>'))
2352endif
Li Zhijian911965a2021-09-10 15:02:55 +08002353if rdma.found()
2354 config_host_data.set('HAVE_IBV_ADVISE_MR',
2355 cc.has_function('ibv_advise_mr',
Paolo Bonzini3730a732022-04-20 17:33:41 +02002356 dependencies: rdma,
Li Zhijian911965a2021-09-10 15:02:55 +08002357 prefix: '#include <infiniband/verbs.h>'))
2358endif
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002359
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002360have_asan_fiber = false
2361if get_option('sanitizers') and \
2362 not cc.has_function('__sanitizer_start_switch_fiber',
2363 args: '-fsanitize=address',
2364 prefix: '#include <sanitizer/asan_interface.h>')
2365 warning('Missing ASAN due to missing fiber annotation interface')
2366 warning('Without code annotation, the report may be inferior.')
2367else
2368 have_asan_fiber = true
2369endif
2370config_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber)
2371
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002372# has_header_symbol
Sam Li6d43eaa2023-05-08 12:55:28 +08002373config_host_data.set('CONFIG_BLKZONED',
2374 cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002375config_host_data.set('CONFIG_EPOLL_CREATE1',
2376 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
2377config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
2378 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
2379 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
2380config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
2381 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
2382config_host_data.set('CONFIG_FIEMAP',
2383 cc.has_header('linux/fiemap.h') and
2384 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002385config_host_data.set('CONFIG_GETRANDOM',
2386 cc.has_function('getrandom') and
2387 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002388config_host_data.set('CONFIG_INOTIFY',
2389 cc.has_header_symbol('sys/inotify.h', 'inotify_init'))
2390config_host_data.set('CONFIG_INOTIFY1',
2391 cc.has_header_symbol('sys/inotify.h', 'inotify_init1'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002392config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
2393 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002394config_host_data.set('CONFIG_RTNETLINK',
2395 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
2396config_host_data.set('CONFIG_SYSMACROS',
2397 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002398config_host_data.set('HAVE_OPTRESET',
2399 cc.has_header_symbol('getopt.h', 'optreset'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04002400config_host_data.set('HAVE_IPPROTO_MPTCP',
2401 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002402
2403# has_member
2404config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
2405 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
2406 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002407config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
2408 cc.has_member('struct stat', 'st_atim',
2409 prefix: '#include <sys/stat.h>'))
Sam Li6d43eaa2023-05-08 12:55:28 +08002410config_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY',
2411 cc.has_member('struct blk_zone', 'capacity',
2412 prefix: '#include <linux/blkzoned.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002413
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002414# has_type
2415config_host_data.set('CONFIG_IOVEC',
2416 cc.has_type('struct iovec',
2417 prefix: '#include <sys/uio.h>'))
2418config_host_data.set('HAVE_UTMPX',
2419 cc.has_type('struct utmpx',
2420 prefix: '#include <utmpx.h>'))
2421
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002422config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002423 #include <sys/eventfd.h>
2424 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002425config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002426 #include <unistd.h>
2427 int main(void) {
2428 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2429 return fdatasync(0);
2430 #else
2431 #error Not supported
2432 #endif
2433 }'''))
Andrew Deason8900c202022-03-15 22:52:25 -05002434
2435has_madvise = cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002436 #include <sys/types.h>
2437 #include <sys/mman.h>
2438 #include <stddef.h>
Andrew Deason8900c202022-03-15 22:52:25 -05002439 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
2440missing_madvise_proto = false
2441if has_madvise
2442 # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
2443 # but forget to prototype it. In this case, has_madvise will be true (the
2444 # test program links despite a compile warning). To detect the
2445 # missing-prototype case, we try again with a definitely-bogus prototype.
2446 # This will only compile if the system headers don't provide the prototype;
2447 # otherwise the conflicting prototypes will cause a compiler error.
2448 missing_madvise_proto = cc.links(gnu_source_prefix + '''
2449 #include <sys/types.h>
2450 #include <sys/mman.h>
2451 #include <stddef.h>
2452 extern int madvise(int);
2453 int main(void) { return madvise(0); }''')
2454endif
2455config_host_data.set('CONFIG_MADVISE', has_madvise)
2456config_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
2457
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002458config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002459 #include <sys/mman.h>
2460 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002461config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002462 #include <fcntl.h>
2463 #if !defined(AT_EMPTY_PATH)
2464 # error missing definition
2465 #else
2466 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2467 #endif'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002468config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002469 #include <sys/mman.h>
2470 #include <stddef.h>
2471 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002472
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002473config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002474 #include <pthread.h>
2475
2476 static void *f(void *p) { return NULL; }
2477 int main(void)
2478 {
2479 pthread_t thread;
2480 pthread_create(&thread, 0, f, 0);
2481 pthread_setname_np(thread, "QEMU");
2482 return 0;
2483 }''', dependencies: threads))
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002484config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002485 #include <pthread.h>
2486
2487 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
2488 int main(void)
2489 {
2490 pthread_t thread;
2491 pthread_create(&thread, 0, f, 0);
2492 return 0;
2493 }''', dependencies: threads))
Brad Smith3ada67a2022-12-18 03:22:04 -05002494config_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + '''
2495 #include <pthread.h>
2496 #include <pthread_np.h>
2497
2498 static void *f(void *p) { return NULL; }
2499 int main(void)
2500 {
2501 pthread_t thread;
2502 pthread_create(&thread, 0, f, 0);
2503 pthread_set_name_np(thread, "QEMU");
2504 return 0;
2505 }''', dependencies: threads))
Longpeng(Mike)657ac982022-02-22 17:05:05 +08002506config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
2507 #include <pthread.h>
2508 #include <time.h>
2509
2510 int main(void)
2511 {
2512 pthread_condattr_t attr
2513 pthread_condattr_init(&attr);
2514 pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2515 return 0;
2516 }''', dependencies: threads))
David Hildenbrand7730f322022-10-14 15:47:15 +02002517config_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + '''
2518 #include <pthread.h>
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002519
David Hildenbrand7730f322022-10-14 15:47:15 +02002520 static void *f(void *p) { return NULL; }
2521 int main(void)
2522 {
2523 int setsize = CPU_ALLOC_SIZE(64);
2524 pthread_t thread;
2525 cpu_set_t *cpuset;
2526 pthread_create(&thread, 0, f, 0);
2527 cpuset = CPU_ALLOC(64);
2528 CPU_ZERO_S(setsize, cpuset);
2529 pthread_setaffinity_np(thread, setsize, cpuset);
2530 pthread_getaffinity_np(thread, setsize, cpuset);
2531 CPU_FREE(cpuset);
2532 return 0;
2533 }''', dependencies: threads))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002534config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02002535 #include <sys/signalfd.h>
2536 #include <stddef.h>
2537 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002538config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002539 #include <unistd.h>
2540 #include <fcntl.h>
2541 #include <limits.h>
2542
2543 int main(void)
2544 {
2545 int len, fd = 0;
2546 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2547 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2548 return 0;
2549 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002550
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002551config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
2552 #include <sys/mman.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002553 int main(void) {
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002554 return mlockall(MCL_FUTURE);
2555 }'''))
2556
Thomas Hutheea94532021-10-28 20:59:08 +02002557have_l2tpv3 = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002558if get_option('l2tpv3').allowed() and have_system
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002559 have_l2tpv3 = cc.has_type('struct mmsghdr',
2560 prefix: gnu_source_prefix + '''
2561 #include <sys/socket.h>
2562 #include <linux/ip.h>''')
Thomas Hutheea94532021-10-28 20:59:08 +02002563endif
2564config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2565
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002566have_netmap = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002567if get_option('netmap').allowed() and have_system
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002568 have_netmap = cc.compiles('''
2569 #include <inttypes.h>
2570 #include <net/if.h>
2571 #include <net/netmap.h>
2572 #include <net/netmap_user.h>
2573 #if (NETMAP_API < 11) || (NETMAP_API > 15)
2574 #error
2575 #endif
2576 int main(void) { return 0; }''')
2577 if not have_netmap and get_option('netmap').enabled()
2578 error('Netmap headers not available')
2579 endif
2580endif
2581config_host_data.set('CONFIG_NETMAP', have_netmap)
2582
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002583# Work around a system header bug with some kernel/XFS header
2584# versions where they both try to define 'struct fsxattr':
2585# xfs headers will not try to redefine structs from linux headers
2586# if this macro is set.
2587config_host_data.set('HAVE_FSXATTR', cc.links('''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002588 #include <linux/fs.h>
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002589 struct fsxattr foo;
2590 int main(void) {
2591 return 0;
2592 }'''))
2593
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002594# Some versions of Mac OS X incorrectly define SIZE_MAX
2595config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2596 #include <stdint.h>
2597 #include <stdio.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002598 int main(void) {
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002599 return printf("%zu", SIZE_MAX);
2600 }''', args: ['-Werror']))
2601
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002602# See if 64-bit atomic operations are supported.
2603# Note that without __atomic builtins, we can only
2604# assume atomic loads/stores max at pointer size.
2605config_host_data.set('CONFIG_ATOMIC64', cc.links('''
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002606 #include <stdint.h>
2607 int main(void)
2608 {
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002609 uint64_t x = 0, y = 0;
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002610 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
2611 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
2612 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2613 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2614 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2615 return 0;
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002616 }'''))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002617
Richard Henderson6479dd72023-05-24 08:14:41 -07002618has_int128_type = cc.compiles('''
2619 __int128_t a;
2620 __uint128_t b;
2621 int main(void) { b = a; }''')
2622config_host_data.set('CONFIG_INT128_TYPE', has_int128_type)
2623
2624has_int128 = has_int128_type and cc.links('''
Marc-André Lureau848126d2022-02-28 15:49:19 +04002625 __int128_t a;
2626 __uint128_t b;
2627 int main (void) {
2628 a = a + b;
2629 b = a * b;
2630 a = a * a;
2631 return 0;
2632 }''')
Marc-André Lureau848126d2022-02-28 15:49:19 +04002633config_host_data.set('CONFIG_INT128', has_int128)
2634
Richard Henderson6479dd72023-05-24 08:14:41 -07002635if has_int128_type
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002636 # "do we have 128-bit atomics which are handled inline and specifically not
2637 # via libatomic". The reason we can't use libatomic is documented in the
2638 # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002639 # We only care about these operations on 16-byte aligned pointers, so
2640 # force 16-byte alignment of the pointer, which may be greater than
2641 # __alignof(unsigned __int128) for the host.
2642 atomic_test_128 = '''
2643 int main(int ac, char **av) {
Richard Henderson6479dd72023-05-24 08:14:41 -07002644 __uint128_t *p = __builtin_assume_aligned(av[ac - 1], 16);
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002645 p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED);
2646 __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED);
2647 __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2648 return 0;
2649 }'''
2650 has_atomic128 = cc.links(atomic_test_128)
Marc-André Lureau848126d2022-02-28 15:49:19 +04002651
2652 config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
2653
2654 if not has_atomic128
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002655 # Even with __builtin_assume_aligned, the above test may have failed
2656 # without optimization enabled. Try again with optimizations locally
2657 # enabled for the function. See
2658 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389
2659 has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128)
2660 config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt)
Marc-André Lureau848126d2022-02-28 15:49:19 +04002661
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002662 if not has_atomic128_opt
2663 config_host_data.set('CONFIG_CMPXCHG128', cc.links('''
2664 int main(void)
2665 {
Richard Henderson6479dd72023-05-24 08:14:41 -07002666 __uint128_t x = 0, y = 0;
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002667 __sync_val_compare_and_swap_16(&x, y, x);
2668 return 0;
2669 }
2670 '''))
2671 endif
Marc-André Lureau848126d2022-02-28 15:49:19 +04002672 endif
2673endif
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002674
2675config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
2676 #include <sys/auxv.h>
2677 int main(void) {
2678 return getauxval(AT_HWCAP) == 0;
2679 }'''))
2680
Paolo Bonzini0dae95d2022-04-20 17:33:43 +02002681config_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
2682 #include <linux/usbdevice_fs.h>
2683
2684 #ifndef USBDEVFS_GET_CAPABILITIES
2685 #error "USBDEVFS_GET_CAPABILITIES undefined"
2686 #endif
2687
2688 #ifndef USBDEVFS_DISCONNECT_CLAIM
2689 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
2690 #endif
2691
2692 int main(void) { return 0; }'''))
2693
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02002694have_keyring = get_option('keyring') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002695 .require(host_os == 'linux', error_message: 'keyring is only available on Linux') \
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02002696 .require(cc.compiles('''
2697 #include <errno.h>
2698 #include <asm/unistd.h>
2699 #include <linux/keyctl.h>
2700 #include <sys/syscall.h>
2701 #include <unistd.h>
2702 int main(void) {
2703 return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
2704 }'''), error_message: 'keyctl syscall not available on this system').allowed()
2705config_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
2706
Paolo Bonzini622753d2021-11-08 13:38:58 +01002707have_cpuid_h = cc.links('''
2708 #include <cpuid.h>
2709 int main(void) {
2710 unsigned a, b, c, d;
2711 unsigned max = __get_cpuid_max(0, 0);
2712
2713 if (max >= 1) {
2714 __cpuid(1, a, b, c, d);
2715 }
2716
2717 if (max >= 7) {
2718 __cpuid_count(7, 0, a, b, c, d);
2719 }
2720
2721 return 0;
2722 }''')
2723config_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
2724
2725config_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
2726 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
2727 .require(cc.links('''
Paolo Bonzini622753d2021-11-08 13:38:58 +01002728 #include <cpuid.h>
2729 #include <immintrin.h>
Richard Henderson701ea582022-12-03 19:31:12 -06002730 static int __attribute__((target("avx2"))) bar(void *a) {
Paolo Bonzini622753d2021-11-08 13:38:58 +01002731 __m256i x = *(__m256i *)a;
2732 return _mm256_testz_si256(x, x);
2733 }
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002734 int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
Paolo Bonzini622753d2021-11-08 13:38:58 +01002735 '''), error_message: 'AVX2 not available').allowed())
2736
2737config_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \
2738 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \
2739 .require(cc.links('''
Paolo Bonzini622753d2021-11-08 13:38:58 +01002740 #include <cpuid.h>
2741 #include <immintrin.h>
Richard Henderson701ea582022-12-03 19:31:12 -06002742 static int __attribute__((target("avx512f"))) bar(void *a) {
Paolo Bonzini622753d2021-11-08 13:38:58 +01002743 __m512i x = *(__m512i *)a;
2744 return _mm512_test_epi64_mask(x, x);
2745 }
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002746 int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
Paolo Bonzini622753d2021-11-08 13:38:58 +01002747 '''), error_message: 'AVX512F not available').allowed())
2748
ling xu04ffce12022-11-16 23:29:22 +08002749config_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \
2750 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \
2751 .require(cc.links('''
ling xu04ffce12022-11-16 23:29:22 +08002752 #include <cpuid.h>
2753 #include <immintrin.h>
Richard Hendersondc165fc2023-05-01 22:05:55 +01002754 static int __attribute__((target("avx512bw"))) bar(void *a) {
ling xu04ffce12022-11-16 23:29:22 +08002755 __m512i *x = a;
2756 __m512i res= _mm512_abs_epi8(*x);
2757 return res[1];
2758 }
2759 int main(int argc, char *argv[]) { return bar(argv[0]); }
2760 '''), error_message: 'AVX512BW not available').allowed())
2761
Richard Henderson8d97f282023-06-02 07:43:40 +00002762# For both AArch64 and AArch32, detect if builtins are available.
2763config_host_data.set('CONFIG_ARM_AES_BUILTIN', cc.compiles('''
2764 #include <arm_neon.h>
2765 #ifndef __ARM_FEATURE_AES
2766 __attribute__((target("+crypto")))
2767 #endif
2768 void foo(uint8x16_t *p) { *p = vaesmcq_u8(*p); }
2769 '''))
2770
Paolo Bonzini3730a732022-04-20 17:33:41 +02002771have_pvrdma = get_option('pvrdma') \
2772 .require(rdma.found(), error_message: 'PVRDMA requires OpenFabrics libraries') \
Juan Quintela354d2d92022-05-02 15:11:19 +02002773 .require(cc.compiles(gnu_source_prefix + '''
2774 #include <sys/mman.h>
Paolo Bonzini3730a732022-04-20 17:33:41 +02002775 int main(void)
2776 {
2777 char buf = 0;
2778 void *addr = &buf;
2779 addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
2780
2781 return 0;
2782 }'''), error_message: 'PVRDMA requires mremap').allowed()
2783
2784if have_pvrdma
Juan Quintela354d2d92022-05-02 15:11:19 +02002785 config_host_data.set('LEGACY_RDMA_REG_MR', not cc.links('''
Paolo Bonzini3730a732022-04-20 17:33:41 +02002786 #include <infiniband/verbs.h>
2787 int main(void)
2788 {
2789 struct ibv_mr *mr;
2790 struct ibv_pd *pd = NULL;
2791 size_t length = 10;
2792 uint64_t iova = 0;
2793 int access = 0;
2794 void *addr = NULL;
2795
2796 mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
2797 ibv_dereg_mr(mr);
2798 return 0;
2799 }'''))
2800endif
2801
Paolo Bonzinib87df902021-11-08 13:52:11 +01002802if get_option('membarrier').disabled()
2803 have_membarrier = false
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002804elif host_os == 'windows'
Paolo Bonzinib87df902021-11-08 13:52:11 +01002805 have_membarrier = true
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002806elif host_os == 'linux'
Paolo Bonzinib87df902021-11-08 13:52:11 +01002807 have_membarrier = cc.compiles('''
2808 #include <linux/membarrier.h>
2809 #include <sys/syscall.h>
2810 #include <unistd.h>
2811 #include <stdlib.h>
2812 int main(void) {
2813 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
2814 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
2815 exit(0);
2816 }''')
2817endif
2818config_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
2819 .require(have_membarrier, error_message: 'membarrier system call not available') \
2820 .allowed())
2821
Paolo Bonzini34b52612021-11-08 14:02:42 +01002822have_afalg = get_option('crypto_afalg') \
2823 .require(cc.compiles(gnu_source_prefix + '''
2824 #include <errno.h>
2825 #include <sys/types.h>
2826 #include <sys/socket.h>
2827 #include <linux/if_alg.h>
2828 int main(void) {
2829 int sock;
2830 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
2831 return sock;
2832 }
2833 '''), error_message: 'AF_ALG requested but could not be detected').allowed()
2834config_host_data.set('CONFIG_AF_ALG', have_afalg)
2835
Marc-André Lureau9d734b82022-04-01 15:50:05 +04002836config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
2837 'linux/vm_sockets.h', 'AF_VSOCK',
2838 prefix: '#include <sys/socket.h>',
2839))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002840
Marc-André Lureau8821a382022-02-01 16:53:43 +04002841have_vss = false
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002842have_vss_sdk = false # old xp/2003 SDK
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002843if host_os == 'windows' and 'cpp' in all_languages
Marc-André Lureau8821a382022-02-01 16:53:43 +04002844 have_vss = cxx.compiles('''
2845 #define __MIDL_user_allocate_free_DEFINED__
Marc-André Lureau32478cb2022-02-22 23:40:01 +04002846 #include <vss.h>
Marc-André Lureau8821a382022-02-01 16:53:43 +04002847 int main(void) { return VSS_CTX_BACKUP; }''')
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002848 have_vss_sdk = cxx.has_header('vscoordint.h')
Marc-André Lureau8821a382022-02-01 16:53:43 +04002849endif
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002850config_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
Marc-André Lureau8821a382022-02-01 16:53:43 +04002851
Richard Henderson6391c772022-04-17 11:30:06 -07002852# Older versions of MinGW do not import _lock_file and _unlock_file properly.
2853# This was fixed for v6.0.0 with commit b48e3ac8969d.
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002854if host_os == 'windows'
Richard Henderson6391c772022-04-17 11:30:06 -07002855 config_host_data.set('HAVE__LOCK_FILE', cc.links('''
2856 #include <stdio.h>
2857 int main(void) {
2858 _lock_file(NULL);
2859 _unlock_file(NULL);
2860 return 0;
2861 }''', name: '_lock_file and _unlock_file'))
2862endif
2863
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002864if host_os == 'windows'
Pierrick Bouvierdbd672c2023-02-21 16:30:04 +01002865 mingw_has_setjmp_longjmp = cc.links('''
2866 #include <setjmp.h>
2867 int main(void) {
2868 /*
2869 * These functions are not available in setjmp header, but may be
2870 * available at link time, from libmingwex.a.
2871 */
2872 extern int __mingw_setjmp(jmp_buf);
2873 extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int);
2874 jmp_buf env;
2875 __mingw_setjmp(env);
2876 __mingw_longjmp(env, 0);
2877 }
2878 ''', name: 'mingw setjmp and longjmp')
2879
2880 if cpu == 'aarch64' and not mingw_has_setjmp_longjmp
2881 error('mingw must provide setjmp/longjmp for windows-arm64')
2882 endif
2883endif
2884
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002885########################
2886# Target configuration #
2887########################
2888
Paolo Bonzini2becc362020-02-03 11:42:03 +01002889minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02002890
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02002891config_all_accel = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04002892config_all_devices = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002893config_devices_mak_list = []
2894config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02002895config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002896config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002897
2898disassemblers = {
2899 'alpha' : ['CONFIG_ALPHA_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002900 'avr' : ['CONFIG_AVR_DIS'],
2901 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06002902 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002903 'hppa' : ['CONFIG_HPPA_DIS'],
2904 'i386' : ['CONFIG_I386_DIS'],
2905 'x86_64' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002906 'm68k' : ['CONFIG_M68K_DIS'],
2907 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
2908 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002909 'nios2' : ['CONFIG_NIOS2_DIS'],
2910 'or1k' : ['CONFIG_OPENRISC_DIS'],
2911 'ppc' : ['CONFIG_PPC_DIS'],
2912 'riscv' : ['CONFIG_RISCV_DIS'],
2913 'rx' : ['CONFIG_RX_DIS'],
2914 's390' : ['CONFIG_S390_DIS'],
2915 'sh4' : ['CONFIG_SH4_DIS'],
2916 'sparc' : ['CONFIG_SPARC_DIS'],
2917 'xtensa' : ['CONFIG_XTENSA_DIS'],
Song Gaoaae17462022-06-06 20:43:06 +08002918 'loongarch' : ['CONFIG_LOONGARCH_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002919}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002920
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002921have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01002922host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02002923 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002924 (have_tpm ? ['CONFIG_TPM=y'] : []) + \
Marc-André Lureaucca15752023-08-30 13:38:25 +04002925 (pixman.found() ? ['CONFIG_PIXMAN=y'] : []) + \
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002926 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02002927 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002928 (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01002929 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02002930 (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
2931 (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
2932 (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01002933 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002934 (host_os == 'linux' ? ['CONFIG_LINUX=y'] : []) + \
Paolo Bonzini3730a732022-04-20 17:33:41 +02002935 (have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \
Jagannathan Raman55116962022-06-13 16:26:24 -04002936 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02002937 (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : []) + \
2938 (hv_balloon ? ['CONFIG_HV_BALLOON_POSSIBLE=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01002939
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002940ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002941
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002942default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
2943actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002944fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002945foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04002946 config_target = { 'TARGET_NAME': target.split('-')[0] }
2947 if target.endswith('linux-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002948 if host_os != 'linux'
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002949 if default_targets
2950 continue
2951 endif
2952 error('Target @0@ is only available on a Linux host'.format(target))
2953 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04002954 config_target += { 'CONFIG_LINUX_USER': 'y' }
2955 elif target.endswith('bsd-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002956 if host_os not in bsd_oses
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002957 if default_targets
2958 continue
2959 endif
2960 error('Target @0@ is only available on a BSD host'.format(target))
2961 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04002962 config_target += { 'CONFIG_BSD_USER': 'y' }
2963 elif target.endswith('softmmu')
Philippe Mathieu-Daudébd0c03b2023-06-13 15:33:45 +02002964 config_target += { 'CONFIG_SYSTEM_ONLY': 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04002965 config_target += { 'CONFIG_SOFTMMU': 'y' }
2966 endif
2967 if target.endswith('-user')
2968 config_target += {
2969 'CONFIG_USER_ONLY': 'y',
2970 'CONFIG_QEMU_INTERP_PREFIX':
Paolo Bonzinice6119d2022-04-20 17:33:55 +02002971 get_option('interp_prefix').replace('%M', config_target['TARGET_NAME'])
Paolo Bonzini765686d2020-09-18 06:37:21 -04002972 }
2973 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002974
Paolo Bonzini0a189112020-11-17 14:58:32 +01002975 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04002976 foreach sym: accelerators
2977 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
2978 config_target += { sym: 'y' }
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02002979 config_all_accel += { sym: 'y' }
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002980 if target in modular_tcg
2981 config_target += { 'CONFIG_TCG_MODULAR': 'y' }
2982 else
2983 config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
2984 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01002985 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04002986 endif
2987 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01002988 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002989 if default_targets
2990 continue
2991 endif
2992 error('No accelerator available for target @0@'.format(target))
2993 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04002994
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002995 actual_target_dirs += target
Alex Bennée812b31d2021-07-07 14:17:43 +01002996 config_target += keyval.load('configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002997 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04002998
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002999 if 'TARGET_NEED_FDT' in config_target
3000 fdt_required += target
3001 endif
3002
Paolo Bonzinifa731682020-09-21 05:19:07 -04003003 # Add default keys
3004 if 'TARGET_BASE_ARCH' not in config_target
3005 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
3006 endif
3007 if 'TARGET_ABI_DIR' not in config_target
3008 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
3009 endif
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003010 if 'TARGET_BIG_ENDIAN' not in config_target
3011 config_target += {'TARGET_BIG_ENDIAN': 'n'}
3012 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02003013
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003014 foreach k, v: disassemblers
Paolo Bonzini823eb012021-11-08 14:18:17 +01003015 if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003016 foreach sym: v
3017 config_target += { sym: 'y' }
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003018 endforeach
3019 endif
3020 endforeach
3021
Paolo Bonzini859aef02020-08-04 18:14:26 +02003022 config_target_data = configuration_data()
3023 foreach k, v: config_target
3024 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
3025 # do nothing
3026 elif ignored.contains(k)
3027 # do nothing
3028 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003029 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
3030 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02003031 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04003032 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02003033 config_target_data.set_quoted(k, v)
3034 elif v == 'y'
3035 config_target_data.set(k, 1)
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003036 elif v == 'n'
3037 config_target_data.set(k, 0)
Paolo Bonzini859aef02020-08-04 18:14:26 +02003038 else
3039 config_target_data.set(k, v)
3040 endif
3041 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01003042 config_target_data.set('QEMU_ARCH',
3043 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02003044 config_target_h += {target: configure_file(output: target + '-config-target.h',
3045 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003046
3047 if target.endswith('-softmmu')
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003048 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003049 config_devices_mak = target + '-config-devices.mak'
3050 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003051 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01003052 output: config_devices_mak,
3053 depfile: config_devices_mak + '.d',
3054 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01003055 command: [minikconf,
3056 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01003057 config_devices_mak, '@DEPFILE@', '@INPUT@',
Philippe Mathieu-Daudéf4063f92021-07-07 14:17:40 +01003058 host_kconfig, accel_kconfig,
3059 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'])
Paolo Bonzini859aef02020-08-04 18:14:26 +02003060
3061 config_devices_data = configuration_data()
3062 config_devices = keyval.load(config_devices_mak)
3063 foreach k, v: config_devices
3064 config_devices_data.set(k, 1)
3065 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003066 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02003067 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
3068 configuration: config_devices_data)}
3069 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04003070 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01003071 endif
3072 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003073endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003074target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003075
Paolo Bonzinieed56e92021-11-10 11:01:26 +01003076target_configs_h = []
3077foreach target: target_dirs
3078 target_configs_h += config_target_h[target]
3079 target_configs_h += config_devices_h.get(target, [])
3080endforeach
3081genh += custom_target('config-poison.h',
3082 input: [target_configs_h],
3083 output: 'config-poison.h',
3084 capture: true,
3085 command: [find_program('scripts/make-config-poison.sh'),
3086 target_configs_h])
3087
Paolo Bonzinia775c712023-09-08 12:09:22 +02003088###############
3089# Subprojects #
3090###############
Paolo Bonzini4d34a862020-10-05 11:31:15 +02003091
Jagannathan Raman55116962022-06-13 16:26:24 -04003092libvfio_user_dep = not_found
3093if have_system and vfio_user_server_allowed
Paolo Bonzini2019cab2023-05-18 16:50:00 +02003094 libvfio_user_proj = subproject('libvfio-user', required: true)
Paolo Bonzini53283532023-03-30 12:47:23 +02003095 libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
Jagannathan Raman55116962022-06-13 16:26:24 -04003096endif
3097
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003098fdt = not_found
Paolo Bonzini577bdbc2023-05-18 17:29:04 +02003099fdt_opt = get_option('fdt')
3100if fdt_required.length() > 0 or fdt_opt == 'enabled'
3101 if fdt_opt == 'disabled'
3102 error('fdt disabled but required by targets ' + ', '.join(fdt_required))
3103 endif
3104
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003105 if fdt_opt in ['enabled', 'auto', 'system']
Paolo Bonzinif0df6132023-09-26 12:31:40 +02003106 if get_option('wrap_mode') == 'nodownload'
3107 fdt_opt = 'system'
3108 endif
Paolo Bonzini577bdbc2023-05-18 17:29:04 +02003109 fdt = cc.find_library('fdt', required: fdt_opt == 'system')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003110 if fdt.found() and cc.links('''
3111 #include <libfdt.h>
3112 #include <libfdt_env.h>
Thomas Huthde47b0f2022-01-18 18:05:48 +01003113 int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003114 dependencies: fdt)
3115 fdt_opt = 'system'
Thomas Huth6c228532021-08-27 14:09:00 +02003116 elif fdt_opt == 'system'
3117 error('system libfdt requested, but it is too old (1.5.1 or newer required)')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003118 else
Paolo Bonzini577bdbc2023-05-18 17:29:04 +02003119 fdt_opt = 'internal'
Thomas Huth87daf892021-08-27 14:08:59 +02003120 fdt = not_found
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003121 endif
3122 endif
Paolo Bonzini577bdbc2023-05-18 17:29:04 +02003123 if not fdt.found()
3124 assert(fdt_opt == 'internal')
Paolo Bonzini58e48b22023-05-18 12:07:22 +00003125 libfdt_proj = subproject('dtc', required: true,
3126 default_options: ['tools=false', 'yaml=disabled',
3127 'python=disabled', 'default_library=static'])
3128 fdt = libfdt_proj.get_variable('libfdt_dep')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003129 endif
Philippe Mathieu-Daudéc593d842022-02-08 11:19:46 +01003130else
3131 fdt_opt = 'disabled'
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003132endif
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003133
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003134config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzinia775c712023-09-08 12:09:22 +02003135
3136vhost_user = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003137if host_os == 'linux' and have_vhost_user
Paolo Bonzinia775c712023-09-08 12:09:22 +02003138 libvhost_user = subproject('libvhost-user')
3139 vhost_user = libvhost_user.get_variable('vhost_user_dep')
3140endif
3141
3142libvduse = not_found
3143if have_libvduse
3144 libvduse_proj = subproject('libvduse')
3145 libvduse = libvduse_proj.get_variable('libvduse_dep')
3146endif
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003147
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003148#####################
3149# Generated sources #
3150#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003151
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003152genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003153
Marc-André Lureau3f885652019-07-15 18:06:04 +04003154hxtool = find_program('scripts/hxtool')
Marc-André Lureaue2c40122023-01-24 18:00:57 +00003155shaderinclude = find_program('scripts/shaderinclude.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003156qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003157qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
3158 meson.current_source_dir() / 'scripts/qapi/commands.py',
3159 meson.current_source_dir() / 'scripts/qapi/common.py',
3160 meson.current_source_dir() / 'scripts/qapi/error.py',
3161 meson.current_source_dir() / 'scripts/qapi/events.py',
3162 meson.current_source_dir() / 'scripts/qapi/expr.py',
3163 meson.current_source_dir() / 'scripts/qapi/gen.py',
3164 meson.current_source_dir() / 'scripts/qapi/introspect.py',
Markus Armbruster88d357d2023-04-28 12:54:16 +02003165 meson.current_source_dir() / 'scripts/qapi/main.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003166 meson.current_source_dir() / 'scripts/qapi/parser.py',
3167 meson.current_source_dir() / 'scripts/qapi/schema.py',
3168 meson.current_source_dir() / 'scripts/qapi/source.py',
3169 meson.current_source_dir() / 'scripts/qapi/types.py',
3170 meson.current_source_dir() / 'scripts/qapi/visit.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003171 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003172]
3173
3174tracetool = [
3175 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003176 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003177]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003178tracetool_depends = files(
3179 'scripts/tracetool/backend/log.py',
3180 'scripts/tracetool/backend/__init__.py',
3181 'scripts/tracetool/backend/dtrace.py',
3182 'scripts/tracetool/backend/ftrace.py',
3183 'scripts/tracetool/backend/simple.py',
3184 'scripts/tracetool/backend/syslog.py',
3185 'scripts/tracetool/backend/ust.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003186 'scripts/tracetool/format/ust_events_c.py',
3187 'scripts/tracetool/format/ust_events_h.py',
3188 'scripts/tracetool/format/__init__.py',
3189 'scripts/tracetool/format/d.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003190 'scripts/tracetool/format/simpletrace_stap.py',
3191 'scripts/tracetool/format/c.py',
3192 'scripts/tracetool/format/h.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003193 'scripts/tracetool/format/log_stap.py',
3194 'scripts/tracetool/format/stap.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003195 'scripts/tracetool/__init__.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003196 'scripts/tracetool/vcpu.py'
3197)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003198
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003199qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
3200 meson.current_source_dir(),
Paolo Bonzinib0b43232022-04-20 17:33:54 +02003201 get_option('pkgversion'), meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003202qemu_version = custom_target('qemu-version.h',
3203 output: 'qemu-version.h',
3204 command: qemu_version_cmd,
3205 capture: true,
3206 build_by_default: true,
3207 build_always_stale: true)
3208genh += qemu_version
3209
Marc-André Lureau3f885652019-07-15 18:06:04 +04003210hxdep = []
3211hx_headers = [
3212 ['qemu-options.hx', 'qemu-options.def'],
3213 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
3214]
3215if have_system
3216 hx_headers += [
3217 ['hmp-commands.hx', 'hmp-commands.h'],
3218 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
3219 ]
3220endif
3221foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003222 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04003223 input: files(d[0]),
3224 output: d[1],
3225 capture: true,
Marc-André Lureau3f885652019-07-15 18:06:04 +04003226 command: [hxtool, '-h', '@INPUT0@'])
3227endforeach
3228genh += hxdep
3229
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003230###############
3231# Trace files #
3232###############
3233
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003234# TODO: add each directory to the subdirs from its own meson.build, once
3235# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003236trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003237 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003238 'qapi',
3239 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003240 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003241 'util',
Alex Bennée842b42d2022-09-29 12:42:22 +01003242 'gdbstub',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003243]
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003244if have_linux_user
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003245 trace_events_subdirs += [ 'linux-user' ]
3246endif
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003247if have_bsd_user
3248 trace_events_subdirs += [ 'bsd-user' ]
3249endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003250if have_block
3251 trace_events_subdirs += [
3252 'authz',
3253 'block',
3254 'io',
3255 'nbd',
3256 'scsi',
3257 ]
3258endif
3259if have_system
3260 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003261 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003262 'audio',
3263 'backends',
3264 'backends/tpm',
3265 'chardev',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003266 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003267 'hw/9pfs',
3268 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08003269 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003270 'hw/alpha',
3271 'hw/arm',
3272 'hw/audio',
3273 'hw/block',
3274 'hw/block/dataplane',
3275 'hw/char',
3276 'hw/display',
3277 'hw/dma',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003278 'hw/hyperv',
3279 'hw/i2c',
3280 'hw/i386',
3281 'hw/i386/xen',
David Woodhouseaa98ee32023-01-13 19:51:32 +00003282 'hw/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003283 'hw/ide',
3284 'hw/input',
3285 'hw/intc',
3286 'hw/isa',
3287 'hw/mem',
3288 'hw/mips',
3289 'hw/misc',
3290 'hw/misc/macio',
3291 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08003292 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01003293 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02003294 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003295 'hw/nvram',
3296 'hw/pci',
3297 'hw/pci-host',
3298 'hw/ppc',
3299 'hw/rdma',
3300 'hw/rdma/vmw',
3301 'hw/rtc',
3302 'hw/s390x',
3303 'hw/scsi',
3304 'hw/sd',
BALATON Zoltanad52cfc2021-10-29 23:02:09 +02003305 'hw/sh4',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003306 'hw/sparc',
3307 'hw/sparc64',
3308 'hw/ssi',
3309 'hw/timer',
3310 'hw/tpm',
Jeuk Kimbc4e68d2023-09-06 16:43:48 +09003311 'hw/ufs',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003312 'hw/usb',
3313 'hw/vfio',
3314 'hw/virtio',
3315 'hw/watchdog',
3316 'hw/xen',
3317 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003318 'migration',
3319 'net',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003320 'system',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003321 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05003322 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003323 ]
3324endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003325if have_system or have_user
3326 trace_events_subdirs += [
3327 'accel/tcg',
3328 'hw/core',
3329 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02003330 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003331 'target/hppa',
3332 'target/i386',
3333 'target/i386/kvm',
Tianrui Zhaof8447432024-01-05 15:57:59 +08003334 'target/loongarch',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02003335 'target/mips/tcg',
Richard Henderson6f83e272022-02-25 21:06:20 -10003336 'target/nios2',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003337 'target/ppc',
3338 'target/riscv',
3339 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08003340 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003341 'target/sparc',
3342 ]
3343endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003344
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003345###################
3346# Collect sources #
3347###################
3348
3349authz_ss = ss.source_set()
3350blockdev_ss = ss.source_set()
3351block_ss = ss.source_set()
3352chardev_ss = ss.source_set()
3353common_ss = ss.source_set()
3354crypto_ss = ss.source_set()
3355hwcore_ss = ss.source_set()
3356io_ss = ss.source_set()
3357qmp_ss = ss.source_set()
3358qom_ss = ss.source_set()
3359system_ss = ss.source_set()
3360specific_fuzz_ss = ss.source_set()
3361specific_ss = ss.source_set()
3362stub_ss = ss.source_set()
3363trace_ss = ss.source_set()
3364user_ss = ss.source_set()
3365util_ss = ss.source_set()
3366
3367# accel modules
3368qtest_module_ss = ss.source_set()
3369tcg_module_ss = ss.source_set()
3370
3371modules = {}
3372target_modules = {}
3373hw_arch = {}
3374target_arch = {}
3375target_system_arch = {}
3376target_user_arch = {}
3377
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +01003378# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
3379# that is filled in by qapi/.
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003380subdir('qapi')
3381subdir('qobject')
3382subdir('stubs')
3383subdir('trace')
3384subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04003385subdir('qom')
3386subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003387subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04003388subdir('ui')
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003389subdir('hw')
Alex Bennée842b42d2022-09-29 12:42:22 +01003390subdir('gdbstub')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003391
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003392if enable_modules
3393 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
3394 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
3395endif
3396
Paolo Bonzini1220f582023-08-30 11:52:43 +02003397qom_ss = qom_ss.apply({})
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003398libqom = static_library('qom', qom_ss.sources() + genh,
3399 dependencies: [qom_ss.dependencies()],
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003400 name_suffix: 'fa',
3401 build_by_default: false)
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003402qom = declare_dependency(link_whole: libqom)
3403
3404event_loop_base = files('event-loop-base.c')
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003405event_loop_base = static_library('event-loop-base',
3406 sources: event_loop_base + genh,
3407 name_suffix: 'fa',
3408 build_by_default: false)
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003409event_loop_base = declare_dependency(link_whole: event_loop_base,
3410 dependencies: [qom])
3411
Paolo Bonzini1220f582023-08-30 11:52:43 +02003412stub_ss = stub_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003413
3414util_ss.add_all(trace_ss)
Paolo Bonzini1220f582023-08-30 11:52:43 +02003415util_ss = util_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003416libqemuutil = static_library('qemuutil',
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003417 build_by_default: false,
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003418 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +02003419 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003420qemuutil = declare_dependency(link_with: libqemuutil,
Nicolas Saenz Julienne70ac26b2022-04-25 09:57:22 +02003421 sources: genh + version_res,
3422 dependencies: [event_loop_base])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003423
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01003424if have_system or have_user
3425 decodetree = generator(find_program('scripts/decodetree.py'),
3426 output: 'decode-@BASENAME@.c.inc',
3427 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3428 subdir('libdecnumber')
3429 subdir('target')
3430endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003431
Paolo Bonzini478e9432020-08-17 12:47:55 +02003432subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04003433subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04003434subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003435subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04003436subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003437
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003438if have_block
3439 block_ss.add(files(
3440 'block.c',
3441 'blockjob.c',
3442 'job.c',
3443 'qemu-io-cmds.c',
3444 ))
Paolo Bonzini406523f2021-10-13 11:43:54 +02003445 if config_host_data.get('CONFIG_REPLICATION')
3446 block_ss.add(files('replication.c'))
3447 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003448
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003449 subdir('nbd')
3450 subdir('scsi')
3451 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003452
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003453 blockdev_ss.add(files(
3454 'blockdev.c',
3455 'blockdev-nbd.c',
3456 'iothread.c',
3457 'job-qmp.c',
3458 ), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02003459
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003460 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
3461 # os-win32.c does not
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003462 if host_os == 'windows'
Paolo Bonzinidc495492023-08-30 11:29:54 +02003463 system_ss.add(files('os-win32.c'))
3464 else
3465 blockdev_ss.add(files('os-posix.c'))
3466 endif
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003467endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02003468
Philippe Mathieu-Daudéfe0007f2023-09-14 20:57:12 +02003469common_ss.add(files('cpu-common.c'))
3470specific_ss.add(files('cpu-target.c'))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003471
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003472subdir('system')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003473
Richard Henderson44b99a62021-03-22 12:24:26 +01003474# Work around a gcc bug/misfeature wherein constant propagation looks
3475# through an alias:
3476# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
3477# to guess that a const variable is always zero. Without lto, this is
3478# impossible, as the alias is restricted to page-vary-common.c. Indeed,
3479# without lto, not even the alias is required -- we simply use different
3480# declarations in different compilation units.
3481pagevary = files('page-vary-common.c')
3482if get_option('b_lto')
3483 pagevary_flags = ['-fno-lto']
3484 if get_option('cfi')
3485 pagevary_flags += '-fno-sanitize=cfi-icall'
3486 endif
Thomas Huth54c9b192022-03-30 13:48:08 +02003487 pagevary = static_library('page-vary-common', sources: pagevary + genh,
Richard Henderson44b99a62021-03-22 12:24:26 +01003488 c_args: pagevary_flags)
3489 pagevary = declare_dependency(link_with: pagevary)
3490endif
3491common_ss.add(pagevary)
Philippe Mathieu-Daudé8c7907a2023-09-14 20:57:13 +02003492specific_ss.add(files('page-vary-target.c'))
Richard Henderson6670d4d2021-03-22 12:24:24 +01003493
Marc-André Lureauab318052019-07-24 19:23:16 +04003494subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04003495subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04003496subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003497subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04003498subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04003499subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00003500subdir('semihosting')
Markus Armbrusteraa09b3d2023-01-24 13:19:36 +01003501subdir('stats')
Richard Henderson104cc2c2021-03-08 12:04:33 -08003502subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08003503subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04003504subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003505subdir('plugins')
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003506subdir('ebpf')
3507
3508common_user_inc = []
3509
3510subdir('common-user')
Marc-André Lureaub309c322019-08-18 19:20:37 +04003511subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04003512subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003513
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003514# needed for fuzzing binaries
3515subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003516subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003517
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003518# accel modules
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02003519tcg_real_module_ss = ss.source_set()
3520tcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
3521specific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
3522target_modules += { 'accel' : { 'qtest': qtest_module_ss,
3523 'tcg': tcg_real_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003524
Paolo Bonziniea444d92023-09-08 12:06:12 +02003525##############################################
3526# Internal static_libraries and dependencies #
3527##############################################
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003528
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003529modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003530modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003531modinfo_files = []
3532
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003533block_mods = []
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003534system_mods = []
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003535foreach d, list : modules
Paolo Bonzinief709862023-05-04 10:20:46 +02003536 if not (d == 'block' ? have_block : have_system)
3537 continue
3538 endif
3539
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003540 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003541 if enable_modules
Paolo Bonzini0d665492023-08-31 11:18:24 +02003542 module_ss = module_ss.apply(config_all_devices, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003543 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
3544 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
3545 if d == 'block'
3546 block_mods += sl
3547 else
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003548 system_mods += sl
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003549 endif
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003550 if module_ss.sources() != []
3551 # FIXME: Should use sl.extract_all_objects(recursive: true) as
3552 # input. Sources can be used multiple times but objects are
3553 # unique when it comes to lookup in compile_commands.json.
3554 # Depnds on a mesion version with
3555 # https://github.com/mesonbuild/meson/pull/8900
3556 modinfo_files += custom_target(d + '-' + m + '.modinfo',
3557 output: d + '-' + m + '.modinfo',
Paolo Bonziniac347112021-07-21 18:51:57 +02003558 input: module_ss.sources() + genh,
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003559 capture: true,
Paolo Bonziniac347112021-07-21 18:51:57 +02003560 command: [modinfo_collect, module_ss.sources()])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003561 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003562 else
3563 if d == 'block'
3564 block_ss.add_all(module_ss)
3565 else
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003566 system_ss.add_all(module_ss)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003567 endif
3568 endif
3569 endforeach
3570endforeach
3571
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003572foreach d, list : target_modules
3573 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003574 if enable_modules
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003575 foreach target : target_dirs
3576 if target.endswith('-softmmu')
3577 config_target = config_target_mak[target]
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003578 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3579 c_args = ['-DNEED_CPU_H',
3580 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3581 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3582 target_module_ss = module_ss.apply(config_target, strict: false)
3583 if target_module_ss.sources() != []
3584 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3585 sl = static_library(module_name,
3586 [genh, target_module_ss.sources()],
3587 dependencies: [modulecommon, target_module_ss.dependencies()],
3588 include_directories: target_inc,
3589 c_args: c_args,
3590 pic: true)
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003591 system_mods += sl
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003592 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
3593 modinfo_files += custom_target(module_name + '.modinfo',
3594 output: module_name + '.modinfo',
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003595 input: target_module_ss.sources() + genh,
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003596 capture: true,
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003597 command: [modinfo_collect, '--target', target, target_module_ss.sources()])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003598 endif
3599 endif
3600 endforeach
3601 else
3602 specific_ss.add_all(module_ss)
3603 endif
3604 endforeach
3605endforeach
3606
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003607if enable_modules
Jose R. Ziviani05d68142022-05-28 00:20:35 +02003608 foreach target : target_dirs
3609 if target.endswith('-softmmu')
3610 config_target = config_target_mak[target]
3611 config_devices_mak = target + '-config-devices.mak'
3612 modinfo_src = custom_target('modinfo-' + target + '.c',
3613 output: 'modinfo-' + target + '.c',
3614 input: modinfo_files,
3615 command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
3616 capture: true)
3617
3618 modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
3619 modinfo_dep = declare_dependency(link_with: modinfo_lib)
3620
3621 arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
3622 hw_arch[arch].add(modinfo_dep)
3623 endif
3624 endforeach
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003625endif
3626
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003627nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08003628undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003629block_syms = custom_target('block.syms', output: 'block.syms',
3630 input: [libqemuutil, block_mods],
3631 capture: true,
3632 command: [undefsym, nm, '@INPUT@'])
3633qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003634 input: [libqemuutil, system_mods],
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003635 capture: true,
3636 command: [undefsym, nm, '@INPUT@'])
3637
Paolo Bonzini1220f582023-08-30 11:52:43 +02003638authz_ss = authz_ss.apply({})
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003639libauthz = static_library('authz', authz_ss.sources() + genh,
3640 dependencies: [authz_ss.dependencies()],
3641 name_suffix: 'fa',
3642 build_by_default: false)
3643
3644authz = declare_dependency(link_whole: libauthz,
3645 dependencies: qom)
3646
Paolo Bonzini1220f582023-08-30 11:52:43 +02003647crypto_ss = crypto_ss.apply({})
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003648libcrypto = static_library('crypto', crypto_ss.sources() + genh,
3649 dependencies: [crypto_ss.dependencies()],
3650 name_suffix: 'fa',
3651 build_by_default: false)
3652
3653crypto = declare_dependency(link_whole: libcrypto,
3654 dependencies: [authz, qom])
3655
Paolo Bonzini1220f582023-08-30 11:52:43 +02003656io_ss = io_ss.apply({})
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003657libio = static_library('io', io_ss.sources() + genh,
3658 dependencies: [io_ss.dependencies()],
3659 link_with: libqemuutil,
3660 name_suffix: 'fa',
3661 build_by_default: false)
3662
3663io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
3664
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003665libmigration = static_library('migration', sources: migration_files + genh,
3666 name_suffix: 'fa',
3667 build_by_default: false)
3668migration = declare_dependency(link_with: libmigration,
3669 dependencies: [zlib, qom, io])
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003670system_ss.add(migration)
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003671
Paolo Bonzini1220f582023-08-30 11:52:43 +02003672block_ss = block_ss.apply({})
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003673libblock = static_library('block', block_ss.sources() + genh,
3674 dependencies: block_ss.dependencies(),
3675 link_depends: block_syms,
3676 name_suffix: 'fa',
3677 build_by_default: false)
3678
3679block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003680 link_args: '@block.syms',
3681 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003682
Paolo Bonzini1220f582023-08-30 11:52:43 +02003683blockdev_ss = blockdev_ss.apply({})
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003684libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
3685 dependencies: blockdev_ss.dependencies(),
3686 name_suffix: 'fa',
3687 build_by_default: false)
3688
3689blockdev = declare_dependency(link_whole: [libblockdev],
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003690 dependencies: [block, event_loop_base])
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003691
Paolo Bonzini1220f582023-08-30 11:52:43 +02003692qmp_ss = qmp_ss.apply({})
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003693libqmp = static_library('qmp', qmp_ss.sources() + genh,
3694 dependencies: qmp_ss.dependencies(),
3695 name_suffix: 'fa',
3696 build_by_default: false)
3697
3698qmp = declare_dependency(link_whole: [libqmp])
3699
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003700libchardev = static_library('chardev', chardev_ss.sources() + genh,
3701 name_suffix: 'fa',
Marc-André Lureau22d1f7a2022-03-23 19:57:12 +04003702 dependencies: chardev_ss.dependencies(),
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003703 build_by_default: false)
3704
3705chardev = declare_dependency(link_whole: libchardev)
3706
Paolo Bonzini1220f582023-08-30 11:52:43 +02003707hwcore_ss = hwcore_ss.apply({})
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02003708libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02003709 name_suffix: 'fa',
3710 build_by_default: false)
3711hwcore = declare_dependency(link_whole: libhwcore)
3712common_ss.add(hwcore)
3713
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02003714###########
3715# Targets #
3716###########
3717
Paolo Bonzinifb721762022-01-07 13:00:44 +01003718emulator_modules = []
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003719foreach m : block_mods + system_mods
Paolo Bonzinifb721762022-01-07 13:00:44 +01003720 emulator_modules += shared_module(m.name(),
3721 build_by_default: true,
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003722 name_prefix: '',
3723 link_whole: m,
3724 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003725 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003726endforeach
Paolo Bonzinid8f3a602022-05-30 14:24:34 +02003727if emulator_modules.length() > 0
3728 alias_target('modules', emulator_modules)
3729endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003730
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003731system_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003732common_ss.add(qom, qemuutil)
3733
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003734common_ss.add_all(when: 'CONFIG_SYSTEM_ONLY', if_true: [system_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01003735common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
3736
Paolo Bonzini0d665492023-08-31 11:18:24 +02003737# Note that this library is never used directly (only through extract_objects)
3738# and is not built by default; therefore, source files not used by the build
3739# configuration will be in build.ninja, but are never built by default.
Paolo Bonzini2becc362020-02-03 11:42:03 +01003740common_all = static_library('common',
3741 build_by_default: false,
Paolo Bonzini0d665492023-08-31 11:18:24 +02003742 sources: common_ss.all_sources() + genh,
Paolo Bonzini9d24fb72021-12-21 16:09:54 +01003743 include_directories: common_user_inc,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09003744 implicit_include_directories: false,
Paolo Bonzini0d665492023-08-31 11:18:24 +02003745 dependencies: common_ss.all_dependencies(),
Paolo Bonzini2becc362020-02-03 11:42:03 +01003746 name_suffix: 'fa')
3747
Akihiko Odaki956af7d2023-10-09 17:40:51 +01003748feature_to_c = find_program('scripts/feature_to_c.py')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003749
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003750if host_os == 'darwin'
Philippe Mathieu-Daudé30cfa502022-02-15 17:25:03 +01003751 entitlement = find_program('scripts/entitlement.sh')
3752endif
3753
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04003754emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003755foreach target : target_dirs
3756 config_target = config_target_mak[target]
3757 target_name = config_target['TARGET_NAME']
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003758 target_base_arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02003759 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003760 arch_deps = []
3761 c_args = ['-DNEED_CPU_H',
3762 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3763 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04003764 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01003765
3766 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003767 if host_os == 'linux'
Paolo Bonzini2becc362020-02-03 11:42:03 +01003768 target_inc += include_directories('linux-headers', is_system: true)
3769 endif
3770 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003771 target_type='system'
Philippe Mathieu-Daudé01c85e62023-10-04 11:06:27 +02003772 t = target_system_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003773 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003774 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003775
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003776 hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
Philippe Mathieu-Daudébf964322023-11-21 13:52:48 +01003777 if hw_arch.has_key(hw_dir)
3778 hw = hw_arch[hw_dir].apply(config_target, strict: false)
3779 arch_srcs += hw.sources()
3780 arch_deps += hw.dependencies()
3781 endif
Marc-André Lureau2c442202019-08-17 13:55:58 +04003782
Paolo Bonzini2becc362020-02-03 11:42:03 +01003783 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003784 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01003785 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04003786 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01003787 target_type='user'
Paolo Bonzinia3a576b2021-12-21 16:23:55 +01003788 target_inc += common_user_inc
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003789 if target_base_arch in target_user_arch
3790 t = target_user_arch[target_base_arch].apply(config_target, strict: false)
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02003791 arch_srcs += t.sources()
3792 arch_deps += t.dependencies()
3793 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01003794 if 'CONFIG_LINUX_USER' in config_target
3795 base_dir = 'linux-user'
Warner Loshe2a74722021-08-03 17:17:17 -06003796 endif
3797 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01003798 base_dir = 'bsd-user'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003799 target_inc += include_directories('bsd-user/' / host_os)
Warner Losh85fc1b52022-01-08 17:27:34 -07003800 target_inc += include_directories('bsd-user/host/' / host_arch)
Warner Loshe2a74722021-08-03 17:17:17 -06003801 dir = base_dir / abi
Warner Losh19bf1292021-11-04 16:34:48 -06003802 arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003803 endif
3804 target_inc += include_directories(
3805 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04003806 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003807 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04003808 if 'CONFIG_LINUX_USER' in config_target
3809 dir = base_dir / abi
3810 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
3811 if config_target.has_key('TARGET_SYSTBL_ABI')
3812 arch_srcs += \
3813 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
3814 extra_args : config_target['TARGET_SYSTBL_ABI'])
3815 endif
3816 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01003817 endif
3818
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003819 if 'TARGET_XML_FILES' in config_target
3820 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
3821 output: target + '-gdbstub-xml.c',
3822 input: files(config_target['TARGET_XML_FILES'].split()),
3823 command: [feature_to_c, '@INPUT@'],
3824 capture: true)
3825 arch_srcs += gdbstub_xml
3826 endif
3827
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003828 t = target_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003829 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003830 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003831
Paolo Bonzini2becc362020-02-03 11:42:03 +01003832 target_common = common_ss.apply(config_target, strict: false)
3833 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003834 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003835
Paolo Bonzini2becc362020-02-03 11:42:03 +01003836 target_specific = specific_ss.apply(config_target, strict: false)
3837 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003838 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003839
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003840 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02003841 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02003842 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003843 objects: objects,
3844 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003845 c_args: c_args,
3846 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003847 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003848
3849 if target.endswith('-softmmu')
3850 execs = [{
3851 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003852 'win_subsystem': 'console',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003853 'sources': files('system/main.c'),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003854 'dependencies': []
3855 }]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003856 if host_os == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003857 execs += [{
3858 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003859 'win_subsystem': 'windows',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003860 'sources': files('system/main.c'),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003861 'dependencies': []
3862 }]
3863 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02003864 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003865 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
3866 execs += [{
3867 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003868 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003869 'sources': specific_fuzz.sources(),
3870 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003871 }]
3872 endif
3873 else
3874 execs = [{
3875 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003876 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003877 'sources': [],
3878 'dependencies': []
3879 }]
3880 endif
3881 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01003882 exe_name = exe['name']
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003883 if host_os == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01003884 exe_name += '-unsigned'
3885 endif
3886
3887 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09003888 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003889 c_args: c_args,
3890 dependencies: arch_deps + deps + exe['dependencies'],
3891 objects: lib.extract_all_objects(recursive: true),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003892 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
3893 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003894 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003895
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003896 if host_os == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003897 icon = 'pc-bios/qemu.rsrc'
3898 build_input = [emulator, files(icon)]
3899 install_input = [
3900 get_option('bindir') / exe_name,
3901 meson.current_source_dir() / icon
3902 ]
3903 if 'CONFIG_HVF' in config_target
3904 entitlements = 'accel/hvf/entitlements.plist'
3905 build_input += files(entitlements)
3906 install_input += meson.current_source_dir() / entitlements
3907 endif
3908
Alexander Graf8a74ce62021-01-20 23:44:34 +01003909 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003910 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01003911 output: exe['name'],
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003912 command: [entitlement, '@OUTPUT@', '@INPUT@'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003913 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09003914
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003915 meson.add_install_script(entitlement, '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09003916 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003917 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01003918 else
3919 emulators += {exe['name']: emulator}
3920 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003921
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003922 if stap.found()
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003923 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003924 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
3925 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003926 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
3927 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
3928 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003929 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003930 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003931 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003932 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003933 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003934 command: [
3935 tracetool, '--group=all', '--format=' + stp['fmt'],
3936 '--binary=' + stp['bin'],
3937 '--target-name=' + target_name,
3938 '--target-type=' + target_type,
3939 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01003940 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003941 ],
3942 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003943 endforeach
3944 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003945 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003946endforeach
3947
Paolo Bonzini931049b2020-02-05 09:44:24 +01003948# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003949
Paolo Bonzini2c13c572023-08-30 12:20:53 +02003950if get_option('plugins')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003951 install_headers('include/qemu/qemu-plugin.h')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003952 if host_os == 'windows'
Greg Manning36fa0772023-11-06 18:51:06 +00003953 # On windows, we want to deliver the qemu_plugin_api.lib file in the qemu installer,
3954 # so that plugin authors can compile against it.
3955 install_data(win32_qemu_plugin_api_lib, install_dir: 'lib')
3956 endif
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003957endif
3958
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003959subdir('qga')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02003960
Laurent Vivier9755c942020-08-24 17:24:30 +02003961# Don't build qemu-keymap if xkbcommon is not explicitly enabled
3962# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02003963if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04003964 # used for the update-keymaps target, so include rules even if !have_tools
3965 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
3966 dependencies: [qemuutil, xkbcommon], install: have_tools)
3967endif
3968
Paolo Bonzini931049b2020-02-05 09:44:24 +01003969if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003970 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
3971 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
3972 qemu_io = executable('qemu-io', files('qemu-io.c'),
3973 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01003974 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06003975 dependencies: [blockdev, qemuutil, gnutls, selinux],
3976 install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003977
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02003978 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003979 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04003980 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003981
Marc-André Lureau157e7b12019-07-15 14:50:58 +04003982 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
3983 dependencies: qemuutil,
3984 install: true)
3985
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003986 if have_vhost_user
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02003987 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02003988 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04003989 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02003990 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01003991 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003992
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003993 if host_os == 'linux'
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003994 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
3995 dependencies: [qemuutil, libcap_ng],
3996 install: true,
3997 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003998
3999 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
4000 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02004001 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004002 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004003 endif
4004
Paolo Bonziniccd250a2021-06-03 12:50:17 +02004005 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04004006 subdir('contrib/ivshmem-client')
4007 subdir('contrib/ivshmem-server')
4008 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01004009endif
4010
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04004011subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004012subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04004013subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02004014subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08004015subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01004016if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04004017 subdir('po')
4018endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004019
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004020if host_machine.system() == 'windows'
4021 nsis_cmd = [
4022 find_program('scripts/nsis.py'),
4023 '@OUTPUT@',
4024 get_option('prefix'),
4025 meson.current_source_dir(),
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02004026 glib_pc.get_variable('bindir'),
Stefan Weil24bdcc92020-11-25 20:18:33 +01004027 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004028 '--',
4029 '-DDISPLAYVERSION=' + meson.project_version(),
4030 ]
4031 if build_docs
4032 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
4033 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01004034 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004035 nsis_cmd += '-DCONFIG_GTK=y'
4036 endif
4037
4038 nsis = custom_target('nsis',
4039 output: 'qemu-setup-' + meson.project_version() + '.exe',
4040 input: files('qemu.nsi'),
4041 build_always_stale: true,
4042 command: nsis_cmd + ['@INPUT@'])
4043 alias_target('installer', nsis)
4044endif
4045
Paolo Bonzinia0c91622020-10-07 11:01:51 -04004046#########################
4047# Configuration summary #
4048#########################
4049
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004050# Build environment
Paolo Bonzinif9332752020-02-03 13:28:38 +01004051summary_info = {}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004052summary_info += {'Build directory': meson.current_build_dir()}
4053summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004054summary_info += {'Download dependencies': get_option('wrap_mode') != 'nodownload'}
4055summary(summary_info, bool_yn: true, section: 'Build environment')
4056
4057# Directories
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004058summary_info += {'Install prefix': get_option('prefix')}
4059summary_info += {'BIOS directory': qemu_datadir}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004060pathsep = host_os == 'windows' ? ';' : ':'
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09004061summary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004062summary_info += {'binary directory': get_option('prefix') / get_option('bindir')}
4063summary_info += {'library directory': get_option('prefix') / get_option('libdir')}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004064summary_info += {'module directory': qemu_moddir}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004065summary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
4066summary_info += {'include directory': get_option('prefix') / get_option('includedir')}
4067summary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004068if host_os != 'windows'
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004069 summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
4070 summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004071else
4072 summary_info += {'local state directory': 'queried at runtime'}
4073endif
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004074summary_info += {'Doc directory': get_option('prefix') / get_option('docdir')}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004075summary(summary_info, bool_yn: true, section: 'Directories')
4076
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004077# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004078summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004079summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004080summary_info += {'sphinx-build': sphinx_build}
Paolo Bonzinib4d61d32023-09-28 12:00:48 +02004081
4082# FIXME: the [binaries] section of machine files, which can be probed
4083# with find_program(), would be great for passing gdb and genisoimage
4084# paths from configure to Meson. However, there seems to be no way to
4085# hide a program (for example if gdb is too old).
Paolo Bonzinia47dd5c2023-09-28 10:44:56 +02004086if config_host.has_key('GDB')
4087 summary_info += {'gdb': config_host['GDB']}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004088endif
Paolo Bonzini40c909f2022-04-20 17:33:49 +02004089summary_info += {'iasl': iasl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004090summary_info += {'genisoimage': config_host['GENISOIMAGE']}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004091if host_os == 'windows' and have_ga
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004092 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004093endif
Thomas Huth58902582022-04-08 18:20:47 +02004094if slirp.found() and have_system
Paolo Bonzini35acbb32021-10-13 13:43:36 +02004095 summary_info += {'smbd': have_slirp_smbd ? smbd_path : false}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004096endif
4097summary(summary_info, bool_yn: true, section: 'Host binaries')
4098
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004099# Configurable features
4100summary_info = {}
4101summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004102summary_info += {'system-mode emulation': have_system}
4103summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004104summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004105summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini60027112022-10-20 14:53:10 +02004106summary_info += {'module support': enable_modules}
4107if enable_modules
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02004108 summary_info += {'alternative module path': get_option('module_upgrades')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004109endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004110summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004111if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02004112 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004113endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02004114summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
4115if 'simple' in get_option('trace_backends')
4116 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004117endif
Marc-André Lureau142ca622021-07-15 11:53:53 +04004118summary_info += {'D-Bus display': dbus_display}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004119summary_info += {'QOM debugging': get_option('qom_cast_debug')}
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004120summary_info += {'Relocatable install': get_option('relocatable')}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004121summary_info += {'vhost-kernel support': have_vhost_kernel}
4122summary_info += {'vhost-net support': have_vhost_net}
4123summary_info += {'vhost-user support': have_vhost_user}
4124summary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004125summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004126summary_info += {'vhost-vdpa support': have_vhost_vdpa}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004127summary_info += {'build guest agent': have_ga}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004128summary(summary_info, bool_yn: true, section: 'Configurable features')
4129
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004130# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004131summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004132summary_info += {'host CPU': cpu}
4133summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01004134summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
4135summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Thomas Huth785abf02023-07-06 08:47:36 +02004136if 'cpp' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004137 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004138else
4139 summary_info += {'C++ compiler': false}
4140endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004141if 'objc' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004142 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004143else
4144 summary_info += {'Objective-C compiler': false}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004145endif
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004146option_cflags = (get_option('debug') ? ['-g'] : [])
4147if get_option('optimization') != 'plain'
4148 option_cflags += ['-O' + get_option('optimization')]
4149endif
4150summary_info += {'CFLAGS': ' '.join(get_option('c_args') + option_cflags)}
Thomas Huth785abf02023-07-06 08:47:36 +02004151if 'cpp' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004152 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args') + option_cflags)}
Paolo Bonzini47b30832020-09-23 05:26:17 -04004153endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004154if 'objc' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004155 summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args') + option_cflags)}
Philippe Mathieu-Daudée910c7d2022-01-08 22:38:55 +01004156endif
Thomas Huth785abf02023-07-06 08:47:36 +02004157link_args = get_option('c_link_args')
Paolo Bonzini47b30832020-09-23 05:26:17 -04004158if link_args.length() > 0
4159 summary_info += {'LDFLAGS': ' '.join(link_args)}
4160endif
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004161summary_info += {'QEMU_CFLAGS': ' '.join(qemu_common_flags + qemu_cflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004162if 'cpp' in all_languages
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004163 summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_common_flags + qemu_cxxflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004164endif
4165if 'objc' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +01004166 summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_common_flags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004167endif
Paolo Bonzinid0651772022-04-20 17:33:34 +02004168summary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)}
Daniele Buonocdad7812020-12-04 18:06:11 -05004169summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004170summary_info += {'PIE': get_option('b_pie')}
Paolo Bonzinie58e55d2023-06-07 10:00:21 +02004171summary_info += {'static build': get_option('prefer_static')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004172summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinib87df902021-11-08 13:52:11 +01004173summary_info += {'membarrier': have_membarrier}
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04004174summary_info += {'debug graph lock': get_option('debug_graph_lock')}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004175summary_info += {'debug stack usage': get_option('debug_stack_usage')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004176summary_info += {'mutex debugging': get_option('debug_mutex')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004177summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01004178summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
ling xu04ffce12022-11-16 23:29:22 +08004179summary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01004180summary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004181summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzini34f983d2023-01-09 15:31:51 +01004182summary_info += {'thread sanitizer': get_option('tsan')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004183summary_info += {'CFI support': get_option('cfi')}
4184if get_option('cfi')
4185 summary_info += {'CFI debug support': get_option('cfi_debug')}
4186endif
4187summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004188summary_info += {'sparse': sparse}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004189summary_info += {'mingw32 support': host_os == 'windows'}
Paolo Bonzini12640f02022-06-06 11:48:47 +02004190summary(summary_info, bool_yn: true, section: 'Compilation')
Alex Bennée49e85652021-02-22 10:14:50 +00004191
4192# snarf the cross-compilation information for tests
Paolo Bonzini12640f02022-06-06 11:48:47 +02004193summary_info = {}
4194have_cross = false
Alex Bennée49e85652021-02-22 10:14:50 +00004195foreach target: target_dirs
Paolo Bonzinic7022a72022-09-29 12:42:07 +01004196 tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak'
Alex Bennée49e85652021-02-22 10:14:50 +00004197 if fs.exists(tcg_mak)
4198 config_cross_tcg = keyval.load(tcg_mak)
Alex Bennée85b141e2022-05-27 16:35:34 +01004199 if 'CC' in config_cross_tcg
Paolo Bonzini12640f02022-06-06 11:48:47 +02004200 summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
4201 have_cross = true
Alex Bennée49e85652021-02-22 10:14:50 +00004202 endif
Paolo Bonzini12640f02022-06-06 11:48:47 +02004203 endif
Alex Bennée49e85652021-02-22 10:14:50 +00004204endforeach
Paolo Bonzini12640f02022-06-06 11:48:47 +02004205if have_cross
4206 summary(summary_info, bool_yn: true, section: 'Cross compilers')
4207endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004208
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004209# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004210summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004211if have_system
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004212 summary_info += {'KVM support': config_all_accel.has_key('CONFIG_KVM')}
4213 summary_info += {'HVF support': config_all_accel.has_key('CONFIG_HVF')}
4214 summary_info += {'WHPX support': config_all_accel.has_key('CONFIG_WHPX')}
4215 summary_info += {'NVMM support': config_all_accel.has_key('CONFIG_NVMM')}
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02004216 summary_info += {'Xen support': xen.found()}
4217 if xen.found()
4218 summary_info += {'xen ctrl version': xen.version()}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004219 endif
Paolo Bonzini0d665492023-08-31 11:18:24 +02004220 summary_info += {'Xen emulation': config_all_devices.has_key('CONFIG_XEN_EMU')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004221endif
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004222summary_info += {'TCG support': config_all_accel.has_key('CONFIG_TCG')}
4223if config_all_accel.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004224 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +01004225 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004226 else
4227 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
4228 endif
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004229 summary_info += {'TCG plugins': get_option('plugins')}
Paolo Bonzini1d558c92023-08-28 11:48:30 +02004230 summary_info += {'TCG debug enabled': get_option('debug_tcg')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004231endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004232summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004233if have_system
4234 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01004235 summary_info += {'out of process emulation': multiprocess_allowed}
Jagannathan Raman55116962022-06-13 16:26:24 -04004236 summary_info += {'vfio-user server': vfio_user_server_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004237endif
4238summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
4239
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004240# Block layer
4241summary_info = {}
Paolo Bonzini67398252022-10-12 13:19:35 +02004242summary_info += {'coroutine backend': coroutine_backend}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004243summary_info += {'coroutine pool': have_coroutine_pool}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004244if have_block
Paolo Bonzini622d64f2022-04-20 17:33:53 +02004245 summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
4246 summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004247 summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
Christian Schoenebeck38877022023-05-11 16:12:34 +02004248 summary_info += {'VirtFS (9P) support': have_virtfs}
Christian Schoenebeck71d72ec2023-06-26 13:49:06 +02004249 summary_info += {'VirtFS (9P) Proxy Helper support (deprecated)': have_virtfs_proxy_helper}
Paolo Bonzini406523f2021-10-13 11:43:54 +02004250 summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')}
4251 summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004252 summary_info += {'bochs support': get_option('bochs').allowed()}
4253 summary_info += {'cloop support': get_option('cloop').allowed()}
4254 summary_info += {'dmg support': get_option('dmg').allowed()}
4255 summary_info += {'qcow v1 support': get_option('qcow1').allowed()}
4256 summary_info += {'vdi support': get_option('vdi').allowed()}
Vladimir Sementsov-Ogievskiy11cea422023-04-21 12:27:58 +03004257 summary_info += {'vhdx support': get_option('vhdx').allowed()}
4258 summary_info += {'vmdk support': get_option('vmdk').allowed()}
4259 summary_info += {'vpc support': get_option('vpc').allowed()}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004260 summary_info += {'vvfat support': get_option('vvfat').allowed()}
4261 summary_info += {'qed support': get_option('qed').allowed()}
4262 summary_info += {'parallels support': get_option('parallels').allowed()}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004263 summary_info += {'FUSE exports': fuse}
Xie Yongji2a2359b2022-05-23 16:46:09 +08004264 summary_info += {'VDUSE block exports': have_vduse_blk_export}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004265endif
4266summary(summary_info, bool_yn: true, section: 'Block layer support')
4267
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004268# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004269summary_info = {}
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02004270summary_info += {'TLS priority': get_option('tls_priority')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004271summary_info += {'GNUTLS support': gnutls}
4272if gnutls.found()
4273 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
4274endif
4275summary_info += {'libgcrypt': gcrypt}
4276summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02004277if nettle.found()
4278 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004279endif
Paolo Bonzini34b52612021-11-08 14:02:42 +01004280summary_info += {'AF_ALG support': have_afalg}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004281summary_info += {'rng-none': get_option('rng_none')}
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02004282summary_info += {'Linux keyring': have_keyring}
Thomas Huthc64023b2023-08-24 11:42:08 +02004283summary_info += {'Linux keyutils': keyutils}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004284summary(summary_info, bool_yn: true, section: 'Crypto')
4285
Thomas Huth9e48afa2023-06-02 19:18:30 +02004286# UI
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004287summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004288if host_os == 'darwin'
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03004289 summary_info += {'Cocoa support': cocoa}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004290endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004291summary_info += {'SDL support': sdl}
4292summary_info += {'SDL image support': sdl_image}
4293summary_info += {'GTK support': gtk}
4294summary_info += {'pixman': pixman}
4295summary_info += {'VTE support': vte}
Kshitij Suri95f85102022-04-08 07:13:34 +00004296summary_info += {'PNG support': png}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004297summary_info += {'VNC support': vnc}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01004298if vnc.found()
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004299 summary_info += {'VNC SASL support': sasl}
4300 summary_info += {'VNC JPEG support': jpeg}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004301endif
Thomas Huth9e48afa2023-06-02 19:18:30 +02004302summary_info += {'spice protocol support': spice_protocol}
4303if spice_protocol.found()
4304 summary_info += {' spice server support': spice}
4305endif
4306summary_info += {'curses support': curses}
4307summary_info += {'brlapi support': brlapi}
4308summary(summary_info, bool_yn: true, section: 'User interface')
4309
Alex Bennéef705c1f2023-12-22 11:48:46 +00004310# Graphics backends
4311summary_info = {}
4312summary_info += {'VirGL support': virgl}
4313summary_info += {'Rutabaga support': rutabaga}
4314summary(summary_info, bool_yn: true, section: 'Graphics backends')
4315
Thomas Huthaece7232023-06-02 19:18:32 +02004316# Audio backends
4317summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004318if host_os not in ['darwin', 'haiku', 'windows']
Paolo Bonzini87430d52021-10-07 15:06:09 +02004319 summary_info += {'OSS support': oss}
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02004320 summary_info += {'sndio support': sndio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004321elif host_os == 'darwin'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004322 summary_info += {'CoreAudio support': coreaudio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004323elif host_os == 'windows'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004324 summary_info += {'DirectSound support': dsound}
4325endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004326if host_os == 'linux'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004327 summary_info += {'ALSA support': alsa}
4328 summary_info += {'PulseAudio support': pulse}
4329endif
Marc-André Lureau20c51242023-05-06 20:37:26 +04004330summary_info += {'PipeWire support': pipewire}
Paolo Bonzini87430d52021-10-07 15:06:09 +02004331summary_info += {'JACK support': jack}
Thomas Huthaece7232023-06-02 19:18:32 +02004332summary(summary_info, bool_yn: true, section: 'Audio backends')
4333
Thomas Huthc3527c52023-06-02 19:18:31 +02004334# Network backends
Thomas Huth9e48afa2023-06-02 19:18:30 +02004335summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004336if host_os == 'darwin'
Thomas Huth9e48afa2023-06-02 19:18:30 +02004337 summary_info += {'vmnet.framework support': vmnet}
4338endif
Ilya Maximetscb039ef2023-09-13 20:34:37 +02004339summary_info += {'AF_XDP support': libxdp}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004340summary_info += {'slirp support': slirp}
Paolo Bonzinie1723992021-10-07 15:08:21 +02004341summary_info += {'vde support': vde}
Paolo Bonzini837b84b2021-10-07 15:08:22 +02004342summary_info += {'netmap support': have_netmap}
Thomas Hutheea94532021-10-28 20:59:08 +02004343summary_info += {'l2tpv3 support': have_l2tpv3}
Thomas Huthc3527c52023-06-02 19:18:31 +02004344summary(summary_info, bool_yn: true, section: 'Network backends')
4345
4346# Libraries
4347summary_info = {}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004348summary_info += {'libtasn1': tasn1}
4349summary_info += {'PAM': pam}
4350summary_info += {'iconv support': iconv}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004351summary_info += {'blkio support': blkio}
4352summary_info += {'curl support': curl}
4353summary_info += {'Multipath support': mpathpersist}
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02004354summary_info += {'Linux AIO support': libaio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004355summary_info += {'Linux io_uring support': linux_io_uring}
4356summary_info += {'ATTR/XATTR support': libattr}
Paolo Bonzini3730a732022-04-20 17:33:41 +02004357summary_info += {'RDMA support': rdma}
4358summary_info += {'PVRDMA support': have_pvrdma}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02004359summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004360summary_info += {'libcap-ng support': libcap_ng}
4361summary_info += {'bpf support': libbpf}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004362summary_info += {'rbd support': rbd}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004363summary_info += {'smartcard support': cacard}
4364summary_info += {'U2F support': u2f}
4365summary_info += {'libusb': libusb}
4366summary_info += {'usb net redir': usbredir}
Paolo Bonzini88b6e612022-04-20 17:33:40 +02004367summary_info += {'OpenGL support (epoxy)': opengl}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004368summary_info += {'GBM': gbm}
4369summary_info += {'libiscsi support': libiscsi}
4370summary_info += {'libnfs support': libnfs}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004371if host_os == 'windows'
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004372 if have_ga
Marc-André Lureau8821a382022-02-01 16:53:43 +04004373 summary_info += {'QGA VSS support': have_qga_vss}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01004374 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01004375endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004376summary_info += {'seccomp support': seccomp}
4377summary_info += {'GlusterFS support': glusterfs}
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02004378summary_info += {'hv-balloon support': hv_balloon}
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01004379summary_info += {'TPM support': have_tpm}
Thomas Huthe6a52b32021-12-09 15:48:01 +01004380summary_info += {'libssh support': libssh}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004381summary_info += {'lzo support': lzo}
4382summary_info += {'snappy support': snappy}
4383summary_info += {'bzip2 support': libbzip2}
4384summary_info += {'lzfse support': liblzfse}
4385summary_info += {'zstd support': zstd}
Paolo Bonzini488a8c72021-12-21 12:38:27 +01004386summary_info += {'NUMA host support': numa}
Thomas Huth83602082022-05-16 16:58:23 +02004387summary_info += {'capstone': capstone}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004388summary_info += {'libpmem support': libpmem}
4389summary_info += {'libdaxctl support': libdaxctl}
4390summary_info += {'libudev': libudev}
4391# Dummy dependency, keep .found()
Max Reitzdf4ea702020-10-27 20:05:46 +01004392summary_info += {'FUSE lseek': fuse_lseek.found()}
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004393summary_info += {'selinux': selinux}
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01004394summary_info += {'libdw': libdw}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01004395summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004396
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004397if host_arch == 'unknown'
Paolo Bonzinif9332752020-02-03 13:28:38 +01004398 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004399 warning('UNSUPPORTED HOST CPU')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004400 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004401 message('Support for CPU host architecture ' + cpu + ' is not currently')
4402 message('maintained. The QEMU project does not guarantee that QEMU will')
4403 message('compile or work on this host CPU. You can help by volunteering')
4404 message('to maintain it and providing a build host for our continuous')
4405 message('integration setup.')
4406 if get_option('tcg').allowed() and target_dirs.length() > 0
4407 message()
4408 message('configure has succeeded and you can continue to build, but')
4409 message('QEMU will use a slow interpreter to emulate the target CPU.')
4410 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01004411endif
4412
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004413if not supported_oses.contains(host_os)
Paolo Bonzinif9332752020-02-03 13:28:38 +01004414 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004415 warning('UNSUPPORTED HOST OS')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004416 message()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004417 message('Support for host OS ' + host_os + 'is not currently maintained.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004418 message('configure has succeeded and you can continue to build, but')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004419 message('the QEMU project does not guarantee that QEMU will compile or')
4420 message('work on this operating system. You can help by volunteering')
4421 message('to maintain it and providing a build host for our continuous')
4422 message('integration setup. This will ensure that future versions of QEMU')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004423 message('will keep working on ' + host_os + '.')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004424endif
4425
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004426if host_arch == 'unknown' or not supported_oses.contains(host_os)
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004427 message()
4428 message('If you want to help supporting QEMU on this platform, please')
4429 message('contact the developers at qemu-devel@nongnu.org.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004430endif
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004431
4432actually_reloc = get_option('relocatable')
4433# check if get_relocated_path() is actually able to relocate paths
4434if get_option('relocatable') and \
4435 not (get_option('prefix') / get_option('bindir')).startswith(get_option('prefix') / '')
4436 message()
4437 warning('bindir not included within prefix, the installation will not be relocatable.')
4438 actually_reloc = false
4439endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004440if not actually_reloc and (host_os == 'windows' or get_option('relocatable'))
4441 if host_os == 'windows'
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004442 message()
4443 warning('Windows installs should usually be relocatable.')
4444 endif
4445 message()
4446 message('QEMU will have to be installed under ' + get_option('prefix') + '.')
4447 message('Use --disable-relocatable to remove this warning.')
4448endif