blob: d1b807aa53f9328c38590b3138f113fafa067371 [file] [log] [blame]
Paolo Bonzini07f0d322024-10-03 16:28:43 +03001project('qemu', ['c'], meson_version: '>=1.5.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
Paolo Bonzinicb7ada52024-11-12 11:52:23 +01006meson.add_devenv({ 'MESON_BUILD_ROOT' : meson.project_build_root() })
7
Thomas Huthe2870722022-03-10 08:50:48 +01008add_test_setup('quick', exclude_suites: ['slow', 'thorough'], is_default: true)
9add_test_setup('slow', exclude_suites: ['thorough'], env: ['G_TEST_SLOW=1', 'SPEED=slow'])
10add_test_setup('thorough', env: ['G_TEST_SLOW=1', 'SPEED=thorough'])
Paolo Bonzini3d2f73e2021-02-11 06:15:12 -050011
Akihiko Odakicf60ccc2022-06-24 23:50:37 +090012meson.add_postconf_script(find_program('scripts/symlink-install-tree.py'))
13
Paolo Bonziniea444d92023-09-08 12:06:12 +020014####################
15# Global variables #
16####################
17
Paolo Bonzinia5665052019-06-10 12:05:14 +020018not_found = dependency('', required: false)
Paolo Bonzini654d6b02021-02-09 14:59:26 +010019keyval = import('keyval')
Paolo Bonzinibe3fc972024-10-15 10:08:57 +020020rust = import('rust')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040021ss = import('sourceset')
Richard Henderson8b18cdb2020-09-13 12:19:25 -070022fs = import('fs')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040023
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +010024host_os = host_machine.system()
Paolo Bonzinia5665052019-06-10 12:05:14 +020025config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +010026
Yonggang Luoe3667662020-10-16 06:06:25 +080027# Temporary directory used for files created while
28# configure runs. Since it is in the build directory
29# we can safely blow away any previous version of it
30# (and we need not jump through hoops to try to delete
31# it when configure exits.)
32tmpdir = meson.current_build_dir() / 'meson-private/temp'
Marc-André Lureau8fe11232020-09-11 14:42:48 +020033
34if get_option('qemu_suffix').startswith('/')
35 error('qemu_suffix cannot start with a /')
36endif
37
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040038qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
Marc-André Lureauab4c0992020-08-26 15:04:16 +040039qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040040qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040041qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
42
43qemu_desktopdir = get_option('datadir') / 'applications'
44qemu_icondir = get_option('datadir') / 'icons'
45
Paolo Bonzini859aef02020-08-04 18:14:26 +020046genh = []
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +010047qapi_trace_events = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020048
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020049bsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin']
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040050supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Philippe Mathieu-Daudé278c1bc2023-06-27 16:32:34 +020051supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
Richard Henderson6d0b52e2022-10-17 08:00:57 +030052 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64']
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040053
54cpu = host_machine.cpu_family()
Richard Hendersonc94c2392021-11-16 10:50:42 +010055
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020056target_dirs = config_host['TARGET_DIRS'].split()
Paolo Bonzini44458a62023-09-08 12:06:57 +020057
Paolo Bonzinie2b39052024-10-18 19:33:22 +020058# type of binaries to build
59have_linux_user = false
60have_bsd_user = false
61have_system = false
62foreach target : target_dirs
63 have_linux_user = have_linux_user or target.endswith('linux-user')
64 have_bsd_user = have_bsd_user or target.endswith('bsd-user')
65 have_system = have_system or target.endswith('-softmmu')
66endforeach
67have_user = have_linux_user or have_bsd_user
68
Paolo Bonzini44458a62023-09-08 12:06:57 +020069############
70# Programs #
71############
72
73sh = find_program('sh')
74python = import('python').find_installation()
75
76cc = meson.get_compiler('c')
77all_languages = ['c']
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +010078if host_os == 'windows' and add_languages('cpp', required: false, native: false)
Paolo Bonzini44458a62023-09-08 12:06:57 +020079 all_languages += ['cpp']
80 cxx = meson.get_compiler('cpp')
81endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +010082if host_os == 'darwin' and \
Peter Maydell2ef938a2024-03-11 13:33:34 +000083 add_languages('objc', required: true, native: false)
Paolo Bonzini44458a62023-09-08 12:06:57 +020084 all_languages += ['objc']
85 objc = meson.get_compiler('objc')
86endif
Paolo Bonzinie2b39052024-10-18 19:33:22 +020087
88have_rust = add_languages('rust', native: false,
89 required: get_option('rust').disable_auto_if(not have_system))
90have_rust = have_rust and add_languages('rust', native: true,
91 required: get_option('rust').disable_auto_if(not have_system))
92if have_rust
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +030093 rustc = meson.get_compiler('rust')
Paolo Bonzini4fe14692024-10-15 09:50:02 +020094 if rustc.version().version_compare('<1.63.0')
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +030095 if get_option('rust').enabled()
Paolo Bonzini4fe14692024-10-15 09:50:02 +020096 error('rustc version ' + rustc.version() + ' is unsupported. Please upgrade to at least 1.63.0')
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +030097 else
Paolo Bonzini4fe14692024-10-15 09:50:02 +020098 warning('rustc version ' + rustc.version() + ' is unsupported, disabling Rust compilation.')
99 message('Please upgrade to at least 1.63.0 to use Rust.')
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +0300100 have_rust = false
101 endif
102 endif
103endif
Paolo Bonzini44458a62023-09-08 12:06:57 +0200104
Paolo Bonzinic2988df2024-10-15 15:00:41 +0200105if have_rust
106 bindgen = find_program('bindgen', required: get_option('rust'))
107 if not bindgen.found() or bindgen.version().version_compare('<0.60.0')
108 if get_option('rust').enabled()
109 error('bindgen version ' + bindgen.version() + ' is unsupported. You can install a new version with "cargo install bindgen-cli"')
110 else
111 if bindgen.found()
112 warning('bindgen version ' + bindgen.version() + ' is unsupported, disabling Rust compilation.')
113 else
114 warning('bindgen not found, disabling Rust compilation.')
115 endif
116 message('To use Rust you can install a new version with "cargo install bindgen-cli"')
117 have_rust = false
118 endif
119 endif
120endif
121
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +0200122if have_rust
Paolo Bonzini97ed1e92024-11-07 10:02:15 +0100123 rustc_args = [find_program('scripts/rust/rustc_args.py'),
Paolo Bonzini90868c32024-11-06 13:03:45 +0100124 '--rustc-version', rustc.version(),
125 '--workspace', meson.project_source_root() / 'rust']
Paolo Bonzinide98c172024-11-07 10:14:49 +0100126 if get_option('strict_rust_lints')
127 rustc_args += ['--strict-lints']
128 endif
129
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +0200130 rustfmt = find_program('rustfmt', required: false)
Paolo Bonzinif3a6e9b2024-11-12 11:54:11 +0100131
Paolo Bonzini90868c32024-11-06 13:03:45 +0100132 rustc_lint_args = run_command(rustc_args, '--lints',
133 capture: true, check: true).stdout().strip().splitlines()
Paolo Bonzinif3a6e9b2024-11-12 11:54:11 +0100134
Paolo Bonzinif3a6e9b2024-11-12 11:54:11 +0100135 # Apart from procedural macros, our Rust executables will often link
136 # with C code, so include all the libraries that C code needs. This
137 # is safe; https://github.com/rust-lang/rust/pull/54675 says that
138 # passing -nodefaultlibs to the linker "was more ideological to
139 # start with than anything".
140 add_project_arguments(rustc_lint_args +
141 ['--cfg', 'MESON', '-C', 'default-linker-libraries'],
142 native: false, language: 'rust')
143 add_project_arguments(rustc_lint_args + ['--cfg', 'MESON'],
144 native: true, language: 'rust')
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +0200145endif
146
Paolo Bonzini44458a62023-09-08 12:06:57 +0200147dtrace = not_found
148stap = not_found
149if 'dtrace' in get_option('trace_backends')
150 dtrace = find_program('dtrace', required: true)
151 stap = find_program('stap', required: false)
152 if stap.found()
153 # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
154 # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
155 # instead. QEMU --enable-modules depends on this because the SystemTap
156 # semaphores are linked into the main binary and not the module's shared
157 # object.
158 add_global_arguments('-DSTAP_SDT_V2',
159 native: false, language: all_languages)
160 endif
161endif
162
163if get_option('iasl') == ''
164 iasl = find_program('iasl', required: false)
165else
166 iasl = find_program(get_option('iasl'), required: true)
167endif
168
Xianglai Lib883fb92024-07-24 10:22:45 +0800169edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu', 'riscv64-softmmu', 'loongarch64-softmmu' ]
Paolo Bonzini44458a62023-09-08 12:06:57 +0200170unpack_edk2_blobs = false
171foreach target : edk2_targets
172 if target in target_dirs
173 bzip2 = find_program('bzip2', required: get_option('install_blobs'))
174 unpack_edk2_blobs = bzip2.found()
175 break
176 endif
177endforeach
178
179#####################
180# Option validation #
181#####################
182
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100183# Fuzzing
184if get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
185 not cc.links('''
186 #include <stdint.h>
187 #include <sys/types.h>
188 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
189 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
190 ''',
191 args: ['-Werror', '-fsanitize=fuzzer'])
192 error('Your compiler does not support -fsanitize=fuzzer')
193endif
194
195# Tracing backends
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100196if 'ftrace' in get_option('trace_backends') and host_os != 'linux'
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100197 error('ftrace is supported only on Linux')
198endif
199if 'syslog' in get_option('trace_backends') and not cc.compiles('''
200 #include <syslog.h>
201 int main(void) {
202 openlog("qemu", LOG_PID, LOG_DAEMON);
203 syslog(LOG_INFO, "configure");
204 return 0;
205 }''')
206 error('syslog is not supported on this system')
207endif
208
209# Miscellaneous Linux-only features
210get_option('mpath') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100211 .require(host_os == 'linux', error_message: 'Multipath is supported only on Linux')
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100212
213multiprocess_allowed = get_option('multiprocess') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100214 .require(host_os == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100215 .allowed()
216
217vfio_user_server_allowed = get_option('vfio_user_server') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100218 .require(host_os == 'linux', error_message: 'vfio-user server is supported only on Linux') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100219 .allowed()
220
221have_tpm = get_option('tpm') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100222 .require(host_os != 'windows', error_message: 'TPM emulation only available on POSIX systems') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100223 .allowed()
224
225# vhost
226have_vhost_user = get_option('vhost_user') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100227 .disable_auto_if(host_os != 'linux') \
228 .require(host_os != 'windows',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100229 error_message: 'vhost-user is not available on Windows').allowed()
230have_vhost_vdpa = get_option('vhost_vdpa') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100231 .require(host_os == 'linux',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100232 error_message: 'vhost-vdpa is only available on Linux').allowed()
233have_vhost_kernel = get_option('vhost_kernel') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100234 .require(host_os == 'linux',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100235 error_message: 'vhost-kernel is only available on Linux').allowed()
236have_vhost_user_crypto = get_option('vhost_crypto') \
237 .require(have_vhost_user,
238 error_message: 'vhost-crypto requires vhost-user to be enabled').allowed()
239
240have_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel
241
242have_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed()
243have_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed()
244have_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed()
245have_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa
246
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200247have_tools = get_option('tools') \
248 .disable_auto_if(not have_system) \
249 .allowed()
250have_ga = get_option('guest_agent') \
251 .disable_auto_if(not have_system and not have_tools) \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100252 .require(host_os in ['sunos', 'linux', 'windows', 'freebsd', 'netbsd', 'openbsd'],
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200253 error_message: 'unsupported OS for QEMU guest agent') \
254 .allowed()
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100255have_block = have_system or have_tools
256
Paolo Bonzini60027112022-10-20 14:53:10 +0200257enable_modules = get_option('modules') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100258 .require(host_os != 'windows',
Paolo Bonzini60027112022-10-20 14:53:10 +0200259 error_message: 'Modules are not available for Windows') \
260 .require(not get_option('prefer_static'),
261 error_message: 'Modules are incompatible with static linking') \
262 .allowed()
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200263
Paolo Bonziniea444d92023-09-08 12:06:12 +0200264#######################################
265# Variables for host and accelerators #
266#######################################
267
Paolo Bonzini823eb012021-11-08 14:18:17 +0100268if cpu not in supported_cpus
269 host_arch = 'unknown'
270elif cpu == 'x86'
271 host_arch = 'i386'
Richard Henderson0e3ed772021-12-31 05:25:11 +0000272elif cpu == 'mips64'
273 host_arch = 'mips'
Philippe Mathieu-Daudé278c1bc2023-06-27 16:32:34 +0200274elif cpu in ['riscv32', 'riscv64']
275 host_arch = 'riscv'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100276else
277 host_arch = cpu
278endif
279
Richard Henderson33614fa2025-02-03 12:28:59 -0800280if cpu == 'x86'
281 kvm_targets = ['i386-softmmu']
282elif cpu == 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400283 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
284elif cpu == 'aarch64'
285 kvm_targets = ['aarch64-softmmu']
286elif cpu == 's390x'
287 kvm_targets = ['s390x-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800288elif cpu == 'ppc'
289 kvm_targets = ['ppc-softmmu']
290elif cpu == 'ppc64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400291 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800292elif cpu == 'mips'
293 kvm_targets = ['mips-softmmu', 'mipsel-softmmu']
294elif cpu == 'mips64'
Huacai Chenfbc58842020-10-07 16:39:28 +0800295 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800296elif cpu == 'riscv32'
Philippe Mathieu-Daudé4de81092023-06-27 16:32:35 +0200297 kvm_targets = ['riscv32-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800298elif cpu == 'riscv64'
Philippe Mathieu-Daudé4de81092023-06-27 16:32:35 +0200299 kvm_targets = ['riscv64-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800300elif cpu == 'loongarch64'
Tianrui Zhao714b03c2024-01-05 15:58:04 +0800301 kvm_targets = ['loongarch64-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400302else
303 kvm_targets = []
304endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400305accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alexander Graf844a06b2021-09-16 17:54:02 +0200306
Richard Henderson807a85d2025-02-04 08:16:36 -0800307if cpu == 'x86'
308 xen_targets = ['i386-softmmu']
309elif cpu == 'x86_64'
Paolo Bonzini16b62732023-12-09 15:31:15 +0100310 xen_targets = ['i386-softmmu', 'x86_64-softmmu']
Richard Henderson807a85d2025-02-04 08:16:36 -0800311elif cpu == 'arm'
312 # i386 emulator provides xenpv machine type for multiple architectures
313 xen_targets = ['i386-softmmu']
314elif cpu == 'aarch64'
Paolo Bonzini16b62732023-12-09 15:31:15 +0100315 # i386 emulator provides xenpv machine type for multiple architectures
316 xen_targets = ['i386-softmmu', 'x86_64-softmmu', 'aarch64-softmmu']
317else
318 xen_targets = []
319endif
320accelerator_targets += { 'CONFIG_XEN': xen_targets }
321
Richard Henderson83ef4862025-02-04 08:20:42 -0800322if cpu == 'aarch64'
Alexander Graf844a06b2021-09-16 17:54:02 +0200323 accelerator_targets += {
324 'CONFIG_HVF': ['aarch64-softmmu']
325 }
Richard Henderson83ef4862025-02-04 08:20:42 -0800326elif cpu == 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400327 accelerator_targets += {
Paolo Bonzini8a199802020-09-18 05:37:01 -0400328 'CONFIG_HVF': ['x86_64-softmmu'],
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200329 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400330 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
331 }
332endif
333
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400334##################
335# Compiler flags #
336##################
337
Paolo Bonzini13f60de2022-10-20 14:34:27 +0200338foreach lang : all_languages
339 compiler = meson.get_compiler(lang)
340 if compiler.get_id() == 'gcc' and compiler.version().version_compare('>=7.4')
341 # ok
342 elif compiler.get_id() == 'clang' and compiler.compiles('''
343 #ifdef __apple_build_version__
Thomas Huth4e035202024-11-26 09:10:54 +0100344 # if __clang_major__ < 15 || (__clang_major__ == 15 && __clang_minor__ < 0)
345 # error You need at least XCode Clang v15.0 to compile QEMU
Paolo Bonzini13f60de2022-10-20 14:34:27 +0200346 # endif
347 #else
348 # if __clang_major__ < 10 || (__clang_major__ == 10 && __clang_minor__ < 0)
349 # error You need at least Clang v10.0 to compile QEMU
350 # endif
351 #endif''')
352 # ok
353 else
Thomas Huth4e035202024-11-26 09:10:54 +0100354 error('You either need GCC v7.4 or Clang v10.0 (or XCode Clang v15.0) to compile QEMU')
Paolo Bonzini13f60de2022-10-20 14:34:27 +0200355 endif
356endforeach
357
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200358# default flags for all hosts
359# We use -fwrapv to tell the compiler that we require a C dialect where
360# left shift of signed integers is well defined and has the expected
361# 2s-complement style results. (Both clang and gcc agree that it
362# provides these semantics.)
363
364qemu_common_flags = [
365 '-D_GNU_SOURCE', '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE_SOURCE',
366 '-fno-strict-aliasing', '-fno-common', '-fwrapv' ]
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200367qemu_cflags = []
Paolo Bonzini911d4ca2022-10-12 12:46:23 +0200368qemu_ldflags = []
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100369
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100370if host_os == 'darwin'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200371 # Disable attempts to use ObjectiveC features in os/object.h since they
372 # won't work when we're compiling with gcc as a C compiler.
Alexander Graf2fc36532023-08-30 16:14:14 +0000373 if compiler.get_id() == 'gcc'
374 qemu_common_flags += '-DOS_OBJECT_USE_OBJC=0'
375 endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100376elif host_os == 'sunos'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200377 # needed for CMSG_ macros in sys/socket.h
378 qemu_common_flags += '-D_XOPEN_SOURCE=600'
379 # needed for TIOCWIN* defines in termios.h
380 qemu_common_flags += '-D__EXTENSIONS__'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100381elif host_os == 'haiku'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200382 qemu_common_flags += ['-DB_USE_POSITIVE_POSIX_ERRORS', '-D_BSD_SOURCE', '-fPIC']
Pierrick Bouvier923710b2025-01-16 16:02:54 +0000383elif host_os == 'windows'
384 # plugins use delaylib, and clang needs to be used with lld to make it work.
385 if compiler.get_id() == 'clang' and compiler.get_linker_id() != 'ld.lld'
386 error('On windows, you need to use lld with clang - use msys2 clang64/clangarm64 env')
387 endif
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200388endif
389
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200390# Choose instruction set (currently x86-only)
391
392qemu_isa_flags = []
393
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200394# __sync_fetch_and_and requires at least -march=i486. Many toolchains
395# use i686 as default anyway, but for those that don't, an explicit
396# specification is necessary
397if host_arch == 'i386' and not cc.links('''
398 static int sfaa(int *ptr)
399 {
400 return __sync_fetch_and_and(ptr, 0);
401 }
402
403 int main(void)
404 {
405 int val = 42;
406 val = __sync_val_compare_and_swap(&val, 0, 1);
407 sfaa(&val);
408 return val;
409 }''')
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200410 qemu_isa_flags += ['-march=i486']
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200411endif
412
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200413# Pick x86-64 baseline version
Paolo Bonzini294ac642024-05-31 10:37:06 +0200414if host_arch in ['i386', 'x86_64']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200415 if get_option('x86_version') == '0' and host_arch == 'x86_64'
416 error('x86_64-v1 required for x86-64 hosts')
417 endif
418
419 # add flags for individual instruction set extensions
420 if get_option('x86_version') >= '1'
421 if host_arch == 'i386'
422 qemu_common_flags = ['-mfpmath=sse'] + qemu_common_flags
423 else
424 # present on basically all processors but technically not part of
425 # x86-64-v1, so only include -mneeded for x86-64 version 2 and above
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200426 qemu_isa_flags += ['-mcx16']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200427 endif
428 endif
429 if get_option('x86_version') >= '2'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200430 qemu_isa_flags += ['-mpopcnt']
431 qemu_isa_flags += cc.get_supported_arguments('-mneeded')
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200432 endif
433 if get_option('x86_version') >= '3'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200434 qemu_isa_flags += ['-mmovbe', '-mabm', '-mbmi', '-mbmi2', '-mfma', '-mf16c']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200435 endif
436
437 # add required vector instruction set (each level implies those below)
438 if get_option('x86_version') == '1'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200439 qemu_isa_flags += ['-msse2']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200440 elif get_option('x86_version') == '2'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200441 qemu_isa_flags += ['-msse4.2']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200442 elif get_option('x86_version') == '3'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200443 qemu_isa_flags += ['-mavx2']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200444 elif get_option('x86_version') == '4'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200445 qemu_isa_flags += ['-mavx512f', '-mavx512bw', '-mavx512cd', '-mavx512dq', '-mavx512vl']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200446 endif
Artyom Kunakovskyc2bf2cc2024-05-23 08:11:18 +0300447endif
448
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200449qemu_common_flags = qemu_isa_flags + qemu_common_flags
450
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +0200451if get_option('prefer_static')
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100452 qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
453endif
454
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200455# Meson currently only handles pie as a boolean for now, so if the user
456# has explicitly disabled PIE we need to extend our cflags.
Paolo Bonzinib03fcd62023-05-22 10:05:33 +0200457#
458# -no-pie is supposedly a linker flag that has no effect on the compiler
459# command line, but some distros, that didn't quite know what they were
460# doing, made local changes to gcc's specs file that turned it into
461# a compiler command-line flag.
462#
463# What about linker flags? For a static build, no PIE is implied by -static
464# which we added above (and if it's not because of the same specs patching,
465# there's nothing we can do: compilation will fail, report a bug to your
466# distro and do not use --disable-pie in the meanwhile). For dynamic linking,
467# instead, we can't add -no-pie because it overrides -shared: the linker then
468# tries to build an executable instead of a shared library and fails. So
469# don't add -no-pie anywhere and cross fingers. :(
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200470if not get_option('b_pie')
Paolo Bonzinib03fcd62023-05-22 10:05:33 +0200471 qemu_common_flags += cc.get_supported_arguments('-fno-pie', '-no-pie')
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200472endif
473
Paolo Bonzini911d4ca2022-10-12 12:46:23 +0200474if not get_option('stack_protector').disabled()
475 stack_protector_probe = '''
476 int main(int argc, char *argv[])
477 {
478 char arr[64], *p = arr, *c = argv[argc - 1];
479 while (*c) {
480 *p++ = *c++;
481 }
482 return 0;
483 }'''
484 have_stack_protector = false
485 foreach arg : ['-fstack-protector-strong', '-fstack-protector-all']
486 # We need to check both a compile and a link, since some compiler
487 # setups fail only on a .c->.o compile and some only at link time
488 if cc.compiles(stack_protector_probe, args: ['-Werror', arg]) and \
489 cc.links(stack_protector_probe, args: ['-Werror', arg])
490 have_stack_protector = true
491 qemu_cflags += arg
492 qemu_ldflags += arg
493 break
494 endif
495 endforeach
496 get_option('stack_protector') \
497 .require(have_stack_protector, error_message: 'Stack protector not supported')
498endif
499
Paolo Bonzini67398252022-10-12 13:19:35 +0200500coroutine_backend = get_option('coroutine_backend')
501ucontext_probe = '''
502 #include <ucontext.h>
503 #ifdef __stub_makecontext
504 #error Ignoring glibc stub makecontext which will always fail
505 #endif
506 int main(void) { makecontext(0, 0, 0); return 0; }'''
507
508# On Windows the only valid backend is the Windows specific one.
509# For POSIX prefer ucontext, but it's not always possible. The fallback
510# is sigcontext.
511supported_backends = []
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100512if host_os == 'windows'
Paolo Bonzini67398252022-10-12 13:19:35 +0200513 supported_backends += ['windows']
514else
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100515 if host_os != 'darwin' and cc.links(ucontext_probe)
Paolo Bonzini67398252022-10-12 13:19:35 +0200516 supported_backends += ['ucontext']
517 endif
518 supported_backends += ['sigaltstack']
519endif
520
521if coroutine_backend == 'auto'
522 coroutine_backend = supported_backends[0]
523elif coroutine_backend not in supported_backends
524 error('"@0@" backend requested but not available. Available backends: @1@' \
525 .format(coroutine_backend, ', '.join(supported_backends)))
526endif
527
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200528# Compiles if SafeStack *not* enabled
529safe_stack_probe = '''
530 int main(void)
531 {
532 #if defined(__has_feature)
533 #if __has_feature(safe_stack)
534 #error SafeStack Enabled
535 #endif
536 #endif
537 return 0;
538 }'''
539if get_option('safe_stack') != not cc.compiles(safe_stack_probe)
540 safe_stack_arg = get_option('safe_stack') ? '-fsanitize=safe-stack' : '-fno-sanitize=safe-stack'
541 if get_option('safe_stack') != not cc.compiles(safe_stack_probe, args: safe_stack_arg)
542 error(get_option('safe_stack') \
543 ? 'SafeStack not supported by your compiler' \
544 : 'Cannot disable SafeStack')
545 endif
546 qemu_cflags += safe_stack_arg
547 qemu_ldflags += safe_stack_arg
548endif
Paolo Bonzini67398252022-10-12 13:19:35 +0200549if get_option('safe_stack') and coroutine_backend != 'ucontext'
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200550 error('SafeStack is only supported with the ucontext coroutine backend')
551endif
552
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000553if get_option('asan')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100554 if cc.has_argument('-fsanitize=address')
555 qemu_cflags = ['-fsanitize=address'] + qemu_cflags
556 qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000557 else
558 error('Your compiler does not support -fsanitize=address')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100559 endif
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000560endif
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100561
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000562if get_option('ubsan')
563 # Detect static linking issue with ubsan:
564 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100565 if cc.links('int main(int argc, char **argv) { return argc + 1; }',
566 args: [qemu_ldflags, '-fsanitize=undefined'])
Richard Hendersondb770a22024-08-13 19:52:16 +1000567 qemu_cflags += ['-fsanitize=undefined']
568 qemu_ldflags += ['-fsanitize=undefined']
569
570 # Suppress undefined behaviour from function call to mismatched type.
571 # In addition, tcg prologue does not emit function type prefix
572 # required by function call sanitizer.
573 if cc.has_argument('-fno-sanitize=function')
574 qemu_cflags += ['-fno-sanitize=function']
575 endif
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000576 else
577 error('Your compiler does not support -fsanitize=undefined')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100578 endif
579endif
580
581# Thread sanitizer is, for now, much noisier than the other sanitizers;
582# keep it separate until that is not the case.
583if get_option('tsan')
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000584 if get_option('asan') or get_option('ubsan')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100585 error('TSAN is not supported with other sanitizers')
586 endif
587 if not cc.has_function('__tsan_create_fiber',
588 args: '-fsanitize=thread',
589 prefix: '#include <sanitizer/tsan_interface.h>')
590 error('Cannot enable TSAN due to missing fiber annotation interface')
591 endif
Pierrick Bouviercf6fbba2024-10-23 12:33:52 +0100592 tsan_warn_suppress = []
593 # gcc (>=11) will report constructions not supported by tsan:
594 # "error: ‘atomic_thread_fence’ is not supported with ‘-fsanitize=thread’"
595 # https://gcc.gnu.org/gcc-11/changes.html
596 # However, clang does not support this warning and this triggers an error.
597 if cc.has_argument('-Wno-tsan')
598 tsan_warn_suppress = ['-Wno-tsan']
599 endif
600 qemu_cflags = ['-fsanitize=thread'] + tsan_warn_suppress + qemu_cflags
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100601 qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags
602endif
603
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100604# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
605# The combination is known as "full relro", because .got.plt is read-only too.
606qemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
607
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100608if host_os == 'windows'
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200609 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat')
Paolo Bonzini2d73fa72022-11-02 13:03:51 +0100610 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200611endif
612
Paolo Bonzini537b7242021-10-07 15:08:12 +0200613if get_option('fuzzing')
Paolo Bonzini537b7242021-10-07 15:08:12 +0200614 # Specify a filter to only instrument code that is directly related to
615 # virtual-devices.
616 configure_file(output: 'instrumentation-filter',
617 input: 'scripts/oss-fuzz/instrumentation-filter-template',
618 copy: true)
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400619
620 if cc.compiles('int main () { return 0; }',
621 name: '-fsanitize-coverage-allowlist=/dev/null',
Alexander Bulekove56d0972022-06-21 16:45:07 -0400622 args: ['-fsanitize-coverage-allowlist=/dev/null',
623 '-fsanitize-coverage=trace-pc'] )
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200624 qemu_common_flags += ['-fsanitize-coverage-allowlist=instrumentation-filter']
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400625 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +0200626
627 if get_option('fuzzing_engine') == ''
628 # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
629 # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link
630 # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
631 # unable to bind the fuzzer-related callbacks added by instrumentation.
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200632 qemu_common_flags += ['-fsanitize=fuzzer-no-link']
633 qemu_ldflags += ['-fsanitize=fuzzer-no-link']
Paolo Bonzini537b7242021-10-07 15:08:12 +0200634 # For the actual fuzzer binaries, we need to link against the libfuzzer
635 # library. They need to be configurable, to support OSS-Fuzz
636 fuzz_exe_ldflags = ['-fsanitize=fuzzer']
637 else
638 # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
639 # the needed CFLAGS have already been provided
640 fuzz_exe_ldflags = get_option('fuzzing_engine').split()
641 endif
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400642endif
643
Paolo Bonzini82761292023-05-10 14:54:30 +0200644if get_option('cfi')
645 cfi_flags=[]
646 # Check for dependency on LTO
647 if not get_option('b_lto')
648 error('Selected Control-Flow Integrity but LTO is disabled')
649 endif
650 if enable_modules
651 error('Selected Control-Flow Integrity is not compatible with modules')
652 endif
653 # Check for cfi flags. CFI requires LTO so we can't use
654 # get_supported_arguments, but need a more complex "compiles" which allows
655 # custom arguments
656 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
657 args: ['-flto', '-fsanitize=cfi-icall'] )
658 cfi_flags += '-fsanitize=cfi-icall'
659 else
660 error('-fsanitize=cfi-icall is not supported by the compiler')
661 endif
662 if cc.compiles('int main () { return 0; }',
663 name: '-fsanitize-cfi-icall-generalize-pointers',
664 args: ['-flto', '-fsanitize=cfi-icall',
665 '-fsanitize-cfi-icall-generalize-pointers'] )
666 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
667 else
668 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
669 endif
670 if get_option('cfi_debug')
671 if cc.compiles('int main () { return 0; }',
672 name: '-fno-sanitize-trap=cfi-icall',
673 args: ['-flto', '-fsanitize=cfi-icall',
674 '-fno-sanitize-trap=cfi-icall'] )
675 cfi_flags += '-fno-sanitize-trap=cfi-icall'
676 else
677 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
678 endif
679 endif
680 add_global_arguments(cfi_flags, native: false, language: all_languages)
681 add_global_link_arguments(cfi_flags, native: false, language: all_languages)
682endif
683
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000684# Check further flags that make QEMU more robust against malicious parties
685
686hardening_flags = [
Daniel P. Berrangé7ff9ff032024-01-03 12:34:14 +0000687 # Initialize all stack variables to zero. This makes
688 # it harder to take advantage of uninitialized stack
689 # data to drive exploits
690 '-ftrivial-auto-var-init=zero',
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000691]
692
Daniel P. Berrangé95633112024-03-04 14:44:55 +0000693# Zero out registers used during a function call
694# upon its return. This makes it harder to assemble
695# ROP gadgets into something usable
696#
697# NB: Clang 17 is broken and SEGVs
698# https://github.com/llvm/llvm-project/issues/75168
Thomas Huth2d6d9952024-04-11 14:08:19 +0200699#
700# NB2: This clashes with the "retguard" extension of OpenBSD's Clang
701# https://gitlab.com/qemu-project/qemu/-/issues/2278
702if host_os != 'openbsd' and \
703 cc.compiles('extern struct { void (*cb)(void); } s; void f(void) { s.cb(); }',
Daniel P. Berrangé95633112024-03-04 14:44:55 +0000704 name: '-fzero-call-used-regs=used-gpr',
705 args: ['-O2', '-fzero-call-used-regs=used-gpr'])
706 hardening_flags += '-fzero-call-used-regs=used-gpr'
707endif
708
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000709qemu_common_flags += cc.get_supported_arguments(hardening_flags)
710
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200711add_global_arguments(qemu_common_flags, native: false, language: all_languages)
712add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
713
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100714# Collect warning flags we want to set, sorted alphabetically
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100715warn_flags = [
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100716 # First enable interesting warnings
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100717 '-Wempty-body',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100718 '-Wendif-labels',
719 '-Wexpansion-to-defined',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100720 '-Wformat-security',
721 '-Wformat-y2k',
722 '-Wignored-qualifiers',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100723 '-Wimplicit-fallthrough=2',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100724 '-Winit-self',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100725 '-Wmissing-format-attribute',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100726 '-Wmissing-prototypes',
727 '-Wnested-externs',
728 '-Wold-style-declaration',
729 '-Wold-style-definition',
730 '-Wredundant-decls',
731 '-Wshadow=local',
732 '-Wstrict-prototypes',
733 '-Wtype-limits',
734 '-Wundef',
Peter Maydell64c1a542024-02-21 17:26:36 +0100735 '-Wvla',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100736 '-Wwrite-strings',
737
738 # Then disable some undesirable warnings
739 '-Wno-gnu-variable-sized-type-not-at-end',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100740 '-Wno-initializer-overrides',
741 '-Wno-missing-include-dirs',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100742 '-Wno-psabi',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100743 '-Wno-shift-negative-value',
744 '-Wno-string-plus-int',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100745 '-Wno-tautological-type-limit-compare',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100746 '-Wno-typedef-redefinition',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100747]
748
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100749if host_os != 'darwin'
Kevin Wolf7e171112024-06-27 20:12:45 +0200750 tsa_has_cleanup = cc.compiles('''
751 struct __attribute__((capability("mutex"))) mutex {};
752 void lock(struct mutex *m) __attribute__((acquire_capability(m)));
753 void unlock(struct mutex *m) __attribute__((release_capability(m)));
754
755 void test(void) {
756 struct mutex __attribute__((cleanup(unlock))) m;
757 lock(&m);
758 }
759 ''', args: ['-Wthread-safety', '-Werror'])
760 if tsa_has_cleanup
761 warn_flags += ['-Wthread-safety']
762 endif
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100763endif
764
Thomas Huth785abf02023-07-06 08:47:36 +0200765# Set up C++ compiler flags
Paolo Bonzinib4854582021-11-08 12:31:52 +0100766qemu_cxxflags = []
Paolo Bonzinie5134022022-10-12 14:15:06 +0200767if 'cpp' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100768 qemu_cxxflags = ['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'] + qemu_cflags
Paolo Bonzinib4854582021-11-08 12:31:52 +0100769endif
770
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200771add_project_arguments(qemu_cflags, native: false, language: 'c')
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100772add_project_arguments(cc.get_supported_arguments(warn_flags), native: false, language: 'c')
773if 'cpp' in all_languages
774 add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
775 add_project_arguments(cxx.get_supported_arguments(warn_flags), native: false, language: 'cpp')
776endif
777if 'objc' in all_languages
778 # Note sanitizer flags are not applied to Objective-C sources!
779 add_project_arguments(objc.get_supported_arguments(warn_flags), native: false, language: 'objc')
780endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100781if host_os == 'linux'
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400782 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
783 '-isystem', 'linux-headers',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200784 language: all_languages)
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400785endif
786
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100787add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400788 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400789 '-iquote', meson.current_source_dir() / 'include',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200790 language: all_languages)
Paolo Bonzinia5665052019-06-10 12:05:14 +0200791
Richard Henderson44fc7162023-05-17 17:48:34 -0700792# If a host-specific include directory exists, list that first...
793host_include = meson.current_source_dir() / 'host/include/'
794if fs.is_dir(host_include / host_arch)
795 add_project_arguments('-iquote', host_include / host_arch,
796 language: all_languages)
797endif
798# ... followed by the generic fallback.
799add_project_arguments('-iquote', host_include / 'generic',
800 language: all_languages)
801
Paolo Bonzinideb62372020-09-01 07:51:16 -0400802sparse = find_program('cgcc', required: get_option('sparse'))
803if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100804 run_target('sparse',
805 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400806 'compile_commands.json', sparse.full_path(), '-Wbitwise',
807 '-Wno-transparent-union', '-Wno-old-initializer',
808 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100809endif
810
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200811#####################################
812# Host-specific libraries and flags #
813#####################################
814
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200815libm = cc.find_library('m', required: false)
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +0200816threads = dependency('threads')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400817util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200818winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400819socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400820version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400821coref = []
822iokit = []
Phil Dennis-Jordan23521592023-06-14 22:57:33 +0000823pvg = not_found
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400824emulator_link_args = []
Marc-André Lureau23011f42022-02-01 12:55:21 +0400825midl = not_found
826widl = not_found
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900827pathcch = not_found
Paolo Bonzinia6305082021-10-07 15:08:15 +0200828host_dsosuf = '.so'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100829if host_os == 'windows'
Marc-André Lureau23011f42022-02-01 12:55:21 +0400830 midl = find_program('midl', required: false)
831 widl = find_program('widl', required: false)
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900832 pathcch = cc.find_library('pathcch')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400833 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200834 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400835
836 win = import('windows')
837 version_res = win.compile_resources('version.rc',
838 depend_files: files('pc-bios/qemu-nsis.ico'),
839 include_directories: include_directories('.'))
Paolo Bonzinia6305082021-10-07 15:08:15 +0200840 host_dsosuf = '.dll'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100841elif host_os == 'darwin'
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400842 coref = dependency('appleframeworks', modules: 'CoreFoundation')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700843 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
Paolo Bonzinia6305082021-10-07 15:08:15 +0200844 host_dsosuf = '.dylib'
Paolo Bonzinid50ea7f2025-02-20 14:20:27 +0100845 pvg = dependency('appleframeworks', modules: ['ParavirtualizedGraphics', 'Metal'],
846 required: get_option('pvg'))
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100847elif host_os == 'sunos'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200848 socket = [cc.find_library('socket'),
849 cc.find_library('nsl'),
850 cc.find_library('resolv')]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100851elif host_os == 'haiku'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200852 socket = [cc.find_library('posix_error_mapper'),
853 cc.find_library('network'),
854 cc.find_library('bsd')]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100855elif host_os == 'openbsd'
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100856 if get_option('tcg').allowed() and target_dirs.length() > 0
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400857 # Disable OpenBSD W^X if available
858 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
859 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400860endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200861
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200862###############################################
863# Host-specific configuration of accelerators #
864###############################################
865
Paolo Bonzini8a199802020-09-18 05:37:01 -0400866accelerators = []
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100867if get_option('kvm').allowed() and host_os == 'linux'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400868 accelerators += 'CONFIG_KVM'
869endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100870if get_option('whpx').allowed() and host_os == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000871 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400872 error('WHPX requires 64-bit host')
Philippe Mathieu-Daudé641b8412023-06-24 15:31:44 +0200873 elif cc.has_header('winhvplatform.h', required: get_option('whpx')) and \
874 cc.has_header('winhvemulation.h', required: get_option('whpx'))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400875 accelerators += 'CONFIG_WHPX'
876 endif
877endif
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200878
879hvf = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100880if get_option('hvf').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400881 hvf = dependency('appleframeworks', modules: 'Hypervisor',
882 required: get_option('hvf'))
883 if hvf.found()
884 accelerators += 'CONFIG_HVF'
885 endif
886endif
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200887
888nvmm = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100889if host_os == 'netbsd'
nia0cc49652021-10-13 13:54:17 +0000890 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200891 if nvmm.found()
892 accelerators += 'CONFIG_NVMM'
893 endif
894endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100895
Paolo Bonzini823eb012021-11-08 14:18:17 +0100896tcg_arch = host_arch
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100897if get_option('tcg').allowed()
Paolo Bonzini823eb012021-11-08 14:18:17 +0100898 if host_arch == 'unknown'
Paolo Bonzinia24f15d2023-08-04 11:29:05 +0200899 if not get_option('tcg_interpreter')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400900 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
901 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100902 elif get_option('tcg_interpreter')
Philippe Mathieu-Daudé1c282da2021-05-21 12:34:23 +0200903 warning('Use of the TCG interpreter is not recommended on this host')
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100904 warning('architecture. There is a native TCG execution backend available')
905 warning('which provides substantially better performance and reliability.')
906 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
907 warning('configuration option on this architecture to use the native')
908 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400909 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100910 if get_option('tcg_interpreter')
911 tcg_arch = 'tci'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100912 elif host_arch == 'x86_64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100913 tcg_arch = 'i386'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100914 elif host_arch == 'ppc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100915 tcg_arch = 'ppc'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100916 endif
917 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzinie5134022022-10-12 14:15:06 +0200918 language: all_languages)
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100919
Paolo Bonzini8a199802020-09-18 05:37:01 -0400920 accelerators += 'CONFIG_TCG'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400921endif
922
923if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
924 error('KVM not available on this platform')
925endif
926if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
927 error('HVF not available on this platform')
928endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200929if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
930 error('NVMM not available on this platform')
931endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400932if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
933 error('WHPX not available on this platform')
934endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400935
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200936xen = not_found
937if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
938 xencontrol = dependency('xencontrol', required: false,
939 method: 'pkg-config')
940 if xencontrol.found()
941 xen_pc = declare_dependency(version: xencontrol.version(),
942 dependencies: [
943 xencontrol,
944 # disabler: true makes xen_pc.found() return false if any is not found
945 dependency('xenstore', required: false,
946 method: 'pkg-config',
947 disabler: true),
948 dependency('xenforeignmemory', required: false,
949 method: 'pkg-config',
950 disabler: true),
951 dependency('xengnttab', required: false,
952 method: 'pkg-config',
953 disabler: true),
954 dependency('xenevtchn', required: false,
955 method: 'pkg-config',
956 disabler: true),
957 dependency('xendevicemodel', required: false,
958 method: 'pkg-config',
959 disabler: true),
960 # optional, no "disabler: true"
961 dependency('xentoolcore', required: false,
962 method: 'pkg-config')])
963 if xen_pc.found()
964 xen = xen_pc
965 endif
966 endif
967 if not xen.found()
968 xen_tests = [ '4.11.0', '4.10.0', '4.9.0', '4.8.0', '4.7.1' ]
969 xen_libs = {
970 '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
971 '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
972 '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
973 '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
974 '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
975 }
976 xen_deps = {}
977 foreach ver: xen_tests
978 # cache the various library tests to avoid polluting the logs
979 xen_test_deps = []
980 foreach l: xen_libs[ver]
981 if l not in xen_deps
982 xen_deps += { l: cc.find_library(l, required: false) }
983 endif
984 xen_test_deps += xen_deps[l]
985 endforeach
986
987 # Use -D to pick just one of the test programs in scripts/xen-detect.c
988 xen_version = ver.split('.')
989 xen_ctrl_version = xen_version[0] + \
990 ('0' + xen_version[1]).substring(-2) + \
991 ('0' + xen_version[2]).substring(-2)
992 if cc.links(files('scripts/xen-detect.c'),
993 args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
994 dependencies: xen_test_deps)
995 xen = declare_dependency(version: ver, dependencies: xen_test_deps)
996 break
997 endif
998 endforeach
999 endif
1000 if xen.found()
1001 accelerators += 'CONFIG_XEN'
1002 elif get_option('xen').enabled()
1003 error('could not compile and link Xen test program')
1004 endif
1005endif
1006have_xen_pci_passthrough = get_option('xen_pci_passthrough') \
1007 .require(xen.found(),
1008 error_message: 'Xen PCI passthrough requested but Xen not enabled') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001009 .require(host_os == 'linux',
Paolo Bonzini0f63d962023-09-08 12:08:53 +02001010 error_message: 'Xen PCI passthrough not available on this platform') \
1011 .require(cpu == 'x86' or cpu == 'x86_64',
1012 error_message: 'Xen PCI passthrough not available on this platform') \
1013 .allowed()
1014
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001015################
1016# Dependencies #
1017################
1018
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001019# When bumping glib minimum version, please check also whether to increase
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03001020# the _WIN32_WINNT setting in osdep.h according to the value from glib.
1021# You should also check if any of the glib.version() checks
1022# below can also be removed.
Thomas Huth0d8caac2024-04-18 12:10:50 +02001023glib_req_ver = '>=2.66.0'
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001024glib_pc = dependency('glib-2.0', version: glib_req_ver, required: true,
1025 method: 'pkg-config')
1026glib_cflags = []
Paolo Bonzini60027112022-10-20 14:53:10 +02001027if enable_modules
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001028 gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true,
1029 method: 'pkg-config')
Paolo Bonzini2c13c572023-08-30 12:20:53 +02001030elif get_option('plugins')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001031 gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true,
1032 method: 'pkg-config')
1033else
1034 gmodule = not_found
Emilio Cotae3feb2c2023-02-05 11:37:57 -05001035endif
Marc-André Lureau953d5a92020-12-15 12:03:19 +04001036
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001037# This workaround is required due to a bug in pkg-config file for glib as it
1038# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001039if host_os == 'windows' and get_option('prefer_static')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001040 glib_cflags += ['-DGLIB_STATIC_COMPILATION']
1041endif
1042
1043# Sanity check that the current size_t matches the
1044# size that glib thinks it should be. This catches
1045# problems on multi-arch where people try to build
1046# 32-bit QEMU while pointing at 64-bit glib headers
1047
1048if not cc.compiles('''
1049 #include <glib.h>
1050 #include <unistd.h>
1051
1052 #define QEMU_BUILD_BUG_ON(x) \
1053 typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
1054
1055 int main(void) {
1056 QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
1057 return 0;
1058 }''', dependencies: glib_pc, args: glib_cflags)
1059 error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T.
1060 You probably need to set PKG_CONFIG_LIBDIR" to point
1061 to the right pkg-config files for your build target.''')
1062endif
1063
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001064glib = declare_dependency(dependencies: [glib_pc, gmodule],
1065 compile_args: glib_cflags,
1066 version: glib_pc.version())
1067
1068# Check whether glib has gslice, which we have to avoid for correctness.
1069# TODO: remove this check and the corresponding workaround (qtree) when
1070# the minimum supported glib is >= 2.75.3
1071glib_has_gslice = glib.version().version_compare('<2.75.3')
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03001072# Check whether glib has the aligned_alloc family of functions.
1073# <https://docs.gtk.org/glib/func.aligned_alloc.html>
1074glib_has_aligned_alloc = glib.version().version_compare('>=2.72.0')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001075
1076# override glib dep to include the above refinements
1077meson.override_dependency('glib-2.0', glib)
1078
1079# The path to glib.h is added to all compilation commands.
1080add_project_dependencies(glib.partial_dependency(compile_args: true, includes: true),
1081 native: false, language: all_languages)
1082
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001083gio = not_found
Paolo Bonzini75440602022-04-20 17:33:44 +02001084gdbus_codegen = not_found
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02001085gdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
Paolo Bonzini75440602022-04-20 17:33:44 +02001086if not get_option('gio').auto() or have_system
1087 gio = dependency('gio-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001088 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +02001089 if gio.found() and not cc.links('''
1090 #include <gio/gio.h>
1091 int main(void)
1092 {
1093 g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
1094 return 0;
1095 }''', dependencies: [glib, gio])
1096 if get_option('gio').enabled()
1097 error('The installed libgio is broken for static linking')
1098 endif
1099 gio = not_found
1100 endif
1101 if gio.found()
Marc-André Lureauc118c8e2024-10-08 16:50:22 +04001102 gdbus_codegen = find_program('gdbus-codegen',
Paolo Bonzini75440602022-04-20 17:33:44 +02001103 required: get_option('gio'))
1104 gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001105 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +02001106 gio = declare_dependency(dependencies: [gio, gio_unix],
1107 version: gio.version())
1108 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001109endif
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02001110if gdbus_codegen.found() and get_option('cfi')
1111 gdbus_codegen = not_found
1112 gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity'
1113endif
Paolo Bonzini75440602022-04-20 17:33:44 +02001114
Marc-André Lureau6cc5a612023-06-06 15:56:42 +04001115xml_pp = find_program('scripts/xml-preprocess.py')
1116
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001117lttng = not_found
Paolo Bonzini9c29b742021-10-07 15:08:14 +02001118if 'ust' in get_option('trace_backends')
Marc-André Lureaue32aaa52022-03-28 12:47:13 +04001119 lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001120 method: 'pkg-config')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001121endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001122pixman = not_found
Marc-André Lureaucca15752023-08-30 13:38:25 +04001123if not get_option('pixman').auto() or have_system or have_tools
1124 pixman = dependency('pixman-1', required: get_option('pixman'), version:'>=0.21.8',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001125 method: 'pkg-config')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001126endif
Marc-André Lureaucca15752023-08-30 13:38:25 +04001127
Paolo Bonzini063d5112022-07-14 14:56:58 +02001128zlib = dependency('zlib', required: true)
Paolo Bonzini53c22b62021-06-03 11:31:35 +02001129
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001130libaio = not_found
1131if not get_option('linux_aio').auto() or have_block
1132 libaio = cc.find_library('aio', has_headers: ['libaio.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001133 required: get_option('linux_aio'))
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001134endif
Leonardo Bras354081d2022-05-13 03:28:30 -03001135
1136linux_io_uring_test = '''
1137 #include <liburing.h>
1138 #include <linux/errqueue.h>
1139
1140 int main(void) { return 0; }'''
1141
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001142linux_io_uring = not_found
Paolo Bonzini53c22b62021-06-03 11:31:35 +02001143if not get_option('linux_io_uring').auto() or have_block
Daniel P. Berrangéa41b4fd2022-01-05 13:49:38 +00001144 linux_io_uring = dependency('liburing', version: '>=0.3',
1145 required: get_option('linux_io_uring'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001146 method: 'pkg-config')
Leonardo Bras354081d2022-05-13 03:28:30 -03001147 if not cc.links(linux_io_uring_test)
1148 linux_io_uring = not_found
1149 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001150endif
Leonardo Bras354081d2022-05-13 03:28:30 -03001151
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001152libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +01001153if not get_option('libnfs').auto() or have_block
Thomas Huthe2d98f22024-12-18 07:21:59 +01001154 libnfs = dependency('libnfs', version: ['>=1.9.3', '<6.0.0'],
Paolo Bonzini30045c02020-11-17 13:11:25 +01001155 required: get_option('libnfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001156 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001157endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001158
1159libattr_test = '''
1160 #include <stddef.h>
1161 #include <sys/types.h>
1162 #ifdef CONFIG_LIBATTR
1163 #include <attr/xattr.h>
1164 #else
1165 #include <sys/xattr.h>
1166 #endif
1167 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
1168
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001169libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001170have_old_libattr = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001171if get_option('attr').allowed()
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001172 if cc.links(libattr_test)
1173 libattr = declare_dependency()
1174 else
1175 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001176 required: get_option('attr'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001177 if libattr.found() and not \
1178 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
1179 libattr = not_found
1180 if get_option('attr').enabled()
1181 error('could not link libattr')
1182 else
1183 warning('could not link libattr, disabling')
1184 endif
1185 else
1186 have_old_libattr = libattr.found()
1187 endif
1188 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001189endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001190
Akihiko Odakid2277f02024-07-15 14:25:44 +09001191cocoa = dependency('appleframeworks',
1192 modules: ['Cocoa', 'CoreVideo', 'QuartzCore'],
Akihiko Odaki52eaefd2022-07-02 23:25:19 +09001193 required: get_option('cocoa'))
Paolo Bonzinic1ec4942021-01-07 14:04:00 +01001194
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03001195vmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet'))
1196if vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h',
1197 'VMNET_BRIDGED_MODE',
1198 dependencies: vmnet)
1199 vmnet = not_found
1200 if get_option('vmnet').enabled()
1201 error('vmnet.framework API is outdated')
1202 else
1203 warning('vmnet.framework API is outdated, disabling')
1204 endif
1205endif
1206
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001207seccomp = not_found
Michal Privoznik73422d92022-10-26 09:30:24 +02001208seccomp_has_sysrawrc = false
Paolo Bonzini90835c22020-11-17 14:22:24 +01001209if not get_option('seccomp').auto() or have_system or have_tools
1210 seccomp = dependency('libseccomp', version: '>=2.3.0',
1211 required: get_option('seccomp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001212 method: 'pkg-config')
Michal Privoznik73422d92022-10-26 09:30:24 +02001213 if seccomp.found()
1214 seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h',
1215 'SCMP_FLTATR_API_SYSRAWRC',
1216 dependencies: seccomp)
1217 endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001218endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001219
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001220libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001221if not get_option('cap_ng').auto() or have_system or have_tools
1222 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001223 required: get_option('cap_ng'))
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001224endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001225if libcap_ng.found() and not cc.links('''
1226 #include <cap-ng.h>
1227 int main(void)
1228 {
1229 capng_capability_to_name(CAPNG_EFFECTIVE);
1230 return 0;
1231 }''', dependencies: libcap_ng)
1232 libcap_ng = not_found
1233 if get_option('cap_ng').enabled()
1234 error('could not link libcap-ng')
1235 else
1236 warning('could not link libcap-ng, disabling')
1237 endif
1238endif
1239
Paolo Bonzini1917ec62020-08-26 03:24:11 -04001240if get_option('xkbcommon').auto() and not have_system and not have_tools
1241 xkbcommon = not_found
1242else
1243 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001244 method: 'pkg-config')
Marc-André Lureauade60d42019-07-15 14:48:31 +04001245endif
Paolo Bonzinie1723992021-10-07 15:08:21 +02001246
Thomas Huth58902582022-04-08 18:20:47 +02001247slirp = not_found
1248if not get_option('slirp').auto() or have_system
1249 slirp = dependency('slirp', required: get_option('slirp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001250 method: 'pkg-config')
Thomas Huth58902582022-04-08 18:20:47 +02001251 # slirp < 4.7 is incompatible with CFI support in QEMU. This is because
1252 # it passes function pointers within libslirp as callbacks for timers.
1253 # When using a system-wide shared libslirp, the type information for the
1254 # callback is missing and the timer call produces a false positive with CFI.
1255 # Do not use the "version" keyword argument to produce a better error.
1256 # with control-flow integrity.
1257 if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7')
1258 if get_option('slirp').enabled()
1259 error('Control-Flow Integrity requires libslirp 4.7.')
1260 else
1261 warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.')
1262 slirp = not_found
1263 endif
1264 endif
1265endif
1266
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001267vde = not_found
Paolo Bonzinie1723992021-10-07 15:08:21 +02001268if not get_option('vde').auto() or have_system or have_tools
1269 vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001270 required: get_option('vde'))
Paolo Bonzinie1723992021-10-07 15:08:21 +02001271endif
1272if vde.found() and not cc.links('''
1273 #include <libvdeplug.h>
1274 int main(void)
1275 {
1276 struct vde_open_args a = {0, 0, 0};
1277 char s[] = "";
1278 vde_open(s, s, &a);
1279 return 0;
1280 }''', dependencies: vde)
1281 vde = not_found
1282 if get_option('cap_ng').enabled()
1283 error('could not link libvdeplug')
1284 else
1285 warning('could not link libvdeplug, disabling')
1286 endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001287endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001288
Paolo Bonzini478e9432020-08-17 12:47:55 +02001289pulse = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001290if not get_option('pa').auto() or (host_os == 'linux' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001291 pulse = dependency('libpulse', required: get_option('pa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001292 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001293endif
1294alsa = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001295if not get_option('alsa').auto() or (host_os == 'linux' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001296 alsa = dependency('alsa', required: get_option('alsa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001297 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001298endif
1299jack = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001300if not get_option('jack').auto() or have_system
1301 jack = dependency('jack', required: get_option('jack'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001302 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001303endif
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001304pipewire = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001305if not get_option('pipewire').auto() or (host_os == 'linux' and have_system)
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001306 pipewire = dependency('libpipewire-0.3', version: '>=0.3.60',
1307 required: get_option('pipewire'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001308 method: 'pkg-config')
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001309endif
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001310sndio = not_found
1311if not get_option('sndio').auto() or have_system
1312 sndio = dependency('sndio', required: get_option('sndio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001313 method: 'pkg-config')
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001314endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001315
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001316spice_protocol = not_found
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001317if not get_option('spice_protocol').auto() or have_system
Markus Armbruster5c167b52023-01-09 20:03:07 +01001318 spice_protocol = dependency('spice-protocol', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001319 required: get_option('spice_protocol'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001320 method: 'pkg-config')
Paolo Bonzini26347332019-07-29 15:40:07 +02001321endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001322spice = not_found
Marc-André Lureauc98791e2023-08-30 13:38:35 +04001323if get_option('spice') \
1324 .disable_auto_if(not have_system) \
1325 .require(pixman.found(),
1326 error_message: 'cannot enable SPICE if pixman is not available') \
1327 .allowed()
Markus Armbruster34d55722023-01-09 20:03:09 +01001328 spice = dependency('spice-server', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001329 required: get_option('spice'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001330 method: 'pkg-config')
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001331endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001332spice_headers = spice.partial_dependency(compile_args: true, includes: true)
1333
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04001334rt = cc.find_library('rt', required: false)
Paolo Bonzinia399f912021-11-15 14:29:13 +00001335
Paolo Bonzini99650b62019-06-10 12:21:14 +02001336libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001337if not get_option('libiscsi').auto() or have_block
1338 libiscsi = dependency('libiscsi', version: '>=1.9.0',
1339 required: get_option('libiscsi'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001340 method: 'pkg-config')
Paolo Bonzini99650b62019-06-10 12:21:14 +02001341endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001342zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +01001343if not get_option('zstd').auto() or have_block
1344 zstd = dependency('libzstd', version: '>=1.4.0',
1345 required: get_option('zstd'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001346 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001347endif
Yuan Liub844a2c2024-06-10 18:21:06 +08001348qpl = not_found
1349if not get_option('qpl').auto() or have_system
1350 qpl = dependency('qpl', version: '>=1.5.0',
1351 required: get_option('qpl'),
1352 method: 'pkg-config')
1353endif
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01001354uadk = not_found
1355if not get_option('uadk').auto() or have_system
1356 libwd = dependency('libwd', version: '>=2.6',
1357 required: get_option('uadk'),
1358 method: 'pkg-config')
1359 libwd_comp = dependency('libwd_comp', version: '>=2.6',
1360 required: get_option('uadk'),
1361 method: 'pkg-config')
1362 if libwd.found() and libwd_comp.found()
1363 uadk = declare_dependency(dependencies: [libwd, libwd_comp])
1364 endif
1365endif
Bryan Zhange28ed312024-08-30 16:27:19 -07001366
1367qatzip = not_found
1368if not get_option('qatzip').auto() or have_system
1369 qatzip = dependency('qatzip', version: '>=1.1.2',
1370 required: get_option('qatzip'),
1371 method: 'pkg-config')
1372endif
1373
Marc-André Lureauea458962019-07-12 22:23:46 +04001374virgl = not_found
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001375
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001376have_vhost_user_gpu = have_tools and host_os == 'linux' and pixman.found()
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001377if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
Paolo Bonzini587d59d2021-06-03 11:31:35 +02001378 virgl = dependency('virglrenderer',
1379 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001380 required: get_option('virglrenderer'))
Marc-André Lureauea458962019-07-12 22:23:46 +04001381endif
Gurchetan Singhcd9adbe2023-03-21 09:47:36 -07001382rutabaga = not_found
1383if not get_option('rutabaga_gfx').auto() or have_system or have_vhost_user_gpu
1384 rutabaga = dependency('rutabaga_gfx_ffi',
1385 method: 'pkg-config',
1386 required: get_option('rutabaga_gfx'))
1387endif
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001388blkio = not_found
1389if not get_option('blkio').auto() or have_block
1390 blkio = dependency('blkio',
1391 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001392 required: get_option('blkio'))
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001393endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001394curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001395if not get_option('curl').auto() or have_block
1396 curl = dependency('libcurl', version: '>=7.29.0',
1397 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001398 required: get_option('curl'))
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001399endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001400libudev = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001401if host_os == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001402 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +01001403 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001404 required: get_option('libudev'))
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001405endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001406
Paolo Bonzini5c530152020-10-15 06:09:27 -04001407mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001408mpathpersist = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001409if host_os == 'linux' and have_tools and get_option('mpath').allowed()
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001410 mpath_test_source = '''
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001411 #include <libudev.h>
1412 #include <mpath_persist.h>
1413 unsigned mpath_mx_alloc_len = 1024;
1414 int logsink;
1415 static struct config *multipath_conf;
1416 extern struct udev *udev;
1417 extern struct config *get_multipath_config(void);
1418 extern void put_multipath_config(struct config *conf);
1419 struct udev *udev;
1420 struct config *get_multipath_config(void) { return multipath_conf; }
1421 void put_multipath_config(struct config *conf) { }
1422 int main(void) {
1423 udev = udev_new();
1424 multipath_conf = mpath_lib_init();
1425 return 0;
1426 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -04001427 libmpathpersist = cc.find_library('mpathpersist',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001428 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001429 if libmpathpersist.found()
1430 mpathlibs += libmpathpersist
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001431 if get_option('prefer_static')
Paolo Bonzini5c530152020-10-15 06:09:27 -04001432 mpathlibs += cc.find_library('devmapper',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001433 required: get_option('mpath'))
Paolo Bonzini43b43a42020-09-17 12:25:09 +02001434 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -04001435 mpathlibs += cc.find_library('multipath',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001436 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001437 foreach lib: mpathlibs
1438 if not lib.found()
1439 mpathlibs = []
1440 break
1441 endif
1442 endforeach
1443 if mpathlibs.length() == 0
1444 msg = 'Dependencies missing for libmpathpersist'
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001445 elif cc.links(mpath_test_source, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001446 mpathpersist = declare_dependency(dependencies: mpathlibs)
1447 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001448 msg = 'Cannot detect libmpathpersist API'
1449 endif
1450 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001451 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -04001452 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001453 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001454 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001455 endif
1456 endif
1457 endif
1458endif
1459
Yonggang Luo5285e592020-10-13 07:43:48 +08001460iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001461curses = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001462if have_system and get_option('curses').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001463 curses_test = '''
Brad Smithf8d31162024-10-11 23:38:55 -04001464 #ifdef __APPLE__
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001465 #define _XOPEN_SOURCE_EXTENDED 1
1466 #endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001467 #include <locale.h>
1468 #include <curses.h>
1469 #include <wchar.h>
1470 int main(void) {
1471 wchar_t wch = L'w';
1472 setlocale(LC_ALL, "");
1473 resize_term(0, 0);
1474 addwstr(L"wide chars\n");
1475 addnwstr(&wch, 1);
1476 add_wch(WACS_DEGREE);
1477 return 0;
1478 }'''
1479
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001480 curses_dep_list = host_os == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
Paolo Bonzini6d322632022-03-27 16:05:58 +02001481 curses = dependency(curses_dep_list,
1482 required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001483 method: 'pkg-config')
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001484 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001485 curses_compile_args = ['-DNCURSES_WIDECHAR=1']
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001486 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -05001487 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001488 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses],
1489 version: curses.version())
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001490 else
1491 msg = 'curses package not usable'
1492 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001493 endif
1494 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001495 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001496 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001497 if host_os != 'windows' and not has_curses_h
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001498 message('Trying with /usr/include/ncursesw')
1499 curses_compile_args += ['-I/usr/include/ncursesw']
1500 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
1501 endif
1502 if has_curses_h
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001503 curses_libname_list = (host_os == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001504 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +08001505 libcurses = cc.find_library(curses_libname,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001506 required: false)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001507 if libcurses.found()
1508 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
1509 curses = declare_dependency(compile_args: curses_compile_args,
1510 dependencies: [libcurses])
1511 break
1512 else
1513 msg = 'curses library not usable'
1514 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001515 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001516 endforeach
1517 endif
1518 endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001519 if get_option('iconv').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001520 foreach link_args : [ ['-liconv'], [] ]
1521 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
1522 # We need to use libiconv if available because mixing libiconv's headers with
1523 # the system libc does not work.
1524 # However, without adding glib to the dependencies -L/usr/local/lib will not be
1525 # included in the command line and libiconv will not be found.
1526 if cc.links('''
1527 #include <iconv.h>
1528 int main(void) {
1529 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
1530 return conv != (iconv_t) -1;
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001531 }''', args: link_args, dependencies: glib)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001532 iconv = declare_dependency(link_args: link_args, dependencies: glib)
1533 break
Yonggang Luo5285e592020-10-13 07:43:48 +08001534 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001535 endforeach
1536 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001537 if curses.found() and not iconv.found()
1538 if get_option('iconv').enabled()
1539 error('iconv not available')
1540 endif
1541 msg = 'iconv required for curses UI but not available'
1542 curses = not_found
1543 endif
1544 if not curses.found() and msg != ''
1545 if get_option('curses').enabled()
1546 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001547 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001548 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001549 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001550 endif
1551endif
1552
Paolo Bonzini26347332019-07-29 15:40:07 +02001553brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001554if not get_option('brlapi').auto() or have_system
1555 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001556 required: get_option('brlapi'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001557 if brlapi.found() and not cc.links('''
1558 #include <brlapi.h>
1559 #include <stddef.h>
1560 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
1561 brlapi = not_found
1562 if get_option('brlapi').enabled()
1563 error('could not link brlapi')
1564 else
1565 warning('could not link brlapi, disabling')
1566 endif
1567 endif
Paolo Bonzini26347332019-07-29 15:40:07 +02001568endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001569
Paolo Bonzini760e4322020-08-26 08:09:48 +02001570sdl = not_found
Akihiko Odaki64d3fec2022-08-19 22:27:56 +09001571if not get_option('sdl').auto() or have_system
Paolo Bonzini063d5112022-07-14 14:56:58 +02001572 sdl = dependency('sdl2', required: get_option('sdl'))
Paolo Bonzini760e4322020-08-26 08:09:48 +02001573 sdl_image = not_found
1574endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001575if sdl.found()
Thomas Huth6da5f222023-06-05 13:45:23 +02001576 # Some versions of SDL have problems with -Wundef
1577 if not cc.compiles('''
1578 #include <SDL.h>
1579 #include <SDL_syswm.h>
1580 int main(int argc, char *argv[]) { return 0; }
1581 ''', dependencies: sdl, args: '-Werror=undef')
1582 sdl = declare_dependency(compile_args: '-Wno-undef',
1583 dependencies: sdl,
1584 version: sdl.version())
1585 endif
Volker Rümelin7161a432020-08-29 12:41:58 +02001586 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001587 method: 'pkg-config')
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001588else
1589 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +01001590 error('sdl-image required, but SDL was @0@'.format(
1591 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001592 endif
1593 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +02001594endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001595
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001596rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001597if not get_option('rbd').auto() or have_block
Paolo Bonzini063d5112022-07-14 14:56:58 +02001598 librados = cc.find_library('rados', required: get_option('rbd'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001599 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001600 required: get_option('rbd'))
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001601 if librados.found() and librbd.found()
1602 if cc.links('''
1603 #include <stdio.h>
1604 #include <rbd/librbd.h>
1605 int main(void) {
1606 rados_t cluster;
1607 rados_create(&cluster, NULL);
Peter Lieven48672ac2021-07-02 19:23:51 +02001608 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
1609 #error
1610 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001611 return 0;
1612 }''', dependencies: [librbd, librados])
1613 rbd = declare_dependency(dependencies: [librbd, librados])
1614 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +02001615 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001616 else
Peter Lieven48672ac2021-07-02 19:23:51 +02001617 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001618 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001619 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001620endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001621
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001622glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001623glusterfs_ftruncate_has_stat = false
1624glusterfs_iocb_has_stat = false
1625if not get_option('glusterfs').auto() or have_block
1626 glusterfs = dependency('glusterfs-api', version: '>=3',
1627 required: get_option('glusterfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001628 method: 'pkg-config')
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001629 if glusterfs.found()
1630 glusterfs_ftruncate_has_stat = cc.links('''
1631 #include <glusterfs/api/glfs.h>
1632
1633 int
1634 main(void)
1635 {
1636 /* new glfs_ftruncate() passes two additional args */
1637 return glfs_ftruncate(NULL, 0, NULL, NULL);
1638 }
1639 ''', dependencies: glusterfs)
1640 glusterfs_iocb_has_stat = cc.links('''
1641 #include <glusterfs/api/glfs.h>
1642
1643 /* new glfs_io_cbk() passes two additional glfs_stat structs */
1644 static void
1645 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
1646 {}
1647
1648 int
1649 main(void)
1650 {
1651 glfs_io_cbk iocb = &glusterfs_iocb;
1652 iocb(NULL, 0 , NULL, NULL, NULL);
1653 return 0;
1654 }
1655 ''', dependencies: glusterfs)
1656 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001657endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001658
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02001659hv_balloon = false
1660if get_option('hv_balloon').allowed() and have_system
1661 if cc.links('''
1662 #include <string.h>
1663 #include <gmodule.h>
1664 int main(void) {
1665 GTree *tree;
1666
1667 tree = g_tree_new((GCompareFunc)strcmp);
1668 (void)g_tree_node_first(tree);
1669 g_tree_destroy(tree);
1670 return 0;
1671 }
1672 ''', dependencies: glib)
1673 hv_balloon = true
1674 else
1675 if get_option('hv_balloon').enabled()
1676 error('could not enable hv-balloon, update your glib')
1677 else
1678 warning('could not find glib support for hv-balloon, disabling')
1679 endif
1680 endif
1681endif
1682
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001683libssh = not_found
Thomas Huthe6a52b32021-12-09 15:48:01 +01001684if not get_option('libssh').auto() or have_block
1685 libssh = dependency('libssh', version: '>=0.8.7',
1686 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001687 required: get_option('libssh'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001688endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001689
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001690libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001691if not get_option('bzip2').auto() or have_block
1692 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001693 required: get_option('bzip2'))
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001694 if libbzip2.found() and not cc.links('''
1695 #include <bzlib.h>
1696 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
1697 libbzip2 = not_found
1698 if get_option('bzip2').enabled()
1699 error('could not link libbzip2')
1700 else
1701 warning('could not link libbzip2, disabling')
1702 endif
1703 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001704endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001705
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001706liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +01001707if not get_option('lzfse').auto() or have_block
1708 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001709 required: get_option('lzfse'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001710endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001711if liblzfse.found() and not cc.links('''
1712 #include <lzfse.h>
1713 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
1714 liblzfse = not_found
1715 if get_option('lzfse').enabled()
1716 error('could not link liblzfse')
1717 else
1718 warning('could not link liblzfse, disabling')
1719 endif
1720endif
1721
Paolo Bonzini478e9432020-08-17 12:47:55 +02001722oss = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001723if get_option('oss').allowed() and have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02001724 if not cc.has_header('sys/soundcard.h')
1725 # not found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001726 elif host_os == 'netbsd'
Paolo Bonzini063d5112022-07-14 14:56:58 +02001727 oss = cc.find_library('ossaudio', required: get_option('oss'))
Paolo Bonzini87430d52021-10-07 15:06:09 +02001728 else
1729 oss = declare_dependency()
1730 endif
1731
1732 if not oss.found()
1733 if get_option('oss').enabled()
1734 error('OSS not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001735 endif
1736 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001737endif
1738dsound = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001739if not get_option('dsound').auto() or (host_os == 'windows' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001740 if cc.has_header('dsound.h')
1741 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1742 endif
1743
1744 if not dsound.found()
1745 if get_option('dsound').enabled()
1746 error('DirectSound not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001747 endif
1748 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001749endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001750
Paolo Bonzini478e9432020-08-17 12:47:55 +02001751coreaudio = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001752if not get_option('coreaudio').auto() or (host_os == 'darwin' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001753 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
1754 required: get_option('coreaudio'))
Paolo Bonzini478e9432020-08-17 12:47:55 +02001755endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001756
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001757opengl = not_found
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001758if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
1759 epoxy = dependency('epoxy', method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001760 required: get_option('opengl'))
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001761 if cc.has_header('epoxy/egl.h', dependencies: epoxy)
1762 opengl = epoxy
1763 elif get_option('opengl').enabled()
1764 error('epoxy/egl.h not found')
1765 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001766endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001767gbm = not_found
1768if (have_system or have_tools) and (virgl.found() or opengl.found())
Paolo Bonzini063d5112022-07-14 14:56:58 +02001769 gbm = dependency('gbm', method: 'pkg-config', required: false)
Thomas Huth8bc51842021-07-13 13:09:02 +02001770endif
Marc-André Lureauf0caba42022-06-28 17:23:15 +04001771have_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001772
Dorjoy Chowdhurybb154e32024-10-09 03:17:23 +06001773libcbor = not_found
1774if not get_option('libcbor').auto() or have_system
1775 libcbor = dependency('libcbor', version: '>=0.7.0',
1776 required: get_option('libcbor'))
1777endif
1778
Paolo Bonzini57612512021-06-03 11:15:26 +02001779gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001780gnutls_crypto = not_found
Alyssa Rossabc14fd2021-08-06 14:49:47 +00001781if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001782 # For general TLS support our min gnutls matches
1783 # that implied by our platform support matrix
1784 #
1785 # For the crypto backends, we look for a newer
1786 # gnutls:
1787 #
1788 # Version 3.6.8 is needed to get XTS
1789 # Version 3.6.13 is needed to get PBKDF
1790 # Version 3.6.14 is needed to get HW accelerated XTS
1791 #
1792 # If newer enough gnutls isn't available, we can
1793 # still use a different crypto backend to satisfy
1794 # the platform support requirements
1795 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1796 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001797 required: false)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001798 if gnutls_crypto.found()
1799 gnutls = gnutls_crypto
1800 else
1801 # Our min version if all we need is TLS
1802 gnutls = dependency('gnutls', version: '>=3.5.18',
1803 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001804 required: get_option('gnutls'))
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001805 endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001806endif
1807
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001808# We prefer use of gnutls for crypto, unless the options
1809# explicitly asked for nettle or gcrypt.
1810#
1811# If gnutls isn't available for crypto, then we'll prefer
1812# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +02001813gcrypt = not_found
1814nettle = not_found
Lei He4c5e5122022-05-25 17:01:14 +08001815hogweed = not_found
Hyman Huang52ed9f42023-12-07 23:47:35 +08001816crypto_sm4 = not_found
liequan ched078da82024-10-30 08:51:46 +00001817crypto_sm3 = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +01001818xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001819
Paolo Bonzini57612512021-06-03 11:15:26 +02001820if get_option('nettle').enabled() and get_option('gcrypt').enabled()
1821 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +02001822endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001823
1824# Explicit nettle/gcrypt request, so ignore gnutls for crypto
1825if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001826 gnutls_crypto = not_found
1827endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001828
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001829if not gnutls_crypto.found()
1830 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
1831 gcrypt = dependency('libgcrypt', version: '>=1.8',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001832 required: get_option('gcrypt'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001833 # Debian has removed -lgpg-error from libgcrypt-config
1834 # as it "spreads unnecessary dependencies" which in
1835 # turn breaks static builds...
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001836 if gcrypt.found() and get_option('prefer_static')
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001837 gcrypt = declare_dependency(dependencies:
1838 [gcrypt,
1839 cc.find_library('gpg-error', required: true)],
1840 version: gcrypt.version())
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001841 endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08001842 crypto_sm4 = gcrypt
1843 # SM4 ALG is available in libgcrypt >= 1.9
1844 if gcrypt.found() and not cc.links('''
1845 #include <gcrypt.h>
1846 int main(void) {
1847 gcry_cipher_hd_t handler;
1848 gcry_cipher_open(&handler, GCRY_CIPHER_SM4, GCRY_CIPHER_MODE_ECB, 0);
1849 return 0;
1850 }''', dependencies: gcrypt)
1851 crypto_sm4 = not_found
1852 endif
liequan ched078da82024-10-30 08:51:46 +00001853 crypto_sm3 = gcrypt
1854 # SM3 ALG is available in libgcrypt >= 1.9
1855 if gcrypt.found() and not cc.links('''
1856 #include <gcrypt.h>
1857 int main(void) {
1858 gcry_md_hd_t handler;
1859 gcry_md_open(&handler, GCRY_MD_SM3, 0);
1860 return 0;
1861 }''', dependencies: gcrypt)
1862 crypto_sm3 = not_found
1863 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001864 endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001865 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1866 nettle = dependency('nettle', version: '>=3.4',
1867 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001868 required: get_option('nettle'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001869 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1870 xts = 'private'
1871 endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08001872 crypto_sm4 = nettle
1873 # SM4 ALG is available in nettle >= 3.9
1874 if nettle.found() and not cc.links('''
1875 #include <nettle/sm4.h>
1876 int main(void) {
1877 struct sm4_ctx ctx;
1878 unsigned char key[16] = {0};
1879 sm4_set_encrypt_key(&ctx, key);
1880 return 0;
1881 }''', dependencies: nettle)
1882 crypto_sm4 = not_found
1883 endif
liequan ched078da82024-10-30 08:51:46 +00001884 crypto_sm3 = nettle
1885 # SM3 ALG is available in nettle >= 3.8
1886 if nettle.found() and not cc.links('''
1887 #include <nettle/sm3.h>
1888 #include <nettle/hmac.h>
1889 int main(void) {
1890 struct sm3_ctx ctx;
1891 struct hmac_sm3_ctx hmac_ctx;
1892 unsigned char data[64] = {0};
1893 unsigned char output[32];
1894
1895 // SM3 hash function test
1896 sm3_init(&ctx);
1897 sm3_update(&ctx, 64, data);
1898 sm3_digest(&ctx, 32, data);
1899
1900 // HMAC-SM3 test
1901 hmac_sm3_set_key(&hmac_ctx, 32, data);
1902 hmac_sm3_update(&hmac_ctx, 64, data);
1903 hmac_sm3_digest(&hmac_ctx, 32, output);
1904
1905 return 0;
1906 }''', dependencies: nettle)
1907 crypto_sm3 = not_found
1908 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001909 endif
1910endif
1911
Paolo Bonzinia775c712023-09-08 12:09:22 +02001912capstone = not_found
1913if not get_option('capstone').auto() or have_system or have_user
1914 capstone = dependency('capstone', version: '>=3.0.5',
1915 method: 'pkg-config',
1916 required: get_option('capstone'))
1917
1918 # Some versions of capstone have broken pkg-config file
1919 # that reports a wrong -I path, causing the #include to
1920 # fail later. If the system has such a broken version
1921 # do not use it.
1922 if capstone.found() and not cc.compiles('#include <capstone.h>',
1923 dependencies: [capstone])
1924 capstone = not_found
1925 if get_option('capstone').enabled()
1926 error('capstone requested, but it does not appear to work')
1927 endif
1928 endif
1929endif
1930
Paolo Bonzini063d5112022-07-14 14:56:58 +02001931gmp = dependency('gmp', required: false, method: 'pkg-config')
Lei He4c5e5122022-05-25 17:01:14 +08001932if nettle.found() and gmp.found()
1933 hogweed = dependency('hogweed', version: '>=3.4',
1934 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001935 required: get_option('nettle'))
Lei He4c5e5122022-05-25 17:01:14 +08001936endif
1937
1938
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001939gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +01001940gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001941vte = not_found
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001942have_gtk_clipboard = get_option('gtk_clipboard').enabled()
1943
Marc-André Lureauda554e12023-08-30 13:38:36 +04001944if get_option('gtk') \
1945 .disable_auto_if(not have_system) \
1946 .require(pixman.found(),
1947 error_message: 'cannot enable GTK if pixman is not available') \
1948 .allowed()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001949 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1950 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001951 required: get_option('gtk'))
Paolo Bonzini1b695472021-01-07 14:02:29 +01001952 if gtk.found()
1953 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1954 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001955 required: false)
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001956 gtk = declare_dependency(dependencies: [gtk, gtkx11],
1957 version: gtk.version())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001958
1959 if not get_option('vte').auto() or have_system
1960 vte = dependency('vte-2.91',
1961 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001962 required: get_option('vte'))
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001963 endif
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001964 elif have_gtk_clipboard
1965 error('GTK clipboard requested, but GTK not found')
Paolo Bonzini1b695472021-01-07 14:02:29 +01001966 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001967endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001968
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001969x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +02001970if gtkx11.found()
Paolo Bonzini063d5112022-07-14 14:56:58 +02001971 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001972endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001973png = not_found
Kshitij Suri95f85102022-04-08 07:13:34 +00001974if get_option('png').allowed() and have_system
Thomas Huth1ec8c2c2022-06-23 19:49:41 +02001975 png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001976 method: 'pkg-config')
Kshitij Suri95f85102022-04-08 07:13:34 +00001977endif
1978vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001979jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001980sasl = not_found
Marc-André Lureau89fd3ea2023-08-30 13:38:34 +04001981if get_option('vnc') \
1982 .disable_auto_if(not have_system) \
1983 .require(pixman.found(),
1984 error_message: 'cannot enable VNC if pixman is not available') \
1985 .allowed()
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001986 vnc = declare_dependency() # dummy dependency
Paolo Bonzini8e242b32020-11-23 13:34:02 -05001987 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001988 method: 'pkg-config')
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001989 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001990 required: get_option('vnc_sasl'))
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001991 if sasl.found()
1992 sasl = declare_dependency(dependencies: sasl,
1993 compile_args: '-DSTRUCT_IOVEC_DEFINED')
1994 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001995endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01001996
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001997pam = not_found
1998if not get_option('auth_pam').auto() or have_system
1999 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002000 required: get_option('auth_pam'))
Paolo Bonzini05e391a2021-06-03 11:15:26 +02002001endif
2002if pam.found() and not cc.links('''
2003 #include <stddef.h>
2004 #include <security/pam_appl.h>
2005 int main(void) {
2006 const char *service_name = "qemu";
2007 const char *user = "frank";
2008 const struct pam_conv pam_conv = { 0 };
2009 pam_handle_t *pamh = NULL;
2010 pam_start(service_name, user, &pam_conv, &pamh);
2011 return 0;
2012 }''', dependencies: pam)
2013 pam = not_found
2014 if get_option('auth_pam').enabled()
2015 error('could not link libpam')
2016 else
2017 warning('could not link libpam, disabling')
2018 endif
2019endif
2020
Marc-André Lureau708eab42019-09-03 16:59:33 +04002021snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +01002022if not get_option('snappy').auto() or have_system
2023 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002024 required: get_option('snappy'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04002025endif
Thomas Huth785abf02023-07-06 08:47:36 +02002026if snappy.found() and not cc.links('''
Paolo Bonzini241611e2020-11-17 13:32:34 +01002027 #include <snappy-c.h>
2028 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
2029 snappy = not_found
2030 if get_option('snappy').enabled()
2031 error('could not link libsnappy')
2032 else
2033 warning('could not link libsnappy, disabling')
2034 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +04002035endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002036
Marc-André Lureau708eab42019-09-03 16:59:33 +04002037lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002038if not get_option('lzo').auto() or have_system
2039 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002040 required: get_option('lzo'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04002041endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002042if lzo.found() and not cc.links('''
2043 #include <lzo/lzo1x.h>
2044 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
2045 lzo = not_found
2046 if get_option('lzo').enabled()
2047 error('could not link liblzo2')
2048 else
2049 warning('could not link liblzo2, disabling')
2050 endif
2051endif
2052
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002053numa = not_found
2054if not get_option('numa').auto() or have_system or have_tools
2055 numa = cc.find_library('numa', has_headers: ['numa.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002056 required: get_option('numa'))
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002057endif
2058if numa.found() and not cc.links('''
2059 #include <numa.h>
2060 int main(void) { return numa_available(); }
2061 ''', dependencies: numa)
2062 numa = not_found
2063 if get_option('numa').enabled()
2064 error('could not link numa')
2065 else
2066 warning('could not link numa, disabling')
2067 endif
2068endif
2069
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01002070fdt = not_found
2071fdt_opt = get_option('fdt')
2072if fdt_opt == 'enabled' and get_option('wrap_mode') == 'nodownload'
2073 fdt_opt = 'system'
2074endif
2075if fdt_opt in ['enabled', 'system'] or (fdt_opt == 'auto' and have_system)
2076 fdt = cc.find_library('fdt', required: fdt_opt == 'system')
2077 if fdt.found() and cc.links('''
2078 #include <libfdt.h>
2079 #include <libfdt_env.h>
2080 int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
2081 dependencies: fdt)
2082 fdt_opt = 'system'
2083 elif fdt_opt != 'system'
2084 fdt_opt = get_option('wrap_mode') == 'nodownload' ? 'disabled' : 'internal'
2085 fdt = not_found
2086 else
2087 error('system libfdt is too old (1.5.1 or newer required)')
2088 endif
2089endif
2090if fdt_opt == 'internal'
2091 assert(not fdt.found())
2092 libfdt_proj = subproject('dtc', required: true,
2093 default_options: ['tools=false', 'yaml=disabled',
2094 'python=disabled', 'default_library=static'])
2095 fdt = libfdt_proj.get_variable('libfdt_dep')
2096endif
2097
Marc-André Lureau55166232019-07-24 19:16:22 +04002098rdma = not_found
Paolo Bonzini3730a732022-04-20 17:33:41 +02002099if not get_option('rdma').auto() or have_system
Paolo Bonzini3730a732022-04-20 17:33:41 +02002100 rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002101 required: get_option('rdma')),
zhenwei pi829858f2024-06-11 18:54:26 +08002102 cc.find_library('ibverbs', required: get_option('rdma'))]
Paolo Bonzini3730a732022-04-20 17:33:41 +02002103 rdma = declare_dependency(dependencies: rdma_libs)
2104 foreach lib: rdma_libs
2105 if not lib.found()
2106 rdma = not_found
2107 endif
2108 endforeach
Marc-André Lureau55166232019-07-24 19:16:22 +04002109endif
Paolo Bonzini3730a732022-04-20 17:33:41 +02002110
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002111cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02002112if not get_option('smartcard').auto() or have_system
2113 cacard = dependency('libcacard', required: get_option('smartcard'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002114 version: '>=2.5.1', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002115endif
César Belley0a40bcb2020-08-26 13:42:04 +02002116u2f = not_found
Paolo Bonzinie7c22ff2023-09-08 12:10:27 +02002117if not get_option('u2f').auto() or have_system
César Belley0a40bcb2020-08-26 13:42:04 +02002118 u2f = dependency('u2f-emu', required: get_option('u2f'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002119 method: 'pkg-config')
César Belley0a40bcb2020-08-26 13:42:04 +02002120endif
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002121canokey = not_found
Paolo Bonzinie7c22ff2023-09-08 12:10:27 +02002122if not get_option('canokey').auto() or have_system
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002123 canokey = dependency('canokey-qemu', required: get_option('canokey'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002124 method: 'pkg-config')
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002125endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002126usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02002127if not get_option('usb_redir').auto() or have_system
2128 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002129 version: '>=0.6', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002130endif
2131libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02002132if not get_option('libusb').auto() or have_system
2133 libusb = dependency('libusb-1.0', required: get_option('libusb'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002134 version: '>=1.0.13', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002135endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02002136
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002137libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02002138if not get_option('libpmem').auto() or have_system
2139 libpmem = dependency('libpmem', required: get_option('libpmem'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002140 method: 'pkg-config')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002141endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06002142libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02002143if not get_option('libdaxctl').auto() or have_system
2144 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002145 version: '>=57', method: 'pkg-config')
Bruce Rogersc7c91a72020-08-24 09:52:12 -06002146endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04002147tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02002148if gnutls.found()
2149 tasn1 = dependency('libtasn1',
Philippe Mathieu-Daudédc37d1c2024-05-02 11:56:42 +02002150 required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02002151 method: 'pkg-config')
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04002152endif
Max Fritz0db0fbb2023-05-22 02:12:02 +02002153keyutils = not_found
Thomas Huthc64023b2023-08-24 11:42:08 +02002154if not get_option('libkeyutils').auto() or have_block
2155 keyutils = dependency('libkeyutils', required: get_option('libkeyutils'),
2156 method: 'pkg-config')
Max Fritz0db0fbb2023-05-22 02:12:02 +02002157endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002158
Marc-André Lureau3909def2020-08-28 15:07:33 +04002159has_gettid = cc.has_function('gettid')
2160
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002161# libselinux
2162selinux = dependency('libselinux',
2163 required: get_option('selinux'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002164 method: 'pkg-config')
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002165
Paolo Bonziniaa087962020-09-01 11:15:30 -04002166# Malloc tests
2167
2168malloc = []
2169if get_option('malloc') == 'system'
2170 has_malloc_trim = \
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002171 get_option('malloc_trim').allowed() and \
Michal Privoznik09a49af2023-05-30 12:31:23 +02002172 cc.has_function('malloc_trim', prefix: '#include <malloc.h>')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002173else
2174 has_malloc_trim = false
2175 malloc = cc.find_library(get_option('malloc'), required: true)
2176endif
2177if not has_malloc_trim and get_option('malloc_trim').enabled()
2178 if get_option('malloc') == 'system'
2179 error('malloc_trim not available on this platform.')
2180 else
2181 error('malloc_trim not available with non-libc memory allocator')
2182 endif
2183endif
2184
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002185gnu_source_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01002186 #ifndef _GNU_SOURCE
2187 #define _GNU_SOURCE
2188 #endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002189'''
Max Reitz84e319a2020-11-02 17:18:55 +01002190
Michal Privoznik09a49af2023-05-30 12:31:23 +02002191# Check whether the glibc provides STATX_BASIC_STATS
2192
2193has_statx = cc.has_header_symbol('sys/stat.h', 'STATX_BASIC_STATS', prefix: gnu_source_prefix)
Max Reitz84e319a2020-11-02 17:18:55 +01002194
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002195# Check whether statx() provides mount ID information
2196
Michal Privoznik09a49af2023-05-30 12:31:23 +02002197has_statx_mnt_id = cc.has_header_symbol('sys/stat.h', 'STATX_MNT_ID', prefix: gnu_source_prefix)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002198
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002199have_vhost_user_blk_server = get_option('vhost_user_blk_server') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002200 .require(host_os == 'linux',
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002201 error_message: 'vhost_user_blk_server requires linux') \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02002202 .require(have_vhost_user,
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002203 error_message: 'vhost_user_blk_server requires vhost-user support') \
Alex Bennée26ed5012022-05-24 16:40:42 +01002204 .disable_auto_if(not have_tools and not have_system) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002205 .allowed()
Daniele Buono9e62ba42020-12-04 18:06:14 -05002206
Max Reitzdf4ea702020-10-27 20:05:46 +01002207if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
2208 error('Cannot enable fuse-lseek while fuse is disabled')
2209endif
2210
Max Reitza484a712020-10-27 20:05:41 +01002211fuse = dependency('fuse3', required: get_option('fuse'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002212 version: '>=3.1', method: 'pkg-config')
Max Reitza484a712020-10-27 20:05:41 +01002213
Max Reitzdf4ea702020-10-27 20:05:46 +01002214fuse_lseek = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002215if get_option('fuse_lseek').allowed()
Max Reitzdf4ea702020-10-27 20:05:46 +01002216 if fuse.version().version_compare('>=3.8')
2217 # Dummy dependency
2218 fuse_lseek = declare_dependency()
2219 elif get_option('fuse_lseek').enabled()
2220 if fuse.found()
2221 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
2222 else
2223 error('fuse-lseek requires libfuse, which was not found')
2224 endif
2225 endif
2226endif
2227
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002228have_libvduse = (host_os == 'linux')
Xie Yongjia6caeee2022-05-23 16:46:08 +08002229if get_option('libvduse').enabled()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002230 if host_os != 'linux'
Xie Yongjia6caeee2022-05-23 16:46:08 +08002231 error('libvduse requires linux')
2232 endif
2233elif get_option('libvduse').disabled()
2234 have_libvduse = false
2235endif
2236
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002237have_vduse_blk_export = (have_libvduse and host_os == 'linux')
Xie Yongji2a2359b2022-05-23 16:46:09 +08002238if get_option('vduse_blk_export').enabled()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002239 if host_os != 'linux'
Xie Yongji2a2359b2022-05-23 16:46:09 +08002240 error('vduse_blk_export requires linux')
2241 elif not have_libvduse
2242 error('vduse_blk_export requires libvduse support')
2243 endif
2244elif get_option('vduse_blk_export').disabled()
2245 have_vduse_blk_export = false
2246endif
2247
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002248# libbpf
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002249bpf_version = '1.1.0'
2250libbpf = dependency('libbpf', version: '>=' + bpf_version, required: get_option('bpf'), method: 'pkg-config')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002251if libbpf.found() and not cc.links('''
2252 #include <bpf/libbpf.h>
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002253 #include <linux/bpf.h>
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002254 int main(void)
2255 {
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002256 // check flag availability
2257 int flag = BPF_F_MMAPABLE;
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002258 bpf_object__destroy_skeleton(NULL);
2259 return 0;
2260 }''', dependencies: libbpf)
2261 libbpf = not_found
2262 if get_option('bpf').enabled()
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002263 error('libbpf skeleton/mmaping test failed')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002264 else
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002265 warning('libbpf skeleton/mmaping test failed, disabling')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002266 endif
2267endif
2268
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002269# libxdp
2270libxdp = not_found
2271if not get_option('af_xdp').auto() or have_system
Daniel P. Berrangé1f372802024-10-23 09:50:56 +01002272 if libbpf.found()
2273 libxdp = dependency('libxdp', required: get_option('af_xdp'),
2274 version: '>=1.4.0', method: 'pkg-config')
2275 else
2276 if get_option('af_xdp').enabled()
2277 error('libxdp requested, but libbpf is not available')
2278 endif
2279 endif
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002280endif
2281
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002282# libdw
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002283libdw = not_found
Ilya Leoshkevich550c6d92023-02-10 01:52:08 +01002284if not get_option('libdw').auto() or \
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02002285 (not get_option('prefer_static') and (have_system or have_user))
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002286 libdw = dependency('libdw',
2287 method: 'pkg-config',
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002288 required: get_option('libdw'))
2289endif
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002290
Paolo Bonzini87430d52021-10-07 15:06:09 +02002291#################
2292# config-host.h #
2293#################
2294
Paolo Bonzini95933f12023-09-08 12:10:08 +02002295config_host_data = configuration_data()
2296
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03002297config_host_data.set('CONFIG_HAVE_RUST', have_rust)
Paolo Bonzini87430d52021-10-07 15:06:09 +02002298audio_drivers_selected = []
2299if have_system
2300 audio_drivers_available = {
2301 'alsa': alsa.found(),
2302 'coreaudio': coreaudio.found(),
2303 'dsound': dsound.found(),
2304 'jack': jack.found(),
2305 'oss': oss.found(),
2306 'pa': pulse.found(),
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02002307 'pipewire': pipewire.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002308 'sdl': sdl.found(),
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002309 'sndio': sndio.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002310 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02002311 foreach k, v: audio_drivers_available
2312 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
2313 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02002314
2315 # Default to native drivers first, OSS second, SDL third
2316 audio_drivers_priority = \
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002317 [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002318 (host_os == 'linux' ? [] : [ 'sdl' ])
Paolo Bonzini87430d52021-10-07 15:06:09 +02002319 audio_drivers_default = []
2320 foreach k: audio_drivers_priority
2321 if audio_drivers_available[k]
2322 audio_drivers_default += k
2323 endif
2324 endforeach
2325
2326 foreach k: get_option('audio_drv_list')
2327 if k == 'default'
2328 audio_drivers_selected += audio_drivers_default
2329 elif not audio_drivers_available[k]
2330 error('Audio driver "@0@" not available.'.format(k))
2331 else
2332 audio_drivers_selected += k
2333 endif
2334 endforeach
2335endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02002336config_host_data.set('CONFIG_AUDIO_DRIVERS',
2337 '"' + '", "'.join(audio_drivers_selected) + '", ')
2338
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002339have_host_block_device = (host_os != 'darwin' or
Joelle van Dyne14176c82021-03-15 11:03:38 -07002340 cc.has_header('IOKit/storage/IOMedia.h'))
2341
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002342dbus_display = get_option('dbus_display') \
2343 .require(gio.version().version_compare('>=2.64'),
2344 error_message: '-display dbus requires glib>=2.64') \
Paolo Bonzini75440602022-04-20 17:33:44 +02002345 .require(gdbus_codegen.found(),
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02002346 error_message: gdbus_codegen_error.format('-display dbus')) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002347 .allowed()
Marc-André Lureau142ca622021-07-15 11:53:53 +04002348
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002349have_virtfs = get_option('virtfs') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002350 .require(host_os == 'linux' or host_os == 'darwin',
Keno Fischer0fb1e192022-02-27 17:35:22 -05002351 error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002352 .require(host_os == 'linux' or cc.has_function('pthread_fchdir_np'),
Keno Fischer0fb1e192022-02-27 17:35:22 -05002353 error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002354 .require(host_os == 'darwin' or libattr.found(),
Peter Foley1a67e072023-05-03 09:07:56 -04002355 error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002356 .disable_auto_if(not have_tools and not have_system) \
2357 .allowed()
Paolo Bonzini69202b42020-11-17 14:46:21 +01002358
Daniel P. Berrangé4bb3da42024-07-12 14:24:44 +01002359qga_fsfreeze = false
2360qga_fstrim = false
2361if host_os == 'linux'
2362 if cc.has_header_symbol('linux/fs.h', 'FIFREEZE')
2363 qga_fsfreeze = true
2364 endif
2365 if cc.has_header_symbol('linux/fs.h', 'FITRIM')
2366 qga_fstrim = true
2367 endif
2368elif host_os == 'freebsd' and cc.has_header_symbol('ufs/ffs/fs.h', 'UFSSUSPEND')
2369 qga_fsfreeze = true
2370endif
2371
Paolo Bonzini622d64f2022-04-20 17:33:53 +02002372if get_option('block_drv_ro_whitelist') == ''
2373 config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
2374else
2375 config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
2376 '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
2377endif
2378if get_option('block_drv_rw_whitelist') == ''
2379 config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
2380else
2381 config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
2382 '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
2383endif
2384
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002385foreach k : get_option('trace_backends')
2386 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
2387endforeach
2388config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02002389config_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
Paolo Bonzini40c909f2022-04-20 17:33:49 +02002390if iasl.found()
2391 config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
Paolo Bonzini5dc46182021-10-13 13:19:00 +02002392endif
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002393config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
2394config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
2395config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
2396config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
2397config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09002398
2399qemu_firmwarepath = ''
2400foreach k : get_option('qemu_firmwarepath')
2401 qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
2402endforeach
2403config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
2404
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002405config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
2406config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
2407config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
2408config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
2409config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
2410config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
2411
Paolo Bonzini60027112022-10-20 14:53:10 +02002412if enable_modules
Paolo Bonzinib0b43232022-04-20 17:33:54 +02002413 config_host_data.set('CONFIG_STAMP', run_command(
2414 meson.current_source_dir() / 'scripts/qemu-stamp.py',
2415 meson.project_version(), get_option('pkgversion'), '--',
2416 meson.current_source_dir() / 'configure',
2417 capture: true, check: true).stdout().strip())
2418endif
2419
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002420have_slirp_smbd = get_option('slirp_smbd') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002421 .require(host_os != 'windows', error_message: 'Host smbd not supported on this platform.') \
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002422 .allowed()
2423if have_slirp_smbd
2424 smbd_path = get_option('smbd')
2425 if smbd_path == ''
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002426 smbd_path = (host_os == 'sunos' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002427 endif
2428 config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
2429endif
2430
Paolo Bonzini823eb012021-11-08 14:18:17 +01002431config_host_data.set('HOST_' + host_arch.to_upper(), 1)
2432
Paolo Bonzini95933f12023-09-08 12:10:08 +02002433kvm_targets_c = '""'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002434if get_option('kvm').allowed() and host_os == 'linux'
Paolo Bonzini95933f12023-09-08 12:10:08 +02002435 kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
2436endif
2437config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
2438
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02002439if get_option('module_upgrades') and not enable_modules
2440 error('Cannot enable module-upgrades as modules are not enabled')
2441endif
2442config_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
2443
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002444config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002445config_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002446config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002447config_host_data.set('CONFIG_BSD', host_os in bsd_oses)
Daniel P. Berrangé4be55a42024-07-12 14:24:54 +01002448config_host_data.set('CONFIG_FREEBSD', host_os == 'freebsd')
Paolo Bonzinia775c712023-09-08 12:09:22 +02002449config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04002450config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002451config_host_data.set('CONFIG_DARWIN', host_os == 'darwin')
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01002452config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini537b7242021-10-07 15:08:12 +02002453config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02002454config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002455config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002456config_host_data.set('CONFIG_LINUX', host_os == 'linux')
2457config_host_data.set('CONFIG_POSIX', host_os != 'windows')
2458config_host_data.set('CONFIG_WIN32', host_os == 'windows')
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002459config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002460config_host_data.set('CONFIG_MPATH', mpathpersist.found())
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04002461config_host_data.set('CONFIG_BLKIO', blkio.found())
Stefano Garzarella98b126f2023-05-30 09:19:41 +02002462if blkio.found()
2463 config_host_data.set('CONFIG_BLKIO_VHOST_VDPA_FD',
2464 blkio.version().version_compare('>=1.3.0'))
Stefano Garzarella547c4e52024-08-08 10:05:45 +02002465 config_host_data.set('CONFIG_BLKIO_WRITE_ZEROS_FUA',
2466 blkio.version().version_compare('>=1.4.0'))
Stefano Garzarella98b126f2023-05-30 09:19:41 +02002467endif
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002468config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08002469config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02002470config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini75440602022-04-20 17:33:44 +02002471config_host_data.set('CONFIG_GIO', gio.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002472config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
2473if glusterfs.found()
2474 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
2475 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
2476 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
2477 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
2478 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
2479 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
2480endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002481config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02002482config_host_data.set('CONFIG_VTE', vte.found())
Claudio Fontana29e0bff2022-11-21 14:55:38 +01002483config_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard)
Taylor Simpson63efb6a2023-04-27 15:59:52 -07002484config_host_data.set('CONFIG_HEXAGON_IDEF_PARSER', get_option('hexagon_idef_parser'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002485config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002486config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002487config_host_data.set('CONFIG_EBPF', libbpf.found())
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002488config_host_data.set('CONFIG_AF_XDP', libxdp.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002489config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002490config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01002491config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Thomas Huthe6a52b32021-12-09 15:48:01 +01002492config_host_data.set('CONFIG_LIBSSH', libssh.found())
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02002493config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002494config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
2495config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzini60027112022-10-20 14:53:10 +02002496config_host_data.set('CONFIG_MODULES', enable_modules)
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002497config_host_data.set('CONFIG_NUMA', numa.found())
Michal Privoznik6bb613f2022-12-15 10:55:03 +01002498if numa.found()
2499 config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY',
2500 cc.has_function('numa_has_preferred_many',
2501 dependencies: numa))
2502endif
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002503config_host_data.set('CONFIG_OPENGL', opengl.found())
Paolo Bonzini2c13c572023-08-30 12:20:53 +02002504config_host_data.set('CONFIG_PLUGIN', get_option('plugins'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002505config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini3730a732022-04-20 17:33:41 +02002506config_host_data.set('CONFIG_RDMA', rdma.found())
Paolo Bonzini655e2a72023-10-05 14:19:34 +02002507config_host_data.set('CONFIG_RELOCATABLE', get_option('relocatable'))
Paolo Bonzini721fa5e2022-10-12 11:59:51 +02002508config_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002509config_host_data.set('CONFIG_SDL', sdl.found())
2510config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01002511config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Michal Privoznik73422d92022-10-26 09:30:24 +02002512if seccomp.found()
2513 config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
2514endif
Marc-André Lureaucca15752023-08-30 13:38:25 +04002515config_host_data.set('CONFIG_PIXMAN', pixman.found())
Paolo Bonzinia775c712023-09-08 12:09:22 +02002516config_host_data.set('CONFIG_SLIRP', slirp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01002517config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002518config_host_data.set('CONFIG_SOLARIS', host_os == 'sunos')
Paolo Bonzini875be2872022-02-15 11:37:00 +01002519if get_option('tcg').allowed()
2520 config_host_data.set('CONFIG_TCG', 1)
2521 config_host_data.set('CONFIG_TCG_INTERPRETER', tcg_arch == 'tci')
2522endif
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002523config_host_data.set('CONFIG_TPM', have_tpm)
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002524config_host_data.set('CONFIG_TSAN', get_option('tsan'))
Paolo Bonzini90540f32021-06-03 11:15:26 +02002525config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Paolo Bonzinie1723992021-10-07 15:08:21 +02002526config_host_data.set('CONFIG_VDE', vde.found())
Stefan Hajnoczic0c4f142023-10-03 21:45:32 -04002527config_host_data.set('CONFIG_VHOST', have_vhost)
Paolo Bonzini2df89d52022-04-20 17:34:07 +02002528config_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
2529config_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
2530config_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
2531config_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
2532config_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
2533config_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
2534config_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03002535config_host_data.set('CONFIG_VMNET', vmnet.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002536config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Xie Yongji2a2359b2022-05-23 16:46:09 +08002537config_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
Kshitij Suri95f85102022-04-08 07:13:34 +00002538config_host_data.set('CONFIG_PNG', png.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002539config_host_data.set('CONFIG_VNC', vnc.found())
2540config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002541config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini95933f12023-09-08 12:10:08 +02002542if virgl.found()
Dmitry Osipenkoffac9642024-10-25 00:03:04 +03002543 config_host_data.set('VIRGL_VERSION_MAJOR', virgl.version().split('.')[0])
Paolo Bonzini95933f12023-09-08 12:10:08 +02002544endif
Paolo Bonzini69202b42020-11-17 14:46:21 +01002545config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002546config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002547config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04002548config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04002549config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02002550config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01002551config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Daniel P. Berrangéd47b83b2022-04-26 17:00:43 +01002552config_host_data.set('CONFIG_TASN1', tasn1.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002553config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
2554config_host_data.set('CONFIG_NETTLE', nettle.found())
Hyman Huang52ed9f42023-12-07 23:47:35 +08002555config_host_data.set('CONFIG_CRYPTO_SM4', crypto_sm4.found())
liequan ched078da82024-10-30 08:51:46 +00002556config_host_data.set('CONFIG_CRYPTO_SM3', crypto_sm3.found())
Lei He4c5e5122022-05-25 17:01:14 +08002557config_host_data.set('CONFIG_HOGWEED', hogweed.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002558config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002559config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01002560config_host_data.set('CONFIG_STATX', has_statx)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002561config_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id)
Paolo Bonzinib1def332020-11-17 13:37:39 +01002562config_host_data.set('CONFIG_ZSTD', zstd.found())
Yuan Liub844a2c2024-06-10 18:21:06 +08002563config_host_data.set('CONFIG_QPL', qpl.found())
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01002564config_host_data.set('CONFIG_UADK', uadk.found())
Bryan Zhange28ed312024-08-30 16:27:19 -07002565config_host_data.set('CONFIG_QATZIP', qatzip.found())
Max Reitza484a712020-10-27 20:05:41 +01002566config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01002567config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002568config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
Marc-André Lureauddece462021-10-06 14:18:09 +04002569if spice_protocol.found()
2570config_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
2571config_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
2572config_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
2573endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002574config_host_data.set('CONFIG_SPICE', spice.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01002575config_host_data.set('CONFIG_X11', x11.found())
Marc-André Lureau142ca622021-07-15 11:53:53 +04002576config_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
Daniele Buono9e62ba42020-12-04 18:06:14 -05002577config_host_data.set('CONFIG_CFI', get_option('cfi'))
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002578config_host_data.set('CONFIG_SELINUX', selinux.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002579config_host_data.set('CONFIG_XEN_BACKEND', xen.found())
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002580config_host_data.set('CONFIG_LIBDW', libdw.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002581if xen.found()
2582 # protect from xen.version() having less than three components
2583 xen_version = xen.version().split('.') + ['0', '0']
2584 xen_ctrl_version = xen_version[0] + \
2585 ('0' + xen_version[1]).substring(-2) + \
2586 ('0' + xen_version[2]).substring(-2)
2587 config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
2588endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002589config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
2590config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
2591config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
2592config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
2593
Paolo Bonzinia6305082021-10-07 15:08:15 +02002594config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002595config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
2596
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002597have_coroutine_pool = get_option('coroutine_pool')
2598if get_option('debug_stack_usage') and have_coroutine_pool
2599 message('Disabling coroutine pool to measure stack usage')
2600 have_coroutine_pool = false
2601endif
Paolo Bonzini230f6e02023-10-05 14:31:27 +02002602config_host_data.set('CONFIG_COROUTINE_POOL', have_coroutine_pool)
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04002603config_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002604config_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002605config_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
Paolo Bonzini1d558c92023-08-28 11:48:30 +02002606config_host_data.set('CONFIG_DEBUG_TCG', get_option('debug_tcg'))
Ilya Leoshkevich1f2355f2024-03-12 01:23:30 +01002607config_host_data.set('CONFIG_DEBUG_REMAP', get_option('debug_remap'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002608config_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
Juan Quintelaabad1852022-09-02 18:51:25 +02002609config_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
Daniel P. Berrangé4bb3da42024-07-12 14:24:44 +01002610config_host_data.set('CONFIG_FSFREEZE', qga_fsfreeze)
2611config_host_data.set('CONFIG_FSTRIM', qga_fstrim)
Paolo Bonzini406523f2021-10-13 11:43:54 +02002612
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002613# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002614config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002615config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
2616config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
Thomas Huth48f670e2020-11-18 18:10:52 +01002617config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01002618config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Michael Vogt97299302024-10-01 17:14:54 +02002619config_host_data.set('HAVE_OPENAT2_H', cc.has_header('linux/openat2.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01002620config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002621config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01002622config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01002623config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002624if host_os == 'windows'
Bin Mengd4093732022-08-02 15:51:58 +08002625 config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
2626endif
Thomas Huthded5d782020-11-14 11:10:11 +01002627
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002628# has_function
Claudio Imbrendac891c242022-08-12 15:34:53 +02002629config_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002630config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002631config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
2632config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
2633config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
2634config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Paolo Bonzini67504852023-06-21 00:47:31 +02002635config_host_data.set('CONFIG_GETCPU', cc.has_function('getcpu', prefix: gnu_source_prefix))
2636config_host_data.set('CONFIG_SCHED_GETCPU', cc.has_function('sched_getcpu', prefix: '#include <sched.h>'))
Peter Maydell86983432022-02-26 18:07:19 +00002637# Note that we need to specify prefix: here to avoid incorrectly
2638# thinking that Windows has posix_memalign()
2639config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
Peter Maydell5c8c7142022-02-26 18:07:20 +00002640config_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
Peter Maydell88454f82022-02-26 18:07:21 +00002641config_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
2642config_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002643config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002644config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Keno Fischer029ed1b2022-02-27 17:35:20 -05002645config_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002646config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
2647config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
2648config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
2649config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
2650config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Daniel P. Berrangé5288d9d2024-12-02 12:19:27 +00002651config_host_data.set('CONFIG_GETLOADAVG', cc.has_function('getloadavg'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002652config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Andrew Deason59e35c72022-04-26 14:55:22 -05002653config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02002654config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03002655config_host_data.set('HAVE_GLIB_WITH_ALIGNED_ALLOC', glib_has_aligned_alloc)
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002656config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002657config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002658config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Stefano Garzarella66dc5f92022-05-17 09:10:12 +02002659if rbd.found()
2660 config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
2661 cc.has_function('rbd_namespace_exists',
2662 dependencies: rbd,
2663 prefix: '#include <rbd/librbd.h>'))
2664endif
Li Zhijian911965a2021-09-10 15:02:55 +08002665if rdma.found()
2666 config_host_data.set('HAVE_IBV_ADVISE_MR',
2667 cc.has_function('ibv_advise_mr',
Paolo Bonzini3730a732022-04-20 17:33:41 +02002668 dependencies: rdma,
Li Zhijian911965a2021-09-10 15:02:55 +08002669 prefix: '#include <infiniband/verbs.h>'))
2670endif
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002671
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002672have_asan_fiber = false
Richard Hendersoncb771ac2024-08-13 19:52:15 +10002673if get_option('asan') and \
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002674 not cc.has_function('__sanitizer_start_switch_fiber',
2675 args: '-fsanitize=address',
2676 prefix: '#include <sanitizer/asan_interface.h>')
2677 warning('Missing ASAN due to missing fiber annotation interface')
2678 warning('Without code annotation, the report may be inferior.')
2679else
2680 have_asan_fiber = true
2681endif
2682config_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber)
2683
Ilya Leoshkevicha1a98002024-02-06 01:22:03 +01002684have_inotify_init = cc.has_header_symbol('sys/inotify.h', 'inotify_init')
2685have_inotify_init1 = cc.has_header_symbol('sys/inotify.h', 'inotify_init1')
2686inotify = not_found
2687if (have_inotify_init or have_inotify_init1) and host_os == 'freebsd'
2688 # libinotify-kqueue
2689 inotify = cc.find_library('inotify')
2690 if have_inotify_init
2691 have_inotify_init = inotify.found()
2692 endif
2693 if have_inotify_init1
2694 have_inotify_init1 = inotify.found()
2695 endif
2696endif
2697config_host_data.set('CONFIG_INOTIFY', have_inotify_init)
2698config_host_data.set('CONFIG_INOTIFY1', have_inotify_init1)
2699
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002700# has_header_symbol
Sam Li6d43eaa2023-05-08 12:55:28 +08002701config_host_data.set('CONFIG_BLKZONED',
2702 cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002703config_host_data.set('CONFIG_EPOLL_CREATE1',
2704 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
2705config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
2706 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
2707 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
2708config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
2709 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
2710config_host_data.set('CONFIG_FIEMAP',
2711 cc.has_header('linux/fiemap.h') and
2712 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002713config_host_data.set('CONFIG_GETRANDOM',
2714 cc.has_function('getrandom') and
2715 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002716config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
2717 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002718config_host_data.set('CONFIG_RTNETLINK',
2719 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
2720config_host_data.set('CONFIG_SYSMACROS',
2721 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002722config_host_data.set('HAVE_OPTRESET',
2723 cc.has_header_symbol('getopt.h', 'optreset'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04002724config_host_data.set('HAVE_IPPROTO_MPTCP',
2725 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002726
2727# has_member
2728config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
2729 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
2730 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002731config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
2732 cc.has_member('struct stat', 'st_atim',
2733 prefix: '#include <sys/stat.h>'))
Sam Li6d43eaa2023-05-08 12:55:28 +08002734config_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY',
2735 cc.has_member('struct blk_zone', 'capacity',
2736 prefix: '#include <linux/blkzoned.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002737
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002738# has_type
2739config_host_data.set('CONFIG_IOVEC',
2740 cc.has_type('struct iovec',
2741 prefix: '#include <sys/uio.h>'))
2742config_host_data.set('HAVE_UTMPX',
2743 cc.has_type('struct utmpx',
2744 prefix: '#include <utmpx.h>'))
2745
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002746config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002747 #include <sys/eventfd.h>
2748 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002749config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002750 #include <unistd.h>
2751 int main(void) {
2752 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2753 return fdatasync(0);
2754 #else
2755 #error Not supported
2756 #endif
2757 }'''))
Andrew Deason8900c202022-03-15 22:52:25 -05002758
2759has_madvise = cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002760 #include <sys/types.h>
2761 #include <sys/mman.h>
2762 #include <stddef.h>
Andrew Deason8900c202022-03-15 22:52:25 -05002763 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
2764missing_madvise_proto = false
2765if has_madvise
2766 # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
2767 # but forget to prototype it. In this case, has_madvise will be true (the
2768 # test program links despite a compile warning). To detect the
2769 # missing-prototype case, we try again with a definitely-bogus prototype.
2770 # This will only compile if the system headers don't provide the prototype;
2771 # otherwise the conflicting prototypes will cause a compiler error.
2772 missing_madvise_proto = cc.links(gnu_source_prefix + '''
2773 #include <sys/types.h>
2774 #include <sys/mman.h>
2775 #include <stddef.h>
2776 extern int madvise(int);
2777 int main(void) { return madvise(0); }''')
2778endif
2779config_host_data.set('CONFIG_MADVISE', has_madvise)
2780config_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
2781
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002782config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002783 #include <sys/mman.h>
2784 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002785config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002786 #include <fcntl.h>
2787 #if !defined(AT_EMPTY_PATH)
2788 # error missing definition
2789 #else
2790 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2791 #endif'''))
Michal Privoznik12d7d0c2024-06-05 12:44:54 +02002792
2793# On Darwin posix_madvise() has the same return semantics as plain madvise(),
2794# i.e. errno is set and -1 is returned. That's not really how POSIX defines the
2795# function. On the flip side, it has madvise() which is preferred anyways.
2796if host_os != 'darwin'
2797 config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
2798 #include <sys/mman.h>
2799 #include <stddef.h>
2800 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
2801endif
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002802
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002803config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002804 #include <pthread.h>
2805
2806 static void *f(void *p) { return NULL; }
2807 int main(void)
2808 {
2809 pthread_t thread;
2810 pthread_create(&thread, 0, f, 0);
2811 pthread_setname_np(thread, "QEMU");
2812 return 0;
2813 }''', dependencies: threads))
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002814config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002815 #include <pthread.h>
2816
2817 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
2818 int main(void)
2819 {
2820 pthread_t thread;
2821 pthread_create(&thread, 0, f, 0);
2822 return 0;
2823 }''', dependencies: threads))
Brad Smith3ada67a2022-12-18 03:22:04 -05002824config_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + '''
2825 #include <pthread.h>
2826 #include <pthread_np.h>
2827
2828 static void *f(void *p) { return NULL; }
2829 int main(void)
2830 {
2831 pthread_t thread;
2832 pthread_create(&thread, 0, f, 0);
2833 pthread_set_name_np(thread, "QEMU");
2834 return 0;
2835 }''', dependencies: threads))
Longpeng(Mike)657ac982022-02-22 17:05:05 +08002836config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
2837 #include <pthread.h>
2838 #include <time.h>
2839
2840 int main(void)
2841 {
2842 pthread_condattr_t attr
2843 pthread_condattr_init(&attr);
2844 pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2845 return 0;
2846 }''', dependencies: threads))
David Hildenbrand7730f322022-10-14 15:47:15 +02002847config_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + '''
2848 #include <pthread.h>
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002849
David Hildenbrand7730f322022-10-14 15:47:15 +02002850 static void *f(void *p) { return NULL; }
2851 int main(void)
2852 {
2853 int setsize = CPU_ALLOC_SIZE(64);
2854 pthread_t thread;
2855 cpu_set_t *cpuset;
2856 pthread_create(&thread, 0, f, 0);
2857 cpuset = CPU_ALLOC(64);
2858 CPU_ZERO_S(setsize, cpuset);
2859 pthread_setaffinity_np(thread, setsize, cpuset);
2860 pthread_getaffinity_np(thread, setsize, cpuset);
2861 CPU_FREE(cpuset);
2862 return 0;
2863 }''', dependencies: threads))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002864config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02002865 #include <sys/signalfd.h>
2866 #include <stddef.h>
2867 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002868config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002869 #include <unistd.h>
2870 #include <fcntl.h>
2871 #include <limits.h>
2872
2873 int main(void)
2874 {
2875 int len, fd = 0;
2876 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2877 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2878 return 0;
2879 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002880
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002881config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
2882 #include <sys/mman.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002883 int main(void) {
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002884 return mlockall(MCL_FUTURE);
2885 }'''))
2886
Daniil Tatianine76fadf2025-02-12 17:39:17 +03002887config_host_data.set('HAVE_MLOCK_ONFAULT', cc.links(gnu_source_prefix + '''
2888 #include <sys/mman.h>
2889 int main(void) {
2890 return mlockall(MCL_FUTURE | MCL_ONFAULT);
2891 }'''))
2892
Thomas Hutheea94532021-10-28 20:59:08 +02002893have_l2tpv3 = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002894if get_option('l2tpv3').allowed() and have_system
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002895 have_l2tpv3 = cc.has_type('struct mmsghdr',
2896 prefix: gnu_source_prefix + '''
2897 #include <sys/socket.h>
2898 #include <linux/ip.h>''')
Thomas Hutheea94532021-10-28 20:59:08 +02002899endif
2900config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2901
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002902have_netmap = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002903if get_option('netmap').allowed() and have_system
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002904 have_netmap = cc.compiles('''
2905 #include <inttypes.h>
2906 #include <net/if.h>
2907 #include <net/netmap.h>
2908 #include <net/netmap_user.h>
2909 #if (NETMAP_API < 11) || (NETMAP_API > 15)
2910 #error
2911 #endif
2912 int main(void) { return 0; }''')
2913 if not have_netmap and get_option('netmap').enabled()
2914 error('Netmap headers not available')
2915 endif
2916endif
2917config_host_data.set('CONFIG_NETMAP', have_netmap)
2918
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002919# Work around a system header bug with some kernel/XFS header
2920# versions where they both try to define 'struct fsxattr':
2921# xfs headers will not try to redefine structs from linux headers
2922# if this macro is set.
2923config_host_data.set('HAVE_FSXATTR', cc.links('''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002924 #include <linux/fs.h>
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002925 struct fsxattr foo;
2926 int main(void) {
2927 return 0;
2928 }'''))
2929
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002930# Some versions of Mac OS X incorrectly define SIZE_MAX
2931config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2932 #include <stdint.h>
2933 #include <stdio.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002934 int main(void) {
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002935 return printf("%zu", SIZE_MAX);
2936 }''', args: ['-Werror']))
2937
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002938# See if 64-bit atomic operations are supported.
2939# Note that without __atomic builtins, we can only
2940# assume atomic loads/stores max at pointer size.
2941config_host_data.set('CONFIG_ATOMIC64', cc.links('''
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002942 #include <stdint.h>
2943 int main(void)
2944 {
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002945 uint64_t x = 0, y = 0;
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002946 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
2947 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
2948 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2949 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2950 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2951 return 0;
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02002952 }''', args: qemu_isa_flags))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002953
Richard Henderson6479dd72023-05-24 08:14:41 -07002954has_int128_type = cc.compiles('''
2955 __int128_t a;
2956 __uint128_t b;
2957 int main(void) { b = a; }''')
2958config_host_data.set('CONFIG_INT128_TYPE', has_int128_type)
2959
2960has_int128 = has_int128_type and cc.links('''
Marc-André Lureau848126d2022-02-28 15:49:19 +04002961 __int128_t a;
2962 __uint128_t b;
2963 int main (void) {
2964 a = a + b;
2965 b = a * b;
2966 a = a * a;
2967 return 0;
2968 }''')
Marc-André Lureau848126d2022-02-28 15:49:19 +04002969config_host_data.set('CONFIG_INT128', has_int128)
2970
Richard Henderson6479dd72023-05-24 08:14:41 -07002971if has_int128_type
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002972 # "do we have 128-bit atomics which are handled inline and specifically not
2973 # via libatomic". The reason we can't use libatomic is documented in the
2974 # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002975 # We only care about these operations on 16-byte aligned pointers, so
2976 # force 16-byte alignment of the pointer, which may be greater than
2977 # __alignof(unsigned __int128) for the host.
2978 atomic_test_128 = '''
2979 int main(int ac, char **av) {
Richard Henderson6479dd72023-05-24 08:14:41 -07002980 __uint128_t *p = __builtin_assume_aligned(av[ac - 1], 16);
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002981 p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED);
2982 __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED);
2983 __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2984 return 0;
2985 }'''
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02002986 has_atomic128 = cc.links(atomic_test_128, args: qemu_isa_flags)
Marc-André Lureau848126d2022-02-28 15:49:19 +04002987
2988 config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
2989
2990 if not has_atomic128
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002991 # Even with __builtin_assume_aligned, the above test may have failed
2992 # without optimization enabled. Try again with optimizations locally
2993 # enabled for the function. See
2994 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02002995 has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128,
2996 args: qemu_isa_flags)
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002997 config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt)
Marc-André Lureau848126d2022-02-28 15:49:19 +04002998
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002999 if not has_atomic128_opt
3000 config_host_data.set('CONFIG_CMPXCHG128', cc.links('''
3001 int main(void)
3002 {
Richard Henderson6479dd72023-05-24 08:14:41 -07003003 __uint128_t x = 0, y = 0;
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003004 __sync_val_compare_and_swap_16(&x, y, x);
3005 return 0;
3006 }
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02003007 ''', args: qemu_isa_flags))
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003008 endif
Marc-André Lureau848126d2022-02-28 15:49:19 +04003009 endif
3010endif
Paolo Bonzinibd87a362021-10-07 15:08:25 +02003011
3012config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
3013 #include <sys/auxv.h>
3014 int main(void) {
3015 return getauxval(AT_HWCAP) == 0;
3016 }'''))
3017
Brad Smith27fca0a2024-07-27 23:58:55 -04003018config_host_data.set('CONFIG_ELF_AUX_INFO', cc.links(gnu_source_prefix + '''
3019 #include <sys/auxv.h>
3020 int main(void) {
3021 unsigned long hwcap = 0;
3022 elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
3023 return hwcap;
3024 }'''))
3025
Paolo Bonzini0dae95d2022-04-20 17:33:43 +02003026config_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
3027 #include <linux/usbdevice_fs.h>
3028
3029 #ifndef USBDEVFS_GET_CAPABILITIES
3030 #error "USBDEVFS_GET_CAPABILITIES undefined"
3031 #endif
3032
3033 #ifndef USBDEVFS_DISCONNECT_CLAIM
3034 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
3035 #endif
3036
3037 int main(void) { return 0; }'''))
3038
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02003039have_keyring = get_option('keyring') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003040 .require(host_os == 'linux', error_message: 'keyring is only available on Linux') \
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02003041 .require(cc.compiles('''
3042 #include <errno.h>
3043 #include <asm/unistd.h>
3044 #include <linux/keyctl.h>
3045 #include <sys/syscall.h>
3046 #include <unistd.h>
3047 int main(void) {
3048 return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
3049 }'''), error_message: 'keyctl syscall not available on this system').allowed()
3050config_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
3051
Paolo Bonzini622753d2021-11-08 13:38:58 +01003052have_cpuid_h = cc.links('''
3053 #include <cpuid.h>
3054 int main(void) {
3055 unsigned a, b, c, d;
3056 unsigned max = __get_cpuid_max(0, 0);
3057
3058 if (max >= 1) {
3059 __cpuid(1, a, b, c, d);
3060 }
3061
3062 if (max >= 7) {
3063 __cpuid_count(7, 0, a, b, c, d);
3064 }
3065
3066 return 0;
3067 }''')
3068config_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
3069
Richard Hendersone5717302024-06-27 17:36:43 +00003070# Don't bother to advertise asm/hwprobe.h for old versions that do
3071# not contain RISCV_HWPROBE_EXT_ZBA.
3072config_host_data.set('CONFIG_ASM_HWPROBE_H',
3073 cc.has_header_symbol('asm/hwprobe.h',
3074 'RISCV_HWPROBE_EXT_ZBA'))
3075
Paolo Bonzini622753d2021-11-08 13:38:58 +01003076config_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
3077 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
3078 .require(cc.links('''
Paolo Bonzini622753d2021-11-08 13:38:58 +01003079 #include <cpuid.h>
3080 #include <immintrin.h>
Richard Henderson701ea582022-12-03 19:31:12 -06003081 static int __attribute__((target("avx2"))) bar(void *a) {
Paolo Bonzini622753d2021-11-08 13:38:58 +01003082 __m256i x = *(__m256i *)a;
3083 return _mm256_testz_si256(x, x);
3084 }
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01003085 int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
Paolo Bonzini622753d2021-11-08 13:38:58 +01003086 '''), error_message: 'AVX2 not available').allowed())
3087
ling xu04ffce12022-11-16 23:29:22 +08003088config_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \
3089 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \
3090 .require(cc.links('''
ling xu04ffce12022-11-16 23:29:22 +08003091 #include <cpuid.h>
3092 #include <immintrin.h>
Richard Hendersondc165fc2023-05-01 22:05:55 +01003093 static int __attribute__((target("avx512bw"))) bar(void *a) {
ling xu04ffce12022-11-16 23:29:22 +08003094 __m512i *x = a;
3095 __m512i res= _mm512_abs_epi8(*x);
3096 return res[1];
3097 }
3098 int main(int argc, char *argv[]) { return bar(argv[0]); }
3099 '''), error_message: 'AVX512BW not available').allowed())
3100
Richard Henderson8d97f282023-06-02 07:43:40 +00003101# For both AArch64 and AArch32, detect if builtins are available.
3102config_host_data.set('CONFIG_ARM_AES_BUILTIN', cc.compiles('''
3103 #include <arm_neon.h>
3104 #ifndef __ARM_FEATURE_AES
3105 __attribute__((target("+crypto")))
3106 #endif
3107 void foo(uint8x16_t *p) { *p = vaesmcq_u8(*p); }
3108 '''))
3109
Paolo Bonzinib87df902021-11-08 13:52:11 +01003110if get_option('membarrier').disabled()
3111 have_membarrier = false
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003112elif host_os == 'windows'
Paolo Bonzinib87df902021-11-08 13:52:11 +01003113 have_membarrier = true
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003114elif host_os == 'linux'
Paolo Bonzinib87df902021-11-08 13:52:11 +01003115 have_membarrier = cc.compiles('''
3116 #include <linux/membarrier.h>
3117 #include <sys/syscall.h>
3118 #include <unistd.h>
3119 #include <stdlib.h>
3120 int main(void) {
3121 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
3122 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
3123 exit(0);
3124 }''')
3125endif
3126config_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
3127 .require(have_membarrier, error_message: 'membarrier system call not available') \
3128 .allowed())
3129
Paolo Bonzini34b52612021-11-08 14:02:42 +01003130have_afalg = get_option('crypto_afalg') \
3131 .require(cc.compiles(gnu_source_prefix + '''
3132 #include <errno.h>
3133 #include <sys/types.h>
3134 #include <sys/socket.h>
3135 #include <linux/if_alg.h>
3136 int main(void) {
3137 int sock;
3138 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
3139 return sock;
3140 }
3141 '''), error_message: 'AF_ALG requested but could not be detected').allowed()
3142config_host_data.set('CONFIG_AF_ALG', have_afalg)
3143
Marc-André Lureau9d734b82022-04-01 15:50:05 +04003144config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
3145 'linux/vm_sockets.h', 'AF_VSOCK',
3146 prefix: '#include <sys/socket.h>',
3147))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02003148
Marc-André Lureau8821a382022-02-01 16:53:43 +04003149have_vss = false
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003150have_vss_sdk = false # old xp/2003 SDK
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003151if host_os == 'windows' and 'cpp' in all_languages
Marc-André Lureau8821a382022-02-01 16:53:43 +04003152 have_vss = cxx.compiles('''
3153 #define __MIDL_user_allocate_free_DEFINED__
Marc-André Lureau32478cb2022-02-22 23:40:01 +04003154 #include <vss.h>
Marc-André Lureau8821a382022-02-01 16:53:43 +04003155 int main(void) { return VSS_CTX_BACKUP; }''')
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003156 have_vss_sdk = cxx.has_header('vscoordint.h')
Marc-André Lureau8821a382022-02-01 16:53:43 +04003157endif
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003158config_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
Marc-André Lureau8821a382022-02-01 16:53:43 +04003159
Richard Henderson6391c772022-04-17 11:30:06 -07003160# Older versions of MinGW do not import _lock_file and _unlock_file properly.
3161# This was fixed for v6.0.0 with commit b48e3ac8969d.
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003162if host_os == 'windows'
Richard Henderson6391c772022-04-17 11:30:06 -07003163 config_host_data.set('HAVE__LOCK_FILE', cc.links('''
3164 #include <stdio.h>
3165 int main(void) {
3166 _lock_file(NULL);
3167 _unlock_file(NULL);
3168 return 0;
3169 }''', name: '_lock_file and _unlock_file'))
3170endif
3171
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003172if host_os == 'windows'
Pierrick Bouvierdbd672c2023-02-21 16:30:04 +01003173 mingw_has_setjmp_longjmp = cc.links('''
3174 #include <setjmp.h>
3175 int main(void) {
3176 /*
3177 * These functions are not available in setjmp header, but may be
3178 * available at link time, from libmingwex.a.
3179 */
3180 extern int __mingw_setjmp(jmp_buf);
3181 extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int);
3182 jmp_buf env;
3183 __mingw_setjmp(env);
3184 __mingw_longjmp(env, 0);
3185 }
3186 ''', name: 'mingw setjmp and longjmp')
3187
3188 if cpu == 'aarch64' and not mingw_has_setjmp_longjmp
3189 error('mingw must provide setjmp/longjmp for windows-arm64')
3190 endif
3191endif
3192
Richard Hendersonacce7282025-02-02 15:09:23 -08003193# Detect host pointer size for the target configuration loop.
3194host_long_bits = cc.sizeof('void *') * 8
3195
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003196########################
3197# Target configuration #
3198########################
3199
Paolo Bonzini2becc362020-02-03 11:42:03 +01003200minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003201
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02003202config_all_accel = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04003203config_all_devices = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003204config_devices_mak_list = []
3205config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02003206config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003207config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003208
3209disassemblers = {
3210 'alpha' : ['CONFIG_ALPHA_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003211 'avr' : ['CONFIG_AVR_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06003212 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003213 'hppa' : ['CONFIG_HPPA_DIS'],
3214 'i386' : ['CONFIG_I386_DIS'],
3215 'x86_64' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003216 'm68k' : ['CONFIG_M68K_DIS'],
3217 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
3218 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003219 'or1k' : ['CONFIG_OPENRISC_DIS'],
3220 'ppc' : ['CONFIG_PPC_DIS'],
3221 'riscv' : ['CONFIG_RISCV_DIS'],
3222 'rx' : ['CONFIG_RX_DIS'],
3223 's390' : ['CONFIG_S390_DIS'],
3224 'sh4' : ['CONFIG_SH4_DIS'],
3225 'sparc' : ['CONFIG_SPARC_DIS'],
3226 'xtensa' : ['CONFIG_XTENSA_DIS'],
Song Gaoaae17462022-06-06 20:43:06 +08003227 'loongarch' : ['CONFIG_LOONGARCH_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003228}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003229
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02003230have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01003231host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02003232 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01003233 (have_tpm ? ['CONFIG_TPM=y'] : []) + \
Marc-André Lureaucca15752023-08-30 13:38:25 +04003234 (pixman.found() ? ['CONFIG_PIXMAN=y'] : []) + \
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02003235 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02003236 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini88b6e612022-04-20 17:33:40 +02003237 (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
Dorjoy Chowdhurybb154e32024-10-09 03:17:23 +06003238 (libcbor.found() ? ['CONFIG_LIBCBOR=y'] : []) + \
Dorjoy Chowdhury63d2a5c2024-10-09 03:17:24 +06003239 (gnutls.found() ? ['CONFIG_GNUTLS=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01003240 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini1935b7e2024-05-07 14:13:46 +02003241 (fdt.found() ? ['CONFIG_FDT=y'] : []) + \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003242 (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
3243 (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
3244 (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01003245 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003246 (host_os == 'linux' ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman55116962022-06-13 16:26:24 -04003247 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02003248 (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : []) + \
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03003249 (hv_balloon ? ['CONFIG_HV_BALLOON_POSSIBLE=y'] : []) + \
3250 (have_rust ? ['CONFIG_HAVE_RUST=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01003251
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003252ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003253
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003254default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
3255actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003256fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003257foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04003258 config_target = { 'TARGET_NAME': target.split('-')[0] }
3259 if target.endswith('linux-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003260 if host_os != 'linux'
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003261 if default_targets
3262 continue
3263 endif
3264 error('Target @0@ is only available on a Linux host'.format(target))
3265 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04003266 config_target += { 'CONFIG_LINUX_USER': 'y' }
3267 elif target.endswith('bsd-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003268 if host_os not in bsd_oses
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003269 if default_targets
3270 continue
3271 endif
3272 error('Target @0@ is only available on a BSD host'.format(target))
3273 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04003274 config_target += { 'CONFIG_BSD_USER': 'y' }
3275 elif target.endswith('softmmu')
Philippe Mathieu-Daudébd0c03b2023-06-13 15:33:45 +02003276 config_target += { 'CONFIG_SYSTEM_ONLY': 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04003277 config_target += { 'CONFIG_SOFTMMU': 'y' }
3278 endif
3279 if target.endswith('-user')
3280 config_target += {
3281 'CONFIG_USER_ONLY': 'y',
3282 'CONFIG_QEMU_INTERP_PREFIX':
Ilya Leoshkevichc1075212024-10-30 00:17:47 +01003283 get_option('interp_prefix').replace('%M', config_target['TARGET_NAME']),
3284 'CONFIG_QEMU_RTSIG_MAP': get_option('rtsig_map'),
Paolo Bonzini765686d2020-09-18 06:37:21 -04003285 }
3286 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02003287
Richard Hendersonacce7282025-02-02 15:09:23 -08003288 config_target += keyval.load('configs/targets' / target + '.mak')
3289
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003290 target_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04003291 foreach sym: accelerators
Richard Hendersonacce7282025-02-02 15:09:23 -08003292 # Disallow 64-bit on 32-bit emulation and virtualization
3293 if host_long_bits < config_target['TARGET_LONG_BITS'].to_int()
3294 continue
3295 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04003296 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
3297 config_target += { sym: 'y' }
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02003298 config_all_accel += { sym: 'y' }
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003299 target_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04003300 endif
3301 endforeach
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003302 if target_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003303 if default_targets
3304 continue
3305 endif
3306 error('No accelerator available for target @0@'.format(target))
3307 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04003308
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003309 if 'TARGET_NEED_FDT' in config_target and not fdt.found()
Paolo Bonzini9b089d22024-05-08 09:25:48 +02003310 if default_targets
3311 warning('Disabling ' + target + ' due to missing libfdt')
3312 else
3313 fdt_required += target
3314 endif
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003315 continue
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003316 endif
3317
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003318 actual_target_dirs += target
3319
Paolo Bonzinifa731682020-09-21 05:19:07 -04003320 # Add default keys
Richard Hendersonacce7282025-02-02 15:09:23 -08003321 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzinifa731682020-09-21 05:19:07 -04003322 if 'TARGET_BASE_ARCH' not in config_target
3323 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
3324 endif
3325 if 'TARGET_ABI_DIR' not in config_target
3326 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
3327 endif
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003328 if 'TARGET_BIG_ENDIAN' not in config_target
3329 config_target += {'TARGET_BIG_ENDIAN': 'n'}
3330 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02003331
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003332 foreach k, v: disassemblers
Paolo Bonzini823eb012021-11-08 14:18:17 +01003333 if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003334 foreach sym: v
3335 config_target += { sym: 'y' }
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003336 endforeach
3337 endif
3338 endforeach
3339
Paolo Bonzini859aef02020-08-04 18:14:26 +02003340 config_target_data = configuration_data()
3341 foreach k, v: config_target
3342 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
3343 # do nothing
3344 elif ignored.contains(k)
3345 # do nothing
3346 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003347 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
3348 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02003349 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04003350 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02003351 config_target_data.set_quoted(k, v)
3352 elif v == 'y'
3353 config_target_data.set(k, 1)
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003354 elif v == 'n'
3355 config_target_data.set(k, 0)
Paolo Bonzini859aef02020-08-04 18:14:26 +02003356 else
3357 config_target_data.set(k, v)
3358 endif
3359 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01003360 config_target_data.set('QEMU_ARCH',
3361 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02003362 config_target_h += {target: configure_file(output: target + '-config-target.h',
3363 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003364
3365 if target.endswith('-softmmu')
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003366 target_kconfig += 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'
3367 target_kconfig += 'CONFIG_TARGET_BIG_ENDIAN=' + config_target['TARGET_BIG_ENDIAN']
3368
Paolo Bonziniae3a4202025-02-19 11:18:28 +01003369 # PVG is not cross-architecture. Use accelerator_targets as a proxy to
3370 # figure out which target can support PVG on this host
3371 if pvg.found() and target in accelerator_targets.get('CONFIG_HVF', [])
3372 target_kconfig += 'CONFIG_MAC_PVG=y'
3373 endif
3374
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003375 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003376 config_devices_mak = target + '-config-devices.mak'
3377 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003378 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01003379 output: config_devices_mak,
3380 depfile: config_devices_mak + '.d',
3381 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01003382 command: [minikconf,
3383 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01003384 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003385 host_kconfig, target_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02003386
3387 config_devices_data = configuration_data()
3388 config_devices = keyval.load(config_devices_mak)
3389 foreach k, v: config_devices
3390 config_devices_data.set(k, 1)
3391 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003392 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02003393 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
3394 configuration: config_devices_data)}
3395 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04003396 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01003397 endif
3398 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003399endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003400target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003401
Paolo Bonzinieed56e92021-11-10 11:01:26 +01003402target_configs_h = []
3403foreach target: target_dirs
3404 target_configs_h += config_target_h[target]
3405 target_configs_h += config_devices_h.get(target, [])
3406endforeach
3407genh += custom_target('config-poison.h',
3408 input: [target_configs_h],
3409 output: 'config-poison.h',
3410 capture: true,
3411 command: [find_program('scripts/make-config-poison.sh'),
3412 target_configs_h])
3413
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003414if fdt_required.length() > 0
3415 error('fdt disabled but required by targets ' + ', '.join(fdt_required))
3416endif
3417
Paolo Bonzinia775c712023-09-08 12:09:22 +02003418###############
3419# Subprojects #
3420###############
Paolo Bonzini4d34a862020-10-05 11:31:15 +02003421
Jagannathan Raman55116962022-06-13 16:26:24 -04003422libvfio_user_dep = not_found
3423if have_system and vfio_user_server_allowed
Paolo Bonzini2019cab2023-05-18 16:50:00 +02003424 libvfio_user_proj = subproject('libvfio-user', required: true)
Paolo Bonzini53283532023-03-30 12:47:23 +02003425 libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
Jagannathan Raman55116962022-06-13 16:26:24 -04003426endif
3427
Paolo Bonzinia775c712023-09-08 12:09:22 +02003428vhost_user = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003429if host_os == 'linux' and have_vhost_user
Paolo Bonzinia775c712023-09-08 12:09:22 +02003430 libvhost_user = subproject('libvhost-user')
3431 vhost_user = libvhost_user.get_variable('vhost_user_dep')
3432endif
3433
3434libvduse = not_found
3435if have_libvduse
3436 libvduse_proj = subproject('libvduse')
3437 libvduse = libvduse_proj.get_variable('libvduse_dep')
3438endif
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003439
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003440#####################
3441# Generated sources #
3442#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003443
Paolo Bonzinif3a6e9b2024-11-12 11:54:11 +01003444config_host_h = configure_file(output: 'config-host.h', configuration: config_host_data)
3445genh += config_host_h
Paolo Bonzini7b72c7d2024-10-15 11:14:18 +02003446
Marc-André Lureau3f885652019-07-15 18:06:04 +04003447hxtool = find_program('scripts/hxtool')
Marc-André Lureaue2c40122023-01-24 18:00:57 +00003448shaderinclude = find_program('scripts/shaderinclude.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003449qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003450qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
3451 meson.current_source_dir() / 'scripts/qapi/commands.py',
3452 meson.current_source_dir() / 'scripts/qapi/common.py',
3453 meson.current_source_dir() / 'scripts/qapi/error.py',
3454 meson.current_source_dir() / 'scripts/qapi/events.py',
3455 meson.current_source_dir() / 'scripts/qapi/expr.py',
3456 meson.current_source_dir() / 'scripts/qapi/gen.py',
3457 meson.current_source_dir() / 'scripts/qapi/introspect.py',
Markus Armbruster88d357d2023-04-28 12:54:16 +02003458 meson.current_source_dir() / 'scripts/qapi/main.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003459 meson.current_source_dir() / 'scripts/qapi/parser.py',
3460 meson.current_source_dir() / 'scripts/qapi/schema.py',
3461 meson.current_source_dir() / 'scripts/qapi/source.py',
3462 meson.current_source_dir() / 'scripts/qapi/types.py',
Daniel P. Berrangé2ebb09f2025-02-05 12:35:50 +00003463 meson.current_source_dir() / 'scripts/qapi/features.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003464 meson.current_source_dir() / 'scripts/qapi/visit.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003465 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003466]
3467
3468tracetool = [
3469 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003470 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003471]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003472tracetool_depends = files(
3473 'scripts/tracetool/backend/log.py',
3474 'scripts/tracetool/backend/__init__.py',
3475 'scripts/tracetool/backend/dtrace.py',
3476 'scripts/tracetool/backend/ftrace.py',
3477 'scripts/tracetool/backend/simple.py',
3478 'scripts/tracetool/backend/syslog.py',
3479 'scripts/tracetool/backend/ust.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003480 'scripts/tracetool/format/ust_events_c.py',
3481 'scripts/tracetool/format/ust_events_h.py',
3482 'scripts/tracetool/format/__init__.py',
3483 'scripts/tracetool/format/d.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003484 'scripts/tracetool/format/simpletrace_stap.py',
3485 'scripts/tracetool/format/c.py',
3486 'scripts/tracetool/format/h.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003487 'scripts/tracetool/format/log_stap.py',
3488 'scripts/tracetool/format/stap.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003489 'scripts/tracetool/__init__.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003490)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003491
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003492qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
3493 meson.current_source_dir(),
Paolo Bonzinib0b43232022-04-20 17:33:54 +02003494 get_option('pkgversion'), meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003495qemu_version = custom_target('qemu-version.h',
3496 output: 'qemu-version.h',
3497 command: qemu_version_cmd,
3498 capture: true,
3499 build_by_default: true,
3500 build_always_stale: true)
3501genh += qemu_version
3502
Marc-André Lureau3f885652019-07-15 18:06:04 +04003503hxdep = []
3504hx_headers = [
3505 ['qemu-options.hx', 'qemu-options.def'],
3506 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
3507]
3508if have_system
3509 hx_headers += [
3510 ['hmp-commands.hx', 'hmp-commands.h'],
3511 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
3512 ]
3513endif
3514foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003515 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04003516 input: files(d[0]),
3517 output: d[1],
3518 capture: true,
Marc-André Lureau3f885652019-07-15 18:06:04 +04003519 command: [hxtool, '-h', '@INPUT0@'])
3520endforeach
3521genh += hxdep
3522
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003523###############
3524# Trace files #
3525###############
3526
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003527# TODO: add each directory to the subdirs from its own meson.build, once
3528# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003529trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003530 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003531 'qapi',
3532 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003533 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003534 'util',
Alex Bennée842b42d2022-09-29 12:42:22 +01003535 'gdbstub',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003536]
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003537if have_linux_user
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003538 trace_events_subdirs += [ 'linux-user' ]
3539endif
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003540if have_bsd_user
3541 trace_events_subdirs += [ 'bsd-user' ]
3542endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003543if have_block
3544 trace_events_subdirs += [
3545 'authz',
3546 'block',
Daniel P. Berrangé48fc8872024-07-23 11:31:24 +01003547 'chardev',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003548 'io',
3549 'nbd',
3550 'scsi',
3551 ]
3552endif
3553if have_system
3554 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003555 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003556 'audio',
3557 'backends',
3558 'backends/tpm',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003559 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003560 'hw/9pfs',
3561 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08003562 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003563 'hw/alpha',
3564 'hw/arm',
3565 'hw/audio',
3566 'hw/block',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003567 'hw/char',
3568 'hw/display',
3569 'hw/dma',
Ninad Palsule99f0c042024-01-26 04:49:46 -06003570 'hw/fsi',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003571 'hw/hyperv',
3572 'hw/i2c',
3573 'hw/i386',
3574 'hw/i386/xen',
David Woodhouseaa98ee32023-01-13 19:51:32 +00003575 'hw/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003576 'hw/ide',
3577 'hw/input',
3578 'hw/intc',
3579 'hw/isa',
3580 'hw/mem',
3581 'hw/mips',
3582 'hw/misc',
3583 'hw/misc/macio',
3584 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08003585 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01003586 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02003587 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003588 'hw/nvram',
3589 'hw/pci',
3590 'hw/pci-host',
3591 'hw/ppc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003592 'hw/rtc',
Tomasz Jeznach0c54acb2024-10-16 17:40:27 -03003593 'hw/riscv',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003594 'hw/s390x',
3595 'hw/scsi',
3596 'hw/sd',
Bernhard Beschow3647dca2024-11-05 10:10:00 +00003597 'hw/sensor',
BALATON Zoltanad52cfc2021-10-29 23:02:09 +02003598 'hw/sh4',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003599 'hw/sparc',
3600 'hw/sparc64',
3601 'hw/ssi',
3602 'hw/timer',
3603 'hw/tpm',
Jeuk Kimbc4e68d2023-09-06 16:43:48 +09003604 'hw/ufs',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003605 'hw/usb',
3606 'hw/vfio',
3607 'hw/virtio',
Alexander Graf11fa0562023-06-14 22:56:23 +00003608 'hw/vmapple',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003609 'hw/watchdog',
3610 'hw/xen',
3611 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003612 'migration',
3613 'net',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003614 'system',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003615 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05003616 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003617 ]
3618endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003619if have_system or have_user
3620 trace_events_subdirs += [
3621 'accel/tcg',
3622 'hw/core',
3623 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02003624 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003625 'target/hppa',
3626 'target/i386',
3627 'target/i386/kvm',
Tianrui Zhaof8447432024-01-05 15:57:59 +08003628 'target/loongarch',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02003629 'target/mips/tcg',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003630 'target/ppc',
3631 'target/riscv',
3632 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08003633 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003634 'target/sparc',
3635 ]
3636endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003637
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003638###################
3639# Collect sources #
3640###################
3641
3642authz_ss = ss.source_set()
3643blockdev_ss = ss.source_set()
3644block_ss = ss.source_set()
3645chardev_ss = ss.source_set()
3646common_ss = ss.source_set()
3647crypto_ss = ss.source_set()
3648hwcore_ss = ss.source_set()
3649io_ss = ss.source_set()
3650qmp_ss = ss.source_set()
3651qom_ss = ss.source_set()
3652system_ss = ss.source_set()
3653specific_fuzz_ss = ss.source_set()
3654specific_ss = ss.source_set()
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02003655rust_devices_ss = ss.source_set()
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003656stub_ss = ss.source_set()
3657trace_ss = ss.source_set()
3658user_ss = ss.source_set()
3659util_ss = ss.source_set()
3660
3661# accel modules
3662qtest_module_ss = ss.source_set()
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003663
3664modules = {}
3665target_modules = {}
3666hw_arch = {}
3667target_arch = {}
3668target_system_arch = {}
3669target_user_arch = {}
3670
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +01003671# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
3672# that is filled in by qapi/.
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003673subdir('qapi')
3674subdir('qobject')
3675subdir('stubs')
3676subdir('trace')
3677subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04003678subdir('qom')
3679subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003680subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04003681subdir('ui')
Alex Bennée842b42d2022-09-29 12:42:22 +01003682subdir('gdbstub')
Philippe Mathieu-Daudé68621262024-04-08 17:53:20 +02003683if have_system
3684 subdir('hw')
3685else
3686 subdir('hw/core')
3687endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003688
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003689if enable_modules
3690 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
Akihiko Odaki414b1802024-05-24 17:00:22 +09003691 modulecommon = declare_dependency(objects: libmodulecommon.extract_all_objects(recursive: false), compile_args: '-DBUILD_DSO')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003692endif
3693
Paolo Bonzini1220f582023-08-30 11:52:43 +02003694qom_ss = qom_ss.apply({})
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003695libqom = static_library('qom', qom_ss.sources() + genh,
3696 dependencies: [qom_ss.dependencies()],
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003697 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003698qom = declare_dependency(objects: libqom.extract_all_objects(recursive: false),
3699 dependencies: qom_ss.dependencies())
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003700
3701event_loop_base = files('event-loop-base.c')
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003702event_loop_base = static_library('event-loop-base',
3703 sources: event_loop_base + genh,
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003704 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003705event_loop_base = declare_dependency(objects: event_loop_base.extract_all_objects(recursive: false),
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003706 dependencies: [qom])
3707
Paolo Bonzini1220f582023-08-30 11:52:43 +02003708stub_ss = stub_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003709
3710util_ss.add_all(trace_ss)
Paolo Bonzini1220f582023-08-30 11:52:43 +02003711util_ss = util_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003712libqemuutil = static_library('qemuutil',
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003713 build_by_default: false,
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003714 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6190fd62024-04-08 17:53:13 +02003715 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc])
Steve Sistare57ad6ab2025-01-15 11:00:27 -08003716qemuutil_deps = [event_loop_base]
3717if host_os != 'windows'
3718 qemuutil_deps += [rt]
3719endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003720qemuutil = declare_dependency(link_with: libqemuutil,
Nicolas Saenz Julienne70ac26b2022-04-25 09:57:22 +02003721 sources: genh + version_res,
Steve Sistare57ad6ab2025-01-15 11:00:27 -08003722 dependencies: qemuutil_deps)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003723
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01003724if have_system or have_user
3725 decodetree = generator(find_program('scripts/decodetree.py'),
3726 output: 'decode-@BASENAME@.c.inc',
3727 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3728 subdir('libdecnumber')
3729 subdir('target')
3730endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003731
Paolo Bonzini478e9432020-08-17 12:47:55 +02003732subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04003733subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04003734subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003735subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04003736subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003737
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003738if have_block
3739 block_ss.add(files(
3740 'block.c',
3741 'blockjob.c',
3742 'job.c',
3743 'qemu-io-cmds.c',
3744 ))
Paolo Bonzini406523f2021-10-13 11:43:54 +02003745 if config_host_data.get('CONFIG_REPLICATION')
3746 block_ss.add(files('replication.c'))
3747 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003748
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003749 subdir('nbd')
3750 subdir('scsi')
3751 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003752
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003753 blockdev_ss.add(files(
3754 'blockdev.c',
3755 'blockdev-nbd.c',
3756 'iothread.c',
3757 'job-qmp.c',
Akihiko Odaki7b1070a2024-05-24 17:00:23 +09003758 ))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003759
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003760 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
3761 # os-win32.c does not
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003762 if host_os == 'windows'
Paolo Bonzinidc495492023-08-30 11:29:54 +02003763 system_ss.add(files('os-win32.c'))
3764 else
3765 blockdev_ss.add(files('os-posix.c'))
3766 endif
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003767endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02003768
Philippe Mathieu-Daudéfe0007f2023-09-14 20:57:12 +02003769common_ss.add(files('cpu-common.c'))
3770specific_ss.add(files('cpu-target.c'))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003771
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003772subdir('system')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003773
Richard Henderson44b99a62021-03-22 12:24:26 +01003774# Work around a gcc bug/misfeature wherein constant propagation looks
3775# through an alias:
3776# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
3777# to guess that a const variable is always zero. Without lto, this is
3778# impossible, as the alias is restricted to page-vary-common.c. Indeed,
3779# without lto, not even the alias is required -- we simply use different
3780# declarations in different compilation units.
3781pagevary = files('page-vary-common.c')
3782if get_option('b_lto')
3783 pagevary_flags = ['-fno-lto']
3784 if get_option('cfi')
3785 pagevary_flags += '-fno-sanitize=cfi-icall'
3786 endif
Thomas Huth54c9b192022-03-30 13:48:08 +02003787 pagevary = static_library('page-vary-common', sources: pagevary + genh,
Richard Henderson44b99a62021-03-22 12:24:26 +01003788 c_args: pagevary_flags)
3789 pagevary = declare_dependency(link_with: pagevary)
3790endif
3791common_ss.add(pagevary)
Philippe Mathieu-Daudé75bbe6a2023-12-07 10:41:27 +01003792specific_ss.add(files('page-target.c', 'page-vary-target.c'))
Richard Henderson6670d4d2021-03-22 12:24:24 +01003793
Marc-André Lureauab318052019-07-24 19:23:16 +04003794subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04003795subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04003796subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003797subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04003798subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04003799subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00003800subdir('semihosting')
Markus Armbrusteraa09b3d2023-01-24 13:19:36 +01003801subdir('stats')
Richard Henderson104cc2c2021-03-08 12:04:33 -08003802subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08003803subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04003804subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003805subdir('plugins')
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003806subdir('ebpf')
3807
Pierrick Bouvier2181b922024-10-23 14:28:11 -07003808if 'CONFIG_TCG' in config_all_accel
3809 subdir('contrib/plugins')
3810endif
3811
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003812common_user_inc = []
3813
3814subdir('common-user')
Marc-André Lureaub309c322019-08-18 19:20:37 +04003815subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04003816subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003817
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003818# needed for fuzzing binaries
3819subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003820subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003821
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003822# accel modules
Richard Hendersona802d5c2025-02-02 13:38:14 -08003823target_modules += { 'accel' : { 'qtest': qtest_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003824
Paolo Bonziniea444d92023-09-08 12:06:12 +02003825##############################################
3826# Internal static_libraries and dependencies #
3827##############################################
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003828
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003829modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003830modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003831modinfo_files = []
3832
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003833block_mods = []
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003834system_mods = []
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003835emulator_modules = []
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003836foreach d, list : modules
Paolo Bonzinief709862023-05-04 10:20:46 +02003837 if not (d == 'block' ? have_block : have_system)
3838 continue
3839 endif
3840
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003841 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003842 if enable_modules
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003843 module_ss.add(modulecommon)
Paolo Bonzini0d665492023-08-31 11:18:24 +02003844 module_ss = module_ss.apply(config_all_devices, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003845 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003846 dependencies: module_ss.dependencies(), pic: true)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003847 if d == 'block'
3848 block_mods += sl
3849 else
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003850 system_mods += sl
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003851 endif
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003852 emulator_modules += shared_module(sl.name(),
3853 name_prefix: '',
Akihiko Odaki414b1802024-05-24 17:00:22 +09003854 objects: sl.extract_all_objects(recursive: false),
3855 dependencies: module_ss.dependencies(),
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003856 install: true,
3857 install_dir: qemu_moddir)
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003858 if module_ss.sources() != []
3859 # FIXME: Should use sl.extract_all_objects(recursive: true) as
3860 # input. Sources can be used multiple times but objects are
3861 # unique when it comes to lookup in compile_commands.json.
3862 # Depnds on a mesion version with
3863 # https://github.com/mesonbuild/meson/pull/8900
3864 modinfo_files += custom_target(d + '-' + m + '.modinfo',
3865 output: d + '-' + m + '.modinfo',
Paolo Bonziniac347112021-07-21 18:51:57 +02003866 input: module_ss.sources() + genh,
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003867 capture: true,
Paolo Bonziniac347112021-07-21 18:51:57 +02003868 command: [modinfo_collect, module_ss.sources()])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003869 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003870 else
3871 if d == 'block'
3872 block_ss.add_all(module_ss)
3873 else
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003874 system_ss.add_all(module_ss)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003875 endif
3876 endif
3877 endforeach
3878endforeach
3879
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003880foreach d, list : target_modules
3881 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003882 if enable_modules
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003883 module_ss.add(modulecommon)
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003884 foreach target : target_dirs
3885 if target.endswith('-softmmu')
3886 config_target = config_target_mak[target]
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003887 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
Philippe Mathieu-Daudé7d7a21b2023-06-13 16:29:11 +02003888 c_args = ['-DCOMPILING_PER_TARGET',
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003889 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3890 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3891 target_module_ss = module_ss.apply(config_target, strict: false)
3892 if target_module_ss.sources() != []
3893 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3894 sl = static_library(module_name,
3895 [genh, target_module_ss.sources()],
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003896 dependencies: target_module_ss.dependencies(),
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003897 include_directories: target_inc,
3898 c_args: c_args,
3899 pic: true)
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003900 system_mods += sl
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003901 emulator_modules += shared_module(sl.name(),
3902 name_prefix: '',
Akihiko Odaki414b1802024-05-24 17:00:22 +09003903 objects: sl.extract_all_objects(recursive: false),
3904 dependencies: target_module_ss.dependencies(),
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003905 install: true,
3906 install_dir: qemu_moddir)
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003907 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
3908 modinfo_files += custom_target(module_name + '.modinfo',
3909 output: module_name + '.modinfo',
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003910 input: target_module_ss.sources() + genh,
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003911 capture: true,
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003912 command: [modinfo_collect, '--target', target, target_module_ss.sources()])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003913 endif
3914 endif
3915 endforeach
3916 else
3917 specific_ss.add_all(module_ss)
3918 endif
3919 endforeach
3920endforeach
3921
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003922if enable_modules
Jose R. Ziviani05d68142022-05-28 00:20:35 +02003923 foreach target : target_dirs
3924 if target.endswith('-softmmu')
3925 config_target = config_target_mak[target]
3926 config_devices_mak = target + '-config-devices.mak'
3927 modinfo_src = custom_target('modinfo-' + target + '.c',
3928 output: 'modinfo-' + target + '.c',
3929 input: modinfo_files,
3930 command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
3931 capture: true)
3932
3933 modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
3934 modinfo_dep = declare_dependency(link_with: modinfo_lib)
3935
3936 arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
3937 hw_arch[arch].add(modinfo_dep)
3938 endif
3939 endforeach
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003940
3941 if emulator_modules.length() > 0
3942 alias_target('modules', emulator_modules)
3943 endif
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003944endif
3945
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003946nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08003947undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003948block_syms = custom_target('block.syms', output: 'block.syms',
3949 input: [libqemuutil, block_mods],
3950 capture: true,
3951 command: [undefsym, nm, '@INPUT@'])
3952qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003953 input: [libqemuutil, system_mods],
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003954 capture: true,
3955 command: [undefsym, nm, '@INPUT@'])
3956
Paolo Bonzini1220f582023-08-30 11:52:43 +02003957authz_ss = authz_ss.apply({})
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003958libauthz = static_library('authz', authz_ss.sources() + genh,
3959 dependencies: [authz_ss.dependencies()],
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003960 build_by_default: false)
3961
Akihiko Odaki414b1802024-05-24 17:00:22 +09003962authz = declare_dependency(objects: libauthz.extract_all_objects(recursive: false),
3963 dependencies: [authz_ss.dependencies(), qom])
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003964
Paolo Bonzini1220f582023-08-30 11:52:43 +02003965crypto_ss = crypto_ss.apply({})
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003966libcrypto = static_library('crypto', crypto_ss.sources() + genh,
3967 dependencies: [crypto_ss.dependencies()],
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003968 build_by_default: false)
3969
Akihiko Odaki414b1802024-05-24 17:00:22 +09003970crypto = declare_dependency(objects: libcrypto.extract_all_objects(recursive: false),
3971 dependencies: [crypto_ss.dependencies(), authz, qom])
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003972
Paolo Bonzini1220f582023-08-30 11:52:43 +02003973io_ss = io_ss.apply({})
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003974libio = static_library('io', io_ss.sources() + genh,
3975 dependencies: [io_ss.dependencies()],
3976 link_with: libqemuutil,
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003977 build_by_default: false)
3978
Akihiko Odaki414b1802024-05-24 17:00:22 +09003979io = declare_dependency(objects: libio.extract_all_objects(recursive: false),
3980 dependencies: [io_ss.dependencies(), crypto, qom])
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003981
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003982libmigration = static_library('migration', sources: migration_files + genh,
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003983 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003984migration = declare_dependency(objects: libmigration.extract_all_objects(recursive: false),
Paolo Bonzini70eb5fd2024-05-24 18:16:08 +02003985 dependencies: [qom, io])
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003986system_ss.add(migration)
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003987
Paolo Bonzini1220f582023-08-30 11:52:43 +02003988block_ss = block_ss.apply({})
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003989libblock = static_library('block', block_ss.sources() + genh,
3990 dependencies: block_ss.dependencies(),
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003991 build_by_default: false)
3992
Akihiko Odaki414b1802024-05-24 17:00:22 +09003993block = declare_dependency(objects: libblock.extract_all_objects(recursive: false),
3994 dependencies: [block_ss.dependencies(), crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003995
Paolo Bonzini1220f582023-08-30 11:52:43 +02003996blockdev_ss = blockdev_ss.apply({})
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003997libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
3998 dependencies: blockdev_ss.dependencies(),
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003999 build_by_default: false)
4000
Akihiko Odaki414b1802024-05-24 17:00:22 +09004001blockdev = declare_dependency(objects: libblockdev.extract_all_objects(recursive: false),
4002 dependencies: [blockdev_ss.dependencies(), block, event_loop_base])
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01004003
Paolo Bonzini1220f582023-08-30 11:52:43 +02004004qmp_ss = qmp_ss.apply({})
Paolo Bonziniff219dc2020-08-04 21:14:26 +02004005libqmp = static_library('qmp', qmp_ss.sources() + genh,
4006 dependencies: qmp_ss.dependencies(),
Paolo Bonziniff219dc2020-08-04 21:14:26 +02004007 build_by_default: false)
4008
Akihiko Odaki414b1802024-05-24 17:00:22 +09004009qmp = declare_dependency(objects: libqmp.extract_all_objects(recursive: false),
4010 dependencies: qmp_ss.dependencies())
Paolo Bonziniff219dc2020-08-04 21:14:26 +02004011
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02004012libchardev = static_library('chardev', chardev_ss.sources() + genh,
Marc-André Lureau22d1f7a2022-03-23 19:57:12 +04004013 dependencies: chardev_ss.dependencies(),
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02004014 build_by_default: false)
4015
Akihiko Odaki414b1802024-05-24 17:00:22 +09004016chardev = declare_dependency(objects: libchardev.extract_all_objects(recursive: false),
4017 dependencies: chardev_ss.dependencies())
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02004018
Paolo Bonzini1220f582023-08-30 11:52:43 +02004019hwcore_ss = hwcore_ss.apply({})
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02004020libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02004021 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09004022hwcore = declare_dependency(objects: libhwcore.extract_all_objects(recursive: false))
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02004023common_ss.add(hwcore)
4024
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02004025###########
4026# Targets #
4027###########
4028
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02004029system_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004030common_ss.add(qom, qemuutil)
4031
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02004032common_ss.add_all(when: 'CONFIG_SYSTEM_ONLY', if_true: [system_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01004033common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
4034
Paolo Bonzini0d665492023-08-31 11:18:24 +02004035# Note that this library is never used directly (only through extract_objects)
4036# and is not built by default; therefore, source files not used by the build
4037# configuration will be in build.ninja, but are never built by default.
Paolo Bonzini2becc362020-02-03 11:42:03 +01004038common_all = static_library('common',
4039 build_by_default: false,
Paolo Bonzini0d665492023-08-31 11:18:24 +02004040 sources: common_ss.all_sources() + genh,
Paolo Bonzini9d24fb72021-12-21 16:09:54 +01004041 include_directories: common_user_inc,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09004042 implicit_include_directories: false,
Paolo Bonzini44081552024-05-24 10:56:55 +02004043 dependencies: common_ss.all_dependencies())
Paolo Bonzini2becc362020-02-03 11:42:03 +01004044
Paolo Bonzinie2b39052024-10-18 19:33:22 +02004045if have_rust
Paolo Bonzinice4a1442024-10-25 09:20:16 +02004046 # We would like to use --generate-cstr, but it is only available
4047 # starting with bindgen 0.66.0. The oldest supported versions
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004048 # is 0.60.x (Debian 12 has 0.60.1) which introduces --allowlist-file.
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004049 bindgen_args = [
4050 '--disable-header-comment',
4051 '--raw-line', '// @generated',
Paolo Bonzini9f7d4522024-10-24 13:53:59 +02004052 '--ctypes-prefix', 'std::os::raw',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004053 '--generate-block',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004054 '--impl-debug',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004055 '--no-doc-comments',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004056 '--with-derive-default',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004057 '--no-layout-tests',
4058 '--no-prepend-enum-name',
4059 '--allowlist-file', meson.project_source_root() + '/include/.*',
4060 '--allowlist-file', meson.project_source_root() + '/.*',
4061 '--allowlist-file', meson.project_build_root() + '/.*'
4062 ]
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +02004063 if not rustfmt.found()
4064 if bindgen.version().version_compare('<0.65.0')
4065 bindgen_args += ['--no-rustfmt-bindings']
4066 else
4067 bindgen_args += ['--formatter', 'none']
4068 endif
4069 endif
Paolo Bonzini131c5842025-02-06 12:15:13 +01004070 if bindgen.version().version_compare('>=0.66.0')
4071 bindgen_args += ['--rust-target', '1.59']
4072 endif
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004073 if bindgen.version().version_compare('<0.61.0')
4074 # default in 0.61+
4075 bindgen_args += ['--size_t-is-usize']
4076 else
4077 bindgen_args += ['--merge-extern-blocks']
4078 endif
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004079 c_enums = [
4080 'DeviceCategory',
4081 'GpioPolarity',
4082 'MachineInitPhase',
4083 'MemoryDeviceInfoKind',
4084 'MigrationPolicy',
4085 'MigrationPriority',
4086 'QEMUChrEvent',
4087 'QEMUClockType',
Paolo Bonzini5472a382025-01-17 11:26:48 +01004088 'ResetType',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004089 'device_endian',
4090 'module_init_type',
4091 ]
4092 foreach enum : c_enums
4093 bindgen_args += ['--rustified-enum', enum]
4094 endforeach
4095 c_bitfields = [
4096 'ClockEvent',
4097 'VMStateFlags',
4098 ]
4099 foreach enum : c_bitfields
4100 bindgen_args += ['--bitfield-enum', enum]
4101 endforeach
Zhao Liueadb83f2025-02-10 11:00:47 +08004102 c_nocopy = [
4103 'QEMUTimer',
4104 ]
4105 # Used to customize Drop trait
4106 foreach struct : c_nocopy
4107 bindgen_args += ['--no-copy', struct]
4108 endforeach
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004109
4110 # TODO: Remove this comment when the clang/libclang mismatch issue is solved.
4111 #
4112 # Rust bindings generation with `bindgen` might fail in some cases where the
4113 # detected `libclang` does not match the expected `clang` version/target. In
4114 # this case you must pass the path to `clang` and `libclang` to your build
4115 # command invocation using the environment variables CLANG_PATH and
4116 # LIBCLANG_PATH
Paolo Bonzinibe3fc972024-10-15 10:08:57 +02004117 bindings_rs = rust.bindgen(
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004118 input: 'rust/wrapper.h',
4119 dependencies: common_ss.all_dependencies(),
Paolo Bonzinicb7ada52024-11-12 11:52:23 +01004120 output: 'bindings.inc.rs',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004121 include_directories: include_directories('.', 'include'),
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004122 bindgen_version: ['>=0.60.0'],
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004123 args: bindgen_args,
4124 )
4125 subdir('rust')
4126endif
4127
4128
Akihiko Odaki956af7d2023-10-09 17:40:51 +01004129feature_to_c = find_program('scripts/feature_to_c.py')
Paolo Bonzinid1e526c2024-10-15 11:59:14 +02004130rust_root_crate = find_program('scripts/rust/rust_root_crate.sh')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04004131
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004132if host_os == 'darwin'
Philippe Mathieu-Daudé30cfa502022-02-15 17:25:03 +01004133 entitlement = find_program('scripts/entitlement.sh')
4134endif
4135
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004136traceable = []
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04004137emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01004138foreach target : target_dirs
4139 config_target = config_target_mak[target]
4140 target_name = config_target['TARGET_NAME']
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004141 target_base_arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02004142 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004143 arch_deps = []
Philippe Mathieu-Daudé7d7a21b2023-06-13 16:29:11 +02004144 c_args = ['-DCOMPILING_PER_TARGET',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004145 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
Philippe Mathieu-Daudéedbceac2024-12-18 15:36:07 +01004146 ]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04004147 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01004148
4149 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004150 if host_os == 'linux'
Paolo Bonzini2becc362020-02-03 11:42:03 +01004151 target_inc += include_directories('linux-headers', is_system: true)
4152 endif
4153 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01004154 target_type='system'
Philippe Mathieu-Daudé01c85e62023-10-04 11:06:27 +02004155 t = target_system_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004156 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004157 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004158
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004159 hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
Philippe Mathieu-Daudébf964322023-11-21 13:52:48 +01004160 if hw_arch.has_key(hw_dir)
4161 hw = hw_arch[hw_dir].apply(config_target, strict: false)
4162 arch_srcs += hw.sources()
4163 arch_deps += hw.dependencies()
4164 endif
Marc-André Lureau2c442202019-08-17 13:55:58 +04004165
Philippe Mathieu-Daudéedbceac2024-12-18 15:36:07 +01004166 c_args += ['-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzini2becc362020-02-03 11:42:03 +01004167 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004168 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01004169 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04004170 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01004171 target_type='user'
Paolo Bonzinia3a576b2021-12-21 16:23:55 +01004172 target_inc += common_user_inc
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004173 if target_base_arch in target_user_arch
4174 t = target_user_arch[target_base_arch].apply(config_target, strict: false)
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02004175 arch_srcs += t.sources()
4176 arch_deps += t.dependencies()
4177 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01004178 if 'CONFIG_LINUX_USER' in config_target
4179 base_dir = 'linux-user'
Warner Loshe2a74722021-08-03 17:17:17 -06004180 endif
4181 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01004182 base_dir = 'bsd-user'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004183 target_inc += include_directories('bsd-user/' / host_os)
Warner Losh85fc1b52022-01-08 17:27:34 -07004184 target_inc += include_directories('bsd-user/host/' / host_arch)
Warner Loshe2a74722021-08-03 17:17:17 -06004185 dir = base_dir / abi
Warner Losh19bf1292021-11-04 16:34:48 -06004186 arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01004187 endif
4188 target_inc += include_directories(
4189 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04004190 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01004191 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04004192 if 'CONFIG_LINUX_USER' in config_target
4193 dir = base_dir / abi
4194 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
4195 if config_target.has_key('TARGET_SYSTBL_ABI')
4196 arch_srcs += \
4197 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
4198 extra_args : config_target['TARGET_SYSTBL_ABI'])
4199 endif
4200 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01004201 endif
4202
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04004203 if 'TARGET_XML_FILES' in config_target
4204 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
4205 output: target + '-gdbstub-xml.c',
4206 input: files(config_target['TARGET_XML_FILES'].split()),
4207 command: [feature_to_c, '@INPUT@'],
4208 capture: true)
4209 arch_srcs += gdbstub_xml
4210 endif
4211
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004212 t = target_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004213 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004214 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004215
Paolo Bonzini2becc362020-02-03 11:42:03 +01004216 target_common = common_ss.apply(config_target, strict: false)
4217 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004218 arch_deps += target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01004219
Paolo Bonzini2becc362020-02-03 11:42:03 +01004220 target_specific = specific_ss.apply(config_target, strict: false)
4221 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004222 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01004223
Paolo Bonzinie2b39052024-10-18 19:33:22 +02004224 if have_rust and target_type == 'system'
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004225 target_rust = rust_devices_ss.apply(config_target, strict: false)
4226 crates = []
4227 foreach dep : target_rust.dependencies()
4228 crates += dep.get_variable('crate')
4229 endforeach
4230 if crates.length() > 0
4231 rlib_rs = custom_target('rust_' + target.underscorify() + '.rs',
4232 output: 'rust_' + target.underscorify() + '.rs',
Paolo Bonzinid1e526c2024-10-15 11:59:14 +02004233 command: [rust_root_crate, crates],
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004234 capture: true,
4235 build_by_default: true,
4236 build_always_stale: true)
4237 rlib = static_library('rust_' + target.underscorify(),
4238 rlib_rs,
4239 dependencies: target_rust.dependencies(),
4240 override_options: ['rust_std=2021', 'build.rust_std=2021'],
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004241 rust_abi: 'c')
4242 arch_deps += declare_dependency(link_whole: [rlib])
4243 endif
4244 endif
4245
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004246 # allow using headers from the dependencies but do not include the sources,
4247 # because this emulator only needs those in "objects". For external
4248 # dependencies, the full dependency is included below in the executable.
4249 lib_deps = []
4250 foreach dep : arch_deps
4251 lib_deps += dep.partial_dependency(compile_args: true, includes: true)
4252 endforeach
4253
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004254 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02004255 sources: arch_srcs + genh,
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004256 dependencies: lib_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01004257 objects: objects,
4258 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004259 c_args: c_args,
Paolo Bonzini44081552024-05-24 10:56:55 +02004260 build_by_default: false)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004261
4262 if target.endswith('-softmmu')
4263 execs = [{
4264 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004265 'win_subsystem': 'console',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02004266 'sources': files('system/main.c'),
Philippe Mathieu-Daudé51625572024-11-20 12:36:43 +01004267 'dependencies': [sdl]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004268 }]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004269 if host_os == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004270 execs += [{
4271 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004272 'win_subsystem': 'windows',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02004273 'sources': files('system/main.c'),
Philippe Mathieu-Daudé51625572024-11-20 12:36:43 +01004274 'dependencies': [sdl]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004275 }]
4276 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004277 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004278 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
4279 execs += [{
4280 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004281 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004282 'sources': specific_fuzz.sources(),
4283 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004284 }]
4285 endif
4286 else
4287 execs = [{
4288 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004289 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004290 'sources': [],
4291 'dependencies': []
4292 }]
4293 endif
4294 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01004295 exe_name = exe['name']
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004296 if host_os == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01004297 exe_name += '-unsigned'
4298 endif
4299
4300 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09004301 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004302 c_args: c_args,
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004303 dependencies: arch_deps + exe['dependencies'],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004304 objects: lib.extract_all_objects(recursive: true),
Paolo Bonzini05007252024-03-20 11:28:28 +01004305 link_depends: [block_syms, qemu_syms],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004306 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004307 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01004308
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004309 if host_os == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004310 icon = 'pc-bios/qemu.rsrc'
4311 build_input = [emulator, files(icon)]
4312 install_input = [
4313 get_option('bindir') / exe_name,
4314 meson.current_source_dir() / icon
4315 ]
4316 if 'CONFIG_HVF' in config_target
4317 entitlements = 'accel/hvf/entitlements.plist'
4318 build_input += files(entitlements)
4319 install_input += meson.current_source_dir() / entitlements
4320 endif
4321
Alexander Graf8a74ce62021-01-20 23:44:34 +01004322 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004323 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01004324 output: exe['name'],
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01004325 command: [entitlement, '@OUTPUT@', '@INPUT@'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01004326 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09004327
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01004328 meson.add_install_script(entitlement, '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09004329 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004330 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01004331 else
4332 emulators += {exe['name']: emulator}
4333 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04004334
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004335 traceable += [{
4336 'exe': exe['name'],
4337 'probe-prefix': 'qemu.' + target_type + '.' + target_name,
4338 }]
4339
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004340 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01004341endforeach
4342
Paolo Bonzini931049b2020-02-05 09:44:24 +01004343# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004344
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004345if get_option('plugins')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01004346 install_headers('include/qemu/qemu-plugin.h')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004347 if host_os == 'windows'
Greg Manning36fa0772023-11-06 18:51:06 +00004348 # On windows, we want to deliver the qemu_plugin_api.lib file in the qemu installer,
4349 # so that plugin authors can compile against it.
4350 install_data(win32_qemu_plugin_api_lib, install_dir: 'lib')
4351 endif
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01004352endif
4353
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004354subdir('qga')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02004355
Laurent Vivier9755c942020-08-24 17:24:30 +02004356# Don't build qemu-keymap if xkbcommon is not explicitly enabled
4357# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02004358if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04004359 # used for the update-keymaps target, so include rules even if !have_tools
4360 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
4361 dependencies: [qemuutil, xkbcommon], install: have_tools)
4362endif
4363
Paolo Bonzini931049b2020-02-05 09:44:24 +01004364if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004365 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004366 link_args: '@block.syms', link_depends: block_syms,
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004367 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
4368 qemu_io = executable('qemu-io', files('qemu-io.c'),
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004369 link_args: '@block.syms', link_depends: block_syms,
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004370 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01004371 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004372 link_args: '@block.syms', link_depends: block_syms,
Akihiko Odaki7b1070a2024-05-24 17:00:23 +09004373 dependencies: [blockdev, qemuutil, selinux],
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004374 install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004375
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02004376 subdir('storage-daemon')
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004377
4378 foreach exe: [ 'qemu-img', 'qemu-io', 'qemu-nbd', 'qemu-storage-daemon']
4379 traceable += [{
4380 'exe': exe,
4381 'probe-prefix': 'qemu.' + exe.substring(5).replace('-', '_')
4382 }]
4383 endforeach
4384
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04004385 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02004386
Marc-André Lureau157e7b12019-07-15 14:50:58 +04004387 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
Steve Sistare57ad6ab2025-01-15 11:00:27 -08004388 dependencies: [qemuutil, rt],
Marc-André Lureau157e7b12019-07-15 14:50:58 +04004389 install: true)
4390
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004391 if have_vhost_user
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02004392 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02004393 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04004394 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02004395 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01004396 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004397
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004398 if host_os == 'linux'
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004399 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
4400 dependencies: [qemuutil, libcap_ng],
4401 install: true,
4402 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004403
4404 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
4405 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02004406 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004407 install: true)
Anthony Harivel84369d72024-05-22 17:34:51 +02004408
4409 if cpu in ['x86', 'x86_64']
4410 executable('qemu-vmsr-helper', files('tools/i386/qemu-vmsr-helper.c'),
4411 dependencies: [authz, crypto, io, qom, qemuutil,
4412 libcap_ng, mpathpersist],
4413 install: true)
4414 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004415 endif
4416
Paolo Bonziniccd250a2021-06-03 12:50:17 +02004417 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04004418 subdir('contrib/ivshmem-client')
4419 subdir('contrib/ivshmem-server')
4420 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01004421endif
4422
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004423if stap.found()
4424 foreach t: traceable
4425 foreach stp: [
4426 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / t['exe'], 'install': false},
4427 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / t['exe'], 'install': true},
4428 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
4429 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
4430 ]
4431 cmd = [
4432 tracetool, '--group=all', '--format=' + stp['fmt'],
4433 '--binary=' + stp['bin'],
4434 '--probe-prefix=' + t['probe-prefix'],
4435 '@INPUT@', '@OUTPUT@'
4436 ]
4437
4438 custom_target(t['exe'] + stp['ext'],
4439 input: trace_events_all,
4440 output: t['exe'] + stp['ext'],
4441 install: stp['install'],
4442 install_dir: get_option('datadir') / 'systemtap/tapset',
4443 command: cmd,
4444 depend_files: tracetool_depends)
4445 endforeach
4446 endforeach
4447endif
4448
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04004449subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004450subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04004451subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02004452subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08004453subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01004454if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04004455 subdir('po')
4456endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004457
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004458if host_machine.system() == 'windows'
4459 nsis_cmd = [
4460 find_program('scripts/nsis.py'),
4461 '@OUTPUT@',
4462 get_option('prefix'),
4463 meson.current_source_dir(),
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02004464 glib_pc.get_variable('bindir'),
Stefan Weil24bdcc92020-11-25 20:18:33 +01004465 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004466 '--',
4467 '-DDISPLAYVERSION=' + meson.project_version(),
4468 ]
4469 if build_docs
4470 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
4471 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01004472 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004473 nsis_cmd += '-DCONFIG_GTK=y'
4474 endif
4475
4476 nsis = custom_target('nsis',
4477 output: 'qemu-setup-' + meson.project_version() + '.exe',
4478 input: files('qemu.nsi'),
4479 build_always_stale: true,
4480 command: nsis_cmd + ['@INPUT@'])
4481 alias_target('installer', nsis)
4482endif
4483
Paolo Bonzinia0c91622020-10-07 11:01:51 -04004484#########################
4485# Configuration summary #
4486#########################
4487
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004488# Build environment
Paolo Bonzinif9332752020-02-03 13:28:38 +01004489summary_info = {}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004490summary_info += {'Build directory': meson.current_build_dir()}
4491summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004492summary_info += {'Download dependencies': get_option('wrap_mode') != 'nodownload'}
4493summary(summary_info, bool_yn: true, section: 'Build environment')
4494
4495# Directories
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004496summary_info += {'Install prefix': get_option('prefix')}
4497summary_info += {'BIOS directory': qemu_datadir}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004498pathsep = host_os == 'windows' ? ';' : ':'
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09004499summary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004500summary_info += {'binary directory': get_option('prefix') / get_option('bindir')}
4501summary_info += {'library directory': get_option('prefix') / get_option('libdir')}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004502summary_info += {'module directory': qemu_moddir}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004503summary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
4504summary_info += {'include directory': get_option('prefix') / get_option('includedir')}
4505summary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004506if host_os != 'windows'
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004507 summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
4508 summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004509else
4510 summary_info += {'local state directory': 'queried at runtime'}
4511endif
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004512summary_info += {'Doc directory': get_option('prefix') / get_option('docdir')}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004513summary(summary_info, bool_yn: true, section: 'Directories')
4514
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004515# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004516summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004517summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004518summary_info += {'sphinx-build': sphinx_build}
Paolo Bonzinib4d61d32023-09-28 12:00:48 +02004519
4520# FIXME: the [binaries] section of machine files, which can be probed
4521# with find_program(), would be great for passing gdb and genisoimage
4522# paths from configure to Meson. However, there seems to be no way to
4523# hide a program (for example if gdb is too old).
Paolo Bonzinia47dd5c2023-09-28 10:44:56 +02004524if config_host.has_key('GDB')
4525 summary_info += {'gdb': config_host['GDB']}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004526endif
Paolo Bonzini40c909f2022-04-20 17:33:49 +02004527summary_info += {'iasl': iasl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004528summary_info += {'genisoimage': config_host['GENISOIMAGE']}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004529if host_os == 'windows' and have_ga
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004530 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004531endif
Thomas Huth58902582022-04-08 18:20:47 +02004532if slirp.found() and have_system
Paolo Bonzini35acbb32021-10-13 13:43:36 +02004533 summary_info += {'smbd': have_slirp_smbd ? smbd_path : false}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004534endif
4535summary(summary_info, bool_yn: true, section: 'Host binaries')
4536
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004537# Configurable features
4538summary_info = {}
4539summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004540summary_info += {'system-mode emulation': have_system}
4541summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004542summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004543summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini60027112022-10-20 14:53:10 +02004544summary_info += {'module support': enable_modules}
4545if enable_modules
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02004546 summary_info += {'alternative module path': get_option('module_upgrades')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004547endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004548summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004549if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02004550 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004551endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02004552summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
4553if 'simple' in get_option('trace_backends')
4554 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004555endif
Marc-André Lureau142ca622021-07-15 11:53:53 +04004556summary_info += {'D-Bus display': dbus_display}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004557summary_info += {'QOM debugging': get_option('qom_cast_debug')}
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004558summary_info += {'Relocatable install': get_option('relocatable')}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004559summary_info += {'vhost-kernel support': have_vhost_kernel}
4560summary_info += {'vhost-net support': have_vhost_net}
4561summary_info += {'vhost-user support': have_vhost_user}
4562summary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004563summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004564summary_info += {'vhost-vdpa support': have_vhost_vdpa}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004565summary_info += {'build guest agent': have_ga}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004566summary(summary_info, bool_yn: true, section: 'Configurable features')
4567
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004568# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004569summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004570summary_info += {'host CPU': cpu}
4571summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01004572summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
4573summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Thomas Huth785abf02023-07-06 08:47:36 +02004574if 'cpp' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004575 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004576else
4577 summary_info += {'C++ compiler': false}
4578endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004579if 'objc' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004580 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004581else
4582 summary_info += {'Objective-C compiler': false}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004583endif
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03004584summary_info += {'Rust support': have_rust}
4585if have_rust
Paolo Bonzini1a6ef6f2024-10-03 16:28:45 +03004586 summary_info += {'Rust target': config_host['RUST_TARGET_TRIPLE']}
Paolo Bonzinie2b39052024-10-18 19:33:22 +02004587 summary_info += {'rustc': ' '.join(rustc.cmd_array())}
4588 summary_info += {'rustc version': rustc.version()}
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004589 summary_info += {'bindgen': bindgen.full_path()}
4590 summary_info += {'bindgen version': bindgen.version()}
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03004591endif
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004592option_cflags = (get_option('debug') ? ['-g'] : [])
4593if get_option('optimization') != 'plain'
4594 option_cflags += ['-O' + get_option('optimization')]
4595endif
4596summary_info += {'CFLAGS': ' '.join(get_option('c_args') + option_cflags)}
Thomas Huth785abf02023-07-06 08:47:36 +02004597if 'cpp' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004598 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args') + option_cflags)}
Paolo Bonzini47b30832020-09-23 05:26:17 -04004599endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004600if 'objc' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004601 summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args') + option_cflags)}
Philippe Mathieu-Daudée910c7d2022-01-08 22:38:55 +01004602endif
Thomas Huth785abf02023-07-06 08:47:36 +02004603link_args = get_option('c_link_args')
Paolo Bonzini47b30832020-09-23 05:26:17 -04004604if link_args.length() > 0
4605 summary_info += {'LDFLAGS': ' '.join(link_args)}
4606endif
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004607summary_info += {'QEMU_CFLAGS': ' '.join(qemu_common_flags + qemu_cflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004608if 'cpp' in all_languages
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004609 summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_common_flags + qemu_cxxflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004610endif
4611if 'objc' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +01004612 summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_common_flags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004613endif
Paolo Bonzinid0651772022-04-20 17:33:34 +02004614summary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)}
Daniele Buonocdad7812020-12-04 18:06:11 -05004615summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004616summary_info += {'PIE': get_option('b_pie')}
Paolo Bonzinie58e55d2023-06-07 10:00:21 +02004617summary_info += {'static build': get_option('prefer_static')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004618summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinib87df902021-11-08 13:52:11 +01004619summary_info += {'membarrier': have_membarrier}
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04004620summary_info += {'debug graph lock': get_option('debug_graph_lock')}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004621summary_info += {'debug stack usage': get_option('debug_stack_usage')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004622summary_info += {'mutex debugging': get_option('debug_mutex')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004623summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01004624summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
ling xu04ffce12022-11-16 23:29:22 +08004625summary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004626summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzini34f983d2023-01-09 15:31:51 +01004627summary_info += {'thread sanitizer': get_option('tsan')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004628summary_info += {'CFI support': get_option('cfi')}
4629if get_option('cfi')
4630 summary_info += {'CFI debug support': get_option('cfi_debug')}
4631endif
4632summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004633summary_info += {'sparse': sparse}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004634summary_info += {'mingw32 support': host_os == 'windows'}
Paolo Bonzini12640f02022-06-06 11:48:47 +02004635summary(summary_info, bool_yn: true, section: 'Compilation')
Alex Bennée49e85652021-02-22 10:14:50 +00004636
4637# snarf the cross-compilation information for tests
Paolo Bonzini12640f02022-06-06 11:48:47 +02004638summary_info = {}
4639have_cross = false
Alex Bennée49e85652021-02-22 10:14:50 +00004640foreach target: target_dirs
Paolo Bonzinic7022a72022-09-29 12:42:07 +01004641 tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak'
Alex Bennée49e85652021-02-22 10:14:50 +00004642 if fs.exists(tcg_mak)
4643 config_cross_tcg = keyval.load(tcg_mak)
Alex Bennée85b141e2022-05-27 16:35:34 +01004644 if 'CC' in config_cross_tcg
Paolo Bonzini12640f02022-06-06 11:48:47 +02004645 summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
4646 have_cross = true
Alex Bennée49e85652021-02-22 10:14:50 +00004647 endif
Paolo Bonzini12640f02022-06-06 11:48:47 +02004648 endif
Alex Bennée49e85652021-02-22 10:14:50 +00004649endforeach
Paolo Bonzini12640f02022-06-06 11:48:47 +02004650if have_cross
4651 summary(summary_info, bool_yn: true, section: 'Cross compilers')
4652endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004653
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004654# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004655summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004656if have_system
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004657 summary_info += {'KVM support': config_all_accel.has_key('CONFIG_KVM')}
4658 summary_info += {'HVF support': config_all_accel.has_key('CONFIG_HVF')}
4659 summary_info += {'WHPX support': config_all_accel.has_key('CONFIG_WHPX')}
4660 summary_info += {'NVMM support': config_all_accel.has_key('CONFIG_NVMM')}
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02004661 summary_info += {'Xen support': xen.found()}
4662 if xen.found()
4663 summary_info += {'xen ctrl version': xen.version()}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004664 endif
Paolo Bonzini0d665492023-08-31 11:18:24 +02004665 summary_info += {'Xen emulation': config_all_devices.has_key('CONFIG_XEN_EMU')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004666endif
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004667summary_info += {'TCG support': config_all_accel.has_key('CONFIG_TCG')}
4668if config_all_accel.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004669 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +01004670 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004671 else
4672 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
4673 endif
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004674 summary_info += {'TCG plugins': get_option('plugins')}
Paolo Bonzini1d558c92023-08-28 11:48:30 +02004675 summary_info += {'TCG debug enabled': get_option('debug_tcg')}
Ilya Leoshkevich1f2355f2024-03-12 01:23:30 +01004676 if have_linux_user or have_bsd_user
4677 summary_info += {'syscall buffer debugging support': get_option('debug_remap')}
4678 endif
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004679endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004680summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004681if have_system
4682 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01004683 summary_info += {'out of process emulation': multiprocess_allowed}
Jagannathan Raman55116962022-06-13 16:26:24 -04004684 summary_info += {'vfio-user server': vfio_user_server_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004685endif
4686summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
4687
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004688# Block layer
4689summary_info = {}
Paolo Bonzini67398252022-10-12 13:19:35 +02004690summary_info += {'coroutine backend': coroutine_backend}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004691summary_info += {'coroutine pool': have_coroutine_pool}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004692if have_block
Paolo Bonzini622d64f2022-04-20 17:33:53 +02004693 summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
4694 summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004695 summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
Christian Schoenebeck38877022023-05-11 16:12:34 +02004696 summary_info += {'VirtFS (9P) support': have_virtfs}
Paolo Bonzini406523f2021-10-13 11:43:54 +02004697 summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004698 summary_info += {'bochs support': get_option('bochs').allowed()}
4699 summary_info += {'cloop support': get_option('cloop').allowed()}
4700 summary_info += {'dmg support': get_option('dmg').allowed()}
4701 summary_info += {'qcow v1 support': get_option('qcow1').allowed()}
4702 summary_info += {'vdi support': get_option('vdi').allowed()}
Vladimir Sementsov-Ogievskiy11cea422023-04-21 12:27:58 +03004703 summary_info += {'vhdx support': get_option('vhdx').allowed()}
4704 summary_info += {'vmdk support': get_option('vmdk').allowed()}
4705 summary_info += {'vpc support': get_option('vpc').allowed()}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004706 summary_info += {'vvfat support': get_option('vvfat').allowed()}
4707 summary_info += {'qed support': get_option('qed').allowed()}
4708 summary_info += {'parallels support': get_option('parallels').allowed()}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004709 summary_info += {'FUSE exports': fuse}
Xie Yongji2a2359b2022-05-23 16:46:09 +08004710 summary_info += {'VDUSE block exports': have_vduse_blk_export}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004711endif
4712summary(summary_info, bool_yn: true, section: 'Block layer support')
4713
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004714# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004715summary_info = {}
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02004716summary_info += {'TLS priority': get_option('tls_priority')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004717summary_info += {'GNUTLS support': gnutls}
4718if gnutls.found()
4719 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
4720endif
4721summary_info += {'libgcrypt': gcrypt}
4722summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02004723if nettle.found()
4724 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004725endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08004726summary_info += {'SM4 ALG support': crypto_sm4}
liequan ched078da82024-10-30 08:51:46 +00004727summary_info += {'SM3 ALG support': crypto_sm3}
Paolo Bonzini34b52612021-11-08 14:02:42 +01004728summary_info += {'AF_ALG support': have_afalg}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004729summary_info += {'rng-none': get_option('rng_none')}
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02004730summary_info += {'Linux keyring': have_keyring}
Thomas Huthc64023b2023-08-24 11:42:08 +02004731summary_info += {'Linux keyutils': keyutils}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004732summary(summary_info, bool_yn: true, section: 'Crypto')
4733
Thomas Huth9e48afa2023-06-02 19:18:30 +02004734# UI
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004735summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004736if host_os == 'darwin'
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03004737 summary_info += {'Cocoa support': cocoa}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004738endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004739summary_info += {'SDL support': sdl}
4740summary_info += {'SDL image support': sdl_image}
4741summary_info += {'GTK support': gtk}
4742summary_info += {'pixman': pixman}
4743summary_info += {'VTE support': vte}
Kshitij Suri95f85102022-04-08 07:13:34 +00004744summary_info += {'PNG support': png}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004745summary_info += {'VNC support': vnc}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01004746if vnc.found()
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004747 summary_info += {'VNC SASL support': sasl}
4748 summary_info += {'VNC JPEG support': jpeg}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004749endif
Thomas Huth9e48afa2023-06-02 19:18:30 +02004750summary_info += {'spice protocol support': spice_protocol}
4751if spice_protocol.found()
4752 summary_info += {' spice server support': spice}
4753endif
4754summary_info += {'curses support': curses}
4755summary_info += {'brlapi support': brlapi}
4756summary(summary_info, bool_yn: true, section: 'User interface')
4757
Alex Bennéef705c1f2023-12-22 11:48:46 +00004758# Graphics backends
4759summary_info = {}
4760summary_info += {'VirGL support': virgl}
4761summary_info += {'Rutabaga support': rutabaga}
4762summary(summary_info, bool_yn: true, section: 'Graphics backends')
4763
Thomas Huthaece7232023-06-02 19:18:32 +02004764# Audio backends
4765summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004766if host_os not in ['darwin', 'haiku', 'windows']
Paolo Bonzini87430d52021-10-07 15:06:09 +02004767 summary_info += {'OSS support': oss}
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02004768 summary_info += {'sndio support': sndio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004769elif host_os == 'darwin'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004770 summary_info += {'CoreAudio support': coreaudio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004771elif host_os == 'windows'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004772 summary_info += {'DirectSound support': dsound}
4773endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004774if host_os == 'linux'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004775 summary_info += {'ALSA support': alsa}
4776 summary_info += {'PulseAudio support': pulse}
4777endif
Marc-André Lureau20c51242023-05-06 20:37:26 +04004778summary_info += {'PipeWire support': pipewire}
Paolo Bonzini87430d52021-10-07 15:06:09 +02004779summary_info += {'JACK support': jack}
Thomas Huthaece7232023-06-02 19:18:32 +02004780summary(summary_info, bool_yn: true, section: 'Audio backends')
4781
Thomas Huthc3527c52023-06-02 19:18:31 +02004782# Network backends
Thomas Huth9e48afa2023-06-02 19:18:30 +02004783summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004784if host_os == 'darwin'
Thomas Huth9e48afa2023-06-02 19:18:30 +02004785 summary_info += {'vmnet.framework support': vmnet}
4786endif
Ilya Maximetscb039ef2023-09-13 20:34:37 +02004787summary_info += {'AF_XDP support': libxdp}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004788summary_info += {'slirp support': slirp}
Paolo Bonzinie1723992021-10-07 15:08:21 +02004789summary_info += {'vde support': vde}
Paolo Bonzini837b84b2021-10-07 15:08:22 +02004790summary_info += {'netmap support': have_netmap}
Thomas Hutheea94532021-10-28 20:59:08 +02004791summary_info += {'l2tpv3 support': have_l2tpv3}
Thomas Huthc3527c52023-06-02 19:18:31 +02004792summary(summary_info, bool_yn: true, section: 'Network backends')
4793
4794# Libraries
4795summary_info = {}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004796summary_info += {'libtasn1': tasn1}
4797summary_info += {'PAM': pam}
4798summary_info += {'iconv support': iconv}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004799summary_info += {'blkio support': blkio}
4800summary_info += {'curl support': curl}
4801summary_info += {'Multipath support': mpathpersist}
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02004802summary_info += {'Linux AIO support': libaio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004803summary_info += {'Linux io_uring support': linux_io_uring}
4804summary_info += {'ATTR/XATTR support': libattr}
Paolo Bonzini3730a732022-04-20 17:33:41 +02004805summary_info += {'RDMA support': rdma}
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01004806summary_info += {'fdt support': fdt_opt == 'internal' ? 'internal' : fdt}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004807summary_info += {'libcap-ng support': libcap_ng}
4808summary_info += {'bpf support': libbpf}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004809summary_info += {'rbd support': rbd}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004810summary_info += {'smartcard support': cacard}
4811summary_info += {'U2F support': u2f}
4812summary_info += {'libusb': libusb}
4813summary_info += {'usb net redir': usbredir}
Paolo Bonzini88b6e612022-04-20 17:33:40 +02004814summary_info += {'OpenGL support (epoxy)': opengl}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004815summary_info += {'GBM': gbm}
4816summary_info += {'libiscsi support': libiscsi}
4817summary_info += {'libnfs support': libnfs}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004818if host_os == 'windows'
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004819 if have_ga
Marc-André Lureau8821a382022-02-01 16:53:43 +04004820 summary_info += {'QGA VSS support': have_qga_vss}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01004821 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01004822endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004823summary_info += {'seccomp support': seccomp}
4824summary_info += {'GlusterFS support': glusterfs}
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02004825summary_info += {'hv-balloon support': hv_balloon}
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01004826summary_info += {'TPM support': have_tpm}
Thomas Huthe6a52b32021-12-09 15:48:01 +01004827summary_info += {'libssh support': libssh}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004828summary_info += {'lzo support': lzo}
4829summary_info += {'snappy support': snappy}
4830summary_info += {'bzip2 support': libbzip2}
4831summary_info += {'lzfse support': liblzfse}
4832summary_info += {'zstd support': zstd}
Yuan Liub844a2c2024-06-10 18:21:06 +08004833summary_info += {'Query Processing Library support': qpl}
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01004834summary_info += {'UADK Library support': uadk}
Bryan Zhange28ed312024-08-30 16:27:19 -07004835summary_info += {'qatzip support': qatzip}
Paolo Bonzini488a8c72021-12-21 12:38:27 +01004836summary_info += {'NUMA host support': numa}
Thomas Huth83602082022-05-16 16:58:23 +02004837summary_info += {'capstone': capstone}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004838summary_info += {'libpmem support': libpmem}
4839summary_info += {'libdaxctl support': libdaxctl}
Dorjoy Chowdhurybb154e32024-10-09 03:17:23 +06004840summary_info += {'libcbor support': libcbor}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004841summary_info += {'libudev': libudev}
4842# Dummy dependency, keep .found()
Max Reitzdf4ea702020-10-27 20:05:46 +01004843summary_info += {'FUSE lseek': fuse_lseek.found()}
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004844summary_info += {'selinux': selinux}
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01004845summary_info += {'libdw': libdw}
Ilya Leoshkevicha1a98002024-02-06 01:22:03 +01004846if host_os == 'freebsd'
4847 summary_info += {'libinotify-kqueue': inotify}
4848endif
Paolo Bonzinid50ea7f2025-02-20 14:20:27 +01004849if host_os == 'darwin'
4850 summary_info += {'ParavirtualizedGraphics support': pvg}
4851endif
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01004852summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004853
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004854if host_arch == 'unknown'
Paolo Bonzinif9332752020-02-03 13:28:38 +01004855 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004856 warning('UNSUPPORTED HOST CPU')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004857 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004858 message('Support for CPU host architecture ' + cpu + ' is not currently')
4859 message('maintained. The QEMU project does not guarantee that QEMU will')
4860 message('compile or work on this host CPU. You can help by volunteering')
4861 message('to maintain it and providing a build host for our continuous')
4862 message('integration setup.')
4863 if get_option('tcg').allowed() and target_dirs.length() > 0
4864 message()
4865 message('configure has succeeded and you can continue to build, but')
4866 message('QEMU will use a slow interpreter to emulate the target CPU.')
4867 endif
Richard Henderson6d701c92025-01-27 16:22:24 -08004868elif host_long_bits < 64
Paolo Bonzini14ed29d2024-10-27 14:07:01 +01004869 message()
4870 warning('DEPRECATED HOST CPU')
4871 message()
Richard Henderson6d701c92025-01-27 16:22:24 -08004872 message('Support for 32-bit CPU host architecture ' + cpu + ' is going')
4873 message('to be dropped in a future QEMU release.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004874endif
4875
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004876if not supported_oses.contains(host_os)
Paolo Bonzinif9332752020-02-03 13:28:38 +01004877 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004878 warning('UNSUPPORTED HOST OS')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004879 message()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004880 message('Support for host OS ' + host_os + 'is not currently maintained.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004881 message('configure has succeeded and you can continue to build, but')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004882 message('the QEMU project does not guarantee that QEMU will compile or')
4883 message('work on this operating system. You can help by volunteering')
4884 message('to maintain it and providing a build host for our continuous')
4885 message('integration setup. This will ensure that future versions of QEMU')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004886 message('will keep working on ' + host_os + '.')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004887endif
4888
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004889if host_arch == 'unknown' or not supported_oses.contains(host_os)
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004890 message()
4891 message('If you want to help supporting QEMU on this platform, please')
4892 message('contact the developers at qemu-devel@nongnu.org.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004893endif
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004894
4895actually_reloc = get_option('relocatable')
4896# check if get_relocated_path() is actually able to relocate paths
4897if get_option('relocatable') and \
4898 not (get_option('prefix') / get_option('bindir')).startswith(get_option('prefix') / '')
4899 message()
4900 warning('bindir not included within prefix, the installation will not be relocatable.')
4901 actually_reloc = false
4902endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004903if not actually_reloc and (host_os == 'windows' or get_option('relocatable'))
4904 if host_os == 'windows'
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004905 message()
4906 warning('Windows installs should usually be relocatable.')
4907 endif
4908 message()
4909 message('QEMU will have to be installed under ' + get_option('prefix') + '.')
4910 message('Use --disable-relocatable to remove this warning.')
4911endif