blob: ec51827f404781d4c4d333c0303ccc7ba7f79b1d [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
824metal = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400825emulator_link_args = []
Marc-André Lureau23011f42022-02-01 12:55:21 +0400826midl = not_found
827widl = not_found
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900828pathcch = not_found
Paolo Bonzinia6305082021-10-07 15:08:15 +0200829host_dsosuf = '.so'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100830if host_os == 'windows'
Marc-André Lureau23011f42022-02-01 12:55:21 +0400831 midl = find_program('midl', required: false)
832 widl = find_program('widl', required: false)
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900833 pathcch = cc.find_library('pathcch')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400834 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200835 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400836
837 win = import('windows')
838 version_res = win.compile_resources('version.rc',
839 depend_files: files('pc-bios/qemu-nsis.ico'),
840 include_directories: include_directories('.'))
Paolo Bonzinia6305082021-10-07 15:08:15 +0200841 host_dsosuf = '.dll'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100842elif host_os == 'darwin'
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400843 coref = dependency('appleframeworks', modules: 'CoreFoundation')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700844 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
Paolo Bonzinia6305082021-10-07 15:08:15 +0200845 host_dsosuf = '.dylib'
Phil Dennis-Jordan23521592023-06-14 22:57:33 +0000846 pvg = dependency('appleframeworks', modules: 'ParavirtualizedGraphics')
847 metal = dependency('appleframeworks', modules: 'Metal')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100848elif host_os == 'sunos'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200849 socket = [cc.find_library('socket'),
850 cc.find_library('nsl'),
851 cc.find_library('resolv')]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100852elif host_os == 'haiku'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200853 socket = [cc.find_library('posix_error_mapper'),
854 cc.find_library('network'),
855 cc.find_library('bsd')]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100856elif host_os == 'openbsd'
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100857 if get_option('tcg').allowed() and target_dirs.length() > 0
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400858 # Disable OpenBSD W^X if available
859 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
860 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400861endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200862
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200863###############################################
864# Host-specific configuration of accelerators #
865###############################################
866
Paolo Bonzini8a199802020-09-18 05:37:01 -0400867accelerators = []
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100868if get_option('kvm').allowed() and host_os == 'linux'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400869 accelerators += 'CONFIG_KVM'
870endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100871if get_option('whpx').allowed() and host_os == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000872 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400873 error('WHPX requires 64-bit host')
Philippe Mathieu-Daudé641b8412023-06-24 15:31:44 +0200874 elif cc.has_header('winhvplatform.h', required: get_option('whpx')) and \
875 cc.has_header('winhvemulation.h', required: get_option('whpx'))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400876 accelerators += 'CONFIG_WHPX'
877 endif
878endif
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200879
880hvf = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100881if get_option('hvf').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400882 hvf = dependency('appleframeworks', modules: 'Hypervisor',
883 required: get_option('hvf'))
884 if hvf.found()
885 accelerators += 'CONFIG_HVF'
886 endif
887endif
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200888
889nvmm = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100890if host_os == 'netbsd'
nia0cc49652021-10-13 13:54:17 +0000891 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200892 if nvmm.found()
893 accelerators += 'CONFIG_NVMM'
894 endif
895endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100896
Paolo Bonzini823eb012021-11-08 14:18:17 +0100897tcg_arch = host_arch
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100898if get_option('tcg').allowed()
Paolo Bonzini823eb012021-11-08 14:18:17 +0100899 if host_arch == 'unknown'
Paolo Bonzinia24f15d2023-08-04 11:29:05 +0200900 if not get_option('tcg_interpreter')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400901 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
902 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100903 elif get_option('tcg_interpreter')
Philippe Mathieu-Daudé1c282da2021-05-21 12:34:23 +0200904 warning('Use of the TCG interpreter is not recommended on this host')
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100905 warning('architecture. There is a native TCG execution backend available')
906 warning('which provides substantially better performance and reliability.')
907 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
908 warning('configuration option on this architecture to use the native')
909 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400910 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100911 if get_option('tcg_interpreter')
912 tcg_arch = 'tci'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100913 elif host_arch == 'x86_64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100914 tcg_arch = 'i386'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100915 elif host_arch == 'ppc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100916 tcg_arch = 'ppc'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100917 endif
918 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzinie5134022022-10-12 14:15:06 +0200919 language: all_languages)
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100920
Paolo Bonzini8a199802020-09-18 05:37:01 -0400921 accelerators += 'CONFIG_TCG'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400922endif
923
924if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
925 error('KVM not available on this platform')
926endif
927if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
928 error('HVF not available on this platform')
929endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200930if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
931 error('NVMM not available on this platform')
932endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400933if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
934 error('WHPX not available on this platform')
935endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400936
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200937xen = not_found
938if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
939 xencontrol = dependency('xencontrol', required: false,
940 method: 'pkg-config')
941 if xencontrol.found()
942 xen_pc = declare_dependency(version: xencontrol.version(),
943 dependencies: [
944 xencontrol,
945 # disabler: true makes xen_pc.found() return false if any is not found
946 dependency('xenstore', required: false,
947 method: 'pkg-config',
948 disabler: true),
949 dependency('xenforeignmemory', required: false,
950 method: 'pkg-config',
951 disabler: true),
952 dependency('xengnttab', required: false,
953 method: 'pkg-config',
954 disabler: true),
955 dependency('xenevtchn', required: false,
956 method: 'pkg-config',
957 disabler: true),
958 dependency('xendevicemodel', required: false,
959 method: 'pkg-config',
960 disabler: true),
961 # optional, no "disabler: true"
962 dependency('xentoolcore', required: false,
963 method: 'pkg-config')])
964 if xen_pc.found()
965 xen = xen_pc
966 endif
967 endif
968 if not xen.found()
969 xen_tests = [ '4.11.0', '4.10.0', '4.9.0', '4.8.0', '4.7.1' ]
970 xen_libs = {
971 '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
972 '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
973 '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
974 '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
975 '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
976 }
977 xen_deps = {}
978 foreach ver: xen_tests
979 # cache the various library tests to avoid polluting the logs
980 xen_test_deps = []
981 foreach l: xen_libs[ver]
982 if l not in xen_deps
983 xen_deps += { l: cc.find_library(l, required: false) }
984 endif
985 xen_test_deps += xen_deps[l]
986 endforeach
987
988 # Use -D to pick just one of the test programs in scripts/xen-detect.c
989 xen_version = ver.split('.')
990 xen_ctrl_version = xen_version[0] + \
991 ('0' + xen_version[1]).substring(-2) + \
992 ('0' + xen_version[2]).substring(-2)
993 if cc.links(files('scripts/xen-detect.c'),
994 args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
995 dependencies: xen_test_deps)
996 xen = declare_dependency(version: ver, dependencies: xen_test_deps)
997 break
998 endif
999 endforeach
1000 endif
1001 if xen.found()
1002 accelerators += 'CONFIG_XEN'
1003 elif get_option('xen').enabled()
1004 error('could not compile and link Xen test program')
1005 endif
1006endif
1007have_xen_pci_passthrough = get_option('xen_pci_passthrough') \
1008 .require(xen.found(),
1009 error_message: 'Xen PCI passthrough requested but Xen not enabled') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001010 .require(host_os == 'linux',
Paolo Bonzini0f63d962023-09-08 12:08:53 +02001011 error_message: 'Xen PCI passthrough not available on this platform') \
1012 .require(cpu == 'x86' or cpu == 'x86_64',
1013 error_message: 'Xen PCI passthrough not available on this platform') \
1014 .allowed()
1015
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001016################
1017# Dependencies #
1018################
1019
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001020# When bumping glib minimum version, please check also whether to increase
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03001021# the _WIN32_WINNT setting in osdep.h according to the value from glib.
1022# You should also check if any of the glib.version() checks
1023# below can also be removed.
Thomas Huth0d8caac2024-04-18 12:10:50 +02001024glib_req_ver = '>=2.66.0'
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001025glib_pc = dependency('glib-2.0', version: glib_req_ver, required: true,
1026 method: 'pkg-config')
1027glib_cflags = []
Paolo Bonzini60027112022-10-20 14:53:10 +02001028if enable_modules
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001029 gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true,
1030 method: 'pkg-config')
Paolo Bonzini2c13c572023-08-30 12:20:53 +02001031elif get_option('plugins')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001032 gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true,
1033 method: 'pkg-config')
1034else
1035 gmodule = not_found
Emilio Cotae3feb2c2023-02-05 11:37:57 -05001036endif
Marc-André Lureau953d5a92020-12-15 12:03:19 +04001037
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001038# This workaround is required due to a bug in pkg-config file for glib as it
1039# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001040if host_os == 'windows' and get_option('prefer_static')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001041 glib_cflags += ['-DGLIB_STATIC_COMPILATION']
1042endif
1043
1044# Sanity check that the current size_t matches the
1045# size that glib thinks it should be. This catches
1046# problems on multi-arch where people try to build
1047# 32-bit QEMU while pointing at 64-bit glib headers
1048
1049if not cc.compiles('''
1050 #include <glib.h>
1051 #include <unistd.h>
1052
1053 #define QEMU_BUILD_BUG_ON(x) \
1054 typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
1055
1056 int main(void) {
1057 QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
1058 return 0;
1059 }''', dependencies: glib_pc, args: glib_cflags)
1060 error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T.
1061 You probably need to set PKG_CONFIG_LIBDIR" to point
1062 to the right pkg-config files for your build target.''')
1063endif
1064
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001065glib = declare_dependency(dependencies: [glib_pc, gmodule],
1066 compile_args: glib_cflags,
1067 version: glib_pc.version())
1068
1069# Check whether glib has gslice, which we have to avoid for correctness.
1070# TODO: remove this check and the corresponding workaround (qtree) when
1071# the minimum supported glib is >= 2.75.3
1072glib_has_gslice = glib.version().version_compare('<2.75.3')
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03001073# Check whether glib has the aligned_alloc family of functions.
1074# <https://docs.gtk.org/glib/func.aligned_alloc.html>
1075glib_has_aligned_alloc = glib.version().version_compare('>=2.72.0')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001076
1077# override glib dep to include the above refinements
1078meson.override_dependency('glib-2.0', glib)
1079
1080# The path to glib.h is added to all compilation commands.
1081add_project_dependencies(glib.partial_dependency(compile_args: true, includes: true),
1082 native: false, language: all_languages)
1083
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001084gio = not_found
Paolo Bonzini75440602022-04-20 17:33:44 +02001085gdbus_codegen = not_found
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02001086gdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
Paolo Bonzini75440602022-04-20 17:33:44 +02001087if not get_option('gio').auto() or have_system
1088 gio = dependency('gio-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001089 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +02001090 if gio.found() and not cc.links('''
1091 #include <gio/gio.h>
1092 int main(void)
1093 {
1094 g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
1095 return 0;
1096 }''', dependencies: [glib, gio])
1097 if get_option('gio').enabled()
1098 error('The installed libgio is broken for static linking')
1099 endif
1100 gio = not_found
1101 endif
1102 if gio.found()
Marc-André Lureauc118c8e2024-10-08 16:50:22 +04001103 gdbus_codegen = find_program('gdbus-codegen',
Paolo Bonzini75440602022-04-20 17:33:44 +02001104 required: get_option('gio'))
1105 gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001106 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +02001107 gio = declare_dependency(dependencies: [gio, gio_unix],
1108 version: gio.version())
1109 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001110endif
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02001111if gdbus_codegen.found() and get_option('cfi')
1112 gdbus_codegen = not_found
1113 gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity'
1114endif
Paolo Bonzini75440602022-04-20 17:33:44 +02001115
Marc-André Lureau6cc5a612023-06-06 15:56:42 +04001116xml_pp = find_program('scripts/xml-preprocess.py')
1117
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001118lttng = not_found
Paolo Bonzini9c29b742021-10-07 15:08:14 +02001119if 'ust' in get_option('trace_backends')
Marc-André Lureaue32aaa52022-03-28 12:47:13 +04001120 lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001121 method: 'pkg-config')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001122endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001123pixman = not_found
Marc-André Lureaucca15752023-08-30 13:38:25 +04001124if not get_option('pixman').auto() or have_system or have_tools
1125 pixman = dependency('pixman-1', required: get_option('pixman'), version:'>=0.21.8',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001126 method: 'pkg-config')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001127endif
Marc-André Lureaucca15752023-08-30 13:38:25 +04001128
Paolo Bonzini063d5112022-07-14 14:56:58 +02001129zlib = dependency('zlib', required: true)
Paolo Bonzini53c22b62021-06-03 11:31:35 +02001130
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001131libaio = not_found
1132if not get_option('linux_aio').auto() or have_block
1133 libaio = cc.find_library('aio', has_headers: ['libaio.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001134 required: get_option('linux_aio'))
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001135endif
Leonardo Bras354081d2022-05-13 03:28:30 -03001136
1137linux_io_uring_test = '''
1138 #include <liburing.h>
1139 #include <linux/errqueue.h>
1140
1141 int main(void) { return 0; }'''
1142
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001143linux_io_uring = not_found
Paolo Bonzini53c22b62021-06-03 11:31:35 +02001144if not get_option('linux_io_uring').auto() or have_block
Daniel P. Berrangéa41b4fd2022-01-05 13:49:38 +00001145 linux_io_uring = dependency('liburing', version: '>=0.3',
1146 required: get_option('linux_io_uring'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001147 method: 'pkg-config')
Leonardo Bras354081d2022-05-13 03:28:30 -03001148 if not cc.links(linux_io_uring_test)
1149 linux_io_uring = not_found
1150 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001151endif
Leonardo Bras354081d2022-05-13 03:28:30 -03001152
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001153libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +01001154if not get_option('libnfs').auto() or have_block
Thomas Huthe2d98f22024-12-18 07:21:59 +01001155 libnfs = dependency('libnfs', version: ['>=1.9.3', '<6.0.0'],
Paolo Bonzini30045c02020-11-17 13:11:25 +01001156 required: get_option('libnfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001157 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001158endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001159
1160libattr_test = '''
1161 #include <stddef.h>
1162 #include <sys/types.h>
1163 #ifdef CONFIG_LIBATTR
1164 #include <attr/xattr.h>
1165 #else
1166 #include <sys/xattr.h>
1167 #endif
1168 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
1169
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001170libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001171have_old_libattr = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001172if get_option('attr').allowed()
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001173 if cc.links(libattr_test)
1174 libattr = declare_dependency()
1175 else
1176 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001177 required: get_option('attr'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001178 if libattr.found() and not \
1179 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
1180 libattr = not_found
1181 if get_option('attr').enabled()
1182 error('could not link libattr')
1183 else
1184 warning('could not link libattr, disabling')
1185 endif
1186 else
1187 have_old_libattr = libattr.found()
1188 endif
1189 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001190endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001191
Akihiko Odakid2277f02024-07-15 14:25:44 +09001192cocoa = dependency('appleframeworks',
1193 modules: ['Cocoa', 'CoreVideo', 'QuartzCore'],
Akihiko Odaki52eaefd2022-07-02 23:25:19 +09001194 required: get_option('cocoa'))
Paolo Bonzinic1ec4942021-01-07 14:04:00 +01001195
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03001196vmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet'))
1197if vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h',
1198 'VMNET_BRIDGED_MODE',
1199 dependencies: vmnet)
1200 vmnet = not_found
1201 if get_option('vmnet').enabled()
1202 error('vmnet.framework API is outdated')
1203 else
1204 warning('vmnet.framework API is outdated, disabling')
1205 endif
1206endif
1207
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001208seccomp = not_found
Michal Privoznik73422d92022-10-26 09:30:24 +02001209seccomp_has_sysrawrc = false
Paolo Bonzini90835c22020-11-17 14:22:24 +01001210if not get_option('seccomp').auto() or have_system or have_tools
1211 seccomp = dependency('libseccomp', version: '>=2.3.0',
1212 required: get_option('seccomp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001213 method: 'pkg-config')
Michal Privoznik73422d92022-10-26 09:30:24 +02001214 if seccomp.found()
1215 seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h',
1216 'SCMP_FLTATR_API_SYSRAWRC',
1217 dependencies: seccomp)
1218 endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001219endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001220
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001221libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001222if not get_option('cap_ng').auto() or have_system or have_tools
1223 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001224 required: get_option('cap_ng'))
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001225endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001226if libcap_ng.found() and not cc.links('''
1227 #include <cap-ng.h>
1228 int main(void)
1229 {
1230 capng_capability_to_name(CAPNG_EFFECTIVE);
1231 return 0;
1232 }''', dependencies: libcap_ng)
1233 libcap_ng = not_found
1234 if get_option('cap_ng').enabled()
1235 error('could not link libcap-ng')
1236 else
1237 warning('could not link libcap-ng, disabling')
1238 endif
1239endif
1240
Paolo Bonzini1917ec62020-08-26 03:24:11 -04001241if get_option('xkbcommon').auto() and not have_system and not have_tools
1242 xkbcommon = not_found
1243else
1244 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001245 method: 'pkg-config')
Marc-André Lureauade60d42019-07-15 14:48:31 +04001246endif
Paolo Bonzinie1723992021-10-07 15:08:21 +02001247
Thomas Huth58902582022-04-08 18:20:47 +02001248slirp = not_found
1249if not get_option('slirp').auto() or have_system
1250 slirp = dependency('slirp', required: get_option('slirp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001251 method: 'pkg-config')
Thomas Huth58902582022-04-08 18:20:47 +02001252 # slirp < 4.7 is incompatible with CFI support in QEMU. This is because
1253 # it passes function pointers within libslirp as callbacks for timers.
1254 # When using a system-wide shared libslirp, the type information for the
1255 # callback is missing and the timer call produces a false positive with CFI.
1256 # Do not use the "version" keyword argument to produce a better error.
1257 # with control-flow integrity.
1258 if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7')
1259 if get_option('slirp').enabled()
1260 error('Control-Flow Integrity requires libslirp 4.7.')
1261 else
1262 warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.')
1263 slirp = not_found
1264 endif
1265 endif
1266endif
1267
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001268vde = not_found
Paolo Bonzinie1723992021-10-07 15:08:21 +02001269if not get_option('vde').auto() or have_system or have_tools
1270 vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001271 required: get_option('vde'))
Paolo Bonzinie1723992021-10-07 15:08:21 +02001272endif
1273if vde.found() and not cc.links('''
1274 #include <libvdeplug.h>
1275 int main(void)
1276 {
1277 struct vde_open_args a = {0, 0, 0};
1278 char s[] = "";
1279 vde_open(s, s, &a);
1280 return 0;
1281 }''', dependencies: vde)
1282 vde = not_found
1283 if get_option('cap_ng').enabled()
1284 error('could not link libvdeplug')
1285 else
1286 warning('could not link libvdeplug, disabling')
1287 endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001288endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001289
Paolo Bonzini478e9432020-08-17 12:47:55 +02001290pulse = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001291if not get_option('pa').auto() or (host_os == 'linux' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001292 pulse = dependency('libpulse', required: get_option('pa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001293 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001294endif
1295alsa = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001296if not get_option('alsa').auto() or (host_os == 'linux' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001297 alsa = dependency('alsa', required: get_option('alsa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001298 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001299endif
1300jack = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001301if not get_option('jack').auto() or have_system
1302 jack = dependency('jack', required: get_option('jack'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001303 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001304endif
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001305pipewire = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001306if not get_option('pipewire').auto() or (host_os == 'linux' and have_system)
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001307 pipewire = dependency('libpipewire-0.3', version: '>=0.3.60',
1308 required: get_option('pipewire'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001309 method: 'pkg-config')
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001310endif
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001311sndio = not_found
1312if not get_option('sndio').auto() or have_system
1313 sndio = dependency('sndio', required: get_option('sndio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001314 method: 'pkg-config')
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001315endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001316
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001317spice_protocol = not_found
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001318if not get_option('spice_protocol').auto() or have_system
Markus Armbruster5c167b52023-01-09 20:03:07 +01001319 spice_protocol = dependency('spice-protocol', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001320 required: get_option('spice_protocol'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001321 method: 'pkg-config')
Paolo Bonzini26347332019-07-29 15:40:07 +02001322endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001323spice = not_found
Marc-André Lureauc98791e2023-08-30 13:38:35 +04001324if get_option('spice') \
1325 .disable_auto_if(not have_system) \
1326 .require(pixman.found(),
1327 error_message: 'cannot enable SPICE if pixman is not available') \
1328 .allowed()
Markus Armbruster34d55722023-01-09 20:03:09 +01001329 spice = dependency('spice-server', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001330 required: get_option('spice'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001331 method: 'pkg-config')
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001332endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001333spice_headers = spice.partial_dependency(compile_args: true, includes: true)
1334
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04001335rt = cc.find_library('rt', required: false)
Paolo Bonzinia399f912021-11-15 14:29:13 +00001336
Paolo Bonzini99650b62019-06-10 12:21:14 +02001337libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001338if not get_option('libiscsi').auto() or have_block
1339 libiscsi = dependency('libiscsi', version: '>=1.9.0',
1340 required: get_option('libiscsi'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001341 method: 'pkg-config')
Paolo Bonzini99650b62019-06-10 12:21:14 +02001342endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001343zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +01001344if not get_option('zstd').auto() or have_block
1345 zstd = dependency('libzstd', version: '>=1.4.0',
1346 required: get_option('zstd'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001347 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001348endif
Yuan Liub844a2c2024-06-10 18:21:06 +08001349qpl = not_found
1350if not get_option('qpl').auto() or have_system
1351 qpl = dependency('qpl', version: '>=1.5.0',
1352 required: get_option('qpl'),
1353 method: 'pkg-config')
1354endif
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01001355uadk = not_found
1356if not get_option('uadk').auto() or have_system
1357 libwd = dependency('libwd', version: '>=2.6',
1358 required: get_option('uadk'),
1359 method: 'pkg-config')
1360 libwd_comp = dependency('libwd_comp', version: '>=2.6',
1361 required: get_option('uadk'),
1362 method: 'pkg-config')
1363 if libwd.found() and libwd_comp.found()
1364 uadk = declare_dependency(dependencies: [libwd, libwd_comp])
1365 endif
1366endif
Bryan Zhange28ed312024-08-30 16:27:19 -07001367
1368qatzip = not_found
1369if not get_option('qatzip').auto() or have_system
1370 qatzip = dependency('qatzip', version: '>=1.1.2',
1371 required: get_option('qatzip'),
1372 method: 'pkg-config')
1373endif
1374
Marc-André Lureauea458962019-07-12 22:23:46 +04001375virgl = not_found
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001376
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001377have_vhost_user_gpu = have_tools and host_os == 'linux' and pixman.found()
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001378if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
Paolo Bonzini587d59d2021-06-03 11:31:35 +02001379 virgl = dependency('virglrenderer',
1380 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001381 required: get_option('virglrenderer'))
Marc-André Lureauea458962019-07-12 22:23:46 +04001382endif
Gurchetan Singhcd9adbe2023-03-21 09:47:36 -07001383rutabaga = not_found
1384if not get_option('rutabaga_gfx').auto() or have_system or have_vhost_user_gpu
1385 rutabaga = dependency('rutabaga_gfx_ffi',
1386 method: 'pkg-config',
1387 required: get_option('rutabaga_gfx'))
1388endif
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001389blkio = not_found
1390if not get_option('blkio').auto() or have_block
1391 blkio = dependency('blkio',
1392 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001393 required: get_option('blkio'))
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001394endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001395curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001396if not get_option('curl').auto() or have_block
1397 curl = dependency('libcurl', version: '>=7.29.0',
1398 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001399 required: get_option('curl'))
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001400endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001401libudev = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001402if host_os == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001403 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +01001404 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001405 required: get_option('libudev'))
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001406endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001407
Paolo Bonzini5c530152020-10-15 06:09:27 -04001408mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001409mpathpersist = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001410if host_os == 'linux' and have_tools and get_option('mpath').allowed()
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001411 mpath_test_source = '''
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001412 #include <libudev.h>
1413 #include <mpath_persist.h>
1414 unsigned mpath_mx_alloc_len = 1024;
1415 int logsink;
1416 static struct config *multipath_conf;
1417 extern struct udev *udev;
1418 extern struct config *get_multipath_config(void);
1419 extern void put_multipath_config(struct config *conf);
1420 struct udev *udev;
1421 struct config *get_multipath_config(void) { return multipath_conf; }
1422 void put_multipath_config(struct config *conf) { }
1423 int main(void) {
1424 udev = udev_new();
1425 multipath_conf = mpath_lib_init();
1426 return 0;
1427 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -04001428 libmpathpersist = cc.find_library('mpathpersist',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001429 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001430 if libmpathpersist.found()
1431 mpathlibs += libmpathpersist
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001432 if get_option('prefer_static')
Paolo Bonzini5c530152020-10-15 06:09:27 -04001433 mpathlibs += cc.find_library('devmapper',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001434 required: get_option('mpath'))
Paolo Bonzini43b43a42020-09-17 12:25:09 +02001435 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -04001436 mpathlibs += cc.find_library('multipath',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001437 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001438 foreach lib: mpathlibs
1439 if not lib.found()
1440 mpathlibs = []
1441 break
1442 endif
1443 endforeach
1444 if mpathlibs.length() == 0
1445 msg = 'Dependencies missing for libmpathpersist'
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001446 elif cc.links(mpath_test_source, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001447 mpathpersist = declare_dependency(dependencies: mpathlibs)
1448 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001449 msg = 'Cannot detect libmpathpersist API'
1450 endif
1451 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001452 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -04001453 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001454 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001455 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001456 endif
1457 endif
1458 endif
1459endif
1460
Yonggang Luo5285e592020-10-13 07:43:48 +08001461iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001462curses = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001463if have_system and get_option('curses').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001464 curses_test = '''
Brad Smithf8d31162024-10-11 23:38:55 -04001465 #ifdef __APPLE__
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001466 #define _XOPEN_SOURCE_EXTENDED 1
1467 #endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001468 #include <locale.h>
1469 #include <curses.h>
1470 #include <wchar.h>
1471 int main(void) {
1472 wchar_t wch = L'w';
1473 setlocale(LC_ALL, "");
1474 resize_term(0, 0);
1475 addwstr(L"wide chars\n");
1476 addnwstr(&wch, 1);
1477 add_wch(WACS_DEGREE);
1478 return 0;
1479 }'''
1480
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001481 curses_dep_list = host_os == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
Paolo Bonzini6d322632022-03-27 16:05:58 +02001482 curses = dependency(curses_dep_list,
1483 required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001484 method: 'pkg-config')
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001485 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001486 curses_compile_args = ['-DNCURSES_WIDECHAR=1']
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001487 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -05001488 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001489 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses],
1490 version: curses.version())
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001491 else
1492 msg = 'curses package not usable'
1493 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001494 endif
1495 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001496 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001497 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001498 if host_os != 'windows' and not has_curses_h
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001499 message('Trying with /usr/include/ncursesw')
1500 curses_compile_args += ['-I/usr/include/ncursesw']
1501 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
1502 endif
1503 if has_curses_h
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001504 curses_libname_list = (host_os == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001505 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +08001506 libcurses = cc.find_library(curses_libname,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001507 required: false)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001508 if libcurses.found()
1509 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
1510 curses = declare_dependency(compile_args: curses_compile_args,
1511 dependencies: [libcurses])
1512 break
1513 else
1514 msg = 'curses library not usable'
1515 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001516 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001517 endforeach
1518 endif
1519 endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001520 if get_option('iconv').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001521 foreach link_args : [ ['-liconv'], [] ]
1522 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
1523 # We need to use libiconv if available because mixing libiconv's headers with
1524 # the system libc does not work.
1525 # However, without adding glib to the dependencies -L/usr/local/lib will not be
1526 # included in the command line and libiconv will not be found.
1527 if cc.links('''
1528 #include <iconv.h>
1529 int main(void) {
1530 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
1531 return conv != (iconv_t) -1;
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001532 }''', args: link_args, dependencies: glib)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001533 iconv = declare_dependency(link_args: link_args, dependencies: glib)
1534 break
Yonggang Luo5285e592020-10-13 07:43:48 +08001535 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001536 endforeach
1537 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001538 if curses.found() and not iconv.found()
1539 if get_option('iconv').enabled()
1540 error('iconv not available')
1541 endif
1542 msg = 'iconv required for curses UI but not available'
1543 curses = not_found
1544 endif
1545 if not curses.found() and msg != ''
1546 if get_option('curses').enabled()
1547 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001548 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001549 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001550 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001551 endif
1552endif
1553
Paolo Bonzini26347332019-07-29 15:40:07 +02001554brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001555if not get_option('brlapi').auto() or have_system
1556 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001557 required: get_option('brlapi'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001558 if brlapi.found() and not cc.links('''
1559 #include <brlapi.h>
1560 #include <stddef.h>
1561 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
1562 brlapi = not_found
1563 if get_option('brlapi').enabled()
1564 error('could not link brlapi')
1565 else
1566 warning('could not link brlapi, disabling')
1567 endif
1568 endif
Paolo Bonzini26347332019-07-29 15:40:07 +02001569endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001570
Paolo Bonzini760e4322020-08-26 08:09:48 +02001571sdl = not_found
Akihiko Odaki64d3fec2022-08-19 22:27:56 +09001572if not get_option('sdl').auto() or have_system
Paolo Bonzini063d5112022-07-14 14:56:58 +02001573 sdl = dependency('sdl2', required: get_option('sdl'))
Paolo Bonzini760e4322020-08-26 08:09:48 +02001574 sdl_image = not_found
1575endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001576if sdl.found()
Thomas Huth6da5f222023-06-05 13:45:23 +02001577 # Some versions of SDL have problems with -Wundef
1578 if not cc.compiles('''
1579 #include <SDL.h>
1580 #include <SDL_syswm.h>
1581 int main(int argc, char *argv[]) { return 0; }
1582 ''', dependencies: sdl, args: '-Werror=undef')
1583 sdl = declare_dependency(compile_args: '-Wno-undef',
1584 dependencies: sdl,
1585 version: sdl.version())
1586 endif
Volker Rümelin7161a432020-08-29 12:41:58 +02001587 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001588 method: 'pkg-config')
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001589else
1590 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +01001591 error('sdl-image required, but SDL was @0@'.format(
1592 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001593 endif
1594 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +02001595endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001596
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001597rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001598if not get_option('rbd').auto() or have_block
Paolo Bonzini063d5112022-07-14 14:56:58 +02001599 librados = cc.find_library('rados', required: get_option('rbd'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001600 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001601 required: get_option('rbd'))
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001602 if librados.found() and librbd.found()
1603 if cc.links('''
1604 #include <stdio.h>
1605 #include <rbd/librbd.h>
1606 int main(void) {
1607 rados_t cluster;
1608 rados_create(&cluster, NULL);
Peter Lieven48672ac2021-07-02 19:23:51 +02001609 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
1610 #error
1611 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001612 return 0;
1613 }''', dependencies: [librbd, librados])
1614 rbd = declare_dependency(dependencies: [librbd, librados])
1615 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +02001616 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001617 else
Peter Lieven48672ac2021-07-02 19:23:51 +02001618 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001619 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001620 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001621endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001622
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001623glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001624glusterfs_ftruncate_has_stat = false
1625glusterfs_iocb_has_stat = false
1626if not get_option('glusterfs').auto() or have_block
1627 glusterfs = dependency('glusterfs-api', version: '>=3',
1628 required: get_option('glusterfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001629 method: 'pkg-config')
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001630 if glusterfs.found()
1631 glusterfs_ftruncate_has_stat = cc.links('''
1632 #include <glusterfs/api/glfs.h>
1633
1634 int
1635 main(void)
1636 {
1637 /* new glfs_ftruncate() passes two additional args */
1638 return glfs_ftruncate(NULL, 0, NULL, NULL);
1639 }
1640 ''', dependencies: glusterfs)
1641 glusterfs_iocb_has_stat = cc.links('''
1642 #include <glusterfs/api/glfs.h>
1643
1644 /* new glfs_io_cbk() passes two additional glfs_stat structs */
1645 static void
1646 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
1647 {}
1648
1649 int
1650 main(void)
1651 {
1652 glfs_io_cbk iocb = &glusterfs_iocb;
1653 iocb(NULL, 0 , NULL, NULL, NULL);
1654 return 0;
1655 }
1656 ''', dependencies: glusterfs)
1657 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001658endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001659
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02001660hv_balloon = false
1661if get_option('hv_balloon').allowed() and have_system
1662 if cc.links('''
1663 #include <string.h>
1664 #include <gmodule.h>
1665 int main(void) {
1666 GTree *tree;
1667
1668 tree = g_tree_new((GCompareFunc)strcmp);
1669 (void)g_tree_node_first(tree);
1670 g_tree_destroy(tree);
1671 return 0;
1672 }
1673 ''', dependencies: glib)
1674 hv_balloon = true
1675 else
1676 if get_option('hv_balloon').enabled()
1677 error('could not enable hv-balloon, update your glib')
1678 else
1679 warning('could not find glib support for hv-balloon, disabling')
1680 endif
1681 endif
1682endif
1683
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001684libssh = not_found
Thomas Huthe6a52b32021-12-09 15:48:01 +01001685if not get_option('libssh').auto() or have_block
1686 libssh = dependency('libssh', version: '>=0.8.7',
1687 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001688 required: get_option('libssh'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001689endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001690
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001691libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001692if not get_option('bzip2').auto() or have_block
1693 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001694 required: get_option('bzip2'))
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001695 if libbzip2.found() and not cc.links('''
1696 #include <bzlib.h>
1697 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
1698 libbzip2 = not_found
1699 if get_option('bzip2').enabled()
1700 error('could not link libbzip2')
1701 else
1702 warning('could not link libbzip2, disabling')
1703 endif
1704 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001705endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001706
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001707liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +01001708if not get_option('lzfse').auto() or have_block
1709 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001710 required: get_option('lzfse'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001711endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001712if liblzfse.found() and not cc.links('''
1713 #include <lzfse.h>
1714 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
1715 liblzfse = not_found
1716 if get_option('lzfse').enabled()
1717 error('could not link liblzfse')
1718 else
1719 warning('could not link liblzfse, disabling')
1720 endif
1721endif
1722
Paolo Bonzini478e9432020-08-17 12:47:55 +02001723oss = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001724if get_option('oss').allowed() and have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02001725 if not cc.has_header('sys/soundcard.h')
1726 # not found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001727 elif host_os == 'netbsd'
Paolo Bonzini063d5112022-07-14 14:56:58 +02001728 oss = cc.find_library('ossaudio', required: get_option('oss'))
Paolo Bonzini87430d52021-10-07 15:06:09 +02001729 else
1730 oss = declare_dependency()
1731 endif
1732
1733 if not oss.found()
1734 if get_option('oss').enabled()
1735 error('OSS not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001736 endif
1737 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001738endif
1739dsound = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001740if not get_option('dsound').auto() or (host_os == 'windows' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001741 if cc.has_header('dsound.h')
1742 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1743 endif
1744
1745 if not dsound.found()
1746 if get_option('dsound').enabled()
1747 error('DirectSound not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001748 endif
1749 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001750endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001751
Paolo Bonzini478e9432020-08-17 12:47:55 +02001752coreaudio = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001753if not get_option('coreaudio').auto() or (host_os == 'darwin' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001754 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
1755 required: get_option('coreaudio'))
Paolo Bonzini478e9432020-08-17 12:47:55 +02001756endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001757
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001758opengl = not_found
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001759if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
1760 epoxy = dependency('epoxy', method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001761 required: get_option('opengl'))
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001762 if cc.has_header('epoxy/egl.h', dependencies: epoxy)
1763 opengl = epoxy
1764 elif get_option('opengl').enabled()
1765 error('epoxy/egl.h not found')
1766 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001767endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001768gbm = not_found
1769if (have_system or have_tools) and (virgl.found() or opengl.found())
Paolo Bonzini063d5112022-07-14 14:56:58 +02001770 gbm = dependency('gbm', method: 'pkg-config', required: false)
Thomas Huth8bc51842021-07-13 13:09:02 +02001771endif
Marc-André Lureauf0caba42022-06-28 17:23:15 +04001772have_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001773
Dorjoy Chowdhurybb154e32024-10-09 03:17:23 +06001774libcbor = not_found
1775if not get_option('libcbor').auto() or have_system
1776 libcbor = dependency('libcbor', version: '>=0.7.0',
1777 required: get_option('libcbor'))
1778endif
1779
Paolo Bonzini57612512021-06-03 11:15:26 +02001780gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001781gnutls_crypto = not_found
Alyssa Rossabc14fd2021-08-06 14:49:47 +00001782if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001783 # For general TLS support our min gnutls matches
1784 # that implied by our platform support matrix
1785 #
1786 # For the crypto backends, we look for a newer
1787 # gnutls:
1788 #
1789 # Version 3.6.8 is needed to get XTS
1790 # Version 3.6.13 is needed to get PBKDF
1791 # Version 3.6.14 is needed to get HW accelerated XTS
1792 #
1793 # If newer enough gnutls isn't available, we can
1794 # still use a different crypto backend to satisfy
1795 # the platform support requirements
1796 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1797 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001798 required: false)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001799 if gnutls_crypto.found()
1800 gnutls = gnutls_crypto
1801 else
1802 # Our min version if all we need is TLS
1803 gnutls = dependency('gnutls', version: '>=3.5.18',
1804 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001805 required: get_option('gnutls'))
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001806 endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001807endif
1808
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001809# We prefer use of gnutls for crypto, unless the options
1810# explicitly asked for nettle or gcrypt.
1811#
1812# If gnutls isn't available for crypto, then we'll prefer
1813# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +02001814gcrypt = not_found
1815nettle = not_found
Lei He4c5e5122022-05-25 17:01:14 +08001816hogweed = not_found
Hyman Huang52ed9f42023-12-07 23:47:35 +08001817crypto_sm4 = not_found
liequan ched078da82024-10-30 08:51:46 +00001818crypto_sm3 = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +01001819xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001820
Paolo Bonzini57612512021-06-03 11:15:26 +02001821if get_option('nettle').enabled() and get_option('gcrypt').enabled()
1822 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +02001823endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001824
1825# Explicit nettle/gcrypt request, so ignore gnutls for crypto
1826if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001827 gnutls_crypto = not_found
1828endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001829
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001830if not gnutls_crypto.found()
1831 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
1832 gcrypt = dependency('libgcrypt', version: '>=1.8',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001833 required: get_option('gcrypt'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001834 # Debian has removed -lgpg-error from libgcrypt-config
1835 # as it "spreads unnecessary dependencies" which in
1836 # turn breaks static builds...
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001837 if gcrypt.found() and get_option('prefer_static')
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001838 gcrypt = declare_dependency(dependencies:
1839 [gcrypt,
1840 cc.find_library('gpg-error', required: true)],
1841 version: gcrypt.version())
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001842 endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08001843 crypto_sm4 = gcrypt
1844 # SM4 ALG is available in libgcrypt >= 1.9
1845 if gcrypt.found() and not cc.links('''
1846 #include <gcrypt.h>
1847 int main(void) {
1848 gcry_cipher_hd_t handler;
1849 gcry_cipher_open(&handler, GCRY_CIPHER_SM4, GCRY_CIPHER_MODE_ECB, 0);
1850 return 0;
1851 }''', dependencies: gcrypt)
1852 crypto_sm4 = not_found
1853 endif
liequan ched078da82024-10-30 08:51:46 +00001854 crypto_sm3 = gcrypt
1855 # SM3 ALG is available in libgcrypt >= 1.9
1856 if gcrypt.found() and not cc.links('''
1857 #include <gcrypt.h>
1858 int main(void) {
1859 gcry_md_hd_t handler;
1860 gcry_md_open(&handler, GCRY_MD_SM3, 0);
1861 return 0;
1862 }''', dependencies: gcrypt)
1863 crypto_sm3 = not_found
1864 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001865 endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001866 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1867 nettle = dependency('nettle', version: '>=3.4',
1868 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001869 required: get_option('nettle'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001870 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1871 xts = 'private'
1872 endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08001873 crypto_sm4 = nettle
1874 # SM4 ALG is available in nettle >= 3.9
1875 if nettle.found() and not cc.links('''
1876 #include <nettle/sm4.h>
1877 int main(void) {
1878 struct sm4_ctx ctx;
1879 unsigned char key[16] = {0};
1880 sm4_set_encrypt_key(&ctx, key);
1881 return 0;
1882 }''', dependencies: nettle)
1883 crypto_sm4 = not_found
1884 endif
liequan ched078da82024-10-30 08:51:46 +00001885 crypto_sm3 = nettle
1886 # SM3 ALG is available in nettle >= 3.8
1887 if nettle.found() and not cc.links('''
1888 #include <nettle/sm3.h>
1889 #include <nettle/hmac.h>
1890 int main(void) {
1891 struct sm3_ctx ctx;
1892 struct hmac_sm3_ctx hmac_ctx;
1893 unsigned char data[64] = {0};
1894 unsigned char output[32];
1895
1896 // SM3 hash function test
1897 sm3_init(&ctx);
1898 sm3_update(&ctx, 64, data);
1899 sm3_digest(&ctx, 32, data);
1900
1901 // HMAC-SM3 test
1902 hmac_sm3_set_key(&hmac_ctx, 32, data);
1903 hmac_sm3_update(&hmac_ctx, 64, data);
1904 hmac_sm3_digest(&hmac_ctx, 32, output);
1905
1906 return 0;
1907 }''', dependencies: nettle)
1908 crypto_sm3 = not_found
1909 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001910 endif
1911endif
1912
Paolo Bonzinia775c712023-09-08 12:09:22 +02001913capstone = not_found
1914if not get_option('capstone').auto() or have_system or have_user
1915 capstone = dependency('capstone', version: '>=3.0.5',
1916 method: 'pkg-config',
1917 required: get_option('capstone'))
1918
1919 # Some versions of capstone have broken pkg-config file
1920 # that reports a wrong -I path, causing the #include to
1921 # fail later. If the system has such a broken version
1922 # do not use it.
1923 if capstone.found() and not cc.compiles('#include <capstone.h>',
1924 dependencies: [capstone])
1925 capstone = not_found
1926 if get_option('capstone').enabled()
1927 error('capstone requested, but it does not appear to work')
1928 endif
1929 endif
1930endif
1931
Paolo Bonzini063d5112022-07-14 14:56:58 +02001932gmp = dependency('gmp', required: false, method: 'pkg-config')
Lei He4c5e5122022-05-25 17:01:14 +08001933if nettle.found() and gmp.found()
1934 hogweed = dependency('hogweed', version: '>=3.4',
1935 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001936 required: get_option('nettle'))
Lei He4c5e5122022-05-25 17:01:14 +08001937endif
1938
1939
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001940gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +01001941gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001942vte = not_found
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001943have_gtk_clipboard = get_option('gtk_clipboard').enabled()
1944
Marc-André Lureauda554e12023-08-30 13:38:36 +04001945if get_option('gtk') \
1946 .disable_auto_if(not have_system) \
1947 .require(pixman.found(),
1948 error_message: 'cannot enable GTK if pixman is not available') \
1949 .allowed()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001950 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1951 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001952 required: get_option('gtk'))
Paolo Bonzini1b695472021-01-07 14:02:29 +01001953 if gtk.found()
1954 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1955 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001956 required: false)
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001957 gtk = declare_dependency(dependencies: [gtk, gtkx11],
1958 version: gtk.version())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001959
1960 if not get_option('vte').auto() or have_system
1961 vte = dependency('vte-2.91',
1962 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001963 required: get_option('vte'))
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001964 endif
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001965 elif have_gtk_clipboard
1966 error('GTK clipboard requested, but GTK not found')
Paolo Bonzini1b695472021-01-07 14:02:29 +01001967 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001968endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001969
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001970x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +02001971if gtkx11.found()
Paolo Bonzini063d5112022-07-14 14:56:58 +02001972 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001973endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001974png = not_found
Kshitij Suri95f85102022-04-08 07:13:34 +00001975if get_option('png').allowed() and have_system
Thomas Huth1ec8c2c2022-06-23 19:49:41 +02001976 png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001977 method: 'pkg-config')
Kshitij Suri95f85102022-04-08 07:13:34 +00001978endif
1979vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001980jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001981sasl = not_found
Marc-André Lureau89fd3ea2023-08-30 13:38:34 +04001982if get_option('vnc') \
1983 .disable_auto_if(not have_system) \
1984 .require(pixman.found(),
1985 error_message: 'cannot enable VNC if pixman is not available') \
1986 .allowed()
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001987 vnc = declare_dependency() # dummy dependency
Paolo Bonzini8e242b32020-11-23 13:34:02 -05001988 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001989 method: 'pkg-config')
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001990 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001991 required: get_option('vnc_sasl'))
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001992 if sasl.found()
1993 sasl = declare_dependency(dependencies: sasl,
1994 compile_args: '-DSTRUCT_IOVEC_DEFINED')
1995 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001996endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01001997
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001998pam = not_found
1999if not get_option('auth_pam').auto() or have_system
2000 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002001 required: get_option('auth_pam'))
Paolo Bonzini05e391a2021-06-03 11:15:26 +02002002endif
2003if pam.found() and not cc.links('''
2004 #include <stddef.h>
2005 #include <security/pam_appl.h>
2006 int main(void) {
2007 const char *service_name = "qemu";
2008 const char *user = "frank";
2009 const struct pam_conv pam_conv = { 0 };
2010 pam_handle_t *pamh = NULL;
2011 pam_start(service_name, user, &pam_conv, &pamh);
2012 return 0;
2013 }''', dependencies: pam)
2014 pam = not_found
2015 if get_option('auth_pam').enabled()
2016 error('could not link libpam')
2017 else
2018 warning('could not link libpam, disabling')
2019 endif
2020endif
2021
Marc-André Lureau708eab42019-09-03 16:59:33 +04002022snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +01002023if not get_option('snappy').auto() or have_system
2024 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002025 required: get_option('snappy'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04002026endif
Thomas Huth785abf02023-07-06 08:47:36 +02002027if snappy.found() and not cc.links('''
Paolo Bonzini241611e2020-11-17 13:32:34 +01002028 #include <snappy-c.h>
2029 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
2030 snappy = not_found
2031 if get_option('snappy').enabled()
2032 error('could not link libsnappy')
2033 else
2034 warning('could not link libsnappy, disabling')
2035 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +04002036endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002037
Marc-André Lureau708eab42019-09-03 16:59:33 +04002038lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002039if not get_option('lzo').auto() or have_system
2040 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002041 required: get_option('lzo'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04002042endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002043if lzo.found() and not cc.links('''
2044 #include <lzo/lzo1x.h>
2045 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
2046 lzo = not_found
2047 if get_option('lzo').enabled()
2048 error('could not link liblzo2')
2049 else
2050 warning('could not link liblzo2, disabling')
2051 endif
2052endif
2053
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002054numa = not_found
2055if not get_option('numa').auto() or have_system or have_tools
2056 numa = cc.find_library('numa', has_headers: ['numa.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002057 required: get_option('numa'))
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002058endif
2059if numa.found() and not cc.links('''
2060 #include <numa.h>
2061 int main(void) { return numa_available(); }
2062 ''', dependencies: numa)
2063 numa = not_found
2064 if get_option('numa').enabled()
2065 error('could not link numa')
2066 else
2067 warning('could not link numa, disabling')
2068 endif
2069endif
2070
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01002071fdt = not_found
2072fdt_opt = get_option('fdt')
2073if fdt_opt == 'enabled' and get_option('wrap_mode') == 'nodownload'
2074 fdt_opt = 'system'
2075endif
2076if fdt_opt in ['enabled', 'system'] or (fdt_opt == 'auto' and have_system)
2077 fdt = cc.find_library('fdt', required: fdt_opt == 'system')
2078 if fdt.found() and cc.links('''
2079 #include <libfdt.h>
2080 #include <libfdt_env.h>
2081 int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
2082 dependencies: fdt)
2083 fdt_opt = 'system'
2084 elif fdt_opt != 'system'
2085 fdt_opt = get_option('wrap_mode') == 'nodownload' ? 'disabled' : 'internal'
2086 fdt = not_found
2087 else
2088 error('system libfdt is too old (1.5.1 or newer required)')
2089 endif
2090endif
2091if fdt_opt == 'internal'
2092 assert(not fdt.found())
2093 libfdt_proj = subproject('dtc', required: true,
2094 default_options: ['tools=false', 'yaml=disabled',
2095 'python=disabled', 'default_library=static'])
2096 fdt = libfdt_proj.get_variable('libfdt_dep')
2097endif
2098
Marc-André Lureau55166232019-07-24 19:16:22 +04002099rdma = not_found
Paolo Bonzini3730a732022-04-20 17:33:41 +02002100if not get_option('rdma').auto() or have_system
Paolo Bonzini3730a732022-04-20 17:33:41 +02002101 rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002102 required: get_option('rdma')),
zhenwei pi829858f2024-06-11 18:54:26 +08002103 cc.find_library('ibverbs', required: get_option('rdma'))]
Paolo Bonzini3730a732022-04-20 17:33:41 +02002104 rdma = declare_dependency(dependencies: rdma_libs)
2105 foreach lib: rdma_libs
2106 if not lib.found()
2107 rdma = not_found
2108 endif
2109 endforeach
Marc-André Lureau55166232019-07-24 19:16:22 +04002110endif
Paolo Bonzini3730a732022-04-20 17:33:41 +02002111
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002112cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02002113if not get_option('smartcard').auto() or have_system
2114 cacard = dependency('libcacard', required: get_option('smartcard'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002115 version: '>=2.5.1', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002116endif
César Belley0a40bcb2020-08-26 13:42:04 +02002117u2f = not_found
Paolo Bonzinie7c22ff2023-09-08 12:10:27 +02002118if not get_option('u2f').auto() or have_system
César Belley0a40bcb2020-08-26 13:42:04 +02002119 u2f = dependency('u2f-emu', required: get_option('u2f'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002120 method: 'pkg-config')
César Belley0a40bcb2020-08-26 13:42:04 +02002121endif
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002122canokey = not_found
Paolo Bonzinie7c22ff2023-09-08 12:10:27 +02002123if not get_option('canokey').auto() or have_system
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002124 canokey = dependency('canokey-qemu', required: get_option('canokey'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002125 method: 'pkg-config')
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002126endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002127usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02002128if not get_option('usb_redir').auto() or have_system
2129 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002130 version: '>=0.6', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002131endif
2132libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02002133if not get_option('libusb').auto() or have_system
2134 libusb = dependency('libusb-1.0', required: get_option('libusb'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002135 version: '>=1.0.13', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002136endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02002137
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002138libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02002139if not get_option('libpmem').auto() or have_system
2140 libpmem = dependency('libpmem', required: get_option('libpmem'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002141 method: 'pkg-config')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002142endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06002143libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02002144if not get_option('libdaxctl').auto() or have_system
2145 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002146 version: '>=57', method: 'pkg-config')
Bruce Rogersc7c91a72020-08-24 09:52:12 -06002147endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04002148tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02002149if gnutls.found()
2150 tasn1 = dependency('libtasn1',
Philippe Mathieu-Daudédc37d1c2024-05-02 11:56:42 +02002151 required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02002152 method: 'pkg-config')
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04002153endif
Max Fritz0db0fbb2023-05-22 02:12:02 +02002154keyutils = not_found
Thomas Huthc64023b2023-08-24 11:42:08 +02002155if not get_option('libkeyutils').auto() or have_block
2156 keyutils = dependency('libkeyutils', required: get_option('libkeyutils'),
2157 method: 'pkg-config')
Max Fritz0db0fbb2023-05-22 02:12:02 +02002158endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002159
Marc-André Lureau3909def2020-08-28 15:07:33 +04002160has_gettid = cc.has_function('gettid')
2161
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002162# libselinux
2163selinux = dependency('libselinux',
2164 required: get_option('selinux'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002165 method: 'pkg-config')
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002166
Paolo Bonziniaa087962020-09-01 11:15:30 -04002167# Malloc tests
2168
2169malloc = []
2170if get_option('malloc') == 'system'
2171 has_malloc_trim = \
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002172 get_option('malloc_trim').allowed() and \
Michal Privoznik09a49af2023-05-30 12:31:23 +02002173 cc.has_function('malloc_trim', prefix: '#include <malloc.h>')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002174else
2175 has_malloc_trim = false
2176 malloc = cc.find_library(get_option('malloc'), required: true)
2177endif
2178if not has_malloc_trim and get_option('malloc_trim').enabled()
2179 if get_option('malloc') == 'system'
2180 error('malloc_trim not available on this platform.')
2181 else
2182 error('malloc_trim not available with non-libc memory allocator')
2183 endif
2184endif
2185
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002186gnu_source_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01002187 #ifndef _GNU_SOURCE
2188 #define _GNU_SOURCE
2189 #endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002190'''
Max Reitz84e319a2020-11-02 17:18:55 +01002191
Michal Privoznik09a49af2023-05-30 12:31:23 +02002192# Check whether the glibc provides STATX_BASIC_STATS
2193
2194has_statx = cc.has_header_symbol('sys/stat.h', 'STATX_BASIC_STATS', prefix: gnu_source_prefix)
Max Reitz84e319a2020-11-02 17:18:55 +01002195
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002196# Check whether statx() provides mount ID information
2197
Michal Privoznik09a49af2023-05-30 12:31:23 +02002198has_statx_mnt_id = cc.has_header_symbol('sys/stat.h', 'STATX_MNT_ID', prefix: gnu_source_prefix)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002199
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002200have_vhost_user_blk_server = get_option('vhost_user_blk_server') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002201 .require(host_os == 'linux',
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002202 error_message: 'vhost_user_blk_server requires linux') \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02002203 .require(have_vhost_user,
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002204 error_message: 'vhost_user_blk_server requires vhost-user support') \
Alex Bennée26ed5012022-05-24 16:40:42 +01002205 .disable_auto_if(not have_tools and not have_system) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002206 .allowed()
Daniele Buono9e62ba42020-12-04 18:06:14 -05002207
Max Reitzdf4ea702020-10-27 20:05:46 +01002208if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
2209 error('Cannot enable fuse-lseek while fuse is disabled')
2210endif
2211
Max Reitza484a712020-10-27 20:05:41 +01002212fuse = dependency('fuse3', required: get_option('fuse'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002213 version: '>=3.1', method: 'pkg-config')
Max Reitza484a712020-10-27 20:05:41 +01002214
Max Reitzdf4ea702020-10-27 20:05:46 +01002215fuse_lseek = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002216if get_option('fuse_lseek').allowed()
Max Reitzdf4ea702020-10-27 20:05:46 +01002217 if fuse.version().version_compare('>=3.8')
2218 # Dummy dependency
2219 fuse_lseek = declare_dependency()
2220 elif get_option('fuse_lseek').enabled()
2221 if fuse.found()
2222 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
2223 else
2224 error('fuse-lseek requires libfuse, which was not found')
2225 endif
2226 endif
2227endif
2228
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002229have_libvduse = (host_os == 'linux')
Xie Yongjia6caeee2022-05-23 16:46:08 +08002230if get_option('libvduse').enabled()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002231 if host_os != 'linux'
Xie Yongjia6caeee2022-05-23 16:46:08 +08002232 error('libvduse requires linux')
2233 endif
2234elif get_option('libvduse').disabled()
2235 have_libvduse = false
2236endif
2237
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002238have_vduse_blk_export = (have_libvduse and host_os == 'linux')
Xie Yongji2a2359b2022-05-23 16:46:09 +08002239if get_option('vduse_blk_export').enabled()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002240 if host_os != 'linux'
Xie Yongji2a2359b2022-05-23 16:46:09 +08002241 error('vduse_blk_export requires linux')
2242 elif not have_libvduse
2243 error('vduse_blk_export requires libvduse support')
2244 endif
2245elif get_option('vduse_blk_export').disabled()
2246 have_vduse_blk_export = false
2247endif
2248
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002249# libbpf
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002250bpf_version = '1.1.0'
2251libbpf = dependency('libbpf', version: '>=' + bpf_version, required: get_option('bpf'), method: 'pkg-config')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002252if libbpf.found() and not cc.links('''
2253 #include <bpf/libbpf.h>
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002254 #include <linux/bpf.h>
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002255 int main(void)
2256 {
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002257 // check flag availability
2258 int flag = BPF_F_MMAPABLE;
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002259 bpf_object__destroy_skeleton(NULL);
2260 return 0;
2261 }''', dependencies: libbpf)
2262 libbpf = not_found
2263 if get_option('bpf').enabled()
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002264 error('libbpf skeleton/mmaping test failed')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002265 else
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002266 warning('libbpf skeleton/mmaping test failed, disabling')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002267 endif
2268endif
2269
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002270# libxdp
2271libxdp = not_found
2272if not get_option('af_xdp').auto() or have_system
Daniel P. Berrangé1f372802024-10-23 09:50:56 +01002273 if libbpf.found()
2274 libxdp = dependency('libxdp', required: get_option('af_xdp'),
2275 version: '>=1.4.0', method: 'pkg-config')
2276 else
2277 if get_option('af_xdp').enabled()
2278 error('libxdp requested, but libbpf is not available')
2279 endif
2280 endif
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002281endif
2282
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002283# libdw
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002284libdw = not_found
Ilya Leoshkevich550c6d92023-02-10 01:52:08 +01002285if not get_option('libdw').auto() or \
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02002286 (not get_option('prefer_static') and (have_system or have_user))
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002287 libdw = dependency('libdw',
2288 method: 'pkg-config',
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002289 required: get_option('libdw'))
2290endif
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002291
Paolo Bonzini87430d52021-10-07 15:06:09 +02002292#################
2293# config-host.h #
2294#################
2295
Paolo Bonzini95933f12023-09-08 12:10:08 +02002296config_host_data = configuration_data()
2297
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03002298config_host_data.set('CONFIG_HAVE_RUST', have_rust)
Paolo Bonzini87430d52021-10-07 15:06:09 +02002299audio_drivers_selected = []
2300if have_system
2301 audio_drivers_available = {
2302 'alsa': alsa.found(),
2303 'coreaudio': coreaudio.found(),
2304 'dsound': dsound.found(),
2305 'jack': jack.found(),
2306 'oss': oss.found(),
2307 'pa': pulse.found(),
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02002308 'pipewire': pipewire.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002309 'sdl': sdl.found(),
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002310 'sndio': sndio.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002311 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02002312 foreach k, v: audio_drivers_available
2313 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
2314 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02002315
2316 # Default to native drivers first, OSS second, SDL third
2317 audio_drivers_priority = \
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002318 [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002319 (host_os == 'linux' ? [] : [ 'sdl' ])
Paolo Bonzini87430d52021-10-07 15:06:09 +02002320 audio_drivers_default = []
2321 foreach k: audio_drivers_priority
2322 if audio_drivers_available[k]
2323 audio_drivers_default += k
2324 endif
2325 endforeach
2326
2327 foreach k: get_option('audio_drv_list')
2328 if k == 'default'
2329 audio_drivers_selected += audio_drivers_default
2330 elif not audio_drivers_available[k]
2331 error('Audio driver "@0@" not available.'.format(k))
2332 else
2333 audio_drivers_selected += k
2334 endif
2335 endforeach
2336endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02002337config_host_data.set('CONFIG_AUDIO_DRIVERS',
2338 '"' + '", "'.join(audio_drivers_selected) + '", ')
2339
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002340have_host_block_device = (host_os != 'darwin' or
Joelle van Dyne14176c82021-03-15 11:03:38 -07002341 cc.has_header('IOKit/storage/IOMedia.h'))
2342
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002343dbus_display = get_option('dbus_display') \
2344 .require(gio.version().version_compare('>=2.64'),
2345 error_message: '-display dbus requires glib>=2.64') \
Paolo Bonzini75440602022-04-20 17:33:44 +02002346 .require(gdbus_codegen.found(),
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02002347 error_message: gdbus_codegen_error.format('-display dbus')) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002348 .allowed()
Marc-André Lureau142ca622021-07-15 11:53:53 +04002349
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002350have_virtfs = get_option('virtfs') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002351 .require(host_os == 'linux' or host_os == 'darwin',
Keno Fischer0fb1e192022-02-27 17:35:22 -05002352 error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002353 .require(host_os == 'linux' or cc.has_function('pthread_fchdir_np'),
Keno Fischer0fb1e192022-02-27 17:35:22 -05002354 error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002355 .require(host_os == 'darwin' or libattr.found(),
Peter Foley1a67e072023-05-03 09:07:56 -04002356 error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002357 .disable_auto_if(not have_tools and not have_system) \
2358 .allowed()
Paolo Bonzini69202b42020-11-17 14:46:21 +01002359
Daniel P. Berrangé4bb3da42024-07-12 14:24:44 +01002360qga_fsfreeze = false
2361qga_fstrim = false
2362if host_os == 'linux'
2363 if cc.has_header_symbol('linux/fs.h', 'FIFREEZE')
2364 qga_fsfreeze = true
2365 endif
2366 if cc.has_header_symbol('linux/fs.h', 'FITRIM')
2367 qga_fstrim = true
2368 endif
2369elif host_os == 'freebsd' and cc.has_header_symbol('ufs/ffs/fs.h', 'UFSSUSPEND')
2370 qga_fsfreeze = true
2371endif
2372
Paolo Bonzini622d64f2022-04-20 17:33:53 +02002373if get_option('block_drv_ro_whitelist') == ''
2374 config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
2375else
2376 config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
2377 '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
2378endif
2379if get_option('block_drv_rw_whitelist') == ''
2380 config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
2381else
2382 config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
2383 '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
2384endif
2385
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002386foreach k : get_option('trace_backends')
2387 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
2388endforeach
2389config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02002390config_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
Paolo Bonzini40c909f2022-04-20 17:33:49 +02002391if iasl.found()
2392 config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
Paolo Bonzini5dc46182021-10-13 13:19:00 +02002393endif
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002394config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
2395config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
2396config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
2397config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
2398config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09002399
2400qemu_firmwarepath = ''
2401foreach k : get_option('qemu_firmwarepath')
2402 qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
2403endforeach
2404config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
2405
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002406config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
2407config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
2408config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
2409config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
2410config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
2411config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
2412
Paolo Bonzini60027112022-10-20 14:53:10 +02002413if enable_modules
Paolo Bonzinib0b43232022-04-20 17:33:54 +02002414 config_host_data.set('CONFIG_STAMP', run_command(
2415 meson.current_source_dir() / 'scripts/qemu-stamp.py',
2416 meson.project_version(), get_option('pkgversion'), '--',
2417 meson.current_source_dir() / 'configure',
2418 capture: true, check: true).stdout().strip())
2419endif
2420
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002421have_slirp_smbd = get_option('slirp_smbd') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002422 .require(host_os != 'windows', error_message: 'Host smbd not supported on this platform.') \
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002423 .allowed()
2424if have_slirp_smbd
2425 smbd_path = get_option('smbd')
2426 if smbd_path == ''
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002427 smbd_path = (host_os == 'sunos' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002428 endif
2429 config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
2430endif
2431
Paolo Bonzini823eb012021-11-08 14:18:17 +01002432config_host_data.set('HOST_' + host_arch.to_upper(), 1)
2433
Paolo Bonzini95933f12023-09-08 12:10:08 +02002434kvm_targets_c = '""'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002435if get_option('kvm').allowed() and host_os == 'linux'
Paolo Bonzini95933f12023-09-08 12:10:08 +02002436 kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
2437endif
2438config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
2439
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02002440if get_option('module_upgrades') and not enable_modules
2441 error('Cannot enable module-upgrades as modules are not enabled')
2442endif
2443config_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
2444
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002445config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002446config_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002447config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002448config_host_data.set('CONFIG_BSD', host_os in bsd_oses)
Daniel P. Berrangé4be55a42024-07-12 14:24:54 +01002449config_host_data.set('CONFIG_FREEBSD', host_os == 'freebsd')
Paolo Bonzinia775c712023-09-08 12:09:22 +02002450config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04002451config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002452config_host_data.set('CONFIG_DARWIN', host_os == 'darwin')
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01002453config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini537b7242021-10-07 15:08:12 +02002454config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02002455config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002456config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002457config_host_data.set('CONFIG_LINUX', host_os == 'linux')
2458config_host_data.set('CONFIG_POSIX', host_os != 'windows')
2459config_host_data.set('CONFIG_WIN32', host_os == 'windows')
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002460config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002461config_host_data.set('CONFIG_MPATH', mpathpersist.found())
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04002462config_host_data.set('CONFIG_BLKIO', blkio.found())
Stefano Garzarella98b126f2023-05-30 09:19:41 +02002463if blkio.found()
2464 config_host_data.set('CONFIG_BLKIO_VHOST_VDPA_FD',
2465 blkio.version().version_compare('>=1.3.0'))
Stefano Garzarella547c4e52024-08-08 10:05:45 +02002466 config_host_data.set('CONFIG_BLKIO_WRITE_ZEROS_FUA',
2467 blkio.version().version_compare('>=1.4.0'))
Stefano Garzarella98b126f2023-05-30 09:19:41 +02002468endif
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002469config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08002470config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02002471config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini75440602022-04-20 17:33:44 +02002472config_host_data.set('CONFIG_GIO', gio.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002473config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
2474if glusterfs.found()
2475 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
2476 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
2477 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
2478 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
2479 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
2480 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
2481endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002482config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02002483config_host_data.set('CONFIG_VTE', vte.found())
Claudio Fontana29e0bff2022-11-21 14:55:38 +01002484config_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard)
Taylor Simpson63efb6a2023-04-27 15:59:52 -07002485config_host_data.set('CONFIG_HEXAGON_IDEF_PARSER', get_option('hexagon_idef_parser'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002486config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002487config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002488config_host_data.set('CONFIG_EBPF', libbpf.found())
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002489config_host_data.set('CONFIG_AF_XDP', libxdp.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002490config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002491config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01002492config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Thomas Huthe6a52b32021-12-09 15:48:01 +01002493config_host_data.set('CONFIG_LIBSSH', libssh.found())
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02002494config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002495config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
2496config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzini60027112022-10-20 14:53:10 +02002497config_host_data.set('CONFIG_MODULES', enable_modules)
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002498config_host_data.set('CONFIG_NUMA', numa.found())
Michal Privoznik6bb613f2022-12-15 10:55:03 +01002499if numa.found()
2500 config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY',
2501 cc.has_function('numa_has_preferred_many',
2502 dependencies: numa))
2503endif
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002504config_host_data.set('CONFIG_OPENGL', opengl.found())
Paolo Bonzini2c13c572023-08-30 12:20:53 +02002505config_host_data.set('CONFIG_PLUGIN', get_option('plugins'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002506config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini3730a732022-04-20 17:33:41 +02002507config_host_data.set('CONFIG_RDMA', rdma.found())
Paolo Bonzini655e2a72023-10-05 14:19:34 +02002508config_host_data.set('CONFIG_RELOCATABLE', get_option('relocatable'))
Paolo Bonzini721fa5e2022-10-12 11:59:51 +02002509config_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002510config_host_data.set('CONFIG_SDL', sdl.found())
2511config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01002512config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Michal Privoznik73422d92022-10-26 09:30:24 +02002513if seccomp.found()
2514 config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
2515endif
Marc-André Lureaucca15752023-08-30 13:38:25 +04002516config_host_data.set('CONFIG_PIXMAN', pixman.found())
Paolo Bonzinia775c712023-09-08 12:09:22 +02002517config_host_data.set('CONFIG_SLIRP', slirp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01002518config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002519config_host_data.set('CONFIG_SOLARIS', host_os == 'sunos')
Paolo Bonzini875be2872022-02-15 11:37:00 +01002520if get_option('tcg').allowed()
2521 config_host_data.set('CONFIG_TCG', 1)
2522 config_host_data.set('CONFIG_TCG_INTERPRETER', tcg_arch == 'tci')
2523endif
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002524config_host_data.set('CONFIG_TPM', have_tpm)
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002525config_host_data.set('CONFIG_TSAN', get_option('tsan'))
Paolo Bonzini90540f32021-06-03 11:15:26 +02002526config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Paolo Bonzinie1723992021-10-07 15:08:21 +02002527config_host_data.set('CONFIG_VDE', vde.found())
Stefan Hajnoczic0c4f142023-10-03 21:45:32 -04002528config_host_data.set('CONFIG_VHOST', have_vhost)
Paolo Bonzini2df89d52022-04-20 17:34:07 +02002529config_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
2530config_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
2531config_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
2532config_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
2533config_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
2534config_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
2535config_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03002536config_host_data.set('CONFIG_VMNET', vmnet.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002537config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Xie Yongji2a2359b2022-05-23 16:46:09 +08002538config_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
Kshitij Suri95f85102022-04-08 07:13:34 +00002539config_host_data.set('CONFIG_PNG', png.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002540config_host_data.set('CONFIG_VNC', vnc.found())
2541config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002542config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini95933f12023-09-08 12:10:08 +02002543if virgl.found()
Dmitry Osipenkoffac9642024-10-25 00:03:04 +03002544 config_host_data.set('VIRGL_VERSION_MAJOR', virgl.version().split('.')[0])
Paolo Bonzini95933f12023-09-08 12:10:08 +02002545endif
Paolo Bonzini69202b42020-11-17 14:46:21 +01002546config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002547config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002548config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04002549config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04002550config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02002551config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01002552config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Daniel P. Berrangéd47b83b2022-04-26 17:00:43 +01002553config_host_data.set('CONFIG_TASN1', tasn1.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002554config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
2555config_host_data.set('CONFIG_NETTLE', nettle.found())
Hyman Huang52ed9f42023-12-07 23:47:35 +08002556config_host_data.set('CONFIG_CRYPTO_SM4', crypto_sm4.found())
liequan ched078da82024-10-30 08:51:46 +00002557config_host_data.set('CONFIG_CRYPTO_SM3', crypto_sm3.found())
Lei He4c5e5122022-05-25 17:01:14 +08002558config_host_data.set('CONFIG_HOGWEED', hogweed.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002559config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002560config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01002561config_host_data.set('CONFIG_STATX', has_statx)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002562config_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id)
Paolo Bonzinib1def332020-11-17 13:37:39 +01002563config_host_data.set('CONFIG_ZSTD', zstd.found())
Yuan Liub844a2c2024-06-10 18:21:06 +08002564config_host_data.set('CONFIG_QPL', qpl.found())
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01002565config_host_data.set('CONFIG_UADK', uadk.found())
Bryan Zhange28ed312024-08-30 16:27:19 -07002566config_host_data.set('CONFIG_QATZIP', qatzip.found())
Max Reitza484a712020-10-27 20:05:41 +01002567config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01002568config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002569config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
Marc-André Lureauddece462021-10-06 14:18:09 +04002570if spice_protocol.found()
2571config_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
2572config_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
2573config_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
2574endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002575config_host_data.set('CONFIG_SPICE', spice.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01002576config_host_data.set('CONFIG_X11', x11.found())
Marc-André Lureau142ca622021-07-15 11:53:53 +04002577config_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
Daniele Buono9e62ba42020-12-04 18:06:14 -05002578config_host_data.set('CONFIG_CFI', get_option('cfi'))
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002579config_host_data.set('CONFIG_SELINUX', selinux.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002580config_host_data.set('CONFIG_XEN_BACKEND', xen.found())
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002581config_host_data.set('CONFIG_LIBDW', libdw.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002582if xen.found()
2583 # protect from xen.version() having less than three components
2584 xen_version = xen.version().split('.') + ['0', '0']
2585 xen_ctrl_version = xen_version[0] + \
2586 ('0' + xen_version[1]).substring(-2) + \
2587 ('0' + xen_version[2]).substring(-2)
2588 config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
2589endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002590config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
2591config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
2592config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
2593config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
2594
Paolo Bonzinia6305082021-10-07 15:08:15 +02002595config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002596config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
2597
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002598have_coroutine_pool = get_option('coroutine_pool')
2599if get_option('debug_stack_usage') and have_coroutine_pool
2600 message('Disabling coroutine pool to measure stack usage')
2601 have_coroutine_pool = false
2602endif
Paolo Bonzini230f6e02023-10-05 14:31:27 +02002603config_host_data.set('CONFIG_COROUTINE_POOL', have_coroutine_pool)
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04002604config_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002605config_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002606config_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
Paolo Bonzini1d558c92023-08-28 11:48:30 +02002607config_host_data.set('CONFIG_DEBUG_TCG', get_option('debug_tcg'))
Ilya Leoshkevich1f2355f2024-03-12 01:23:30 +01002608config_host_data.set('CONFIG_DEBUG_REMAP', get_option('debug_remap'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002609config_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
Juan Quintelaabad1852022-09-02 18:51:25 +02002610config_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
Daniel P. Berrangé4bb3da42024-07-12 14:24:44 +01002611config_host_data.set('CONFIG_FSFREEZE', qga_fsfreeze)
2612config_host_data.set('CONFIG_FSTRIM', qga_fstrim)
Paolo Bonzini406523f2021-10-13 11:43:54 +02002613
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002614# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002615config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002616config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
2617config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
Thomas Huth48f670e2020-11-18 18:10:52 +01002618config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01002619config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Michael Vogt97299302024-10-01 17:14:54 +02002620config_host_data.set('HAVE_OPENAT2_H', cc.has_header('linux/openat2.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01002621config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002622config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01002623config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01002624config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002625if host_os == 'windows'
Bin Mengd4093732022-08-02 15:51:58 +08002626 config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
2627endif
Thomas Huthded5d782020-11-14 11:10:11 +01002628
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002629# has_function
Claudio Imbrendac891c242022-08-12 15:34:53 +02002630config_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002631config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002632config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
2633config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
2634config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
2635config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Paolo Bonzini67504852023-06-21 00:47:31 +02002636config_host_data.set('CONFIG_GETCPU', cc.has_function('getcpu', prefix: gnu_source_prefix))
2637config_host_data.set('CONFIG_SCHED_GETCPU', cc.has_function('sched_getcpu', prefix: '#include <sched.h>'))
Peter Maydell86983432022-02-26 18:07:19 +00002638# Note that we need to specify prefix: here to avoid incorrectly
2639# thinking that Windows has posix_memalign()
2640config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
Peter Maydell5c8c7142022-02-26 18:07:20 +00002641config_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
Peter Maydell88454f82022-02-26 18:07:21 +00002642config_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
2643config_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002644config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002645config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Keno Fischer029ed1b2022-02-27 17:35:20 -05002646config_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002647config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
2648config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
2649config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
2650config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
2651config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Daniel P. Berrangé5288d9d2024-12-02 12:19:27 +00002652config_host_data.set('CONFIG_GETLOADAVG', cc.has_function('getloadavg'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002653config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Andrew Deason59e35c72022-04-26 14:55:22 -05002654config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02002655config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03002656config_host_data.set('HAVE_GLIB_WITH_ALIGNED_ALLOC', glib_has_aligned_alloc)
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002657config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002658config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002659config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Stefano Garzarella66dc5f92022-05-17 09:10:12 +02002660if rbd.found()
2661 config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
2662 cc.has_function('rbd_namespace_exists',
2663 dependencies: rbd,
2664 prefix: '#include <rbd/librbd.h>'))
2665endif
Li Zhijian911965a2021-09-10 15:02:55 +08002666if rdma.found()
2667 config_host_data.set('HAVE_IBV_ADVISE_MR',
2668 cc.has_function('ibv_advise_mr',
Paolo Bonzini3730a732022-04-20 17:33:41 +02002669 dependencies: rdma,
Li Zhijian911965a2021-09-10 15:02:55 +08002670 prefix: '#include <infiniband/verbs.h>'))
2671endif
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002672
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002673have_asan_fiber = false
Richard Hendersoncb771ac2024-08-13 19:52:15 +10002674if get_option('asan') and \
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002675 not cc.has_function('__sanitizer_start_switch_fiber',
2676 args: '-fsanitize=address',
2677 prefix: '#include <sanitizer/asan_interface.h>')
2678 warning('Missing ASAN due to missing fiber annotation interface')
2679 warning('Without code annotation, the report may be inferior.')
2680else
2681 have_asan_fiber = true
2682endif
2683config_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber)
2684
Ilya Leoshkevicha1a98002024-02-06 01:22:03 +01002685have_inotify_init = cc.has_header_symbol('sys/inotify.h', 'inotify_init')
2686have_inotify_init1 = cc.has_header_symbol('sys/inotify.h', 'inotify_init1')
2687inotify = not_found
2688if (have_inotify_init or have_inotify_init1) and host_os == 'freebsd'
2689 # libinotify-kqueue
2690 inotify = cc.find_library('inotify')
2691 if have_inotify_init
2692 have_inotify_init = inotify.found()
2693 endif
2694 if have_inotify_init1
2695 have_inotify_init1 = inotify.found()
2696 endif
2697endif
2698config_host_data.set('CONFIG_INOTIFY', have_inotify_init)
2699config_host_data.set('CONFIG_INOTIFY1', have_inotify_init1)
2700
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002701# has_header_symbol
Sam Li6d43eaa2023-05-08 12:55:28 +08002702config_host_data.set('CONFIG_BLKZONED',
2703 cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002704config_host_data.set('CONFIG_EPOLL_CREATE1',
2705 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
2706config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
2707 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
2708 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
2709config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
2710 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
2711config_host_data.set('CONFIG_FIEMAP',
2712 cc.has_header('linux/fiemap.h') and
2713 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002714config_host_data.set('CONFIG_GETRANDOM',
2715 cc.has_function('getrandom') and
2716 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002717config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
2718 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002719config_host_data.set('CONFIG_RTNETLINK',
2720 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
2721config_host_data.set('CONFIG_SYSMACROS',
2722 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002723config_host_data.set('HAVE_OPTRESET',
2724 cc.has_header_symbol('getopt.h', 'optreset'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04002725config_host_data.set('HAVE_IPPROTO_MPTCP',
2726 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002727
2728# has_member
2729config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
2730 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
2731 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002732config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
2733 cc.has_member('struct stat', 'st_atim',
2734 prefix: '#include <sys/stat.h>'))
Sam Li6d43eaa2023-05-08 12:55:28 +08002735config_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY',
2736 cc.has_member('struct blk_zone', 'capacity',
2737 prefix: '#include <linux/blkzoned.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002738
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002739# has_type
2740config_host_data.set('CONFIG_IOVEC',
2741 cc.has_type('struct iovec',
2742 prefix: '#include <sys/uio.h>'))
2743config_host_data.set('HAVE_UTMPX',
2744 cc.has_type('struct utmpx',
2745 prefix: '#include <utmpx.h>'))
2746
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002747config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002748 #include <sys/eventfd.h>
2749 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002750config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002751 #include <unistd.h>
2752 int main(void) {
2753 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2754 return fdatasync(0);
2755 #else
2756 #error Not supported
2757 #endif
2758 }'''))
Andrew Deason8900c202022-03-15 22:52:25 -05002759
2760has_madvise = cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002761 #include <sys/types.h>
2762 #include <sys/mman.h>
2763 #include <stddef.h>
Andrew Deason8900c202022-03-15 22:52:25 -05002764 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
2765missing_madvise_proto = false
2766if has_madvise
2767 # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
2768 # but forget to prototype it. In this case, has_madvise will be true (the
2769 # test program links despite a compile warning). To detect the
2770 # missing-prototype case, we try again with a definitely-bogus prototype.
2771 # This will only compile if the system headers don't provide the prototype;
2772 # otherwise the conflicting prototypes will cause a compiler error.
2773 missing_madvise_proto = cc.links(gnu_source_prefix + '''
2774 #include <sys/types.h>
2775 #include <sys/mman.h>
2776 #include <stddef.h>
2777 extern int madvise(int);
2778 int main(void) { return madvise(0); }''')
2779endif
2780config_host_data.set('CONFIG_MADVISE', has_madvise)
2781config_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
2782
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002783config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002784 #include <sys/mman.h>
2785 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002786config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002787 #include <fcntl.h>
2788 #if !defined(AT_EMPTY_PATH)
2789 # error missing definition
2790 #else
2791 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2792 #endif'''))
Michal Privoznik12d7d0c2024-06-05 12:44:54 +02002793
2794# On Darwin posix_madvise() has the same return semantics as plain madvise(),
2795# i.e. errno is set and -1 is returned. That's not really how POSIX defines the
2796# function. On the flip side, it has madvise() which is preferred anyways.
2797if host_os != 'darwin'
2798 config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
2799 #include <sys/mman.h>
2800 #include <stddef.h>
2801 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
2802endif
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002803
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002804config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002805 #include <pthread.h>
2806
2807 static void *f(void *p) { return NULL; }
2808 int main(void)
2809 {
2810 pthread_t thread;
2811 pthread_create(&thread, 0, f, 0);
2812 pthread_setname_np(thread, "QEMU");
2813 return 0;
2814 }''', dependencies: threads))
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002815config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002816 #include <pthread.h>
2817
2818 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
2819 int main(void)
2820 {
2821 pthread_t thread;
2822 pthread_create(&thread, 0, f, 0);
2823 return 0;
2824 }''', dependencies: threads))
Brad Smith3ada67a2022-12-18 03:22:04 -05002825config_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + '''
2826 #include <pthread.h>
2827 #include <pthread_np.h>
2828
2829 static void *f(void *p) { return NULL; }
2830 int main(void)
2831 {
2832 pthread_t thread;
2833 pthread_create(&thread, 0, f, 0);
2834 pthread_set_name_np(thread, "QEMU");
2835 return 0;
2836 }''', dependencies: threads))
Longpeng(Mike)657ac982022-02-22 17:05:05 +08002837config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
2838 #include <pthread.h>
2839 #include <time.h>
2840
2841 int main(void)
2842 {
2843 pthread_condattr_t attr
2844 pthread_condattr_init(&attr);
2845 pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2846 return 0;
2847 }''', dependencies: threads))
David Hildenbrand7730f322022-10-14 15:47:15 +02002848config_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + '''
2849 #include <pthread.h>
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002850
David Hildenbrand7730f322022-10-14 15:47:15 +02002851 static void *f(void *p) { return NULL; }
2852 int main(void)
2853 {
2854 int setsize = CPU_ALLOC_SIZE(64);
2855 pthread_t thread;
2856 cpu_set_t *cpuset;
2857 pthread_create(&thread, 0, f, 0);
2858 cpuset = CPU_ALLOC(64);
2859 CPU_ZERO_S(setsize, cpuset);
2860 pthread_setaffinity_np(thread, setsize, cpuset);
2861 pthread_getaffinity_np(thread, setsize, cpuset);
2862 CPU_FREE(cpuset);
2863 return 0;
2864 }''', dependencies: threads))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002865config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02002866 #include <sys/signalfd.h>
2867 #include <stddef.h>
2868 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002869config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002870 #include <unistd.h>
2871 #include <fcntl.h>
2872 #include <limits.h>
2873
2874 int main(void)
2875 {
2876 int len, fd = 0;
2877 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2878 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2879 return 0;
2880 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002881
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002882config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
2883 #include <sys/mman.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002884 int main(void) {
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002885 return mlockall(MCL_FUTURE);
2886 }'''))
2887
Thomas Hutheea94532021-10-28 20:59:08 +02002888have_l2tpv3 = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002889if get_option('l2tpv3').allowed() and have_system
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002890 have_l2tpv3 = cc.has_type('struct mmsghdr',
2891 prefix: gnu_source_prefix + '''
2892 #include <sys/socket.h>
2893 #include <linux/ip.h>''')
Thomas Hutheea94532021-10-28 20:59:08 +02002894endif
2895config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2896
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002897have_netmap = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002898if get_option('netmap').allowed() and have_system
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002899 have_netmap = cc.compiles('''
2900 #include <inttypes.h>
2901 #include <net/if.h>
2902 #include <net/netmap.h>
2903 #include <net/netmap_user.h>
2904 #if (NETMAP_API < 11) || (NETMAP_API > 15)
2905 #error
2906 #endif
2907 int main(void) { return 0; }''')
2908 if not have_netmap and get_option('netmap').enabled()
2909 error('Netmap headers not available')
2910 endif
2911endif
2912config_host_data.set('CONFIG_NETMAP', have_netmap)
2913
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002914# Work around a system header bug with some kernel/XFS header
2915# versions where they both try to define 'struct fsxattr':
2916# xfs headers will not try to redefine structs from linux headers
2917# if this macro is set.
2918config_host_data.set('HAVE_FSXATTR', cc.links('''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002919 #include <linux/fs.h>
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002920 struct fsxattr foo;
2921 int main(void) {
2922 return 0;
2923 }'''))
2924
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002925# Some versions of Mac OS X incorrectly define SIZE_MAX
2926config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2927 #include <stdint.h>
2928 #include <stdio.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002929 int main(void) {
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002930 return printf("%zu", SIZE_MAX);
2931 }''', args: ['-Werror']))
2932
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002933# See if 64-bit atomic operations are supported.
2934# Note that without __atomic builtins, we can only
2935# assume atomic loads/stores max at pointer size.
2936config_host_data.set('CONFIG_ATOMIC64', cc.links('''
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002937 #include <stdint.h>
2938 int main(void)
2939 {
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002940 uint64_t x = 0, y = 0;
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002941 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
2942 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
2943 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2944 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2945 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2946 return 0;
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02002947 }''', args: qemu_isa_flags))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002948
Richard Henderson6479dd72023-05-24 08:14:41 -07002949has_int128_type = cc.compiles('''
2950 __int128_t a;
2951 __uint128_t b;
2952 int main(void) { b = a; }''')
2953config_host_data.set('CONFIG_INT128_TYPE', has_int128_type)
2954
2955has_int128 = has_int128_type and cc.links('''
Marc-André Lureau848126d2022-02-28 15:49:19 +04002956 __int128_t a;
2957 __uint128_t b;
2958 int main (void) {
2959 a = a + b;
2960 b = a * b;
2961 a = a * a;
2962 return 0;
2963 }''')
Marc-André Lureau848126d2022-02-28 15:49:19 +04002964config_host_data.set('CONFIG_INT128', has_int128)
2965
Richard Henderson6479dd72023-05-24 08:14:41 -07002966if has_int128_type
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002967 # "do we have 128-bit atomics which are handled inline and specifically not
2968 # via libatomic". The reason we can't use libatomic is documented in the
2969 # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002970 # We only care about these operations on 16-byte aligned pointers, so
2971 # force 16-byte alignment of the pointer, which may be greater than
2972 # __alignof(unsigned __int128) for the host.
2973 atomic_test_128 = '''
2974 int main(int ac, char **av) {
Richard Henderson6479dd72023-05-24 08:14:41 -07002975 __uint128_t *p = __builtin_assume_aligned(av[ac - 1], 16);
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002976 p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED);
2977 __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED);
2978 __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2979 return 0;
2980 }'''
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02002981 has_atomic128 = cc.links(atomic_test_128, args: qemu_isa_flags)
Marc-André Lureau848126d2022-02-28 15:49:19 +04002982
2983 config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
2984
2985 if not has_atomic128
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002986 # Even with __builtin_assume_aligned, the above test may have failed
2987 # without optimization enabled. Try again with optimizations locally
2988 # enabled for the function. See
2989 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02002990 has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128,
2991 args: qemu_isa_flags)
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002992 config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt)
Marc-André Lureau848126d2022-02-28 15:49:19 +04002993
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002994 if not has_atomic128_opt
2995 config_host_data.set('CONFIG_CMPXCHG128', cc.links('''
2996 int main(void)
2997 {
Richard Henderson6479dd72023-05-24 08:14:41 -07002998 __uint128_t x = 0, y = 0;
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002999 __sync_val_compare_and_swap_16(&x, y, x);
3000 return 0;
3001 }
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02003002 ''', args: qemu_isa_flags))
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003003 endif
Marc-André Lureau848126d2022-02-28 15:49:19 +04003004 endif
3005endif
Paolo Bonzinibd87a362021-10-07 15:08:25 +02003006
3007config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
3008 #include <sys/auxv.h>
3009 int main(void) {
3010 return getauxval(AT_HWCAP) == 0;
3011 }'''))
3012
Brad Smith27fca0a2024-07-27 23:58:55 -04003013config_host_data.set('CONFIG_ELF_AUX_INFO', cc.links(gnu_source_prefix + '''
3014 #include <sys/auxv.h>
3015 int main(void) {
3016 unsigned long hwcap = 0;
3017 elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
3018 return hwcap;
3019 }'''))
3020
Paolo Bonzini0dae95d2022-04-20 17:33:43 +02003021config_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
3022 #include <linux/usbdevice_fs.h>
3023
3024 #ifndef USBDEVFS_GET_CAPABILITIES
3025 #error "USBDEVFS_GET_CAPABILITIES undefined"
3026 #endif
3027
3028 #ifndef USBDEVFS_DISCONNECT_CLAIM
3029 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
3030 #endif
3031
3032 int main(void) { return 0; }'''))
3033
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02003034have_keyring = get_option('keyring') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003035 .require(host_os == 'linux', error_message: 'keyring is only available on Linux') \
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02003036 .require(cc.compiles('''
3037 #include <errno.h>
3038 #include <asm/unistd.h>
3039 #include <linux/keyctl.h>
3040 #include <sys/syscall.h>
3041 #include <unistd.h>
3042 int main(void) {
3043 return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
3044 }'''), error_message: 'keyctl syscall not available on this system').allowed()
3045config_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
3046
Paolo Bonzini622753d2021-11-08 13:38:58 +01003047have_cpuid_h = cc.links('''
3048 #include <cpuid.h>
3049 int main(void) {
3050 unsigned a, b, c, d;
3051 unsigned max = __get_cpuid_max(0, 0);
3052
3053 if (max >= 1) {
3054 __cpuid(1, a, b, c, d);
3055 }
3056
3057 if (max >= 7) {
3058 __cpuid_count(7, 0, a, b, c, d);
3059 }
3060
3061 return 0;
3062 }''')
3063config_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
3064
Richard Hendersone5717302024-06-27 17:36:43 +00003065# Don't bother to advertise asm/hwprobe.h for old versions that do
3066# not contain RISCV_HWPROBE_EXT_ZBA.
3067config_host_data.set('CONFIG_ASM_HWPROBE_H',
3068 cc.has_header_symbol('asm/hwprobe.h',
3069 'RISCV_HWPROBE_EXT_ZBA'))
3070
Paolo Bonzini622753d2021-11-08 13:38:58 +01003071config_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
3072 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
3073 .require(cc.links('''
Paolo Bonzini622753d2021-11-08 13:38:58 +01003074 #include <cpuid.h>
3075 #include <immintrin.h>
Richard Henderson701ea582022-12-03 19:31:12 -06003076 static int __attribute__((target("avx2"))) bar(void *a) {
Paolo Bonzini622753d2021-11-08 13:38:58 +01003077 __m256i x = *(__m256i *)a;
3078 return _mm256_testz_si256(x, x);
3079 }
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01003080 int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
Paolo Bonzini622753d2021-11-08 13:38:58 +01003081 '''), error_message: 'AVX2 not available').allowed())
3082
ling xu04ffce12022-11-16 23:29:22 +08003083config_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \
3084 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \
3085 .require(cc.links('''
ling xu04ffce12022-11-16 23:29:22 +08003086 #include <cpuid.h>
3087 #include <immintrin.h>
Richard Hendersondc165fc2023-05-01 22:05:55 +01003088 static int __attribute__((target("avx512bw"))) bar(void *a) {
ling xu04ffce12022-11-16 23:29:22 +08003089 __m512i *x = a;
3090 __m512i res= _mm512_abs_epi8(*x);
3091 return res[1];
3092 }
3093 int main(int argc, char *argv[]) { return bar(argv[0]); }
3094 '''), error_message: 'AVX512BW not available').allowed())
3095
Richard Henderson8d97f282023-06-02 07:43:40 +00003096# For both AArch64 and AArch32, detect if builtins are available.
3097config_host_data.set('CONFIG_ARM_AES_BUILTIN', cc.compiles('''
3098 #include <arm_neon.h>
3099 #ifndef __ARM_FEATURE_AES
3100 __attribute__((target("+crypto")))
3101 #endif
3102 void foo(uint8x16_t *p) { *p = vaesmcq_u8(*p); }
3103 '''))
3104
Paolo Bonzinib87df902021-11-08 13:52:11 +01003105if get_option('membarrier').disabled()
3106 have_membarrier = false
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003107elif host_os == 'windows'
Paolo Bonzinib87df902021-11-08 13:52:11 +01003108 have_membarrier = true
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003109elif host_os == 'linux'
Paolo Bonzinib87df902021-11-08 13:52:11 +01003110 have_membarrier = cc.compiles('''
3111 #include <linux/membarrier.h>
3112 #include <sys/syscall.h>
3113 #include <unistd.h>
3114 #include <stdlib.h>
3115 int main(void) {
3116 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
3117 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
3118 exit(0);
3119 }''')
3120endif
3121config_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
3122 .require(have_membarrier, error_message: 'membarrier system call not available') \
3123 .allowed())
3124
Paolo Bonzini34b52612021-11-08 14:02:42 +01003125have_afalg = get_option('crypto_afalg') \
3126 .require(cc.compiles(gnu_source_prefix + '''
3127 #include <errno.h>
3128 #include <sys/types.h>
3129 #include <sys/socket.h>
3130 #include <linux/if_alg.h>
3131 int main(void) {
3132 int sock;
3133 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
3134 return sock;
3135 }
3136 '''), error_message: 'AF_ALG requested but could not be detected').allowed()
3137config_host_data.set('CONFIG_AF_ALG', have_afalg)
3138
Marc-André Lureau9d734b82022-04-01 15:50:05 +04003139config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
3140 'linux/vm_sockets.h', 'AF_VSOCK',
3141 prefix: '#include <sys/socket.h>',
3142))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02003143
Marc-André Lureau8821a382022-02-01 16:53:43 +04003144have_vss = false
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003145have_vss_sdk = false # old xp/2003 SDK
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003146if host_os == 'windows' and 'cpp' in all_languages
Marc-André Lureau8821a382022-02-01 16:53:43 +04003147 have_vss = cxx.compiles('''
3148 #define __MIDL_user_allocate_free_DEFINED__
Marc-André Lureau32478cb2022-02-22 23:40:01 +04003149 #include <vss.h>
Marc-André Lureau8821a382022-02-01 16:53:43 +04003150 int main(void) { return VSS_CTX_BACKUP; }''')
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003151 have_vss_sdk = cxx.has_header('vscoordint.h')
Marc-André Lureau8821a382022-02-01 16:53:43 +04003152endif
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003153config_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
Marc-André Lureau8821a382022-02-01 16:53:43 +04003154
Richard Henderson6391c772022-04-17 11:30:06 -07003155# Older versions of MinGW do not import _lock_file and _unlock_file properly.
3156# This was fixed for v6.0.0 with commit b48e3ac8969d.
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003157if host_os == 'windows'
Richard Henderson6391c772022-04-17 11:30:06 -07003158 config_host_data.set('HAVE__LOCK_FILE', cc.links('''
3159 #include <stdio.h>
3160 int main(void) {
3161 _lock_file(NULL);
3162 _unlock_file(NULL);
3163 return 0;
3164 }''', name: '_lock_file and _unlock_file'))
3165endif
3166
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003167if host_os == 'windows'
Pierrick Bouvierdbd672c2023-02-21 16:30:04 +01003168 mingw_has_setjmp_longjmp = cc.links('''
3169 #include <setjmp.h>
3170 int main(void) {
3171 /*
3172 * These functions are not available in setjmp header, but may be
3173 * available at link time, from libmingwex.a.
3174 */
3175 extern int __mingw_setjmp(jmp_buf);
3176 extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int);
3177 jmp_buf env;
3178 __mingw_setjmp(env);
3179 __mingw_longjmp(env, 0);
3180 }
3181 ''', name: 'mingw setjmp and longjmp')
3182
3183 if cpu == 'aarch64' and not mingw_has_setjmp_longjmp
3184 error('mingw must provide setjmp/longjmp for windows-arm64')
3185 endif
3186endif
3187
Richard Hendersonacce7282025-02-02 15:09:23 -08003188# Detect host pointer size for the target configuration loop.
3189host_long_bits = cc.sizeof('void *') * 8
3190
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003191########################
3192# Target configuration #
3193########################
3194
Paolo Bonzini2becc362020-02-03 11:42:03 +01003195minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003196
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02003197config_all_accel = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04003198config_all_devices = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003199config_devices_mak_list = []
3200config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02003201config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003202config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003203
3204disassemblers = {
3205 'alpha' : ['CONFIG_ALPHA_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003206 'avr' : ['CONFIG_AVR_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06003207 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003208 'hppa' : ['CONFIG_HPPA_DIS'],
3209 'i386' : ['CONFIG_I386_DIS'],
3210 'x86_64' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003211 'm68k' : ['CONFIG_M68K_DIS'],
3212 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
3213 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003214 'or1k' : ['CONFIG_OPENRISC_DIS'],
3215 'ppc' : ['CONFIG_PPC_DIS'],
3216 'riscv' : ['CONFIG_RISCV_DIS'],
3217 'rx' : ['CONFIG_RX_DIS'],
3218 's390' : ['CONFIG_S390_DIS'],
3219 'sh4' : ['CONFIG_SH4_DIS'],
3220 'sparc' : ['CONFIG_SPARC_DIS'],
3221 'xtensa' : ['CONFIG_XTENSA_DIS'],
Song Gaoaae17462022-06-06 20:43:06 +08003222 'loongarch' : ['CONFIG_LOONGARCH_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003223}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003224
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02003225have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01003226host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02003227 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01003228 (have_tpm ? ['CONFIG_TPM=y'] : []) + \
Marc-André Lureaucca15752023-08-30 13:38:25 +04003229 (pixman.found() ? ['CONFIG_PIXMAN=y'] : []) + \
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02003230 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02003231 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini88b6e612022-04-20 17:33:40 +02003232 (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
Dorjoy Chowdhurybb154e32024-10-09 03:17:23 +06003233 (libcbor.found() ? ['CONFIG_LIBCBOR=y'] : []) + \
Dorjoy Chowdhury63d2a5c2024-10-09 03:17:24 +06003234 (gnutls.found() ? ['CONFIG_GNUTLS=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01003235 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini1935b7e2024-05-07 14:13:46 +02003236 (fdt.found() ? ['CONFIG_FDT=y'] : []) + \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003237 (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
3238 (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
3239 (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01003240 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003241 (host_os == 'linux' ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman55116962022-06-13 16:26:24 -04003242 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02003243 (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : []) + \
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03003244 (hv_balloon ? ['CONFIG_HV_BALLOON_POSSIBLE=y'] : []) + \
3245 (have_rust ? ['CONFIG_HAVE_RUST=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01003246
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003247ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003248
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003249default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
3250actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003251fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003252foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04003253 config_target = { 'TARGET_NAME': target.split('-')[0] }
3254 if target.endswith('linux-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003255 if host_os != 'linux'
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003256 if default_targets
3257 continue
3258 endif
3259 error('Target @0@ is only available on a Linux host'.format(target))
3260 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04003261 config_target += { 'CONFIG_LINUX_USER': 'y' }
3262 elif target.endswith('bsd-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003263 if host_os not in bsd_oses
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003264 if default_targets
3265 continue
3266 endif
3267 error('Target @0@ is only available on a BSD host'.format(target))
3268 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04003269 config_target += { 'CONFIG_BSD_USER': 'y' }
3270 elif target.endswith('softmmu')
Philippe Mathieu-Daudébd0c03b2023-06-13 15:33:45 +02003271 config_target += { 'CONFIG_SYSTEM_ONLY': 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04003272 config_target += { 'CONFIG_SOFTMMU': 'y' }
3273 endif
3274 if target.endswith('-user')
3275 config_target += {
3276 'CONFIG_USER_ONLY': 'y',
3277 'CONFIG_QEMU_INTERP_PREFIX':
Ilya Leoshkevichc1075212024-10-30 00:17:47 +01003278 get_option('interp_prefix').replace('%M', config_target['TARGET_NAME']),
3279 'CONFIG_QEMU_RTSIG_MAP': get_option('rtsig_map'),
Paolo Bonzini765686d2020-09-18 06:37:21 -04003280 }
3281 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02003282
Richard Hendersonacce7282025-02-02 15:09:23 -08003283 config_target += keyval.load('configs/targets' / target + '.mak')
3284
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003285 target_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04003286 foreach sym: accelerators
Richard Hendersonacce7282025-02-02 15:09:23 -08003287 # Disallow 64-bit on 32-bit emulation and virtualization
3288 if host_long_bits < config_target['TARGET_LONG_BITS'].to_int()
3289 continue
3290 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04003291 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
3292 config_target += { sym: 'y' }
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02003293 config_all_accel += { sym: 'y' }
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003294 target_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04003295 endif
3296 endforeach
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003297 if target_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003298 if default_targets
3299 continue
3300 endif
3301 error('No accelerator available for target @0@'.format(target))
3302 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04003303
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003304 if 'TARGET_NEED_FDT' in config_target and not fdt.found()
Paolo Bonzini9b089d22024-05-08 09:25:48 +02003305 if default_targets
3306 warning('Disabling ' + target + ' due to missing libfdt')
3307 else
3308 fdt_required += target
3309 endif
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003310 continue
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003311 endif
3312
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003313 actual_target_dirs += target
3314
Paolo Bonzinifa731682020-09-21 05:19:07 -04003315 # Add default keys
Richard Hendersonacce7282025-02-02 15:09:23 -08003316 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzinifa731682020-09-21 05:19:07 -04003317 if 'TARGET_BASE_ARCH' not in config_target
3318 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
3319 endif
3320 if 'TARGET_ABI_DIR' not in config_target
3321 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
3322 endif
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003323 if 'TARGET_BIG_ENDIAN' not in config_target
3324 config_target += {'TARGET_BIG_ENDIAN': 'n'}
3325 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02003326
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003327 foreach k, v: disassemblers
Paolo Bonzini823eb012021-11-08 14:18:17 +01003328 if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003329 foreach sym: v
3330 config_target += { sym: 'y' }
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003331 endforeach
3332 endif
3333 endforeach
3334
Paolo Bonzini859aef02020-08-04 18:14:26 +02003335 config_target_data = configuration_data()
3336 foreach k, v: config_target
3337 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
3338 # do nothing
3339 elif ignored.contains(k)
3340 # do nothing
3341 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003342 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
3343 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02003344 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04003345 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02003346 config_target_data.set_quoted(k, v)
3347 elif v == 'y'
3348 config_target_data.set(k, 1)
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003349 elif v == 'n'
3350 config_target_data.set(k, 0)
Paolo Bonzini859aef02020-08-04 18:14:26 +02003351 else
3352 config_target_data.set(k, v)
3353 endif
3354 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01003355 config_target_data.set('QEMU_ARCH',
3356 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02003357 config_target_h += {target: configure_file(output: target + '-config-target.h',
3358 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003359
3360 if target.endswith('-softmmu')
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003361 target_kconfig += 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'
3362 target_kconfig += 'CONFIG_TARGET_BIG_ENDIAN=' + config_target['TARGET_BIG_ENDIAN']
3363
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003364 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003365 config_devices_mak = target + '-config-devices.mak'
3366 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003367 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01003368 output: config_devices_mak,
3369 depfile: config_devices_mak + '.d',
3370 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01003371 command: [minikconf,
3372 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01003373 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003374 host_kconfig, target_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02003375
3376 config_devices_data = configuration_data()
3377 config_devices = keyval.load(config_devices_mak)
3378 foreach k, v: config_devices
3379 config_devices_data.set(k, 1)
3380 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003381 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02003382 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
3383 configuration: config_devices_data)}
3384 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04003385 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01003386 endif
3387 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003388endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003389target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003390
Paolo Bonzinieed56e92021-11-10 11:01:26 +01003391target_configs_h = []
3392foreach target: target_dirs
3393 target_configs_h += config_target_h[target]
3394 target_configs_h += config_devices_h.get(target, [])
3395endforeach
3396genh += custom_target('config-poison.h',
3397 input: [target_configs_h],
3398 output: 'config-poison.h',
3399 capture: true,
3400 command: [find_program('scripts/make-config-poison.sh'),
3401 target_configs_h])
3402
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003403if fdt_required.length() > 0
3404 error('fdt disabled but required by targets ' + ', '.join(fdt_required))
3405endif
3406
Paolo Bonzinia775c712023-09-08 12:09:22 +02003407###############
3408# Subprojects #
3409###############
Paolo Bonzini4d34a862020-10-05 11:31:15 +02003410
Jagannathan Raman55116962022-06-13 16:26:24 -04003411libvfio_user_dep = not_found
3412if have_system and vfio_user_server_allowed
Paolo Bonzini2019cab2023-05-18 16:50:00 +02003413 libvfio_user_proj = subproject('libvfio-user', required: true)
Paolo Bonzini53283532023-03-30 12:47:23 +02003414 libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
Jagannathan Raman55116962022-06-13 16:26:24 -04003415endif
3416
Paolo Bonzinia775c712023-09-08 12:09:22 +02003417vhost_user = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003418if host_os == 'linux' and have_vhost_user
Paolo Bonzinia775c712023-09-08 12:09:22 +02003419 libvhost_user = subproject('libvhost-user')
3420 vhost_user = libvhost_user.get_variable('vhost_user_dep')
3421endif
3422
3423libvduse = not_found
3424if have_libvduse
3425 libvduse_proj = subproject('libvduse')
3426 libvduse = libvduse_proj.get_variable('libvduse_dep')
3427endif
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003428
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003429#####################
3430# Generated sources #
3431#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003432
Paolo Bonzinif3a6e9b2024-11-12 11:54:11 +01003433config_host_h = configure_file(output: 'config-host.h', configuration: config_host_data)
3434genh += config_host_h
Paolo Bonzini7b72c7d2024-10-15 11:14:18 +02003435
Marc-André Lureau3f885652019-07-15 18:06:04 +04003436hxtool = find_program('scripts/hxtool')
Marc-André Lureaue2c40122023-01-24 18:00:57 +00003437shaderinclude = find_program('scripts/shaderinclude.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003438qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003439qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
3440 meson.current_source_dir() / 'scripts/qapi/commands.py',
3441 meson.current_source_dir() / 'scripts/qapi/common.py',
3442 meson.current_source_dir() / 'scripts/qapi/error.py',
3443 meson.current_source_dir() / 'scripts/qapi/events.py',
3444 meson.current_source_dir() / 'scripts/qapi/expr.py',
3445 meson.current_source_dir() / 'scripts/qapi/gen.py',
3446 meson.current_source_dir() / 'scripts/qapi/introspect.py',
Markus Armbruster88d357d2023-04-28 12:54:16 +02003447 meson.current_source_dir() / 'scripts/qapi/main.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003448 meson.current_source_dir() / 'scripts/qapi/parser.py',
3449 meson.current_source_dir() / 'scripts/qapi/schema.py',
3450 meson.current_source_dir() / 'scripts/qapi/source.py',
3451 meson.current_source_dir() / 'scripts/qapi/types.py',
3452 meson.current_source_dir() / 'scripts/qapi/visit.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003453 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003454]
3455
3456tracetool = [
3457 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003458 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003459]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003460tracetool_depends = files(
3461 'scripts/tracetool/backend/log.py',
3462 'scripts/tracetool/backend/__init__.py',
3463 'scripts/tracetool/backend/dtrace.py',
3464 'scripts/tracetool/backend/ftrace.py',
3465 'scripts/tracetool/backend/simple.py',
3466 'scripts/tracetool/backend/syslog.py',
3467 'scripts/tracetool/backend/ust.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003468 'scripts/tracetool/format/ust_events_c.py',
3469 'scripts/tracetool/format/ust_events_h.py',
3470 'scripts/tracetool/format/__init__.py',
3471 'scripts/tracetool/format/d.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003472 'scripts/tracetool/format/simpletrace_stap.py',
3473 'scripts/tracetool/format/c.py',
3474 'scripts/tracetool/format/h.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003475 'scripts/tracetool/format/log_stap.py',
3476 'scripts/tracetool/format/stap.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003477 'scripts/tracetool/__init__.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003478)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003479
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003480qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
3481 meson.current_source_dir(),
Paolo Bonzinib0b43232022-04-20 17:33:54 +02003482 get_option('pkgversion'), meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003483qemu_version = custom_target('qemu-version.h',
3484 output: 'qemu-version.h',
3485 command: qemu_version_cmd,
3486 capture: true,
3487 build_by_default: true,
3488 build_always_stale: true)
3489genh += qemu_version
3490
Marc-André Lureau3f885652019-07-15 18:06:04 +04003491hxdep = []
3492hx_headers = [
3493 ['qemu-options.hx', 'qemu-options.def'],
3494 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
3495]
3496if have_system
3497 hx_headers += [
3498 ['hmp-commands.hx', 'hmp-commands.h'],
3499 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
3500 ]
3501endif
3502foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003503 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04003504 input: files(d[0]),
3505 output: d[1],
3506 capture: true,
Marc-André Lureau3f885652019-07-15 18:06:04 +04003507 command: [hxtool, '-h', '@INPUT0@'])
3508endforeach
3509genh += hxdep
3510
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003511###############
3512# Trace files #
3513###############
3514
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003515# TODO: add each directory to the subdirs from its own meson.build, once
3516# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003517trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003518 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003519 'qapi',
3520 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003521 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003522 'util',
Alex Bennée842b42d2022-09-29 12:42:22 +01003523 'gdbstub',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003524]
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003525if have_linux_user
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003526 trace_events_subdirs += [ 'linux-user' ]
3527endif
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003528if have_bsd_user
3529 trace_events_subdirs += [ 'bsd-user' ]
3530endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003531if have_block
3532 trace_events_subdirs += [
3533 'authz',
3534 'block',
Daniel P. Berrangé48fc8872024-07-23 11:31:24 +01003535 'chardev',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003536 'io',
3537 'nbd',
3538 'scsi',
3539 ]
3540endif
3541if have_system
3542 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003543 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003544 'audio',
3545 'backends',
3546 'backends/tpm',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003547 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003548 'hw/9pfs',
3549 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08003550 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003551 'hw/alpha',
3552 'hw/arm',
3553 'hw/audio',
3554 'hw/block',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003555 'hw/char',
3556 'hw/display',
3557 'hw/dma',
Ninad Palsule99f0c042024-01-26 04:49:46 -06003558 'hw/fsi',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003559 'hw/hyperv',
3560 'hw/i2c',
3561 'hw/i386',
3562 'hw/i386/xen',
David Woodhouseaa98ee32023-01-13 19:51:32 +00003563 'hw/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003564 'hw/ide',
3565 'hw/input',
3566 'hw/intc',
3567 'hw/isa',
3568 'hw/mem',
3569 'hw/mips',
3570 'hw/misc',
3571 'hw/misc/macio',
3572 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08003573 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01003574 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02003575 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003576 'hw/nvram',
3577 'hw/pci',
3578 'hw/pci-host',
3579 'hw/ppc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003580 'hw/rtc',
Tomasz Jeznach0c54acb2024-10-16 17:40:27 -03003581 'hw/riscv',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003582 'hw/s390x',
3583 'hw/scsi',
3584 'hw/sd',
Bernhard Beschow3647dca2024-11-05 10:10:00 +00003585 'hw/sensor',
BALATON Zoltanad52cfc2021-10-29 23:02:09 +02003586 'hw/sh4',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003587 'hw/sparc',
3588 'hw/sparc64',
3589 'hw/ssi',
3590 'hw/timer',
3591 'hw/tpm',
Jeuk Kimbc4e68d2023-09-06 16:43:48 +09003592 'hw/ufs',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003593 'hw/usb',
3594 'hw/vfio',
3595 'hw/virtio',
3596 'hw/watchdog',
3597 'hw/xen',
3598 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003599 'migration',
3600 'net',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003601 'system',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003602 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05003603 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003604 ]
3605endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003606if have_system or have_user
3607 trace_events_subdirs += [
3608 'accel/tcg',
3609 'hw/core',
3610 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02003611 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003612 'target/hppa',
3613 'target/i386',
3614 'target/i386/kvm',
Tianrui Zhaof8447432024-01-05 15:57:59 +08003615 'target/loongarch',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02003616 'target/mips/tcg',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003617 'target/ppc',
3618 'target/riscv',
3619 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08003620 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003621 'target/sparc',
3622 ]
3623endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003624
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003625###################
3626# Collect sources #
3627###################
3628
3629authz_ss = ss.source_set()
3630blockdev_ss = ss.source_set()
3631block_ss = ss.source_set()
3632chardev_ss = ss.source_set()
3633common_ss = ss.source_set()
3634crypto_ss = ss.source_set()
3635hwcore_ss = ss.source_set()
3636io_ss = ss.source_set()
3637qmp_ss = ss.source_set()
3638qom_ss = ss.source_set()
3639system_ss = ss.source_set()
3640specific_fuzz_ss = ss.source_set()
3641specific_ss = ss.source_set()
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02003642rust_devices_ss = ss.source_set()
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003643stub_ss = ss.source_set()
3644trace_ss = ss.source_set()
3645user_ss = ss.source_set()
3646util_ss = ss.source_set()
3647
3648# accel modules
3649qtest_module_ss = ss.source_set()
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003650
3651modules = {}
3652target_modules = {}
3653hw_arch = {}
3654target_arch = {}
3655target_system_arch = {}
3656target_user_arch = {}
3657
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +01003658# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
3659# that is filled in by qapi/.
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003660subdir('qapi')
3661subdir('qobject')
3662subdir('stubs')
3663subdir('trace')
3664subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04003665subdir('qom')
3666subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003667subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04003668subdir('ui')
Alex Bennée842b42d2022-09-29 12:42:22 +01003669subdir('gdbstub')
Philippe Mathieu-Daudé68621262024-04-08 17:53:20 +02003670if have_system
3671 subdir('hw')
3672else
3673 subdir('hw/core')
3674endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003675
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003676if enable_modules
3677 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
Akihiko Odaki414b1802024-05-24 17:00:22 +09003678 modulecommon = declare_dependency(objects: libmodulecommon.extract_all_objects(recursive: false), compile_args: '-DBUILD_DSO')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003679endif
3680
Paolo Bonzini1220f582023-08-30 11:52:43 +02003681qom_ss = qom_ss.apply({})
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003682libqom = static_library('qom', qom_ss.sources() + genh,
3683 dependencies: [qom_ss.dependencies()],
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003684 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003685qom = declare_dependency(objects: libqom.extract_all_objects(recursive: false),
3686 dependencies: qom_ss.dependencies())
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003687
3688event_loop_base = files('event-loop-base.c')
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003689event_loop_base = static_library('event-loop-base',
3690 sources: event_loop_base + genh,
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003691 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003692event_loop_base = declare_dependency(objects: event_loop_base.extract_all_objects(recursive: false),
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003693 dependencies: [qom])
3694
Paolo Bonzini1220f582023-08-30 11:52:43 +02003695stub_ss = stub_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003696
3697util_ss.add_all(trace_ss)
Paolo Bonzini1220f582023-08-30 11:52:43 +02003698util_ss = util_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003699libqemuutil = static_library('qemuutil',
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003700 build_by_default: false,
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003701 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6190fd62024-04-08 17:53:13 +02003702 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc])
Steve Sistare57ad6ab2025-01-15 11:00:27 -08003703qemuutil_deps = [event_loop_base]
3704if host_os != 'windows'
3705 qemuutil_deps += [rt]
3706endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003707qemuutil = declare_dependency(link_with: libqemuutil,
Nicolas Saenz Julienne70ac26b2022-04-25 09:57:22 +02003708 sources: genh + version_res,
Steve Sistare57ad6ab2025-01-15 11:00:27 -08003709 dependencies: qemuutil_deps)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003710
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01003711if have_system or have_user
3712 decodetree = generator(find_program('scripts/decodetree.py'),
3713 output: 'decode-@BASENAME@.c.inc',
3714 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3715 subdir('libdecnumber')
3716 subdir('target')
3717endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003718
Paolo Bonzini478e9432020-08-17 12:47:55 +02003719subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04003720subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04003721subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003722subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04003723subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003724
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003725if have_block
3726 block_ss.add(files(
3727 'block.c',
3728 'blockjob.c',
3729 'job.c',
3730 'qemu-io-cmds.c',
3731 ))
Paolo Bonzini406523f2021-10-13 11:43:54 +02003732 if config_host_data.get('CONFIG_REPLICATION')
3733 block_ss.add(files('replication.c'))
3734 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003735
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003736 subdir('nbd')
3737 subdir('scsi')
3738 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003739
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003740 blockdev_ss.add(files(
3741 'blockdev.c',
3742 'blockdev-nbd.c',
3743 'iothread.c',
3744 'job-qmp.c',
Akihiko Odaki7b1070a2024-05-24 17:00:23 +09003745 ))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003746
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003747 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
3748 # os-win32.c does not
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003749 if host_os == 'windows'
Paolo Bonzinidc495492023-08-30 11:29:54 +02003750 system_ss.add(files('os-win32.c'))
3751 else
3752 blockdev_ss.add(files('os-posix.c'))
3753 endif
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003754endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02003755
Philippe Mathieu-Daudéfe0007f2023-09-14 20:57:12 +02003756common_ss.add(files('cpu-common.c'))
3757specific_ss.add(files('cpu-target.c'))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003758
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003759subdir('system')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003760
Richard Henderson44b99a62021-03-22 12:24:26 +01003761# Work around a gcc bug/misfeature wherein constant propagation looks
3762# through an alias:
3763# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
3764# to guess that a const variable is always zero. Without lto, this is
3765# impossible, as the alias is restricted to page-vary-common.c. Indeed,
3766# without lto, not even the alias is required -- we simply use different
3767# declarations in different compilation units.
3768pagevary = files('page-vary-common.c')
3769if get_option('b_lto')
3770 pagevary_flags = ['-fno-lto']
3771 if get_option('cfi')
3772 pagevary_flags += '-fno-sanitize=cfi-icall'
3773 endif
Thomas Huth54c9b192022-03-30 13:48:08 +02003774 pagevary = static_library('page-vary-common', sources: pagevary + genh,
Richard Henderson44b99a62021-03-22 12:24:26 +01003775 c_args: pagevary_flags)
3776 pagevary = declare_dependency(link_with: pagevary)
3777endif
3778common_ss.add(pagevary)
Philippe Mathieu-Daudé75bbe6a2023-12-07 10:41:27 +01003779specific_ss.add(files('page-target.c', 'page-vary-target.c'))
Richard Henderson6670d4d2021-03-22 12:24:24 +01003780
Marc-André Lureauab318052019-07-24 19:23:16 +04003781subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04003782subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04003783subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003784subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04003785subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04003786subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00003787subdir('semihosting')
Markus Armbrusteraa09b3d2023-01-24 13:19:36 +01003788subdir('stats')
Richard Henderson104cc2c2021-03-08 12:04:33 -08003789subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08003790subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04003791subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003792subdir('plugins')
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003793subdir('ebpf')
3794
Pierrick Bouvier2181b922024-10-23 14:28:11 -07003795if 'CONFIG_TCG' in config_all_accel
3796 subdir('contrib/plugins')
3797endif
3798
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003799common_user_inc = []
3800
3801subdir('common-user')
Marc-André Lureaub309c322019-08-18 19:20:37 +04003802subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04003803subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003804
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003805# needed for fuzzing binaries
3806subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003807subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003808
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003809# accel modules
Richard Hendersona802d5c2025-02-02 13:38:14 -08003810target_modules += { 'accel' : { 'qtest': qtest_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003811
Paolo Bonziniea444d92023-09-08 12:06:12 +02003812##############################################
3813# Internal static_libraries and dependencies #
3814##############################################
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003815
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003816modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003817modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003818modinfo_files = []
3819
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003820block_mods = []
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003821system_mods = []
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003822emulator_modules = []
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003823foreach d, list : modules
Paolo Bonzinief709862023-05-04 10:20:46 +02003824 if not (d == 'block' ? have_block : have_system)
3825 continue
3826 endif
3827
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003828 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003829 if enable_modules
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003830 module_ss.add(modulecommon)
Paolo Bonzini0d665492023-08-31 11:18:24 +02003831 module_ss = module_ss.apply(config_all_devices, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003832 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003833 dependencies: module_ss.dependencies(), pic: true)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003834 if d == 'block'
3835 block_mods += sl
3836 else
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003837 system_mods += sl
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003838 endif
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003839 emulator_modules += shared_module(sl.name(),
3840 name_prefix: '',
Akihiko Odaki414b1802024-05-24 17:00:22 +09003841 objects: sl.extract_all_objects(recursive: false),
3842 dependencies: module_ss.dependencies(),
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003843 install: true,
3844 install_dir: qemu_moddir)
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003845 if module_ss.sources() != []
3846 # FIXME: Should use sl.extract_all_objects(recursive: true) as
3847 # input. Sources can be used multiple times but objects are
3848 # unique when it comes to lookup in compile_commands.json.
3849 # Depnds on a mesion version with
3850 # https://github.com/mesonbuild/meson/pull/8900
3851 modinfo_files += custom_target(d + '-' + m + '.modinfo',
3852 output: d + '-' + m + '.modinfo',
Paolo Bonziniac347112021-07-21 18:51:57 +02003853 input: module_ss.sources() + genh,
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003854 capture: true,
Paolo Bonziniac347112021-07-21 18:51:57 +02003855 command: [modinfo_collect, module_ss.sources()])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003856 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003857 else
3858 if d == 'block'
3859 block_ss.add_all(module_ss)
3860 else
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003861 system_ss.add_all(module_ss)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003862 endif
3863 endif
3864 endforeach
3865endforeach
3866
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003867foreach d, list : target_modules
3868 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003869 if enable_modules
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003870 module_ss.add(modulecommon)
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003871 foreach target : target_dirs
3872 if target.endswith('-softmmu')
3873 config_target = config_target_mak[target]
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003874 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
Philippe Mathieu-Daudé7d7a21b2023-06-13 16:29:11 +02003875 c_args = ['-DCOMPILING_PER_TARGET',
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003876 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3877 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3878 target_module_ss = module_ss.apply(config_target, strict: false)
3879 if target_module_ss.sources() != []
3880 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3881 sl = static_library(module_name,
3882 [genh, target_module_ss.sources()],
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003883 dependencies: target_module_ss.dependencies(),
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003884 include_directories: target_inc,
3885 c_args: c_args,
3886 pic: true)
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003887 system_mods += sl
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003888 emulator_modules += shared_module(sl.name(),
3889 name_prefix: '',
Akihiko Odaki414b1802024-05-24 17:00:22 +09003890 objects: sl.extract_all_objects(recursive: false),
3891 dependencies: target_module_ss.dependencies(),
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003892 install: true,
3893 install_dir: qemu_moddir)
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003894 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
3895 modinfo_files += custom_target(module_name + '.modinfo',
3896 output: module_name + '.modinfo',
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003897 input: target_module_ss.sources() + genh,
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003898 capture: true,
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003899 command: [modinfo_collect, '--target', target, target_module_ss.sources()])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003900 endif
3901 endif
3902 endforeach
3903 else
3904 specific_ss.add_all(module_ss)
3905 endif
3906 endforeach
3907endforeach
3908
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003909if enable_modules
Jose R. Ziviani05d68142022-05-28 00:20:35 +02003910 foreach target : target_dirs
3911 if target.endswith('-softmmu')
3912 config_target = config_target_mak[target]
3913 config_devices_mak = target + '-config-devices.mak'
3914 modinfo_src = custom_target('modinfo-' + target + '.c',
3915 output: 'modinfo-' + target + '.c',
3916 input: modinfo_files,
3917 command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
3918 capture: true)
3919
3920 modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
3921 modinfo_dep = declare_dependency(link_with: modinfo_lib)
3922
3923 arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
3924 hw_arch[arch].add(modinfo_dep)
3925 endif
3926 endforeach
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003927
3928 if emulator_modules.length() > 0
3929 alias_target('modules', emulator_modules)
3930 endif
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003931endif
3932
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003933nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08003934undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003935block_syms = custom_target('block.syms', output: 'block.syms',
3936 input: [libqemuutil, block_mods],
3937 capture: true,
3938 command: [undefsym, nm, '@INPUT@'])
3939qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003940 input: [libqemuutil, system_mods],
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003941 capture: true,
3942 command: [undefsym, nm, '@INPUT@'])
3943
Paolo Bonzini1220f582023-08-30 11:52:43 +02003944authz_ss = authz_ss.apply({})
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003945libauthz = static_library('authz', authz_ss.sources() + genh,
3946 dependencies: [authz_ss.dependencies()],
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003947 build_by_default: false)
3948
Akihiko Odaki414b1802024-05-24 17:00:22 +09003949authz = declare_dependency(objects: libauthz.extract_all_objects(recursive: false),
3950 dependencies: [authz_ss.dependencies(), qom])
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003951
Paolo Bonzini1220f582023-08-30 11:52:43 +02003952crypto_ss = crypto_ss.apply({})
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003953libcrypto = static_library('crypto', crypto_ss.sources() + genh,
3954 dependencies: [crypto_ss.dependencies()],
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003955 build_by_default: false)
3956
Akihiko Odaki414b1802024-05-24 17:00:22 +09003957crypto = declare_dependency(objects: libcrypto.extract_all_objects(recursive: false),
3958 dependencies: [crypto_ss.dependencies(), authz, qom])
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003959
Paolo Bonzini1220f582023-08-30 11:52:43 +02003960io_ss = io_ss.apply({})
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003961libio = static_library('io', io_ss.sources() + genh,
3962 dependencies: [io_ss.dependencies()],
3963 link_with: libqemuutil,
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003964 build_by_default: false)
3965
Akihiko Odaki414b1802024-05-24 17:00:22 +09003966io = declare_dependency(objects: libio.extract_all_objects(recursive: false),
3967 dependencies: [io_ss.dependencies(), crypto, qom])
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003968
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003969libmigration = static_library('migration', sources: migration_files + genh,
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003970 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003971migration = declare_dependency(objects: libmigration.extract_all_objects(recursive: false),
Paolo Bonzini70eb5fd2024-05-24 18:16:08 +02003972 dependencies: [qom, io])
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003973system_ss.add(migration)
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003974
Paolo Bonzini1220f582023-08-30 11:52:43 +02003975block_ss = block_ss.apply({})
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003976libblock = static_library('block', block_ss.sources() + genh,
3977 dependencies: block_ss.dependencies(),
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003978 build_by_default: false)
3979
Akihiko Odaki414b1802024-05-24 17:00:22 +09003980block = declare_dependency(objects: libblock.extract_all_objects(recursive: false),
3981 dependencies: [block_ss.dependencies(), crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003982
Paolo Bonzini1220f582023-08-30 11:52:43 +02003983blockdev_ss = blockdev_ss.apply({})
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003984libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
3985 dependencies: blockdev_ss.dependencies(),
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003986 build_by_default: false)
3987
Akihiko Odaki414b1802024-05-24 17:00:22 +09003988blockdev = declare_dependency(objects: libblockdev.extract_all_objects(recursive: false),
3989 dependencies: [blockdev_ss.dependencies(), block, event_loop_base])
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003990
Paolo Bonzini1220f582023-08-30 11:52:43 +02003991qmp_ss = qmp_ss.apply({})
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003992libqmp = static_library('qmp', qmp_ss.sources() + genh,
3993 dependencies: qmp_ss.dependencies(),
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003994 build_by_default: false)
3995
Akihiko Odaki414b1802024-05-24 17:00:22 +09003996qmp = declare_dependency(objects: libqmp.extract_all_objects(recursive: false),
3997 dependencies: qmp_ss.dependencies())
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003998
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003999libchardev = static_library('chardev', chardev_ss.sources() + genh,
Marc-André Lureau22d1f7a2022-03-23 19:57:12 +04004000 dependencies: chardev_ss.dependencies(),
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02004001 build_by_default: false)
4002
Akihiko Odaki414b1802024-05-24 17:00:22 +09004003chardev = declare_dependency(objects: libchardev.extract_all_objects(recursive: false),
4004 dependencies: chardev_ss.dependencies())
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02004005
Paolo Bonzini1220f582023-08-30 11:52:43 +02004006hwcore_ss = hwcore_ss.apply({})
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02004007libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02004008 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09004009hwcore = declare_dependency(objects: libhwcore.extract_all_objects(recursive: false))
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02004010common_ss.add(hwcore)
4011
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02004012###########
4013# Targets #
4014###########
4015
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02004016system_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004017common_ss.add(qom, qemuutil)
4018
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02004019common_ss.add_all(when: 'CONFIG_SYSTEM_ONLY', if_true: [system_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01004020common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
4021
Paolo Bonzini0d665492023-08-31 11:18:24 +02004022# Note that this library is never used directly (only through extract_objects)
4023# and is not built by default; therefore, source files not used by the build
4024# configuration will be in build.ninja, but are never built by default.
Paolo Bonzini2becc362020-02-03 11:42:03 +01004025common_all = static_library('common',
4026 build_by_default: false,
Paolo Bonzini0d665492023-08-31 11:18:24 +02004027 sources: common_ss.all_sources() + genh,
Paolo Bonzini9d24fb72021-12-21 16:09:54 +01004028 include_directories: common_user_inc,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09004029 implicit_include_directories: false,
Paolo Bonzini44081552024-05-24 10:56:55 +02004030 dependencies: common_ss.all_dependencies())
Paolo Bonzini2becc362020-02-03 11:42:03 +01004031
Paolo Bonzinie2b39052024-10-18 19:33:22 +02004032if have_rust
Paolo Bonzinice4a1442024-10-25 09:20:16 +02004033 # We would like to use --generate-cstr, but it is only available
4034 # starting with bindgen 0.66.0. The oldest supported versions
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004035 # is 0.60.x (Debian 12 has 0.60.1) which introduces --allowlist-file.
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004036 bindgen_args = [
4037 '--disable-header-comment',
4038 '--raw-line', '// @generated',
Paolo Bonzini9f7d4522024-10-24 13:53:59 +02004039 '--ctypes-prefix', 'std::os::raw',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004040 '--generate-block',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004041 '--impl-debug',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004042 '--no-doc-comments',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004043 '--with-derive-default',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004044 '--no-layout-tests',
4045 '--no-prepend-enum-name',
4046 '--allowlist-file', meson.project_source_root() + '/include/.*',
4047 '--allowlist-file', meson.project_source_root() + '/.*',
4048 '--allowlist-file', meson.project_build_root() + '/.*'
4049 ]
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +02004050 if not rustfmt.found()
4051 if bindgen.version().version_compare('<0.65.0')
4052 bindgen_args += ['--no-rustfmt-bindings']
4053 else
4054 bindgen_args += ['--formatter', 'none']
4055 endif
4056 endif
Paolo Bonzini131c5842025-02-06 12:15:13 +01004057 if bindgen.version().version_compare('>=0.66.0')
4058 bindgen_args += ['--rust-target', '1.59']
4059 endif
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004060 if bindgen.version().version_compare('<0.61.0')
4061 # default in 0.61+
4062 bindgen_args += ['--size_t-is-usize']
4063 else
4064 bindgen_args += ['--merge-extern-blocks']
4065 endif
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004066 c_enums = [
4067 'DeviceCategory',
4068 'GpioPolarity',
4069 'MachineInitPhase',
4070 'MemoryDeviceInfoKind',
4071 'MigrationPolicy',
4072 'MigrationPriority',
4073 'QEMUChrEvent',
4074 'QEMUClockType',
4075 'device_endian',
4076 'module_init_type',
4077 ]
4078 foreach enum : c_enums
4079 bindgen_args += ['--rustified-enum', enum]
4080 endforeach
4081 c_bitfields = [
4082 'ClockEvent',
4083 'VMStateFlags',
4084 ]
4085 foreach enum : c_bitfields
4086 bindgen_args += ['--bitfield-enum', enum]
4087 endforeach
4088
4089 # TODO: Remove this comment when the clang/libclang mismatch issue is solved.
4090 #
4091 # Rust bindings generation with `bindgen` might fail in some cases where the
4092 # detected `libclang` does not match the expected `clang` version/target. In
4093 # this case you must pass the path to `clang` and `libclang` to your build
4094 # command invocation using the environment variables CLANG_PATH and
4095 # LIBCLANG_PATH
Paolo Bonzinibe3fc972024-10-15 10:08:57 +02004096 bindings_rs = rust.bindgen(
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004097 input: 'rust/wrapper.h',
4098 dependencies: common_ss.all_dependencies(),
Paolo Bonzinicb7ada52024-11-12 11:52:23 +01004099 output: 'bindings.inc.rs',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004100 include_directories: include_directories('.', 'include'),
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004101 bindgen_version: ['>=0.60.0'],
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004102 args: bindgen_args,
4103 )
4104 subdir('rust')
4105endif
4106
4107
Akihiko Odaki956af7d2023-10-09 17:40:51 +01004108feature_to_c = find_program('scripts/feature_to_c.py')
Paolo Bonzinid1e526c2024-10-15 11:59:14 +02004109rust_root_crate = find_program('scripts/rust/rust_root_crate.sh')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04004110
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004111if host_os == 'darwin'
Philippe Mathieu-Daudé30cfa502022-02-15 17:25:03 +01004112 entitlement = find_program('scripts/entitlement.sh')
4113endif
4114
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004115traceable = []
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04004116emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01004117foreach target : target_dirs
4118 config_target = config_target_mak[target]
4119 target_name = config_target['TARGET_NAME']
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004120 target_base_arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02004121 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004122 arch_deps = []
Philippe Mathieu-Daudé7d7a21b2023-06-13 16:29:11 +02004123 c_args = ['-DCOMPILING_PER_TARGET',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004124 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
Philippe Mathieu-Daudéedbceac2024-12-18 15:36:07 +01004125 ]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04004126 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01004127
4128 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004129 if host_os == 'linux'
Paolo Bonzini2becc362020-02-03 11:42:03 +01004130 target_inc += include_directories('linux-headers', is_system: true)
4131 endif
4132 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01004133 target_type='system'
Philippe Mathieu-Daudé01c85e62023-10-04 11:06:27 +02004134 t = target_system_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004135 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004136 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004137
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004138 hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
Philippe Mathieu-Daudébf964322023-11-21 13:52:48 +01004139 if hw_arch.has_key(hw_dir)
4140 hw = hw_arch[hw_dir].apply(config_target, strict: false)
4141 arch_srcs += hw.sources()
4142 arch_deps += hw.dependencies()
4143 endif
Marc-André Lureau2c442202019-08-17 13:55:58 +04004144
Philippe Mathieu-Daudéedbceac2024-12-18 15:36:07 +01004145 c_args += ['-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzini2becc362020-02-03 11:42:03 +01004146 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004147 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01004148 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04004149 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01004150 target_type='user'
Paolo Bonzinia3a576b2021-12-21 16:23:55 +01004151 target_inc += common_user_inc
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004152 if target_base_arch in target_user_arch
4153 t = target_user_arch[target_base_arch].apply(config_target, strict: false)
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02004154 arch_srcs += t.sources()
4155 arch_deps += t.dependencies()
4156 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01004157 if 'CONFIG_LINUX_USER' in config_target
4158 base_dir = 'linux-user'
Warner Loshe2a74722021-08-03 17:17:17 -06004159 endif
4160 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01004161 base_dir = 'bsd-user'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004162 target_inc += include_directories('bsd-user/' / host_os)
Warner Losh85fc1b52022-01-08 17:27:34 -07004163 target_inc += include_directories('bsd-user/host/' / host_arch)
Warner Loshe2a74722021-08-03 17:17:17 -06004164 dir = base_dir / abi
Warner Losh19bf1292021-11-04 16:34:48 -06004165 arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01004166 endif
4167 target_inc += include_directories(
4168 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04004169 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01004170 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04004171 if 'CONFIG_LINUX_USER' in config_target
4172 dir = base_dir / abi
4173 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
4174 if config_target.has_key('TARGET_SYSTBL_ABI')
4175 arch_srcs += \
4176 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
4177 extra_args : config_target['TARGET_SYSTBL_ABI'])
4178 endif
4179 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01004180 endif
4181
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04004182 if 'TARGET_XML_FILES' in config_target
4183 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
4184 output: target + '-gdbstub-xml.c',
4185 input: files(config_target['TARGET_XML_FILES'].split()),
4186 command: [feature_to_c, '@INPUT@'],
4187 capture: true)
4188 arch_srcs += gdbstub_xml
4189 endif
4190
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004191 t = target_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004192 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004193 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004194
Paolo Bonzini2becc362020-02-03 11:42:03 +01004195 target_common = common_ss.apply(config_target, strict: false)
4196 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004197 arch_deps += target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01004198
Paolo Bonzini2becc362020-02-03 11:42:03 +01004199 target_specific = specific_ss.apply(config_target, strict: false)
4200 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004201 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01004202
Paolo Bonzinie2b39052024-10-18 19:33:22 +02004203 if have_rust and target_type == 'system'
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004204 target_rust = rust_devices_ss.apply(config_target, strict: false)
4205 crates = []
4206 foreach dep : target_rust.dependencies()
4207 crates += dep.get_variable('crate')
4208 endforeach
4209 if crates.length() > 0
4210 rlib_rs = custom_target('rust_' + target.underscorify() + '.rs',
4211 output: 'rust_' + target.underscorify() + '.rs',
Paolo Bonzinid1e526c2024-10-15 11:59:14 +02004212 command: [rust_root_crate, crates],
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004213 capture: true,
4214 build_by_default: true,
4215 build_always_stale: true)
4216 rlib = static_library('rust_' + target.underscorify(),
4217 rlib_rs,
4218 dependencies: target_rust.dependencies(),
4219 override_options: ['rust_std=2021', 'build.rust_std=2021'],
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004220 rust_abi: 'c')
4221 arch_deps += declare_dependency(link_whole: [rlib])
4222 endif
4223 endif
4224
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004225 # allow using headers from the dependencies but do not include the sources,
4226 # because this emulator only needs those in "objects". For external
4227 # dependencies, the full dependency is included below in the executable.
4228 lib_deps = []
4229 foreach dep : arch_deps
4230 lib_deps += dep.partial_dependency(compile_args: true, includes: true)
4231 endforeach
4232
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004233 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02004234 sources: arch_srcs + genh,
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004235 dependencies: lib_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01004236 objects: objects,
4237 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004238 c_args: c_args,
Paolo Bonzini44081552024-05-24 10:56:55 +02004239 build_by_default: false)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004240
4241 if target.endswith('-softmmu')
4242 execs = [{
4243 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004244 'win_subsystem': 'console',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02004245 'sources': files('system/main.c'),
Philippe Mathieu-Daudé51625572024-11-20 12:36:43 +01004246 'dependencies': [sdl]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004247 }]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004248 if host_os == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004249 execs += [{
4250 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004251 'win_subsystem': 'windows',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02004252 'sources': files('system/main.c'),
Philippe Mathieu-Daudé51625572024-11-20 12:36:43 +01004253 'dependencies': [sdl]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004254 }]
4255 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004256 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004257 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
4258 execs += [{
4259 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004260 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004261 'sources': specific_fuzz.sources(),
4262 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004263 }]
4264 endif
4265 else
4266 execs = [{
4267 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004268 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004269 'sources': [],
4270 'dependencies': []
4271 }]
4272 endif
4273 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01004274 exe_name = exe['name']
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004275 if host_os == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01004276 exe_name += '-unsigned'
4277 endif
4278
4279 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09004280 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004281 c_args: c_args,
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004282 dependencies: arch_deps + exe['dependencies'],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004283 objects: lib.extract_all_objects(recursive: true),
Paolo Bonzini05007252024-03-20 11:28:28 +01004284 link_depends: [block_syms, qemu_syms],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004285 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004286 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01004287
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004288 if host_os == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004289 icon = 'pc-bios/qemu.rsrc'
4290 build_input = [emulator, files(icon)]
4291 install_input = [
4292 get_option('bindir') / exe_name,
4293 meson.current_source_dir() / icon
4294 ]
4295 if 'CONFIG_HVF' in config_target
4296 entitlements = 'accel/hvf/entitlements.plist'
4297 build_input += files(entitlements)
4298 install_input += meson.current_source_dir() / entitlements
4299 endif
4300
Alexander Graf8a74ce62021-01-20 23:44:34 +01004301 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004302 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01004303 output: exe['name'],
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01004304 command: [entitlement, '@OUTPUT@', '@INPUT@'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01004305 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09004306
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01004307 meson.add_install_script(entitlement, '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09004308 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004309 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01004310 else
4311 emulators += {exe['name']: emulator}
4312 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04004313
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004314 traceable += [{
4315 'exe': exe['name'],
4316 'probe-prefix': 'qemu.' + target_type + '.' + target_name,
4317 }]
4318
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004319 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01004320endforeach
4321
Paolo Bonzini931049b2020-02-05 09:44:24 +01004322# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004323
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004324if get_option('plugins')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01004325 install_headers('include/qemu/qemu-plugin.h')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004326 if host_os == 'windows'
Greg Manning36fa0772023-11-06 18:51:06 +00004327 # On windows, we want to deliver the qemu_plugin_api.lib file in the qemu installer,
4328 # so that plugin authors can compile against it.
4329 install_data(win32_qemu_plugin_api_lib, install_dir: 'lib')
4330 endif
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01004331endif
4332
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004333subdir('qga')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02004334
Laurent Vivier9755c942020-08-24 17:24:30 +02004335# Don't build qemu-keymap if xkbcommon is not explicitly enabled
4336# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02004337if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04004338 # used for the update-keymaps target, so include rules even if !have_tools
4339 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
4340 dependencies: [qemuutil, xkbcommon], install: have_tools)
4341endif
4342
Paolo Bonzini931049b2020-02-05 09:44:24 +01004343if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004344 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004345 link_args: '@block.syms', link_depends: block_syms,
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004346 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
4347 qemu_io = executable('qemu-io', files('qemu-io.c'),
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004348 link_args: '@block.syms', link_depends: block_syms,
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004349 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01004350 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004351 link_args: '@block.syms', link_depends: block_syms,
Akihiko Odaki7b1070a2024-05-24 17:00:23 +09004352 dependencies: [blockdev, qemuutil, selinux],
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004353 install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004354
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02004355 subdir('storage-daemon')
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004356
4357 foreach exe: [ 'qemu-img', 'qemu-io', 'qemu-nbd', 'qemu-storage-daemon']
4358 traceable += [{
4359 'exe': exe,
4360 'probe-prefix': 'qemu.' + exe.substring(5).replace('-', '_')
4361 }]
4362 endforeach
4363
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04004364 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02004365
Marc-André Lureau157e7b12019-07-15 14:50:58 +04004366 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
Steve Sistare57ad6ab2025-01-15 11:00:27 -08004367 dependencies: [qemuutil, rt],
Marc-André Lureau157e7b12019-07-15 14:50:58 +04004368 install: true)
4369
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004370 if have_vhost_user
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02004371 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02004372 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04004373 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02004374 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01004375 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004376
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004377 if host_os == 'linux'
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004378 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
4379 dependencies: [qemuutil, libcap_ng],
4380 install: true,
4381 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004382
4383 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
4384 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02004385 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004386 install: true)
Anthony Harivel84369d72024-05-22 17:34:51 +02004387
4388 if cpu in ['x86', 'x86_64']
4389 executable('qemu-vmsr-helper', files('tools/i386/qemu-vmsr-helper.c'),
4390 dependencies: [authz, crypto, io, qom, qemuutil,
4391 libcap_ng, mpathpersist],
4392 install: true)
4393 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004394 endif
4395
Paolo Bonziniccd250a2021-06-03 12:50:17 +02004396 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04004397 subdir('contrib/ivshmem-client')
4398 subdir('contrib/ivshmem-server')
4399 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01004400endif
4401
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004402if stap.found()
4403 foreach t: traceable
4404 foreach stp: [
4405 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / t['exe'], 'install': false},
4406 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / t['exe'], 'install': true},
4407 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
4408 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
4409 ]
4410 cmd = [
4411 tracetool, '--group=all', '--format=' + stp['fmt'],
4412 '--binary=' + stp['bin'],
4413 '--probe-prefix=' + t['probe-prefix'],
4414 '@INPUT@', '@OUTPUT@'
4415 ]
4416
4417 custom_target(t['exe'] + stp['ext'],
4418 input: trace_events_all,
4419 output: t['exe'] + stp['ext'],
4420 install: stp['install'],
4421 install_dir: get_option('datadir') / 'systemtap/tapset',
4422 command: cmd,
4423 depend_files: tracetool_depends)
4424 endforeach
4425 endforeach
4426endif
4427
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04004428subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004429subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04004430subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02004431subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08004432subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01004433if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04004434 subdir('po')
4435endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004436
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004437if host_machine.system() == 'windows'
4438 nsis_cmd = [
4439 find_program('scripts/nsis.py'),
4440 '@OUTPUT@',
4441 get_option('prefix'),
4442 meson.current_source_dir(),
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02004443 glib_pc.get_variable('bindir'),
Stefan Weil24bdcc92020-11-25 20:18:33 +01004444 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004445 '--',
4446 '-DDISPLAYVERSION=' + meson.project_version(),
4447 ]
4448 if build_docs
4449 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
4450 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01004451 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004452 nsis_cmd += '-DCONFIG_GTK=y'
4453 endif
4454
4455 nsis = custom_target('nsis',
4456 output: 'qemu-setup-' + meson.project_version() + '.exe',
4457 input: files('qemu.nsi'),
4458 build_always_stale: true,
4459 command: nsis_cmd + ['@INPUT@'])
4460 alias_target('installer', nsis)
4461endif
4462
Paolo Bonzinia0c91622020-10-07 11:01:51 -04004463#########################
4464# Configuration summary #
4465#########################
4466
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004467# Build environment
Paolo Bonzinif9332752020-02-03 13:28:38 +01004468summary_info = {}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004469summary_info += {'Build directory': meson.current_build_dir()}
4470summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004471summary_info += {'Download dependencies': get_option('wrap_mode') != 'nodownload'}
4472summary(summary_info, bool_yn: true, section: 'Build environment')
4473
4474# Directories
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004475summary_info += {'Install prefix': get_option('prefix')}
4476summary_info += {'BIOS directory': qemu_datadir}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004477pathsep = host_os == 'windows' ? ';' : ':'
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09004478summary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004479summary_info += {'binary directory': get_option('prefix') / get_option('bindir')}
4480summary_info += {'library directory': get_option('prefix') / get_option('libdir')}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004481summary_info += {'module directory': qemu_moddir}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004482summary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
4483summary_info += {'include directory': get_option('prefix') / get_option('includedir')}
4484summary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004485if host_os != 'windows'
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004486 summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
4487 summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004488else
4489 summary_info += {'local state directory': 'queried at runtime'}
4490endif
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004491summary_info += {'Doc directory': get_option('prefix') / get_option('docdir')}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004492summary(summary_info, bool_yn: true, section: 'Directories')
4493
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004494# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004495summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004496summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004497summary_info += {'sphinx-build': sphinx_build}
Paolo Bonzinib4d61d32023-09-28 12:00:48 +02004498
4499# FIXME: the [binaries] section of machine files, which can be probed
4500# with find_program(), would be great for passing gdb and genisoimage
4501# paths from configure to Meson. However, there seems to be no way to
4502# hide a program (for example if gdb is too old).
Paolo Bonzinia47dd5c2023-09-28 10:44:56 +02004503if config_host.has_key('GDB')
4504 summary_info += {'gdb': config_host['GDB']}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004505endif
Paolo Bonzini40c909f2022-04-20 17:33:49 +02004506summary_info += {'iasl': iasl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004507summary_info += {'genisoimage': config_host['GENISOIMAGE']}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004508if host_os == 'windows' and have_ga
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004509 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004510endif
Thomas Huth58902582022-04-08 18:20:47 +02004511if slirp.found() and have_system
Paolo Bonzini35acbb32021-10-13 13:43:36 +02004512 summary_info += {'smbd': have_slirp_smbd ? smbd_path : false}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004513endif
4514summary(summary_info, bool_yn: true, section: 'Host binaries')
4515
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004516# Configurable features
4517summary_info = {}
4518summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004519summary_info += {'system-mode emulation': have_system}
4520summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004521summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004522summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini60027112022-10-20 14:53:10 +02004523summary_info += {'module support': enable_modules}
4524if enable_modules
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02004525 summary_info += {'alternative module path': get_option('module_upgrades')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004526endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004527summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004528if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02004529 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004530endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02004531summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
4532if 'simple' in get_option('trace_backends')
4533 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004534endif
Marc-André Lureau142ca622021-07-15 11:53:53 +04004535summary_info += {'D-Bus display': dbus_display}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004536summary_info += {'QOM debugging': get_option('qom_cast_debug')}
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004537summary_info += {'Relocatable install': get_option('relocatable')}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004538summary_info += {'vhost-kernel support': have_vhost_kernel}
4539summary_info += {'vhost-net support': have_vhost_net}
4540summary_info += {'vhost-user support': have_vhost_user}
4541summary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004542summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004543summary_info += {'vhost-vdpa support': have_vhost_vdpa}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004544summary_info += {'build guest agent': have_ga}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004545summary(summary_info, bool_yn: true, section: 'Configurable features')
4546
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004547# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004548summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004549summary_info += {'host CPU': cpu}
4550summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01004551summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
4552summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Thomas Huth785abf02023-07-06 08:47:36 +02004553if 'cpp' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004554 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004555else
4556 summary_info += {'C++ compiler': false}
4557endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004558if 'objc' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004559 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004560else
4561 summary_info += {'Objective-C compiler': false}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004562endif
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03004563summary_info += {'Rust support': have_rust}
4564if have_rust
Paolo Bonzini1a6ef6f2024-10-03 16:28:45 +03004565 summary_info += {'Rust target': config_host['RUST_TARGET_TRIPLE']}
Paolo Bonzinie2b39052024-10-18 19:33:22 +02004566 summary_info += {'rustc': ' '.join(rustc.cmd_array())}
4567 summary_info += {'rustc version': rustc.version()}
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004568 summary_info += {'bindgen': bindgen.full_path()}
4569 summary_info += {'bindgen version': bindgen.version()}
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03004570endif
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004571option_cflags = (get_option('debug') ? ['-g'] : [])
4572if get_option('optimization') != 'plain'
4573 option_cflags += ['-O' + get_option('optimization')]
4574endif
4575summary_info += {'CFLAGS': ' '.join(get_option('c_args') + option_cflags)}
Thomas Huth785abf02023-07-06 08:47:36 +02004576if 'cpp' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004577 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args') + option_cflags)}
Paolo Bonzini47b30832020-09-23 05:26:17 -04004578endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004579if 'objc' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004580 summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args') + option_cflags)}
Philippe Mathieu-Daudée910c7d2022-01-08 22:38:55 +01004581endif
Thomas Huth785abf02023-07-06 08:47:36 +02004582link_args = get_option('c_link_args')
Paolo Bonzini47b30832020-09-23 05:26:17 -04004583if link_args.length() > 0
4584 summary_info += {'LDFLAGS': ' '.join(link_args)}
4585endif
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004586summary_info += {'QEMU_CFLAGS': ' '.join(qemu_common_flags + qemu_cflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004587if 'cpp' in all_languages
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004588 summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_common_flags + qemu_cxxflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004589endif
4590if 'objc' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +01004591 summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_common_flags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004592endif
Paolo Bonzinid0651772022-04-20 17:33:34 +02004593summary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)}
Daniele Buonocdad7812020-12-04 18:06:11 -05004594summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004595summary_info += {'PIE': get_option('b_pie')}
Paolo Bonzinie58e55d2023-06-07 10:00:21 +02004596summary_info += {'static build': get_option('prefer_static')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004597summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinib87df902021-11-08 13:52:11 +01004598summary_info += {'membarrier': have_membarrier}
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04004599summary_info += {'debug graph lock': get_option('debug_graph_lock')}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004600summary_info += {'debug stack usage': get_option('debug_stack_usage')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004601summary_info += {'mutex debugging': get_option('debug_mutex')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004602summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01004603summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
ling xu04ffce12022-11-16 23:29:22 +08004604summary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004605summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzini34f983d2023-01-09 15:31:51 +01004606summary_info += {'thread sanitizer': get_option('tsan')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004607summary_info += {'CFI support': get_option('cfi')}
4608if get_option('cfi')
4609 summary_info += {'CFI debug support': get_option('cfi_debug')}
4610endif
4611summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004612summary_info += {'sparse': sparse}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004613summary_info += {'mingw32 support': host_os == 'windows'}
Paolo Bonzini12640f02022-06-06 11:48:47 +02004614summary(summary_info, bool_yn: true, section: 'Compilation')
Alex Bennée49e85652021-02-22 10:14:50 +00004615
4616# snarf the cross-compilation information for tests
Paolo Bonzini12640f02022-06-06 11:48:47 +02004617summary_info = {}
4618have_cross = false
Alex Bennée49e85652021-02-22 10:14:50 +00004619foreach target: target_dirs
Paolo Bonzinic7022a72022-09-29 12:42:07 +01004620 tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak'
Alex Bennée49e85652021-02-22 10:14:50 +00004621 if fs.exists(tcg_mak)
4622 config_cross_tcg = keyval.load(tcg_mak)
Alex Bennée85b141e2022-05-27 16:35:34 +01004623 if 'CC' in config_cross_tcg
Paolo Bonzini12640f02022-06-06 11:48:47 +02004624 summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
4625 have_cross = true
Alex Bennée49e85652021-02-22 10:14:50 +00004626 endif
Paolo Bonzini12640f02022-06-06 11:48:47 +02004627 endif
Alex Bennée49e85652021-02-22 10:14:50 +00004628endforeach
Paolo Bonzini12640f02022-06-06 11:48:47 +02004629if have_cross
4630 summary(summary_info, bool_yn: true, section: 'Cross compilers')
4631endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004632
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004633# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004634summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004635if have_system
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004636 summary_info += {'KVM support': config_all_accel.has_key('CONFIG_KVM')}
4637 summary_info += {'HVF support': config_all_accel.has_key('CONFIG_HVF')}
4638 summary_info += {'WHPX support': config_all_accel.has_key('CONFIG_WHPX')}
4639 summary_info += {'NVMM support': config_all_accel.has_key('CONFIG_NVMM')}
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02004640 summary_info += {'Xen support': xen.found()}
4641 if xen.found()
4642 summary_info += {'xen ctrl version': xen.version()}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004643 endif
Paolo Bonzini0d665492023-08-31 11:18:24 +02004644 summary_info += {'Xen emulation': config_all_devices.has_key('CONFIG_XEN_EMU')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004645endif
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004646summary_info += {'TCG support': config_all_accel.has_key('CONFIG_TCG')}
4647if config_all_accel.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004648 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +01004649 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004650 else
4651 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
4652 endif
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004653 summary_info += {'TCG plugins': get_option('plugins')}
Paolo Bonzini1d558c92023-08-28 11:48:30 +02004654 summary_info += {'TCG debug enabled': get_option('debug_tcg')}
Ilya Leoshkevich1f2355f2024-03-12 01:23:30 +01004655 if have_linux_user or have_bsd_user
4656 summary_info += {'syscall buffer debugging support': get_option('debug_remap')}
4657 endif
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004658endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004659summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004660if have_system
4661 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01004662 summary_info += {'out of process emulation': multiprocess_allowed}
Jagannathan Raman55116962022-06-13 16:26:24 -04004663 summary_info += {'vfio-user server': vfio_user_server_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004664endif
4665summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
4666
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004667# Block layer
4668summary_info = {}
Paolo Bonzini67398252022-10-12 13:19:35 +02004669summary_info += {'coroutine backend': coroutine_backend}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004670summary_info += {'coroutine pool': have_coroutine_pool}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004671if have_block
Paolo Bonzini622d64f2022-04-20 17:33:53 +02004672 summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
4673 summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004674 summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
Christian Schoenebeck38877022023-05-11 16:12:34 +02004675 summary_info += {'VirtFS (9P) support': have_virtfs}
Paolo Bonzini406523f2021-10-13 11:43:54 +02004676 summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004677 summary_info += {'bochs support': get_option('bochs').allowed()}
4678 summary_info += {'cloop support': get_option('cloop').allowed()}
4679 summary_info += {'dmg support': get_option('dmg').allowed()}
4680 summary_info += {'qcow v1 support': get_option('qcow1').allowed()}
4681 summary_info += {'vdi support': get_option('vdi').allowed()}
Vladimir Sementsov-Ogievskiy11cea422023-04-21 12:27:58 +03004682 summary_info += {'vhdx support': get_option('vhdx').allowed()}
4683 summary_info += {'vmdk support': get_option('vmdk').allowed()}
4684 summary_info += {'vpc support': get_option('vpc').allowed()}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004685 summary_info += {'vvfat support': get_option('vvfat').allowed()}
4686 summary_info += {'qed support': get_option('qed').allowed()}
4687 summary_info += {'parallels support': get_option('parallels').allowed()}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004688 summary_info += {'FUSE exports': fuse}
Xie Yongji2a2359b2022-05-23 16:46:09 +08004689 summary_info += {'VDUSE block exports': have_vduse_blk_export}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004690endif
4691summary(summary_info, bool_yn: true, section: 'Block layer support')
4692
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004693# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004694summary_info = {}
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02004695summary_info += {'TLS priority': get_option('tls_priority')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004696summary_info += {'GNUTLS support': gnutls}
4697if gnutls.found()
4698 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
4699endif
4700summary_info += {'libgcrypt': gcrypt}
4701summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02004702if nettle.found()
4703 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004704endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08004705summary_info += {'SM4 ALG support': crypto_sm4}
liequan ched078da82024-10-30 08:51:46 +00004706summary_info += {'SM3 ALG support': crypto_sm3}
Paolo Bonzini34b52612021-11-08 14:02:42 +01004707summary_info += {'AF_ALG support': have_afalg}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004708summary_info += {'rng-none': get_option('rng_none')}
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02004709summary_info += {'Linux keyring': have_keyring}
Thomas Huthc64023b2023-08-24 11:42:08 +02004710summary_info += {'Linux keyutils': keyutils}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004711summary(summary_info, bool_yn: true, section: 'Crypto')
4712
Thomas Huth9e48afa2023-06-02 19:18:30 +02004713# UI
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004714summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004715if host_os == 'darwin'
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03004716 summary_info += {'Cocoa support': cocoa}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004717endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004718summary_info += {'SDL support': sdl}
4719summary_info += {'SDL image support': sdl_image}
4720summary_info += {'GTK support': gtk}
4721summary_info += {'pixman': pixman}
4722summary_info += {'VTE support': vte}
Kshitij Suri95f85102022-04-08 07:13:34 +00004723summary_info += {'PNG support': png}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004724summary_info += {'VNC support': vnc}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01004725if vnc.found()
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004726 summary_info += {'VNC SASL support': sasl}
4727 summary_info += {'VNC JPEG support': jpeg}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004728endif
Thomas Huth9e48afa2023-06-02 19:18:30 +02004729summary_info += {'spice protocol support': spice_protocol}
4730if spice_protocol.found()
4731 summary_info += {' spice server support': spice}
4732endif
4733summary_info += {'curses support': curses}
4734summary_info += {'brlapi support': brlapi}
4735summary(summary_info, bool_yn: true, section: 'User interface')
4736
Alex Bennéef705c1f2023-12-22 11:48:46 +00004737# Graphics backends
4738summary_info = {}
4739summary_info += {'VirGL support': virgl}
4740summary_info += {'Rutabaga support': rutabaga}
4741summary(summary_info, bool_yn: true, section: 'Graphics backends')
4742
Thomas Huthaece7232023-06-02 19:18:32 +02004743# Audio backends
4744summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004745if host_os not in ['darwin', 'haiku', 'windows']
Paolo Bonzini87430d52021-10-07 15:06:09 +02004746 summary_info += {'OSS support': oss}
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02004747 summary_info += {'sndio support': sndio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004748elif host_os == 'darwin'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004749 summary_info += {'CoreAudio support': coreaudio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004750elif host_os == 'windows'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004751 summary_info += {'DirectSound support': dsound}
4752endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004753if host_os == 'linux'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004754 summary_info += {'ALSA support': alsa}
4755 summary_info += {'PulseAudio support': pulse}
4756endif
Marc-André Lureau20c51242023-05-06 20:37:26 +04004757summary_info += {'PipeWire support': pipewire}
Paolo Bonzini87430d52021-10-07 15:06:09 +02004758summary_info += {'JACK support': jack}
Thomas Huthaece7232023-06-02 19:18:32 +02004759summary(summary_info, bool_yn: true, section: 'Audio backends')
4760
Thomas Huthc3527c52023-06-02 19:18:31 +02004761# Network backends
Thomas Huth9e48afa2023-06-02 19:18:30 +02004762summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004763if host_os == 'darwin'
Thomas Huth9e48afa2023-06-02 19:18:30 +02004764 summary_info += {'vmnet.framework support': vmnet}
4765endif
Ilya Maximetscb039ef2023-09-13 20:34:37 +02004766summary_info += {'AF_XDP support': libxdp}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004767summary_info += {'slirp support': slirp}
Paolo Bonzinie1723992021-10-07 15:08:21 +02004768summary_info += {'vde support': vde}
Paolo Bonzini837b84b2021-10-07 15:08:22 +02004769summary_info += {'netmap support': have_netmap}
Thomas Hutheea94532021-10-28 20:59:08 +02004770summary_info += {'l2tpv3 support': have_l2tpv3}
Thomas Huthc3527c52023-06-02 19:18:31 +02004771summary(summary_info, bool_yn: true, section: 'Network backends')
4772
4773# Libraries
4774summary_info = {}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004775summary_info += {'libtasn1': tasn1}
4776summary_info += {'PAM': pam}
4777summary_info += {'iconv support': iconv}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004778summary_info += {'blkio support': blkio}
4779summary_info += {'curl support': curl}
4780summary_info += {'Multipath support': mpathpersist}
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02004781summary_info += {'Linux AIO support': libaio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004782summary_info += {'Linux io_uring support': linux_io_uring}
4783summary_info += {'ATTR/XATTR support': libattr}
Paolo Bonzini3730a732022-04-20 17:33:41 +02004784summary_info += {'RDMA support': rdma}
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01004785summary_info += {'fdt support': fdt_opt == 'internal' ? 'internal' : fdt}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004786summary_info += {'libcap-ng support': libcap_ng}
4787summary_info += {'bpf support': libbpf}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004788summary_info += {'rbd support': rbd}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004789summary_info += {'smartcard support': cacard}
4790summary_info += {'U2F support': u2f}
4791summary_info += {'libusb': libusb}
4792summary_info += {'usb net redir': usbredir}
Paolo Bonzini88b6e612022-04-20 17:33:40 +02004793summary_info += {'OpenGL support (epoxy)': opengl}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004794summary_info += {'GBM': gbm}
4795summary_info += {'libiscsi support': libiscsi}
4796summary_info += {'libnfs support': libnfs}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004797if host_os == 'windows'
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004798 if have_ga
Marc-André Lureau8821a382022-02-01 16:53:43 +04004799 summary_info += {'QGA VSS support': have_qga_vss}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01004800 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01004801endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004802summary_info += {'seccomp support': seccomp}
4803summary_info += {'GlusterFS support': glusterfs}
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02004804summary_info += {'hv-balloon support': hv_balloon}
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01004805summary_info += {'TPM support': have_tpm}
Thomas Huthe6a52b32021-12-09 15:48:01 +01004806summary_info += {'libssh support': libssh}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004807summary_info += {'lzo support': lzo}
4808summary_info += {'snappy support': snappy}
4809summary_info += {'bzip2 support': libbzip2}
4810summary_info += {'lzfse support': liblzfse}
4811summary_info += {'zstd support': zstd}
Yuan Liub844a2c2024-06-10 18:21:06 +08004812summary_info += {'Query Processing Library support': qpl}
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01004813summary_info += {'UADK Library support': uadk}
Bryan Zhange28ed312024-08-30 16:27:19 -07004814summary_info += {'qatzip support': qatzip}
Paolo Bonzini488a8c72021-12-21 12:38:27 +01004815summary_info += {'NUMA host support': numa}
Thomas Huth83602082022-05-16 16:58:23 +02004816summary_info += {'capstone': capstone}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004817summary_info += {'libpmem support': libpmem}
4818summary_info += {'libdaxctl support': libdaxctl}
Dorjoy Chowdhurybb154e32024-10-09 03:17:23 +06004819summary_info += {'libcbor support': libcbor}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004820summary_info += {'libudev': libudev}
4821# Dummy dependency, keep .found()
Max Reitzdf4ea702020-10-27 20:05:46 +01004822summary_info += {'FUSE lseek': fuse_lseek.found()}
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004823summary_info += {'selinux': selinux}
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01004824summary_info += {'libdw': libdw}
Ilya Leoshkevicha1a98002024-02-06 01:22:03 +01004825if host_os == 'freebsd'
4826 summary_info += {'libinotify-kqueue': inotify}
4827endif
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01004828summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004829
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004830if host_arch == 'unknown'
Paolo Bonzinif9332752020-02-03 13:28:38 +01004831 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004832 warning('UNSUPPORTED HOST CPU')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004833 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004834 message('Support for CPU host architecture ' + cpu + ' is not currently')
4835 message('maintained. The QEMU project does not guarantee that QEMU will')
4836 message('compile or work on this host CPU. You can help by volunteering')
4837 message('to maintain it and providing a build host for our continuous')
4838 message('integration setup.')
4839 if get_option('tcg').allowed() and target_dirs.length() > 0
4840 message()
4841 message('configure has succeeded and you can continue to build, but')
4842 message('QEMU will use a slow interpreter to emulate the target CPU.')
4843 endif
Paolo Bonzini14ed29d2024-10-27 14:07:01 +01004844elif host_arch == 'mips'
4845 message()
4846 warning('DEPRECATED HOST CPU')
4847 message()
4848 message('Support for CPU host architecture ' + cpu + ' is going to be')
4849 message('dropped as soon as the QEMU project stops supporting Debian 12')
4850 message('("Bookworm"). Going forward, the QEMU project will not guarantee')
4851 message('that QEMU will compile or work on this host CPU.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004852endif
4853
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004854if not supported_oses.contains(host_os)
Paolo Bonzinif9332752020-02-03 13:28:38 +01004855 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004856 warning('UNSUPPORTED HOST OS')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004857 message()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004858 message('Support for host OS ' + host_os + 'is not currently maintained.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004859 message('configure has succeeded and you can continue to build, but')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004860 message('the QEMU project does not guarantee that QEMU will compile or')
4861 message('work on this operating system. You can help by volunteering')
4862 message('to maintain it and providing a build host for our continuous')
4863 message('integration setup. This will ensure that future versions of QEMU')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004864 message('will keep working on ' + host_os + '.')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004865endif
4866
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004867if host_arch == 'unknown' or not supported_oses.contains(host_os)
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004868 message()
4869 message('If you want to help supporting QEMU on this platform, please')
4870 message('contact the developers at qemu-devel@nongnu.org.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004871endif
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004872
4873actually_reloc = get_option('relocatable')
4874# check if get_relocated_path() is actually able to relocate paths
4875if get_option('relocatable') and \
4876 not (get_option('prefix') / get_option('bindir')).startswith(get_option('prefix') / '')
4877 message()
4878 warning('bindir not included within prefix, the installation will not be relocatable.')
4879 actually_reloc = false
4880endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004881if not actually_reloc and (host_os == 'windows' or get_option('relocatable'))
4882 if host_os == 'windows'
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004883 message()
4884 warning('Windows installs should usually be relocatable.')
4885 endif
4886 message()
4887 message('QEMU will have to be installed under ' + get_option('prefix') + '.')
4888 message('Use --disable-relocatable to remove this warning.')
4889endif