blob: 3a1ad4ddeb4006dfc5cabea2628a1c28f1f08eca [file] [log] [blame]
Akihiko Odaki414b1802024-05-24 17:00:22 +09001project('qemu', ['c'], meson_version: '>=1.1.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 \
Peter Maydell2ef938a2024-03-11 13:33:34 +000069 add_languages('objc', required: true, native: false)
Paolo Bonzini44458a62023-09-08 12:06:57 +020070 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 Bonzinief7d1ad2024-06-18 17:32:52 +0200339# Pick x86-64 baseline version
Paolo Bonzini294ac642024-05-31 10:37:06 +0200340if host_arch in ['i386', 'x86_64']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200341 if get_option('x86_version') == '0' and host_arch == 'x86_64'
342 error('x86_64-v1 required for x86-64 hosts')
343 endif
344
345 # add flags for individual instruction set extensions
346 if get_option('x86_version') >= '1'
347 if host_arch == 'i386'
348 qemu_common_flags = ['-mfpmath=sse'] + qemu_common_flags
349 else
350 # present on basically all processors but technically not part of
351 # x86-64-v1, so only include -mneeded for x86-64 version 2 and above
352 qemu_common_flags = ['-mcx16'] + qemu_common_flags
353 endif
354 endif
355 if get_option('x86_version') >= '2'
356 qemu_common_flags = ['-mpopcnt'] + qemu_common_flags
357 qemu_common_flags = cc.get_supported_arguments('-mneeded') + qemu_common_flags
358 endif
359 if get_option('x86_version') >= '3'
360 qemu_common_flags = ['-mmovbe', '-mabm', '-mbmi1', '-mbmi2', '-mfma', '-mf16c'] + qemu_common_flags
361 endif
362
363 # add required vector instruction set (each level implies those below)
364 if get_option('x86_version') == '1'
365 qemu_common_flags = ['-msse2'] + qemu_common_flags
366 elif get_option('x86_version') == '2'
367 qemu_common_flags = ['-msse4.2'] + qemu_common_flags
368 elif get_option('x86_version') == '3'
369 qemu_common_flags = ['-mavx2'] + qemu_common_flags
370 elif get_option('x86_version') == '4'
371 qemu_common_flags = ['-mavx512f', '-mavx512bw', '-mavx512cd', '-mavx512dq', '-mavx512vl'] + qemu_common_flags
372 endif
Artyom Kunakovskyc2bf2cc2024-05-23 08:11:18 +0300373endif
374
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +0200375if get_option('prefer_static')
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100376 qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
377endif
378
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200379# Meson currently only handles pie as a boolean for now, so if the user
380# has explicitly disabled PIE we need to extend our cflags.
Paolo Bonzinib03fcd62023-05-22 10:05:33 +0200381#
382# -no-pie is supposedly a linker flag that has no effect on the compiler
383# command line, but some distros, that didn't quite know what they were
384# doing, made local changes to gcc's specs file that turned it into
385# a compiler command-line flag.
386#
387# What about linker flags? For a static build, no PIE is implied by -static
388# which we added above (and if it's not because of the same specs patching,
389# there's nothing we can do: compilation will fail, report a bug to your
390# distro and do not use --disable-pie in the meanwhile). For dynamic linking,
391# instead, we can't add -no-pie because it overrides -shared: the linker then
392# tries to build an executable instead of a shared library and fails. So
393# don't add -no-pie anywhere and cross fingers. :(
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200394if not get_option('b_pie')
Paolo Bonzinib03fcd62023-05-22 10:05:33 +0200395 qemu_common_flags += cc.get_supported_arguments('-fno-pie', '-no-pie')
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200396endif
397
Paolo Bonzini911d4ca2022-10-12 12:46:23 +0200398if not get_option('stack_protector').disabled()
399 stack_protector_probe = '''
400 int main(int argc, char *argv[])
401 {
402 char arr[64], *p = arr, *c = argv[argc - 1];
403 while (*c) {
404 *p++ = *c++;
405 }
406 return 0;
407 }'''
408 have_stack_protector = false
409 foreach arg : ['-fstack-protector-strong', '-fstack-protector-all']
410 # We need to check both a compile and a link, since some compiler
411 # setups fail only on a .c->.o compile and some only at link time
412 if cc.compiles(stack_protector_probe, args: ['-Werror', arg]) and \
413 cc.links(stack_protector_probe, args: ['-Werror', arg])
414 have_stack_protector = true
415 qemu_cflags += arg
416 qemu_ldflags += arg
417 break
418 endif
419 endforeach
420 get_option('stack_protector') \
421 .require(have_stack_protector, error_message: 'Stack protector not supported')
422endif
423
Paolo Bonzini67398252022-10-12 13:19:35 +0200424coroutine_backend = get_option('coroutine_backend')
425ucontext_probe = '''
426 #include <ucontext.h>
427 #ifdef __stub_makecontext
428 #error Ignoring glibc stub makecontext which will always fail
429 #endif
430 int main(void) { makecontext(0, 0, 0); return 0; }'''
431
432# On Windows the only valid backend is the Windows specific one.
433# For POSIX prefer ucontext, but it's not always possible. The fallback
434# is sigcontext.
435supported_backends = []
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100436if host_os == 'windows'
Paolo Bonzini67398252022-10-12 13:19:35 +0200437 supported_backends += ['windows']
438else
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100439 if host_os != 'darwin' and cc.links(ucontext_probe)
Paolo Bonzini67398252022-10-12 13:19:35 +0200440 supported_backends += ['ucontext']
441 endif
442 supported_backends += ['sigaltstack']
443endif
444
445if coroutine_backend == 'auto'
446 coroutine_backend = supported_backends[0]
447elif coroutine_backend not in supported_backends
448 error('"@0@" backend requested but not available. Available backends: @1@' \
449 .format(coroutine_backend, ', '.join(supported_backends)))
450endif
451
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200452# Compiles if SafeStack *not* enabled
453safe_stack_probe = '''
454 int main(void)
455 {
456 #if defined(__has_feature)
457 #if __has_feature(safe_stack)
458 #error SafeStack Enabled
459 #endif
460 #endif
461 return 0;
462 }'''
463if get_option('safe_stack') != not cc.compiles(safe_stack_probe)
464 safe_stack_arg = get_option('safe_stack') ? '-fsanitize=safe-stack' : '-fno-sanitize=safe-stack'
465 if get_option('safe_stack') != not cc.compiles(safe_stack_probe, args: safe_stack_arg)
466 error(get_option('safe_stack') \
467 ? 'SafeStack not supported by your compiler' \
468 : 'Cannot disable SafeStack')
469 endif
470 qemu_cflags += safe_stack_arg
471 qemu_ldflags += safe_stack_arg
472endif
Paolo Bonzini67398252022-10-12 13:19:35 +0200473if get_option('safe_stack') and coroutine_backend != 'ucontext'
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200474 error('SafeStack is only supported with the ucontext coroutine backend')
475endif
476
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100477if get_option('sanitizers')
478 if cc.has_argument('-fsanitize=address')
479 qemu_cflags = ['-fsanitize=address'] + qemu_cflags
480 qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags
481 endif
482
483 # Detect static linking issue with ubsan - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
484 if cc.links('int main(int argc, char **argv) { return argc + 1; }',
485 args: [qemu_ldflags, '-fsanitize=undefined'])
486 qemu_cflags = ['-fsanitize=undefined'] + qemu_cflags
487 qemu_ldflags = ['-fsanitize=undefined'] + qemu_ldflags
488 endif
489endif
490
491# Thread sanitizer is, for now, much noisier than the other sanitizers;
492# keep it separate until that is not the case.
493if get_option('tsan')
494 if get_option('sanitizers')
495 error('TSAN is not supported with other sanitizers')
496 endif
497 if not cc.has_function('__tsan_create_fiber',
498 args: '-fsanitize=thread',
499 prefix: '#include <sanitizer/tsan_interface.h>')
500 error('Cannot enable TSAN due to missing fiber annotation interface')
501 endif
502 qemu_cflags = ['-fsanitize=thread'] + qemu_cflags
503 qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags
504endif
505
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100506# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
507# The combination is known as "full relro", because .got.plt is read-only too.
508qemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
509
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100510if host_os == 'windows'
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200511 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat')
Paolo Bonzini2d73fa72022-11-02 13:03:51 +0100512 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200513endif
514
Paolo Bonzini537b7242021-10-07 15:08:12 +0200515if get_option('fuzzing')
Paolo Bonzini537b7242021-10-07 15:08:12 +0200516 # Specify a filter to only instrument code that is directly related to
517 # virtual-devices.
518 configure_file(output: 'instrumentation-filter',
519 input: 'scripts/oss-fuzz/instrumentation-filter-template',
520 copy: true)
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400521
522 if cc.compiles('int main () { return 0; }',
523 name: '-fsanitize-coverage-allowlist=/dev/null',
Alexander Bulekove56d0972022-06-21 16:45:07 -0400524 args: ['-fsanitize-coverage-allowlist=/dev/null',
525 '-fsanitize-coverage=trace-pc'] )
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200526 qemu_common_flags += ['-fsanitize-coverage-allowlist=instrumentation-filter']
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400527 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +0200528
529 if get_option('fuzzing_engine') == ''
530 # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
531 # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link
532 # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
533 # unable to bind the fuzzer-related callbacks added by instrumentation.
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200534 qemu_common_flags += ['-fsanitize=fuzzer-no-link']
535 qemu_ldflags += ['-fsanitize=fuzzer-no-link']
Paolo Bonzini537b7242021-10-07 15:08:12 +0200536 # For the actual fuzzer binaries, we need to link against the libfuzzer
537 # library. They need to be configurable, to support OSS-Fuzz
538 fuzz_exe_ldflags = ['-fsanitize=fuzzer']
539 else
540 # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
541 # the needed CFLAGS have already been provided
542 fuzz_exe_ldflags = get_option('fuzzing_engine').split()
543 endif
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400544endif
545
Paolo Bonzini82761292023-05-10 14:54:30 +0200546if get_option('cfi')
547 cfi_flags=[]
548 # Check for dependency on LTO
549 if not get_option('b_lto')
550 error('Selected Control-Flow Integrity but LTO is disabled')
551 endif
552 if enable_modules
553 error('Selected Control-Flow Integrity is not compatible with modules')
554 endif
555 # Check for cfi flags. CFI requires LTO so we can't use
556 # get_supported_arguments, but need a more complex "compiles" which allows
557 # custom arguments
558 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
559 args: ['-flto', '-fsanitize=cfi-icall'] )
560 cfi_flags += '-fsanitize=cfi-icall'
561 else
562 error('-fsanitize=cfi-icall is not supported by the compiler')
563 endif
564 if cc.compiles('int main () { return 0; }',
565 name: '-fsanitize-cfi-icall-generalize-pointers',
566 args: ['-flto', '-fsanitize=cfi-icall',
567 '-fsanitize-cfi-icall-generalize-pointers'] )
568 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
569 else
570 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
571 endif
572 if get_option('cfi_debug')
573 if cc.compiles('int main () { return 0; }',
574 name: '-fno-sanitize-trap=cfi-icall',
575 args: ['-flto', '-fsanitize=cfi-icall',
576 '-fno-sanitize-trap=cfi-icall'] )
577 cfi_flags += '-fno-sanitize-trap=cfi-icall'
578 else
579 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
580 endif
581 endif
582 add_global_arguments(cfi_flags, native: false, language: all_languages)
583 add_global_link_arguments(cfi_flags, native: false, language: all_languages)
584endif
585
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000586# Check further flags that make QEMU more robust against malicious parties
587
588hardening_flags = [
Daniel P. Berrangé7ff9ff032024-01-03 12:34:14 +0000589 # Initialize all stack variables to zero. This makes
590 # it harder to take advantage of uninitialized stack
591 # data to drive exploits
592 '-ftrivial-auto-var-init=zero',
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000593]
594
Daniel P. Berrangé95633112024-03-04 14:44:55 +0000595# Zero out registers used during a function call
596# upon its return. This makes it harder to assemble
597# ROP gadgets into something usable
598#
599# NB: Clang 17 is broken and SEGVs
600# https://github.com/llvm/llvm-project/issues/75168
Thomas Huth2d6d9952024-04-11 14:08:19 +0200601#
602# NB2: This clashes with the "retguard" extension of OpenBSD's Clang
603# https://gitlab.com/qemu-project/qemu/-/issues/2278
604if host_os != 'openbsd' and \
605 cc.compiles('extern struct { void (*cb)(void); } s; void f(void) { s.cb(); }',
Daniel P. Berrangé95633112024-03-04 14:44:55 +0000606 name: '-fzero-call-used-regs=used-gpr',
607 args: ['-O2', '-fzero-call-used-regs=used-gpr'])
608 hardening_flags += '-fzero-call-used-regs=used-gpr'
609endif
610
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000611qemu_common_flags += cc.get_supported_arguments(hardening_flags)
612
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200613add_global_arguments(qemu_common_flags, native: false, language: all_languages)
614add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
615
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100616# Collect warning flags we want to set, sorted alphabetically
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100617warn_flags = [
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100618 # First enable interesting warnings
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100619 '-Wempty-body',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100620 '-Wendif-labels',
621 '-Wexpansion-to-defined',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100622 '-Wformat-security',
623 '-Wformat-y2k',
624 '-Wignored-qualifiers',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100625 '-Wimplicit-fallthrough=2',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100626 '-Winit-self',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100627 '-Wmissing-format-attribute',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100628 '-Wmissing-prototypes',
629 '-Wnested-externs',
630 '-Wold-style-declaration',
631 '-Wold-style-definition',
632 '-Wredundant-decls',
633 '-Wshadow=local',
634 '-Wstrict-prototypes',
635 '-Wtype-limits',
636 '-Wundef',
Peter Maydell64c1a542024-02-21 17:26:36 +0100637 '-Wvla',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100638 '-Wwrite-strings',
639
640 # Then disable some undesirable warnings
641 '-Wno-gnu-variable-sized-type-not-at-end',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100642 '-Wno-initializer-overrides',
643 '-Wno-missing-include-dirs',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100644 '-Wno-psabi',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100645 '-Wno-shift-negative-value',
646 '-Wno-string-plus-int',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100647 '-Wno-tautological-type-limit-compare',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100648 '-Wno-typedef-redefinition',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100649]
650
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100651if host_os != 'darwin'
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100652 warn_flags += ['-Wthread-safety']
653endif
654
Thomas Huth785abf02023-07-06 08:47:36 +0200655# Set up C++ compiler flags
Paolo Bonzinib4854582021-11-08 12:31:52 +0100656qemu_cxxflags = []
Paolo Bonzinie5134022022-10-12 14:15:06 +0200657if 'cpp' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100658 qemu_cxxflags = ['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'] + qemu_cflags
Paolo Bonzinib4854582021-11-08 12:31:52 +0100659endif
660
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200661add_project_arguments(qemu_cflags, native: false, language: 'c')
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100662add_project_arguments(cc.get_supported_arguments(warn_flags), native: false, language: 'c')
663if 'cpp' in all_languages
664 add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
665 add_project_arguments(cxx.get_supported_arguments(warn_flags), native: false, language: 'cpp')
666endif
667if 'objc' in all_languages
668 # Note sanitizer flags are not applied to Objective-C sources!
669 add_project_arguments(objc.get_supported_arguments(warn_flags), native: false, language: 'objc')
670endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100671if host_os == 'linux'
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400672 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
673 '-isystem', 'linux-headers',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200674 language: all_languages)
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400675endif
676
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100677add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400678 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400679 '-iquote', meson.current_source_dir() / 'include',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200680 language: all_languages)
Paolo Bonzinia5665052019-06-10 12:05:14 +0200681
Richard Henderson44fc7162023-05-17 17:48:34 -0700682# If a host-specific include directory exists, list that first...
683host_include = meson.current_source_dir() / 'host/include/'
684if fs.is_dir(host_include / host_arch)
685 add_project_arguments('-iquote', host_include / host_arch,
686 language: all_languages)
687endif
688# ... followed by the generic fallback.
689add_project_arguments('-iquote', host_include / 'generic',
690 language: all_languages)
691
Paolo Bonzinideb62372020-09-01 07:51:16 -0400692sparse = find_program('cgcc', required: get_option('sparse'))
693if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100694 run_target('sparse',
695 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400696 'compile_commands.json', sparse.full_path(), '-Wbitwise',
697 '-Wno-transparent-union', '-Wno-old-initializer',
698 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100699endif
700
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200701#####################################
702# Host-specific libraries and flags #
703#####################################
704
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200705libm = cc.find_library('m', required: false)
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +0200706threads = dependency('threads')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400707util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200708winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400709socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400710version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400711coref = []
712iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400713emulator_link_args = []
Marc-André Lureau23011f42022-02-01 12:55:21 +0400714midl = not_found
715widl = not_found
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900716pathcch = not_found
Paolo Bonzinia6305082021-10-07 15:08:15 +0200717host_dsosuf = '.so'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100718if host_os == 'windows'
Marc-André Lureau23011f42022-02-01 12:55:21 +0400719 midl = find_program('midl', required: false)
720 widl = find_program('widl', required: false)
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900721 pathcch = cc.find_library('pathcch')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400722 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200723 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400724
725 win = import('windows')
726 version_res = win.compile_resources('version.rc',
727 depend_files: files('pc-bios/qemu-nsis.ico'),
728 include_directories: include_directories('.'))
Paolo Bonzinia6305082021-10-07 15:08:15 +0200729 host_dsosuf = '.dll'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100730elif host_os == 'darwin'
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400731 coref = dependency('appleframeworks', modules: 'CoreFoundation')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700732 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
Paolo Bonzinia6305082021-10-07 15:08:15 +0200733 host_dsosuf = '.dylib'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100734elif host_os == 'sunos'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200735 socket = [cc.find_library('socket'),
736 cc.find_library('nsl'),
737 cc.find_library('resolv')]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100738elif host_os == 'haiku'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200739 socket = [cc.find_library('posix_error_mapper'),
740 cc.find_library('network'),
741 cc.find_library('bsd')]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100742elif host_os == 'openbsd'
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100743 if get_option('tcg').allowed() and target_dirs.length() > 0
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400744 # Disable OpenBSD W^X if available
745 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
746 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400747endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200748
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200749###############################################
750# Host-specific configuration of accelerators #
751###############################################
752
Paolo Bonzini8a199802020-09-18 05:37:01 -0400753accelerators = []
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100754if get_option('kvm').allowed() and host_os == 'linux'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400755 accelerators += 'CONFIG_KVM'
756endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100757if get_option('whpx').allowed() and host_os == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000758 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400759 error('WHPX requires 64-bit host')
Philippe Mathieu-Daudé641b8412023-06-24 15:31:44 +0200760 elif cc.has_header('winhvplatform.h', required: get_option('whpx')) and \
761 cc.has_header('winhvemulation.h', required: get_option('whpx'))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400762 accelerators += 'CONFIG_WHPX'
763 endif
764endif
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200765
766hvf = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100767if get_option('hvf').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400768 hvf = dependency('appleframeworks', modules: 'Hypervisor',
769 required: get_option('hvf'))
770 if hvf.found()
771 accelerators += 'CONFIG_HVF'
772 endif
773endif
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200774
775nvmm = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100776if host_os == 'netbsd'
nia0cc49652021-10-13 13:54:17 +0000777 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200778 if nvmm.found()
779 accelerators += 'CONFIG_NVMM'
780 endif
781endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100782
Paolo Bonzini823eb012021-11-08 14:18:17 +0100783tcg_arch = host_arch
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100784if get_option('tcg').allowed()
Paolo Bonzini823eb012021-11-08 14:18:17 +0100785 if host_arch == 'unknown'
Paolo Bonzinia24f15d2023-08-04 11:29:05 +0200786 if not get_option('tcg_interpreter')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400787 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
788 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100789 elif get_option('tcg_interpreter')
Philippe Mathieu-Daudé1c282da2021-05-21 12:34:23 +0200790 warning('Use of the TCG interpreter is not recommended on this host')
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100791 warning('architecture. There is a native TCG execution backend available')
792 warning('which provides substantially better performance and reliability.')
793 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
794 warning('configuration option on this architecture to use the native')
795 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400796 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100797 if get_option('tcg_interpreter')
798 tcg_arch = 'tci'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100799 elif host_arch == 'x86_64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100800 tcg_arch = 'i386'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100801 elif host_arch == 'ppc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100802 tcg_arch = 'ppc'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100803 endif
804 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzinie5134022022-10-12 14:15:06 +0200805 language: all_languages)
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100806
Paolo Bonzini8a199802020-09-18 05:37:01 -0400807 accelerators += 'CONFIG_TCG'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400808endif
809
810if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
811 error('KVM not available on this platform')
812endif
813if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
814 error('HVF not available on this platform')
815endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200816if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
817 error('NVMM not available on this platform')
818endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400819if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
820 error('WHPX not available on this platform')
821endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400822
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200823xen = not_found
824if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
825 xencontrol = dependency('xencontrol', required: false,
826 method: 'pkg-config')
827 if xencontrol.found()
828 xen_pc = declare_dependency(version: xencontrol.version(),
829 dependencies: [
830 xencontrol,
831 # disabler: true makes xen_pc.found() return false if any is not found
832 dependency('xenstore', required: false,
833 method: 'pkg-config',
834 disabler: true),
835 dependency('xenforeignmemory', required: false,
836 method: 'pkg-config',
837 disabler: true),
838 dependency('xengnttab', required: false,
839 method: 'pkg-config',
840 disabler: true),
841 dependency('xenevtchn', required: false,
842 method: 'pkg-config',
843 disabler: true),
844 dependency('xendevicemodel', required: false,
845 method: 'pkg-config',
846 disabler: true),
847 # optional, no "disabler: true"
848 dependency('xentoolcore', required: false,
849 method: 'pkg-config')])
850 if xen_pc.found()
851 xen = xen_pc
852 endif
853 endif
854 if not xen.found()
855 xen_tests = [ '4.11.0', '4.10.0', '4.9.0', '4.8.0', '4.7.1' ]
856 xen_libs = {
857 '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
858 '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
859 '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
860 '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
861 '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
862 }
863 xen_deps = {}
864 foreach ver: xen_tests
865 # cache the various library tests to avoid polluting the logs
866 xen_test_deps = []
867 foreach l: xen_libs[ver]
868 if l not in xen_deps
869 xen_deps += { l: cc.find_library(l, required: false) }
870 endif
871 xen_test_deps += xen_deps[l]
872 endforeach
873
874 # Use -D to pick just one of the test programs in scripts/xen-detect.c
875 xen_version = ver.split('.')
876 xen_ctrl_version = xen_version[0] + \
877 ('0' + xen_version[1]).substring(-2) + \
878 ('0' + xen_version[2]).substring(-2)
879 if cc.links(files('scripts/xen-detect.c'),
880 args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
881 dependencies: xen_test_deps)
882 xen = declare_dependency(version: ver, dependencies: xen_test_deps)
883 break
884 endif
885 endforeach
886 endif
887 if xen.found()
888 accelerators += 'CONFIG_XEN'
889 elif get_option('xen').enabled()
890 error('could not compile and link Xen test program')
891 endif
892endif
893have_xen_pci_passthrough = get_option('xen_pci_passthrough') \
894 .require(xen.found(),
895 error_message: 'Xen PCI passthrough requested but Xen not enabled') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100896 .require(host_os == 'linux',
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200897 error_message: 'Xen PCI passthrough not available on this platform') \
898 .require(cpu == 'x86' or cpu == 'x86_64',
899 error_message: 'Xen PCI passthrough not available on this platform') \
900 .allowed()
901
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200902################
903# Dependencies #
904################
905
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200906# When bumping glib minimum version, please check also whether to increase
907# the _WIN32_WINNT setting in osdep.h according to the value from glib
Thomas Huth0d8caac2024-04-18 12:10:50 +0200908glib_req_ver = '>=2.66.0'
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200909glib_pc = dependency('glib-2.0', version: glib_req_ver, required: true,
910 method: 'pkg-config')
911glib_cflags = []
Paolo Bonzini60027112022-10-20 14:53:10 +0200912if enable_modules
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200913 gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true,
914 method: 'pkg-config')
Paolo Bonzini2c13c572023-08-30 12:20:53 +0200915elif get_option('plugins')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200916 gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true,
917 method: 'pkg-config')
918else
919 gmodule = not_found
Emilio Cotae3feb2c2023-02-05 11:37:57 -0500920endif
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400921
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200922# This workaround is required due to a bug in pkg-config file for glib as it
923# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100924if host_os == 'windows' and get_option('prefer_static')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200925 glib_cflags += ['-DGLIB_STATIC_COMPILATION']
926endif
927
928# Sanity check that the current size_t matches the
929# size that glib thinks it should be. This catches
930# problems on multi-arch where people try to build
931# 32-bit QEMU while pointing at 64-bit glib headers
932
933if not cc.compiles('''
934 #include <glib.h>
935 #include <unistd.h>
936
937 #define QEMU_BUILD_BUG_ON(x) \
938 typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
939
940 int main(void) {
941 QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
942 return 0;
943 }''', dependencies: glib_pc, args: glib_cflags)
944 error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T.
945 You probably need to set PKG_CONFIG_LIBDIR" to point
946 to the right pkg-config files for your build target.''')
947endif
948
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200949glib = declare_dependency(dependencies: [glib_pc, gmodule],
950 compile_args: glib_cflags,
951 version: glib_pc.version())
952
953# Check whether glib has gslice, which we have to avoid for correctness.
954# TODO: remove this check and the corresponding workaround (qtree) when
955# the minimum supported glib is >= 2.75.3
956glib_has_gslice = glib.version().version_compare('<2.75.3')
957
958# override glib dep to include the above refinements
959meson.override_dependency('glib-2.0', glib)
960
961# The path to glib.h is added to all compilation commands.
962add_project_dependencies(glib.partial_dependency(compile_args: true, includes: true),
963 native: false, language: all_languages)
964
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400965gio = not_found
Paolo Bonzini75440602022-04-20 17:33:44 +0200966gdbus_codegen = not_found
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +0200967gdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
Paolo Bonzini75440602022-04-20 17:33:44 +0200968if not get_option('gio').auto() or have_system
969 gio = dependency('gio-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200970 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +0200971 if gio.found() and not cc.links('''
972 #include <gio/gio.h>
973 int main(void)
974 {
975 g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
976 return 0;
977 }''', dependencies: [glib, gio])
978 if get_option('gio').enabled()
979 error('The installed libgio is broken for static linking')
980 endif
981 gio = not_found
982 endif
983 if gio.found()
984 gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'),
985 required: get_option('gio'))
986 gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200987 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +0200988 gio = declare_dependency(dependencies: [gio, gio_unix],
989 version: gio.version())
990 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400991endif
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +0200992if gdbus_codegen.found() and get_option('cfi')
993 gdbus_codegen = not_found
994 gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity'
995endif
Paolo Bonzini75440602022-04-20 17:33:44 +0200996
Marc-André Lureau6cc5a612023-06-06 15:56:42 +0400997xml_pp = find_program('scripts/xml-preprocess.py')
998
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400999lttng = not_found
Paolo Bonzini9c29b742021-10-07 15:08:14 +02001000if 'ust' in get_option('trace_backends')
Marc-André Lureaue32aaa52022-03-28 12:47:13 +04001001 lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001002 method: 'pkg-config')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001003endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001004pixman = not_found
Marc-André Lureaucca15752023-08-30 13:38:25 +04001005if not get_option('pixman').auto() or have_system or have_tools
1006 pixman = dependency('pixman-1', required: get_option('pixman'), version:'>=0.21.8',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001007 method: 'pkg-config')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001008endif
Marc-André Lureaucca15752023-08-30 13:38:25 +04001009
Paolo Bonzini063d5112022-07-14 14:56:58 +02001010zlib = dependency('zlib', required: true)
Paolo Bonzini53c22b62021-06-03 11:31:35 +02001011
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001012libaio = not_found
1013if not get_option('linux_aio').auto() or have_block
1014 libaio = cc.find_library('aio', has_headers: ['libaio.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001015 required: get_option('linux_aio'))
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001016endif
Leonardo Bras354081d2022-05-13 03:28:30 -03001017
1018linux_io_uring_test = '''
1019 #include <liburing.h>
1020 #include <linux/errqueue.h>
1021
1022 int main(void) { return 0; }'''
1023
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001024linux_io_uring = not_found
Paolo Bonzini53c22b62021-06-03 11:31:35 +02001025if not get_option('linux_io_uring').auto() or have_block
Daniel P. Berrangéa41b4fd2022-01-05 13:49:38 +00001026 linux_io_uring = dependency('liburing', version: '>=0.3',
1027 required: get_option('linux_io_uring'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001028 method: 'pkg-config')
Leonardo Bras354081d2022-05-13 03:28:30 -03001029 if not cc.links(linux_io_uring_test)
1030 linux_io_uring = not_found
1031 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001032endif
Leonardo Bras354081d2022-05-13 03:28:30 -03001033
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001034libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +01001035if not get_option('libnfs').auto() or have_block
1036 libnfs = dependency('libnfs', version: '>=1.9.3',
1037 required: get_option('libnfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001038 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001039endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001040
1041libattr_test = '''
1042 #include <stddef.h>
1043 #include <sys/types.h>
1044 #ifdef CONFIG_LIBATTR
1045 #include <attr/xattr.h>
1046 #else
1047 #include <sys/xattr.h>
1048 #endif
1049 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
1050
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001051libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001052have_old_libattr = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001053if get_option('attr').allowed()
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001054 if cc.links(libattr_test)
1055 libattr = declare_dependency()
1056 else
1057 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001058 required: get_option('attr'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001059 if libattr.found() and not \
1060 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
1061 libattr = not_found
1062 if get_option('attr').enabled()
1063 error('could not link libattr')
1064 else
1065 warning('could not link libattr, disabling')
1066 endif
1067 else
1068 have_old_libattr = libattr.found()
1069 endif
1070 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001071endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001072
Akihiko Odaki52eaefd2022-07-02 23:25:19 +09001073cocoa = dependency('appleframeworks', modules: ['Cocoa', 'CoreVideo'],
1074 required: get_option('cocoa'))
Paolo Bonzinic1ec4942021-01-07 14:04:00 +01001075
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03001076vmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet'))
1077if vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h',
1078 'VMNET_BRIDGED_MODE',
1079 dependencies: vmnet)
1080 vmnet = not_found
1081 if get_option('vmnet').enabled()
1082 error('vmnet.framework API is outdated')
1083 else
1084 warning('vmnet.framework API is outdated, disabling')
1085 endif
1086endif
1087
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001088seccomp = not_found
Michal Privoznik73422d92022-10-26 09:30:24 +02001089seccomp_has_sysrawrc = false
Paolo Bonzini90835c22020-11-17 14:22:24 +01001090if not get_option('seccomp').auto() or have_system or have_tools
1091 seccomp = dependency('libseccomp', version: '>=2.3.0',
1092 required: get_option('seccomp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001093 method: 'pkg-config')
Michal Privoznik73422d92022-10-26 09:30:24 +02001094 if seccomp.found()
1095 seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h',
1096 'SCMP_FLTATR_API_SYSRAWRC',
1097 dependencies: seccomp)
1098 endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001099endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001100
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001101libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001102if not get_option('cap_ng').auto() or have_system or have_tools
1103 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001104 required: get_option('cap_ng'))
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001105endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001106if libcap_ng.found() and not cc.links('''
1107 #include <cap-ng.h>
1108 int main(void)
1109 {
1110 capng_capability_to_name(CAPNG_EFFECTIVE);
1111 return 0;
1112 }''', dependencies: libcap_ng)
1113 libcap_ng = not_found
1114 if get_option('cap_ng').enabled()
1115 error('could not link libcap-ng')
1116 else
1117 warning('could not link libcap-ng, disabling')
1118 endif
1119endif
1120
Paolo Bonzini1917ec62020-08-26 03:24:11 -04001121if get_option('xkbcommon').auto() and not have_system and not have_tools
1122 xkbcommon = not_found
1123else
1124 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001125 method: 'pkg-config')
Marc-André Lureauade60d42019-07-15 14:48:31 +04001126endif
Paolo Bonzinie1723992021-10-07 15:08:21 +02001127
Thomas Huth58902582022-04-08 18:20:47 +02001128slirp = not_found
1129if not get_option('slirp').auto() or have_system
1130 slirp = dependency('slirp', required: get_option('slirp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001131 method: 'pkg-config')
Thomas Huth58902582022-04-08 18:20:47 +02001132 # slirp < 4.7 is incompatible with CFI support in QEMU. This is because
1133 # it passes function pointers within libslirp as callbacks for timers.
1134 # When using a system-wide shared libslirp, the type information for the
1135 # callback is missing and the timer call produces a false positive with CFI.
1136 # Do not use the "version" keyword argument to produce a better error.
1137 # with control-flow integrity.
1138 if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7')
1139 if get_option('slirp').enabled()
1140 error('Control-Flow Integrity requires libslirp 4.7.')
1141 else
1142 warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.')
1143 slirp = not_found
1144 endif
1145 endif
1146endif
1147
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001148vde = not_found
Paolo Bonzinie1723992021-10-07 15:08:21 +02001149if not get_option('vde').auto() or have_system or have_tools
1150 vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001151 required: get_option('vde'))
Paolo Bonzinie1723992021-10-07 15:08:21 +02001152endif
1153if vde.found() and not cc.links('''
1154 #include <libvdeplug.h>
1155 int main(void)
1156 {
1157 struct vde_open_args a = {0, 0, 0};
1158 char s[] = "";
1159 vde_open(s, s, &a);
1160 return 0;
1161 }''', dependencies: vde)
1162 vde = not_found
1163 if get_option('cap_ng').enabled()
1164 error('could not link libvdeplug')
1165 else
1166 warning('could not link libvdeplug, disabling')
1167 endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001168endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001169
Paolo Bonzini478e9432020-08-17 12:47:55 +02001170pulse = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001171if not get_option('pa').auto() or (host_os == 'linux' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001172 pulse = dependency('libpulse', required: get_option('pa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001173 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001174endif
1175alsa = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001176if not get_option('alsa').auto() or (host_os == 'linux' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001177 alsa = dependency('alsa', required: get_option('alsa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001178 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001179endif
1180jack = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001181if not get_option('jack').auto() or have_system
1182 jack = dependency('jack', required: get_option('jack'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001183 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001184endif
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001185pipewire = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001186if not get_option('pipewire').auto() or (host_os == 'linux' and have_system)
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001187 pipewire = dependency('libpipewire-0.3', version: '>=0.3.60',
1188 required: get_option('pipewire'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001189 method: 'pkg-config')
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001190endif
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001191sndio = not_found
1192if not get_option('sndio').auto() or have_system
1193 sndio = dependency('sndio', required: get_option('sndio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001194 method: 'pkg-config')
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001195endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001196
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001197spice_protocol = not_found
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001198if not get_option('spice_protocol').auto() or have_system
Markus Armbruster5c167b52023-01-09 20:03:07 +01001199 spice_protocol = dependency('spice-protocol', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001200 required: get_option('spice_protocol'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001201 method: 'pkg-config')
Paolo Bonzini26347332019-07-29 15:40:07 +02001202endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001203spice = not_found
Marc-André Lureauc98791e2023-08-30 13:38:35 +04001204if get_option('spice') \
1205 .disable_auto_if(not have_system) \
1206 .require(pixman.found(),
1207 error_message: 'cannot enable SPICE if pixman is not available') \
1208 .allowed()
Markus Armbruster34d55722023-01-09 20:03:09 +01001209 spice = dependency('spice-server', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001210 required: get_option('spice'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001211 method: 'pkg-config')
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001212endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001213spice_headers = spice.partial_dependency(compile_args: true, includes: true)
1214
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04001215rt = cc.find_library('rt', required: false)
Paolo Bonzinia399f912021-11-15 14:29:13 +00001216
Paolo Bonzini99650b62019-06-10 12:21:14 +02001217libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001218if not get_option('libiscsi').auto() or have_block
1219 libiscsi = dependency('libiscsi', version: '>=1.9.0',
1220 required: get_option('libiscsi'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001221 method: 'pkg-config')
Paolo Bonzini99650b62019-06-10 12:21:14 +02001222endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001223zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +01001224if not get_option('zstd').auto() or have_block
1225 zstd = dependency('libzstd', version: '>=1.4.0',
1226 required: get_option('zstd'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001227 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001228endif
Yuan Liub844a2c2024-06-10 18:21:06 +08001229qpl = not_found
1230if not get_option('qpl').auto() or have_system
1231 qpl = dependency('qpl', version: '>=1.5.0',
1232 required: get_option('qpl'),
1233 method: 'pkg-config')
1234endif
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01001235uadk = not_found
1236if not get_option('uadk').auto() or have_system
1237 libwd = dependency('libwd', version: '>=2.6',
1238 required: get_option('uadk'),
1239 method: 'pkg-config')
1240 libwd_comp = dependency('libwd_comp', version: '>=2.6',
1241 required: get_option('uadk'),
1242 method: 'pkg-config')
1243 if libwd.found() and libwd_comp.found()
1244 uadk = declare_dependency(dependencies: [libwd, libwd_comp])
1245 endif
1246endif
Marc-André Lureauea458962019-07-12 22:23:46 +04001247virgl = not_found
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001248
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001249have_vhost_user_gpu = have_tools and host_os == 'linux' and pixman.found()
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001250if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
Paolo Bonzini587d59d2021-06-03 11:31:35 +02001251 virgl = dependency('virglrenderer',
1252 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001253 required: get_option('virglrenderer'))
Marc-André Lureauea458962019-07-12 22:23:46 +04001254endif
Gurchetan Singhcd9adbe2023-03-21 09:47:36 -07001255rutabaga = not_found
1256if not get_option('rutabaga_gfx').auto() or have_system or have_vhost_user_gpu
1257 rutabaga = dependency('rutabaga_gfx_ffi',
1258 method: 'pkg-config',
1259 required: get_option('rutabaga_gfx'))
1260endif
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001261blkio = not_found
1262if not get_option('blkio').auto() or have_block
1263 blkio = dependency('blkio',
1264 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001265 required: get_option('blkio'))
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001266endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001267curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001268if not get_option('curl').auto() or have_block
1269 curl = dependency('libcurl', version: '>=7.29.0',
1270 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001271 required: get_option('curl'))
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001272endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001273libudev = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001274if host_os == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001275 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +01001276 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001277 required: get_option('libudev'))
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001278endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001279
Paolo Bonzini5c530152020-10-15 06:09:27 -04001280mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001281mpathpersist = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001282if host_os == 'linux' and have_tools and get_option('mpath').allowed()
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001283 mpath_test_source = '''
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001284 #include <libudev.h>
1285 #include <mpath_persist.h>
1286 unsigned mpath_mx_alloc_len = 1024;
1287 int logsink;
1288 static struct config *multipath_conf;
1289 extern struct udev *udev;
1290 extern struct config *get_multipath_config(void);
1291 extern void put_multipath_config(struct config *conf);
1292 struct udev *udev;
1293 struct config *get_multipath_config(void) { return multipath_conf; }
1294 void put_multipath_config(struct config *conf) { }
1295 int main(void) {
1296 udev = udev_new();
1297 multipath_conf = mpath_lib_init();
1298 return 0;
1299 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -04001300 libmpathpersist = cc.find_library('mpathpersist',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001301 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001302 if libmpathpersist.found()
1303 mpathlibs += libmpathpersist
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001304 if get_option('prefer_static')
Paolo Bonzini5c530152020-10-15 06:09:27 -04001305 mpathlibs += cc.find_library('devmapper',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001306 required: get_option('mpath'))
Paolo Bonzini43b43a42020-09-17 12:25:09 +02001307 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -04001308 mpathlibs += cc.find_library('multipath',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001309 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001310 foreach lib: mpathlibs
1311 if not lib.found()
1312 mpathlibs = []
1313 break
1314 endif
1315 endforeach
1316 if mpathlibs.length() == 0
1317 msg = 'Dependencies missing for libmpathpersist'
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001318 elif cc.links(mpath_test_source, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001319 mpathpersist = declare_dependency(dependencies: mpathlibs)
1320 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001321 msg = 'Cannot detect libmpathpersist API'
1322 endif
1323 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001324 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -04001325 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001326 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001327 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001328 endif
1329 endif
1330 endif
1331endif
1332
Yonggang Luo5285e592020-10-13 07:43:48 +08001333iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001334curses = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001335if have_system and get_option('curses').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001336 curses_test = '''
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001337 #if defined(__APPLE__) || defined(__OpenBSD__)
1338 #define _XOPEN_SOURCE_EXTENDED 1
1339 #endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001340 #include <locale.h>
1341 #include <curses.h>
1342 #include <wchar.h>
1343 int main(void) {
1344 wchar_t wch = L'w';
1345 setlocale(LC_ALL, "");
1346 resize_term(0, 0);
1347 addwstr(L"wide chars\n");
1348 addnwstr(&wch, 1);
1349 add_wch(WACS_DEGREE);
1350 return 0;
1351 }'''
1352
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001353 curses_dep_list = host_os == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
Paolo Bonzini6d322632022-03-27 16:05:58 +02001354 curses = dependency(curses_dep_list,
1355 required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001356 method: 'pkg-config')
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001357 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001358 curses_compile_args = ['-DNCURSES_WIDECHAR=1']
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001359 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -05001360 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001361 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses],
1362 version: curses.version())
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001363 else
1364 msg = 'curses package not usable'
1365 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001366 endif
1367 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001368 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001369 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001370 if host_os != 'windows' and not has_curses_h
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001371 message('Trying with /usr/include/ncursesw')
1372 curses_compile_args += ['-I/usr/include/ncursesw']
1373 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
1374 endif
1375 if has_curses_h
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001376 curses_libname_list = (host_os == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001377 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +08001378 libcurses = cc.find_library(curses_libname,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001379 required: false)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001380 if libcurses.found()
1381 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
1382 curses = declare_dependency(compile_args: curses_compile_args,
1383 dependencies: [libcurses])
1384 break
1385 else
1386 msg = 'curses library not usable'
1387 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001388 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001389 endforeach
1390 endif
1391 endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001392 if get_option('iconv').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001393 foreach link_args : [ ['-liconv'], [] ]
1394 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
1395 # We need to use libiconv if available because mixing libiconv's headers with
1396 # the system libc does not work.
1397 # However, without adding glib to the dependencies -L/usr/local/lib will not be
1398 # included in the command line and libiconv will not be found.
1399 if cc.links('''
1400 #include <iconv.h>
1401 int main(void) {
1402 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
1403 return conv != (iconv_t) -1;
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001404 }''', args: link_args, dependencies: glib)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001405 iconv = declare_dependency(link_args: link_args, dependencies: glib)
1406 break
Yonggang Luo5285e592020-10-13 07:43:48 +08001407 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001408 endforeach
1409 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001410 if curses.found() and not iconv.found()
1411 if get_option('iconv').enabled()
1412 error('iconv not available')
1413 endif
1414 msg = 'iconv required for curses UI but not available'
1415 curses = not_found
1416 endif
1417 if not curses.found() and msg != ''
1418 if get_option('curses').enabled()
1419 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001420 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001421 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001422 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001423 endif
1424endif
1425
Paolo Bonzini26347332019-07-29 15:40:07 +02001426brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001427if not get_option('brlapi').auto() or have_system
1428 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001429 required: get_option('brlapi'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001430 if brlapi.found() and not cc.links('''
1431 #include <brlapi.h>
1432 #include <stddef.h>
1433 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
1434 brlapi = not_found
1435 if get_option('brlapi').enabled()
1436 error('could not link brlapi')
1437 else
1438 warning('could not link brlapi, disabling')
1439 endif
1440 endif
Paolo Bonzini26347332019-07-29 15:40:07 +02001441endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001442
Paolo Bonzini760e4322020-08-26 08:09:48 +02001443sdl = not_found
Akihiko Odaki64d3fec2022-08-19 22:27:56 +09001444if not get_option('sdl').auto() or have_system
Paolo Bonzini063d5112022-07-14 14:56:58 +02001445 sdl = dependency('sdl2', required: get_option('sdl'))
Paolo Bonzini760e4322020-08-26 08:09:48 +02001446 sdl_image = not_found
1447endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001448if sdl.found()
Thomas Huth6da5f222023-06-05 13:45:23 +02001449 # Some versions of SDL have problems with -Wundef
1450 if not cc.compiles('''
1451 #include <SDL.h>
1452 #include <SDL_syswm.h>
1453 int main(int argc, char *argv[]) { return 0; }
1454 ''', dependencies: sdl, args: '-Werror=undef')
1455 sdl = declare_dependency(compile_args: '-Wno-undef',
1456 dependencies: sdl,
1457 version: sdl.version())
1458 endif
Volker Rümelin7161a432020-08-29 12:41:58 +02001459 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001460 method: 'pkg-config')
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001461else
1462 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +01001463 error('sdl-image required, but SDL was @0@'.format(
1464 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001465 endif
1466 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +02001467endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001468
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001469rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001470if not get_option('rbd').auto() or have_block
Paolo Bonzini063d5112022-07-14 14:56:58 +02001471 librados = cc.find_library('rados', required: get_option('rbd'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001472 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001473 required: get_option('rbd'))
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001474 if librados.found() and librbd.found()
1475 if cc.links('''
1476 #include <stdio.h>
1477 #include <rbd/librbd.h>
1478 int main(void) {
1479 rados_t cluster;
1480 rados_create(&cluster, NULL);
Peter Lieven48672ac2021-07-02 19:23:51 +02001481 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
1482 #error
1483 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001484 return 0;
1485 }''', dependencies: [librbd, librados])
1486 rbd = declare_dependency(dependencies: [librbd, librados])
1487 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +02001488 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001489 else
Peter Lieven48672ac2021-07-02 19:23:51 +02001490 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001491 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001492 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001493endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001494
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001495glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001496glusterfs_ftruncate_has_stat = false
1497glusterfs_iocb_has_stat = false
1498if not get_option('glusterfs').auto() or have_block
1499 glusterfs = dependency('glusterfs-api', version: '>=3',
1500 required: get_option('glusterfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001501 method: 'pkg-config')
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001502 if glusterfs.found()
1503 glusterfs_ftruncate_has_stat = cc.links('''
1504 #include <glusterfs/api/glfs.h>
1505
1506 int
1507 main(void)
1508 {
1509 /* new glfs_ftruncate() passes two additional args */
1510 return glfs_ftruncate(NULL, 0, NULL, NULL);
1511 }
1512 ''', dependencies: glusterfs)
1513 glusterfs_iocb_has_stat = cc.links('''
1514 #include <glusterfs/api/glfs.h>
1515
1516 /* new glfs_io_cbk() passes two additional glfs_stat structs */
1517 static void
1518 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
1519 {}
1520
1521 int
1522 main(void)
1523 {
1524 glfs_io_cbk iocb = &glusterfs_iocb;
1525 iocb(NULL, 0 , NULL, NULL, NULL);
1526 return 0;
1527 }
1528 ''', dependencies: glusterfs)
1529 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001530endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001531
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02001532hv_balloon = false
1533if get_option('hv_balloon').allowed() and have_system
1534 if cc.links('''
1535 #include <string.h>
1536 #include <gmodule.h>
1537 int main(void) {
1538 GTree *tree;
1539
1540 tree = g_tree_new((GCompareFunc)strcmp);
1541 (void)g_tree_node_first(tree);
1542 g_tree_destroy(tree);
1543 return 0;
1544 }
1545 ''', dependencies: glib)
1546 hv_balloon = true
1547 else
1548 if get_option('hv_balloon').enabled()
1549 error('could not enable hv-balloon, update your glib')
1550 else
1551 warning('could not find glib support for hv-balloon, disabling')
1552 endif
1553 endif
1554endif
1555
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001556libssh = not_found
Thomas Huthe6a52b32021-12-09 15:48:01 +01001557if not get_option('libssh').auto() or have_block
1558 libssh = dependency('libssh', version: '>=0.8.7',
1559 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001560 required: get_option('libssh'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001561endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001562
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001563libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001564if not get_option('bzip2').auto() or have_block
1565 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001566 required: get_option('bzip2'))
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001567 if libbzip2.found() and not cc.links('''
1568 #include <bzlib.h>
1569 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
1570 libbzip2 = not_found
1571 if get_option('bzip2').enabled()
1572 error('could not link libbzip2')
1573 else
1574 warning('could not link libbzip2, disabling')
1575 endif
1576 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001577endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001578
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001579liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +01001580if not get_option('lzfse').auto() or have_block
1581 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001582 required: get_option('lzfse'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001583endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001584if liblzfse.found() and not cc.links('''
1585 #include <lzfse.h>
1586 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
1587 liblzfse = not_found
1588 if get_option('lzfse').enabled()
1589 error('could not link liblzfse')
1590 else
1591 warning('could not link liblzfse, disabling')
1592 endif
1593endif
1594
Paolo Bonzini478e9432020-08-17 12:47:55 +02001595oss = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001596if get_option('oss').allowed() and have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02001597 if not cc.has_header('sys/soundcard.h')
1598 # not found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001599 elif host_os == 'netbsd'
Paolo Bonzini063d5112022-07-14 14:56:58 +02001600 oss = cc.find_library('ossaudio', required: get_option('oss'))
Paolo Bonzini87430d52021-10-07 15:06:09 +02001601 else
1602 oss = declare_dependency()
1603 endif
1604
1605 if not oss.found()
1606 if get_option('oss').enabled()
1607 error('OSS not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001608 endif
1609 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001610endif
1611dsound = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001612if not get_option('dsound').auto() or (host_os == 'windows' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001613 if cc.has_header('dsound.h')
1614 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1615 endif
1616
1617 if not dsound.found()
1618 if get_option('dsound').enabled()
1619 error('DirectSound not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001620 endif
1621 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001622endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001623
Paolo Bonzini478e9432020-08-17 12:47:55 +02001624coreaudio = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001625if not get_option('coreaudio').auto() or (host_os == 'darwin' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001626 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
1627 required: get_option('coreaudio'))
Paolo Bonzini478e9432020-08-17 12:47:55 +02001628endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001629
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001630opengl = not_found
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001631if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
1632 epoxy = dependency('epoxy', method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001633 required: get_option('opengl'))
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001634 if cc.has_header('epoxy/egl.h', dependencies: epoxy)
1635 opengl = epoxy
1636 elif get_option('opengl').enabled()
1637 error('epoxy/egl.h not found')
1638 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001639endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001640gbm = not_found
1641if (have_system or have_tools) and (virgl.found() or opengl.found())
Paolo Bonzini063d5112022-07-14 14:56:58 +02001642 gbm = dependency('gbm', method: 'pkg-config', required: false)
Thomas Huth8bc51842021-07-13 13:09:02 +02001643endif
Marc-André Lureauf0caba42022-06-28 17:23:15 +04001644have_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001645
Paolo Bonzini57612512021-06-03 11:15:26 +02001646gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001647gnutls_crypto = not_found
Alyssa Rossabc14fd2021-08-06 14:49:47 +00001648if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001649 # For general TLS support our min gnutls matches
1650 # that implied by our platform support matrix
1651 #
1652 # For the crypto backends, we look for a newer
1653 # gnutls:
1654 #
1655 # Version 3.6.8 is needed to get XTS
1656 # Version 3.6.13 is needed to get PBKDF
1657 # Version 3.6.14 is needed to get HW accelerated XTS
1658 #
1659 # If newer enough gnutls isn't available, we can
1660 # still use a different crypto backend to satisfy
1661 # the platform support requirements
1662 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1663 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001664 required: false)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001665 if gnutls_crypto.found()
1666 gnutls = gnutls_crypto
1667 else
1668 # Our min version if all we need is TLS
1669 gnutls = dependency('gnutls', version: '>=3.5.18',
1670 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001671 required: get_option('gnutls'))
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001672 endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001673endif
1674
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001675# We prefer use of gnutls for crypto, unless the options
1676# explicitly asked for nettle or gcrypt.
1677#
1678# If gnutls isn't available for crypto, then we'll prefer
1679# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +02001680gcrypt = not_found
1681nettle = not_found
Lei He4c5e5122022-05-25 17:01:14 +08001682hogweed = not_found
Hyman Huang52ed9f42023-12-07 23:47:35 +08001683crypto_sm4 = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +01001684xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001685
Paolo Bonzini57612512021-06-03 11:15:26 +02001686if get_option('nettle').enabled() and get_option('gcrypt').enabled()
1687 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +02001688endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001689
1690# Explicit nettle/gcrypt request, so ignore gnutls for crypto
1691if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001692 gnutls_crypto = not_found
1693endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001694
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001695if not gnutls_crypto.found()
1696 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
1697 gcrypt = dependency('libgcrypt', version: '>=1.8',
1698 method: 'config-tool',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001699 required: get_option('gcrypt'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001700 # Debian has removed -lgpg-error from libgcrypt-config
1701 # as it "spreads unnecessary dependencies" which in
1702 # turn breaks static builds...
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001703 if gcrypt.found() and get_option('prefer_static')
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001704 gcrypt = declare_dependency(dependencies:
1705 [gcrypt,
1706 cc.find_library('gpg-error', required: true)],
1707 version: gcrypt.version())
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001708 endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08001709 crypto_sm4 = gcrypt
1710 # SM4 ALG is available in libgcrypt >= 1.9
1711 if gcrypt.found() and not cc.links('''
1712 #include <gcrypt.h>
1713 int main(void) {
1714 gcry_cipher_hd_t handler;
1715 gcry_cipher_open(&handler, GCRY_CIPHER_SM4, GCRY_CIPHER_MODE_ECB, 0);
1716 return 0;
1717 }''', dependencies: gcrypt)
1718 crypto_sm4 = not_found
1719 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001720 endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001721 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1722 nettle = dependency('nettle', version: '>=3.4',
1723 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001724 required: get_option('nettle'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001725 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1726 xts = 'private'
1727 endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08001728 crypto_sm4 = nettle
1729 # SM4 ALG is available in nettle >= 3.9
1730 if nettle.found() and not cc.links('''
1731 #include <nettle/sm4.h>
1732 int main(void) {
1733 struct sm4_ctx ctx;
1734 unsigned char key[16] = {0};
1735 sm4_set_encrypt_key(&ctx, key);
1736 return 0;
1737 }''', dependencies: nettle)
1738 crypto_sm4 = not_found
1739 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001740 endif
1741endif
1742
Paolo Bonzinia775c712023-09-08 12:09:22 +02001743capstone = not_found
1744if not get_option('capstone').auto() or have_system or have_user
1745 capstone = dependency('capstone', version: '>=3.0.5',
1746 method: 'pkg-config',
1747 required: get_option('capstone'))
1748
1749 # Some versions of capstone have broken pkg-config file
1750 # that reports a wrong -I path, causing the #include to
1751 # fail later. If the system has such a broken version
1752 # do not use it.
1753 if capstone.found() and not cc.compiles('#include <capstone.h>',
1754 dependencies: [capstone])
1755 capstone = not_found
1756 if get_option('capstone').enabled()
1757 error('capstone requested, but it does not appear to work')
1758 endif
1759 endif
1760endif
1761
Paolo Bonzini063d5112022-07-14 14:56:58 +02001762gmp = dependency('gmp', required: false, method: 'pkg-config')
Lei He4c5e5122022-05-25 17:01:14 +08001763if nettle.found() and gmp.found()
1764 hogweed = dependency('hogweed', version: '>=3.4',
1765 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001766 required: get_option('nettle'))
Lei He4c5e5122022-05-25 17:01:14 +08001767endif
1768
1769
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001770gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +01001771gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001772vte = not_found
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001773have_gtk_clipboard = get_option('gtk_clipboard').enabled()
1774
Marc-André Lureauda554e12023-08-30 13:38:36 +04001775if get_option('gtk') \
1776 .disable_auto_if(not have_system) \
1777 .require(pixman.found(),
1778 error_message: 'cannot enable GTK if pixman is not available') \
1779 .allowed()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001780 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1781 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001782 required: get_option('gtk'))
Paolo Bonzini1b695472021-01-07 14:02:29 +01001783 if gtk.found()
1784 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1785 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001786 required: false)
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001787 gtk = declare_dependency(dependencies: [gtk, gtkx11],
1788 version: gtk.version())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001789
1790 if not get_option('vte').auto() or have_system
1791 vte = dependency('vte-2.91',
1792 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001793 required: get_option('vte'))
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001794 endif
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001795 elif have_gtk_clipboard
1796 error('GTK clipboard requested, but GTK not found')
Paolo Bonzini1b695472021-01-07 14:02:29 +01001797 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001798endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001799
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001800x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +02001801if gtkx11.found()
Paolo Bonzini063d5112022-07-14 14:56:58 +02001802 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001803endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001804png = not_found
Kshitij Suri95f85102022-04-08 07:13:34 +00001805if get_option('png').allowed() and have_system
Thomas Huth1ec8c2c2022-06-23 19:49:41 +02001806 png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001807 method: 'pkg-config')
Kshitij Suri95f85102022-04-08 07:13:34 +00001808endif
1809vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001810jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001811sasl = not_found
Marc-André Lureau89fd3ea2023-08-30 13:38:34 +04001812if get_option('vnc') \
1813 .disable_auto_if(not have_system) \
1814 .require(pixman.found(),
1815 error_message: 'cannot enable VNC if pixman is not available') \
1816 .allowed()
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001817 vnc = declare_dependency() # dummy dependency
Paolo Bonzini8e242b32020-11-23 13:34:02 -05001818 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001819 method: 'pkg-config')
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001820 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001821 required: get_option('vnc_sasl'))
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001822 if sasl.found()
1823 sasl = declare_dependency(dependencies: sasl,
1824 compile_args: '-DSTRUCT_IOVEC_DEFINED')
1825 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001826endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01001827
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001828pam = not_found
1829if not get_option('auth_pam').auto() or have_system
1830 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001831 required: get_option('auth_pam'))
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001832endif
1833if pam.found() and not cc.links('''
1834 #include <stddef.h>
1835 #include <security/pam_appl.h>
1836 int main(void) {
1837 const char *service_name = "qemu";
1838 const char *user = "frank";
1839 const struct pam_conv pam_conv = { 0 };
1840 pam_handle_t *pamh = NULL;
1841 pam_start(service_name, user, &pam_conv, &pamh);
1842 return 0;
1843 }''', dependencies: pam)
1844 pam = not_found
1845 if get_option('auth_pam').enabled()
1846 error('could not link libpam')
1847 else
1848 warning('could not link libpam, disabling')
1849 endif
1850endif
1851
Marc-André Lureau708eab42019-09-03 16:59:33 +04001852snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +01001853if not get_option('snappy').auto() or have_system
1854 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001855 required: get_option('snappy'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04001856endif
Thomas Huth785abf02023-07-06 08:47:36 +02001857if snappy.found() and not cc.links('''
Paolo Bonzini241611e2020-11-17 13:32:34 +01001858 #include <snappy-c.h>
1859 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
1860 snappy = not_found
1861 if get_option('snappy').enabled()
1862 error('could not link libsnappy')
1863 else
1864 warning('could not link libsnappy, disabling')
1865 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +04001866endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001867
Marc-André Lureau708eab42019-09-03 16:59:33 +04001868lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001869if not get_option('lzo').auto() or have_system
1870 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001871 required: get_option('lzo'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04001872endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001873if lzo.found() and not cc.links('''
1874 #include <lzo/lzo1x.h>
1875 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
1876 lzo = not_found
1877 if get_option('lzo').enabled()
1878 error('could not link liblzo2')
1879 else
1880 warning('could not link liblzo2, disabling')
1881 endif
1882endif
1883
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001884numa = not_found
1885if not get_option('numa').auto() or have_system or have_tools
1886 numa = cc.find_library('numa', has_headers: ['numa.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001887 required: get_option('numa'))
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001888endif
1889if numa.found() and not cc.links('''
1890 #include <numa.h>
1891 int main(void) { return numa_available(); }
1892 ''', dependencies: numa)
1893 numa = not_found
1894 if get_option('numa').enabled()
1895 error('could not link numa')
1896 else
1897 warning('could not link numa, disabling')
1898 endif
1899endif
1900
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01001901fdt = not_found
1902fdt_opt = get_option('fdt')
1903if fdt_opt == 'enabled' and get_option('wrap_mode') == 'nodownload'
1904 fdt_opt = 'system'
1905endif
1906if fdt_opt in ['enabled', 'system'] or (fdt_opt == 'auto' and have_system)
1907 fdt = cc.find_library('fdt', required: fdt_opt == 'system')
1908 if fdt.found() and cc.links('''
1909 #include <libfdt.h>
1910 #include <libfdt_env.h>
1911 int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
1912 dependencies: fdt)
1913 fdt_opt = 'system'
1914 elif fdt_opt != 'system'
1915 fdt_opt = get_option('wrap_mode') == 'nodownload' ? 'disabled' : 'internal'
1916 fdt = not_found
1917 else
1918 error('system libfdt is too old (1.5.1 or newer required)')
1919 endif
1920endif
1921if fdt_opt == 'internal'
1922 assert(not fdt.found())
1923 libfdt_proj = subproject('dtc', required: true,
1924 default_options: ['tools=false', 'yaml=disabled',
1925 'python=disabled', 'default_library=static'])
1926 fdt = libfdt_proj.get_variable('libfdt_dep')
1927endif
1928
Marc-André Lureau55166232019-07-24 19:16:22 +04001929rdma = not_found
Paolo Bonzini3730a732022-04-20 17:33:41 +02001930if not get_option('rdma').auto() or have_system
Paolo Bonzini3730a732022-04-20 17:33:41 +02001931 rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001932 required: get_option('rdma')),
zhenwei pi829858f2024-06-11 18:54:26 +08001933 cc.find_library('ibverbs', required: get_option('rdma'))]
Paolo Bonzini3730a732022-04-20 17:33:41 +02001934 rdma = declare_dependency(dependencies: rdma_libs)
1935 foreach lib: rdma_libs
1936 if not lib.found()
1937 rdma = not_found
1938 endif
1939 endforeach
Marc-André Lureau55166232019-07-24 19:16:22 +04001940endif
Paolo Bonzini3730a732022-04-20 17:33:41 +02001941
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001942cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02001943if not get_option('smartcard').auto() or have_system
1944 cacard = dependency('libcacard', required: get_option('smartcard'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001945 version: '>=2.5.1', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001946endif
César Belley0a40bcb2020-08-26 13:42:04 +02001947u2f = not_found
Paolo Bonzinie7c22ff2023-09-08 12:10:27 +02001948if not get_option('u2f').auto() or have_system
César Belley0a40bcb2020-08-26 13:42:04 +02001949 u2f = dependency('u2f-emu', required: get_option('u2f'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001950 method: 'pkg-config')
César Belley0a40bcb2020-08-26 13:42:04 +02001951endif
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08001952canokey = not_found
Paolo Bonzinie7c22ff2023-09-08 12:10:27 +02001953if not get_option('canokey').auto() or have_system
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08001954 canokey = dependency('canokey-qemu', required: get_option('canokey'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001955 method: 'pkg-config')
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08001956endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001957usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02001958if not get_option('usb_redir').auto() or have_system
1959 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001960 version: '>=0.6', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001961endif
1962libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02001963if not get_option('libusb').auto() or have_system
1964 libusb = dependency('libusb-1.0', required: get_option('libusb'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001965 version: '>=1.0.13', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001966endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02001967
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001968libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02001969if not get_option('libpmem').auto() or have_system
1970 libpmem = dependency('libpmem', required: get_option('libpmem'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001971 method: 'pkg-config')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001972endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001973libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02001974if not get_option('libdaxctl').auto() or have_system
1975 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001976 version: '>=57', method: 'pkg-config')
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001977endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001978tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02001979if gnutls.found()
1980 tasn1 = dependency('libtasn1',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001981 method: 'pkg-config')
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001982endif
Max Fritz0db0fbb2023-05-22 02:12:02 +02001983keyutils = not_found
Thomas Huthc64023b2023-08-24 11:42:08 +02001984if not get_option('libkeyutils').auto() or have_block
1985 keyutils = dependency('libkeyutils', required: get_option('libkeyutils'),
1986 method: 'pkg-config')
Max Fritz0db0fbb2023-05-22 02:12:02 +02001987endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001988
Marc-André Lureau3909def2020-08-28 15:07:33 +04001989has_gettid = cc.has_function('gettid')
1990
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001991# libselinux
1992selinux = dependency('libselinux',
1993 required: get_option('selinux'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001994 method: 'pkg-config')
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001995
Paolo Bonziniaa087962020-09-01 11:15:30 -04001996# Malloc tests
1997
1998malloc = []
1999if get_option('malloc') == 'system'
2000 has_malloc_trim = \
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002001 get_option('malloc_trim').allowed() and \
Michal Privoznik09a49af2023-05-30 12:31:23 +02002002 cc.has_function('malloc_trim', prefix: '#include <malloc.h>')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002003else
2004 has_malloc_trim = false
2005 malloc = cc.find_library(get_option('malloc'), required: true)
2006endif
2007if not has_malloc_trim and get_option('malloc_trim').enabled()
2008 if get_option('malloc') == 'system'
2009 error('malloc_trim not available on this platform.')
2010 else
2011 error('malloc_trim not available with non-libc memory allocator')
2012 endif
2013endif
2014
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002015gnu_source_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01002016 #ifndef _GNU_SOURCE
2017 #define _GNU_SOURCE
2018 #endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002019'''
Max Reitz84e319a2020-11-02 17:18:55 +01002020
Michal Privoznik09a49af2023-05-30 12:31:23 +02002021# Check whether the glibc provides STATX_BASIC_STATS
2022
2023has_statx = cc.has_header_symbol('sys/stat.h', 'STATX_BASIC_STATS', prefix: gnu_source_prefix)
Max Reitz84e319a2020-11-02 17:18:55 +01002024
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002025# Check whether statx() provides mount ID information
2026
Michal Privoznik09a49af2023-05-30 12:31:23 +02002027has_statx_mnt_id = cc.has_header_symbol('sys/stat.h', 'STATX_MNT_ID', prefix: gnu_source_prefix)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002028
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002029have_vhost_user_blk_server = get_option('vhost_user_blk_server') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002030 .require(host_os == 'linux',
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002031 error_message: 'vhost_user_blk_server requires linux') \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02002032 .require(have_vhost_user,
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002033 error_message: 'vhost_user_blk_server requires vhost-user support') \
Alex Bennée26ed5012022-05-24 16:40:42 +01002034 .disable_auto_if(not have_tools and not have_system) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002035 .allowed()
Daniele Buono9e62ba42020-12-04 18:06:14 -05002036
Max Reitzdf4ea702020-10-27 20:05:46 +01002037if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
2038 error('Cannot enable fuse-lseek while fuse is disabled')
2039endif
2040
Max Reitza484a712020-10-27 20:05:41 +01002041fuse = dependency('fuse3', required: get_option('fuse'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002042 version: '>=3.1', method: 'pkg-config')
Max Reitza484a712020-10-27 20:05:41 +01002043
Max Reitzdf4ea702020-10-27 20:05:46 +01002044fuse_lseek = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002045if get_option('fuse_lseek').allowed()
Max Reitzdf4ea702020-10-27 20:05:46 +01002046 if fuse.version().version_compare('>=3.8')
2047 # Dummy dependency
2048 fuse_lseek = declare_dependency()
2049 elif get_option('fuse_lseek').enabled()
2050 if fuse.found()
2051 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
2052 else
2053 error('fuse-lseek requires libfuse, which was not found')
2054 endif
2055 endif
2056endif
2057
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002058have_libvduse = (host_os == 'linux')
Xie Yongjia6caeee2022-05-23 16:46:08 +08002059if get_option('libvduse').enabled()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002060 if host_os != 'linux'
Xie Yongjia6caeee2022-05-23 16:46:08 +08002061 error('libvduse requires linux')
2062 endif
2063elif get_option('libvduse').disabled()
2064 have_libvduse = false
2065endif
2066
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002067have_vduse_blk_export = (have_libvduse and host_os == 'linux')
Xie Yongji2a2359b2022-05-23 16:46:09 +08002068if get_option('vduse_blk_export').enabled()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002069 if host_os != 'linux'
Xie Yongji2a2359b2022-05-23 16:46:09 +08002070 error('vduse_blk_export requires linux')
2071 elif not have_libvduse
2072 error('vduse_blk_export requires libvduse support')
2073 endif
2074elif get_option('vduse_blk_export').disabled()
2075 have_vduse_blk_export = false
2076endif
2077
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002078# libbpf
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002079bpf_version = '1.1.0'
2080libbpf = dependency('libbpf', version: '>=' + bpf_version, required: get_option('bpf'), method: 'pkg-config')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002081if libbpf.found() and not cc.links('''
2082 #include <bpf/libbpf.h>
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002083 #include <linux/bpf.h>
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002084 int main(void)
2085 {
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002086 // check flag availability
2087 int flag = BPF_F_MMAPABLE;
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002088 bpf_object__destroy_skeleton(NULL);
2089 return 0;
2090 }''', dependencies: libbpf)
2091 libbpf = not_found
2092 if get_option('bpf').enabled()
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002093 error('libbpf skeleton/mmaping test failed')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002094 else
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002095 warning('libbpf skeleton/mmaping test failed, disabling')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002096 endif
2097endif
2098
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002099# libxdp
2100libxdp = not_found
2101if not get_option('af_xdp').auto() or have_system
2102 libxdp = dependency('libxdp', required: get_option('af_xdp'),
2103 version: '>=1.4.0', method: 'pkg-config')
2104endif
2105
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002106# libdw
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002107libdw = not_found
Ilya Leoshkevich550c6d92023-02-10 01:52:08 +01002108if not get_option('libdw').auto() or \
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02002109 (not get_option('prefer_static') and (have_system or have_user))
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002110 libdw = dependency('libdw',
2111 method: 'pkg-config',
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002112 required: get_option('libdw'))
2113endif
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002114
Paolo Bonzini87430d52021-10-07 15:06:09 +02002115#################
2116# config-host.h #
2117#################
2118
Paolo Bonzini95933f12023-09-08 12:10:08 +02002119config_host_data = configuration_data()
2120
Paolo Bonzini87430d52021-10-07 15:06:09 +02002121audio_drivers_selected = []
2122if have_system
2123 audio_drivers_available = {
2124 'alsa': alsa.found(),
2125 'coreaudio': coreaudio.found(),
2126 'dsound': dsound.found(),
2127 'jack': jack.found(),
2128 'oss': oss.found(),
2129 'pa': pulse.found(),
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02002130 'pipewire': pipewire.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002131 'sdl': sdl.found(),
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002132 'sndio': sndio.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002133 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02002134 foreach k, v: audio_drivers_available
2135 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
2136 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02002137
2138 # Default to native drivers first, OSS second, SDL third
2139 audio_drivers_priority = \
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002140 [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002141 (host_os == 'linux' ? [] : [ 'sdl' ])
Paolo Bonzini87430d52021-10-07 15:06:09 +02002142 audio_drivers_default = []
2143 foreach k: audio_drivers_priority
2144 if audio_drivers_available[k]
2145 audio_drivers_default += k
2146 endif
2147 endforeach
2148
2149 foreach k: get_option('audio_drv_list')
2150 if k == 'default'
2151 audio_drivers_selected += audio_drivers_default
2152 elif not audio_drivers_available[k]
2153 error('Audio driver "@0@" not available.'.format(k))
2154 else
2155 audio_drivers_selected += k
2156 endif
2157 endforeach
2158endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02002159config_host_data.set('CONFIG_AUDIO_DRIVERS',
2160 '"' + '", "'.join(audio_drivers_selected) + '", ')
2161
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002162have_host_block_device = (host_os != 'darwin' or
Joelle van Dyne14176c82021-03-15 11:03:38 -07002163 cc.has_header('IOKit/storage/IOMedia.h'))
2164
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002165dbus_display = get_option('dbus_display') \
2166 .require(gio.version().version_compare('>=2.64'),
2167 error_message: '-display dbus requires glib>=2.64') \
Paolo Bonzini75440602022-04-20 17:33:44 +02002168 .require(gdbus_codegen.found(),
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02002169 error_message: gdbus_codegen_error.format('-display dbus')) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002170 .allowed()
Marc-André Lureau142ca622021-07-15 11:53:53 +04002171
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002172have_virtfs = get_option('virtfs') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002173 .require(host_os == 'linux' or host_os == 'darwin',
Keno Fischer0fb1e192022-02-27 17:35:22 -05002174 error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002175 .require(host_os == 'linux' or cc.has_function('pthread_fchdir_np'),
Keno Fischer0fb1e192022-02-27 17:35:22 -05002176 error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002177 .require(host_os == 'darwin' or libattr.found(),
Peter Foley1a67e072023-05-03 09:07:56 -04002178 error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002179 .disable_auto_if(not have_tools and not have_system) \
2180 .allowed()
Paolo Bonzini69202b42020-11-17 14:46:21 +01002181
Peter Foley1a67e072023-05-03 09:07:56 -04002182have_virtfs_proxy_helper = get_option('virtfs_proxy_helper') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002183 .require(host_os != 'darwin', error_message: 'the virtfs proxy helper is incompatible with macOS') \
Peter Foley1a67e072023-05-03 09:07:56 -04002184 .require(have_virtfs, error_message: 'the virtfs proxy helper requires that virtfs is enabled') \
2185 .disable_auto_if(not have_tools) \
2186 .require(libcap_ng.found(), error_message: 'the virtfs proxy helper requires libcap-ng') \
2187 .allowed()
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01002188
Paolo Bonzini622d64f2022-04-20 17:33:53 +02002189if get_option('block_drv_ro_whitelist') == ''
2190 config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
2191else
2192 config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
2193 '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
2194endif
2195if get_option('block_drv_rw_whitelist') == ''
2196 config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
2197else
2198 config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
2199 '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
2200endif
2201
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002202foreach k : get_option('trace_backends')
2203 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
2204endforeach
2205config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02002206config_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
Paolo Bonzini40c909f2022-04-20 17:33:49 +02002207if iasl.found()
2208 config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
Paolo Bonzini5dc46182021-10-13 13:19:00 +02002209endif
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002210config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
2211config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
2212config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
2213config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
2214config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09002215
2216qemu_firmwarepath = ''
2217foreach k : get_option('qemu_firmwarepath')
2218 qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
2219endforeach
2220config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
2221
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002222config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
2223config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
2224config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
2225config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
2226config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
2227config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
2228
Paolo Bonzini60027112022-10-20 14:53:10 +02002229if enable_modules
Paolo Bonzinib0b43232022-04-20 17:33:54 +02002230 config_host_data.set('CONFIG_STAMP', run_command(
2231 meson.current_source_dir() / 'scripts/qemu-stamp.py',
2232 meson.project_version(), get_option('pkgversion'), '--',
2233 meson.current_source_dir() / 'configure',
2234 capture: true, check: true).stdout().strip())
2235endif
2236
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002237have_slirp_smbd = get_option('slirp_smbd') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002238 .require(host_os != 'windows', error_message: 'Host smbd not supported on this platform.') \
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002239 .allowed()
2240if have_slirp_smbd
2241 smbd_path = get_option('smbd')
2242 if smbd_path == ''
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002243 smbd_path = (host_os == 'sunos' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002244 endif
2245 config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
2246endif
2247
Paolo Bonzini823eb012021-11-08 14:18:17 +01002248config_host_data.set('HOST_' + host_arch.to_upper(), 1)
2249
Paolo Bonzini95933f12023-09-08 12:10:08 +02002250kvm_targets_c = '""'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002251if get_option('kvm').allowed() and host_os == 'linux'
Paolo Bonzini95933f12023-09-08 12:10:08 +02002252 kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
2253endif
2254config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
2255
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02002256if get_option('module_upgrades') and not enable_modules
2257 error('Cannot enable module-upgrades as modules are not enabled')
2258endif
2259config_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
2260
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002261config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002262config_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002263config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002264config_host_data.set('CONFIG_BSD', host_os in bsd_oses)
Paolo Bonzinia775c712023-09-08 12:09:22 +02002265config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04002266config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002267config_host_data.set('CONFIG_DARWIN', host_os == 'darwin')
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01002268config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini537b7242021-10-07 15:08:12 +02002269config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02002270config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002271config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002272config_host_data.set('CONFIG_LINUX', host_os == 'linux')
2273config_host_data.set('CONFIG_POSIX', host_os != 'windows')
2274config_host_data.set('CONFIG_WIN32', host_os == 'windows')
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002275config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002276config_host_data.set('CONFIG_MPATH', mpathpersist.found())
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04002277config_host_data.set('CONFIG_BLKIO', blkio.found())
Stefano Garzarella98b126f2023-05-30 09:19:41 +02002278if blkio.found()
2279 config_host_data.set('CONFIG_BLKIO_VHOST_VDPA_FD',
2280 blkio.version().version_compare('>=1.3.0'))
2281endif
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002282config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08002283config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02002284config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini75440602022-04-20 17:33:44 +02002285config_host_data.set('CONFIG_GIO', gio.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002286config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
2287if glusterfs.found()
2288 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
2289 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
2290 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
2291 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
2292 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
2293 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
2294endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002295config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02002296config_host_data.set('CONFIG_VTE', vte.found())
Claudio Fontana29e0bff2022-11-21 14:55:38 +01002297config_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard)
Taylor Simpson63efb6a2023-04-27 15:59:52 -07002298config_host_data.set('CONFIG_HEXAGON_IDEF_PARSER', get_option('hexagon_idef_parser'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002299config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002300config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002301config_host_data.set('CONFIG_EBPF', libbpf.found())
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002302config_host_data.set('CONFIG_AF_XDP', libxdp.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002303config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002304config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01002305config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Thomas Huthe6a52b32021-12-09 15:48:01 +01002306config_host_data.set('CONFIG_LIBSSH', libssh.found())
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02002307config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002308config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
2309config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzini60027112022-10-20 14:53:10 +02002310config_host_data.set('CONFIG_MODULES', enable_modules)
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002311config_host_data.set('CONFIG_NUMA', numa.found())
Michal Privoznik6bb613f2022-12-15 10:55:03 +01002312if numa.found()
2313 config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY',
2314 cc.has_function('numa_has_preferred_many',
2315 dependencies: numa))
2316endif
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002317config_host_data.set('CONFIG_OPENGL', opengl.found())
Paolo Bonzini2c13c572023-08-30 12:20:53 +02002318config_host_data.set('CONFIG_PLUGIN', get_option('plugins'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002319config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini3730a732022-04-20 17:33:41 +02002320config_host_data.set('CONFIG_RDMA', rdma.found())
Paolo Bonzini655e2a72023-10-05 14:19:34 +02002321config_host_data.set('CONFIG_RELOCATABLE', get_option('relocatable'))
Paolo Bonzini721fa5e2022-10-12 11:59:51 +02002322config_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002323config_host_data.set('CONFIG_SDL', sdl.found())
2324config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01002325config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Michal Privoznik73422d92022-10-26 09:30:24 +02002326if seccomp.found()
2327 config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
2328endif
Marc-André Lureaucca15752023-08-30 13:38:25 +04002329config_host_data.set('CONFIG_PIXMAN', pixman.found())
Paolo Bonzinia775c712023-09-08 12:09:22 +02002330config_host_data.set('CONFIG_SLIRP', slirp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01002331config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002332config_host_data.set('CONFIG_SOLARIS', host_os == 'sunos')
Paolo Bonzini875be2872022-02-15 11:37:00 +01002333if get_option('tcg').allowed()
2334 config_host_data.set('CONFIG_TCG', 1)
2335 config_host_data.set('CONFIG_TCG_INTERPRETER', tcg_arch == 'tci')
2336endif
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002337config_host_data.set('CONFIG_TPM', have_tpm)
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002338config_host_data.set('CONFIG_TSAN', get_option('tsan'))
Paolo Bonzini90540f32021-06-03 11:15:26 +02002339config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Paolo Bonzinie1723992021-10-07 15:08:21 +02002340config_host_data.set('CONFIG_VDE', vde.found())
Stefan Hajnoczic0c4f142023-10-03 21:45:32 -04002341config_host_data.set('CONFIG_VHOST', have_vhost)
Paolo Bonzini2df89d52022-04-20 17:34:07 +02002342config_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
2343config_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
2344config_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
2345config_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
2346config_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
2347config_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
2348config_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03002349config_host_data.set('CONFIG_VMNET', vmnet.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002350config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Xie Yongji2a2359b2022-05-23 16:46:09 +08002351config_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
Kshitij Suri95f85102022-04-08 07:13:34 +00002352config_host_data.set('CONFIG_PNG', png.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002353config_host_data.set('CONFIG_VNC', vnc.found())
2354config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002355config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini95933f12023-09-08 12:10:08 +02002356if virgl.found()
2357 config_host_data.set('HAVE_VIRGL_D3D_INFO_EXT',
2358 cc.has_member('struct virgl_renderer_resource_info_ext', 'd3d_tex2d',
2359 prefix: '#include <virglrenderer.h>',
2360 dependencies: virgl))
2361endif
Paolo Bonzini69202b42020-11-17 14:46:21 +01002362config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002363config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002364config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04002365config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04002366config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02002367config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01002368config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Daniel P. Berrangéd47b83b2022-04-26 17:00:43 +01002369config_host_data.set('CONFIG_TASN1', tasn1.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002370config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
2371config_host_data.set('CONFIG_NETTLE', nettle.found())
Hyman Huang52ed9f42023-12-07 23:47:35 +08002372config_host_data.set('CONFIG_CRYPTO_SM4', crypto_sm4.found())
Lei He4c5e5122022-05-25 17:01:14 +08002373config_host_data.set('CONFIG_HOGWEED', hogweed.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002374config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002375config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01002376config_host_data.set('CONFIG_STATX', has_statx)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002377config_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id)
Paolo Bonzinib1def332020-11-17 13:37:39 +01002378config_host_data.set('CONFIG_ZSTD', zstd.found())
Yuan Liub844a2c2024-06-10 18:21:06 +08002379config_host_data.set('CONFIG_QPL', qpl.found())
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01002380config_host_data.set('CONFIG_UADK', uadk.found())
Max Reitza484a712020-10-27 20:05:41 +01002381config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01002382config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002383config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
Marc-André Lureauddece462021-10-06 14:18:09 +04002384if spice_protocol.found()
2385config_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
2386config_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
2387config_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
2388endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002389config_host_data.set('CONFIG_SPICE', spice.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01002390config_host_data.set('CONFIG_X11', x11.found())
Marc-André Lureau142ca622021-07-15 11:53:53 +04002391config_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
Daniele Buono9e62ba42020-12-04 18:06:14 -05002392config_host_data.set('CONFIG_CFI', get_option('cfi'))
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002393config_host_data.set('CONFIG_SELINUX', selinux.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002394config_host_data.set('CONFIG_XEN_BACKEND', xen.found())
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002395config_host_data.set('CONFIG_LIBDW', libdw.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002396if xen.found()
2397 # protect from xen.version() having less than three components
2398 xen_version = xen.version().split('.') + ['0', '0']
2399 xen_ctrl_version = xen_version[0] + \
2400 ('0' + xen_version[1]).substring(-2) + \
2401 ('0' + xen_version[2]).substring(-2)
2402 config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
2403endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002404config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
2405config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
2406config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
2407config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
2408
Paolo Bonzinia6305082021-10-07 15:08:15 +02002409config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002410config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
2411
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002412have_coroutine_pool = get_option('coroutine_pool')
2413if get_option('debug_stack_usage') and have_coroutine_pool
2414 message('Disabling coroutine pool to measure stack usage')
2415 have_coroutine_pool = false
2416endif
Paolo Bonzini230f6e02023-10-05 14:31:27 +02002417config_host_data.set('CONFIG_COROUTINE_POOL', have_coroutine_pool)
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04002418config_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002419config_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002420config_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
Paolo Bonzini1d558c92023-08-28 11:48:30 +02002421config_host_data.set('CONFIG_DEBUG_TCG', get_option('debug_tcg'))
Ilya Leoshkevich1f2355f2024-03-12 01:23:30 +01002422config_host_data.set('CONFIG_DEBUG_REMAP', get_option('debug_remap'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002423config_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
Juan Quintelaabad1852022-09-02 18:51:25 +02002424config_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
Paolo Bonzini406523f2021-10-13 11:43:54 +02002425
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002426# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002427config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002428config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
2429config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
Thomas Huth48f670e2020-11-18 18:10:52 +01002430config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01002431config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01002432config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002433config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01002434config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01002435config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002436if host_os == 'windows'
Bin Mengd4093732022-08-02 15:51:58 +08002437 config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
2438endif
Thomas Huthded5d782020-11-14 11:10:11 +01002439
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002440# has_function
Claudio Imbrendac891c242022-08-12 15:34:53 +02002441config_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002442config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002443config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
2444config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
2445config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
2446config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Paolo Bonzini67504852023-06-21 00:47:31 +02002447config_host_data.set('CONFIG_GETCPU', cc.has_function('getcpu', prefix: gnu_source_prefix))
2448config_host_data.set('CONFIG_SCHED_GETCPU', cc.has_function('sched_getcpu', prefix: '#include <sched.h>'))
Peter Maydell86983432022-02-26 18:07:19 +00002449# Note that we need to specify prefix: here to avoid incorrectly
2450# thinking that Windows has posix_memalign()
2451config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
Peter Maydell5c8c7142022-02-26 18:07:20 +00002452config_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
Peter Maydell88454f82022-02-26 18:07:21 +00002453config_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
2454config_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002455config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002456config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Keno Fischer029ed1b2022-02-27 17:35:20 -05002457config_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002458config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
2459config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
2460config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
2461config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
2462config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002463config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Andrew Deason59e35c72022-04-26 14:55:22 -05002464config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02002465config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002466config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002467config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002468config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Stefano Garzarella66dc5f92022-05-17 09:10:12 +02002469if rbd.found()
2470 config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
2471 cc.has_function('rbd_namespace_exists',
2472 dependencies: rbd,
2473 prefix: '#include <rbd/librbd.h>'))
2474endif
Li Zhijian911965a2021-09-10 15:02:55 +08002475if rdma.found()
2476 config_host_data.set('HAVE_IBV_ADVISE_MR',
2477 cc.has_function('ibv_advise_mr',
Paolo Bonzini3730a732022-04-20 17:33:41 +02002478 dependencies: rdma,
Li Zhijian911965a2021-09-10 15:02:55 +08002479 prefix: '#include <infiniband/verbs.h>'))
2480endif
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002481
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002482have_asan_fiber = false
2483if get_option('sanitizers') and \
2484 not cc.has_function('__sanitizer_start_switch_fiber',
2485 args: '-fsanitize=address',
2486 prefix: '#include <sanitizer/asan_interface.h>')
2487 warning('Missing ASAN due to missing fiber annotation interface')
2488 warning('Without code annotation, the report may be inferior.')
2489else
2490 have_asan_fiber = true
2491endif
2492config_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber)
2493
Ilya Leoshkevicha1a98002024-02-06 01:22:03 +01002494have_inotify_init = cc.has_header_symbol('sys/inotify.h', 'inotify_init')
2495have_inotify_init1 = cc.has_header_symbol('sys/inotify.h', 'inotify_init1')
2496inotify = not_found
2497if (have_inotify_init or have_inotify_init1) and host_os == 'freebsd'
2498 # libinotify-kqueue
2499 inotify = cc.find_library('inotify')
2500 if have_inotify_init
2501 have_inotify_init = inotify.found()
2502 endif
2503 if have_inotify_init1
2504 have_inotify_init1 = inotify.found()
2505 endif
2506endif
2507config_host_data.set('CONFIG_INOTIFY', have_inotify_init)
2508config_host_data.set('CONFIG_INOTIFY1', have_inotify_init1)
2509
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002510# has_header_symbol
Sam Li6d43eaa2023-05-08 12:55:28 +08002511config_host_data.set('CONFIG_BLKZONED',
2512 cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002513config_host_data.set('CONFIG_EPOLL_CREATE1',
2514 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
2515config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
2516 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
2517 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
2518config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
2519 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
2520config_host_data.set('CONFIG_FIEMAP',
2521 cc.has_header('linux/fiemap.h') and
2522 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002523config_host_data.set('CONFIG_GETRANDOM',
2524 cc.has_function('getrandom') and
2525 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002526config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
2527 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002528config_host_data.set('CONFIG_RTNETLINK',
2529 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
2530config_host_data.set('CONFIG_SYSMACROS',
2531 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002532config_host_data.set('HAVE_OPTRESET',
2533 cc.has_header_symbol('getopt.h', 'optreset'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04002534config_host_data.set('HAVE_IPPROTO_MPTCP',
2535 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002536
2537# has_member
2538config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
2539 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
2540 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002541config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
2542 cc.has_member('struct stat', 'st_atim',
2543 prefix: '#include <sys/stat.h>'))
Sam Li6d43eaa2023-05-08 12:55:28 +08002544config_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY',
2545 cc.has_member('struct blk_zone', 'capacity',
2546 prefix: '#include <linux/blkzoned.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002547
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002548# has_type
2549config_host_data.set('CONFIG_IOVEC',
2550 cc.has_type('struct iovec',
2551 prefix: '#include <sys/uio.h>'))
2552config_host_data.set('HAVE_UTMPX',
2553 cc.has_type('struct utmpx',
2554 prefix: '#include <utmpx.h>'))
2555
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002556config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002557 #include <sys/eventfd.h>
2558 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002559config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002560 #include <unistd.h>
2561 int main(void) {
2562 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2563 return fdatasync(0);
2564 #else
2565 #error Not supported
2566 #endif
2567 }'''))
Andrew Deason8900c202022-03-15 22:52:25 -05002568
2569has_madvise = cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002570 #include <sys/types.h>
2571 #include <sys/mman.h>
2572 #include <stddef.h>
Andrew Deason8900c202022-03-15 22:52:25 -05002573 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
2574missing_madvise_proto = false
2575if has_madvise
2576 # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
2577 # but forget to prototype it. In this case, has_madvise will be true (the
2578 # test program links despite a compile warning). To detect the
2579 # missing-prototype case, we try again with a definitely-bogus prototype.
2580 # This will only compile if the system headers don't provide the prototype;
2581 # otherwise the conflicting prototypes will cause a compiler error.
2582 missing_madvise_proto = cc.links(gnu_source_prefix + '''
2583 #include <sys/types.h>
2584 #include <sys/mman.h>
2585 #include <stddef.h>
2586 extern int madvise(int);
2587 int main(void) { return madvise(0); }''')
2588endif
2589config_host_data.set('CONFIG_MADVISE', has_madvise)
2590config_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
2591
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002592config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002593 #include <sys/mman.h>
2594 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002595config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002596 #include <fcntl.h>
2597 #if !defined(AT_EMPTY_PATH)
2598 # error missing definition
2599 #else
2600 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2601 #endif'''))
Michal Privoznik12d7d0c2024-06-05 12:44:54 +02002602
2603# On Darwin posix_madvise() has the same return semantics as plain madvise(),
2604# i.e. errno is set and -1 is returned. That's not really how POSIX defines the
2605# function. On the flip side, it has madvise() which is preferred anyways.
2606if host_os != 'darwin'
2607 config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
2608 #include <sys/mman.h>
2609 #include <stddef.h>
2610 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
2611endif
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002612
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002613config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002614 #include <pthread.h>
2615
2616 static void *f(void *p) { return NULL; }
2617 int main(void)
2618 {
2619 pthread_t thread;
2620 pthread_create(&thread, 0, f, 0);
2621 pthread_setname_np(thread, "QEMU");
2622 return 0;
2623 }''', dependencies: threads))
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002624config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002625 #include <pthread.h>
2626
2627 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
2628 int main(void)
2629 {
2630 pthread_t thread;
2631 pthread_create(&thread, 0, f, 0);
2632 return 0;
2633 }''', dependencies: threads))
Brad Smith3ada67a2022-12-18 03:22:04 -05002634config_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + '''
2635 #include <pthread.h>
2636 #include <pthread_np.h>
2637
2638 static void *f(void *p) { return NULL; }
2639 int main(void)
2640 {
2641 pthread_t thread;
2642 pthread_create(&thread, 0, f, 0);
2643 pthread_set_name_np(thread, "QEMU");
2644 return 0;
2645 }''', dependencies: threads))
Longpeng(Mike)657ac982022-02-22 17:05:05 +08002646config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
2647 #include <pthread.h>
2648 #include <time.h>
2649
2650 int main(void)
2651 {
2652 pthread_condattr_t attr
2653 pthread_condattr_init(&attr);
2654 pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2655 return 0;
2656 }''', dependencies: threads))
David Hildenbrand7730f322022-10-14 15:47:15 +02002657config_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + '''
2658 #include <pthread.h>
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002659
David Hildenbrand7730f322022-10-14 15:47:15 +02002660 static void *f(void *p) { return NULL; }
2661 int main(void)
2662 {
2663 int setsize = CPU_ALLOC_SIZE(64);
2664 pthread_t thread;
2665 cpu_set_t *cpuset;
2666 pthread_create(&thread, 0, f, 0);
2667 cpuset = CPU_ALLOC(64);
2668 CPU_ZERO_S(setsize, cpuset);
2669 pthread_setaffinity_np(thread, setsize, cpuset);
2670 pthread_getaffinity_np(thread, setsize, cpuset);
2671 CPU_FREE(cpuset);
2672 return 0;
2673 }''', dependencies: threads))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002674config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02002675 #include <sys/signalfd.h>
2676 #include <stddef.h>
2677 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002678config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002679 #include <unistd.h>
2680 #include <fcntl.h>
2681 #include <limits.h>
2682
2683 int main(void)
2684 {
2685 int len, fd = 0;
2686 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2687 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2688 return 0;
2689 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002690
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002691config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
2692 #include <sys/mman.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002693 int main(void) {
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002694 return mlockall(MCL_FUTURE);
2695 }'''))
2696
Thomas Hutheea94532021-10-28 20:59:08 +02002697have_l2tpv3 = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002698if get_option('l2tpv3').allowed() and have_system
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002699 have_l2tpv3 = cc.has_type('struct mmsghdr',
2700 prefix: gnu_source_prefix + '''
2701 #include <sys/socket.h>
2702 #include <linux/ip.h>''')
Thomas Hutheea94532021-10-28 20:59:08 +02002703endif
2704config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2705
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002706have_netmap = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002707if get_option('netmap').allowed() and have_system
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002708 have_netmap = cc.compiles('''
2709 #include <inttypes.h>
2710 #include <net/if.h>
2711 #include <net/netmap.h>
2712 #include <net/netmap_user.h>
2713 #if (NETMAP_API < 11) || (NETMAP_API > 15)
2714 #error
2715 #endif
2716 int main(void) { return 0; }''')
2717 if not have_netmap and get_option('netmap').enabled()
2718 error('Netmap headers not available')
2719 endif
2720endif
2721config_host_data.set('CONFIG_NETMAP', have_netmap)
2722
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002723# Work around a system header bug with some kernel/XFS header
2724# versions where they both try to define 'struct fsxattr':
2725# xfs headers will not try to redefine structs from linux headers
2726# if this macro is set.
2727config_host_data.set('HAVE_FSXATTR', cc.links('''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002728 #include <linux/fs.h>
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002729 struct fsxattr foo;
2730 int main(void) {
2731 return 0;
2732 }'''))
2733
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002734# Some versions of Mac OS X incorrectly define SIZE_MAX
2735config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2736 #include <stdint.h>
2737 #include <stdio.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002738 int main(void) {
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002739 return printf("%zu", SIZE_MAX);
2740 }''', args: ['-Werror']))
2741
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002742# See if 64-bit atomic operations are supported.
2743# Note that without __atomic builtins, we can only
2744# assume atomic loads/stores max at pointer size.
2745config_host_data.set('CONFIG_ATOMIC64', cc.links('''
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002746 #include <stdint.h>
2747 int main(void)
2748 {
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002749 uint64_t x = 0, y = 0;
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002750 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
2751 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
2752 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2753 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2754 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2755 return 0;
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002756 }'''))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002757
Richard Henderson6479dd72023-05-24 08:14:41 -07002758has_int128_type = cc.compiles('''
2759 __int128_t a;
2760 __uint128_t b;
2761 int main(void) { b = a; }''')
2762config_host_data.set('CONFIG_INT128_TYPE', has_int128_type)
2763
2764has_int128 = has_int128_type and cc.links('''
Marc-André Lureau848126d2022-02-28 15:49:19 +04002765 __int128_t a;
2766 __uint128_t b;
2767 int main (void) {
2768 a = a + b;
2769 b = a * b;
2770 a = a * a;
2771 return 0;
2772 }''')
Marc-André Lureau848126d2022-02-28 15:49:19 +04002773config_host_data.set('CONFIG_INT128', has_int128)
2774
Richard Henderson6479dd72023-05-24 08:14:41 -07002775if has_int128_type
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002776 # "do we have 128-bit atomics which are handled inline and specifically not
2777 # via libatomic". The reason we can't use libatomic is documented in the
2778 # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002779 # We only care about these operations on 16-byte aligned pointers, so
2780 # force 16-byte alignment of the pointer, which may be greater than
2781 # __alignof(unsigned __int128) for the host.
2782 atomic_test_128 = '''
2783 int main(int ac, char **av) {
Richard Henderson6479dd72023-05-24 08:14:41 -07002784 __uint128_t *p = __builtin_assume_aligned(av[ac - 1], 16);
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002785 p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED);
2786 __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED);
2787 __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2788 return 0;
2789 }'''
2790 has_atomic128 = cc.links(atomic_test_128)
Marc-André Lureau848126d2022-02-28 15:49:19 +04002791
2792 config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
2793
2794 if not has_atomic128
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002795 # Even with __builtin_assume_aligned, the above test may have failed
2796 # without optimization enabled. Try again with optimizations locally
2797 # enabled for the function. See
2798 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389
2799 has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128)
2800 config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt)
Marc-André Lureau848126d2022-02-28 15:49:19 +04002801
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002802 if not has_atomic128_opt
2803 config_host_data.set('CONFIG_CMPXCHG128', cc.links('''
2804 int main(void)
2805 {
Richard Henderson6479dd72023-05-24 08:14:41 -07002806 __uint128_t x = 0, y = 0;
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002807 __sync_val_compare_and_swap_16(&x, y, x);
2808 return 0;
2809 }
2810 '''))
2811 endif
Marc-André Lureau848126d2022-02-28 15:49:19 +04002812 endif
2813endif
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002814
2815config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
2816 #include <sys/auxv.h>
2817 int main(void) {
2818 return getauxval(AT_HWCAP) == 0;
2819 }'''))
2820
Paolo Bonzini0dae95d2022-04-20 17:33:43 +02002821config_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
2822 #include <linux/usbdevice_fs.h>
2823
2824 #ifndef USBDEVFS_GET_CAPABILITIES
2825 #error "USBDEVFS_GET_CAPABILITIES undefined"
2826 #endif
2827
2828 #ifndef USBDEVFS_DISCONNECT_CLAIM
2829 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
2830 #endif
2831
2832 int main(void) { return 0; }'''))
2833
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02002834have_keyring = get_option('keyring') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002835 .require(host_os == 'linux', error_message: 'keyring is only available on Linux') \
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02002836 .require(cc.compiles('''
2837 #include <errno.h>
2838 #include <asm/unistd.h>
2839 #include <linux/keyctl.h>
2840 #include <sys/syscall.h>
2841 #include <unistd.h>
2842 int main(void) {
2843 return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
2844 }'''), error_message: 'keyctl syscall not available on this system').allowed()
2845config_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
2846
Paolo Bonzini622753d2021-11-08 13:38:58 +01002847have_cpuid_h = cc.links('''
2848 #include <cpuid.h>
2849 int main(void) {
2850 unsigned a, b, c, d;
2851 unsigned max = __get_cpuid_max(0, 0);
2852
2853 if (max >= 1) {
2854 __cpuid(1, a, b, c, d);
2855 }
2856
2857 if (max >= 7) {
2858 __cpuid_count(7, 0, a, b, c, d);
2859 }
2860
2861 return 0;
2862 }''')
2863config_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
2864
2865config_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
2866 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
2867 .require(cc.links('''
Paolo Bonzini622753d2021-11-08 13:38:58 +01002868 #include <cpuid.h>
2869 #include <immintrin.h>
Richard Henderson701ea582022-12-03 19:31:12 -06002870 static int __attribute__((target("avx2"))) bar(void *a) {
Paolo Bonzini622753d2021-11-08 13:38:58 +01002871 __m256i x = *(__m256i *)a;
2872 return _mm256_testz_si256(x, x);
2873 }
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002874 int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
Paolo Bonzini622753d2021-11-08 13:38:58 +01002875 '''), error_message: 'AVX2 not available').allowed())
2876
ling xu04ffce12022-11-16 23:29:22 +08002877config_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \
2878 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \
2879 .require(cc.links('''
ling xu04ffce12022-11-16 23:29:22 +08002880 #include <cpuid.h>
2881 #include <immintrin.h>
Richard Hendersondc165fc2023-05-01 22:05:55 +01002882 static int __attribute__((target("avx512bw"))) bar(void *a) {
ling xu04ffce12022-11-16 23:29:22 +08002883 __m512i *x = a;
2884 __m512i res= _mm512_abs_epi8(*x);
2885 return res[1];
2886 }
2887 int main(int argc, char *argv[]) { return bar(argv[0]); }
2888 '''), error_message: 'AVX512BW not available').allowed())
2889
Richard Henderson8d97f282023-06-02 07:43:40 +00002890# For both AArch64 and AArch32, detect if builtins are available.
2891config_host_data.set('CONFIG_ARM_AES_BUILTIN', cc.compiles('''
2892 #include <arm_neon.h>
2893 #ifndef __ARM_FEATURE_AES
2894 __attribute__((target("+crypto")))
2895 #endif
2896 void foo(uint8x16_t *p) { *p = vaesmcq_u8(*p); }
2897 '''))
2898
Paolo Bonzinib87df902021-11-08 13:52:11 +01002899if get_option('membarrier').disabled()
2900 have_membarrier = false
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002901elif host_os == 'windows'
Paolo Bonzinib87df902021-11-08 13:52:11 +01002902 have_membarrier = true
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002903elif host_os == 'linux'
Paolo Bonzinib87df902021-11-08 13:52:11 +01002904 have_membarrier = cc.compiles('''
2905 #include <linux/membarrier.h>
2906 #include <sys/syscall.h>
2907 #include <unistd.h>
2908 #include <stdlib.h>
2909 int main(void) {
2910 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
2911 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
2912 exit(0);
2913 }''')
2914endif
2915config_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
2916 .require(have_membarrier, error_message: 'membarrier system call not available') \
2917 .allowed())
2918
Paolo Bonzini34b52612021-11-08 14:02:42 +01002919have_afalg = get_option('crypto_afalg') \
2920 .require(cc.compiles(gnu_source_prefix + '''
2921 #include <errno.h>
2922 #include <sys/types.h>
2923 #include <sys/socket.h>
2924 #include <linux/if_alg.h>
2925 int main(void) {
2926 int sock;
2927 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
2928 return sock;
2929 }
2930 '''), error_message: 'AF_ALG requested but could not be detected').allowed()
2931config_host_data.set('CONFIG_AF_ALG', have_afalg)
2932
Marc-André Lureau9d734b82022-04-01 15:50:05 +04002933config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
2934 'linux/vm_sockets.h', 'AF_VSOCK',
2935 prefix: '#include <sys/socket.h>',
2936))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002937
Marc-André Lureau8821a382022-02-01 16:53:43 +04002938have_vss = false
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002939have_vss_sdk = false # old xp/2003 SDK
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002940if host_os == 'windows' and 'cpp' in all_languages
Marc-André Lureau8821a382022-02-01 16:53:43 +04002941 have_vss = cxx.compiles('''
2942 #define __MIDL_user_allocate_free_DEFINED__
Marc-André Lureau32478cb2022-02-22 23:40:01 +04002943 #include <vss.h>
Marc-André Lureau8821a382022-02-01 16:53:43 +04002944 int main(void) { return VSS_CTX_BACKUP; }''')
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002945 have_vss_sdk = cxx.has_header('vscoordint.h')
Marc-André Lureau8821a382022-02-01 16:53:43 +04002946endif
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002947config_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
Marc-André Lureau8821a382022-02-01 16:53:43 +04002948
Richard Henderson6391c772022-04-17 11:30:06 -07002949# Older versions of MinGW do not import _lock_file and _unlock_file properly.
2950# This was fixed for v6.0.0 with commit b48e3ac8969d.
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002951if host_os == 'windows'
Richard Henderson6391c772022-04-17 11:30:06 -07002952 config_host_data.set('HAVE__LOCK_FILE', cc.links('''
2953 #include <stdio.h>
2954 int main(void) {
2955 _lock_file(NULL);
2956 _unlock_file(NULL);
2957 return 0;
2958 }''', name: '_lock_file and _unlock_file'))
2959endif
2960
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002961if host_os == 'windows'
Pierrick Bouvierdbd672c2023-02-21 16:30:04 +01002962 mingw_has_setjmp_longjmp = cc.links('''
2963 #include <setjmp.h>
2964 int main(void) {
2965 /*
2966 * These functions are not available in setjmp header, but may be
2967 * available at link time, from libmingwex.a.
2968 */
2969 extern int __mingw_setjmp(jmp_buf);
2970 extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int);
2971 jmp_buf env;
2972 __mingw_setjmp(env);
2973 __mingw_longjmp(env, 0);
2974 }
2975 ''', name: 'mingw setjmp and longjmp')
2976
2977 if cpu == 'aarch64' and not mingw_has_setjmp_longjmp
2978 error('mingw must provide setjmp/longjmp for windows-arm64')
2979 endif
2980endif
2981
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002982########################
2983# Target configuration #
2984########################
2985
Paolo Bonzini2becc362020-02-03 11:42:03 +01002986minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02002987
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02002988config_all_accel = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04002989config_all_devices = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002990config_devices_mak_list = []
2991config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02002992config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002993config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002994
2995disassemblers = {
2996 'alpha' : ['CONFIG_ALPHA_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002997 'avr' : ['CONFIG_AVR_DIS'],
2998 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06002999 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003000 'hppa' : ['CONFIG_HPPA_DIS'],
3001 'i386' : ['CONFIG_I386_DIS'],
3002 'x86_64' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003003 'm68k' : ['CONFIG_M68K_DIS'],
3004 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
3005 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003006 'or1k' : ['CONFIG_OPENRISC_DIS'],
3007 'ppc' : ['CONFIG_PPC_DIS'],
3008 'riscv' : ['CONFIG_RISCV_DIS'],
3009 'rx' : ['CONFIG_RX_DIS'],
3010 's390' : ['CONFIG_S390_DIS'],
3011 'sh4' : ['CONFIG_SH4_DIS'],
3012 'sparc' : ['CONFIG_SPARC_DIS'],
3013 'xtensa' : ['CONFIG_XTENSA_DIS'],
Song Gaoaae17462022-06-06 20:43:06 +08003014 'loongarch' : ['CONFIG_LOONGARCH_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003015}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003016
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02003017have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01003018host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02003019 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01003020 (have_tpm ? ['CONFIG_TPM=y'] : []) + \
Marc-André Lureaucca15752023-08-30 13:38:25 +04003021 (pixman.found() ? ['CONFIG_PIXMAN=y'] : []) + \
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02003022 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02003023 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini88b6e612022-04-20 17:33:40 +02003024 (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01003025 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini1935b7e2024-05-07 14:13:46 +02003026 (fdt.found() ? ['CONFIG_FDT=y'] : []) + \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003027 (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
3028 (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
3029 (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01003030 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003031 (host_os == 'linux' ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman55116962022-06-13 16:26:24 -04003032 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02003033 (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : []) + \
3034 (hv_balloon ? ['CONFIG_HV_BALLOON_POSSIBLE=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01003035
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003036ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003037
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003038default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
3039actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003040fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003041foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04003042 config_target = { 'TARGET_NAME': target.split('-')[0] }
3043 if target.endswith('linux-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003044 if host_os != 'linux'
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003045 if default_targets
3046 continue
3047 endif
3048 error('Target @0@ is only available on a Linux host'.format(target))
3049 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04003050 config_target += { 'CONFIG_LINUX_USER': 'y' }
3051 elif target.endswith('bsd-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003052 if host_os not in bsd_oses
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003053 if default_targets
3054 continue
3055 endif
3056 error('Target @0@ is only available on a BSD host'.format(target))
3057 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04003058 config_target += { 'CONFIG_BSD_USER': 'y' }
3059 elif target.endswith('softmmu')
Philippe Mathieu-Daudébd0c03b2023-06-13 15:33:45 +02003060 config_target += { 'CONFIG_SYSTEM_ONLY': 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04003061 config_target += { 'CONFIG_SOFTMMU': 'y' }
3062 endif
3063 if target.endswith('-user')
3064 config_target += {
3065 'CONFIG_USER_ONLY': 'y',
3066 'CONFIG_QEMU_INTERP_PREFIX':
Paolo Bonzinice6119d2022-04-20 17:33:55 +02003067 get_option('interp_prefix').replace('%M', config_target['TARGET_NAME'])
Paolo Bonzini765686d2020-09-18 06:37:21 -04003068 }
3069 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02003070
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003071 target_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04003072 foreach sym: accelerators
3073 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
3074 config_target += { sym: 'y' }
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02003075 config_all_accel += { sym: 'y' }
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02003076 if target in modular_tcg
3077 config_target += { 'CONFIG_TCG_MODULAR': 'y' }
3078 else
3079 config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
3080 endif
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003081 target_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04003082 endif
3083 endforeach
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003084 if target_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003085 if default_targets
3086 continue
3087 endif
3088 error('No accelerator available for target @0@'.format(target))
3089 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04003090
Alex Bennée812b31d2021-07-07 14:17:43 +01003091 config_target += keyval.load('configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003092 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04003093
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003094 if 'TARGET_NEED_FDT' in config_target and not fdt.found()
Paolo Bonzini9b089d22024-05-08 09:25:48 +02003095 if default_targets
3096 warning('Disabling ' + target + ' due to missing libfdt')
3097 else
3098 fdt_required += target
3099 endif
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003100 continue
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003101 endif
3102
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003103 actual_target_dirs += target
3104
Paolo Bonzinifa731682020-09-21 05:19:07 -04003105 # Add default keys
3106 if 'TARGET_BASE_ARCH' not in config_target
3107 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
3108 endif
3109 if 'TARGET_ABI_DIR' not in config_target
3110 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
3111 endif
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003112 if 'TARGET_BIG_ENDIAN' not in config_target
3113 config_target += {'TARGET_BIG_ENDIAN': 'n'}
3114 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02003115
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003116 foreach k, v: disassemblers
Paolo Bonzini823eb012021-11-08 14:18:17 +01003117 if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003118 foreach sym: v
3119 config_target += { sym: 'y' }
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003120 endforeach
3121 endif
3122 endforeach
3123
Paolo Bonzini859aef02020-08-04 18:14:26 +02003124 config_target_data = configuration_data()
3125 foreach k, v: config_target
3126 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
3127 # do nothing
3128 elif ignored.contains(k)
3129 # do nothing
3130 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003131 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
3132 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02003133 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04003134 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02003135 config_target_data.set_quoted(k, v)
3136 elif v == 'y'
3137 config_target_data.set(k, 1)
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003138 elif v == 'n'
3139 config_target_data.set(k, 0)
Paolo Bonzini859aef02020-08-04 18:14:26 +02003140 else
3141 config_target_data.set(k, v)
3142 endif
3143 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01003144 config_target_data.set('QEMU_ARCH',
3145 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02003146 config_target_h += {target: configure_file(output: target + '-config-target.h',
3147 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003148
3149 if target.endswith('-softmmu')
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003150 target_kconfig += 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'
3151 target_kconfig += 'CONFIG_TARGET_BIG_ENDIAN=' + config_target['TARGET_BIG_ENDIAN']
3152
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003153 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003154 config_devices_mak = target + '-config-devices.mak'
3155 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003156 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01003157 output: config_devices_mak,
3158 depfile: config_devices_mak + '.d',
3159 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01003160 command: [minikconf,
3161 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01003162 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003163 host_kconfig, target_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02003164
3165 config_devices_data = configuration_data()
3166 config_devices = keyval.load(config_devices_mak)
3167 foreach k, v: config_devices
3168 config_devices_data.set(k, 1)
3169 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003170 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02003171 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
3172 configuration: config_devices_data)}
3173 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04003174 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01003175 endif
3176 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003177endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003178target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003179
Paolo Bonzinieed56e92021-11-10 11:01:26 +01003180target_configs_h = []
3181foreach target: target_dirs
3182 target_configs_h += config_target_h[target]
3183 target_configs_h += config_devices_h.get(target, [])
3184endforeach
3185genh += custom_target('config-poison.h',
3186 input: [target_configs_h],
3187 output: 'config-poison.h',
3188 capture: true,
3189 command: [find_program('scripts/make-config-poison.sh'),
3190 target_configs_h])
3191
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003192if fdt_required.length() > 0
3193 error('fdt disabled but required by targets ' + ', '.join(fdt_required))
3194endif
3195
Paolo Bonzinia775c712023-09-08 12:09:22 +02003196###############
3197# Subprojects #
3198###############
Paolo Bonzini4d34a862020-10-05 11:31:15 +02003199
Jagannathan Raman55116962022-06-13 16:26:24 -04003200libvfio_user_dep = not_found
3201if have_system and vfio_user_server_allowed
Paolo Bonzini2019cab2023-05-18 16:50:00 +02003202 libvfio_user_proj = subproject('libvfio-user', required: true)
Paolo Bonzini53283532023-03-30 12:47:23 +02003203 libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
Jagannathan Raman55116962022-06-13 16:26:24 -04003204endif
3205
Paolo Bonzinia775c712023-09-08 12:09:22 +02003206vhost_user = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003207if host_os == 'linux' and have_vhost_user
Paolo Bonzinia775c712023-09-08 12:09:22 +02003208 libvhost_user = subproject('libvhost-user')
3209 vhost_user = libvhost_user.get_variable('vhost_user_dep')
3210endif
3211
3212libvduse = not_found
3213if have_libvduse
3214 libvduse_proj = subproject('libvduse')
3215 libvduse = libvduse_proj.get_variable('libvduse_dep')
3216endif
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003217
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003218#####################
3219# Generated sources #
3220#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003221
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003222genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003223
Marc-André Lureau3f885652019-07-15 18:06:04 +04003224hxtool = find_program('scripts/hxtool')
Marc-André Lureaue2c40122023-01-24 18:00:57 +00003225shaderinclude = find_program('scripts/shaderinclude.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003226qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003227qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
3228 meson.current_source_dir() / 'scripts/qapi/commands.py',
3229 meson.current_source_dir() / 'scripts/qapi/common.py',
3230 meson.current_source_dir() / 'scripts/qapi/error.py',
3231 meson.current_source_dir() / 'scripts/qapi/events.py',
3232 meson.current_source_dir() / 'scripts/qapi/expr.py',
3233 meson.current_source_dir() / 'scripts/qapi/gen.py',
3234 meson.current_source_dir() / 'scripts/qapi/introspect.py',
Markus Armbruster88d357d2023-04-28 12:54:16 +02003235 meson.current_source_dir() / 'scripts/qapi/main.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003236 meson.current_source_dir() / 'scripts/qapi/parser.py',
3237 meson.current_source_dir() / 'scripts/qapi/schema.py',
3238 meson.current_source_dir() / 'scripts/qapi/source.py',
3239 meson.current_source_dir() / 'scripts/qapi/types.py',
3240 meson.current_source_dir() / 'scripts/qapi/visit.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003241 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003242]
3243
3244tracetool = [
3245 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003246 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003247]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003248tracetool_depends = files(
3249 'scripts/tracetool/backend/log.py',
3250 'scripts/tracetool/backend/__init__.py',
3251 'scripts/tracetool/backend/dtrace.py',
3252 'scripts/tracetool/backend/ftrace.py',
3253 'scripts/tracetool/backend/simple.py',
3254 'scripts/tracetool/backend/syslog.py',
3255 'scripts/tracetool/backend/ust.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003256 'scripts/tracetool/format/ust_events_c.py',
3257 'scripts/tracetool/format/ust_events_h.py',
3258 'scripts/tracetool/format/__init__.py',
3259 'scripts/tracetool/format/d.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003260 'scripts/tracetool/format/simpletrace_stap.py',
3261 'scripts/tracetool/format/c.py',
3262 'scripts/tracetool/format/h.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003263 'scripts/tracetool/format/log_stap.py',
3264 'scripts/tracetool/format/stap.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003265 'scripts/tracetool/__init__.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003266)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003267
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003268qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
3269 meson.current_source_dir(),
Paolo Bonzinib0b43232022-04-20 17:33:54 +02003270 get_option('pkgversion'), meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003271qemu_version = custom_target('qemu-version.h',
3272 output: 'qemu-version.h',
3273 command: qemu_version_cmd,
3274 capture: true,
3275 build_by_default: true,
3276 build_always_stale: true)
3277genh += qemu_version
3278
Marc-André Lureau3f885652019-07-15 18:06:04 +04003279hxdep = []
3280hx_headers = [
3281 ['qemu-options.hx', 'qemu-options.def'],
3282 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
3283]
3284if have_system
3285 hx_headers += [
3286 ['hmp-commands.hx', 'hmp-commands.h'],
3287 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
3288 ]
3289endif
3290foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003291 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04003292 input: files(d[0]),
3293 output: d[1],
3294 capture: true,
Marc-André Lureau3f885652019-07-15 18:06:04 +04003295 command: [hxtool, '-h', '@INPUT0@'])
3296endforeach
3297genh += hxdep
3298
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003299###############
3300# Trace files #
3301###############
3302
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003303# TODO: add each directory to the subdirs from its own meson.build, once
3304# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003305trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003306 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003307 'qapi',
3308 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003309 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003310 'util',
Alex Bennée842b42d2022-09-29 12:42:22 +01003311 'gdbstub',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003312]
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003313if have_linux_user
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003314 trace_events_subdirs += [ 'linux-user' ]
3315endif
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003316if have_bsd_user
3317 trace_events_subdirs += [ 'bsd-user' ]
3318endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003319if have_block
3320 trace_events_subdirs += [
3321 'authz',
3322 'block',
3323 'io',
3324 'nbd',
3325 'scsi',
3326 ]
3327endif
3328if have_system
3329 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003330 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003331 'audio',
3332 'backends',
3333 'backends/tpm',
3334 'chardev',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003335 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003336 'hw/9pfs',
3337 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08003338 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003339 'hw/alpha',
3340 'hw/arm',
3341 'hw/audio',
3342 'hw/block',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003343 'hw/char',
3344 'hw/display',
3345 'hw/dma',
Ninad Palsule99f0c042024-01-26 04:49:46 -06003346 'hw/fsi',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003347 'hw/hyperv',
3348 'hw/i2c',
3349 'hw/i386',
3350 'hw/i386/xen',
David Woodhouseaa98ee32023-01-13 19:51:32 +00003351 'hw/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003352 'hw/ide',
3353 'hw/input',
3354 'hw/intc',
3355 'hw/isa',
3356 'hw/mem',
3357 'hw/mips',
3358 'hw/misc',
3359 'hw/misc/macio',
3360 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08003361 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01003362 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02003363 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003364 'hw/nvram',
3365 'hw/pci',
3366 'hw/pci-host',
3367 'hw/ppc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003368 'hw/rtc',
3369 'hw/s390x',
3370 'hw/scsi',
3371 'hw/sd',
BALATON Zoltanad52cfc2021-10-29 23:02:09 +02003372 'hw/sh4',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003373 'hw/sparc',
3374 'hw/sparc64',
3375 'hw/ssi',
3376 'hw/timer',
3377 'hw/tpm',
Jeuk Kimbc4e68d2023-09-06 16:43:48 +09003378 'hw/ufs',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003379 'hw/usb',
3380 'hw/vfio',
3381 'hw/virtio',
3382 'hw/watchdog',
3383 'hw/xen',
3384 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003385 'migration',
3386 'net',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003387 'system',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003388 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05003389 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003390 ]
3391endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003392if have_system or have_user
3393 trace_events_subdirs += [
3394 'accel/tcg',
3395 'hw/core',
3396 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02003397 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003398 'target/hppa',
3399 'target/i386',
3400 'target/i386/kvm',
Tianrui Zhaof8447432024-01-05 15:57:59 +08003401 'target/loongarch',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02003402 'target/mips/tcg',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003403 'target/ppc',
3404 'target/riscv',
3405 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08003406 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003407 'target/sparc',
3408 ]
3409endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003410
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003411###################
3412# Collect sources #
3413###################
3414
3415authz_ss = ss.source_set()
3416blockdev_ss = ss.source_set()
3417block_ss = ss.source_set()
3418chardev_ss = ss.source_set()
3419common_ss = ss.source_set()
3420crypto_ss = ss.source_set()
3421hwcore_ss = ss.source_set()
3422io_ss = ss.source_set()
3423qmp_ss = ss.source_set()
3424qom_ss = ss.source_set()
3425system_ss = ss.source_set()
3426specific_fuzz_ss = ss.source_set()
3427specific_ss = ss.source_set()
3428stub_ss = ss.source_set()
3429trace_ss = ss.source_set()
3430user_ss = ss.source_set()
3431util_ss = ss.source_set()
3432
3433# accel modules
3434qtest_module_ss = ss.source_set()
3435tcg_module_ss = ss.source_set()
3436
3437modules = {}
3438target_modules = {}
3439hw_arch = {}
3440target_arch = {}
3441target_system_arch = {}
3442target_user_arch = {}
3443
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +01003444# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
3445# that is filled in by qapi/.
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003446subdir('qapi')
3447subdir('qobject')
3448subdir('stubs')
3449subdir('trace')
3450subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04003451subdir('qom')
3452subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003453subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04003454subdir('ui')
Alex Bennée842b42d2022-09-29 12:42:22 +01003455subdir('gdbstub')
Philippe Mathieu-Daudé68621262024-04-08 17:53:20 +02003456if have_system
3457 subdir('hw')
3458else
3459 subdir('hw/core')
3460endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003461
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003462if enable_modules
3463 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
Akihiko Odaki414b1802024-05-24 17:00:22 +09003464 modulecommon = declare_dependency(objects: libmodulecommon.extract_all_objects(recursive: false), compile_args: '-DBUILD_DSO')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003465endif
3466
Paolo Bonzini1220f582023-08-30 11:52:43 +02003467qom_ss = qom_ss.apply({})
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003468libqom = static_library('qom', qom_ss.sources() + genh,
3469 dependencies: [qom_ss.dependencies()],
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003470 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003471qom = declare_dependency(objects: libqom.extract_all_objects(recursive: false),
3472 dependencies: qom_ss.dependencies())
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003473
3474event_loop_base = files('event-loop-base.c')
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003475event_loop_base = static_library('event-loop-base',
3476 sources: event_loop_base + genh,
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003477 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003478event_loop_base = declare_dependency(objects: event_loop_base.extract_all_objects(recursive: false),
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003479 dependencies: [qom])
3480
Paolo Bonzini1220f582023-08-30 11:52:43 +02003481stub_ss = stub_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003482
3483util_ss.add_all(trace_ss)
Paolo Bonzini1220f582023-08-30 11:52:43 +02003484util_ss = util_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003485libqemuutil = static_library('qemuutil',
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003486 build_by_default: false,
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003487 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6190fd62024-04-08 17:53:13 +02003488 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003489qemuutil = declare_dependency(link_with: libqemuutil,
Nicolas Saenz Julienne70ac26b2022-04-25 09:57:22 +02003490 sources: genh + version_res,
3491 dependencies: [event_loop_base])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003492
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01003493if have_system or have_user
3494 decodetree = generator(find_program('scripts/decodetree.py'),
3495 output: 'decode-@BASENAME@.c.inc',
3496 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3497 subdir('libdecnumber')
3498 subdir('target')
3499endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003500
Paolo Bonzini478e9432020-08-17 12:47:55 +02003501subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04003502subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04003503subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003504subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04003505subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003506
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003507if have_block
3508 block_ss.add(files(
3509 'block.c',
3510 'blockjob.c',
3511 'job.c',
3512 'qemu-io-cmds.c',
3513 ))
Paolo Bonzini406523f2021-10-13 11:43:54 +02003514 if config_host_data.get('CONFIG_REPLICATION')
3515 block_ss.add(files('replication.c'))
3516 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003517
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003518 subdir('nbd')
3519 subdir('scsi')
3520 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003521
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003522 blockdev_ss.add(files(
3523 'blockdev.c',
3524 'blockdev-nbd.c',
3525 'iothread.c',
3526 'job-qmp.c',
Akihiko Odaki7b1070a2024-05-24 17:00:23 +09003527 ))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003528
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003529 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
3530 # os-win32.c does not
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003531 if host_os == 'windows'
Paolo Bonzinidc495492023-08-30 11:29:54 +02003532 system_ss.add(files('os-win32.c'))
3533 else
3534 blockdev_ss.add(files('os-posix.c'))
3535 endif
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003536endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02003537
Philippe Mathieu-Daudéfe0007f2023-09-14 20:57:12 +02003538common_ss.add(files('cpu-common.c'))
3539specific_ss.add(files('cpu-target.c'))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003540
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003541subdir('system')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003542
Richard Henderson44b99a62021-03-22 12:24:26 +01003543# Work around a gcc bug/misfeature wherein constant propagation looks
3544# through an alias:
3545# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
3546# to guess that a const variable is always zero. Without lto, this is
3547# impossible, as the alias is restricted to page-vary-common.c. Indeed,
3548# without lto, not even the alias is required -- we simply use different
3549# declarations in different compilation units.
3550pagevary = files('page-vary-common.c')
3551if get_option('b_lto')
3552 pagevary_flags = ['-fno-lto']
3553 if get_option('cfi')
3554 pagevary_flags += '-fno-sanitize=cfi-icall'
3555 endif
Thomas Huth54c9b192022-03-30 13:48:08 +02003556 pagevary = static_library('page-vary-common', sources: pagevary + genh,
Richard Henderson44b99a62021-03-22 12:24:26 +01003557 c_args: pagevary_flags)
3558 pagevary = declare_dependency(link_with: pagevary)
3559endif
3560common_ss.add(pagevary)
Philippe Mathieu-Daudé75bbe6a2023-12-07 10:41:27 +01003561specific_ss.add(files('page-target.c', 'page-vary-target.c'))
Richard Henderson6670d4d2021-03-22 12:24:24 +01003562
Marc-André Lureauab318052019-07-24 19:23:16 +04003563subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04003564subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04003565subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003566subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04003567subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04003568subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00003569subdir('semihosting')
Markus Armbrusteraa09b3d2023-01-24 13:19:36 +01003570subdir('stats')
Richard Henderson104cc2c2021-03-08 12:04:33 -08003571subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08003572subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04003573subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003574subdir('plugins')
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003575subdir('ebpf')
3576
3577common_user_inc = []
3578
3579subdir('common-user')
Marc-André Lureaub309c322019-08-18 19:20:37 +04003580subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04003581subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003582
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003583# needed for fuzzing binaries
3584subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003585subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003586
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003587# accel modules
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02003588tcg_real_module_ss = ss.source_set()
3589tcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
3590specific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
3591target_modules += { 'accel' : { 'qtest': qtest_module_ss,
3592 'tcg': tcg_real_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003593
Paolo Bonziniea444d92023-09-08 12:06:12 +02003594##############################################
3595# Internal static_libraries and dependencies #
3596##############################################
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003597
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003598modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003599modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003600modinfo_files = []
3601
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003602block_mods = []
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003603system_mods = []
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003604emulator_modules = []
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003605foreach d, list : modules
Paolo Bonzinief709862023-05-04 10:20:46 +02003606 if not (d == 'block' ? have_block : have_system)
3607 continue
3608 endif
3609
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003610 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003611 if enable_modules
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003612 module_ss.add(modulecommon)
Paolo Bonzini0d665492023-08-31 11:18:24 +02003613 module_ss = module_ss.apply(config_all_devices, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003614 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003615 dependencies: module_ss.dependencies(), pic: true)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003616 if d == 'block'
3617 block_mods += sl
3618 else
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003619 system_mods += sl
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003620 endif
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003621 emulator_modules += shared_module(sl.name(),
3622 name_prefix: '',
Akihiko Odaki414b1802024-05-24 17:00:22 +09003623 objects: sl.extract_all_objects(recursive: false),
3624 dependencies: module_ss.dependencies(),
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003625 install: true,
3626 install_dir: qemu_moddir)
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003627 if module_ss.sources() != []
3628 # FIXME: Should use sl.extract_all_objects(recursive: true) as
3629 # input. Sources can be used multiple times but objects are
3630 # unique when it comes to lookup in compile_commands.json.
3631 # Depnds on a mesion version with
3632 # https://github.com/mesonbuild/meson/pull/8900
3633 modinfo_files += custom_target(d + '-' + m + '.modinfo',
3634 output: d + '-' + m + '.modinfo',
Paolo Bonziniac347112021-07-21 18:51:57 +02003635 input: module_ss.sources() + genh,
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003636 capture: true,
Paolo Bonziniac347112021-07-21 18:51:57 +02003637 command: [modinfo_collect, module_ss.sources()])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003638 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003639 else
3640 if d == 'block'
3641 block_ss.add_all(module_ss)
3642 else
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003643 system_ss.add_all(module_ss)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003644 endif
3645 endif
3646 endforeach
3647endforeach
3648
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003649foreach d, list : target_modules
3650 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003651 if enable_modules
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003652 module_ss.add(modulecommon)
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003653 foreach target : target_dirs
3654 if target.endswith('-softmmu')
3655 config_target = config_target_mak[target]
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003656 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
Philippe Mathieu-Daudé7d7a21b2023-06-13 16:29:11 +02003657 c_args = ['-DCOMPILING_PER_TARGET',
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003658 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3659 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3660 target_module_ss = module_ss.apply(config_target, strict: false)
3661 if target_module_ss.sources() != []
3662 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3663 sl = static_library(module_name,
3664 [genh, target_module_ss.sources()],
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003665 dependencies: target_module_ss.dependencies(),
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003666 include_directories: target_inc,
3667 c_args: c_args,
3668 pic: true)
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003669 system_mods += sl
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003670 emulator_modules += shared_module(sl.name(),
3671 name_prefix: '',
Akihiko Odaki414b1802024-05-24 17:00:22 +09003672 objects: sl.extract_all_objects(recursive: false),
3673 dependencies: target_module_ss.dependencies(),
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003674 install: true,
3675 install_dir: qemu_moddir)
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003676 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
3677 modinfo_files += custom_target(module_name + '.modinfo',
3678 output: module_name + '.modinfo',
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003679 input: target_module_ss.sources() + genh,
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003680 capture: true,
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003681 command: [modinfo_collect, '--target', target, target_module_ss.sources()])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003682 endif
3683 endif
3684 endforeach
3685 else
3686 specific_ss.add_all(module_ss)
3687 endif
3688 endforeach
3689endforeach
3690
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003691if enable_modules
Jose R. Ziviani05d68142022-05-28 00:20:35 +02003692 foreach target : target_dirs
3693 if target.endswith('-softmmu')
3694 config_target = config_target_mak[target]
3695 config_devices_mak = target + '-config-devices.mak'
3696 modinfo_src = custom_target('modinfo-' + target + '.c',
3697 output: 'modinfo-' + target + '.c',
3698 input: modinfo_files,
3699 command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
3700 capture: true)
3701
3702 modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
3703 modinfo_dep = declare_dependency(link_with: modinfo_lib)
3704
3705 arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
3706 hw_arch[arch].add(modinfo_dep)
3707 endif
3708 endforeach
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003709
3710 if emulator_modules.length() > 0
3711 alias_target('modules', emulator_modules)
3712 endif
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003713endif
3714
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003715nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08003716undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003717block_syms = custom_target('block.syms', output: 'block.syms',
3718 input: [libqemuutil, block_mods],
3719 capture: true,
3720 command: [undefsym, nm, '@INPUT@'])
3721qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003722 input: [libqemuutil, system_mods],
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003723 capture: true,
3724 command: [undefsym, nm, '@INPUT@'])
3725
Paolo Bonzini1220f582023-08-30 11:52:43 +02003726authz_ss = authz_ss.apply({})
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003727libauthz = static_library('authz', authz_ss.sources() + genh,
3728 dependencies: [authz_ss.dependencies()],
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003729 build_by_default: false)
3730
Akihiko Odaki414b1802024-05-24 17:00:22 +09003731authz = declare_dependency(objects: libauthz.extract_all_objects(recursive: false),
3732 dependencies: [authz_ss.dependencies(), qom])
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003733
Paolo Bonzini1220f582023-08-30 11:52:43 +02003734crypto_ss = crypto_ss.apply({})
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003735libcrypto = static_library('crypto', crypto_ss.sources() + genh,
3736 dependencies: [crypto_ss.dependencies()],
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003737 build_by_default: false)
3738
Akihiko Odaki414b1802024-05-24 17:00:22 +09003739crypto = declare_dependency(objects: libcrypto.extract_all_objects(recursive: false),
3740 dependencies: [crypto_ss.dependencies(), authz, qom])
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003741
Paolo Bonzini1220f582023-08-30 11:52:43 +02003742io_ss = io_ss.apply({})
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003743libio = static_library('io', io_ss.sources() + genh,
3744 dependencies: [io_ss.dependencies()],
3745 link_with: libqemuutil,
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003746 build_by_default: false)
3747
Akihiko Odaki414b1802024-05-24 17:00:22 +09003748io = declare_dependency(objects: libio.extract_all_objects(recursive: false),
3749 dependencies: [io_ss.dependencies(), crypto, qom])
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003750
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003751libmigration = static_library('migration', sources: migration_files + genh,
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003752 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003753migration = declare_dependency(objects: libmigration.extract_all_objects(recursive: false),
Paolo Bonzini70eb5fd2024-05-24 18:16:08 +02003754 dependencies: [qom, io])
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003755system_ss.add(migration)
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003756
Paolo Bonzini1220f582023-08-30 11:52:43 +02003757block_ss = block_ss.apply({})
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003758libblock = static_library('block', block_ss.sources() + genh,
3759 dependencies: block_ss.dependencies(),
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003760 build_by_default: false)
3761
Akihiko Odaki414b1802024-05-24 17:00:22 +09003762block = declare_dependency(objects: libblock.extract_all_objects(recursive: false),
3763 dependencies: [block_ss.dependencies(), crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003764
Paolo Bonzini1220f582023-08-30 11:52:43 +02003765blockdev_ss = blockdev_ss.apply({})
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003766libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
3767 dependencies: blockdev_ss.dependencies(),
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003768 build_by_default: false)
3769
Akihiko Odaki414b1802024-05-24 17:00:22 +09003770blockdev = declare_dependency(objects: libblockdev.extract_all_objects(recursive: false),
3771 dependencies: [blockdev_ss.dependencies(), block, event_loop_base])
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003772
Paolo Bonzini1220f582023-08-30 11:52:43 +02003773qmp_ss = qmp_ss.apply({})
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003774libqmp = static_library('qmp', qmp_ss.sources() + genh,
3775 dependencies: qmp_ss.dependencies(),
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003776 build_by_default: false)
3777
Akihiko Odaki414b1802024-05-24 17:00:22 +09003778qmp = declare_dependency(objects: libqmp.extract_all_objects(recursive: false),
3779 dependencies: qmp_ss.dependencies())
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003780
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003781libchardev = static_library('chardev', chardev_ss.sources() + genh,
Marc-André Lureau22d1f7a2022-03-23 19:57:12 +04003782 dependencies: chardev_ss.dependencies(),
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003783 build_by_default: false)
3784
Akihiko Odaki414b1802024-05-24 17:00:22 +09003785chardev = declare_dependency(objects: libchardev.extract_all_objects(recursive: false),
3786 dependencies: chardev_ss.dependencies())
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003787
Paolo Bonzini1220f582023-08-30 11:52:43 +02003788hwcore_ss = hwcore_ss.apply({})
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02003789libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02003790 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003791hwcore = declare_dependency(objects: libhwcore.extract_all_objects(recursive: false))
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02003792common_ss.add(hwcore)
3793
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02003794###########
3795# Targets #
3796###########
3797
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003798system_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003799common_ss.add(qom, qemuutil)
3800
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003801common_ss.add_all(when: 'CONFIG_SYSTEM_ONLY', if_true: [system_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01003802common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
3803
Paolo Bonzini0d665492023-08-31 11:18:24 +02003804# Note that this library is never used directly (only through extract_objects)
3805# and is not built by default; therefore, source files not used by the build
3806# configuration will be in build.ninja, but are never built by default.
Paolo Bonzini2becc362020-02-03 11:42:03 +01003807common_all = static_library('common',
3808 build_by_default: false,
Paolo Bonzini0d665492023-08-31 11:18:24 +02003809 sources: common_ss.all_sources() + genh,
Paolo Bonzini9d24fb72021-12-21 16:09:54 +01003810 include_directories: common_user_inc,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09003811 implicit_include_directories: false,
Paolo Bonzini44081552024-05-24 10:56:55 +02003812 dependencies: common_ss.all_dependencies())
Paolo Bonzini2becc362020-02-03 11:42:03 +01003813
Akihiko Odaki956af7d2023-10-09 17:40:51 +01003814feature_to_c = find_program('scripts/feature_to_c.py')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003815
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003816if host_os == 'darwin'
Philippe Mathieu-Daudé30cfa502022-02-15 17:25:03 +01003817 entitlement = find_program('scripts/entitlement.sh')
3818endif
3819
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00003820traceable = []
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04003821emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003822foreach target : target_dirs
3823 config_target = config_target_mak[target]
3824 target_name = config_target['TARGET_NAME']
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003825 target_base_arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02003826 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003827 arch_deps = []
Philippe Mathieu-Daudé7d7a21b2023-06-13 16:29:11 +02003828 c_args = ['-DCOMPILING_PER_TARGET',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003829 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3830 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04003831 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01003832
3833 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003834 if host_os == 'linux'
Paolo Bonzini2becc362020-02-03 11:42:03 +01003835 target_inc += include_directories('linux-headers', is_system: true)
3836 endif
3837 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003838 target_type='system'
Philippe Mathieu-Daudé01c85e62023-10-04 11:06:27 +02003839 t = target_system_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003840 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003841 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003842
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003843 hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
Philippe Mathieu-Daudébf964322023-11-21 13:52:48 +01003844 if hw_arch.has_key(hw_dir)
3845 hw = hw_arch[hw_dir].apply(config_target, strict: false)
3846 arch_srcs += hw.sources()
3847 arch_deps += hw.dependencies()
3848 endif
Marc-André Lureau2c442202019-08-17 13:55:58 +04003849
Paolo Bonzini2becc362020-02-03 11:42:03 +01003850 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003851 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01003852 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04003853 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01003854 target_type='user'
Paolo Bonzinia3a576b2021-12-21 16:23:55 +01003855 target_inc += common_user_inc
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003856 if target_base_arch in target_user_arch
3857 t = target_user_arch[target_base_arch].apply(config_target, strict: false)
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02003858 arch_srcs += t.sources()
3859 arch_deps += t.dependencies()
3860 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01003861 if 'CONFIG_LINUX_USER' in config_target
3862 base_dir = 'linux-user'
Warner Loshe2a74722021-08-03 17:17:17 -06003863 endif
3864 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01003865 base_dir = 'bsd-user'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003866 target_inc += include_directories('bsd-user/' / host_os)
Warner Losh85fc1b52022-01-08 17:27:34 -07003867 target_inc += include_directories('bsd-user/host/' / host_arch)
Warner Loshe2a74722021-08-03 17:17:17 -06003868 dir = base_dir / abi
Warner Losh19bf1292021-11-04 16:34:48 -06003869 arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003870 endif
3871 target_inc += include_directories(
3872 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04003873 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003874 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04003875 if 'CONFIG_LINUX_USER' in config_target
3876 dir = base_dir / abi
3877 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
3878 if config_target.has_key('TARGET_SYSTBL_ABI')
3879 arch_srcs += \
3880 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
3881 extra_args : config_target['TARGET_SYSTBL_ABI'])
3882 endif
3883 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01003884 endif
3885
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003886 if 'TARGET_XML_FILES' in config_target
3887 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
3888 output: target + '-gdbstub-xml.c',
3889 input: files(config_target['TARGET_XML_FILES'].split()),
3890 command: [feature_to_c, '@INPUT@'],
3891 capture: true)
3892 arch_srcs += gdbstub_xml
3893 endif
3894
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003895 t = target_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003896 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003897 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003898
Paolo Bonzini2becc362020-02-03 11:42:03 +01003899 target_common = common_ss.apply(config_target, strict: false)
3900 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02003901 arch_deps += target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003902
Paolo Bonzini2becc362020-02-03 11:42:03 +01003903 target_specific = specific_ss.apply(config_target, strict: false)
3904 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003905 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003906
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02003907 # allow using headers from the dependencies but do not include the sources,
3908 # because this emulator only needs those in "objects". For external
3909 # dependencies, the full dependency is included below in the executable.
3910 lib_deps = []
3911 foreach dep : arch_deps
3912 lib_deps += dep.partial_dependency(compile_args: true, includes: true)
3913 endforeach
3914
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003915 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02003916 sources: arch_srcs + genh,
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02003917 dependencies: lib_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003918 objects: objects,
3919 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003920 c_args: c_args,
Paolo Bonzini44081552024-05-24 10:56:55 +02003921 build_by_default: false)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003922
3923 if target.endswith('-softmmu')
3924 execs = [{
3925 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003926 'win_subsystem': 'console',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003927 'sources': files('system/main.c'),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003928 'dependencies': []
3929 }]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003930 if host_os == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003931 execs += [{
3932 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003933 'win_subsystem': 'windows',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003934 'sources': files('system/main.c'),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003935 'dependencies': []
3936 }]
3937 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02003938 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003939 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
3940 execs += [{
3941 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003942 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003943 'sources': specific_fuzz.sources(),
3944 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003945 }]
3946 endif
3947 else
3948 execs = [{
3949 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003950 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003951 'sources': [],
3952 'dependencies': []
3953 }]
3954 endif
3955 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01003956 exe_name = exe['name']
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003957 if host_os == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01003958 exe_name += '-unsigned'
3959 endif
3960
3961 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09003962 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003963 c_args: c_args,
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02003964 dependencies: arch_deps + exe['dependencies'],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003965 objects: lib.extract_all_objects(recursive: true),
Paolo Bonzini05007252024-03-20 11:28:28 +01003966 link_depends: [block_syms, qemu_syms],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003967 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003968 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003969
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003970 if host_os == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003971 icon = 'pc-bios/qemu.rsrc'
3972 build_input = [emulator, files(icon)]
3973 install_input = [
3974 get_option('bindir') / exe_name,
3975 meson.current_source_dir() / icon
3976 ]
3977 if 'CONFIG_HVF' in config_target
3978 entitlements = 'accel/hvf/entitlements.plist'
3979 build_input += files(entitlements)
3980 install_input += meson.current_source_dir() / entitlements
3981 endif
3982
Alexander Graf8a74ce62021-01-20 23:44:34 +01003983 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003984 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01003985 output: exe['name'],
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003986 command: [entitlement, '@OUTPUT@', '@INPUT@'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003987 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09003988
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003989 meson.add_install_script(entitlement, '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09003990 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003991 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01003992 else
3993 emulators += {exe['name']: emulator}
3994 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003995
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00003996 traceable += [{
3997 'exe': exe['name'],
3998 'probe-prefix': 'qemu.' + target_type + '.' + target_name,
3999 }]
4000
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004001 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01004002endforeach
4003
Paolo Bonzini931049b2020-02-05 09:44:24 +01004004# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004005
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004006if get_option('plugins')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01004007 install_headers('include/qemu/qemu-plugin.h')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004008 if host_os == 'windows'
Greg Manning36fa0772023-11-06 18:51:06 +00004009 # On windows, we want to deliver the qemu_plugin_api.lib file in the qemu installer,
4010 # so that plugin authors can compile against it.
4011 install_data(win32_qemu_plugin_api_lib, install_dir: 'lib')
4012 endif
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01004013endif
4014
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004015subdir('qga')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02004016
Laurent Vivier9755c942020-08-24 17:24:30 +02004017# Don't build qemu-keymap if xkbcommon is not explicitly enabled
4018# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02004019if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04004020 # used for the update-keymaps target, so include rules even if !have_tools
4021 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
4022 dependencies: [qemuutil, xkbcommon], install: have_tools)
4023endif
4024
Paolo Bonzini931049b2020-02-05 09:44:24 +01004025if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004026 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004027 link_args: '@block.syms', link_depends: block_syms,
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004028 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
4029 qemu_io = executable('qemu-io', files('qemu-io.c'),
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004030 link_args: '@block.syms', link_depends: block_syms,
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004031 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01004032 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004033 link_args: '@block.syms', link_depends: block_syms,
Akihiko Odaki7b1070a2024-05-24 17:00:23 +09004034 dependencies: [blockdev, qemuutil, selinux],
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004035 install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004036
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02004037 subdir('storage-daemon')
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004038
4039 foreach exe: [ 'qemu-img', 'qemu-io', 'qemu-nbd', 'qemu-storage-daemon']
4040 traceable += [{
4041 'exe': exe,
4042 'probe-prefix': 'qemu.' + exe.substring(5).replace('-', '_')
4043 }]
4044 endforeach
4045
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04004046 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02004047
Marc-André Lureau157e7b12019-07-15 14:50:58 +04004048 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
4049 dependencies: qemuutil,
4050 install: true)
4051
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004052 if have_vhost_user
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02004053 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02004054 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04004055 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02004056 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01004057 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004058
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004059 if host_os == 'linux'
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004060 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
4061 dependencies: [qemuutil, libcap_ng],
4062 install: true,
4063 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004064
4065 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
4066 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02004067 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004068 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004069 endif
4070
Paolo Bonziniccd250a2021-06-03 12:50:17 +02004071 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04004072 subdir('contrib/ivshmem-client')
4073 subdir('contrib/ivshmem-server')
4074 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01004075endif
4076
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004077if stap.found()
4078 foreach t: traceable
4079 foreach stp: [
4080 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / t['exe'], 'install': false},
4081 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / t['exe'], 'install': true},
4082 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
4083 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
4084 ]
4085 cmd = [
4086 tracetool, '--group=all', '--format=' + stp['fmt'],
4087 '--binary=' + stp['bin'],
4088 '--probe-prefix=' + t['probe-prefix'],
4089 '@INPUT@', '@OUTPUT@'
4090 ]
4091
4092 custom_target(t['exe'] + stp['ext'],
4093 input: trace_events_all,
4094 output: t['exe'] + stp['ext'],
4095 install: stp['install'],
4096 install_dir: get_option('datadir') / 'systemtap/tapset',
4097 command: cmd,
4098 depend_files: tracetool_depends)
4099 endforeach
4100 endforeach
4101endif
4102
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04004103subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004104subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04004105subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02004106subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08004107subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01004108if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04004109 subdir('po')
4110endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004111
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004112if host_machine.system() == 'windows'
4113 nsis_cmd = [
4114 find_program('scripts/nsis.py'),
4115 '@OUTPUT@',
4116 get_option('prefix'),
4117 meson.current_source_dir(),
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02004118 glib_pc.get_variable('bindir'),
Stefan Weil24bdcc92020-11-25 20:18:33 +01004119 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004120 '--',
4121 '-DDISPLAYVERSION=' + meson.project_version(),
4122 ]
4123 if build_docs
4124 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
4125 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01004126 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004127 nsis_cmd += '-DCONFIG_GTK=y'
4128 endif
4129
4130 nsis = custom_target('nsis',
4131 output: 'qemu-setup-' + meson.project_version() + '.exe',
4132 input: files('qemu.nsi'),
4133 build_always_stale: true,
4134 command: nsis_cmd + ['@INPUT@'])
4135 alias_target('installer', nsis)
4136endif
4137
Paolo Bonzinia0c91622020-10-07 11:01:51 -04004138#########################
4139# Configuration summary #
4140#########################
4141
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004142# Build environment
Paolo Bonzinif9332752020-02-03 13:28:38 +01004143summary_info = {}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004144summary_info += {'Build directory': meson.current_build_dir()}
4145summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004146summary_info += {'Download dependencies': get_option('wrap_mode') != 'nodownload'}
4147summary(summary_info, bool_yn: true, section: 'Build environment')
4148
4149# Directories
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004150summary_info += {'Install prefix': get_option('prefix')}
4151summary_info += {'BIOS directory': qemu_datadir}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004152pathsep = host_os == 'windows' ? ';' : ':'
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09004153summary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004154summary_info += {'binary directory': get_option('prefix') / get_option('bindir')}
4155summary_info += {'library directory': get_option('prefix') / get_option('libdir')}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004156summary_info += {'module directory': qemu_moddir}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004157summary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
4158summary_info += {'include directory': get_option('prefix') / get_option('includedir')}
4159summary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004160if host_os != 'windows'
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004161 summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
4162 summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004163else
4164 summary_info += {'local state directory': 'queried at runtime'}
4165endif
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004166summary_info += {'Doc directory': get_option('prefix') / get_option('docdir')}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004167summary(summary_info, bool_yn: true, section: 'Directories')
4168
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004169# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004170summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004171summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004172summary_info += {'sphinx-build': sphinx_build}
Paolo Bonzinib4d61d32023-09-28 12:00:48 +02004173
4174# FIXME: the [binaries] section of machine files, which can be probed
4175# with find_program(), would be great for passing gdb and genisoimage
4176# paths from configure to Meson. However, there seems to be no way to
4177# hide a program (for example if gdb is too old).
Paolo Bonzinia47dd5c2023-09-28 10:44:56 +02004178if config_host.has_key('GDB')
4179 summary_info += {'gdb': config_host['GDB']}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004180endif
Paolo Bonzini40c909f2022-04-20 17:33:49 +02004181summary_info += {'iasl': iasl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004182summary_info += {'genisoimage': config_host['GENISOIMAGE']}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004183if host_os == 'windows' and have_ga
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004184 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004185endif
Thomas Huth58902582022-04-08 18:20:47 +02004186if slirp.found() and have_system
Paolo Bonzini35acbb32021-10-13 13:43:36 +02004187 summary_info += {'smbd': have_slirp_smbd ? smbd_path : false}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004188endif
4189summary(summary_info, bool_yn: true, section: 'Host binaries')
4190
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004191# Configurable features
4192summary_info = {}
4193summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004194summary_info += {'system-mode emulation': have_system}
4195summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004196summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004197summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini60027112022-10-20 14:53:10 +02004198summary_info += {'module support': enable_modules}
4199if enable_modules
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02004200 summary_info += {'alternative module path': get_option('module_upgrades')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004201endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004202summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004203if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02004204 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004205endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02004206summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
4207if 'simple' in get_option('trace_backends')
4208 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004209endif
Marc-André Lureau142ca622021-07-15 11:53:53 +04004210summary_info += {'D-Bus display': dbus_display}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004211summary_info += {'QOM debugging': get_option('qom_cast_debug')}
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004212summary_info += {'Relocatable install': get_option('relocatable')}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004213summary_info += {'vhost-kernel support': have_vhost_kernel}
4214summary_info += {'vhost-net support': have_vhost_net}
4215summary_info += {'vhost-user support': have_vhost_user}
4216summary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004217summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004218summary_info += {'vhost-vdpa support': have_vhost_vdpa}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004219summary_info += {'build guest agent': have_ga}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004220summary(summary_info, bool_yn: true, section: 'Configurable features')
4221
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004222# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004223summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004224summary_info += {'host CPU': cpu}
4225summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01004226summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
4227summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Thomas Huth785abf02023-07-06 08:47:36 +02004228if 'cpp' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004229 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004230else
4231 summary_info += {'C++ compiler': false}
4232endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004233if 'objc' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004234 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004235else
4236 summary_info += {'Objective-C compiler': false}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004237endif
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004238option_cflags = (get_option('debug') ? ['-g'] : [])
4239if get_option('optimization') != 'plain'
4240 option_cflags += ['-O' + get_option('optimization')]
4241endif
4242summary_info += {'CFLAGS': ' '.join(get_option('c_args') + option_cflags)}
Thomas Huth785abf02023-07-06 08:47:36 +02004243if 'cpp' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004244 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args') + option_cflags)}
Paolo Bonzini47b30832020-09-23 05:26:17 -04004245endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004246if 'objc' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004247 summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args') + option_cflags)}
Philippe Mathieu-Daudée910c7d2022-01-08 22:38:55 +01004248endif
Thomas Huth785abf02023-07-06 08:47:36 +02004249link_args = get_option('c_link_args')
Paolo Bonzini47b30832020-09-23 05:26:17 -04004250if link_args.length() > 0
4251 summary_info += {'LDFLAGS': ' '.join(link_args)}
4252endif
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004253summary_info += {'QEMU_CFLAGS': ' '.join(qemu_common_flags + qemu_cflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004254if 'cpp' in all_languages
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004255 summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_common_flags + qemu_cxxflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004256endif
4257if 'objc' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +01004258 summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_common_flags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004259endif
Paolo Bonzinid0651772022-04-20 17:33:34 +02004260summary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)}
Daniele Buonocdad7812020-12-04 18:06:11 -05004261summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004262summary_info += {'PIE': get_option('b_pie')}
Paolo Bonzinie58e55d2023-06-07 10:00:21 +02004263summary_info += {'static build': get_option('prefer_static')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004264summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinib87df902021-11-08 13:52:11 +01004265summary_info += {'membarrier': have_membarrier}
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04004266summary_info += {'debug graph lock': get_option('debug_graph_lock')}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004267summary_info += {'debug stack usage': get_option('debug_stack_usage')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004268summary_info += {'mutex debugging': get_option('debug_mutex')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004269summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01004270summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
ling xu04ffce12022-11-16 23:29:22 +08004271summary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004272summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzini34f983d2023-01-09 15:31:51 +01004273summary_info += {'thread sanitizer': get_option('tsan')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004274summary_info += {'CFI support': get_option('cfi')}
4275if get_option('cfi')
4276 summary_info += {'CFI debug support': get_option('cfi_debug')}
4277endif
4278summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004279summary_info += {'sparse': sparse}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004280summary_info += {'mingw32 support': host_os == 'windows'}
Paolo Bonzini12640f02022-06-06 11:48:47 +02004281summary(summary_info, bool_yn: true, section: 'Compilation')
Alex Bennée49e85652021-02-22 10:14:50 +00004282
4283# snarf the cross-compilation information for tests
Paolo Bonzini12640f02022-06-06 11:48:47 +02004284summary_info = {}
4285have_cross = false
Alex Bennée49e85652021-02-22 10:14:50 +00004286foreach target: target_dirs
Paolo Bonzinic7022a72022-09-29 12:42:07 +01004287 tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak'
Alex Bennée49e85652021-02-22 10:14:50 +00004288 if fs.exists(tcg_mak)
4289 config_cross_tcg = keyval.load(tcg_mak)
Alex Bennée85b141e2022-05-27 16:35:34 +01004290 if 'CC' in config_cross_tcg
Paolo Bonzini12640f02022-06-06 11:48:47 +02004291 summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
4292 have_cross = true
Alex Bennée49e85652021-02-22 10:14:50 +00004293 endif
Paolo Bonzini12640f02022-06-06 11:48:47 +02004294 endif
Alex Bennée49e85652021-02-22 10:14:50 +00004295endforeach
Paolo Bonzini12640f02022-06-06 11:48:47 +02004296if have_cross
4297 summary(summary_info, bool_yn: true, section: 'Cross compilers')
4298endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004299
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004300# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004301summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004302if have_system
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004303 summary_info += {'KVM support': config_all_accel.has_key('CONFIG_KVM')}
4304 summary_info += {'HVF support': config_all_accel.has_key('CONFIG_HVF')}
4305 summary_info += {'WHPX support': config_all_accel.has_key('CONFIG_WHPX')}
4306 summary_info += {'NVMM support': config_all_accel.has_key('CONFIG_NVMM')}
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02004307 summary_info += {'Xen support': xen.found()}
4308 if xen.found()
4309 summary_info += {'xen ctrl version': xen.version()}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004310 endif
Paolo Bonzini0d665492023-08-31 11:18:24 +02004311 summary_info += {'Xen emulation': config_all_devices.has_key('CONFIG_XEN_EMU')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004312endif
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004313summary_info += {'TCG support': config_all_accel.has_key('CONFIG_TCG')}
4314if config_all_accel.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004315 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +01004316 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004317 else
4318 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
4319 endif
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004320 summary_info += {'TCG plugins': get_option('plugins')}
Paolo Bonzini1d558c92023-08-28 11:48:30 +02004321 summary_info += {'TCG debug enabled': get_option('debug_tcg')}
Ilya Leoshkevich1f2355f2024-03-12 01:23:30 +01004322 if have_linux_user or have_bsd_user
4323 summary_info += {'syscall buffer debugging support': get_option('debug_remap')}
4324 endif
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004325endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004326summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004327if have_system
4328 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01004329 summary_info += {'out of process emulation': multiprocess_allowed}
Jagannathan Raman55116962022-06-13 16:26:24 -04004330 summary_info += {'vfio-user server': vfio_user_server_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004331endif
4332summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
4333
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004334# Block layer
4335summary_info = {}
Paolo Bonzini67398252022-10-12 13:19:35 +02004336summary_info += {'coroutine backend': coroutine_backend}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004337summary_info += {'coroutine pool': have_coroutine_pool}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004338if have_block
Paolo Bonzini622d64f2022-04-20 17:33:53 +02004339 summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
4340 summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004341 summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
Christian Schoenebeck38877022023-05-11 16:12:34 +02004342 summary_info += {'VirtFS (9P) support': have_virtfs}
Christian Schoenebeck71d72ec2023-06-26 13:49:06 +02004343 summary_info += {'VirtFS (9P) Proxy Helper support (deprecated)': have_virtfs_proxy_helper}
Paolo Bonzini406523f2021-10-13 11:43:54 +02004344 summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004345 summary_info += {'bochs support': get_option('bochs').allowed()}
4346 summary_info += {'cloop support': get_option('cloop').allowed()}
4347 summary_info += {'dmg support': get_option('dmg').allowed()}
4348 summary_info += {'qcow v1 support': get_option('qcow1').allowed()}
4349 summary_info += {'vdi support': get_option('vdi').allowed()}
Vladimir Sementsov-Ogievskiy11cea422023-04-21 12:27:58 +03004350 summary_info += {'vhdx support': get_option('vhdx').allowed()}
4351 summary_info += {'vmdk support': get_option('vmdk').allowed()}
4352 summary_info += {'vpc support': get_option('vpc').allowed()}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004353 summary_info += {'vvfat support': get_option('vvfat').allowed()}
4354 summary_info += {'qed support': get_option('qed').allowed()}
4355 summary_info += {'parallels support': get_option('parallels').allowed()}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004356 summary_info += {'FUSE exports': fuse}
Xie Yongji2a2359b2022-05-23 16:46:09 +08004357 summary_info += {'VDUSE block exports': have_vduse_blk_export}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004358endif
4359summary(summary_info, bool_yn: true, section: 'Block layer support')
4360
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004361# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004362summary_info = {}
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02004363summary_info += {'TLS priority': get_option('tls_priority')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004364summary_info += {'GNUTLS support': gnutls}
4365if gnutls.found()
4366 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
4367endif
4368summary_info += {'libgcrypt': gcrypt}
4369summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02004370if nettle.found()
4371 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004372endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08004373summary_info += {'SM4 ALG support': crypto_sm4}
Paolo Bonzini34b52612021-11-08 14:02:42 +01004374summary_info += {'AF_ALG support': have_afalg}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004375summary_info += {'rng-none': get_option('rng_none')}
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02004376summary_info += {'Linux keyring': have_keyring}
Thomas Huthc64023b2023-08-24 11:42:08 +02004377summary_info += {'Linux keyutils': keyutils}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004378summary(summary_info, bool_yn: true, section: 'Crypto')
4379
Thomas Huth9e48afa2023-06-02 19:18:30 +02004380# UI
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004381summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004382if host_os == 'darwin'
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03004383 summary_info += {'Cocoa support': cocoa}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004384endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004385summary_info += {'SDL support': sdl}
4386summary_info += {'SDL image support': sdl_image}
4387summary_info += {'GTK support': gtk}
4388summary_info += {'pixman': pixman}
4389summary_info += {'VTE support': vte}
Kshitij Suri95f85102022-04-08 07:13:34 +00004390summary_info += {'PNG support': png}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004391summary_info += {'VNC support': vnc}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01004392if vnc.found()
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004393 summary_info += {'VNC SASL support': sasl}
4394 summary_info += {'VNC JPEG support': jpeg}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004395endif
Thomas Huth9e48afa2023-06-02 19:18:30 +02004396summary_info += {'spice protocol support': spice_protocol}
4397if spice_protocol.found()
4398 summary_info += {' spice server support': spice}
4399endif
4400summary_info += {'curses support': curses}
4401summary_info += {'brlapi support': brlapi}
4402summary(summary_info, bool_yn: true, section: 'User interface')
4403
Alex Bennéef705c1f2023-12-22 11:48:46 +00004404# Graphics backends
4405summary_info = {}
4406summary_info += {'VirGL support': virgl}
4407summary_info += {'Rutabaga support': rutabaga}
4408summary(summary_info, bool_yn: true, section: 'Graphics backends')
4409
Thomas Huthaece7232023-06-02 19:18:32 +02004410# Audio backends
4411summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004412if host_os not in ['darwin', 'haiku', 'windows']
Paolo Bonzini87430d52021-10-07 15:06:09 +02004413 summary_info += {'OSS support': oss}
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02004414 summary_info += {'sndio support': sndio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004415elif host_os == 'darwin'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004416 summary_info += {'CoreAudio support': coreaudio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004417elif host_os == 'windows'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004418 summary_info += {'DirectSound support': dsound}
4419endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004420if host_os == 'linux'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004421 summary_info += {'ALSA support': alsa}
4422 summary_info += {'PulseAudio support': pulse}
4423endif
Marc-André Lureau20c51242023-05-06 20:37:26 +04004424summary_info += {'PipeWire support': pipewire}
Paolo Bonzini87430d52021-10-07 15:06:09 +02004425summary_info += {'JACK support': jack}
Thomas Huthaece7232023-06-02 19:18:32 +02004426summary(summary_info, bool_yn: true, section: 'Audio backends')
4427
Thomas Huthc3527c52023-06-02 19:18:31 +02004428# Network backends
Thomas Huth9e48afa2023-06-02 19:18:30 +02004429summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004430if host_os == 'darwin'
Thomas Huth9e48afa2023-06-02 19:18:30 +02004431 summary_info += {'vmnet.framework support': vmnet}
4432endif
Ilya Maximetscb039ef2023-09-13 20:34:37 +02004433summary_info += {'AF_XDP support': libxdp}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004434summary_info += {'slirp support': slirp}
Paolo Bonzinie1723992021-10-07 15:08:21 +02004435summary_info += {'vde support': vde}
Paolo Bonzini837b84b2021-10-07 15:08:22 +02004436summary_info += {'netmap support': have_netmap}
Thomas Hutheea94532021-10-28 20:59:08 +02004437summary_info += {'l2tpv3 support': have_l2tpv3}
Thomas Huthc3527c52023-06-02 19:18:31 +02004438summary(summary_info, bool_yn: true, section: 'Network backends')
4439
4440# Libraries
4441summary_info = {}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004442summary_info += {'libtasn1': tasn1}
4443summary_info += {'PAM': pam}
4444summary_info += {'iconv support': iconv}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004445summary_info += {'blkio support': blkio}
4446summary_info += {'curl support': curl}
4447summary_info += {'Multipath support': mpathpersist}
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02004448summary_info += {'Linux AIO support': libaio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004449summary_info += {'Linux io_uring support': linux_io_uring}
4450summary_info += {'ATTR/XATTR support': libattr}
Paolo Bonzini3730a732022-04-20 17:33:41 +02004451summary_info += {'RDMA support': rdma}
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01004452summary_info += {'fdt support': fdt_opt == 'internal' ? 'internal' : fdt}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004453summary_info += {'libcap-ng support': libcap_ng}
4454summary_info += {'bpf support': libbpf}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004455summary_info += {'rbd support': rbd}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004456summary_info += {'smartcard support': cacard}
4457summary_info += {'U2F support': u2f}
4458summary_info += {'libusb': libusb}
4459summary_info += {'usb net redir': usbredir}
Paolo Bonzini88b6e612022-04-20 17:33:40 +02004460summary_info += {'OpenGL support (epoxy)': opengl}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004461summary_info += {'GBM': gbm}
4462summary_info += {'libiscsi support': libiscsi}
4463summary_info += {'libnfs support': libnfs}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004464if host_os == 'windows'
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004465 if have_ga
Marc-André Lureau8821a382022-02-01 16:53:43 +04004466 summary_info += {'QGA VSS support': have_qga_vss}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01004467 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01004468endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004469summary_info += {'seccomp support': seccomp}
4470summary_info += {'GlusterFS support': glusterfs}
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02004471summary_info += {'hv-balloon support': hv_balloon}
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01004472summary_info += {'TPM support': have_tpm}
Thomas Huthe6a52b32021-12-09 15:48:01 +01004473summary_info += {'libssh support': libssh}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004474summary_info += {'lzo support': lzo}
4475summary_info += {'snappy support': snappy}
4476summary_info += {'bzip2 support': libbzip2}
4477summary_info += {'lzfse support': liblzfse}
4478summary_info += {'zstd support': zstd}
Yuan Liub844a2c2024-06-10 18:21:06 +08004479summary_info += {'Query Processing Library support': qpl}
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01004480summary_info += {'UADK Library support': uadk}
Paolo Bonzini488a8c72021-12-21 12:38:27 +01004481summary_info += {'NUMA host support': numa}
Thomas Huth83602082022-05-16 16:58:23 +02004482summary_info += {'capstone': capstone}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004483summary_info += {'libpmem support': libpmem}
4484summary_info += {'libdaxctl support': libdaxctl}
4485summary_info += {'libudev': libudev}
4486# Dummy dependency, keep .found()
Max Reitzdf4ea702020-10-27 20:05:46 +01004487summary_info += {'FUSE lseek': fuse_lseek.found()}
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004488summary_info += {'selinux': selinux}
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01004489summary_info += {'libdw': libdw}
Ilya Leoshkevicha1a98002024-02-06 01:22:03 +01004490if host_os == 'freebsd'
4491 summary_info += {'libinotify-kqueue': inotify}
4492endif
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01004493summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004494
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004495if host_arch == 'unknown'
Paolo Bonzinif9332752020-02-03 13:28:38 +01004496 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004497 warning('UNSUPPORTED HOST CPU')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004498 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004499 message('Support for CPU host architecture ' + cpu + ' is not currently')
4500 message('maintained. The QEMU project does not guarantee that QEMU will')
4501 message('compile or work on this host CPU. You can help by volunteering')
4502 message('to maintain it and providing a build host for our continuous')
4503 message('integration setup.')
4504 if get_option('tcg').allowed() and target_dirs.length() > 0
4505 message()
4506 message('configure has succeeded and you can continue to build, but')
4507 message('QEMU will use a slow interpreter to emulate the target CPU.')
4508 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01004509endif
4510
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004511if not supported_oses.contains(host_os)
Paolo Bonzinif9332752020-02-03 13:28:38 +01004512 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004513 warning('UNSUPPORTED HOST OS')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004514 message()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004515 message('Support for host OS ' + host_os + 'is not currently maintained.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004516 message('configure has succeeded and you can continue to build, but')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004517 message('the QEMU project does not guarantee that QEMU will compile or')
4518 message('work on this operating system. You can help by volunteering')
4519 message('to maintain it and providing a build host for our continuous')
4520 message('integration setup. This will ensure that future versions of QEMU')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004521 message('will keep working on ' + host_os + '.')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004522endif
4523
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004524if host_arch == 'unknown' or not supported_oses.contains(host_os)
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004525 message()
4526 message('If you want to help supporting QEMU on this platform, please')
4527 message('contact the developers at qemu-devel@nongnu.org.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004528endif
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004529
4530actually_reloc = get_option('relocatable')
4531# check if get_relocated_path() is actually able to relocate paths
4532if get_option('relocatable') and \
4533 not (get_option('prefix') / get_option('bindir')).startswith(get_option('prefix') / '')
4534 message()
4535 warning('bindir not included within prefix, the installation will not be relocatable.')
4536 actually_reloc = false
4537endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004538if not actually_reloc and (host_os == 'windows' or get_option('relocatable'))
4539 if host_os == 'windows'
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004540 message()
4541 warning('Windows installs should usually be relocatable.')
4542 endif
4543 message()
4544 message('QEMU will have to be installed under ' + get_option('prefix') + '.')
4545 message('Use --disable-relocatable to remove this warning.')
4546endif