blob: ea54d15f4a686d383edf9fe2c13e9973c2a6a809 [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
Peter Maydella019e152025-03-10 10:29:50 +00008add_test_setup('quick', exclude_suites: ['slow', 'thorough'], is_default: true,
9 env: ['RUST_BACKTRACE=1'])
10add_test_setup('slow', exclude_suites: ['thorough'],
11 env: ['G_TEST_SLOW=1', 'SPEED=slow', 'RUST_BACKTRACE=1'])
12add_test_setup('thorough',
13 env: ['G_TEST_SLOW=1', 'SPEED=thorough', 'RUST_BACKTRACE=1'])
Paolo Bonzini3d2f73e2021-02-11 06:15:12 -050014
Akihiko Odakicf60ccc2022-06-24 23:50:37 +090015meson.add_postconf_script(find_program('scripts/symlink-install-tree.py'))
16
Paolo Bonziniea444d92023-09-08 12:06:12 +020017####################
18# Global variables #
19####################
20
Paolo Bonzinia5665052019-06-10 12:05:14 +020021not_found = dependency('', required: false)
Paolo Bonzini654d6b02021-02-09 14:59:26 +010022keyval = import('keyval')
Paolo Bonzinibe3fc972024-10-15 10:08:57 +020023rust = import('rust')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040024ss = import('sourceset')
Richard Henderson8b18cdb2020-09-13 12:19:25 -070025fs = import('fs')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040026
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +010027host_os = host_machine.system()
Paolo Bonzinia5665052019-06-10 12:05:14 +020028config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +010029
Yonggang Luoe3667662020-10-16 06:06:25 +080030# Temporary directory used for files created while
31# configure runs. Since it is in the build directory
32# we can safely blow away any previous version of it
33# (and we need not jump through hoops to try to delete
34# it when configure exits.)
35tmpdir = meson.current_build_dir() / 'meson-private/temp'
Marc-André Lureau8fe11232020-09-11 14:42:48 +020036
37if get_option('qemu_suffix').startswith('/')
38 error('qemu_suffix cannot start with a /')
39endif
40
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040041qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
Marc-André Lureauab4c0992020-08-26 15:04:16 +040042qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040043qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040044qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
45
46qemu_desktopdir = get_option('datadir') / 'applications'
47qemu_icondir = get_option('datadir') / 'icons'
48
Paolo Bonzini859aef02020-08-04 18:14:26 +020049genh = []
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +010050qapi_trace_events = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020051
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020052bsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin']
Kohei Tokunagaccc403e2025-04-28 15:39:07 +090053supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux', 'emscripten']
Philippe Mathieu-Daudé278c1bc2023-06-27 16:32:34 +020054supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
Kohei Tokunagaccc403e2025-04-28 15:39:07 +090055 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64', 'wasm32']
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040056
57cpu = host_machine.cpu_family()
Richard Hendersonc94c2392021-11-16 10:50:42 +010058
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020059target_dirs = config_host['TARGET_DIRS'].split()
Paolo Bonzini44458a62023-09-08 12:06:57 +020060
Paolo Bonzinie2b39052024-10-18 19:33:22 +020061# type of binaries to build
62have_linux_user = false
63have_bsd_user = false
64have_system = false
65foreach target : target_dirs
66 have_linux_user = have_linux_user or target.endswith('linux-user')
67 have_bsd_user = have_bsd_user or target.endswith('bsd-user')
68 have_system = have_system or target.endswith('-softmmu')
69endforeach
70have_user = have_linux_user or have_bsd_user
71
Paolo Bonzini44458a62023-09-08 12:06:57 +020072############
73# Programs #
74############
75
76sh = find_program('sh')
77python = import('python').find_installation()
78
79cc = meson.get_compiler('c')
80all_languages = ['c']
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +010081if host_os == 'windows' and add_languages('cpp', required: false, native: false)
Paolo Bonzini44458a62023-09-08 12:06:57 +020082 all_languages += ['cpp']
83 cxx = meson.get_compiler('cpp')
84endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +010085if host_os == 'darwin' and \
Peter Maydell2ef938a2024-03-11 13:33:34 +000086 add_languages('objc', required: true, native: false)
Paolo Bonzini44458a62023-09-08 12:06:57 +020087 all_languages += ['objc']
88 objc = meson.get_compiler('objc')
89endif
Paolo Bonzinie2b39052024-10-18 19:33:22 +020090
91have_rust = add_languages('rust', native: false,
92 required: get_option('rust').disable_auto_if(not have_system))
93have_rust = have_rust and add_languages('rust', native: true,
94 required: get_option('rust').disable_auto_if(not have_system))
95if have_rust
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +030096 rustc = meson.get_compiler('rust')
Paolo Bonzinie0b2b742025-05-02 23:36:11 +020097 if rustc.version().version_compare('<1.77.0')
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +030098 if get_option('rust').enabled()
Paolo Bonzinie0b2b742025-05-02 23:36:11 +020099 error('rustc version ' + rustc.version() + ' is unsupported. Please upgrade to at least 1.77.0')
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +0300100 else
Paolo Bonzini4fe14692024-10-15 09:50:02 +0200101 warning('rustc version ' + rustc.version() + ' is unsupported, disabling Rust compilation.')
Paolo Bonzinie0b2b742025-05-02 23:36:11 +0200102 message('Please upgrade to at least 1.77.0 to use Rust.')
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +0300103 have_rust = false
104 endif
105 endif
106endif
Paolo Bonzini44458a62023-09-08 12:06:57 +0200107
Paolo Bonzinic2988df2024-10-15 15:00:41 +0200108if have_rust
109 bindgen = find_program('bindgen', required: get_option('rust'))
110 if not bindgen.found() or bindgen.version().version_compare('<0.60.0')
111 if get_option('rust').enabled()
112 error('bindgen version ' + bindgen.version() + ' is unsupported. You can install a new version with "cargo install bindgen-cli"')
113 else
114 if bindgen.found()
115 warning('bindgen version ' + bindgen.version() + ' is unsupported, disabling Rust compilation.')
116 else
117 warning('bindgen not found, disabling Rust compilation.')
118 endif
119 message('To use Rust you can install a new version with "cargo install bindgen-cli"')
120 have_rust = false
121 endif
122 endif
123endif
124
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +0200125if have_rust
Paolo Bonzini97ed1e92024-11-07 10:02:15 +0100126 rustc_args = [find_program('scripts/rust/rustc_args.py'),
Paolo Bonzini90868c32024-11-06 13:03:45 +0100127 '--rustc-version', rustc.version(),
128 '--workspace', meson.project_source_root() / 'rust']
Paolo Bonzinide98c172024-11-07 10:14:49 +0100129 if get_option('strict_rust_lints')
130 rustc_args += ['--strict-lints']
131 endif
132
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +0200133 rustfmt = find_program('rustfmt', required: false)
Paolo Bonzinif3a6e9b2024-11-12 11:54:11 +0100134
Paolo Bonzini90868c32024-11-06 13:03:45 +0100135 rustc_lint_args = run_command(rustc_args, '--lints',
136 capture: true, check: true).stdout().strip().splitlines()
Paolo Bonzinif3a6e9b2024-11-12 11:54:11 +0100137
Paolo Bonzinif3a6e9b2024-11-12 11:54:11 +0100138 # Apart from procedural macros, our Rust executables will often link
139 # with C code, so include all the libraries that C code needs. This
140 # is safe; https://github.com/rust-lang/rust/pull/54675 says that
141 # passing -nodefaultlibs to the linker "was more ideological to
142 # start with than anything".
143 add_project_arguments(rustc_lint_args +
144 ['--cfg', 'MESON', '-C', 'default-linker-libraries'],
145 native: false, language: 'rust')
146 add_project_arguments(rustc_lint_args + ['--cfg', 'MESON'],
147 native: true, language: 'rust')
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +0200148endif
149
Paolo Bonzini44458a62023-09-08 12:06:57 +0200150dtrace = not_found
151stap = not_found
152if 'dtrace' in get_option('trace_backends')
153 dtrace = find_program('dtrace', required: true)
154 stap = find_program('stap', required: false)
155 if stap.found()
156 # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
157 # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
158 # instead. QEMU --enable-modules depends on this because the SystemTap
159 # semaphores are linked into the main binary and not the module's shared
160 # object.
161 add_global_arguments('-DSTAP_SDT_V2',
162 native: false, language: all_languages)
163 endif
164endif
165
166if get_option('iasl') == ''
167 iasl = find_program('iasl', required: false)
168else
169 iasl = find_program(get_option('iasl'), required: true)
170endif
171
Xianglai Lib883fb92024-07-24 10:22:45 +0800172edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu', 'riscv64-softmmu', 'loongarch64-softmmu' ]
Paolo Bonzini44458a62023-09-08 12:06:57 +0200173unpack_edk2_blobs = false
174foreach target : edk2_targets
175 if target in target_dirs
176 bzip2 = find_program('bzip2', required: get_option('install_blobs'))
177 unpack_edk2_blobs = bzip2.found()
178 break
179 endif
180endforeach
181
182#####################
183# Option validation #
184#####################
185
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100186# Fuzzing
187if get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
188 not cc.links('''
189 #include <stdint.h>
190 #include <sys/types.h>
191 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
192 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
193 ''',
194 args: ['-Werror', '-fsanitize=fuzzer'])
195 error('Your compiler does not support -fsanitize=fuzzer')
196endif
197
198# Tracing backends
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100199if 'ftrace' in get_option('trace_backends') and host_os != 'linux'
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100200 error('ftrace is supported only on Linux')
201endif
202if 'syslog' in get_option('trace_backends') and not cc.compiles('''
203 #include <syslog.h>
204 int main(void) {
205 openlog("qemu", LOG_PID, LOG_DAEMON);
206 syslog(LOG_INFO, "configure");
207 return 0;
208 }''')
209 error('syslog is not supported on this system')
210endif
211
212# Miscellaneous Linux-only features
213get_option('mpath') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100214 .require(host_os == 'linux', error_message: 'Multipath is supported only on Linux')
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100215
216multiprocess_allowed = get_option('multiprocess') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100217 .require(host_os == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100218 .allowed()
219
220vfio_user_server_allowed = get_option('vfio_user_server') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100221 .require(host_os == 'linux', error_message: 'vfio-user server is supported only on Linux') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100222 .allowed()
223
224have_tpm = get_option('tpm') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100225 .require(host_os != 'windows', error_message: 'TPM emulation only available on POSIX systems') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100226 .allowed()
227
228# vhost
229have_vhost_user = get_option('vhost_user') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100230 .disable_auto_if(host_os != 'linux') \
231 .require(host_os != 'windows',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100232 error_message: 'vhost-user is not available on Windows').allowed()
233have_vhost_vdpa = get_option('vhost_vdpa') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100234 .require(host_os == 'linux',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100235 error_message: 'vhost-vdpa is only available on Linux').allowed()
236have_vhost_kernel = get_option('vhost_kernel') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100237 .require(host_os == 'linux',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100238 error_message: 'vhost-kernel is only available on Linux').allowed()
239have_vhost_user_crypto = get_option('vhost_crypto') \
240 .require(have_vhost_user,
241 error_message: 'vhost-crypto requires vhost-user to be enabled').allowed()
242
243have_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel
244
245have_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed()
246have_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed()
247have_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed()
248have_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa
249
Paolo Bonzinie3c426c2022-05-09 12:50:29 +0200250have_tcg = get_option('tcg').allowed() and (have_system or have_user)
251
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200252have_tools = get_option('tools') \
253 .disable_auto_if(not have_system) \
254 .allowed()
255have_ga = get_option('guest_agent') \
256 .disable_auto_if(not have_system and not have_tools) \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100257 .require(host_os in ['sunos', 'linux', 'windows', 'freebsd', 'netbsd', 'openbsd'],
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200258 error_message: 'unsupported OS for QEMU guest agent') \
259 .allowed()
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100260have_block = have_system or have_tools
261
Paolo Bonzini60027112022-10-20 14:53:10 +0200262enable_modules = get_option('modules') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100263 .require(host_os != 'windows',
Paolo Bonzini60027112022-10-20 14:53:10 +0200264 error_message: 'Modules are not available for Windows') \
265 .require(not get_option('prefer_static'),
266 error_message: 'Modules are incompatible with static linking') \
267 .allowed()
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200268
Paolo Bonziniea444d92023-09-08 12:06:12 +0200269#######################################
270# Variables for host and accelerators #
271#######################################
272
Paolo Bonzini823eb012021-11-08 14:18:17 +0100273if cpu not in supported_cpus
274 host_arch = 'unknown'
275elif cpu == 'x86'
276 host_arch = 'i386'
Richard Henderson0e3ed772021-12-31 05:25:11 +0000277elif cpu == 'mips64'
278 host_arch = 'mips'
Philippe Mathieu-Daudé278c1bc2023-06-27 16:32:34 +0200279elif cpu in ['riscv32', 'riscv64']
280 host_arch = 'riscv'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100281else
282 host_arch = cpu
283endif
284
Richard Henderson33614fa2025-02-03 12:28:59 -0800285if cpu == 'x86'
286 kvm_targets = ['i386-softmmu']
287elif cpu == 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400288 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
289elif cpu == 'aarch64'
290 kvm_targets = ['aarch64-softmmu']
291elif cpu == 's390x'
292 kvm_targets = ['s390x-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800293elif cpu == 'ppc'
294 kvm_targets = ['ppc-softmmu']
295elif cpu == 'ppc64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400296 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800297elif cpu == 'mips'
298 kvm_targets = ['mips-softmmu', 'mipsel-softmmu']
299elif cpu == 'mips64'
Huacai Chenfbc58842020-10-07 16:39:28 +0800300 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800301elif cpu == 'riscv32'
Philippe Mathieu-Daudé4de81092023-06-27 16:32:35 +0200302 kvm_targets = ['riscv32-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800303elif cpu == 'riscv64'
Philippe Mathieu-Daudé4de81092023-06-27 16:32:35 +0200304 kvm_targets = ['riscv64-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800305elif cpu == 'loongarch64'
Tianrui Zhao714b03c2024-01-05 15:58:04 +0800306 kvm_targets = ['loongarch64-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400307else
308 kvm_targets = []
309endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400310accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alexander Graf844a06b2021-09-16 17:54:02 +0200311
Richard Henderson807a85d2025-02-04 08:16:36 -0800312if cpu == 'x86'
313 xen_targets = ['i386-softmmu']
314elif cpu == 'x86_64'
Paolo Bonzini16b62732023-12-09 15:31:15 +0100315 xen_targets = ['i386-softmmu', 'x86_64-softmmu']
Richard Henderson807a85d2025-02-04 08:16:36 -0800316elif cpu == 'arm'
317 # i386 emulator provides xenpv machine type for multiple architectures
318 xen_targets = ['i386-softmmu']
319elif cpu == 'aarch64'
Paolo Bonzini16b62732023-12-09 15:31:15 +0100320 # i386 emulator provides xenpv machine type for multiple architectures
321 xen_targets = ['i386-softmmu', 'x86_64-softmmu', 'aarch64-softmmu']
322else
323 xen_targets = []
324endif
325accelerator_targets += { 'CONFIG_XEN': xen_targets }
326
Richard Henderson83ef4862025-02-04 08:20:42 -0800327if cpu == 'aarch64'
Alexander Graf844a06b2021-09-16 17:54:02 +0200328 accelerator_targets += {
329 'CONFIG_HVF': ['aarch64-softmmu']
330 }
Richard Henderson83ef4862025-02-04 08:20:42 -0800331elif cpu == 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400332 accelerator_targets += {
Paolo Bonzini8a199802020-09-18 05:37:01 -0400333 'CONFIG_HVF': ['x86_64-softmmu'],
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200334 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400335 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
336 }
337endif
338
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400339##################
340# Compiler flags #
341##################
342
Paolo Bonzini13f60de2022-10-20 14:34:27 +0200343foreach lang : all_languages
344 compiler = meson.get_compiler(lang)
345 if compiler.get_id() == 'gcc' and compiler.version().version_compare('>=7.4')
346 # ok
347 elif compiler.get_id() == 'clang' and compiler.compiles('''
348 #ifdef __apple_build_version__
Thomas Huth4e035202024-11-26 09:10:54 +0100349 # if __clang_major__ < 15 || (__clang_major__ == 15 && __clang_minor__ < 0)
350 # error You need at least XCode Clang v15.0 to compile QEMU
Paolo Bonzini13f60de2022-10-20 14:34:27 +0200351 # endif
352 #else
353 # if __clang_major__ < 10 || (__clang_major__ == 10 && __clang_minor__ < 0)
354 # error You need at least Clang v10.0 to compile QEMU
355 # endif
356 #endif''')
357 # ok
Kohei Tokunagaccc403e2025-04-28 15:39:07 +0900358 elif compiler.get_id() == 'emscripten'
359 # ok
Paolo Bonzini13f60de2022-10-20 14:34:27 +0200360 else
Thomas Huth4e035202024-11-26 09:10:54 +0100361 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 +0200362 endif
363endforeach
364
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200365# default flags for all hosts
366# We use -fwrapv to tell the compiler that we require a C dialect where
367# left shift of signed integers is well defined and has the expected
368# 2s-complement style results. (Both clang and gcc agree that it
369# provides these semantics.)
370
371qemu_common_flags = [
372 '-D_GNU_SOURCE', '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE_SOURCE',
373 '-fno-strict-aliasing', '-fno-common', '-fwrapv' ]
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200374qemu_cflags = []
Paolo Bonzini911d4ca2022-10-12 12:46:23 +0200375qemu_ldflags = []
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100376
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100377if host_os == 'darwin'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200378 # Disable attempts to use ObjectiveC features in os/object.h since they
379 # won't work when we're compiling with gcc as a C compiler.
Alexander Graf2fc36532023-08-30 16:14:14 +0000380 if compiler.get_id() == 'gcc'
381 qemu_common_flags += '-DOS_OBJECT_USE_OBJC=0'
382 endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100383elif host_os == 'sunos'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200384 # needed for CMSG_ macros in sys/socket.h
385 qemu_common_flags += '-D_XOPEN_SOURCE=600'
386 # needed for TIOCWIN* defines in termios.h
387 qemu_common_flags += '-D__EXTENSIONS__'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100388elif host_os == 'haiku'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200389 qemu_common_flags += ['-DB_USE_POSITIVE_POSIX_ERRORS', '-D_BSD_SOURCE', '-fPIC']
Pierrick Bouvier923710b2025-01-16 16:02:54 +0000390elif host_os == 'windows'
391 # plugins use delaylib, and clang needs to be used with lld to make it work.
392 if compiler.get_id() == 'clang' and compiler.get_linker_id() != 'ld.lld'
393 error('On windows, you need to use lld with clang - use msys2 clang64/clangarm64 env')
394 endif
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200395endif
396
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200397# Choose instruction set (currently x86-only)
398
399qemu_isa_flags = []
400
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200401# __sync_fetch_and_and requires at least -march=i486. Many toolchains
402# use i686 as default anyway, but for those that don't, an explicit
403# specification is necessary
404if host_arch == 'i386' and not cc.links('''
405 static int sfaa(int *ptr)
406 {
407 return __sync_fetch_and_and(ptr, 0);
408 }
409
410 int main(void)
411 {
412 int val = 42;
413 val = __sync_val_compare_and_swap(&val, 0, 1);
414 sfaa(&val);
415 return val;
416 }''')
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200417 qemu_isa_flags += ['-march=i486']
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200418endif
419
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200420# Pick x86-64 baseline version
Paolo Bonzini294ac642024-05-31 10:37:06 +0200421if host_arch in ['i386', 'x86_64']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200422 if get_option('x86_version') == '0' and host_arch == 'x86_64'
423 error('x86_64-v1 required for x86-64 hosts')
424 endif
425
426 # add flags for individual instruction set extensions
427 if get_option('x86_version') >= '1'
428 if host_arch == 'i386'
429 qemu_common_flags = ['-mfpmath=sse'] + qemu_common_flags
430 else
431 # present on basically all processors but technically not part of
432 # x86-64-v1, so only include -mneeded for x86-64 version 2 and above
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200433 qemu_isa_flags += ['-mcx16']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200434 endif
435 endif
436 if get_option('x86_version') >= '2'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200437 qemu_isa_flags += ['-mpopcnt']
438 qemu_isa_flags += cc.get_supported_arguments('-mneeded')
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200439 endif
440 if get_option('x86_version') >= '3'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200441 qemu_isa_flags += ['-mmovbe', '-mabm', '-mbmi', '-mbmi2', '-mfma', '-mf16c']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200442 endif
443
444 # add required vector instruction set (each level implies those below)
445 if get_option('x86_version') == '1'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200446 qemu_isa_flags += ['-msse2']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200447 elif get_option('x86_version') == '2'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200448 qemu_isa_flags += ['-msse4.2']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200449 elif get_option('x86_version') == '3'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200450 qemu_isa_flags += ['-mavx2']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200451 elif get_option('x86_version') == '4'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200452 qemu_isa_flags += ['-mavx512f', '-mavx512bw', '-mavx512cd', '-mavx512dq', '-mavx512vl']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200453 endif
Artyom Kunakovskyc2bf2cc2024-05-23 08:11:18 +0300454endif
455
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200456qemu_common_flags = qemu_isa_flags + qemu_common_flags
457
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +0200458if get_option('prefer_static')
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100459 qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
460endif
461
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200462# Meson currently only handles pie as a boolean for now, so if the user
463# has explicitly disabled PIE we need to extend our cflags.
Paolo Bonzinib03fcd62023-05-22 10:05:33 +0200464#
465# -no-pie is supposedly a linker flag that has no effect on the compiler
466# command line, but some distros, that didn't quite know what they were
467# doing, made local changes to gcc's specs file that turned it into
468# a compiler command-line flag.
469#
470# What about linker flags? For a static build, no PIE is implied by -static
471# which we added above (and if it's not because of the same specs patching,
472# there's nothing we can do: compilation will fail, report a bug to your
473# distro and do not use --disable-pie in the meanwhile). For dynamic linking,
474# instead, we can't add -no-pie because it overrides -shared: the linker then
475# tries to build an executable instead of a shared library and fails. So
476# don't add -no-pie anywhere and cross fingers. :(
Kohei Tokunagaccc403e2025-04-28 15:39:07 +0900477#
478# Emscripten doesn't support -no-pie but meson can't catch the compiler
479# warning. So explicitly omit the flag for Emscripten.
480if not get_option('b_pie') and host_os != 'emscripten'
Paolo Bonzinib03fcd62023-05-22 10:05:33 +0200481 qemu_common_flags += cc.get_supported_arguments('-fno-pie', '-no-pie')
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200482endif
483
Paolo Bonzini911d4ca2022-10-12 12:46:23 +0200484if not get_option('stack_protector').disabled()
485 stack_protector_probe = '''
486 int main(int argc, char *argv[])
487 {
488 char arr[64], *p = arr, *c = argv[argc - 1];
489 while (*c) {
490 *p++ = *c++;
491 }
492 return 0;
493 }'''
494 have_stack_protector = false
495 foreach arg : ['-fstack-protector-strong', '-fstack-protector-all']
496 # We need to check both a compile and a link, since some compiler
497 # setups fail only on a .c->.o compile and some only at link time
498 if cc.compiles(stack_protector_probe, args: ['-Werror', arg]) and \
499 cc.links(stack_protector_probe, args: ['-Werror', arg])
500 have_stack_protector = true
501 qemu_cflags += arg
502 qemu_ldflags += arg
503 break
504 endif
505 endforeach
506 get_option('stack_protector') \
507 .require(have_stack_protector, error_message: 'Stack protector not supported')
508endif
509
Paolo Bonzini67398252022-10-12 13:19:35 +0200510coroutine_backend = get_option('coroutine_backend')
511ucontext_probe = '''
512 #include <ucontext.h>
513 #ifdef __stub_makecontext
514 #error Ignoring glibc stub makecontext which will always fail
515 #endif
516 int main(void) { makecontext(0, 0, 0); return 0; }'''
517
518# On Windows the only valid backend is the Windows specific one.
519# For POSIX prefer ucontext, but it's not always possible. The fallback
520# is sigcontext.
521supported_backends = []
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100522if host_os == 'windows'
Paolo Bonzini67398252022-10-12 13:19:35 +0200523 supported_backends += ['windows']
Kohei Tokunagaccc403e2025-04-28 15:39:07 +0900524elif host_os == 'emscripten'
525 supported_backends += ['wasm']
Paolo Bonzini67398252022-10-12 13:19:35 +0200526else
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100527 if host_os != 'darwin' and cc.links(ucontext_probe)
Paolo Bonzini67398252022-10-12 13:19:35 +0200528 supported_backends += ['ucontext']
529 endif
530 supported_backends += ['sigaltstack']
531endif
532
533if coroutine_backend == 'auto'
534 coroutine_backend = supported_backends[0]
535elif coroutine_backend not in supported_backends
536 error('"@0@" backend requested but not available. Available backends: @1@' \
537 .format(coroutine_backend, ', '.join(supported_backends)))
538endif
539
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200540# Compiles if SafeStack *not* enabled
541safe_stack_probe = '''
542 int main(void)
543 {
544 #if defined(__has_feature)
545 #if __has_feature(safe_stack)
546 #error SafeStack Enabled
547 #endif
548 #endif
549 return 0;
550 }'''
551if get_option('safe_stack') != not cc.compiles(safe_stack_probe)
552 safe_stack_arg = get_option('safe_stack') ? '-fsanitize=safe-stack' : '-fno-sanitize=safe-stack'
553 if get_option('safe_stack') != not cc.compiles(safe_stack_probe, args: safe_stack_arg)
554 error(get_option('safe_stack') \
555 ? 'SafeStack not supported by your compiler' \
556 : 'Cannot disable SafeStack')
557 endif
558 qemu_cflags += safe_stack_arg
559 qemu_ldflags += safe_stack_arg
560endif
Paolo Bonzini67398252022-10-12 13:19:35 +0200561if get_option('safe_stack') and coroutine_backend != 'ucontext'
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200562 error('SafeStack is only supported with the ucontext coroutine backend')
563endif
564
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000565if get_option('asan')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100566 if cc.has_argument('-fsanitize=address')
567 qemu_cflags = ['-fsanitize=address'] + qemu_cflags
568 qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000569 else
570 error('Your compiler does not support -fsanitize=address')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100571 endif
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000572endif
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100573
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000574if get_option('ubsan')
575 # Detect static linking issue with ubsan:
576 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100577 if cc.links('int main(int argc, char **argv) { return argc + 1; }',
578 args: [qemu_ldflags, '-fsanitize=undefined'])
Richard Hendersondb770a22024-08-13 19:52:16 +1000579 qemu_cflags += ['-fsanitize=undefined']
580 qemu_ldflags += ['-fsanitize=undefined']
581
582 # Suppress undefined behaviour from function call to mismatched type.
583 # In addition, tcg prologue does not emit function type prefix
584 # required by function call sanitizer.
585 if cc.has_argument('-fno-sanitize=function')
586 qemu_cflags += ['-fno-sanitize=function']
587 endif
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000588 else
589 error('Your compiler does not support -fsanitize=undefined')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100590 endif
591endif
592
593# Thread sanitizer is, for now, much noisier than the other sanitizers;
594# keep it separate until that is not the case.
595if get_option('tsan')
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000596 if get_option('asan') or get_option('ubsan')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100597 error('TSAN is not supported with other sanitizers')
598 endif
599 if not cc.has_function('__tsan_create_fiber',
600 args: '-fsanitize=thread',
601 prefix: '#include <sanitizer/tsan_interface.h>')
602 error('Cannot enable TSAN due to missing fiber annotation interface')
603 endif
Pierrick Bouviercf6fbba2024-10-23 12:33:52 +0100604 tsan_warn_suppress = []
605 # gcc (>=11) will report constructions not supported by tsan:
606 # "error: ‘atomic_thread_fence’ is not supported with ‘-fsanitize=thread’"
607 # https://gcc.gnu.org/gcc-11/changes.html
608 # However, clang does not support this warning and this triggers an error.
609 if cc.has_argument('-Wno-tsan')
610 tsan_warn_suppress = ['-Wno-tsan']
611 endif
612 qemu_cflags = ['-fsanitize=thread'] + tsan_warn_suppress + qemu_cflags
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100613 qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags
614endif
615
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100616# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
617# The combination is known as "full relro", because .got.plt is read-only too.
618qemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
619
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100620if host_os == 'windows'
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200621 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat')
Paolo Bonzini2d73fa72022-11-02 13:03:51 +0100622 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200623endif
624
Paolo Bonzini537b7242021-10-07 15:08:12 +0200625if get_option('fuzzing')
Paolo Bonzini537b7242021-10-07 15:08:12 +0200626 # Specify a filter to only instrument code that is directly related to
627 # virtual-devices.
628 configure_file(output: 'instrumentation-filter',
629 input: 'scripts/oss-fuzz/instrumentation-filter-template',
630 copy: true)
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400631
632 if cc.compiles('int main () { return 0; }',
633 name: '-fsanitize-coverage-allowlist=/dev/null',
Alexander Bulekove56d0972022-06-21 16:45:07 -0400634 args: ['-fsanitize-coverage-allowlist=/dev/null',
635 '-fsanitize-coverage=trace-pc'] )
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200636 qemu_common_flags += ['-fsanitize-coverage-allowlist=instrumentation-filter']
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400637 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +0200638
639 if get_option('fuzzing_engine') == ''
640 # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
641 # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link
642 # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
643 # unable to bind the fuzzer-related callbacks added by instrumentation.
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200644 qemu_common_flags += ['-fsanitize=fuzzer-no-link']
645 qemu_ldflags += ['-fsanitize=fuzzer-no-link']
Paolo Bonzini537b7242021-10-07 15:08:12 +0200646 # For the actual fuzzer binaries, we need to link against the libfuzzer
647 # library. They need to be configurable, to support OSS-Fuzz
648 fuzz_exe_ldflags = ['-fsanitize=fuzzer']
649 else
650 # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
651 # the needed CFLAGS have already been provided
652 fuzz_exe_ldflags = get_option('fuzzing_engine').split()
653 endif
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400654endif
655
Paolo Bonzini82761292023-05-10 14:54:30 +0200656if get_option('cfi')
657 cfi_flags=[]
658 # Check for dependency on LTO
659 if not get_option('b_lto')
660 error('Selected Control-Flow Integrity but LTO is disabled')
661 endif
662 if enable_modules
663 error('Selected Control-Flow Integrity is not compatible with modules')
664 endif
665 # Check for cfi flags. CFI requires LTO so we can't use
666 # get_supported_arguments, but need a more complex "compiles" which allows
667 # custom arguments
668 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
669 args: ['-flto', '-fsanitize=cfi-icall'] )
670 cfi_flags += '-fsanitize=cfi-icall'
671 else
672 error('-fsanitize=cfi-icall is not supported by the compiler')
673 endif
674 if cc.compiles('int main () { return 0; }',
675 name: '-fsanitize-cfi-icall-generalize-pointers',
676 args: ['-flto', '-fsanitize=cfi-icall',
677 '-fsanitize-cfi-icall-generalize-pointers'] )
678 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
679 else
680 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
681 endif
682 if get_option('cfi_debug')
683 if cc.compiles('int main () { return 0; }',
684 name: '-fno-sanitize-trap=cfi-icall',
685 args: ['-flto', '-fsanitize=cfi-icall',
686 '-fno-sanitize-trap=cfi-icall'] )
687 cfi_flags += '-fno-sanitize-trap=cfi-icall'
688 else
689 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
690 endif
691 endif
692 add_global_arguments(cfi_flags, native: false, language: all_languages)
693 add_global_link_arguments(cfi_flags, native: false, language: all_languages)
694endif
695
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000696# Check further flags that make QEMU more robust against malicious parties
697
698hardening_flags = [
Daniel P. Berrangé7ff9ff032024-01-03 12:34:14 +0000699 # Initialize all stack variables to zero. This makes
700 # it harder to take advantage of uninitialized stack
701 # data to drive exploits
702 '-ftrivial-auto-var-init=zero',
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000703]
704
Daniel P. Berrangé95633112024-03-04 14:44:55 +0000705# Zero out registers used during a function call
706# upon its return. This makes it harder to assemble
707# ROP gadgets into something usable
708#
709# NB: Clang 17 is broken and SEGVs
710# https://github.com/llvm/llvm-project/issues/75168
Thomas Huth2d6d9952024-04-11 14:08:19 +0200711#
712# NB2: This clashes with the "retguard" extension of OpenBSD's Clang
713# https://gitlab.com/qemu-project/qemu/-/issues/2278
714if host_os != 'openbsd' and \
715 cc.compiles('extern struct { void (*cb)(void); } s; void f(void) { s.cb(); }',
Daniel P. Berrangé95633112024-03-04 14:44:55 +0000716 name: '-fzero-call-used-regs=used-gpr',
717 args: ['-O2', '-fzero-call-used-regs=used-gpr'])
718 hardening_flags += '-fzero-call-used-regs=used-gpr'
719endif
720
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000721qemu_common_flags += cc.get_supported_arguments(hardening_flags)
722
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200723add_global_arguments(qemu_common_flags, native: false, language: all_languages)
724add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
725
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100726# Collect warning flags we want to set, sorted alphabetically
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100727warn_flags = [
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100728 # First enable interesting warnings
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100729 '-Wempty-body',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100730 '-Wendif-labels',
731 '-Wexpansion-to-defined',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100732 '-Wformat-security',
733 '-Wformat-y2k',
734 '-Wignored-qualifiers',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100735 '-Wimplicit-fallthrough=2',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100736 '-Winit-self',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100737 '-Wmissing-format-attribute',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100738 '-Wmissing-prototypes',
739 '-Wnested-externs',
740 '-Wold-style-declaration',
741 '-Wold-style-definition',
742 '-Wredundant-decls',
743 '-Wshadow=local',
744 '-Wstrict-prototypes',
745 '-Wtype-limits',
746 '-Wundef',
Peter Maydell64c1a542024-02-21 17:26:36 +0100747 '-Wvla',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100748 '-Wwrite-strings',
749
750 # Then disable some undesirable warnings
751 '-Wno-gnu-variable-sized-type-not-at-end',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100752 '-Wno-initializer-overrides',
753 '-Wno-missing-include-dirs',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100754 '-Wno-psabi',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100755 '-Wno-shift-negative-value',
756 '-Wno-string-plus-int',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100757 '-Wno-tautological-type-limit-compare',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100758 '-Wno-typedef-redefinition',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100759]
760
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100761if host_os != 'darwin'
Kevin Wolf7e171112024-06-27 20:12:45 +0200762 tsa_has_cleanup = cc.compiles('''
763 struct __attribute__((capability("mutex"))) mutex {};
764 void lock(struct mutex *m) __attribute__((acquire_capability(m)));
765 void unlock(struct mutex *m) __attribute__((release_capability(m)));
766
767 void test(void) {
768 struct mutex __attribute__((cleanup(unlock))) m;
769 lock(&m);
770 }
771 ''', args: ['-Wthread-safety', '-Werror'])
772 if tsa_has_cleanup
773 warn_flags += ['-Wthread-safety']
774 endif
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100775endif
776
Thomas Huth785abf02023-07-06 08:47:36 +0200777# Set up C++ compiler flags
Paolo Bonzinib4854582021-11-08 12:31:52 +0100778qemu_cxxflags = []
Paolo Bonzinie5134022022-10-12 14:15:06 +0200779if 'cpp' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100780 qemu_cxxflags = ['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'] + qemu_cflags
Paolo Bonzinib4854582021-11-08 12:31:52 +0100781endif
782
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200783add_project_arguments(qemu_cflags, native: false, language: 'c')
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100784add_project_arguments(cc.get_supported_arguments(warn_flags), native: false, language: 'c')
785if 'cpp' in all_languages
786 add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
787 add_project_arguments(cxx.get_supported_arguments(warn_flags), native: false, language: 'cpp')
788endif
789if 'objc' in all_languages
790 # Note sanitizer flags are not applied to Objective-C sources!
791 add_project_arguments(objc.get_supported_arguments(warn_flags), native: false, language: 'objc')
792endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100793if host_os == 'linux'
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400794 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
795 '-isystem', 'linux-headers',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200796 language: all_languages)
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400797endif
798
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100799add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400800 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400801 '-iquote', meson.current_source_dir() / 'include',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200802 language: all_languages)
Paolo Bonzinia5665052019-06-10 12:05:14 +0200803
Richard Henderson44fc7162023-05-17 17:48:34 -0700804# If a host-specific include directory exists, list that first...
805host_include = meson.current_source_dir() / 'host/include/'
806if fs.is_dir(host_include / host_arch)
807 add_project_arguments('-iquote', host_include / host_arch,
808 language: all_languages)
809endif
810# ... followed by the generic fallback.
811add_project_arguments('-iquote', host_include / 'generic',
812 language: all_languages)
813
Paolo Bonzinideb62372020-09-01 07:51:16 -0400814sparse = find_program('cgcc', required: get_option('sparse'))
815if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100816 run_target('sparse',
817 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400818 'compile_commands.json', sparse.full_path(), '-Wbitwise',
819 '-Wno-transparent-union', '-Wno-old-initializer',
820 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100821endif
822
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200823#####################################
824# Host-specific libraries and flags #
825#####################################
826
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200827libm = cc.find_library('m', required: false)
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +0200828threads = dependency('threads')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400829util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200830winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400831socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400832version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400833coref = []
834iokit = []
Phil Dennis-Jordan23521592023-06-14 22:57:33 +0000835pvg = not_found
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400836emulator_link_args = []
Marc-André Lureau23011f42022-02-01 12:55:21 +0400837midl = not_found
838widl = not_found
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900839pathcch = not_found
Paolo Bonzinia6305082021-10-07 15:08:15 +0200840host_dsosuf = '.so'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100841if host_os == 'windows'
Marc-André Lureau23011f42022-02-01 12:55:21 +0400842 midl = find_program('midl', required: false)
843 widl = find_program('widl', required: false)
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900844 pathcch = cc.find_library('pathcch')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400845 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200846 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400847
848 win = import('windows')
849 version_res = win.compile_resources('version.rc',
850 depend_files: files('pc-bios/qemu-nsis.ico'),
851 include_directories: include_directories('.'))
Paolo Bonzinia6305082021-10-07 15:08:15 +0200852 host_dsosuf = '.dll'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100853elif host_os == 'darwin'
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400854 coref = dependency('appleframeworks', modules: 'CoreFoundation')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700855 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
Paolo Bonzinia6305082021-10-07 15:08:15 +0200856 host_dsosuf = '.dylib'
Paolo Bonzinid50ea7f2025-02-20 14:20:27 +0100857 pvg = dependency('appleframeworks', modules: ['ParavirtualizedGraphics', 'Metal'],
858 required: get_option('pvg'))
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100859elif host_os == 'sunos'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200860 socket = [cc.find_library('socket'),
861 cc.find_library('nsl'),
862 cc.find_library('resolv')]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100863elif host_os == 'haiku'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200864 socket = [cc.find_library('posix_error_mapper'),
865 cc.find_library('network'),
866 cc.find_library('bsd')]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100867elif host_os == 'openbsd'
Paolo Bonzinie3c426c2022-05-09 12:50:29 +0200868 if have_tcg
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400869 # Disable OpenBSD W^X if available
870 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
871 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400872endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200873
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200874###############################################
875# Host-specific configuration of accelerators #
876###############################################
877
Paolo Bonzini8a199802020-09-18 05:37:01 -0400878accelerators = []
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100879if get_option('kvm').allowed() and host_os == 'linux'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400880 accelerators += 'CONFIG_KVM'
881endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100882if get_option('whpx').allowed() and host_os == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000883 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400884 error('WHPX requires 64-bit host')
Philippe Mathieu-Daudé641b8412023-06-24 15:31:44 +0200885 elif cc.has_header('winhvplatform.h', required: get_option('whpx')) and \
886 cc.has_header('winhvemulation.h', required: get_option('whpx'))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400887 accelerators += 'CONFIG_WHPX'
888 endif
889endif
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200890
891hvf = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100892if get_option('hvf').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400893 hvf = dependency('appleframeworks', modules: 'Hypervisor',
894 required: get_option('hvf'))
895 if hvf.found()
896 accelerators += 'CONFIG_HVF'
897 endif
898endif
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200899
900nvmm = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100901if host_os == 'netbsd'
nia0cc49652021-10-13 13:54:17 +0000902 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200903 if nvmm.found()
904 accelerators += 'CONFIG_NVMM'
905 endif
906endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100907
Paolo Bonzini823eb012021-11-08 14:18:17 +0100908tcg_arch = host_arch
Paolo Bonzinie3c426c2022-05-09 12:50:29 +0200909if have_tcg
Paolo Bonzini823eb012021-11-08 14:18:17 +0100910 if host_arch == 'unknown'
Paolo Bonzinia24f15d2023-08-04 11:29:05 +0200911 if not get_option('tcg_interpreter')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400912 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
913 endif
Kohei Tokunagaccc403e2025-04-28 15:39:07 +0900914 elif host_arch == 'wasm32'
915 if not get_option('tcg_interpreter')
916 error('WebAssembly host requires --enable-tcg-interpreter')
917 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100918 elif get_option('tcg_interpreter')
Philippe Mathieu-Daudé1c282da2021-05-21 12:34:23 +0200919 warning('Use of the TCG interpreter is not recommended on this host')
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100920 warning('architecture. There is a native TCG execution backend available')
921 warning('which provides substantially better performance and reliability.')
922 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
923 warning('configuration option on this architecture to use the native')
924 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400925 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100926 if get_option('tcg_interpreter')
927 tcg_arch = 'tci'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100928 elif host_arch == 'x86_64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100929 tcg_arch = 'i386'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100930 elif host_arch == 'ppc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100931 tcg_arch = 'ppc'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100932 endif
933 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzinie5134022022-10-12 14:15:06 +0200934 language: all_languages)
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100935
Paolo Bonzini8a199802020-09-18 05:37:01 -0400936 accelerators += 'CONFIG_TCG'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400937endif
938
939if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
940 error('KVM not available on this platform')
941endif
942if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
943 error('HVF not available on this platform')
944endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200945if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
946 error('NVMM not available on this platform')
947endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400948if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
949 error('WHPX not available on this platform')
950endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400951
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200952xen = not_found
953if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
954 xencontrol = dependency('xencontrol', required: false,
955 method: 'pkg-config')
956 if xencontrol.found()
957 xen_pc = declare_dependency(version: xencontrol.version(),
958 dependencies: [
959 xencontrol,
960 # disabler: true makes xen_pc.found() return false if any is not found
961 dependency('xenstore', required: false,
962 method: 'pkg-config',
963 disabler: true),
964 dependency('xenforeignmemory', required: false,
965 method: 'pkg-config',
966 disabler: true),
967 dependency('xengnttab', required: false,
968 method: 'pkg-config',
969 disabler: true),
970 dependency('xenevtchn', required: false,
971 method: 'pkg-config',
972 disabler: true),
973 dependency('xendevicemodel', required: false,
974 method: 'pkg-config',
975 disabler: true),
976 # optional, no "disabler: true"
977 dependency('xentoolcore', required: false,
978 method: 'pkg-config')])
979 if xen_pc.found()
980 xen = xen_pc
981 endif
982 endif
983 if not xen.found()
984 xen_tests = [ '4.11.0', '4.10.0', '4.9.0', '4.8.0', '4.7.1' ]
985 xen_libs = {
986 '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
987 '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
988 '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
989 '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
990 '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
991 }
992 xen_deps = {}
993 foreach ver: xen_tests
994 # cache the various library tests to avoid polluting the logs
995 xen_test_deps = []
996 foreach l: xen_libs[ver]
997 if l not in xen_deps
998 xen_deps += { l: cc.find_library(l, required: false) }
999 endif
1000 xen_test_deps += xen_deps[l]
1001 endforeach
1002
1003 # Use -D to pick just one of the test programs in scripts/xen-detect.c
1004 xen_version = ver.split('.')
1005 xen_ctrl_version = xen_version[0] + \
1006 ('0' + xen_version[1]).substring(-2) + \
1007 ('0' + xen_version[2]).substring(-2)
1008 if cc.links(files('scripts/xen-detect.c'),
1009 args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
1010 dependencies: xen_test_deps)
1011 xen = declare_dependency(version: ver, dependencies: xen_test_deps)
1012 break
1013 endif
1014 endforeach
1015 endif
1016 if xen.found()
1017 accelerators += 'CONFIG_XEN'
1018 elif get_option('xen').enabled()
1019 error('could not compile and link Xen test program')
1020 endif
1021endif
1022have_xen_pci_passthrough = get_option('xen_pci_passthrough') \
1023 .require(xen.found(),
1024 error_message: 'Xen PCI passthrough requested but Xen not enabled') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001025 .require(host_os == 'linux',
Paolo Bonzini0f63d962023-09-08 12:08:53 +02001026 error_message: 'Xen PCI passthrough not available on this platform') \
1027 .require(cpu == 'x86' or cpu == 'x86_64',
1028 error_message: 'Xen PCI passthrough not available on this platform') \
1029 .allowed()
1030
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001031################
1032# Dependencies #
1033################
1034
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001035# When bumping glib minimum version, please check also whether to increase
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03001036# the _WIN32_WINNT setting in osdep.h according to the value from glib.
1037# You should also check if any of the glib.version() checks
1038# below can also be removed.
Thomas Huth0d8caac2024-04-18 12:10:50 +02001039glib_req_ver = '>=2.66.0'
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001040glib_pc = dependency('glib-2.0', version: glib_req_ver, required: true,
1041 method: 'pkg-config')
1042glib_cflags = []
Paolo Bonzini60027112022-10-20 14:53:10 +02001043if enable_modules
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001044 gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true,
1045 method: 'pkg-config')
Paolo Bonzini2c13c572023-08-30 12:20:53 +02001046elif get_option('plugins')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001047 gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true,
1048 method: 'pkg-config')
1049else
1050 gmodule = not_found
Emilio Cotae3feb2c2023-02-05 11:37:57 -05001051endif
Marc-André Lureau953d5a92020-12-15 12:03:19 +04001052
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001053# This workaround is required due to a bug in pkg-config file for glib as it
1054# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001055if host_os == 'windows' and get_option('prefer_static')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001056 glib_cflags += ['-DGLIB_STATIC_COMPILATION']
1057endif
1058
1059# Sanity check that the current size_t matches the
1060# size that glib thinks it should be. This catches
1061# problems on multi-arch where people try to build
1062# 32-bit QEMU while pointing at 64-bit glib headers
1063
1064if not cc.compiles('''
1065 #include <glib.h>
1066 #include <unistd.h>
1067
1068 #define QEMU_BUILD_BUG_ON(x) \
1069 typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
1070
1071 int main(void) {
1072 QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
1073 return 0;
1074 }''', dependencies: glib_pc, args: glib_cflags)
1075 error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T.
1076 You probably need to set PKG_CONFIG_LIBDIR" to point
1077 to the right pkg-config files for your build target.''')
1078endif
1079
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001080glib = declare_dependency(dependencies: [glib_pc, gmodule],
1081 compile_args: glib_cflags,
1082 version: glib_pc.version())
1083
1084# Check whether glib has gslice, which we have to avoid for correctness.
1085# TODO: remove this check and the corresponding workaround (qtree) when
1086# the minimum supported glib is >= 2.75.3
1087glib_has_gslice = glib.version().version_compare('<2.75.3')
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03001088# Check whether glib has the aligned_alloc family of functions.
1089# <https://docs.gtk.org/glib/func.aligned_alloc.html>
1090glib_has_aligned_alloc = glib.version().version_compare('>=2.72.0')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001091
1092# override glib dep to include the above refinements
1093meson.override_dependency('glib-2.0', glib)
1094
1095# The path to glib.h is added to all compilation commands.
1096add_project_dependencies(glib.partial_dependency(compile_args: true, includes: true),
1097 native: false, language: all_languages)
1098
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001099gio = not_found
Paolo Bonzini75440602022-04-20 17:33:44 +02001100gdbus_codegen = not_found
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02001101gdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
Paolo Bonzini75440602022-04-20 17:33:44 +02001102if not get_option('gio').auto() or have_system
1103 gio = dependency('gio-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001104 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +02001105 if gio.found() and not cc.links('''
1106 #include <gio/gio.h>
1107 int main(void)
1108 {
1109 g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
1110 return 0;
1111 }''', dependencies: [glib, gio])
1112 if get_option('gio').enabled()
1113 error('The installed libgio is broken for static linking')
1114 endif
1115 gio = not_found
1116 endif
1117 if gio.found()
Marc-André Lureauc118c8e2024-10-08 16:50:22 +04001118 gdbus_codegen = find_program('gdbus-codegen',
Paolo Bonzini75440602022-04-20 17:33:44 +02001119 required: get_option('gio'))
1120 gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001121 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +02001122 gio = declare_dependency(dependencies: [gio, gio_unix],
1123 version: gio.version())
1124 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001125endif
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02001126if gdbus_codegen.found() and get_option('cfi')
1127 gdbus_codegen = not_found
1128 gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity'
1129endif
Paolo Bonzini75440602022-04-20 17:33:44 +02001130
Marc-André Lureau6cc5a612023-06-06 15:56:42 +04001131xml_pp = find_program('scripts/xml-preprocess.py')
1132
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001133lttng = not_found
Paolo Bonzini9c29b742021-10-07 15:08:14 +02001134if 'ust' in get_option('trace_backends')
Marc-André Lureaue32aaa52022-03-28 12:47:13 +04001135 lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001136 method: 'pkg-config')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001137endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001138pixman = not_found
Marc-André Lureaucca15752023-08-30 13:38:25 +04001139if not get_option('pixman').auto() or have_system or have_tools
1140 pixman = dependency('pixman-1', required: get_option('pixman'), version:'>=0.21.8',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001141 method: 'pkg-config')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001142endif
Marc-André Lureaucca15752023-08-30 13:38:25 +04001143
Paolo Bonzini063d5112022-07-14 14:56:58 +02001144zlib = dependency('zlib', required: true)
Paolo Bonzini53c22b62021-06-03 11:31:35 +02001145
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001146libaio = not_found
1147if not get_option('linux_aio').auto() or have_block
1148 libaio = cc.find_library('aio', has_headers: ['libaio.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001149 required: get_option('linux_aio'))
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001150endif
Leonardo Bras354081d2022-05-13 03:28:30 -03001151
1152linux_io_uring_test = '''
1153 #include <liburing.h>
1154 #include <linux/errqueue.h>
1155
1156 int main(void) { return 0; }'''
1157
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001158linux_io_uring = not_found
Paolo Bonzini53c22b62021-06-03 11:31:35 +02001159if not get_option('linux_io_uring').auto() or have_block
Daniel P. Berrangéa41b4fd2022-01-05 13:49:38 +00001160 linux_io_uring = dependency('liburing', version: '>=0.3',
1161 required: get_option('linux_io_uring'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001162 method: 'pkg-config')
Leonardo Bras354081d2022-05-13 03:28:30 -03001163 if not cc.links(linux_io_uring_test)
1164 linux_io_uring = not_found
1165 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001166endif
Leonardo Bras354081d2022-05-13 03:28:30 -03001167
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001168libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +01001169if not get_option('libnfs').auto() or have_block
Thomas Huthe2d98f22024-12-18 07:21:59 +01001170 libnfs = dependency('libnfs', version: ['>=1.9.3', '<6.0.0'],
Paolo Bonzini30045c02020-11-17 13:11:25 +01001171 required: get_option('libnfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001172 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001173endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001174
1175libattr_test = '''
1176 #include <stddef.h>
1177 #include <sys/types.h>
1178 #ifdef CONFIG_LIBATTR
1179 #include <attr/xattr.h>
1180 #else
1181 #include <sys/xattr.h>
1182 #endif
1183 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
1184
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001185libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001186have_old_libattr = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001187if get_option('attr').allowed()
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001188 if cc.links(libattr_test)
1189 libattr = declare_dependency()
1190 else
1191 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001192 required: get_option('attr'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001193 if libattr.found() and not \
1194 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
1195 libattr = not_found
1196 if get_option('attr').enabled()
1197 error('could not link libattr')
1198 else
1199 warning('could not link libattr, disabling')
1200 endif
1201 else
1202 have_old_libattr = libattr.found()
1203 endif
1204 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001205endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001206
Akihiko Odakid2277f02024-07-15 14:25:44 +09001207cocoa = dependency('appleframeworks',
1208 modules: ['Cocoa', 'CoreVideo', 'QuartzCore'],
Akihiko Odaki52eaefd2022-07-02 23:25:19 +09001209 required: get_option('cocoa'))
Paolo Bonzinic1ec4942021-01-07 14:04:00 +01001210
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03001211vmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet'))
1212if vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h',
1213 'VMNET_BRIDGED_MODE',
1214 dependencies: vmnet)
1215 vmnet = not_found
1216 if get_option('vmnet').enabled()
1217 error('vmnet.framework API is outdated')
1218 else
1219 warning('vmnet.framework API is outdated, disabling')
1220 endif
1221endif
1222
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001223seccomp = not_found
Michal Privoznik73422d92022-10-26 09:30:24 +02001224seccomp_has_sysrawrc = false
Paolo Bonzini90835c22020-11-17 14:22:24 +01001225if not get_option('seccomp').auto() or have_system or have_tools
1226 seccomp = dependency('libseccomp', version: '>=2.3.0',
1227 required: get_option('seccomp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001228 method: 'pkg-config')
Michal Privoznik73422d92022-10-26 09:30:24 +02001229 if seccomp.found()
1230 seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h',
1231 'SCMP_FLTATR_API_SYSRAWRC',
1232 dependencies: seccomp)
1233 endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001234endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001235
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001236libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001237if not get_option('cap_ng').auto() or have_system or have_tools
1238 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001239 required: get_option('cap_ng'))
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001240endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001241if libcap_ng.found() and not cc.links('''
1242 #include <cap-ng.h>
1243 int main(void)
1244 {
1245 capng_capability_to_name(CAPNG_EFFECTIVE);
1246 return 0;
1247 }''', dependencies: libcap_ng)
1248 libcap_ng = not_found
1249 if get_option('cap_ng').enabled()
1250 error('could not link libcap-ng')
1251 else
1252 warning('could not link libcap-ng, disabling')
1253 endif
1254endif
1255
Paolo Bonzini1917ec62020-08-26 03:24:11 -04001256if get_option('xkbcommon').auto() and not have_system and not have_tools
1257 xkbcommon = not_found
1258else
1259 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001260 method: 'pkg-config')
Marc-André Lureauade60d42019-07-15 14:48:31 +04001261endif
Paolo Bonzinie1723992021-10-07 15:08:21 +02001262
Thomas Huth58902582022-04-08 18:20:47 +02001263slirp = not_found
1264if not get_option('slirp').auto() or have_system
1265 slirp = dependency('slirp', required: get_option('slirp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001266 method: 'pkg-config')
Thomas Huth58902582022-04-08 18:20:47 +02001267 # slirp < 4.7 is incompatible with CFI support in QEMU. This is because
1268 # it passes function pointers within libslirp as callbacks for timers.
1269 # When using a system-wide shared libslirp, the type information for the
1270 # callback is missing and the timer call produces a false positive with CFI.
1271 # Do not use the "version" keyword argument to produce a better error.
1272 # with control-flow integrity.
1273 if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7')
1274 if get_option('slirp').enabled()
1275 error('Control-Flow Integrity requires libslirp 4.7.')
1276 else
1277 warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.')
1278 slirp = not_found
1279 endif
1280 endif
1281endif
1282
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001283vde = not_found
Paolo Bonzinie1723992021-10-07 15:08:21 +02001284if not get_option('vde').auto() or have_system or have_tools
1285 vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001286 required: get_option('vde'))
Paolo Bonzinie1723992021-10-07 15:08:21 +02001287endif
1288if vde.found() and not cc.links('''
1289 #include <libvdeplug.h>
1290 int main(void)
1291 {
1292 struct vde_open_args a = {0, 0, 0};
1293 char s[] = "";
1294 vde_open(s, s, &a);
1295 return 0;
1296 }''', dependencies: vde)
1297 vde = not_found
1298 if get_option('cap_ng').enabled()
1299 error('could not link libvdeplug')
1300 else
1301 warning('could not link libvdeplug, disabling')
1302 endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001303endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001304
Paolo Bonzini478e9432020-08-17 12:47:55 +02001305pulse = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001306if not get_option('pa').auto() or (host_os == 'linux' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001307 pulse = dependency('libpulse', required: get_option('pa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001308 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001309endif
1310alsa = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001311if not get_option('alsa').auto() or (host_os == 'linux' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001312 alsa = dependency('alsa', required: get_option('alsa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001313 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001314endif
1315jack = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001316if not get_option('jack').auto() or have_system
1317 jack = dependency('jack', required: get_option('jack'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001318 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001319endif
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001320pipewire = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001321if not get_option('pipewire').auto() or (host_os == 'linux' and have_system)
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001322 pipewire = dependency('libpipewire-0.3', version: '>=0.3.60',
1323 required: get_option('pipewire'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001324 method: 'pkg-config')
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001325endif
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001326sndio = not_found
1327if not get_option('sndio').auto() or have_system
1328 sndio = dependency('sndio', required: get_option('sndio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001329 method: 'pkg-config')
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001330endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001331
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001332spice_protocol = not_found
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001333if not get_option('spice_protocol').auto() or have_system
Markus Armbruster5c167b52023-01-09 20:03:07 +01001334 spice_protocol = dependency('spice-protocol', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001335 required: get_option('spice_protocol'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001336 method: 'pkg-config')
Paolo Bonzini26347332019-07-29 15:40:07 +02001337endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001338spice = not_found
Marc-André Lureauc98791e2023-08-30 13:38:35 +04001339if get_option('spice') \
1340 .disable_auto_if(not have_system) \
1341 .require(pixman.found(),
1342 error_message: 'cannot enable SPICE if pixman is not available') \
1343 .allowed()
Markus Armbruster34d55722023-01-09 20:03:09 +01001344 spice = dependency('spice-server', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001345 required: get_option('spice'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001346 method: 'pkg-config')
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001347endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001348spice_headers = spice.partial_dependency(compile_args: true, includes: true)
1349
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04001350rt = cc.find_library('rt', required: false)
Paolo Bonzinia399f912021-11-15 14:29:13 +00001351
Paolo Bonzini99650b62019-06-10 12:21:14 +02001352libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001353if not get_option('libiscsi').auto() or have_block
1354 libiscsi = dependency('libiscsi', version: '>=1.9.0',
1355 required: get_option('libiscsi'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001356 method: 'pkg-config')
Paolo Bonzini99650b62019-06-10 12:21:14 +02001357endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001358zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +01001359if not get_option('zstd').auto() or have_block
1360 zstd = dependency('libzstd', version: '>=1.4.0',
1361 required: get_option('zstd'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001362 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001363endif
Yuan Liub844a2c2024-06-10 18:21:06 +08001364qpl = not_found
1365if not get_option('qpl').auto() or have_system
1366 qpl = dependency('qpl', version: '>=1.5.0',
1367 required: get_option('qpl'),
1368 method: 'pkg-config')
1369endif
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01001370uadk = not_found
1371if not get_option('uadk').auto() or have_system
1372 libwd = dependency('libwd', version: '>=2.6',
1373 required: get_option('uadk'),
1374 method: 'pkg-config')
1375 libwd_comp = dependency('libwd_comp', version: '>=2.6',
1376 required: get_option('uadk'),
1377 method: 'pkg-config')
1378 if libwd.found() and libwd_comp.found()
1379 uadk = declare_dependency(dependencies: [libwd, libwd_comp])
1380 endif
1381endif
Bryan Zhange28ed312024-08-30 16:27:19 -07001382
1383qatzip = not_found
1384if not get_option('qatzip').auto() or have_system
1385 qatzip = dependency('qatzip', version: '>=1.1.2',
1386 required: get_option('qatzip'),
1387 method: 'pkg-config')
1388endif
1389
Marc-André Lureauea458962019-07-12 22:23:46 +04001390virgl = not_found
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001391
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001392have_vhost_user_gpu = have_tools and host_os == 'linux' and pixman.found()
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001393if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
Paolo Bonzini587d59d2021-06-03 11:31:35 +02001394 virgl = dependency('virglrenderer',
1395 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001396 required: get_option('virglrenderer'))
Marc-André Lureauea458962019-07-12 22:23:46 +04001397endif
Gurchetan Singhcd9adbe2023-03-21 09:47:36 -07001398rutabaga = not_found
1399if not get_option('rutabaga_gfx').auto() or have_system or have_vhost_user_gpu
1400 rutabaga = dependency('rutabaga_gfx_ffi',
1401 method: 'pkg-config',
1402 required: get_option('rutabaga_gfx'))
1403endif
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001404blkio = not_found
1405if not get_option('blkio').auto() or have_block
1406 blkio = dependency('blkio',
1407 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001408 required: get_option('blkio'))
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001409endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001410curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001411if not get_option('curl').auto() or have_block
1412 curl = dependency('libcurl', version: '>=7.29.0',
1413 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001414 required: get_option('curl'))
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001415endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001416libudev = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001417if host_os == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001418 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +01001419 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001420 required: get_option('libudev'))
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001421endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001422
Paolo Bonzini5c530152020-10-15 06:09:27 -04001423mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001424mpathpersist = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001425if host_os == 'linux' and have_tools and get_option('mpath').allowed()
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001426 mpath_test_source = '''
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001427 #include <libudev.h>
1428 #include <mpath_persist.h>
1429 unsigned mpath_mx_alloc_len = 1024;
1430 int logsink;
1431 static struct config *multipath_conf;
1432 extern struct udev *udev;
1433 extern struct config *get_multipath_config(void);
1434 extern void put_multipath_config(struct config *conf);
1435 struct udev *udev;
1436 struct config *get_multipath_config(void) { return multipath_conf; }
1437 void put_multipath_config(struct config *conf) { }
1438 int main(void) {
1439 udev = udev_new();
1440 multipath_conf = mpath_lib_init();
1441 return 0;
1442 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -04001443 libmpathpersist = cc.find_library('mpathpersist',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001444 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001445 if libmpathpersist.found()
1446 mpathlibs += libmpathpersist
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001447 if get_option('prefer_static')
Paolo Bonzini5c530152020-10-15 06:09:27 -04001448 mpathlibs += cc.find_library('devmapper',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001449 required: get_option('mpath'))
Paolo Bonzini43b43a42020-09-17 12:25:09 +02001450 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -04001451 mpathlibs += cc.find_library('multipath',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001452 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001453 foreach lib: mpathlibs
1454 if not lib.found()
1455 mpathlibs = []
1456 break
1457 endif
1458 endforeach
1459 if mpathlibs.length() == 0
1460 msg = 'Dependencies missing for libmpathpersist'
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001461 elif cc.links(mpath_test_source, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001462 mpathpersist = declare_dependency(dependencies: mpathlibs)
1463 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001464 msg = 'Cannot detect libmpathpersist API'
1465 endif
1466 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001467 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -04001468 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001469 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001470 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001471 endif
1472 endif
1473 endif
1474endif
1475
Yonggang Luo5285e592020-10-13 07:43:48 +08001476iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001477curses = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001478if have_system and get_option('curses').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001479 curses_test = '''
Brad Smithf8d31162024-10-11 23:38:55 -04001480 #ifdef __APPLE__
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001481 #define _XOPEN_SOURCE_EXTENDED 1
1482 #endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001483 #include <locale.h>
1484 #include <curses.h>
1485 #include <wchar.h>
1486 int main(void) {
1487 wchar_t wch = L'w';
1488 setlocale(LC_ALL, "");
1489 resize_term(0, 0);
1490 addwstr(L"wide chars\n");
1491 addnwstr(&wch, 1);
1492 add_wch(WACS_DEGREE);
1493 return 0;
1494 }'''
1495
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001496 curses_dep_list = host_os == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
Paolo Bonzini6d322632022-03-27 16:05:58 +02001497 curses = dependency(curses_dep_list,
1498 required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001499 method: 'pkg-config')
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001500 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001501 curses_compile_args = ['-DNCURSES_WIDECHAR=1']
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001502 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -05001503 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001504 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses],
1505 version: curses.version())
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001506 else
1507 msg = 'curses package not usable'
1508 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001509 endif
1510 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001511 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001512 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001513 if host_os != 'windows' and not has_curses_h
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001514 message('Trying with /usr/include/ncursesw')
1515 curses_compile_args += ['-I/usr/include/ncursesw']
1516 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
1517 endif
1518 if has_curses_h
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001519 curses_libname_list = (host_os == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001520 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +08001521 libcurses = cc.find_library(curses_libname,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001522 required: false)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001523 if libcurses.found()
1524 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
1525 curses = declare_dependency(compile_args: curses_compile_args,
1526 dependencies: [libcurses])
1527 break
1528 else
1529 msg = 'curses library not usable'
1530 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001531 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001532 endforeach
1533 endif
1534 endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001535 if get_option('iconv').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001536 foreach link_args : [ ['-liconv'], [] ]
1537 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
1538 # We need to use libiconv if available because mixing libiconv's headers with
1539 # the system libc does not work.
1540 # However, without adding glib to the dependencies -L/usr/local/lib will not be
1541 # included in the command line and libiconv will not be found.
1542 if cc.links('''
1543 #include <iconv.h>
1544 int main(void) {
1545 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
1546 return conv != (iconv_t) -1;
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001547 }''', args: link_args, dependencies: glib)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001548 iconv = declare_dependency(link_args: link_args, dependencies: glib)
1549 break
Yonggang Luo5285e592020-10-13 07:43:48 +08001550 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001551 endforeach
1552 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001553 if curses.found() and not iconv.found()
1554 if get_option('iconv').enabled()
1555 error('iconv not available')
1556 endif
1557 msg = 'iconv required for curses UI but not available'
1558 curses = not_found
1559 endif
1560 if not curses.found() and msg != ''
1561 if get_option('curses').enabled()
1562 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001563 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001564 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001565 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001566 endif
1567endif
1568
Paolo Bonzini26347332019-07-29 15:40:07 +02001569brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001570if not get_option('brlapi').auto() or have_system
1571 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001572 required: get_option('brlapi'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001573 if brlapi.found() and not cc.links('''
1574 #include <brlapi.h>
1575 #include <stddef.h>
1576 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
1577 brlapi = not_found
1578 if get_option('brlapi').enabled()
1579 error('could not link brlapi')
1580 else
1581 warning('could not link brlapi, disabling')
1582 endif
1583 endif
Paolo Bonzini26347332019-07-29 15:40:07 +02001584endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001585
Paolo Bonzini760e4322020-08-26 08:09:48 +02001586sdl = not_found
Akihiko Odaki64d3fec2022-08-19 22:27:56 +09001587if not get_option('sdl').auto() or have_system
Paolo Bonzini063d5112022-07-14 14:56:58 +02001588 sdl = dependency('sdl2', required: get_option('sdl'))
Paolo Bonzini760e4322020-08-26 08:09:48 +02001589 sdl_image = not_found
1590endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001591if sdl.found()
Thomas Huth6da5f222023-06-05 13:45:23 +02001592 # Some versions of SDL have problems with -Wundef
1593 if not cc.compiles('''
1594 #include <SDL.h>
1595 #include <SDL_syswm.h>
1596 int main(int argc, char *argv[]) { return 0; }
1597 ''', dependencies: sdl, args: '-Werror=undef')
1598 sdl = declare_dependency(compile_args: '-Wno-undef',
1599 dependencies: sdl,
1600 version: sdl.version())
1601 endif
Volker Rümelin7161a432020-08-29 12:41:58 +02001602 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001603 method: 'pkg-config')
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001604else
1605 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +01001606 error('sdl-image required, but SDL was @0@'.format(
1607 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001608 endif
1609 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +02001610endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001611
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001612rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001613if not get_option('rbd').auto() or have_block
Paolo Bonzini063d5112022-07-14 14:56:58 +02001614 librados = cc.find_library('rados', required: get_option('rbd'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001615 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001616 required: get_option('rbd'))
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001617 if librados.found() and librbd.found()
1618 if cc.links('''
1619 #include <stdio.h>
1620 #include <rbd/librbd.h>
1621 int main(void) {
1622 rados_t cluster;
1623 rados_create(&cluster, NULL);
Peter Lieven48672ac2021-07-02 19:23:51 +02001624 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
1625 #error
1626 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001627 return 0;
1628 }''', dependencies: [librbd, librados])
1629 rbd = declare_dependency(dependencies: [librbd, librados])
1630 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +02001631 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001632 else
Peter Lieven48672ac2021-07-02 19:23:51 +02001633 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001634 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001635 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001636endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001637
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001638glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001639glusterfs_ftruncate_has_stat = false
1640glusterfs_iocb_has_stat = false
1641if not get_option('glusterfs').auto() or have_block
1642 glusterfs = dependency('glusterfs-api', version: '>=3',
1643 required: get_option('glusterfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001644 method: 'pkg-config')
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001645 if glusterfs.found()
1646 glusterfs_ftruncate_has_stat = cc.links('''
1647 #include <glusterfs/api/glfs.h>
1648
1649 int
1650 main(void)
1651 {
1652 /* new glfs_ftruncate() passes two additional args */
1653 return glfs_ftruncate(NULL, 0, NULL, NULL);
1654 }
1655 ''', dependencies: glusterfs)
1656 glusterfs_iocb_has_stat = cc.links('''
1657 #include <glusterfs/api/glfs.h>
1658
1659 /* new glfs_io_cbk() passes two additional glfs_stat structs */
1660 static void
1661 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
1662 {}
1663
1664 int
1665 main(void)
1666 {
1667 glfs_io_cbk iocb = &glusterfs_iocb;
1668 iocb(NULL, 0 , NULL, NULL, NULL);
1669 return 0;
1670 }
1671 ''', dependencies: glusterfs)
1672 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001673endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001674
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02001675hv_balloon = false
1676if get_option('hv_balloon').allowed() and have_system
1677 if cc.links('''
1678 #include <string.h>
1679 #include <gmodule.h>
1680 int main(void) {
1681 GTree *tree;
1682
1683 tree = g_tree_new((GCompareFunc)strcmp);
1684 (void)g_tree_node_first(tree);
1685 g_tree_destroy(tree);
1686 return 0;
1687 }
1688 ''', dependencies: glib)
1689 hv_balloon = true
1690 else
1691 if get_option('hv_balloon').enabled()
1692 error('could not enable hv-balloon, update your glib')
1693 else
1694 warning('could not find glib support for hv-balloon, disabling')
1695 endif
1696 endif
1697endif
1698
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001699libssh = not_found
Thomas Huthe6a52b32021-12-09 15:48:01 +01001700if not get_option('libssh').auto() or have_block
1701 libssh = dependency('libssh', version: '>=0.8.7',
1702 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001703 required: get_option('libssh'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001704endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001705
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001706libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001707if not get_option('bzip2').auto() or have_block
1708 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001709 required: get_option('bzip2'))
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001710 if libbzip2.found() and not cc.links('''
1711 #include <bzlib.h>
1712 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
1713 libbzip2 = not_found
1714 if get_option('bzip2').enabled()
1715 error('could not link libbzip2')
1716 else
1717 warning('could not link libbzip2, disabling')
1718 endif
1719 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001720endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001721
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001722liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +01001723if not get_option('lzfse').auto() or have_block
1724 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001725 required: get_option('lzfse'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001726endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001727if liblzfse.found() and not cc.links('''
1728 #include <lzfse.h>
1729 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
1730 liblzfse = not_found
1731 if get_option('lzfse').enabled()
1732 error('could not link liblzfse')
1733 else
1734 warning('could not link liblzfse, disabling')
1735 endif
1736endif
1737
Paolo Bonzini478e9432020-08-17 12:47:55 +02001738oss = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001739if get_option('oss').allowed() and have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02001740 if not cc.has_header('sys/soundcard.h')
1741 # not found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001742 elif host_os == 'netbsd'
Paolo Bonzini063d5112022-07-14 14:56:58 +02001743 oss = cc.find_library('ossaudio', required: get_option('oss'))
Paolo Bonzini87430d52021-10-07 15:06:09 +02001744 else
1745 oss = declare_dependency()
1746 endif
1747
1748 if not oss.found()
1749 if get_option('oss').enabled()
1750 error('OSS not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001751 endif
1752 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001753endif
1754dsound = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001755if not get_option('dsound').auto() or (host_os == 'windows' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001756 if cc.has_header('dsound.h')
1757 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1758 endif
1759
1760 if not dsound.found()
1761 if get_option('dsound').enabled()
1762 error('DirectSound not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001763 endif
1764 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001765endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001766
Paolo Bonzini478e9432020-08-17 12:47:55 +02001767coreaudio = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001768if not get_option('coreaudio').auto() or (host_os == 'darwin' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001769 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
1770 required: get_option('coreaudio'))
Paolo Bonzini478e9432020-08-17 12:47:55 +02001771endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001772
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001773opengl = not_found
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001774if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
1775 epoxy = dependency('epoxy', method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001776 required: get_option('opengl'))
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001777 if cc.has_header('epoxy/egl.h', dependencies: epoxy)
1778 opengl = epoxy
1779 elif get_option('opengl').enabled()
1780 error('epoxy/egl.h not found')
1781 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001782endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001783gbm = not_found
1784if (have_system or have_tools) and (virgl.found() or opengl.found())
Paolo Bonzini063d5112022-07-14 14:56:58 +02001785 gbm = dependency('gbm', method: 'pkg-config', required: false)
Thomas Huth8bc51842021-07-13 13:09:02 +02001786endif
Marc-André Lureauf0caba42022-06-28 17:23:15 +04001787have_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001788
Dorjoy Chowdhurybb154e32024-10-09 03:17:23 +06001789libcbor = not_found
1790if not get_option('libcbor').auto() or have_system
1791 libcbor = dependency('libcbor', version: '>=0.7.0',
1792 required: get_option('libcbor'))
1793endif
1794
Paolo Bonzini57612512021-06-03 11:15:26 +02001795gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001796gnutls_crypto = not_found
Alyssa Rossabc14fd2021-08-06 14:49:47 +00001797if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001798 # For general TLS support our min gnutls matches
1799 # that implied by our platform support matrix
1800 #
1801 # For the crypto backends, we look for a newer
1802 # gnutls:
1803 #
1804 # Version 3.6.8 is needed to get XTS
1805 # Version 3.6.13 is needed to get PBKDF
1806 # Version 3.6.14 is needed to get HW accelerated XTS
1807 #
1808 # If newer enough gnutls isn't available, we can
1809 # still use a different crypto backend to satisfy
1810 # the platform support requirements
1811 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1812 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001813 required: false)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001814 if gnutls_crypto.found()
1815 gnutls = gnutls_crypto
1816 else
1817 # Our min version if all we need is TLS
1818 gnutls = dependency('gnutls', version: '>=3.5.18',
1819 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001820 required: get_option('gnutls'))
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001821 endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001822endif
1823
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001824# We prefer use of gnutls for crypto, unless the options
1825# explicitly asked for nettle or gcrypt.
1826#
1827# If gnutls isn't available for crypto, then we'll prefer
1828# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +02001829gcrypt = not_found
1830nettle = not_found
Lei He4c5e5122022-05-25 17:01:14 +08001831hogweed = not_found
Hyman Huang52ed9f42023-12-07 23:47:35 +08001832crypto_sm4 = not_found
liequan ched078da82024-10-30 08:51:46 +00001833crypto_sm3 = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +01001834xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001835
Paolo Bonzini57612512021-06-03 11:15:26 +02001836if get_option('nettle').enabled() and get_option('gcrypt').enabled()
1837 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +02001838endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001839
1840# Explicit nettle/gcrypt request, so ignore gnutls for crypto
1841if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001842 gnutls_crypto = not_found
1843endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001844
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001845if not gnutls_crypto.found()
1846 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
1847 gcrypt = dependency('libgcrypt', version: '>=1.8',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001848 required: get_option('gcrypt'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001849 # Debian has removed -lgpg-error from libgcrypt-config
1850 # as it "spreads unnecessary dependencies" which in
1851 # turn breaks static builds...
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001852 if gcrypt.found() and get_option('prefer_static')
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001853 gcrypt = declare_dependency(dependencies:
1854 [gcrypt,
1855 cc.find_library('gpg-error', required: true)],
1856 version: gcrypt.version())
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001857 endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08001858 crypto_sm4 = gcrypt
1859 # SM4 ALG is available in libgcrypt >= 1.9
1860 if gcrypt.found() and not cc.links('''
1861 #include <gcrypt.h>
1862 int main(void) {
1863 gcry_cipher_hd_t handler;
1864 gcry_cipher_open(&handler, GCRY_CIPHER_SM4, GCRY_CIPHER_MODE_ECB, 0);
1865 return 0;
1866 }''', dependencies: gcrypt)
1867 crypto_sm4 = not_found
1868 endif
liequan ched078da82024-10-30 08:51:46 +00001869 crypto_sm3 = gcrypt
1870 # SM3 ALG is available in libgcrypt >= 1.9
1871 if gcrypt.found() and not cc.links('''
1872 #include <gcrypt.h>
1873 int main(void) {
1874 gcry_md_hd_t handler;
1875 gcry_md_open(&handler, GCRY_MD_SM3, 0);
1876 return 0;
1877 }''', dependencies: gcrypt)
1878 crypto_sm3 = not_found
1879 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001880 endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001881 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1882 nettle = dependency('nettle', version: '>=3.4',
1883 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001884 required: get_option('nettle'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001885 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1886 xts = 'private'
1887 endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08001888 crypto_sm4 = nettle
1889 # SM4 ALG is available in nettle >= 3.9
1890 if nettle.found() and not cc.links('''
1891 #include <nettle/sm4.h>
1892 int main(void) {
1893 struct sm4_ctx ctx;
1894 unsigned char key[16] = {0};
1895 sm4_set_encrypt_key(&ctx, key);
1896 return 0;
1897 }''', dependencies: nettle)
1898 crypto_sm4 = not_found
1899 endif
liequan ched078da82024-10-30 08:51:46 +00001900 crypto_sm3 = nettle
1901 # SM3 ALG is available in nettle >= 3.8
1902 if nettle.found() and not cc.links('''
1903 #include <nettle/sm3.h>
1904 #include <nettle/hmac.h>
1905 int main(void) {
1906 struct sm3_ctx ctx;
1907 struct hmac_sm3_ctx hmac_ctx;
1908 unsigned char data[64] = {0};
1909 unsigned char output[32];
1910
1911 // SM3 hash function test
1912 sm3_init(&ctx);
1913 sm3_update(&ctx, 64, data);
1914 sm3_digest(&ctx, 32, data);
1915
1916 // HMAC-SM3 test
1917 hmac_sm3_set_key(&hmac_ctx, 32, data);
1918 hmac_sm3_update(&hmac_ctx, 64, data);
1919 hmac_sm3_digest(&hmac_ctx, 32, output);
1920
1921 return 0;
1922 }''', dependencies: nettle)
1923 crypto_sm3 = not_found
1924 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001925 endif
1926endif
1927
Paolo Bonzinia775c712023-09-08 12:09:22 +02001928capstone = not_found
1929if not get_option('capstone').auto() or have_system or have_user
1930 capstone = dependency('capstone', version: '>=3.0.5',
1931 method: 'pkg-config',
1932 required: get_option('capstone'))
1933
1934 # Some versions of capstone have broken pkg-config file
1935 # that reports a wrong -I path, causing the #include to
1936 # fail later. If the system has such a broken version
1937 # do not use it.
1938 if capstone.found() and not cc.compiles('#include <capstone.h>',
1939 dependencies: [capstone])
1940 capstone = not_found
1941 if get_option('capstone').enabled()
1942 error('capstone requested, but it does not appear to work')
1943 endif
1944 endif
1945endif
1946
Paolo Bonzini063d5112022-07-14 14:56:58 +02001947gmp = dependency('gmp', required: false, method: 'pkg-config')
Lei He4c5e5122022-05-25 17:01:14 +08001948if nettle.found() and gmp.found()
1949 hogweed = dependency('hogweed', version: '>=3.4',
1950 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001951 required: get_option('nettle'))
Lei He4c5e5122022-05-25 17:01:14 +08001952endif
1953
1954
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001955gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +01001956gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001957vte = not_found
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001958have_gtk_clipboard = get_option('gtk_clipboard').enabled()
1959
Marc-André Lureauda554e12023-08-30 13:38:36 +04001960if get_option('gtk') \
1961 .disable_auto_if(not have_system) \
1962 .require(pixman.found(),
1963 error_message: 'cannot enable GTK if pixman is not available') \
1964 .allowed()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001965 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1966 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001967 required: get_option('gtk'))
Paolo Bonzini1b695472021-01-07 14:02:29 +01001968 if gtk.found()
1969 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1970 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001971 required: false)
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001972 gtk = declare_dependency(dependencies: [gtk, gtkx11],
1973 version: gtk.version())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001974
1975 if not get_option('vte').auto() or have_system
1976 vte = dependency('vte-2.91',
1977 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001978 required: get_option('vte'))
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001979 endif
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001980 elif have_gtk_clipboard
1981 error('GTK clipboard requested, but GTK not found')
Paolo Bonzini1b695472021-01-07 14:02:29 +01001982 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001983endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001984
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001985x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +02001986if gtkx11.found()
Paolo Bonzini063d5112022-07-14 14:56:58 +02001987 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001988endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001989png = not_found
Kshitij Suri95f85102022-04-08 07:13:34 +00001990if get_option('png').allowed() and have_system
Thomas Huth1ec8c2c2022-06-23 19:49:41 +02001991 png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001992 method: 'pkg-config')
Kshitij Suri95f85102022-04-08 07:13:34 +00001993endif
1994vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001995jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001996sasl = not_found
Marc-André Lureau89fd3ea2023-08-30 13:38:34 +04001997if get_option('vnc') \
1998 .disable_auto_if(not have_system) \
1999 .require(pixman.found(),
2000 error_message: 'cannot enable VNC if pixman is not available') \
2001 .allowed()
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002002 vnc = declare_dependency() # dummy dependency
Paolo Bonzini8e242b32020-11-23 13:34:02 -05002003 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002004 method: 'pkg-config')
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002005 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002006 required: get_option('vnc_sasl'))
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002007 if sasl.found()
2008 sasl = declare_dependency(dependencies: sasl,
2009 compile_args: '-DSTRUCT_IOVEC_DEFINED')
2010 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04002011endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01002012
Paolo Bonzini05e391a2021-06-03 11:15:26 +02002013pam = not_found
2014if not get_option('auth_pam').auto() or have_system
2015 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002016 required: get_option('auth_pam'))
Paolo Bonzini05e391a2021-06-03 11:15:26 +02002017endif
2018if pam.found() and not cc.links('''
2019 #include <stddef.h>
2020 #include <security/pam_appl.h>
2021 int main(void) {
2022 const char *service_name = "qemu";
2023 const char *user = "frank";
2024 const struct pam_conv pam_conv = { 0 };
2025 pam_handle_t *pamh = NULL;
2026 pam_start(service_name, user, &pam_conv, &pamh);
2027 return 0;
2028 }''', dependencies: pam)
2029 pam = not_found
2030 if get_option('auth_pam').enabled()
2031 error('could not link libpam')
2032 else
2033 warning('could not link libpam, disabling')
2034 endif
2035endif
2036
Marc-André Lureau708eab42019-09-03 16:59:33 +04002037snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +01002038if not get_option('snappy').auto() or have_system
2039 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002040 required: get_option('snappy'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04002041endif
Thomas Huth785abf02023-07-06 08:47:36 +02002042if snappy.found() and not cc.links('''
Paolo Bonzini241611e2020-11-17 13:32:34 +01002043 #include <snappy-c.h>
2044 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
2045 snappy = not_found
2046 if get_option('snappy').enabled()
2047 error('could not link libsnappy')
2048 else
2049 warning('could not link libsnappy, disabling')
2050 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +04002051endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002052
Marc-André Lureau708eab42019-09-03 16:59:33 +04002053lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002054if not get_option('lzo').auto() or have_system
2055 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002056 required: get_option('lzo'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04002057endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002058if lzo.found() and not cc.links('''
2059 #include <lzo/lzo1x.h>
2060 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
2061 lzo = not_found
2062 if get_option('lzo').enabled()
2063 error('could not link liblzo2')
2064 else
2065 warning('could not link liblzo2, disabling')
2066 endif
2067endif
2068
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002069numa = not_found
2070if not get_option('numa').auto() or have_system or have_tools
2071 numa = cc.find_library('numa', has_headers: ['numa.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002072 required: get_option('numa'))
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002073endif
2074if numa.found() and not cc.links('''
2075 #include <numa.h>
2076 int main(void) { return numa_available(); }
2077 ''', dependencies: numa)
2078 numa = not_found
2079 if get_option('numa').enabled()
2080 error('could not link numa')
2081 else
2082 warning('could not link numa, disabling')
2083 endif
2084endif
2085
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01002086fdt = not_found
2087fdt_opt = get_option('fdt')
2088if fdt_opt == 'enabled' and get_option('wrap_mode') == 'nodownload'
2089 fdt_opt = 'system'
2090endif
2091if fdt_opt in ['enabled', 'system'] or (fdt_opt == 'auto' and have_system)
2092 fdt = cc.find_library('fdt', required: fdt_opt == 'system')
2093 if fdt.found() and cc.links('''
2094 #include <libfdt.h>
2095 #include <libfdt_env.h>
2096 int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
2097 dependencies: fdt)
2098 fdt_opt = 'system'
2099 elif fdt_opt != 'system'
2100 fdt_opt = get_option('wrap_mode') == 'nodownload' ? 'disabled' : 'internal'
2101 fdt = not_found
2102 else
2103 error('system libfdt is too old (1.5.1 or newer required)')
2104 endif
2105endif
2106if fdt_opt == 'internal'
2107 assert(not fdt.found())
2108 libfdt_proj = subproject('dtc', required: true,
2109 default_options: ['tools=false', 'yaml=disabled',
2110 'python=disabled', 'default_library=static'])
2111 fdt = libfdt_proj.get_variable('libfdt_dep')
2112endif
2113
Marc-André Lureau55166232019-07-24 19:16:22 +04002114rdma = not_found
Paolo Bonzini3730a732022-04-20 17:33:41 +02002115if not get_option('rdma').auto() or have_system
Paolo Bonzini3730a732022-04-20 17:33:41 +02002116 rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002117 required: get_option('rdma')),
zhenwei pi829858f2024-06-11 18:54:26 +08002118 cc.find_library('ibverbs', required: get_option('rdma'))]
Paolo Bonzini3730a732022-04-20 17:33:41 +02002119 rdma = declare_dependency(dependencies: rdma_libs)
2120 foreach lib: rdma_libs
2121 if not lib.found()
2122 rdma = not_found
2123 endif
2124 endforeach
Marc-André Lureau55166232019-07-24 19:16:22 +04002125endif
Paolo Bonzini3730a732022-04-20 17:33:41 +02002126
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002127cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02002128if not get_option('smartcard').auto() or have_system
2129 cacard = dependency('libcacard', required: get_option('smartcard'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002130 version: '>=2.5.1', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002131endif
César Belley0a40bcb2020-08-26 13:42:04 +02002132u2f = not_found
Paolo Bonzinie7c22ff2023-09-08 12:10:27 +02002133if not get_option('u2f').auto() or have_system
César Belley0a40bcb2020-08-26 13:42:04 +02002134 u2f = dependency('u2f-emu', required: get_option('u2f'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002135 method: 'pkg-config')
César Belley0a40bcb2020-08-26 13:42:04 +02002136endif
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002137canokey = not_found
Paolo Bonzinie7c22ff2023-09-08 12:10:27 +02002138if not get_option('canokey').auto() or have_system
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002139 canokey = dependency('canokey-qemu', required: get_option('canokey'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002140 method: 'pkg-config')
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002141endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002142usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02002143if not get_option('usb_redir').auto() or have_system
2144 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002145 version: '>=0.6', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002146endif
2147libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02002148if not get_option('libusb').auto() or have_system
2149 libusb = dependency('libusb-1.0', required: get_option('libusb'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002150 version: '>=1.0.13', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002151endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02002152
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002153libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02002154if not get_option('libpmem').auto() or have_system
2155 libpmem = dependency('libpmem', required: get_option('libpmem'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002156 method: 'pkg-config')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002157endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06002158libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02002159if not get_option('libdaxctl').auto() or have_system
2160 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002161 version: '>=57', method: 'pkg-config')
Bruce Rogersc7c91a72020-08-24 09:52:12 -06002162endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04002163tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02002164if gnutls.found()
2165 tasn1 = dependency('libtasn1',
Philippe Mathieu-Daudédc37d1c2024-05-02 11:56:42 +02002166 required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02002167 method: 'pkg-config')
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04002168endif
Max Fritz0db0fbb2023-05-22 02:12:02 +02002169keyutils = not_found
Thomas Huthc64023b2023-08-24 11:42:08 +02002170if not get_option('libkeyutils').auto() or have_block
2171 keyutils = dependency('libkeyutils', required: get_option('libkeyutils'),
2172 method: 'pkg-config')
Max Fritz0db0fbb2023-05-22 02:12:02 +02002173endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002174
Marc-André Lureau3909def2020-08-28 15:07:33 +04002175has_gettid = cc.has_function('gettid')
2176
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002177# libselinux
2178selinux = dependency('libselinux',
2179 required: get_option('selinux'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002180 method: 'pkg-config')
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002181
Paolo Bonziniaa087962020-09-01 11:15:30 -04002182# Malloc tests
2183
2184malloc = []
2185if get_option('malloc') == 'system'
2186 has_malloc_trim = \
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002187 get_option('malloc_trim').allowed() and \
Michal Privoznik09a49af2023-05-30 12:31:23 +02002188 cc.has_function('malloc_trim', prefix: '#include <malloc.h>')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002189else
2190 has_malloc_trim = false
2191 malloc = cc.find_library(get_option('malloc'), required: true)
2192endif
2193if not has_malloc_trim and get_option('malloc_trim').enabled()
2194 if get_option('malloc') == 'system'
2195 error('malloc_trim not available on this platform.')
2196 else
2197 error('malloc_trim not available with non-libc memory allocator')
2198 endif
2199endif
2200
Akihiko Odaki797150d2025-04-24 13:50:13 +09002201osdep_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01002202 #ifndef _GNU_SOURCE
2203 #define _GNU_SOURCE
2204 #endif
Akihiko Odaki797150d2025-04-24 13:50:13 +09002205
2206 #include <stddef.h>
2207 #include <sys/types.h>
2208
Akihiko Odakia5b30be2025-04-24 13:50:14 +09002209 #include <string.h>
Akihiko Odaki797150d2025-04-24 13:50:13 +09002210 #include <limits.h>
2211 /* Put unistd.h before time.h as that triggers localtime_r/gmtime_r
2212 * function availability on recentish Mingw-w64 platforms. */
2213 #include <unistd.h>
2214 #include <time.h>
2215 #include <errno.h>
2216 #include <fcntl.h>
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002217'''
Max Reitz84e319a2020-11-02 17:18:55 +01002218
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002219have_vhost_user_blk_server = get_option('vhost_user_blk_server') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002220 .require(host_os == 'linux',
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002221 error_message: 'vhost_user_blk_server requires linux') \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02002222 .require(have_vhost_user,
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002223 error_message: 'vhost_user_blk_server requires vhost-user support') \
Alex Bennée26ed5012022-05-24 16:40:42 +01002224 .disable_auto_if(not have_tools and not have_system) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002225 .allowed()
Daniele Buono9e62ba42020-12-04 18:06:14 -05002226
Max Reitzdf4ea702020-10-27 20:05:46 +01002227if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
2228 error('Cannot enable fuse-lseek while fuse is disabled')
2229endif
2230
Max Reitza484a712020-10-27 20:05:41 +01002231fuse = dependency('fuse3', required: get_option('fuse'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002232 version: '>=3.1', method: 'pkg-config')
Max Reitza484a712020-10-27 20:05:41 +01002233
Max Reitzdf4ea702020-10-27 20:05:46 +01002234fuse_lseek = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002235if get_option('fuse_lseek').allowed()
Max Reitzdf4ea702020-10-27 20:05:46 +01002236 if fuse.version().version_compare('>=3.8')
2237 # Dummy dependency
2238 fuse_lseek = declare_dependency()
2239 elif get_option('fuse_lseek').enabled()
2240 if fuse.found()
2241 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
2242 else
2243 error('fuse-lseek requires libfuse, which was not found')
2244 endif
2245 endif
2246endif
2247
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002248have_libvduse = (host_os == 'linux')
Xie Yongjia6caeee2022-05-23 16:46:08 +08002249if get_option('libvduse').enabled()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002250 if host_os != 'linux'
Xie Yongjia6caeee2022-05-23 16:46:08 +08002251 error('libvduse requires linux')
2252 endif
2253elif get_option('libvduse').disabled()
2254 have_libvduse = false
2255endif
2256
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002257have_vduse_blk_export = (have_libvduse and host_os == 'linux')
Xie Yongji2a2359b2022-05-23 16:46:09 +08002258if get_option('vduse_blk_export').enabled()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002259 if host_os != 'linux'
Xie Yongji2a2359b2022-05-23 16:46:09 +08002260 error('vduse_blk_export requires linux')
2261 elif not have_libvduse
2262 error('vduse_blk_export requires libvduse support')
2263 endif
2264elif get_option('vduse_blk_export').disabled()
2265 have_vduse_blk_export = false
2266endif
2267
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002268# libbpf
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002269bpf_version = '1.1.0'
2270libbpf = dependency('libbpf', version: '>=' + bpf_version, required: get_option('bpf'), method: 'pkg-config')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002271if libbpf.found() and not cc.links('''
2272 #include <bpf/libbpf.h>
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002273 #include <linux/bpf.h>
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002274 int main(void)
2275 {
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002276 // check flag availability
2277 int flag = BPF_F_MMAPABLE;
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002278 bpf_object__destroy_skeleton(NULL);
2279 return 0;
2280 }''', dependencies: libbpf)
2281 libbpf = not_found
2282 if get_option('bpf').enabled()
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002283 error('libbpf skeleton/mmaping test failed')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002284 else
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002285 warning('libbpf skeleton/mmaping test failed, disabling')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002286 endif
2287endif
2288
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002289# libxdp
2290libxdp = not_found
2291if not get_option('af_xdp').auto() or have_system
Daniel P. Berrangé1f372802024-10-23 09:50:56 +01002292 if libbpf.found()
2293 libxdp = dependency('libxdp', required: get_option('af_xdp'),
2294 version: '>=1.4.0', method: 'pkg-config')
2295 else
2296 if get_option('af_xdp').enabled()
2297 error('libxdp requested, but libbpf is not available')
2298 endif
2299 endif
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002300endif
2301
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002302# libdw
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002303libdw = not_found
Ilya Leoshkevich550c6d92023-02-10 01:52:08 +01002304if not get_option('libdw').auto() or \
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02002305 (not get_option('prefer_static') and (have_system or have_user))
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002306 libdw = dependency('libdw',
2307 method: 'pkg-config',
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002308 required: get_option('libdw'))
2309endif
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002310
Paolo Bonzini87430d52021-10-07 15:06:09 +02002311#################
2312# config-host.h #
2313#################
2314
Paolo Bonzini95933f12023-09-08 12:10:08 +02002315config_host_data = configuration_data()
2316
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03002317config_host_data.set('CONFIG_HAVE_RUST', have_rust)
Paolo Bonzini87430d52021-10-07 15:06:09 +02002318audio_drivers_selected = []
2319if have_system
2320 audio_drivers_available = {
2321 'alsa': alsa.found(),
2322 'coreaudio': coreaudio.found(),
2323 'dsound': dsound.found(),
2324 'jack': jack.found(),
2325 'oss': oss.found(),
2326 'pa': pulse.found(),
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02002327 'pipewire': pipewire.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002328 'sdl': sdl.found(),
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002329 'sndio': sndio.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002330 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02002331 foreach k, v: audio_drivers_available
2332 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
2333 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02002334
2335 # Default to native drivers first, OSS second, SDL third
2336 audio_drivers_priority = \
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002337 [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002338 (host_os == 'linux' ? [] : [ 'sdl' ])
Paolo Bonzini87430d52021-10-07 15:06:09 +02002339 audio_drivers_default = []
2340 foreach k: audio_drivers_priority
2341 if audio_drivers_available[k]
2342 audio_drivers_default += k
2343 endif
2344 endforeach
2345
2346 foreach k: get_option('audio_drv_list')
2347 if k == 'default'
2348 audio_drivers_selected += audio_drivers_default
2349 elif not audio_drivers_available[k]
2350 error('Audio driver "@0@" not available.'.format(k))
2351 else
2352 audio_drivers_selected += k
2353 endif
2354 endforeach
2355endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02002356config_host_data.set('CONFIG_AUDIO_DRIVERS',
2357 '"' + '", "'.join(audio_drivers_selected) + '", ')
2358
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002359have_host_block_device = (host_os != 'darwin' or
Joelle van Dyne14176c82021-03-15 11:03:38 -07002360 cc.has_header('IOKit/storage/IOMedia.h'))
2361
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002362dbus_display = get_option('dbus_display') \
2363 .require(gio.version().version_compare('>=2.64'),
2364 error_message: '-display dbus requires glib>=2.64') \
Paolo Bonzini75440602022-04-20 17:33:44 +02002365 .require(gdbus_codegen.found(),
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02002366 error_message: gdbus_codegen_error.format('-display dbus')) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002367 .allowed()
Marc-André Lureau142ca622021-07-15 11:53:53 +04002368
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002369have_virtfs = get_option('virtfs') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002370 .require(host_os == 'linux' or host_os == 'darwin',
Keno Fischer0fb1e192022-02-27 17:35:22 -05002371 error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002372 .require(host_os == 'linux' or cc.has_function('pthread_fchdir_np'),
Keno Fischer0fb1e192022-02-27 17:35:22 -05002373 error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002374 .require(host_os == 'darwin' or libattr.found(),
Peter Foley1a67e072023-05-03 09:07:56 -04002375 error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002376 .disable_auto_if(not have_tools and not have_system) \
2377 .allowed()
Paolo Bonzini69202b42020-11-17 14:46:21 +01002378
Daniel P. Berrangé4bb3da42024-07-12 14:24:44 +01002379qga_fsfreeze = false
2380qga_fstrim = false
2381if host_os == 'linux'
2382 if cc.has_header_symbol('linux/fs.h', 'FIFREEZE')
2383 qga_fsfreeze = true
2384 endif
2385 if cc.has_header_symbol('linux/fs.h', 'FITRIM')
2386 qga_fstrim = true
2387 endif
2388elif host_os == 'freebsd' and cc.has_header_symbol('ufs/ffs/fs.h', 'UFSSUSPEND')
2389 qga_fsfreeze = true
2390endif
2391
Paolo Bonzini622d64f2022-04-20 17:33:53 +02002392if get_option('block_drv_ro_whitelist') == ''
2393 config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
2394else
2395 config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
2396 '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
2397endif
2398if get_option('block_drv_rw_whitelist') == ''
2399 config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
2400else
2401 config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
2402 '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
2403endif
2404
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002405foreach k : get_option('trace_backends')
2406 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
2407endforeach
2408config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02002409config_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
Paolo Bonzini40c909f2022-04-20 17:33:49 +02002410if iasl.found()
2411 config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
Paolo Bonzini5dc46182021-10-13 13:19:00 +02002412endif
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002413config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
2414config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
2415config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
2416config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
2417config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09002418
2419qemu_firmwarepath = ''
2420foreach k : get_option('qemu_firmwarepath')
2421 qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
2422endforeach
2423config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
2424
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002425config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
2426config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
2427config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
2428config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
2429config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
2430config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
2431
Paolo Bonzini60027112022-10-20 14:53:10 +02002432if enable_modules
Paolo Bonzinib0b43232022-04-20 17:33:54 +02002433 config_host_data.set('CONFIG_STAMP', run_command(
2434 meson.current_source_dir() / 'scripts/qemu-stamp.py',
2435 meson.project_version(), get_option('pkgversion'), '--',
2436 meson.current_source_dir() / 'configure',
2437 capture: true, check: true).stdout().strip())
2438endif
2439
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002440have_slirp_smbd = get_option('slirp_smbd') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002441 .require(host_os != 'windows', error_message: 'Host smbd not supported on this platform.') \
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002442 .allowed()
2443if have_slirp_smbd
2444 smbd_path = get_option('smbd')
2445 if smbd_path == ''
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002446 smbd_path = (host_os == 'sunos' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002447 endif
2448 config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
2449endif
2450
Paolo Bonzini823eb012021-11-08 14:18:17 +01002451config_host_data.set('HOST_' + host_arch.to_upper(), 1)
2452
Paolo Bonzini95933f12023-09-08 12:10:08 +02002453kvm_targets_c = '""'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002454if get_option('kvm').allowed() and host_os == 'linux'
Paolo Bonzini95933f12023-09-08 12:10:08 +02002455 kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
2456endif
2457config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
2458
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02002459if get_option('module_upgrades') and not enable_modules
2460 error('Cannot enable module-upgrades as modules are not enabled')
2461endif
2462config_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
2463
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002464config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002465config_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002466config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002467config_host_data.set('CONFIG_BSD', host_os in bsd_oses)
Daniel P. Berrangé4be55a42024-07-12 14:24:54 +01002468config_host_data.set('CONFIG_FREEBSD', host_os == 'freebsd')
Paolo Bonzinia775c712023-09-08 12:09:22 +02002469config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04002470config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002471config_host_data.set('CONFIG_DARWIN', host_os == 'darwin')
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01002472config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini537b7242021-10-07 15:08:12 +02002473config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02002474config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002475config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002476config_host_data.set('CONFIG_LINUX', host_os == 'linux')
2477config_host_data.set('CONFIG_POSIX', host_os != 'windows')
2478config_host_data.set('CONFIG_WIN32', host_os == 'windows')
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002479config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002480config_host_data.set('CONFIG_MPATH', mpathpersist.found())
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04002481config_host_data.set('CONFIG_BLKIO', blkio.found())
Stefano Garzarella98b126f2023-05-30 09:19:41 +02002482if blkio.found()
2483 config_host_data.set('CONFIG_BLKIO_VHOST_VDPA_FD',
2484 blkio.version().version_compare('>=1.3.0'))
Stefano Garzarella547c4e52024-08-08 10:05:45 +02002485 config_host_data.set('CONFIG_BLKIO_WRITE_ZEROS_FUA',
2486 blkio.version().version_compare('>=1.4.0'))
Stefano Garzarella98b126f2023-05-30 09:19:41 +02002487endif
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002488config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08002489config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02002490config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini75440602022-04-20 17:33:44 +02002491config_host_data.set('CONFIG_GIO', gio.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002492config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
2493if glusterfs.found()
2494 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
2495 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
2496 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
2497 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
2498 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
2499 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
2500endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002501config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02002502config_host_data.set('CONFIG_VTE', vte.found())
Claudio Fontana29e0bff2022-11-21 14:55:38 +01002503config_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard)
Taylor Simpson63efb6a2023-04-27 15:59:52 -07002504config_host_data.set('CONFIG_HEXAGON_IDEF_PARSER', get_option('hexagon_idef_parser'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002505config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002506config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002507config_host_data.set('CONFIG_EBPF', libbpf.found())
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002508config_host_data.set('CONFIG_AF_XDP', libxdp.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002509config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002510config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01002511config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Thomas Huthe6a52b32021-12-09 15:48:01 +01002512config_host_data.set('CONFIG_LIBSSH', libssh.found())
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02002513config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002514config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
2515config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzini60027112022-10-20 14:53:10 +02002516config_host_data.set('CONFIG_MODULES', enable_modules)
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002517config_host_data.set('CONFIG_NUMA', numa.found())
Michal Privoznik6bb613f2022-12-15 10:55:03 +01002518if numa.found()
2519 config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY',
2520 cc.has_function('numa_has_preferred_many',
2521 dependencies: numa))
2522endif
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002523config_host_data.set('CONFIG_OPENGL', opengl.found())
Paolo Bonzini2c13c572023-08-30 12:20:53 +02002524config_host_data.set('CONFIG_PLUGIN', get_option('plugins'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002525config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini3730a732022-04-20 17:33:41 +02002526config_host_data.set('CONFIG_RDMA', rdma.found())
Paolo Bonzini655e2a72023-10-05 14:19:34 +02002527config_host_data.set('CONFIG_RELOCATABLE', get_option('relocatable'))
Paolo Bonzini721fa5e2022-10-12 11:59:51 +02002528config_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002529config_host_data.set('CONFIG_SDL', sdl.found())
2530config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01002531config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Michal Privoznik73422d92022-10-26 09:30:24 +02002532if seccomp.found()
2533 config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
2534endif
Marc-André Lureaucca15752023-08-30 13:38:25 +04002535config_host_data.set('CONFIG_PIXMAN', pixman.found())
Paolo Bonzinia775c712023-09-08 12:09:22 +02002536config_host_data.set('CONFIG_SLIRP', slirp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01002537config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002538config_host_data.set('CONFIG_SOLARIS', host_os == 'sunos')
Paolo Bonzinie3c426c2022-05-09 12:50:29 +02002539if have_tcg
Paolo Bonzini875be2872022-02-15 11:37:00 +01002540 config_host_data.set('CONFIG_TCG', 1)
2541 config_host_data.set('CONFIG_TCG_INTERPRETER', tcg_arch == 'tci')
2542endif
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002543config_host_data.set('CONFIG_TPM', have_tpm)
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002544config_host_data.set('CONFIG_TSAN', get_option('tsan'))
Paolo Bonzini90540f32021-06-03 11:15:26 +02002545config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Paolo Bonzinie1723992021-10-07 15:08:21 +02002546config_host_data.set('CONFIG_VDE', vde.found())
Stefan Hajnoczic0c4f142023-10-03 21:45:32 -04002547config_host_data.set('CONFIG_VHOST', have_vhost)
Paolo Bonzini2df89d52022-04-20 17:34:07 +02002548config_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
2549config_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
2550config_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
2551config_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
2552config_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
2553config_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
2554config_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03002555config_host_data.set('CONFIG_VMNET', vmnet.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002556config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Xie Yongji2a2359b2022-05-23 16:46:09 +08002557config_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
Kshitij Suri95f85102022-04-08 07:13:34 +00002558config_host_data.set('CONFIG_PNG', png.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002559config_host_data.set('CONFIG_VNC', vnc.found())
2560config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002561config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini95933f12023-09-08 12:10:08 +02002562if virgl.found()
Dmitry Osipenkoffac9642024-10-25 00:03:04 +03002563 config_host_data.set('VIRGL_VERSION_MAJOR', virgl.version().split('.')[0])
Paolo Bonzini95933f12023-09-08 12:10:08 +02002564endif
Paolo Bonzini69202b42020-11-17 14:46:21 +01002565config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002566config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002567config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04002568config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04002569config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02002570config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01002571config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Daniel P. Berrangéd47b83b2022-04-26 17:00:43 +01002572config_host_data.set('CONFIG_TASN1', tasn1.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002573config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
2574config_host_data.set('CONFIG_NETTLE', nettle.found())
Hyman Huang52ed9f42023-12-07 23:47:35 +08002575config_host_data.set('CONFIG_CRYPTO_SM4', crypto_sm4.found())
liequan ched078da82024-10-30 08:51:46 +00002576config_host_data.set('CONFIG_CRYPTO_SM3', crypto_sm3.found())
Lei He4c5e5122022-05-25 17:01:14 +08002577config_host_data.set('CONFIG_HOGWEED', hogweed.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002578config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002579config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Paolo Bonzinib1def332020-11-17 13:37:39 +01002580config_host_data.set('CONFIG_ZSTD', zstd.found())
Yuan Liub844a2c2024-06-10 18:21:06 +08002581config_host_data.set('CONFIG_QPL', qpl.found())
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01002582config_host_data.set('CONFIG_UADK', uadk.found())
Bryan Zhange28ed312024-08-30 16:27:19 -07002583config_host_data.set('CONFIG_QATZIP', qatzip.found())
Max Reitza484a712020-10-27 20:05:41 +01002584config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01002585config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002586config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
Marc-André Lureauddece462021-10-06 14:18:09 +04002587if spice_protocol.found()
2588config_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
2589config_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
2590config_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
2591endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002592config_host_data.set('CONFIG_SPICE', spice.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01002593config_host_data.set('CONFIG_X11', x11.found())
Marc-André Lureau142ca622021-07-15 11:53:53 +04002594config_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
Daniele Buono9e62ba42020-12-04 18:06:14 -05002595config_host_data.set('CONFIG_CFI', get_option('cfi'))
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002596config_host_data.set('CONFIG_SELINUX', selinux.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002597config_host_data.set('CONFIG_XEN_BACKEND', xen.found())
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002598config_host_data.set('CONFIG_LIBDW', libdw.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002599if xen.found()
2600 # protect from xen.version() having less than three components
2601 xen_version = xen.version().split('.') + ['0', '0']
2602 xen_ctrl_version = xen_version[0] + \
2603 ('0' + xen_version[1]).substring(-2) + \
2604 ('0' + xen_version[2]).substring(-2)
2605 config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
2606endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002607config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
2608config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
2609config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
2610config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
2611
Paolo Bonzinia6305082021-10-07 15:08:15 +02002612config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002613config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
2614
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002615have_coroutine_pool = get_option('coroutine_pool')
2616if get_option('debug_stack_usage') and have_coroutine_pool
2617 message('Disabling coroutine pool to measure stack usage')
2618 have_coroutine_pool = false
2619endif
Paolo Bonzini230f6e02023-10-05 14:31:27 +02002620config_host_data.set('CONFIG_COROUTINE_POOL', have_coroutine_pool)
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04002621config_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002622config_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002623config_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
Paolo Bonzini1d558c92023-08-28 11:48:30 +02002624config_host_data.set('CONFIG_DEBUG_TCG', get_option('debug_tcg'))
Ilya Leoshkevich1f2355f2024-03-12 01:23:30 +01002625config_host_data.set('CONFIG_DEBUG_REMAP', get_option('debug_remap'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002626config_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
Juan Quintelaabad1852022-09-02 18:51:25 +02002627config_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
Daniel P. Berrangé4bb3da42024-07-12 14:24:44 +01002628config_host_data.set('CONFIG_FSFREEZE', qga_fsfreeze)
2629config_host_data.set('CONFIG_FSTRIM', qga_fstrim)
Paolo Bonzini406523f2021-10-13 11:43:54 +02002630
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002631# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002632config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002633config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
Daniel P. Berrangé6b1c7442025-04-25 13:17:12 +01002634valgrind = false
2635if get_option('valgrind').allowed()
2636 if cc.has_header('valgrind/valgrind.h')
2637 valgrind = true
2638 else
2639 if get_option('valgrind').enabled()
2640 error('valgrind requested but valgrind.h not found')
2641 endif
2642 endif
2643endif
2644config_host_data.set('CONFIG_VALGRIND_H', valgrind)
Thomas Huth48f670e2020-11-18 18:10:52 +01002645config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01002646config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Michael Vogt97299302024-10-01 17:14:54 +02002647config_host_data.set('HAVE_OPENAT2_H', cc.has_header('linux/openat2.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01002648config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002649config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01002650config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01002651config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002652if host_os == 'windows'
Bin Mengd4093732022-08-02 15:51:58 +08002653 config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
2654endif
Thomas Huthded5d782020-11-14 11:10:11 +01002655
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002656# has_function
Claudio Imbrendac891c242022-08-12 15:34:53 +02002657config_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002658config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002659config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
2660config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
2661config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
2662config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Paolo Bonzini67504852023-06-21 00:47:31 +02002663config_host_data.set('CONFIG_SCHED_GETCPU', cc.has_function('sched_getcpu', prefix: '#include <sched.h>'))
Peter Maydell86983432022-02-26 18:07:19 +00002664# Note that we need to specify prefix: here to avoid incorrectly
2665# thinking that Windows has posix_memalign()
2666config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
Peter Maydell5c8c7142022-02-26 18:07:20 +00002667config_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
Peter Maydell88454f82022-02-26 18:07:21 +00002668config_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
2669config_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002670config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002671config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Keno Fischer029ed1b2022-02-27 17:35:20 -05002672config_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002673config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
2674config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
2675config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
2676config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
2677config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Daniel P. Berrangé5288d9d2024-12-02 12:19:27 +00002678config_host_data.set('CONFIG_GETLOADAVG', cc.has_function('getloadavg'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002679config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Andrew Deason59e35c72022-04-26 14:55:22 -05002680config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02002681config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03002682config_host_data.set('HAVE_GLIB_WITH_ALIGNED_ALLOC', glib_has_aligned_alloc)
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002683config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Akihiko Odakia5b30be2025-04-24 13:50:14 +09002684config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul', prefix: osdep_prefix))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002685config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Stefano Garzarella66dc5f92022-05-17 09:10:12 +02002686if rbd.found()
2687 config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
2688 cc.has_function('rbd_namespace_exists',
2689 dependencies: rbd,
2690 prefix: '#include <rbd/librbd.h>'))
2691endif
Li Zhijian911965a2021-09-10 15:02:55 +08002692if rdma.found()
2693 config_host_data.set('HAVE_IBV_ADVISE_MR',
2694 cc.has_function('ibv_advise_mr',
Paolo Bonzini3730a732022-04-20 17:33:41 +02002695 dependencies: rdma,
Li Zhijian911965a2021-09-10 15:02:55 +08002696 prefix: '#include <infiniband/verbs.h>'))
2697endif
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002698
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002699have_asan_fiber = false
Richard Hendersoncb771ac2024-08-13 19:52:15 +10002700if get_option('asan') and \
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002701 not cc.has_function('__sanitizer_start_switch_fiber',
2702 args: '-fsanitize=address',
2703 prefix: '#include <sanitizer/asan_interface.h>')
2704 warning('Missing ASAN due to missing fiber annotation interface')
2705 warning('Without code annotation, the report may be inferior.')
2706else
2707 have_asan_fiber = true
2708endif
2709config_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber)
2710
Ilya Leoshkevicha1a98002024-02-06 01:22:03 +01002711have_inotify_init = cc.has_header_symbol('sys/inotify.h', 'inotify_init')
2712have_inotify_init1 = cc.has_header_symbol('sys/inotify.h', 'inotify_init1')
2713inotify = not_found
2714if (have_inotify_init or have_inotify_init1) and host_os == 'freebsd'
2715 # libinotify-kqueue
2716 inotify = cc.find_library('inotify')
2717 if have_inotify_init
2718 have_inotify_init = inotify.found()
2719 endif
2720 if have_inotify_init1
2721 have_inotify_init1 = inotify.found()
2722 endif
2723endif
2724config_host_data.set('CONFIG_INOTIFY', have_inotify_init)
2725config_host_data.set('CONFIG_INOTIFY1', have_inotify_init1)
2726
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002727# has_header_symbol
Sam Li6d43eaa2023-05-08 12:55:28 +08002728config_host_data.set('CONFIG_BLKZONED',
2729 cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002730config_host_data.set('CONFIG_EPOLL_CREATE1',
2731 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
2732config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
2733 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
2734 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
2735config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
2736 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
2737config_host_data.set('CONFIG_FIEMAP',
2738 cc.has_header('linux/fiemap.h') and
2739 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Akihiko Odaki563cd692025-04-24 13:50:11 +09002740config_host_data.set('CONFIG_GETCPU',
Akihiko Odaki797150d2025-04-24 13:50:13 +09002741 cc.has_header_symbol('sched.h', 'getcpu', prefix: osdep_prefix))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002742config_host_data.set('CONFIG_GETRANDOM',
2743 cc.has_function('getrandom') and
2744 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002745config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
2746 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002747config_host_data.set('CONFIG_RTNETLINK',
2748 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
2749config_host_data.set('CONFIG_SYSMACROS',
2750 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002751config_host_data.set('HAVE_OPTRESET',
2752 cc.has_header_symbol('getopt.h', 'optreset'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04002753config_host_data.set('HAVE_IPPROTO_MPTCP',
2754 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Kevin Wolf984a32f2025-03-07 23:16:30 +01002755if libaio.found()
2756 config_host_data.set('HAVE_IO_PREP_PWRITEV2',
2757 cc.has_header_symbol('libaio.h', 'io_prep_pwritev2'))
2758endif
2759if linux_io_uring.found()
2760 config_host_data.set('HAVE_IO_URING_PREP_WRITEV2',
2761 cc.has_header_symbol('liburing.h', 'io_uring_prep_writev2'))
2762endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002763
2764# has_member
2765config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
2766 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
2767 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002768config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
2769 cc.has_member('struct stat', 'st_atim',
2770 prefix: '#include <sys/stat.h>'))
Sam Li6d43eaa2023-05-08 12:55:28 +08002771config_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY',
2772 cc.has_member('struct blk_zone', 'capacity',
2773 prefix: '#include <linux/blkzoned.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002774
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002775# has_type
2776config_host_data.set('CONFIG_IOVEC',
2777 cc.has_type('struct iovec',
2778 prefix: '#include <sys/uio.h>'))
2779config_host_data.set('HAVE_UTMPX',
2780 cc.has_type('struct utmpx',
2781 prefix: '#include <utmpx.h>'))
2782
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002783config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002784 #include <sys/eventfd.h>
2785 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Akihiko Odaki797150d2025-04-24 13:50:13 +09002786config_host_data.set('CONFIG_FDATASYNC', cc.links(osdep_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002787 int main(void) {
2788 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2789 return fdatasync(0);
2790 #else
2791 #error Not supported
2792 #endif
2793 }'''))
Andrew Deason8900c202022-03-15 22:52:25 -05002794
Akihiko Odaki797150d2025-04-24 13:50:13 +09002795has_madvise = cc.links(osdep_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002796 #include <sys/mman.h>
Andrew Deason8900c202022-03-15 22:52:25 -05002797 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
2798missing_madvise_proto = false
2799if has_madvise
2800 # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
2801 # but forget to prototype it. In this case, has_madvise will be true (the
2802 # test program links despite a compile warning). To detect the
2803 # missing-prototype case, we try again with a definitely-bogus prototype.
2804 # This will only compile if the system headers don't provide the prototype;
2805 # otherwise the conflicting prototypes will cause a compiler error.
Akihiko Odaki797150d2025-04-24 13:50:13 +09002806 missing_madvise_proto = cc.links(osdep_prefix + '''>
Andrew Deason8900c202022-03-15 22:52:25 -05002807 #include <sys/mman.h>
Andrew Deason8900c202022-03-15 22:52:25 -05002808 extern int madvise(int);
2809 int main(void) { return madvise(0); }''')
2810endif
2811config_host_data.set('CONFIG_MADVISE', has_madvise)
2812config_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
2813
Akihiko Odaki797150d2025-04-24 13:50:13 +09002814config_host_data.set('CONFIG_MEMFD', cc.links(osdep_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002815 #include <sys/mman.h>
2816 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Akihiko Odaki797150d2025-04-24 13:50:13 +09002817config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(osdep_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002818 #if !defined(AT_EMPTY_PATH)
2819 # error missing definition
2820 #else
2821 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2822 #endif'''))
Michal Privoznik12d7d0c2024-06-05 12:44:54 +02002823
2824# On Darwin posix_madvise() has the same return semantics as plain madvise(),
2825# i.e. errno is set and -1 is returned. That's not really how POSIX defines the
2826# function. On the flip side, it has madvise() which is preferred anyways.
2827if host_os != 'darwin'
Akihiko Odaki797150d2025-04-24 13:50:13 +09002828 config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(osdep_prefix + '''
Michal Privoznik12d7d0c2024-06-05 12:44:54 +02002829 #include <sys/mman.h>
Michal Privoznik12d7d0c2024-06-05 12:44:54 +02002830 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
2831endif
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002832
Akihiko Odaki797150d2025-04-24 13:50:13 +09002833config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(osdep_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002834 #include <pthread.h>
2835
2836 static void *f(void *p) { return NULL; }
2837 int main(void)
2838 {
2839 pthread_t thread;
2840 pthread_create(&thread, 0, f, 0);
2841 pthread_setname_np(thread, "QEMU");
2842 return 0;
2843 }''', dependencies: threads))
Akihiko Odaki797150d2025-04-24 13:50:13 +09002844config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(osdep_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002845 #include <pthread.h>
2846
2847 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
2848 int main(void)
2849 {
2850 pthread_t thread;
2851 pthread_create(&thread, 0, f, 0);
2852 return 0;
2853 }''', dependencies: threads))
Akihiko Odaki797150d2025-04-24 13:50:13 +09002854config_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(osdep_prefix + '''
Brad Smith3ada67a2022-12-18 03:22:04 -05002855 #include <pthread.h>
2856 #include <pthread_np.h>
2857
2858 static void *f(void *p) { return NULL; }
2859 int main(void)
2860 {
2861 pthread_t thread;
2862 pthread_create(&thread, 0, f, 0);
2863 pthread_set_name_np(thread, "QEMU");
2864 return 0;
2865 }''', dependencies: threads))
Akihiko Odaki797150d2025-04-24 13:50:13 +09002866config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(osdep_prefix + '''
Longpeng(Mike)657ac982022-02-22 17:05:05 +08002867 #include <pthread.h>
Longpeng(Mike)657ac982022-02-22 17:05:05 +08002868
2869 int main(void)
2870 {
2871 pthread_condattr_t attr
2872 pthread_condattr_init(&attr);
2873 pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2874 return 0;
2875 }''', dependencies: threads))
Akihiko Odaki797150d2025-04-24 13:50:13 +09002876config_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(osdep_prefix + '''
David Hildenbrand7730f322022-10-14 15:47:15 +02002877 #include <pthread.h>
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002878
David Hildenbrand7730f322022-10-14 15:47:15 +02002879 static void *f(void *p) { return NULL; }
2880 int main(void)
2881 {
2882 int setsize = CPU_ALLOC_SIZE(64);
2883 pthread_t thread;
2884 cpu_set_t *cpuset;
2885 pthread_create(&thread, 0, f, 0);
2886 cpuset = CPU_ALLOC(64);
2887 CPU_ZERO_S(setsize, cpuset);
2888 pthread_setaffinity_np(thread, setsize, cpuset);
2889 pthread_getaffinity_np(thread, setsize, cpuset);
2890 CPU_FREE(cpuset);
2891 return 0;
2892 }''', dependencies: threads))
Akihiko Odaki797150d2025-04-24 13:50:13 +09002893config_host_data.set('CONFIG_SIGNALFD', cc.links(osdep_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02002894 #include <sys/signalfd.h>
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02002895 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Akihiko Odaki797150d2025-04-24 13:50:13 +09002896config_host_data.set('CONFIG_SPLICE', cc.links(osdep_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002897 int main(void)
2898 {
2899 int len, fd = 0;
2900 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2901 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2902 return 0;
2903 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002904
Akihiko Odaki797150d2025-04-24 13:50:13 +09002905config_host_data.set('HAVE_MLOCKALL', cc.links(osdep_prefix + '''
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002906 #include <sys/mman.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002907 int main(void) {
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002908 return mlockall(MCL_FUTURE);
2909 }'''))
2910
Akihiko Odaki797150d2025-04-24 13:50:13 +09002911config_host_data.set('HAVE_MLOCK_ONFAULT', cc.links(osdep_prefix + '''
Daniil Tatianine76fadf2025-02-12 17:39:17 +03002912 #include <sys/mman.h>
2913 int main(void) {
2914 return mlockall(MCL_FUTURE | MCL_ONFAULT);
2915 }'''))
2916
Thomas Hutheea94532021-10-28 20:59:08 +02002917have_l2tpv3 = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002918if get_option('l2tpv3').allowed() and have_system
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002919 have_l2tpv3 = cc.has_type('struct mmsghdr',
Akihiko Odaki797150d2025-04-24 13:50:13 +09002920 prefix: osdep_prefix + '''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002921 #include <sys/socket.h>
2922 #include <linux/ip.h>''')
Thomas Hutheea94532021-10-28 20:59:08 +02002923endif
2924config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2925
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002926have_netmap = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002927if get_option('netmap').allowed() and have_system
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002928 have_netmap = cc.compiles('''
2929 #include <inttypes.h>
2930 #include <net/if.h>
2931 #include <net/netmap.h>
2932 #include <net/netmap_user.h>
2933 #if (NETMAP_API < 11) || (NETMAP_API > 15)
2934 #error
2935 #endif
2936 int main(void) { return 0; }''')
2937 if not have_netmap and get_option('netmap').enabled()
2938 error('Netmap headers not available')
2939 endif
2940endif
2941config_host_data.set('CONFIG_NETMAP', have_netmap)
2942
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002943# Work around a system header bug with some kernel/XFS header
2944# versions where they both try to define 'struct fsxattr':
2945# xfs headers will not try to redefine structs from linux headers
2946# if this macro is set.
2947config_host_data.set('HAVE_FSXATTR', cc.links('''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002948 #include <linux/fs.h>
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002949 struct fsxattr foo;
2950 int main(void) {
2951 return 0;
2952 }'''))
2953
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002954# Some versions of Mac OS X incorrectly define SIZE_MAX
2955config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2956 #include <stdint.h>
2957 #include <stdio.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002958 int main(void) {
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002959 return printf("%zu", SIZE_MAX);
2960 }''', args: ['-Werror']))
2961
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002962# See if 64-bit atomic operations are supported.
2963# Note that without __atomic builtins, we can only
2964# assume atomic loads/stores max at pointer size.
2965config_host_data.set('CONFIG_ATOMIC64', cc.links('''
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002966 #include <stdint.h>
2967 int main(void)
2968 {
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002969 uint64_t x = 0, y = 0;
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002970 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
2971 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
2972 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2973 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2974 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2975 return 0;
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02002976 }''', args: qemu_isa_flags))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002977
Kohei Tokunagaccc403e2025-04-28 15:39:07 +09002978# has_int128_type is set to false on Emscripten to avoid errors by libffi
2979# during runtime.
2980has_int128_type = host_os != 'emscripten' and cc.compiles('''
Richard Henderson6479dd72023-05-24 08:14:41 -07002981 __int128_t a;
2982 __uint128_t b;
2983 int main(void) { b = a; }''')
2984config_host_data.set('CONFIG_INT128_TYPE', has_int128_type)
2985
2986has_int128 = has_int128_type and cc.links('''
Marc-André Lureau848126d2022-02-28 15:49:19 +04002987 __int128_t a;
2988 __uint128_t b;
2989 int main (void) {
2990 a = a + b;
2991 b = a * b;
2992 a = a * a;
2993 return 0;
2994 }''')
Marc-André Lureau848126d2022-02-28 15:49:19 +04002995config_host_data.set('CONFIG_INT128', has_int128)
2996
Richard Henderson6479dd72023-05-24 08:14:41 -07002997if has_int128_type
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002998 # "do we have 128-bit atomics which are handled inline and specifically not
2999 # via libatomic". The reason we can't use libatomic is documented in the
3000 # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003001 # We only care about these operations on 16-byte aligned pointers, so
3002 # force 16-byte alignment of the pointer, which may be greater than
3003 # __alignof(unsigned __int128) for the host.
3004 atomic_test_128 = '''
3005 int main(int ac, char **av) {
Richard Henderson6479dd72023-05-24 08:14:41 -07003006 __uint128_t *p = __builtin_assume_aligned(av[ac - 1], 16);
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003007 p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED);
3008 __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED);
3009 __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
3010 return 0;
3011 }'''
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02003012 has_atomic128 = cc.links(atomic_test_128, args: qemu_isa_flags)
Marc-André Lureau848126d2022-02-28 15:49:19 +04003013
3014 config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
3015
3016 if not has_atomic128
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003017 # Even with __builtin_assume_aligned, the above test may have failed
3018 # without optimization enabled. Try again with optimizations locally
3019 # enabled for the function. See
3020 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02003021 has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128,
3022 args: qemu_isa_flags)
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003023 config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt)
Marc-André Lureau848126d2022-02-28 15:49:19 +04003024
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003025 if not has_atomic128_opt
3026 config_host_data.set('CONFIG_CMPXCHG128', cc.links('''
3027 int main(void)
3028 {
Richard Henderson6479dd72023-05-24 08:14:41 -07003029 __uint128_t x = 0, y = 0;
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003030 __sync_val_compare_and_swap_16(&x, y, x);
3031 return 0;
3032 }
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02003033 ''', args: qemu_isa_flags))
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003034 endif
Marc-André Lureau848126d2022-02-28 15:49:19 +04003035 endif
3036endif
Paolo Bonzinibd87a362021-10-07 15:08:25 +02003037
Akihiko Odaki797150d2025-04-24 13:50:13 +09003038config_host_data.set('CONFIG_GETAUXVAL', cc.links(osdep_prefix + '''
Paolo Bonzinibd87a362021-10-07 15:08:25 +02003039 #include <sys/auxv.h>
3040 int main(void) {
3041 return getauxval(AT_HWCAP) == 0;
3042 }'''))
3043
Akihiko Odaki797150d2025-04-24 13:50:13 +09003044config_host_data.set('CONFIG_ELF_AUX_INFO', cc.links(osdep_prefix + '''
Brad Smith27fca0a2024-07-27 23:58:55 -04003045 #include <sys/auxv.h>
3046 int main(void) {
3047 unsigned long hwcap = 0;
3048 elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
3049 return hwcap;
3050 }'''))
3051
Paolo Bonzini0dae95d2022-04-20 17:33:43 +02003052config_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
3053 #include <linux/usbdevice_fs.h>
3054
3055 #ifndef USBDEVFS_GET_CAPABILITIES
3056 #error "USBDEVFS_GET_CAPABILITIES undefined"
3057 #endif
3058
3059 #ifndef USBDEVFS_DISCONNECT_CLAIM
3060 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
3061 #endif
3062
3063 int main(void) { return 0; }'''))
3064
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02003065have_keyring = get_option('keyring') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003066 .require(host_os == 'linux', error_message: 'keyring is only available on Linux') \
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02003067 .require(cc.compiles('''
3068 #include <errno.h>
3069 #include <asm/unistd.h>
3070 #include <linux/keyctl.h>
3071 #include <sys/syscall.h>
3072 #include <unistd.h>
3073 int main(void) {
3074 return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
3075 }'''), error_message: 'keyctl syscall not available on this system').allowed()
3076config_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
3077
Paolo Bonzini622753d2021-11-08 13:38:58 +01003078have_cpuid_h = cc.links('''
3079 #include <cpuid.h>
3080 int main(void) {
3081 unsigned a, b, c, d;
3082 unsigned max = __get_cpuid_max(0, 0);
3083
3084 if (max >= 1) {
3085 __cpuid(1, a, b, c, d);
3086 }
3087
3088 if (max >= 7) {
3089 __cpuid_count(7, 0, a, b, c, d);
3090 }
3091
3092 return 0;
3093 }''')
3094config_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
3095
Richard Hendersone5717302024-06-27 17:36:43 +00003096# Don't bother to advertise asm/hwprobe.h for old versions that do
3097# not contain RISCV_HWPROBE_EXT_ZBA.
3098config_host_data.set('CONFIG_ASM_HWPROBE_H',
3099 cc.has_header_symbol('asm/hwprobe.h',
3100 'RISCV_HWPROBE_EXT_ZBA'))
3101
Paolo Bonzini53466862024-07-05 09:12:20 +02003102if have_cpuid_h
3103 have_avx2 = cc.links('''
Paolo Bonzini622753d2021-11-08 13:38:58 +01003104 #include <immintrin.h>
Richard Henderson701ea582022-12-03 19:31:12 -06003105 static int __attribute__((target("avx2"))) bar(void *a) {
Paolo Bonzini622753d2021-11-08 13:38:58 +01003106 __m256i x = *(__m256i *)a;
3107 return _mm256_testz_si256(x, x);
3108 }
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01003109 int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
Paolo Bonzini53466862024-07-05 09:12:20 +02003110 ''')
3111 have_avx512bw = cc.links('''
ling xu04ffce12022-11-16 23:29:22 +08003112 #include <immintrin.h>
Richard Hendersondc165fc2023-05-01 22:05:55 +01003113 static int __attribute__((target("avx512bw"))) bar(void *a) {
ling xu04ffce12022-11-16 23:29:22 +08003114 __m512i *x = a;
3115 __m512i res= _mm512_abs_epi8(*x);
3116 return res[1];
3117 }
3118 int main(int argc, char *argv[]) { return bar(argv[0]); }
Paolo Bonzini53466862024-07-05 09:12:20 +02003119 ''')
3120 if get_option('x86_version') >= '3' and not have_avx2
3121 error('Cannot enable AVX optimizations due to missing intrinsics')
3122 elif get_option('x86_version') >= '4' and not have_avx512bw
3123 error('Cannot enable AVX512 optimizations due to missing intrinsics')
3124 endif
3125else
3126 have_avx2 = false
3127 have_avx512bw = false
3128 if get_option('x86_version') >= '3'
3129 error('Cannot enable AVX optimizations due to missing cpuid.h')
3130 endif
3131endif
3132config_host_data.set('CONFIG_AVX2_OPT', have_avx2)
3133config_host_data.set('CONFIG_AVX512BW_OPT', have_avx512bw)
ling xu04ffce12022-11-16 23:29:22 +08003134
Richard Henderson8d97f282023-06-02 07:43:40 +00003135# For both AArch64 and AArch32, detect if builtins are available.
3136config_host_data.set('CONFIG_ARM_AES_BUILTIN', cc.compiles('''
3137 #include <arm_neon.h>
3138 #ifndef __ARM_FEATURE_AES
3139 __attribute__((target("+crypto")))
3140 #endif
3141 void foo(uint8x16_t *p) { *p = vaesmcq_u8(*p); }
3142 '''))
3143
Paolo Bonzinib87df902021-11-08 13:52:11 +01003144if get_option('membarrier').disabled()
3145 have_membarrier = false
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003146elif host_os == 'windows'
Paolo Bonzinib87df902021-11-08 13:52:11 +01003147 have_membarrier = true
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003148elif host_os == 'linux'
Paolo Bonzinib87df902021-11-08 13:52:11 +01003149 have_membarrier = cc.compiles('''
3150 #include <linux/membarrier.h>
3151 #include <sys/syscall.h>
3152 #include <unistd.h>
3153 #include <stdlib.h>
3154 int main(void) {
3155 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
3156 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
3157 exit(0);
3158 }''')
3159endif
3160config_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
3161 .require(have_membarrier, error_message: 'membarrier system call not available') \
3162 .allowed())
3163
Paolo Bonzini34b52612021-11-08 14:02:42 +01003164have_afalg = get_option('crypto_afalg') \
Akihiko Odaki797150d2025-04-24 13:50:13 +09003165 .require(cc.compiles(osdep_prefix + '''
Paolo Bonzini34b52612021-11-08 14:02:42 +01003166 #include <sys/socket.h>
3167 #include <linux/if_alg.h>
3168 int main(void) {
3169 int sock;
3170 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
3171 return sock;
3172 }
3173 '''), error_message: 'AF_ALG requested but could not be detected').allowed()
3174config_host_data.set('CONFIG_AF_ALG', have_afalg)
3175
Marc-André Lureau9d734b82022-04-01 15:50:05 +04003176config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
3177 'linux/vm_sockets.h', 'AF_VSOCK',
3178 prefix: '#include <sys/socket.h>',
3179))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02003180
Marc-André Lureau8821a382022-02-01 16:53:43 +04003181have_vss = false
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003182have_vss_sdk = false # old xp/2003 SDK
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003183if host_os == 'windows' and 'cpp' in all_languages
Marc-André Lureau8821a382022-02-01 16:53:43 +04003184 have_vss = cxx.compiles('''
3185 #define __MIDL_user_allocate_free_DEFINED__
Marc-André Lureau32478cb2022-02-22 23:40:01 +04003186 #include <vss.h>
Marc-André Lureau8821a382022-02-01 16:53:43 +04003187 int main(void) { return VSS_CTX_BACKUP; }''')
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003188 have_vss_sdk = cxx.has_header('vscoordint.h')
Marc-André Lureau8821a382022-02-01 16:53:43 +04003189endif
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003190config_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
Marc-André Lureau8821a382022-02-01 16:53:43 +04003191
Richard Henderson6391c772022-04-17 11:30:06 -07003192# Older versions of MinGW do not import _lock_file and _unlock_file properly.
3193# This was fixed for v6.0.0 with commit b48e3ac8969d.
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003194if host_os == 'windows'
Richard Henderson6391c772022-04-17 11:30:06 -07003195 config_host_data.set('HAVE__LOCK_FILE', cc.links('''
3196 #include <stdio.h>
3197 int main(void) {
3198 _lock_file(NULL);
3199 _unlock_file(NULL);
3200 return 0;
3201 }''', name: '_lock_file and _unlock_file'))
3202endif
3203
Qiang Yu98a050c2025-03-27 10:58:48 +08003204if spice.found()
3205 config_host_data.set('HAVE_SPICE_QXL_GL_SCANOUT2',
3206 cc.has_function('spice_qxl_gl_scanout2', dependencies: spice))
3207endif
3208
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003209if host_os == 'windows'
Pierrick Bouvierdbd672c2023-02-21 16:30:04 +01003210 mingw_has_setjmp_longjmp = cc.links('''
3211 #include <setjmp.h>
3212 int main(void) {
3213 /*
3214 * These functions are not available in setjmp header, but may be
3215 * available at link time, from libmingwex.a.
3216 */
3217 extern int __mingw_setjmp(jmp_buf);
3218 extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int);
3219 jmp_buf env;
3220 __mingw_setjmp(env);
3221 __mingw_longjmp(env, 0);
3222 }
3223 ''', name: 'mingw setjmp and longjmp')
3224
3225 if cpu == 'aarch64' and not mingw_has_setjmp_longjmp
3226 error('mingw must provide setjmp/longjmp for windows-arm64')
3227 endif
3228endif
3229
Richard Hendersonacce7282025-02-02 15:09:23 -08003230# Detect host pointer size for the target configuration loop.
3231host_long_bits = cc.sizeof('void *') * 8
3232
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003233########################
3234# Target configuration #
3235########################
3236
Paolo Bonzini2becc362020-02-03 11:42:03 +01003237minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003238
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02003239config_all_accel = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04003240config_all_devices = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003241config_devices_mak_list = []
3242config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02003243config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003244config_target_mak = {}
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07003245config_base_arch_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003246
3247disassemblers = {
3248 'alpha' : ['CONFIG_ALPHA_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003249 'avr' : ['CONFIG_AVR_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06003250 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003251 'hppa' : ['CONFIG_HPPA_DIS'],
3252 'i386' : ['CONFIG_I386_DIS'],
3253 'x86_64' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003254 'm68k' : ['CONFIG_M68K_DIS'],
3255 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
3256 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003257 'or1k' : ['CONFIG_OPENRISC_DIS'],
3258 'ppc' : ['CONFIG_PPC_DIS'],
3259 'riscv' : ['CONFIG_RISCV_DIS'],
3260 'rx' : ['CONFIG_RX_DIS'],
3261 's390' : ['CONFIG_S390_DIS'],
3262 'sh4' : ['CONFIG_SH4_DIS'],
3263 'sparc' : ['CONFIG_SPARC_DIS'],
3264 'xtensa' : ['CONFIG_XTENSA_DIS'],
Song Gaoaae17462022-06-06 20:43:06 +08003265 'loongarch' : ['CONFIG_LOONGARCH_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003266}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003267
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02003268have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01003269host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02003270 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01003271 (have_tpm ? ['CONFIG_TPM=y'] : []) + \
Marc-André Lureaucca15752023-08-30 13:38:25 +04003272 (pixman.found() ? ['CONFIG_PIXMAN=y'] : []) + \
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02003273 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02003274 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini88b6e612022-04-20 17:33:40 +02003275 (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
Dorjoy Chowdhurybb154e32024-10-09 03:17:23 +06003276 (libcbor.found() ? ['CONFIG_LIBCBOR=y'] : []) + \
Dorjoy Chowdhury63d2a5c2024-10-09 03:17:24 +06003277 (gnutls.found() ? ['CONFIG_GNUTLS=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01003278 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini1935b7e2024-05-07 14:13:46 +02003279 (fdt.found() ? ['CONFIG_FDT=y'] : []) + \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003280 (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
3281 (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
3282 (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01003283 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003284 (host_os == 'linux' ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman55116962022-06-13 16:26:24 -04003285 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02003286 (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : []) + \
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03003287 (hv_balloon ? ['CONFIG_HV_BALLOON_POSSIBLE=y'] : []) + \
3288 (have_rust ? ['CONFIG_HAVE_RUST=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01003289
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003290ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003291
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003292default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
3293actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003294fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003295foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04003296 config_target = { 'TARGET_NAME': target.split('-')[0] }
3297 if target.endswith('linux-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003298 if host_os != 'linux'
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003299 if default_targets
3300 continue
3301 endif
3302 error('Target @0@ is only available on a Linux host'.format(target))
3303 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04003304 config_target += { 'CONFIG_LINUX_USER': 'y' }
3305 elif target.endswith('bsd-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003306 if host_os not in bsd_oses
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003307 if default_targets
3308 continue
3309 endif
3310 error('Target @0@ is only available on a BSD host'.format(target))
3311 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04003312 config_target += { 'CONFIG_BSD_USER': 'y' }
3313 elif target.endswith('softmmu')
Philippe Mathieu-Daudébd0c03b2023-06-13 15:33:45 +02003314 config_target += { 'CONFIG_SYSTEM_ONLY': 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04003315 config_target += { 'CONFIG_SOFTMMU': 'y' }
3316 endif
3317 if target.endswith('-user')
3318 config_target += {
3319 'CONFIG_USER_ONLY': 'y',
3320 'CONFIG_QEMU_INTERP_PREFIX':
Ilya Leoshkevichc1075212024-10-30 00:17:47 +01003321 get_option('interp_prefix').replace('%M', config_target['TARGET_NAME']),
3322 'CONFIG_QEMU_RTSIG_MAP': get_option('rtsig_map'),
Paolo Bonzini765686d2020-09-18 06:37:21 -04003323 }
3324 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02003325
Richard Hendersonacce7282025-02-02 15:09:23 -08003326 config_target += keyval.load('configs/targets' / target + '.mak')
3327
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003328 target_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04003329 foreach sym: accelerators
Richard Hendersonacce7282025-02-02 15:09:23 -08003330 # Disallow 64-bit on 32-bit emulation and virtualization
3331 if host_long_bits < config_target['TARGET_LONG_BITS'].to_int()
3332 continue
3333 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04003334 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
3335 config_target += { sym: 'y' }
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02003336 config_all_accel += { sym: 'y' }
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003337 target_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04003338 endif
3339 endforeach
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003340 if target_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003341 if default_targets
3342 continue
3343 endif
3344 error('No accelerator available for target @0@'.format(target))
3345 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04003346
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003347 if 'TARGET_NEED_FDT' in config_target and not fdt.found()
Paolo Bonzini9b089d22024-05-08 09:25:48 +02003348 if default_targets
3349 warning('Disabling ' + target + ' due to missing libfdt')
3350 else
3351 fdt_required += target
3352 endif
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003353 continue
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003354 endif
3355
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003356 actual_target_dirs += target
3357
Paolo Bonzinifa731682020-09-21 05:19:07 -04003358 # Add default keys
Richard Hendersonacce7282025-02-02 15:09:23 -08003359 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzinifa731682020-09-21 05:19:07 -04003360 if 'TARGET_BASE_ARCH' not in config_target
3361 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
3362 endif
3363 if 'TARGET_ABI_DIR' not in config_target
3364 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
3365 endif
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003366 if 'TARGET_BIG_ENDIAN' not in config_target
3367 config_target += {'TARGET_BIG_ENDIAN': 'n'}
3368 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02003369
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003370 foreach k, v: disassemblers
Paolo Bonzini823eb012021-11-08 14:18:17 +01003371 if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003372 foreach sym: v
3373 config_target += { sym: 'y' }
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003374 endforeach
3375 endif
3376 endforeach
3377
Paolo Bonzini859aef02020-08-04 18:14:26 +02003378 config_target_data = configuration_data()
3379 foreach k, v: config_target
3380 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
3381 # do nothing
3382 elif ignored.contains(k)
3383 # do nothing
3384 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003385 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
3386 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02003387 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04003388 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02003389 config_target_data.set_quoted(k, v)
3390 elif v == 'y'
3391 config_target_data.set(k, 1)
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003392 elif v == 'n'
3393 config_target_data.set(k, 0)
Paolo Bonzini859aef02020-08-04 18:14:26 +02003394 else
3395 config_target_data.set(k, v)
3396 endif
3397 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01003398 config_target_data.set('QEMU_ARCH',
3399 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02003400 config_target_h += {target: configure_file(output: target + '-config-target.h',
3401 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003402
3403 if target.endswith('-softmmu')
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003404 target_kconfig += 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'
3405 target_kconfig += 'CONFIG_TARGET_BIG_ENDIAN=' + config_target['TARGET_BIG_ENDIAN']
3406
Paolo Bonziniae3a4202025-02-19 11:18:28 +01003407 # PVG is not cross-architecture. Use accelerator_targets as a proxy to
3408 # figure out which target can support PVG on this host
3409 if pvg.found() and target in accelerator_targets.get('CONFIG_HVF', [])
3410 target_kconfig += 'CONFIG_MAC_PVG=y'
3411 endif
3412
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003413 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003414 config_devices_mak = target + '-config-devices.mak'
3415 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003416 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01003417 output: config_devices_mak,
3418 depfile: config_devices_mak + '.d',
3419 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01003420 command: [minikconf,
3421 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01003422 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003423 host_kconfig, target_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02003424
3425 config_devices_data = configuration_data()
3426 config_devices = keyval.load(config_devices_mak)
3427 foreach k, v: config_devices
3428 config_devices_data.set(k, 1)
3429 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003430 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02003431 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
3432 configuration: config_devices_data)}
3433 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04003434 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01003435 endif
3436 config_target_mak += {target: config_target}
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07003437
3438 # build a merged config for all targets with the same TARGET_BASE_ARCH
3439 target_base_arch = config_target['TARGET_BASE_ARCH']
3440 config_base_arch = config_base_arch_mak.get(target_base_arch, {}) + config_target
3441 config_base_arch_mak += {target_base_arch: config_base_arch}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003442endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003443target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003444
Paolo Bonzinieed56e92021-11-10 11:01:26 +01003445target_configs_h = []
3446foreach target: target_dirs
3447 target_configs_h += config_target_h[target]
3448 target_configs_h += config_devices_h.get(target, [])
3449endforeach
3450genh += custom_target('config-poison.h',
3451 input: [target_configs_h],
3452 output: 'config-poison.h',
3453 capture: true,
3454 command: [find_program('scripts/make-config-poison.sh'),
3455 target_configs_h])
3456
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003457if fdt_required.length() > 0
3458 error('fdt disabled but required by targets ' + ', '.join(fdt_required))
3459endif
3460
Paolo Bonzinia775c712023-09-08 12:09:22 +02003461###############
3462# Subprojects #
3463###############
Paolo Bonzini4d34a862020-10-05 11:31:15 +02003464
Jagannathan Raman55116962022-06-13 16:26:24 -04003465libvfio_user_dep = not_found
3466if have_system and vfio_user_server_allowed
Paolo Bonzini2019cab2023-05-18 16:50:00 +02003467 libvfio_user_proj = subproject('libvfio-user', required: true)
Paolo Bonzini53283532023-03-30 12:47:23 +02003468 libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
Jagannathan Raman55116962022-06-13 16:26:24 -04003469endif
3470
Paolo Bonzinia775c712023-09-08 12:09:22 +02003471vhost_user = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003472if host_os == 'linux' and have_vhost_user
Paolo Bonzinia775c712023-09-08 12:09:22 +02003473 libvhost_user = subproject('libvhost-user')
3474 vhost_user = libvhost_user.get_variable('vhost_user_dep')
3475endif
3476
3477libvduse = not_found
3478if have_libvduse
3479 libvduse_proj = subproject('libvduse')
3480 libvduse = libvduse_proj.get_variable('libvduse_dep')
3481endif
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003482
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003483#####################
3484# Generated sources #
3485#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003486
Paolo Bonzinif3a6e9b2024-11-12 11:54:11 +01003487config_host_h = configure_file(output: 'config-host.h', configuration: config_host_data)
3488genh += config_host_h
Paolo Bonzini7b72c7d2024-10-15 11:14:18 +02003489
Marc-André Lureau3f885652019-07-15 18:06:04 +04003490hxtool = find_program('scripts/hxtool')
Marc-André Lureaue2c40122023-01-24 18:00:57 +00003491shaderinclude = find_program('scripts/shaderinclude.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003492qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003493qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
3494 meson.current_source_dir() / 'scripts/qapi/commands.py',
3495 meson.current_source_dir() / 'scripts/qapi/common.py',
3496 meson.current_source_dir() / 'scripts/qapi/error.py',
3497 meson.current_source_dir() / 'scripts/qapi/events.py',
3498 meson.current_source_dir() / 'scripts/qapi/expr.py',
3499 meson.current_source_dir() / 'scripts/qapi/gen.py',
3500 meson.current_source_dir() / 'scripts/qapi/introspect.py',
Markus Armbruster88d357d2023-04-28 12:54:16 +02003501 meson.current_source_dir() / 'scripts/qapi/main.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003502 meson.current_source_dir() / 'scripts/qapi/parser.py',
3503 meson.current_source_dir() / 'scripts/qapi/schema.py',
3504 meson.current_source_dir() / 'scripts/qapi/source.py',
3505 meson.current_source_dir() / 'scripts/qapi/types.py',
Daniel P. Berrangé2ebb09f2025-02-05 12:35:50 +00003506 meson.current_source_dir() / 'scripts/qapi/features.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003507 meson.current_source_dir() / 'scripts/qapi/visit.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003508 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003509]
3510
3511tracetool = [
3512 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003513 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003514]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003515tracetool_depends = files(
3516 'scripts/tracetool/backend/log.py',
3517 'scripts/tracetool/backend/__init__.py',
3518 'scripts/tracetool/backend/dtrace.py',
3519 'scripts/tracetool/backend/ftrace.py',
3520 'scripts/tracetool/backend/simple.py',
3521 'scripts/tracetool/backend/syslog.py',
3522 'scripts/tracetool/backend/ust.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003523 'scripts/tracetool/format/ust_events_c.py',
3524 'scripts/tracetool/format/ust_events_h.py',
3525 'scripts/tracetool/format/__init__.py',
3526 'scripts/tracetool/format/d.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003527 'scripts/tracetool/format/simpletrace_stap.py',
3528 'scripts/tracetool/format/c.py',
3529 'scripts/tracetool/format/h.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003530 'scripts/tracetool/format/log_stap.py',
3531 'scripts/tracetool/format/stap.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003532 'scripts/tracetool/__init__.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003533)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003534
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003535qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
3536 meson.current_source_dir(),
Paolo Bonzinib0b43232022-04-20 17:33:54 +02003537 get_option('pkgversion'), meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003538qemu_version = custom_target('qemu-version.h',
3539 output: 'qemu-version.h',
3540 command: qemu_version_cmd,
3541 capture: true,
3542 build_by_default: true,
3543 build_always_stale: true)
3544genh += qemu_version
3545
Marc-André Lureau3f885652019-07-15 18:06:04 +04003546hxdep = []
3547hx_headers = [
3548 ['qemu-options.hx', 'qemu-options.def'],
3549 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
3550]
3551if have_system
3552 hx_headers += [
3553 ['hmp-commands.hx', 'hmp-commands.h'],
3554 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
3555 ]
3556endif
3557foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003558 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04003559 input: files(d[0]),
3560 output: d[1],
3561 capture: true,
Marc-André Lureau3f885652019-07-15 18:06:04 +04003562 command: [hxtool, '-h', '@INPUT0@'])
3563endforeach
3564genh += hxdep
3565
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003566###############
3567# Trace files #
3568###############
3569
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003570# TODO: add each directory to the subdirs from its own meson.build, once
3571# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003572trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003573 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003574 'qapi',
3575 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003576 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003577 'util',
Alex Bennée842b42d2022-09-29 12:42:22 +01003578 'gdbstub',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003579]
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003580if have_linux_user
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003581 trace_events_subdirs += [ 'linux-user' ]
3582endif
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003583if have_bsd_user
3584 trace_events_subdirs += [ 'bsd-user' ]
3585endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003586if have_block
3587 trace_events_subdirs += [
3588 'authz',
3589 'block',
Daniel P. Berrangé48fc8872024-07-23 11:31:24 +01003590 'chardev',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003591 'io',
3592 'nbd',
3593 'scsi',
3594 ]
3595endif
3596if have_system
3597 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003598 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003599 'audio',
3600 'backends',
3601 'backends/tpm',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003602 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003603 'hw/9pfs',
3604 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08003605 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003606 'hw/alpha',
3607 'hw/arm',
3608 'hw/audio',
3609 'hw/block',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003610 'hw/char',
3611 'hw/display',
3612 'hw/dma',
Ninad Palsule99f0c042024-01-26 04:49:46 -06003613 'hw/fsi',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003614 'hw/hyperv',
3615 'hw/i2c',
3616 'hw/i386',
3617 'hw/i386/xen',
David Woodhouseaa98ee32023-01-13 19:51:32 +00003618 'hw/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003619 'hw/ide',
3620 'hw/input',
3621 'hw/intc',
3622 'hw/isa',
3623 'hw/mem',
3624 'hw/mips',
3625 'hw/misc',
3626 'hw/misc/macio',
3627 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08003628 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01003629 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02003630 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003631 'hw/nvram',
3632 'hw/pci',
3633 'hw/pci-host',
3634 'hw/ppc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003635 'hw/rtc',
Tomasz Jeznach0c54acb2024-10-16 17:40:27 -03003636 'hw/riscv',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003637 'hw/s390x',
3638 'hw/scsi',
3639 'hw/sd',
Bernhard Beschow3647dca2024-11-05 10:10:00 +00003640 'hw/sensor',
BALATON Zoltanad52cfc2021-10-29 23:02:09 +02003641 'hw/sh4',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003642 'hw/sparc',
3643 'hw/sparc64',
3644 'hw/ssi',
3645 'hw/timer',
3646 'hw/tpm',
Gerd Hoffmann736ca802025-02-25 17:30:21 +01003647 'hw/uefi',
Jeuk Kimbc4e68d2023-09-06 16:43:48 +09003648 'hw/ufs',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003649 'hw/usb',
3650 'hw/vfio',
3651 'hw/virtio',
Alexander Graf11fa0562023-06-14 22:56:23 +00003652 'hw/vmapple',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003653 'hw/watchdog',
3654 'hw/xen',
3655 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003656 'migration',
3657 'net',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003658 'system',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003659 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05003660 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003661 ]
3662endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003663if have_system or have_user
3664 trace_events_subdirs += [
3665 'accel/tcg',
3666 'hw/core',
3667 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02003668 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003669 'target/hppa',
3670 'target/i386',
3671 'target/i386/kvm',
Tianrui Zhaof8447432024-01-05 15:57:59 +08003672 'target/loongarch',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02003673 'target/mips/tcg',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003674 'target/ppc',
3675 'target/riscv',
3676 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08003677 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003678 'target/sparc',
3679 ]
3680endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003681
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003682###################
3683# Collect sources #
3684###################
3685
3686authz_ss = ss.source_set()
3687blockdev_ss = ss.source_set()
3688block_ss = ss.source_set()
3689chardev_ss = ss.source_set()
3690common_ss = ss.source_set()
3691crypto_ss = ss.source_set()
3692hwcore_ss = ss.source_set()
3693io_ss = ss.source_set()
3694qmp_ss = ss.source_set()
3695qom_ss = ss.source_set()
3696system_ss = ss.source_set()
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07003697libsystem_ss = system_ss
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003698specific_fuzz_ss = ss.source_set()
3699specific_ss = ss.source_set()
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02003700rust_devices_ss = ss.source_set()
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003701stub_ss = ss.source_set()
3702trace_ss = ss.source_set()
3703user_ss = ss.source_set()
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07003704libuser_ss = user_ss
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003705util_ss = ss.source_set()
3706
3707# accel modules
3708qtest_module_ss = ss.source_set()
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003709
3710modules = {}
3711target_modules = {}
Pierrick Bouvier892b06c2025-03-04 22:24:15 +00003712plugin_modules = []
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003713hw_arch = {}
3714target_arch = {}
3715target_system_arch = {}
3716target_user_arch = {}
Pierrick Bouvierd4ecfc52025-03-24 21:59:08 -07003717hw_common_arch = {}
Pierrick Bouvierb2bb3f32025-05-12 11:04:17 -07003718target_common_arch = {}
3719target_common_system_arch = {}
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003720
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +01003721# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
3722# that is filled in by qapi/.
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003723subdir('qapi')
3724subdir('qobject')
3725subdir('stubs')
3726subdir('trace')
3727subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04003728subdir('qom')
3729subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003730subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04003731subdir('ui')
Alex Bennée842b42d2022-09-29 12:42:22 +01003732subdir('gdbstub')
Philippe Mathieu-Daudé68621262024-04-08 17:53:20 +02003733if have_system
3734 subdir('hw')
3735else
3736 subdir('hw/core')
3737endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003738
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003739if enable_modules
3740 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
Akihiko Odaki414b1802024-05-24 17:00:22 +09003741 modulecommon = declare_dependency(objects: libmodulecommon.extract_all_objects(recursive: false), compile_args: '-DBUILD_DSO')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003742endif
3743
Paolo Bonzini1220f582023-08-30 11:52:43 +02003744qom_ss = qom_ss.apply({})
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003745libqom = static_library('qom', qom_ss.sources() + genh,
3746 dependencies: [qom_ss.dependencies()],
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003747 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003748qom = declare_dependency(objects: libqom.extract_all_objects(recursive: false),
3749 dependencies: qom_ss.dependencies())
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003750
3751event_loop_base = files('event-loop-base.c')
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003752event_loop_base = static_library('event-loop-base',
3753 sources: event_loop_base + genh,
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003754 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003755event_loop_base = declare_dependency(objects: event_loop_base.extract_all_objects(recursive: false),
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003756 dependencies: [qom])
3757
Paolo Bonzini1220f582023-08-30 11:52:43 +02003758stub_ss = stub_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003759
3760util_ss.add_all(trace_ss)
Paolo Bonzini1220f582023-08-30 11:52:43 +02003761util_ss = util_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003762libqemuutil = static_library('qemuutil',
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003763 build_by_default: false,
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003764 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6190fd62024-04-08 17:53:13 +02003765 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc])
Steve Sistare57ad6ab2025-01-15 11:00:27 -08003766qemuutil_deps = [event_loop_base]
3767if host_os != 'windows'
3768 qemuutil_deps += [rt]
3769endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003770qemuutil = declare_dependency(link_with: libqemuutil,
Nicolas Saenz Julienne70ac26b2022-04-25 09:57:22 +02003771 sources: genh + version_res,
Steve Sistare57ad6ab2025-01-15 11:00:27 -08003772 dependencies: qemuutil_deps)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003773
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01003774if have_system or have_user
3775 decodetree = generator(find_program('scripts/decodetree.py'),
3776 output: 'decode-@BASENAME@.c.inc',
3777 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3778 subdir('libdecnumber')
3779 subdir('target')
3780endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003781
Paolo Bonzini478e9432020-08-17 12:47:55 +02003782subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04003783subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04003784subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003785subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04003786subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003787
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003788if have_block
3789 block_ss.add(files(
3790 'block.c',
3791 'blockjob.c',
3792 'job.c',
3793 'qemu-io-cmds.c',
3794 ))
Paolo Bonzini406523f2021-10-13 11:43:54 +02003795 if config_host_data.get('CONFIG_REPLICATION')
3796 block_ss.add(files('replication.c'))
3797 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003798
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003799 subdir('nbd')
3800 subdir('scsi')
3801 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003802
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003803 blockdev_ss.add(files(
3804 'blockdev.c',
3805 'blockdev-nbd.c',
3806 'iothread.c',
3807 'job-qmp.c',
Akihiko Odaki7b1070a2024-05-24 17:00:23 +09003808 ))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003809
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003810 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
3811 # os-win32.c does not
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003812 if host_os == 'windows'
Paolo Bonzinidc495492023-08-30 11:29:54 +02003813 system_ss.add(files('os-win32.c'))
Kohei Tokunagaccc403e2025-04-28 15:39:07 +09003814 elif host_os == 'emscripten'
3815 blockdev_ss.add(files('os-wasm.c'))
Paolo Bonzinidc495492023-08-30 11:29:54 +02003816 else
3817 blockdev_ss.add(files('os-posix.c'))
3818 endif
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003819endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02003820
Philippe Mathieu-Daudéfe0007f2023-09-14 20:57:12 +02003821common_ss.add(files('cpu-common.c'))
3822specific_ss.add(files('cpu-target.c'))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003823
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003824subdir('system')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003825
Richard Henderson44b99a62021-03-22 12:24:26 +01003826# Work around a gcc bug/misfeature wherein constant propagation looks
3827# through an alias:
3828# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
3829# to guess that a const variable is always zero. Without lto, this is
3830# impossible, as the alias is restricted to page-vary-common.c. Indeed,
3831# without lto, not even the alias is required -- we simply use different
3832# declarations in different compilation units.
3833pagevary = files('page-vary-common.c')
3834if get_option('b_lto')
3835 pagevary_flags = ['-fno-lto']
3836 if get_option('cfi')
3837 pagevary_flags += '-fno-sanitize=cfi-icall'
3838 endif
Thomas Huth54c9b192022-03-30 13:48:08 +02003839 pagevary = static_library('page-vary-common', sources: pagevary + genh,
Richard Henderson44b99a62021-03-22 12:24:26 +01003840 c_args: pagevary_flags)
3841 pagevary = declare_dependency(link_with: pagevary)
3842endif
3843common_ss.add(pagevary)
Philippe Mathieu-Daudé75bbe6a2023-12-07 10:41:27 +01003844specific_ss.add(files('page-target.c', 'page-vary-target.c'))
Richard Henderson6670d4d2021-03-22 12:24:24 +01003845
Philippe Mathieu-Daudé3d881162025-03-23 12:47:37 +01003846common_ss.add(files('target-info.c'))
Philippe Mathieu-Daudé2b7ae6e2025-04-17 17:59:35 +02003847specific_ss.add(files('target-info-stub.c'))
3848
Marc-André Lureauab318052019-07-24 19:23:16 +04003849subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04003850subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04003851subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003852subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04003853subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04003854subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00003855subdir('semihosting')
Markus Armbrusteraa09b3d2023-01-24 13:19:36 +01003856subdir('stats')
Richard Henderson104cc2c2021-03-08 12:04:33 -08003857subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08003858subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04003859subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003860subdir('plugins')
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003861subdir('ebpf')
3862
Pierrick Bouvier2181b922024-10-23 14:28:11 -07003863if 'CONFIG_TCG' in config_all_accel
3864 subdir('contrib/plugins')
3865endif
3866
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003867common_user_inc = []
3868
3869subdir('common-user')
Marc-André Lureaub309c322019-08-18 19:20:37 +04003870subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04003871subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003872
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003873# needed for fuzzing binaries
3874subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003875subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003876
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003877# accel modules
Richard Hendersona802d5c2025-02-02 13:38:14 -08003878target_modules += { 'accel' : { 'qtest': qtest_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003879
Paolo Bonziniea444d92023-09-08 12:06:12 +02003880##############################################
3881# Internal static_libraries and dependencies #
3882##############################################
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003883
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003884modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003885modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003886modinfo_files = []
3887
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003888block_mods = []
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003889system_mods = []
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003890emulator_modules = []
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003891foreach d, list : modules
Paolo Bonzinief709862023-05-04 10:20:46 +02003892 if not (d == 'block' ? have_block : have_system)
3893 continue
3894 endif
3895
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003896 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003897 if enable_modules
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003898 module_ss.add(modulecommon)
Paolo Bonzini0d665492023-08-31 11:18:24 +02003899 module_ss = module_ss.apply(config_all_devices, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003900 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003901 dependencies: module_ss.dependencies(), pic: true)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003902 if d == 'block'
3903 block_mods += sl
3904 else
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003905 system_mods += sl
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003906 endif
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003907 emulator_modules += shared_module(sl.name(),
3908 name_prefix: '',
Akihiko Odaki414b1802024-05-24 17:00:22 +09003909 objects: sl.extract_all_objects(recursive: false),
3910 dependencies: module_ss.dependencies(),
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003911 install: true,
3912 install_dir: qemu_moddir)
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003913 if module_ss.sources() != []
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003914 modinfo_files += custom_target(d + '-' + m + '.modinfo',
3915 output: d + '-' + m + '.modinfo',
Paolo Bonzini95d31312024-05-24 11:26:54 +02003916 input: sl.extract_all_objects(recursive: true),
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003917 capture: true,
Paolo Bonzini95d31312024-05-24 11:26:54 +02003918 command: [modinfo_collect, '@INPUT@'])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003919 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003920 else
3921 if d == 'block'
3922 block_ss.add_all(module_ss)
3923 else
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003924 system_ss.add_all(module_ss)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003925 endif
3926 endif
3927 endforeach
3928endforeach
3929
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003930foreach d, list : target_modules
3931 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003932 if enable_modules
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003933 module_ss.add(modulecommon)
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003934 foreach target : target_dirs
3935 if target.endswith('-softmmu')
3936 config_target = config_target_mak[target]
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003937 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
Philippe Mathieu-Daudé7d7a21b2023-06-13 16:29:11 +02003938 c_args = ['-DCOMPILING_PER_TARGET',
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003939 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3940 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3941 target_module_ss = module_ss.apply(config_target, strict: false)
3942 if target_module_ss.sources() != []
3943 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3944 sl = static_library(module_name,
3945 [genh, target_module_ss.sources()],
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003946 dependencies: target_module_ss.dependencies(),
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003947 include_directories: target_inc,
3948 c_args: c_args,
3949 pic: true)
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003950 system_mods += sl
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003951 emulator_modules += shared_module(sl.name(),
3952 name_prefix: '',
Akihiko Odaki414b1802024-05-24 17:00:22 +09003953 objects: sl.extract_all_objects(recursive: false),
3954 dependencies: target_module_ss.dependencies(),
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003955 install: true,
3956 install_dir: qemu_moddir)
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003957 modinfo_files += custom_target(module_name + '.modinfo',
3958 output: module_name + '.modinfo',
Paolo Bonzini95d31312024-05-24 11:26:54 +02003959 input: sl.extract_all_objects(recursive: true),
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003960 capture: true,
Paolo Bonzini95d31312024-05-24 11:26:54 +02003961 command: [modinfo_collect, '--target', target, '@INPUT@'])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003962 endif
3963 endif
3964 endforeach
3965 else
3966 specific_ss.add_all(module_ss)
3967 endif
3968 endforeach
3969endforeach
3970
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003971if enable_modules
Jose R. Ziviani05d68142022-05-28 00:20:35 +02003972 foreach target : target_dirs
3973 if target.endswith('-softmmu')
3974 config_target = config_target_mak[target]
3975 config_devices_mak = target + '-config-devices.mak'
3976 modinfo_src = custom_target('modinfo-' + target + '.c',
3977 output: 'modinfo-' + target + '.c',
3978 input: modinfo_files,
3979 command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
3980 capture: true)
3981
3982 modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
3983 modinfo_dep = declare_dependency(link_with: modinfo_lib)
3984
3985 arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
3986 hw_arch[arch].add(modinfo_dep)
3987 endif
3988 endforeach
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003989
3990 if emulator_modules.length() > 0
3991 alias_target('modules', emulator_modules)
3992 endif
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003993endif
3994
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003995nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08003996undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003997block_syms = custom_target('block.syms', output: 'block.syms',
3998 input: [libqemuutil, block_mods],
3999 capture: true,
4000 command: [undefsym, nm, '@INPUT@'])
4001qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02004002 input: [libqemuutil, system_mods],
Marc-André Lureau3154fee2019-08-29 22:07:01 +04004003 capture: true,
4004 command: [undefsym, nm, '@INPUT@'])
4005
Paolo Bonzini1220f582023-08-30 11:52:43 +02004006authz_ss = authz_ss.apply({})
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02004007libauthz = static_library('authz', authz_ss.sources() + genh,
4008 dependencies: [authz_ss.dependencies()],
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02004009 build_by_default: false)
4010
Akihiko Odaki414b1802024-05-24 17:00:22 +09004011authz = declare_dependency(objects: libauthz.extract_all_objects(recursive: false),
4012 dependencies: [authz_ss.dependencies(), qom])
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02004013
Paolo Bonzini1220f582023-08-30 11:52:43 +02004014crypto_ss = crypto_ss.apply({})
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02004015libcrypto = static_library('crypto', crypto_ss.sources() + genh,
4016 dependencies: [crypto_ss.dependencies()],
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02004017 build_by_default: false)
4018
Akihiko Odaki414b1802024-05-24 17:00:22 +09004019crypto = declare_dependency(objects: libcrypto.extract_all_objects(recursive: false),
4020 dependencies: [crypto_ss.dependencies(), authz, qom])
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02004021
Paolo Bonzini1220f582023-08-30 11:52:43 +02004022io_ss = io_ss.apply({})
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02004023libio = static_library('io', io_ss.sources() + genh,
4024 dependencies: [io_ss.dependencies()],
4025 link_with: libqemuutil,
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02004026 build_by_default: false)
4027
Akihiko Odaki414b1802024-05-24 17:00:22 +09004028io = declare_dependency(objects: libio.extract_all_objects(recursive: false),
4029 dependencies: [io_ss.dependencies(), crypto, qom])
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02004030
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02004031libmigration = static_library('migration', sources: migration_files + genh,
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02004032 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09004033migration = declare_dependency(objects: libmigration.extract_all_objects(recursive: false),
Paolo Bonzini70eb5fd2024-05-24 18:16:08 +02004034 dependencies: [qom, io])
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02004035system_ss.add(migration)
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02004036
Paolo Bonzini1220f582023-08-30 11:52:43 +02004037block_ss = block_ss.apply({})
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04004038libblock = static_library('block', block_ss.sources() + genh,
4039 dependencies: block_ss.dependencies(),
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04004040 build_by_default: false)
4041
Akihiko Odaki414b1802024-05-24 17:00:22 +09004042block = declare_dependency(objects: libblock.extract_all_objects(recursive: false),
4043 dependencies: [block_ss.dependencies(), crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04004044
Paolo Bonzini1220f582023-08-30 11:52:43 +02004045blockdev_ss = blockdev_ss.apply({})
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01004046libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
4047 dependencies: blockdev_ss.dependencies(),
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01004048 build_by_default: false)
4049
Akihiko Odaki414b1802024-05-24 17:00:22 +09004050blockdev = declare_dependency(objects: libblockdev.extract_all_objects(recursive: false),
4051 dependencies: [blockdev_ss.dependencies(), block, event_loop_base])
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01004052
Paolo Bonzini1220f582023-08-30 11:52:43 +02004053qmp_ss = qmp_ss.apply({})
Paolo Bonziniff219dc2020-08-04 21:14:26 +02004054libqmp = static_library('qmp', qmp_ss.sources() + genh,
4055 dependencies: qmp_ss.dependencies(),
Paolo Bonziniff219dc2020-08-04 21:14:26 +02004056 build_by_default: false)
4057
Akihiko Odaki414b1802024-05-24 17:00:22 +09004058qmp = declare_dependency(objects: libqmp.extract_all_objects(recursive: false),
4059 dependencies: qmp_ss.dependencies())
Paolo Bonziniff219dc2020-08-04 21:14:26 +02004060
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02004061libchardev = static_library('chardev', chardev_ss.sources() + genh,
Marc-André Lureau22d1f7a2022-03-23 19:57:12 +04004062 dependencies: chardev_ss.dependencies(),
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02004063 build_by_default: false)
4064
Akihiko Odaki414b1802024-05-24 17:00:22 +09004065chardev = declare_dependency(objects: libchardev.extract_all_objects(recursive: false),
Paolo Bonzini41494da2025-02-27 13:34:30 +01004066 dependencies: [chardev_ss.dependencies(), io])
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02004067
Paolo Bonzini1220f582023-08-30 11:52:43 +02004068hwcore_ss = hwcore_ss.apply({})
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02004069libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02004070 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09004071hwcore = declare_dependency(objects: libhwcore.extract_all_objects(recursive: false))
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02004072common_ss.add(hwcore)
4073
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02004074###########
4075# Targets #
4076###########
4077
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02004078system_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004079common_ss.add(qom, qemuutil)
4080
Richard Henderson5983a202025-03-12 14:33:07 -07004081libuser = static_library('user',
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004082 user_ss.all_sources() + genh,
Richard Henderson8916c372025-03-12 20:24:44 -07004083 c_args: ['-DCONFIG_USER_ONLY',
4084 '-DCOMPILING_SYSTEM_VS_USER'],
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004085 include_directories: common_user_inc,
4086 dependencies: user_ss.all_dependencies(),
Richard Henderson5983a202025-03-12 14:33:07 -07004087 build_by_default: false)
Richard Henderson5983a202025-03-12 14:33:07 -07004088
Richard Henderson5983a202025-03-12 14:33:07 -07004089libsystem = static_library('system',
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004090 system_ss.all_sources() + genh,
Richard Henderson8916c372025-03-12 20:24:44 -07004091 c_args: ['-DCONFIG_SOFTMMU',
4092 '-DCOMPILING_SYSTEM_VS_USER'],
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004093 dependencies: system_ss.all_dependencies(),
Richard Henderson5983a202025-03-12 14:33:07 -07004094 build_by_default: false)
Richard Henderson5983a202025-03-12 14:33:07 -07004095
Paolo Bonzini0d665492023-08-31 11:18:24 +02004096# Note that this library is never used directly (only through extract_objects)
4097# and is not built by default; therefore, source files not used by the build
4098# configuration will be in build.ninja, but are never built by default.
Paolo Bonzini2becc362020-02-03 11:42:03 +01004099common_all = static_library('common',
4100 build_by_default: false,
Paolo Bonzini0d665492023-08-31 11:18:24 +02004101 sources: common_ss.all_sources() + genh,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09004102 implicit_include_directories: false,
Paolo Bonzini44081552024-05-24 10:56:55 +02004103 dependencies: common_ss.all_dependencies())
Paolo Bonzini2becc362020-02-03 11:42:03 +01004104
Pierrick Bouvierd4ecfc52025-03-24 21:59:08 -07004105# construct common libraries per base architecture
4106hw_common_arch_libs = {}
Pierrick Bouvierb2bb3f32025-05-12 11:04:17 -07004107target_common_arch_libs = {}
4108target_common_system_arch_libs = {}
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004109foreach target_base_arch, config_base_arch : config_base_arch_mak
Pierrick Bouvierd4ecfc52025-03-24 21:59:08 -07004110 config_target = config_target_mak[target]
Pierrick Bouvierb2bb3f32025-05-12 11:04:17 -07004111 target_inc = [include_directories('target' / target_base_arch)]
4112 inc = [common_user_inc + target_inc]
Pierrick Bouvierd4ecfc52025-03-24 21:59:08 -07004113
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004114 target_common = common_ss.apply(config_target, strict: false)
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004115 target_system = system_ss.apply(config_target, strict: false)
4116 target_user = user_ss.apply(config_target, strict: false)
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004117 common_deps = []
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004118 system_deps = []
4119 user_deps = []
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004120 foreach dep: target_common.dependencies()
4121 common_deps += dep.partial_dependency(compile_args: true, includes: true)
4122 endforeach
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004123 foreach dep: target_system.dependencies()
4124 system_deps += dep.partial_dependency(compile_args: true, includes: true)
4125 endforeach
4126 foreach dep: target_user.dependencies()
4127 user_deps += dep.partial_dependency(compile_args: true, includes: true)
4128 endforeach
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004129
Pierrick Bouvierb2bb3f32025-05-12 11:04:17 -07004130 # prevent common code to access cpu compile time definition,
4131 # but still allow access to cpu.h
4132 target_c_args = ['-DCPU_DEFS_H']
4133 target_system_c_args = target_c_args + ['-DCOMPILING_SYSTEM_VS_USER', '-DCONFIG_SOFTMMU']
Pierrick Bouvierd4ecfc52025-03-24 21:59:08 -07004134
4135 if target_base_arch in hw_common_arch
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004136 src = hw_common_arch[target_base_arch]
4137 lib = static_library(
4138 'hw_' + target_base_arch,
4139 build_by_default: false,
4140 sources: src.all_sources() + genh,
4141 include_directories: inc,
4142 c_args: target_system_c_args,
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004143 dependencies: src.all_dependencies() + common_deps + system_deps)
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004144 hw_common_arch_libs += {target_base_arch: lib}
Pierrick Bouvierb2bb3f32025-05-12 11:04:17 -07004145 endif
4146
4147 if target_base_arch in target_common_arch
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004148 src = target_common_arch[target_base_arch]
4149 lib = static_library(
4150 'target_' + target_base_arch,
4151 build_by_default: false,
4152 sources: src.all_sources() + genh,
4153 include_directories: inc,
4154 c_args: target_c_args,
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004155 dependencies: src.all_dependencies() + common_deps +
4156 system_deps + user_deps)
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004157 target_common_arch_libs += {target_base_arch: lib}
Pierrick Bouvierb2bb3f32025-05-12 11:04:17 -07004158 endif
4159
4160 if target_base_arch in target_common_system_arch
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004161 src = target_common_system_arch[target_base_arch]
4162 lib = static_library(
4163 'target_system_' + target_base_arch,
4164 build_by_default: false,
4165 sources: src.all_sources() + genh,
4166 include_directories: inc,
4167 c_args: target_system_c_args,
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004168 dependencies: src.all_dependencies() + common_deps + system_deps)
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004169 target_common_system_arch_libs += {target_base_arch: lib}
Pierrick Bouvierd4ecfc52025-03-24 21:59:08 -07004170 endif
4171endforeach
4172
Paolo Bonzinie2b39052024-10-18 19:33:22 +02004173if have_rust
Paolo Bonzinice4a1442024-10-25 09:20:16 +02004174 # We would like to use --generate-cstr, but it is only available
4175 # starting with bindgen 0.66.0. The oldest supported versions
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004176 # is 0.60.x (Debian 12 has 0.60.1) which introduces --allowlist-file.
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004177 bindgen_args = [
4178 '--disable-header-comment',
4179 '--raw-line', '// @generated',
Paolo Bonzini9f7d4522024-10-24 13:53:59 +02004180 '--ctypes-prefix', 'std::os::raw',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004181 '--generate-block',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004182 '--impl-debug',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004183 '--no-doc-comments',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004184 '--with-derive-default',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004185 '--no-layout-tests',
4186 '--no-prepend-enum-name',
4187 '--allowlist-file', meson.project_source_root() + '/include/.*',
4188 '--allowlist-file', meson.project_source_root() + '/.*',
4189 '--allowlist-file', meson.project_build_root() + '/.*'
4190 ]
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +02004191 if not rustfmt.found()
4192 if bindgen.version().version_compare('<0.65.0')
4193 bindgen_args += ['--no-rustfmt-bindings']
4194 else
4195 bindgen_args += ['--formatter', 'none']
4196 endif
4197 endif
Paolo Bonzini131c5842025-02-06 12:15:13 +01004198 if bindgen.version().version_compare('>=0.66.0')
4199 bindgen_args += ['--rust-target', '1.59']
4200 endif
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004201 if bindgen.version().version_compare('<0.61.0')
4202 # default in 0.61+
4203 bindgen_args += ['--size_t-is-usize']
4204 else
4205 bindgen_args += ['--merge-extern-blocks']
4206 endif
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004207 c_enums = [
4208 'DeviceCategory',
4209 'GpioPolarity',
4210 'MachineInitPhase',
4211 'MemoryDeviceInfoKind',
4212 'MigrationPolicy',
4213 'MigrationPriority',
4214 'QEMUChrEvent',
4215 'QEMUClockType',
Paolo Bonzini5472a382025-01-17 11:26:48 +01004216 'ResetType',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004217 'device_endian',
4218 'module_init_type',
4219 ]
4220 foreach enum : c_enums
4221 bindgen_args += ['--rustified-enum', enum]
4222 endforeach
4223 c_bitfields = [
4224 'ClockEvent',
4225 'VMStateFlags',
4226 ]
4227 foreach enum : c_bitfields
4228 bindgen_args += ['--bitfield-enum', enum]
4229 endforeach
4230
4231 # TODO: Remove this comment when the clang/libclang mismatch issue is solved.
4232 #
4233 # Rust bindings generation with `bindgen` might fail in some cases where the
4234 # detected `libclang` does not match the expected `clang` version/target. In
4235 # this case you must pass the path to `clang` and `libclang` to your build
4236 # command invocation using the environment variables CLANG_PATH and
4237 # LIBCLANG_PATH
Paolo Bonzinibe3fc972024-10-15 10:08:57 +02004238 bindings_rs = rust.bindgen(
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004239 input: 'rust/wrapper.h',
4240 dependencies: common_ss.all_dependencies(),
Paolo Bonzinicb7ada52024-11-12 11:52:23 +01004241 output: 'bindings.inc.rs',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004242 include_directories: include_directories('.', 'include'),
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004243 bindgen_version: ['>=0.60.0'],
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004244 args: bindgen_args,
4245 )
4246 subdir('rust')
4247endif
4248
4249
Akihiko Odaki956af7d2023-10-09 17:40:51 +01004250feature_to_c = find_program('scripts/feature_to_c.py')
Paolo Bonzinid1e526c2024-10-15 11:59:14 +02004251rust_root_crate = find_program('scripts/rust/rust_root_crate.sh')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04004252
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004253if host_os == 'darwin'
Philippe Mathieu-Daudé30cfa502022-02-15 17:25:03 +01004254 entitlement = find_program('scripts/entitlement.sh')
4255endif
4256
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004257traceable = []
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04004258emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01004259foreach target : target_dirs
4260 config_target = config_target_mak[target]
4261 target_name = config_target['TARGET_NAME']
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004262 target_base_arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02004263 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004264 arch_deps = []
Philippe Mathieu-Daudé7d7a21b2023-06-13 16:29:11 +02004265 c_args = ['-DCOMPILING_PER_TARGET',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004266 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
Philippe Mathieu-Daudéedbceac2024-12-18 15:36:07 +01004267 ]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04004268 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01004269
4270 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004271 if host_os == 'linux'
Paolo Bonzini2becc362020-02-03 11:42:03 +01004272 target_inc += include_directories('linux-headers', is_system: true)
4273 endif
4274 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01004275 target_type='system'
Philippe Mathieu-Daudé01c85e62023-10-04 11:06:27 +02004276 t = target_system_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004277 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004278 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004279
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004280 hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
Philippe Mathieu-Daudébf964322023-11-21 13:52:48 +01004281 if hw_arch.has_key(hw_dir)
4282 hw = hw_arch[hw_dir].apply(config_target, strict: false)
4283 arch_srcs += hw.sources()
4284 arch_deps += hw.dependencies()
4285 endif
Marc-André Lureau2c442202019-08-17 13:55:58 +04004286
Philippe Mathieu-Daudéedbceac2024-12-18 15:36:07 +01004287 c_args += ['-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzini2becc362020-02-03 11:42:03 +01004288 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004289 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01004290 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04004291 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01004292 target_type='user'
Paolo Bonzinia3a576b2021-12-21 16:23:55 +01004293 target_inc += common_user_inc
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004294 if target_base_arch in target_user_arch
4295 t = target_user_arch[target_base_arch].apply(config_target, strict: false)
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02004296 arch_srcs += t.sources()
4297 arch_deps += t.dependencies()
4298 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01004299 if 'CONFIG_LINUX_USER' in config_target
4300 base_dir = 'linux-user'
Warner Loshe2a74722021-08-03 17:17:17 -06004301 endif
4302 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01004303 base_dir = 'bsd-user'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004304 target_inc += include_directories('bsd-user/' / host_os)
Warner Losh85fc1b52022-01-08 17:27:34 -07004305 target_inc += include_directories('bsd-user/host/' / host_arch)
Warner Loshe2a74722021-08-03 17:17:17 -06004306 dir = base_dir / abi
Warner Losh19bf1292021-11-04 16:34:48 -06004307 arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01004308 endif
4309 target_inc += include_directories(
4310 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04004311 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01004312 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04004313 if 'CONFIG_LINUX_USER' in config_target
4314 dir = base_dir / abi
4315 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
4316 if config_target.has_key('TARGET_SYSTBL_ABI')
4317 arch_srcs += \
4318 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
4319 extra_args : config_target['TARGET_SYSTBL_ABI'])
4320 endif
4321 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01004322 endif
4323
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04004324 if 'TARGET_XML_FILES' in config_target
4325 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
4326 output: target + '-gdbstub-xml.c',
4327 input: files(config_target['TARGET_XML_FILES'].split()),
4328 command: [feature_to_c, '@INPUT@'],
4329 capture: true)
4330 arch_srcs += gdbstub_xml
4331 endif
4332
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004333 t = target_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004334 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004335 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004336
Paolo Bonzini2becc362020-02-03 11:42:03 +01004337 target_common = common_ss.apply(config_target, strict: false)
Pierrick Bouvierd4ecfc52025-03-24 21:59:08 -07004338 objects = [common_all.extract_objects(target_common.sources())]
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004339 arch_deps += target_common.dependencies()
Pierrick Bouvierb2bb3f32025-05-12 11:04:17 -07004340 if target_base_arch in target_common_arch_libs
4341 src = target_common_arch[target_base_arch].apply(config_target, strict: false)
4342 lib = target_common_arch_libs[target_base_arch]
4343 objects += lib.extract_objects(src.sources())
4344 arch_deps += src.dependencies()
4345 endif
Pierrick Bouvierb17b51d2025-05-21 15:34:11 -07004346 if target_type == 'system'
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004347 src = system_ss.apply(config_target, strict: false)
Pierrick Bouvierb17b51d2025-05-21 15:34:11 -07004348 objects += libsystem.extract_objects(src.sources())
4349 arch_deps += src.dependencies()
4350 endif
4351 if target_type == 'user'
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004352 src = user_ss.apply(config_target, strict: false)
Pierrick Bouvierb17b51d2025-05-21 15:34:11 -07004353 objects += libuser.extract_objects(src.sources())
4354 arch_deps += src.dependencies()
4355 endif
Pierrick Bouvierd4ecfc52025-03-24 21:59:08 -07004356 if target_type == 'system' and target_base_arch in hw_common_arch_libs
4357 src = hw_common_arch[target_base_arch].apply(config_target, strict: false)
4358 lib = hw_common_arch_libs[target_base_arch]
4359 objects += lib.extract_objects(src.sources())
4360 arch_deps += src.dependencies()
4361 endif
Pierrick Bouvierb2bb3f32025-05-12 11:04:17 -07004362 if target_type == 'system' and target_base_arch in target_common_system_arch_libs
4363 src = target_common_system_arch[target_base_arch].apply(config_target, strict: false)
4364 lib = target_common_system_arch_libs[target_base_arch]
4365 objects += lib.extract_objects(src.sources())
4366 arch_deps += src.dependencies()
4367 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01004368
Paolo Bonzini2becc362020-02-03 11:42:03 +01004369 target_specific = specific_ss.apply(config_target, strict: false)
4370 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004371 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01004372
Paolo Bonzinie2b39052024-10-18 19:33:22 +02004373 if have_rust and target_type == 'system'
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004374 target_rust = rust_devices_ss.apply(config_target, strict: false)
4375 crates = []
4376 foreach dep : target_rust.dependencies()
4377 crates += dep.get_variable('crate')
4378 endforeach
4379 if crates.length() > 0
4380 rlib_rs = custom_target('rust_' + target.underscorify() + '.rs',
4381 output: 'rust_' + target.underscorify() + '.rs',
Paolo Bonzinid1e526c2024-10-15 11:59:14 +02004382 command: [rust_root_crate, crates],
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004383 capture: true,
4384 build_by_default: true,
4385 build_always_stale: true)
4386 rlib = static_library('rust_' + target.underscorify(),
4387 rlib_rs,
4388 dependencies: target_rust.dependencies(),
4389 override_options: ['rust_std=2021', 'build.rust_std=2021'],
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004390 rust_abi: 'c')
4391 arch_deps += declare_dependency(link_whole: [rlib])
4392 endif
4393 endif
4394
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004395 # allow using headers from the dependencies but do not include the sources,
4396 # because this emulator only needs those in "objects". For external
4397 # dependencies, the full dependency is included below in the executable.
4398 lib_deps = []
4399 foreach dep : arch_deps
4400 lib_deps += dep.partial_dependency(compile_args: true, includes: true)
4401 endforeach
4402
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004403 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02004404 sources: arch_srcs + genh,
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004405 dependencies: lib_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01004406 objects: objects,
4407 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004408 c_args: c_args,
Paolo Bonzini44081552024-05-24 10:56:55 +02004409 build_by_default: false)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004410
4411 if target.endswith('-softmmu')
4412 execs = [{
4413 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004414 'win_subsystem': 'console',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02004415 'sources': files('system/main.c'),
Philippe Mathieu-Daudé51625572024-11-20 12:36:43 +01004416 'dependencies': [sdl]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004417 }]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004418 if host_os == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004419 execs += [{
4420 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004421 'win_subsystem': 'windows',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02004422 'sources': files('system/main.c'),
Philippe Mathieu-Daudé51625572024-11-20 12:36:43 +01004423 'dependencies': [sdl]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004424 }]
4425 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004426 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004427 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
4428 execs += [{
4429 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004430 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004431 'sources': specific_fuzz.sources(),
4432 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004433 }]
4434 endif
4435 else
4436 execs = [{
4437 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004438 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004439 'sources': [],
4440 'dependencies': []
4441 }]
4442 endif
4443 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01004444 exe_name = exe['name']
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004445 if host_os == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01004446 exe_name += '-unsigned'
4447 endif
4448
4449 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09004450 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004451 c_args: c_args,
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004452 dependencies: arch_deps + exe['dependencies'],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004453 objects: lib.extract_all_objects(recursive: true),
Paolo Bonzini05007252024-03-20 11:28:28 +01004454 link_depends: [block_syms, qemu_syms],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004455 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004456 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01004457
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004458 if host_os == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004459 icon = 'pc-bios/qemu.rsrc'
4460 build_input = [emulator, files(icon)]
4461 install_input = [
4462 get_option('bindir') / exe_name,
4463 meson.current_source_dir() / icon
4464 ]
4465 if 'CONFIG_HVF' in config_target
4466 entitlements = 'accel/hvf/entitlements.plist'
4467 build_input += files(entitlements)
4468 install_input += meson.current_source_dir() / entitlements
4469 endif
4470
Alexander Graf8a74ce62021-01-20 23:44:34 +01004471 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004472 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01004473 output: exe['name'],
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01004474 command: [entitlement, '@OUTPUT@', '@INPUT@'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01004475 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09004476
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01004477 meson.add_install_script(entitlement, '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09004478 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004479 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01004480 else
4481 emulators += {exe['name']: emulator}
4482 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04004483
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004484 traceable += [{
4485 'exe': exe['name'],
4486 'probe-prefix': 'qemu.' + target_type + '.' + target_name,
4487 }]
4488
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004489 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01004490endforeach
4491
Paolo Bonzini931049b2020-02-05 09:44:24 +01004492# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004493
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004494if get_option('plugins')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01004495 install_headers('include/qemu/qemu-plugin.h')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004496 if host_os == 'windows'
Greg Manning36fa0772023-11-06 18:51:06 +00004497 # On windows, we want to deliver the qemu_plugin_api.lib file in the qemu installer,
4498 # so that plugin authors can compile against it.
4499 install_data(win32_qemu_plugin_api_lib, install_dir: 'lib')
4500 endif
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01004501endif
4502
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004503subdir('qga')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02004504
Laurent Vivier9755c942020-08-24 17:24:30 +02004505# Don't build qemu-keymap if xkbcommon is not explicitly enabled
4506# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02004507if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04004508 # used for the update-keymaps target, so include rules even if !have_tools
4509 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
4510 dependencies: [qemuutil, xkbcommon], install: have_tools)
4511endif
4512
Paolo Bonzini931049b2020-02-05 09:44:24 +01004513if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004514 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004515 link_args: '@block.syms', link_depends: block_syms,
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004516 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
4517 qemu_io = executable('qemu-io', files('qemu-io.c'),
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004518 link_args: '@block.syms', link_depends: block_syms,
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004519 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01004520 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004521 link_args: '@block.syms', link_depends: block_syms,
Akihiko Odaki7b1070a2024-05-24 17:00:23 +09004522 dependencies: [blockdev, qemuutil, selinux],
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004523 install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004524
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02004525 subdir('storage-daemon')
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004526
4527 foreach exe: [ 'qemu-img', 'qemu-io', 'qemu-nbd', 'qemu-storage-daemon']
4528 traceable += [{
4529 'exe': exe,
4530 'probe-prefix': 'qemu.' + exe.substring(5).replace('-', '_')
4531 }]
4532 endforeach
4533
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04004534 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02004535
Marc-André Lureau157e7b12019-07-15 14:50:58 +04004536 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
Steve Sistare57ad6ab2025-01-15 11:00:27 -08004537 dependencies: [qemuutil, rt],
Marc-André Lureau157e7b12019-07-15 14:50:58 +04004538 install: true)
4539
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004540 if have_vhost_user
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02004541 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02004542 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04004543 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02004544 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01004545 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004546
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004547 if host_os == 'linux'
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004548 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
4549 dependencies: [qemuutil, libcap_ng],
4550 install: true,
4551 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004552
4553 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
4554 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02004555 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004556 install: true)
Anthony Harivel84369d72024-05-22 17:34:51 +02004557
4558 if cpu in ['x86', 'x86_64']
4559 executable('qemu-vmsr-helper', files('tools/i386/qemu-vmsr-helper.c'),
4560 dependencies: [authz, crypto, io, qom, qemuutil,
4561 libcap_ng, mpathpersist],
4562 install: true)
4563 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004564 endif
4565
Paolo Bonziniccd250a2021-06-03 12:50:17 +02004566 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04004567 subdir('contrib/ivshmem-client')
4568 subdir('contrib/ivshmem-server')
4569 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01004570endif
4571
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004572if stap.found()
4573 foreach t: traceable
4574 foreach stp: [
4575 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / t['exe'], 'install': false},
4576 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / t['exe'], 'install': true},
4577 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
4578 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
4579 ]
4580 cmd = [
4581 tracetool, '--group=all', '--format=' + stp['fmt'],
4582 '--binary=' + stp['bin'],
4583 '--probe-prefix=' + t['probe-prefix'],
4584 '@INPUT@', '@OUTPUT@'
4585 ]
4586
4587 custom_target(t['exe'] + stp['ext'],
4588 input: trace_events_all,
4589 output: t['exe'] + stp['ext'],
4590 install: stp['install'],
4591 install_dir: get_option('datadir') / 'systemtap/tapset',
4592 command: cmd,
4593 depend_files: tracetool_depends)
4594 endforeach
4595 endforeach
4596endif
4597
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04004598subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004599subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04004600subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02004601subdir('docs')
Kohei Tokunagaccc403e2025-04-28 15:39:07 +09004602# Tests are disabled on emscripten because they rely on host features that aren't
4603# supported by emscripten (e.g. fork and unix socket).
4604if host_os != 'emscripten'
4605 subdir('tests')
4606endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01004607if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04004608 subdir('po')
4609endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004610
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004611if host_machine.system() == 'windows'
4612 nsis_cmd = [
4613 find_program('scripts/nsis.py'),
4614 '@OUTPUT@',
4615 get_option('prefix'),
4616 meson.current_source_dir(),
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02004617 glib_pc.get_variable('bindir'),
Stefan Weil24bdcc92020-11-25 20:18:33 +01004618 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004619 '--',
4620 '-DDISPLAYVERSION=' + meson.project_version(),
4621 ]
4622 if build_docs
4623 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
4624 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01004625 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004626 nsis_cmd += '-DCONFIG_GTK=y'
4627 endif
4628
4629 nsis = custom_target('nsis',
4630 output: 'qemu-setup-' + meson.project_version() + '.exe',
4631 input: files('qemu.nsi'),
4632 build_always_stale: true,
4633 command: nsis_cmd + ['@INPUT@'])
4634 alias_target('installer', nsis)
4635endif
4636
Paolo Bonzinia0c91622020-10-07 11:01:51 -04004637#########################
4638# Configuration summary #
4639#########################
4640
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004641# Build environment
Paolo Bonzinif9332752020-02-03 13:28:38 +01004642summary_info = {}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004643summary_info += {'Build directory': meson.current_build_dir()}
4644summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004645summary_info += {'Download dependencies': get_option('wrap_mode') != 'nodownload'}
4646summary(summary_info, bool_yn: true, section: 'Build environment')
4647
4648# Directories
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004649summary_info += {'Install prefix': get_option('prefix')}
4650summary_info += {'BIOS directory': qemu_datadir}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004651pathsep = host_os == 'windows' ? ';' : ':'
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09004652summary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004653summary_info += {'binary directory': get_option('prefix') / get_option('bindir')}
4654summary_info += {'library directory': get_option('prefix') / get_option('libdir')}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004655summary_info += {'module directory': qemu_moddir}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004656summary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
4657summary_info += {'include directory': get_option('prefix') / get_option('includedir')}
4658summary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004659if host_os != 'windows'
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004660 summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
4661 summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004662else
4663 summary_info += {'local state directory': 'queried at runtime'}
4664endif
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004665summary_info += {'Doc directory': get_option('prefix') / get_option('docdir')}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004666summary(summary_info, bool_yn: true, section: 'Directories')
4667
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004668# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004669summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004670summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004671summary_info += {'sphinx-build': sphinx_build}
Paolo Bonzinib4d61d32023-09-28 12:00:48 +02004672
4673# FIXME: the [binaries] section of machine files, which can be probed
4674# with find_program(), would be great for passing gdb and genisoimage
4675# paths from configure to Meson. However, there seems to be no way to
4676# hide a program (for example if gdb is too old).
Paolo Bonzinia47dd5c2023-09-28 10:44:56 +02004677if config_host.has_key('GDB')
4678 summary_info += {'gdb': config_host['GDB']}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004679endif
Paolo Bonzini40c909f2022-04-20 17:33:49 +02004680summary_info += {'iasl': iasl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004681summary_info += {'genisoimage': config_host['GENISOIMAGE']}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004682if host_os == 'windows' and have_ga
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004683 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004684endif
Thomas Huth58902582022-04-08 18:20:47 +02004685if slirp.found() and have_system
Paolo Bonzini35acbb32021-10-13 13:43:36 +02004686 summary_info += {'smbd': have_slirp_smbd ? smbd_path : false}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004687endif
4688summary(summary_info, bool_yn: true, section: 'Host binaries')
4689
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004690# Configurable features
4691summary_info = {}
4692summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004693summary_info += {'system-mode emulation': have_system}
4694summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004695summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004696summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini60027112022-10-20 14:53:10 +02004697summary_info += {'module support': enable_modules}
4698if enable_modules
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02004699 summary_info += {'alternative module path': get_option('module_upgrades')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004700endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004701summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004702if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02004703 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004704endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02004705summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
4706if 'simple' in get_option('trace_backends')
4707 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004708endif
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004709summary_info += {'QOM debugging': get_option('qom_cast_debug')}
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004710summary_info += {'Relocatable install': get_option('relocatable')}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004711summary_info += {'vhost-kernel support': have_vhost_kernel}
4712summary_info += {'vhost-net support': have_vhost_net}
4713summary_info += {'vhost-user support': have_vhost_user}
4714summary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004715summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004716summary_info += {'vhost-vdpa support': have_vhost_vdpa}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004717summary_info += {'build guest agent': have_ga}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004718summary(summary_info, bool_yn: true, section: 'Configurable features')
4719
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004720# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004721summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004722summary_info += {'host CPU': cpu}
4723summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01004724summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
4725summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Thomas Huth785abf02023-07-06 08:47:36 +02004726if 'cpp' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004727 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004728else
4729 summary_info += {'C++ compiler': false}
4730endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004731if 'objc' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004732 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004733else
4734 summary_info += {'Objective-C compiler': false}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004735endif
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03004736summary_info += {'Rust support': have_rust}
4737if have_rust
Paolo Bonzini1a6ef6f2024-10-03 16:28:45 +03004738 summary_info += {'Rust target': config_host['RUST_TARGET_TRIPLE']}
Paolo Bonzinie2b39052024-10-18 19:33:22 +02004739 summary_info += {'rustc': ' '.join(rustc.cmd_array())}
4740 summary_info += {'rustc version': rustc.version()}
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004741 summary_info += {'bindgen': bindgen.full_path()}
4742 summary_info += {'bindgen version': bindgen.version()}
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03004743endif
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004744option_cflags = (get_option('debug') ? ['-g'] : [])
4745if get_option('optimization') != 'plain'
4746 option_cflags += ['-O' + get_option('optimization')]
4747endif
4748summary_info += {'CFLAGS': ' '.join(get_option('c_args') + option_cflags)}
Thomas Huth785abf02023-07-06 08:47:36 +02004749if 'cpp' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004750 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args') + option_cflags)}
Paolo Bonzini47b30832020-09-23 05:26:17 -04004751endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004752if 'objc' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004753 summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args') + option_cflags)}
Philippe Mathieu-Daudée910c7d2022-01-08 22:38:55 +01004754endif
Thomas Huth785abf02023-07-06 08:47:36 +02004755link_args = get_option('c_link_args')
Paolo Bonzini47b30832020-09-23 05:26:17 -04004756if link_args.length() > 0
4757 summary_info += {'LDFLAGS': ' '.join(link_args)}
4758endif
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004759summary_info += {'QEMU_CFLAGS': ' '.join(qemu_common_flags + qemu_cflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004760if 'cpp' in all_languages
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004761 summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_common_flags + qemu_cxxflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004762endif
4763if 'objc' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +01004764 summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_common_flags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004765endif
Paolo Bonzinid0651772022-04-20 17:33:34 +02004766summary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)}
Daniele Buonocdad7812020-12-04 18:06:11 -05004767summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004768summary_info += {'PIE': get_option('b_pie')}
Paolo Bonzinie58e55d2023-06-07 10:00:21 +02004769summary_info += {'static build': get_option('prefer_static')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004770summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinib87df902021-11-08 13:52:11 +01004771summary_info += {'membarrier': have_membarrier}
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04004772summary_info += {'debug graph lock': get_option('debug_graph_lock')}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004773summary_info += {'debug stack usage': get_option('debug_stack_usage')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004774summary_info += {'mutex debugging': get_option('debug_mutex')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004775summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01004776summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
ling xu04ffce12022-11-16 23:29:22 +08004777summary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004778summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzini34f983d2023-01-09 15:31:51 +01004779summary_info += {'thread sanitizer': get_option('tsan')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004780summary_info += {'CFI support': get_option('cfi')}
4781if get_option('cfi')
4782 summary_info += {'CFI debug support': get_option('cfi_debug')}
4783endif
4784summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004785summary_info += {'sparse': sparse}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004786summary_info += {'mingw32 support': host_os == 'windows'}
Paolo Bonzini12640f02022-06-06 11:48:47 +02004787summary(summary_info, bool_yn: true, section: 'Compilation')
Alex Bennée49e85652021-02-22 10:14:50 +00004788
4789# snarf the cross-compilation information for tests
Paolo Bonzini12640f02022-06-06 11:48:47 +02004790summary_info = {}
4791have_cross = false
Alex Bennée49e85652021-02-22 10:14:50 +00004792foreach target: target_dirs
Paolo Bonzinic7022a72022-09-29 12:42:07 +01004793 tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak'
Alex Bennée49e85652021-02-22 10:14:50 +00004794 if fs.exists(tcg_mak)
4795 config_cross_tcg = keyval.load(tcg_mak)
Alex Bennée85b141e2022-05-27 16:35:34 +01004796 if 'CC' in config_cross_tcg
Paolo Bonzini12640f02022-06-06 11:48:47 +02004797 summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
4798 have_cross = true
Alex Bennée49e85652021-02-22 10:14:50 +00004799 endif
Paolo Bonzini12640f02022-06-06 11:48:47 +02004800 endif
Alex Bennée49e85652021-02-22 10:14:50 +00004801endforeach
Paolo Bonzini12640f02022-06-06 11:48:47 +02004802if have_cross
4803 summary(summary_info, bool_yn: true, section: 'Cross compilers')
4804endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004805
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004806# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004807summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004808if have_system
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004809 summary_info += {'KVM support': config_all_accel.has_key('CONFIG_KVM')}
4810 summary_info += {'HVF support': config_all_accel.has_key('CONFIG_HVF')}
4811 summary_info += {'WHPX support': config_all_accel.has_key('CONFIG_WHPX')}
4812 summary_info += {'NVMM support': config_all_accel.has_key('CONFIG_NVMM')}
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02004813 summary_info += {'Xen support': xen.found()}
4814 if xen.found()
4815 summary_info += {'xen ctrl version': xen.version()}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004816 endif
Paolo Bonzini0d665492023-08-31 11:18:24 +02004817 summary_info += {'Xen emulation': config_all_devices.has_key('CONFIG_XEN_EMU')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004818endif
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004819summary_info += {'TCG support': config_all_accel.has_key('CONFIG_TCG')}
4820if config_all_accel.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004821 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +01004822 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004823 else
4824 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
4825 endif
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004826 summary_info += {'TCG plugins': get_option('plugins')}
Paolo Bonzini1d558c92023-08-28 11:48:30 +02004827 summary_info += {'TCG debug enabled': get_option('debug_tcg')}
Ilya Leoshkevich1f2355f2024-03-12 01:23:30 +01004828 if have_linux_user or have_bsd_user
4829 summary_info += {'syscall buffer debugging support': get_option('debug_remap')}
4830 endif
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004831endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004832summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004833if have_system
4834 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01004835 summary_info += {'out of process emulation': multiprocess_allowed}
Jagannathan Raman55116962022-06-13 16:26:24 -04004836 summary_info += {'vfio-user server': vfio_user_server_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004837endif
4838summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
4839
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004840# Block layer
4841summary_info = {}
Paolo Bonzini67398252022-10-12 13:19:35 +02004842summary_info += {'coroutine backend': coroutine_backend}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004843summary_info += {'coroutine pool': have_coroutine_pool}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004844if have_block
Paolo Bonzini622d64f2022-04-20 17:33:53 +02004845 summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
4846 summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004847 summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
Christian Schoenebeck38877022023-05-11 16:12:34 +02004848 summary_info += {'VirtFS (9P) support': have_virtfs}
Paolo Bonzini406523f2021-10-13 11:43:54 +02004849 summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004850 summary_info += {'bochs support': get_option('bochs').allowed()}
4851 summary_info += {'cloop support': get_option('cloop').allowed()}
4852 summary_info += {'dmg support': get_option('dmg').allowed()}
4853 summary_info += {'qcow v1 support': get_option('qcow1').allowed()}
4854 summary_info += {'vdi support': get_option('vdi').allowed()}
Vladimir Sementsov-Ogievskiy11cea422023-04-21 12:27:58 +03004855 summary_info += {'vhdx support': get_option('vhdx').allowed()}
4856 summary_info += {'vmdk support': get_option('vmdk').allowed()}
4857 summary_info += {'vpc support': get_option('vpc').allowed()}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004858 summary_info += {'vvfat support': get_option('vvfat').allowed()}
4859 summary_info += {'qed support': get_option('qed').allowed()}
4860 summary_info += {'parallels support': get_option('parallels').allowed()}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004861 summary_info += {'FUSE exports': fuse}
Xie Yongji2a2359b2022-05-23 16:46:09 +08004862 summary_info += {'VDUSE block exports': have_vduse_blk_export}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004863endif
4864summary(summary_info, bool_yn: true, section: 'Block layer support')
4865
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004866# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004867summary_info = {}
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02004868summary_info += {'TLS priority': get_option('tls_priority')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004869summary_info += {'GNUTLS support': gnutls}
4870if gnutls.found()
4871 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
4872endif
4873summary_info += {'libgcrypt': gcrypt}
4874summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02004875if nettle.found()
4876 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004877endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08004878summary_info += {'SM4 ALG support': crypto_sm4}
liequan ched078da82024-10-30 08:51:46 +00004879summary_info += {'SM3 ALG support': crypto_sm3}
Paolo Bonzini34b52612021-11-08 14:02:42 +01004880summary_info += {'AF_ALG support': have_afalg}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004881summary_info += {'rng-none': get_option('rng_none')}
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02004882summary_info += {'Linux keyring': have_keyring}
Thomas Huthc64023b2023-08-24 11:42:08 +02004883summary_info += {'Linux keyutils': keyutils}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004884summary(summary_info, bool_yn: true, section: 'Crypto')
4885
Thomas Huth9e48afa2023-06-02 19:18:30 +02004886# UI
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004887summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004888if host_os == 'darwin'
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03004889 summary_info += {'Cocoa support': cocoa}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004890endif
Thomas Huthc6d82df2025-03-25 06:51:25 +01004891summary_info += {'D-Bus display': dbus_display}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004892summary_info += {'SDL support': sdl}
4893summary_info += {'SDL image support': sdl_image}
4894summary_info += {'GTK support': gtk}
4895summary_info += {'pixman': pixman}
4896summary_info += {'VTE support': vte}
Kshitij Suri95f85102022-04-08 07:13:34 +00004897summary_info += {'PNG support': png}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004898summary_info += {'VNC support': vnc}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01004899if vnc.found()
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004900 summary_info += {'VNC SASL support': sasl}
4901 summary_info += {'VNC JPEG support': jpeg}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004902endif
Thomas Huth9e48afa2023-06-02 19:18:30 +02004903summary_info += {'spice protocol support': spice_protocol}
4904if spice_protocol.found()
4905 summary_info += {' spice server support': spice}
4906endif
4907summary_info += {'curses support': curses}
4908summary_info += {'brlapi support': brlapi}
4909summary(summary_info, bool_yn: true, section: 'User interface')
4910
Alex Bennéef705c1f2023-12-22 11:48:46 +00004911# Graphics backends
4912summary_info = {}
4913summary_info += {'VirGL support': virgl}
4914summary_info += {'Rutabaga support': rutabaga}
4915summary(summary_info, bool_yn: true, section: 'Graphics backends')
4916
Thomas Huthaece7232023-06-02 19:18:32 +02004917# Audio backends
4918summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004919if host_os not in ['darwin', 'haiku', 'windows']
Paolo Bonzini87430d52021-10-07 15:06:09 +02004920 summary_info += {'OSS support': oss}
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02004921 summary_info += {'sndio support': sndio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004922elif host_os == 'darwin'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004923 summary_info += {'CoreAudio support': coreaudio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004924elif host_os == 'windows'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004925 summary_info += {'DirectSound support': dsound}
4926endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004927if host_os == 'linux'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004928 summary_info += {'ALSA support': alsa}
4929 summary_info += {'PulseAudio support': pulse}
4930endif
Marc-André Lureau20c51242023-05-06 20:37:26 +04004931summary_info += {'PipeWire support': pipewire}
Paolo Bonzini87430d52021-10-07 15:06:09 +02004932summary_info += {'JACK support': jack}
Thomas Huthaece7232023-06-02 19:18:32 +02004933summary(summary_info, bool_yn: true, section: 'Audio backends')
4934
Thomas Huthc3527c52023-06-02 19:18:31 +02004935# Network backends
Thomas Huth9e48afa2023-06-02 19:18:30 +02004936summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004937if host_os == 'darwin'
Thomas Huth9e48afa2023-06-02 19:18:30 +02004938 summary_info += {'vmnet.framework support': vmnet}
4939endif
Ilya Maximetscb039ef2023-09-13 20:34:37 +02004940summary_info += {'AF_XDP support': libxdp}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004941summary_info += {'slirp support': slirp}
Paolo Bonzinie1723992021-10-07 15:08:21 +02004942summary_info += {'vde support': vde}
Paolo Bonzini837b84b2021-10-07 15:08:22 +02004943summary_info += {'netmap support': have_netmap}
Thomas Hutheea94532021-10-28 20:59:08 +02004944summary_info += {'l2tpv3 support': have_l2tpv3}
Thomas Huthc3527c52023-06-02 19:18:31 +02004945summary(summary_info, bool_yn: true, section: 'Network backends')
4946
4947# Libraries
4948summary_info = {}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004949summary_info += {'libtasn1': tasn1}
4950summary_info += {'PAM': pam}
4951summary_info += {'iconv support': iconv}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004952summary_info += {'blkio support': blkio}
4953summary_info += {'curl support': curl}
4954summary_info += {'Multipath support': mpathpersist}
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02004955summary_info += {'Linux AIO support': libaio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004956summary_info += {'Linux io_uring support': linux_io_uring}
4957summary_info += {'ATTR/XATTR support': libattr}
Paolo Bonzini3730a732022-04-20 17:33:41 +02004958summary_info += {'RDMA support': rdma}
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01004959summary_info += {'fdt support': fdt_opt == 'internal' ? 'internal' : fdt}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004960summary_info += {'libcap-ng support': libcap_ng}
4961summary_info += {'bpf support': libbpf}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004962summary_info += {'rbd support': rbd}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004963summary_info += {'smartcard support': cacard}
4964summary_info += {'U2F support': u2f}
4965summary_info += {'libusb': libusb}
4966summary_info += {'usb net redir': usbredir}
Paolo Bonzini88b6e612022-04-20 17:33:40 +02004967summary_info += {'OpenGL support (epoxy)': opengl}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004968summary_info += {'GBM': gbm}
4969summary_info += {'libiscsi support': libiscsi}
4970summary_info += {'libnfs support': libnfs}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004971if host_os == 'windows'
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004972 if have_ga
Marc-André Lureau8821a382022-02-01 16:53:43 +04004973 summary_info += {'QGA VSS support': have_qga_vss}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01004974 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01004975endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004976summary_info += {'seccomp support': seccomp}
4977summary_info += {'GlusterFS support': glusterfs}
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02004978summary_info += {'hv-balloon support': hv_balloon}
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01004979summary_info += {'TPM support': have_tpm}
Thomas Huthe6a52b32021-12-09 15:48:01 +01004980summary_info += {'libssh support': libssh}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004981summary_info += {'lzo support': lzo}
4982summary_info += {'snappy support': snappy}
4983summary_info += {'bzip2 support': libbzip2}
4984summary_info += {'lzfse support': liblzfse}
4985summary_info += {'zstd support': zstd}
Yuan Liub844a2c2024-06-10 18:21:06 +08004986summary_info += {'Query Processing Library support': qpl}
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01004987summary_info += {'UADK Library support': uadk}
Bryan Zhange28ed312024-08-30 16:27:19 -07004988summary_info += {'qatzip support': qatzip}
Paolo Bonzini488a8c72021-12-21 12:38:27 +01004989summary_info += {'NUMA host support': numa}
Thomas Huth83602082022-05-16 16:58:23 +02004990summary_info += {'capstone': capstone}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004991summary_info += {'libpmem support': libpmem}
4992summary_info += {'libdaxctl support': libdaxctl}
Dorjoy Chowdhurybb154e32024-10-09 03:17:23 +06004993summary_info += {'libcbor support': libcbor}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004994summary_info += {'libudev': libudev}
4995# Dummy dependency, keep .found()
Max Reitzdf4ea702020-10-27 20:05:46 +01004996summary_info += {'FUSE lseek': fuse_lseek.found()}
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004997summary_info += {'selinux': selinux}
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01004998summary_info += {'libdw': libdw}
Ilya Leoshkevicha1a98002024-02-06 01:22:03 +01004999if host_os == 'freebsd'
5000 summary_info += {'libinotify-kqueue': inotify}
5001endif
Paolo Bonzinid50ea7f2025-02-20 14:20:27 +01005002if host_os == 'darwin'
5003 summary_info += {'ParavirtualizedGraphics support': pvg}
5004endif
Daniel P. Berrangé6b1c7442025-04-25 13:17:12 +01005005summary_info += {'valgrind': valgrind}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01005006summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01005007
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02005008if host_arch == 'unknown'
Paolo Bonzinif9332752020-02-03 13:28:38 +01005009 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02005010 warning('UNSUPPORTED HOST CPU')
Paolo Bonzinif9332752020-02-03 13:28:38 +01005011 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02005012 message('Support for CPU host architecture ' + cpu + ' is not currently')
5013 message('maintained. The QEMU project does not guarantee that QEMU will')
5014 message('compile or work on this host CPU. You can help by volunteering')
5015 message('to maintain it and providing a build host for our continuous')
5016 message('integration setup.')
Paolo Bonzinie3c426c2022-05-09 12:50:29 +02005017 if have_tcg
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02005018 message()
5019 message('configure has succeeded and you can continue to build, but')
5020 message('QEMU will use a slow interpreter to emulate the target CPU.')
5021 endif
Richard Henderson6d701c92025-01-27 16:22:24 -08005022elif host_long_bits < 64
Paolo Bonzini14ed29d2024-10-27 14:07:01 +01005023 message()
5024 warning('DEPRECATED HOST CPU')
5025 message()
Richard Henderson6d701c92025-01-27 16:22:24 -08005026 message('Support for 32-bit CPU host architecture ' + cpu + ' is going')
5027 message('to be dropped in a future QEMU release.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01005028endif
5029
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01005030if not supported_oses.contains(host_os)
Paolo Bonzinif9332752020-02-03 13:28:38 +01005031 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02005032 warning('UNSUPPORTED HOST OS')
Paolo Bonzinif9332752020-02-03 13:28:38 +01005033 message()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01005034 message('Support for host OS ' + host_os + 'is not currently maintained.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01005035 message('configure has succeeded and you can continue to build, but')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02005036 message('the QEMU project does not guarantee that QEMU will compile or')
5037 message('work on this operating system. You can help by volunteering')
5038 message('to maintain it and providing a build host for our continuous')
5039 message('integration setup. This will ensure that future versions of QEMU')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01005040 message('will keep working on ' + host_os + '.')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02005041endif
5042
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01005043if host_arch == 'unknown' or not supported_oses.contains(host_os)
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02005044 message()
5045 message('If you want to help supporting QEMU on this platform, please')
5046 message('contact the developers at qemu-devel@nongnu.org.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01005047endif
Paolo Bonzini655e2a72023-10-05 14:19:34 +02005048
5049actually_reloc = get_option('relocatable')
5050# check if get_relocated_path() is actually able to relocate paths
5051if get_option('relocatable') and \
5052 not (get_option('prefix') / get_option('bindir')).startswith(get_option('prefix') / '')
5053 message()
5054 warning('bindir not included within prefix, the installation will not be relocatable.')
5055 actually_reloc = false
5056endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01005057if not actually_reloc and (host_os == 'windows' or get_option('relocatable'))
5058 if host_os == 'windows'
Paolo Bonzini655e2a72023-10-05 14:19:34 +02005059 message()
5060 warning('Windows installs should usually be relocatable.')
5061 endif
5062 message()
5063 message('QEMU will have to be installed under ' + get_option('prefix') + '.')
5064 message('Use --disable-relocatable to remove this warning.')
5065endif