blob: dbc97bfdf7a0d888e270056d52b565c494878646 [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
Paolo Bonzini53de9662025-05-02 19:06:43 +0200109 rustdoc = find_program('rustdoc', required: get_option('rust'))
Paolo Bonzinic2988df2024-10-15 15:00:41 +0200110 bindgen = find_program('bindgen', required: get_option('rust'))
111 if not bindgen.found() or bindgen.version().version_compare('<0.60.0')
112 if get_option('rust').enabled()
113 error('bindgen version ' + bindgen.version() + ' is unsupported. You can install a new version with "cargo install bindgen-cli"')
114 else
115 if bindgen.found()
116 warning('bindgen version ' + bindgen.version() + ' is unsupported, disabling Rust compilation.')
117 else
118 warning('bindgen not found, disabling Rust compilation.')
119 endif
120 message('To use Rust you can install a new version with "cargo install bindgen-cli"')
121 have_rust = false
122 endif
123 endif
124endif
125
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +0200126if have_rust
Paolo Bonzini97ed1e92024-11-07 10:02:15 +0100127 rustc_args = [find_program('scripts/rust/rustc_args.py'),
Paolo Bonzini90868c32024-11-06 13:03:45 +0100128 '--rustc-version', rustc.version(),
129 '--workspace', meson.project_source_root() / 'rust']
Paolo Bonzinide98c172024-11-07 10:14:49 +0100130 if get_option('strict_rust_lints')
131 rustc_args += ['--strict-lints']
132 endif
133
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +0200134 rustfmt = find_program('rustfmt', required: false)
Paolo Bonzinif3a6e9b2024-11-12 11:54:11 +0100135
Paolo Bonzini90868c32024-11-06 13:03:45 +0100136 rustc_lint_args = run_command(rustc_args, '--lints',
137 capture: true, check: true).stdout().strip().splitlines()
Paolo Bonzinif3a6e9b2024-11-12 11:54:11 +0100138
Paolo Bonzinif3a6e9b2024-11-12 11:54:11 +0100139 # Apart from procedural macros, our Rust executables will often link
140 # with C code, so include all the libraries that C code needs. This
141 # is safe; https://github.com/rust-lang/rust/pull/54675 says that
142 # passing -nodefaultlibs to the linker "was more ideological to
143 # start with than anything".
144 add_project_arguments(rustc_lint_args +
145 ['--cfg', 'MESON', '-C', 'default-linker-libraries'],
146 native: false, language: 'rust')
147 add_project_arguments(rustc_lint_args + ['--cfg', 'MESON'],
148 native: true, language: 'rust')
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +0200149endif
150
Paolo Bonzini44458a62023-09-08 12:06:57 +0200151dtrace = not_found
152stap = not_found
153if 'dtrace' in get_option('trace_backends')
154 dtrace = find_program('dtrace', required: true)
155 stap = find_program('stap', required: false)
156 if stap.found()
157 # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
158 # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
159 # instead. QEMU --enable-modules depends on this because the SystemTap
160 # semaphores are linked into the main binary and not the module's shared
161 # object.
162 add_global_arguments('-DSTAP_SDT_V2',
163 native: false, language: all_languages)
164 endif
165endif
166
167if get_option('iasl') == ''
168 iasl = find_program('iasl', required: false)
169else
170 iasl = find_program(get_option('iasl'), required: true)
171endif
172
Xianglai Lib883fb92024-07-24 10:22:45 +0800173edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu', 'riscv64-softmmu', 'loongarch64-softmmu' ]
Paolo Bonzini44458a62023-09-08 12:06:57 +0200174unpack_edk2_blobs = false
175foreach target : edk2_targets
176 if target in target_dirs
177 bzip2 = find_program('bzip2', required: get_option('install_blobs'))
178 unpack_edk2_blobs = bzip2.found()
179 break
180 endif
181endforeach
182
183#####################
184# Option validation #
185#####################
186
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100187# Fuzzing
188if get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
189 not cc.links('''
190 #include <stdint.h>
191 #include <sys/types.h>
192 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
193 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
194 ''',
195 args: ['-Werror', '-fsanitize=fuzzer'])
196 error('Your compiler does not support -fsanitize=fuzzer')
197endif
198
199# Tracing backends
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100200if 'ftrace' in get_option('trace_backends') and host_os != 'linux'
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100201 error('ftrace is supported only on Linux')
202endif
203if 'syslog' in get_option('trace_backends') and not cc.compiles('''
204 #include <syslog.h>
205 int main(void) {
206 openlog("qemu", LOG_PID, LOG_DAEMON);
207 syslog(LOG_INFO, "configure");
208 return 0;
209 }''')
210 error('syslog is not supported on this system')
211endif
212
213# Miscellaneous Linux-only features
214get_option('mpath') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100215 .require(host_os == 'linux', error_message: 'Multipath is supported only on Linux')
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100216
217multiprocess_allowed = get_option('multiprocess') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100218 .require(host_os == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100219 .allowed()
220
221vfio_user_server_allowed = get_option('vfio_user_server') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100222 .require(host_os == 'linux', error_message: 'vfio-user server is supported only on Linux') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100223 .allowed()
224
225have_tpm = get_option('tpm') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100226 .require(host_os != 'windows', error_message: 'TPM emulation only available on POSIX systems') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100227 .allowed()
228
229# vhost
230have_vhost_user = get_option('vhost_user') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100231 .disable_auto_if(host_os != 'linux') \
232 .require(host_os != 'windows',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100233 error_message: 'vhost-user is not available on Windows').allowed()
234have_vhost_vdpa = get_option('vhost_vdpa') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100235 .require(host_os == 'linux',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100236 error_message: 'vhost-vdpa is only available on Linux').allowed()
237have_vhost_kernel = get_option('vhost_kernel') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100238 .require(host_os == 'linux',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100239 error_message: 'vhost-kernel is only available on Linux').allowed()
240have_vhost_user_crypto = get_option('vhost_crypto') \
241 .require(have_vhost_user,
242 error_message: 'vhost-crypto requires vhost-user to be enabled').allowed()
243
244have_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel
245
246have_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed()
247have_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed()
248have_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed()
249have_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa
250
Paolo Bonzinie3c426c2022-05-09 12:50:29 +0200251have_tcg = get_option('tcg').allowed() and (have_system or have_user)
252
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200253have_tools = get_option('tools') \
254 .disable_auto_if(not have_system) \
255 .allowed()
256have_ga = get_option('guest_agent') \
257 .disable_auto_if(not have_system and not have_tools) \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100258 .require(host_os in ['sunos', 'linux', 'windows', 'freebsd', 'netbsd', 'openbsd'],
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200259 error_message: 'unsupported OS for QEMU guest agent') \
260 .allowed()
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100261have_block = have_system or have_tools
262
Paolo Bonzini60027112022-10-20 14:53:10 +0200263enable_modules = get_option('modules') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100264 .require(host_os != 'windows',
Paolo Bonzini60027112022-10-20 14:53:10 +0200265 error_message: 'Modules are not available for Windows') \
266 .require(not get_option('prefer_static'),
267 error_message: 'Modules are incompatible with static linking') \
268 .allowed()
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200269
Paolo Bonziniea444d92023-09-08 12:06:12 +0200270#######################################
271# Variables for host and accelerators #
272#######################################
273
Paolo Bonzini823eb012021-11-08 14:18:17 +0100274if cpu not in supported_cpus
275 host_arch = 'unknown'
276elif cpu == 'x86'
277 host_arch = 'i386'
Richard Henderson0e3ed772021-12-31 05:25:11 +0000278elif cpu == 'mips64'
279 host_arch = 'mips'
Philippe Mathieu-Daudé278c1bc2023-06-27 16:32:34 +0200280elif cpu in ['riscv32', 'riscv64']
281 host_arch = 'riscv'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100282else
283 host_arch = cpu
284endif
285
Richard Henderson33614fa2025-02-03 12:28:59 -0800286if cpu == 'x86'
287 kvm_targets = ['i386-softmmu']
288elif cpu == 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400289 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
290elif cpu == 'aarch64'
291 kvm_targets = ['aarch64-softmmu']
292elif cpu == 's390x'
293 kvm_targets = ['s390x-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800294elif cpu == 'ppc'
295 kvm_targets = ['ppc-softmmu']
296elif cpu == 'ppc64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400297 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800298elif cpu == 'mips'
299 kvm_targets = ['mips-softmmu', 'mipsel-softmmu']
300elif cpu == 'mips64'
Huacai Chenfbc58842020-10-07 16:39:28 +0800301 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800302elif cpu == 'riscv32'
Philippe Mathieu-Daudé4de81092023-06-27 16:32:35 +0200303 kvm_targets = ['riscv32-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800304elif cpu == 'riscv64'
Philippe Mathieu-Daudé4de81092023-06-27 16:32:35 +0200305 kvm_targets = ['riscv64-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800306elif cpu == 'loongarch64'
Tianrui Zhao714b03c2024-01-05 15:58:04 +0800307 kvm_targets = ['loongarch64-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400308else
309 kvm_targets = []
310endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400311accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alexander Graf844a06b2021-09-16 17:54:02 +0200312
Richard Henderson807a85d2025-02-04 08:16:36 -0800313if cpu == 'x86'
314 xen_targets = ['i386-softmmu']
315elif cpu == 'x86_64'
Paolo Bonzini16b62732023-12-09 15:31:15 +0100316 xen_targets = ['i386-softmmu', 'x86_64-softmmu']
Richard Henderson807a85d2025-02-04 08:16:36 -0800317elif cpu == 'arm'
318 # i386 emulator provides xenpv machine type for multiple architectures
319 xen_targets = ['i386-softmmu']
320elif cpu == 'aarch64'
Paolo Bonzini16b62732023-12-09 15:31:15 +0100321 # i386 emulator provides xenpv machine type for multiple architectures
322 xen_targets = ['i386-softmmu', 'x86_64-softmmu', 'aarch64-softmmu']
323else
324 xen_targets = []
325endif
326accelerator_targets += { 'CONFIG_XEN': xen_targets }
327
Richard Henderson83ef4862025-02-04 08:20:42 -0800328if cpu == 'aarch64'
Alexander Graf844a06b2021-09-16 17:54:02 +0200329 accelerator_targets += {
330 'CONFIG_HVF': ['aarch64-softmmu']
331 }
Richard Henderson83ef4862025-02-04 08:20:42 -0800332elif cpu == 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400333 accelerator_targets += {
Paolo Bonzini8a199802020-09-18 05:37:01 -0400334 'CONFIG_HVF': ['x86_64-softmmu'],
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200335 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400336 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
337 }
338endif
339
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400340##################
341# Compiler flags #
342##################
343
Paolo Bonzini13f60de2022-10-20 14:34:27 +0200344foreach lang : all_languages
345 compiler = meson.get_compiler(lang)
346 if compiler.get_id() == 'gcc' and compiler.version().version_compare('>=7.4')
347 # ok
348 elif compiler.get_id() == 'clang' and compiler.compiles('''
349 #ifdef __apple_build_version__
Thomas Huth4e035202024-11-26 09:10:54 +0100350 # if __clang_major__ < 15 || (__clang_major__ == 15 && __clang_minor__ < 0)
351 # error You need at least XCode Clang v15.0 to compile QEMU
Paolo Bonzini13f60de2022-10-20 14:34:27 +0200352 # endif
353 #else
354 # if __clang_major__ < 10 || (__clang_major__ == 10 && __clang_minor__ < 0)
355 # error You need at least Clang v10.0 to compile QEMU
356 # endif
357 #endif''')
358 # ok
Kohei Tokunagaccc403e2025-04-28 15:39:07 +0900359 elif compiler.get_id() == 'emscripten'
360 # ok
Paolo Bonzini13f60de2022-10-20 14:34:27 +0200361 else
Thomas Huth4e035202024-11-26 09:10:54 +0100362 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 +0200363 endif
364endforeach
365
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200366# default flags for all hosts
367# We use -fwrapv to tell the compiler that we require a C dialect where
368# left shift of signed integers is well defined and has the expected
369# 2s-complement style results. (Both clang and gcc agree that it
370# provides these semantics.)
371
372qemu_common_flags = [
373 '-D_GNU_SOURCE', '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE_SOURCE',
374 '-fno-strict-aliasing', '-fno-common', '-fwrapv' ]
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200375qemu_cflags = []
Paolo Bonzini911d4ca2022-10-12 12:46:23 +0200376qemu_ldflags = []
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100377
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100378if host_os == 'darwin'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200379 # Disable attempts to use ObjectiveC features in os/object.h since they
380 # won't work when we're compiling with gcc as a C compiler.
Alexander Graf2fc36532023-08-30 16:14:14 +0000381 if compiler.get_id() == 'gcc'
382 qemu_common_flags += '-DOS_OBJECT_USE_OBJC=0'
383 endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100384elif host_os == 'sunos'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200385 # needed for CMSG_ macros in sys/socket.h
386 qemu_common_flags += '-D_XOPEN_SOURCE=600'
387 # needed for TIOCWIN* defines in termios.h
388 qemu_common_flags += '-D__EXTENSIONS__'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100389elif host_os == 'haiku'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200390 qemu_common_flags += ['-DB_USE_POSITIVE_POSIX_ERRORS', '-D_BSD_SOURCE', '-fPIC']
Pierrick Bouvier923710b2025-01-16 16:02:54 +0000391elif host_os == 'windows'
392 # plugins use delaylib, and clang needs to be used with lld to make it work.
393 if compiler.get_id() == 'clang' and compiler.get_linker_id() != 'ld.lld'
394 error('On windows, you need to use lld with clang - use msys2 clang64/clangarm64 env')
395 endif
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200396endif
397
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200398# Choose instruction set (currently x86-only)
399
400qemu_isa_flags = []
401
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200402# __sync_fetch_and_and requires at least -march=i486. Many toolchains
403# use i686 as default anyway, but for those that don't, an explicit
404# specification is necessary
405if host_arch == 'i386' and not cc.links('''
406 static int sfaa(int *ptr)
407 {
408 return __sync_fetch_and_and(ptr, 0);
409 }
410
411 int main(void)
412 {
413 int val = 42;
414 val = __sync_val_compare_and_swap(&val, 0, 1);
415 sfaa(&val);
416 return val;
417 }''')
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200418 qemu_isa_flags += ['-march=i486']
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200419endif
420
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200421# Pick x86-64 baseline version
Paolo Bonzini294ac642024-05-31 10:37:06 +0200422if host_arch in ['i386', 'x86_64']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200423 if get_option('x86_version') == '0' and host_arch == 'x86_64'
424 error('x86_64-v1 required for x86-64 hosts')
425 endif
426
427 # add flags for individual instruction set extensions
428 if get_option('x86_version') >= '1'
429 if host_arch == 'i386'
430 qemu_common_flags = ['-mfpmath=sse'] + qemu_common_flags
431 else
432 # present on basically all processors but technically not part of
433 # x86-64-v1, so only include -mneeded for x86-64 version 2 and above
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200434 qemu_isa_flags += ['-mcx16']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200435 endif
436 endif
437 if get_option('x86_version') >= '2'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200438 qemu_isa_flags += ['-mpopcnt']
439 qemu_isa_flags += cc.get_supported_arguments('-mneeded')
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200440 endif
441 if get_option('x86_version') >= '3'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200442 qemu_isa_flags += ['-mmovbe', '-mabm', '-mbmi', '-mbmi2', '-mfma', '-mf16c']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200443 endif
444
445 # add required vector instruction set (each level implies those below)
446 if get_option('x86_version') == '1'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200447 qemu_isa_flags += ['-msse2']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200448 elif get_option('x86_version') == '2'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200449 qemu_isa_flags += ['-msse4.2']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200450 elif get_option('x86_version') == '3'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200451 qemu_isa_flags += ['-mavx2']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200452 elif get_option('x86_version') == '4'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200453 qemu_isa_flags += ['-mavx512f', '-mavx512bw', '-mavx512cd', '-mavx512dq', '-mavx512vl']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200454 endif
Artyom Kunakovskyc2bf2cc2024-05-23 08:11:18 +0300455endif
456
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200457qemu_common_flags = qemu_isa_flags + qemu_common_flags
458
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +0200459if get_option('prefer_static')
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100460 qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
461endif
462
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200463# Meson currently only handles pie as a boolean for now, so if the user
464# has explicitly disabled PIE we need to extend our cflags.
Paolo Bonzinib03fcd62023-05-22 10:05:33 +0200465#
466# -no-pie is supposedly a linker flag that has no effect on the compiler
467# command line, but some distros, that didn't quite know what they were
468# doing, made local changes to gcc's specs file that turned it into
469# a compiler command-line flag.
470#
471# What about linker flags? For a static build, no PIE is implied by -static
472# which we added above (and if it's not because of the same specs patching,
473# there's nothing we can do: compilation will fail, report a bug to your
474# distro and do not use --disable-pie in the meanwhile). For dynamic linking,
475# instead, we can't add -no-pie because it overrides -shared: the linker then
476# tries to build an executable instead of a shared library and fails. So
477# don't add -no-pie anywhere and cross fingers. :(
Kohei Tokunagaccc403e2025-04-28 15:39:07 +0900478#
479# Emscripten doesn't support -no-pie but meson can't catch the compiler
480# warning. So explicitly omit the flag for Emscripten.
481if not get_option('b_pie') and host_os != 'emscripten'
Paolo Bonzinib03fcd62023-05-22 10:05:33 +0200482 qemu_common_flags += cc.get_supported_arguments('-fno-pie', '-no-pie')
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200483endif
484
Paolo Bonzini911d4ca2022-10-12 12:46:23 +0200485if not get_option('stack_protector').disabled()
486 stack_protector_probe = '''
487 int main(int argc, char *argv[])
488 {
489 char arr[64], *p = arr, *c = argv[argc - 1];
490 while (*c) {
491 *p++ = *c++;
492 }
493 return 0;
494 }'''
495 have_stack_protector = false
496 foreach arg : ['-fstack-protector-strong', '-fstack-protector-all']
497 # We need to check both a compile and a link, since some compiler
498 # setups fail only on a .c->.o compile and some only at link time
499 if cc.compiles(stack_protector_probe, args: ['-Werror', arg]) and \
500 cc.links(stack_protector_probe, args: ['-Werror', arg])
501 have_stack_protector = true
502 qemu_cflags += arg
503 qemu_ldflags += arg
504 break
505 endif
506 endforeach
507 get_option('stack_protector') \
508 .require(have_stack_protector, error_message: 'Stack protector not supported')
509endif
510
Paolo Bonzini67398252022-10-12 13:19:35 +0200511coroutine_backend = get_option('coroutine_backend')
512ucontext_probe = '''
513 #include <ucontext.h>
514 #ifdef __stub_makecontext
515 #error Ignoring glibc stub makecontext which will always fail
516 #endif
517 int main(void) { makecontext(0, 0, 0); return 0; }'''
518
519# On Windows the only valid backend is the Windows specific one.
520# For POSIX prefer ucontext, but it's not always possible. The fallback
521# is sigcontext.
522supported_backends = []
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100523if host_os == 'windows'
Paolo Bonzini67398252022-10-12 13:19:35 +0200524 supported_backends += ['windows']
Kohei Tokunagaccc403e2025-04-28 15:39:07 +0900525elif host_os == 'emscripten'
526 supported_backends += ['wasm']
Paolo Bonzini67398252022-10-12 13:19:35 +0200527else
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100528 if host_os != 'darwin' and cc.links(ucontext_probe)
Paolo Bonzini67398252022-10-12 13:19:35 +0200529 supported_backends += ['ucontext']
530 endif
531 supported_backends += ['sigaltstack']
532endif
533
534if coroutine_backend == 'auto'
535 coroutine_backend = supported_backends[0]
536elif coroutine_backend not in supported_backends
537 error('"@0@" backend requested but not available. Available backends: @1@' \
538 .format(coroutine_backend, ', '.join(supported_backends)))
539endif
540
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200541# Compiles if SafeStack *not* enabled
542safe_stack_probe = '''
543 int main(void)
544 {
545 #if defined(__has_feature)
546 #if __has_feature(safe_stack)
547 #error SafeStack Enabled
548 #endif
549 #endif
550 return 0;
551 }'''
552if get_option('safe_stack') != not cc.compiles(safe_stack_probe)
553 safe_stack_arg = get_option('safe_stack') ? '-fsanitize=safe-stack' : '-fno-sanitize=safe-stack'
554 if get_option('safe_stack') != not cc.compiles(safe_stack_probe, args: safe_stack_arg)
555 error(get_option('safe_stack') \
556 ? 'SafeStack not supported by your compiler' \
557 : 'Cannot disable SafeStack')
558 endif
559 qemu_cflags += safe_stack_arg
560 qemu_ldflags += safe_stack_arg
561endif
Paolo Bonzini67398252022-10-12 13:19:35 +0200562if get_option('safe_stack') and coroutine_backend != 'ucontext'
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200563 error('SafeStack is only supported with the ucontext coroutine backend')
564endif
565
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000566if get_option('asan')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100567 if cc.has_argument('-fsanitize=address')
568 qemu_cflags = ['-fsanitize=address'] + qemu_cflags
569 qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000570 else
571 error('Your compiler does not support -fsanitize=address')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100572 endif
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000573endif
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100574
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000575if get_option('ubsan')
576 # Detect static linking issue with ubsan:
577 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100578 if cc.links('int main(int argc, char **argv) { return argc + 1; }',
579 args: [qemu_ldflags, '-fsanitize=undefined'])
Richard Hendersondb770a22024-08-13 19:52:16 +1000580 qemu_cflags += ['-fsanitize=undefined']
581 qemu_ldflags += ['-fsanitize=undefined']
582
583 # Suppress undefined behaviour from function call to mismatched type.
584 # In addition, tcg prologue does not emit function type prefix
585 # required by function call sanitizer.
586 if cc.has_argument('-fno-sanitize=function')
587 qemu_cflags += ['-fno-sanitize=function']
588 endif
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000589 else
590 error('Your compiler does not support -fsanitize=undefined')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100591 endif
592endif
593
594# Thread sanitizer is, for now, much noisier than the other sanitizers;
595# keep it separate until that is not the case.
596if get_option('tsan')
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000597 if get_option('asan') or get_option('ubsan')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100598 error('TSAN is not supported with other sanitizers')
599 endif
600 if not cc.has_function('__tsan_create_fiber',
601 args: '-fsanitize=thread',
602 prefix: '#include <sanitizer/tsan_interface.h>')
603 error('Cannot enable TSAN due to missing fiber annotation interface')
604 endif
Pierrick Bouviercf6fbba2024-10-23 12:33:52 +0100605 tsan_warn_suppress = []
606 # gcc (>=11) will report constructions not supported by tsan:
607 # "error: ‘atomic_thread_fence’ is not supported with ‘-fsanitize=thread’"
608 # https://gcc.gnu.org/gcc-11/changes.html
609 # However, clang does not support this warning and this triggers an error.
610 if cc.has_argument('-Wno-tsan')
611 tsan_warn_suppress = ['-Wno-tsan']
612 endif
613 qemu_cflags = ['-fsanitize=thread'] + tsan_warn_suppress + qemu_cflags
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100614 qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags
615endif
616
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100617# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
618# The combination is known as "full relro", because .got.plt is read-only too.
619qemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
620
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100621if host_os == 'windows'
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200622 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat')
Paolo Bonzini2d73fa72022-11-02 13:03:51 +0100623 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200624endif
625
Paolo Bonzini537b7242021-10-07 15:08:12 +0200626if get_option('fuzzing')
Paolo Bonzini537b7242021-10-07 15:08:12 +0200627 # Specify a filter to only instrument code that is directly related to
628 # virtual-devices.
629 configure_file(output: 'instrumentation-filter',
630 input: 'scripts/oss-fuzz/instrumentation-filter-template',
631 copy: true)
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400632
633 if cc.compiles('int main () { return 0; }',
634 name: '-fsanitize-coverage-allowlist=/dev/null',
Alexander Bulekove56d0972022-06-21 16:45:07 -0400635 args: ['-fsanitize-coverage-allowlist=/dev/null',
636 '-fsanitize-coverage=trace-pc'] )
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200637 qemu_common_flags += ['-fsanitize-coverage-allowlist=instrumentation-filter']
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400638 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +0200639
640 if get_option('fuzzing_engine') == ''
641 # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
642 # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link
643 # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
644 # unable to bind the fuzzer-related callbacks added by instrumentation.
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200645 qemu_common_flags += ['-fsanitize=fuzzer-no-link']
646 qemu_ldflags += ['-fsanitize=fuzzer-no-link']
Paolo Bonzini537b7242021-10-07 15:08:12 +0200647 # For the actual fuzzer binaries, we need to link against the libfuzzer
648 # library. They need to be configurable, to support OSS-Fuzz
649 fuzz_exe_ldflags = ['-fsanitize=fuzzer']
650 else
651 # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
652 # the needed CFLAGS have already been provided
653 fuzz_exe_ldflags = get_option('fuzzing_engine').split()
654 endif
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400655endif
656
Paolo Bonzini82761292023-05-10 14:54:30 +0200657if get_option('cfi')
658 cfi_flags=[]
659 # Check for dependency on LTO
660 if not get_option('b_lto')
661 error('Selected Control-Flow Integrity but LTO is disabled')
662 endif
663 if enable_modules
664 error('Selected Control-Flow Integrity is not compatible with modules')
665 endif
666 # Check for cfi flags. CFI requires LTO so we can't use
667 # get_supported_arguments, but need a more complex "compiles" which allows
668 # custom arguments
669 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
670 args: ['-flto', '-fsanitize=cfi-icall'] )
671 cfi_flags += '-fsanitize=cfi-icall'
672 else
673 error('-fsanitize=cfi-icall is not supported by the compiler')
674 endif
675 if cc.compiles('int main () { return 0; }',
676 name: '-fsanitize-cfi-icall-generalize-pointers',
677 args: ['-flto', '-fsanitize=cfi-icall',
678 '-fsanitize-cfi-icall-generalize-pointers'] )
679 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
680 else
681 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
682 endif
683 if get_option('cfi_debug')
684 if cc.compiles('int main () { return 0; }',
685 name: '-fno-sanitize-trap=cfi-icall',
686 args: ['-flto', '-fsanitize=cfi-icall',
687 '-fno-sanitize-trap=cfi-icall'] )
688 cfi_flags += '-fno-sanitize-trap=cfi-icall'
689 else
690 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
691 endif
692 endif
693 add_global_arguments(cfi_flags, native: false, language: all_languages)
694 add_global_link_arguments(cfi_flags, native: false, language: all_languages)
695endif
696
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000697# Check further flags that make QEMU more robust against malicious parties
698
699hardening_flags = [
Daniel P. Berrangé7ff9ff032024-01-03 12:34:14 +0000700 # Initialize all stack variables to zero. This makes
701 # it harder to take advantage of uninitialized stack
702 # data to drive exploits
703 '-ftrivial-auto-var-init=zero',
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000704]
705
Daniel P. Berrangé95633112024-03-04 14:44:55 +0000706# Zero out registers used during a function call
707# upon its return. This makes it harder to assemble
708# ROP gadgets into something usable
709#
710# NB: Clang 17 is broken and SEGVs
711# https://github.com/llvm/llvm-project/issues/75168
Thomas Huth2d6d9952024-04-11 14:08:19 +0200712#
713# NB2: This clashes with the "retguard" extension of OpenBSD's Clang
714# https://gitlab.com/qemu-project/qemu/-/issues/2278
715if host_os != 'openbsd' and \
716 cc.compiles('extern struct { void (*cb)(void); } s; void f(void) { s.cb(); }',
Daniel P. Berrangé95633112024-03-04 14:44:55 +0000717 name: '-fzero-call-used-regs=used-gpr',
718 args: ['-O2', '-fzero-call-used-regs=used-gpr'])
719 hardening_flags += '-fzero-call-used-regs=used-gpr'
720endif
721
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000722qemu_common_flags += cc.get_supported_arguments(hardening_flags)
723
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200724add_global_arguments(qemu_common_flags, native: false, language: all_languages)
725add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
726
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100727# Collect warning flags we want to set, sorted alphabetically
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100728warn_flags = [
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100729 # First enable interesting warnings
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100730 '-Wempty-body',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100731 '-Wendif-labels',
732 '-Wexpansion-to-defined',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100733 '-Wformat-security',
734 '-Wformat-y2k',
735 '-Wignored-qualifiers',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100736 '-Wimplicit-fallthrough=2',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100737 '-Winit-self',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100738 '-Wmissing-format-attribute',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100739 '-Wmissing-prototypes',
740 '-Wnested-externs',
741 '-Wold-style-declaration',
742 '-Wold-style-definition',
743 '-Wredundant-decls',
744 '-Wshadow=local',
745 '-Wstrict-prototypes',
746 '-Wtype-limits',
747 '-Wundef',
Peter Maydell64c1a542024-02-21 17:26:36 +0100748 '-Wvla',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100749 '-Wwrite-strings',
750
751 # Then disable some undesirable warnings
752 '-Wno-gnu-variable-sized-type-not-at-end',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100753 '-Wno-initializer-overrides',
754 '-Wno-missing-include-dirs',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100755 '-Wno-psabi',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100756 '-Wno-shift-negative-value',
757 '-Wno-string-plus-int',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100758 '-Wno-tautological-type-limit-compare',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100759 '-Wno-typedef-redefinition',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100760]
761
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100762if host_os != 'darwin'
Kevin Wolf7e171112024-06-27 20:12:45 +0200763 tsa_has_cleanup = cc.compiles('''
764 struct __attribute__((capability("mutex"))) mutex {};
765 void lock(struct mutex *m) __attribute__((acquire_capability(m)));
766 void unlock(struct mutex *m) __attribute__((release_capability(m)));
767
768 void test(void) {
769 struct mutex __attribute__((cleanup(unlock))) m;
770 lock(&m);
771 }
772 ''', args: ['-Wthread-safety', '-Werror'])
773 if tsa_has_cleanup
774 warn_flags += ['-Wthread-safety']
775 endif
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100776endif
777
Thomas Huth785abf02023-07-06 08:47:36 +0200778# Set up C++ compiler flags
Paolo Bonzinib4854582021-11-08 12:31:52 +0100779qemu_cxxflags = []
Paolo Bonzinie5134022022-10-12 14:15:06 +0200780if 'cpp' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100781 qemu_cxxflags = ['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'] + qemu_cflags
Paolo Bonzinib4854582021-11-08 12:31:52 +0100782endif
783
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200784add_project_arguments(qemu_cflags, native: false, language: 'c')
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100785add_project_arguments(cc.get_supported_arguments(warn_flags), native: false, language: 'c')
786if 'cpp' in all_languages
787 add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
788 add_project_arguments(cxx.get_supported_arguments(warn_flags), native: false, language: 'cpp')
789endif
790if 'objc' in all_languages
791 # Note sanitizer flags are not applied to Objective-C sources!
792 add_project_arguments(objc.get_supported_arguments(warn_flags), native: false, language: 'objc')
793endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100794if host_os == 'linux'
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400795 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
796 '-isystem', 'linux-headers',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200797 language: all_languages)
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400798endif
799
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100800add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400801 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400802 '-iquote', meson.current_source_dir() / 'include',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200803 language: all_languages)
Paolo Bonzinia5665052019-06-10 12:05:14 +0200804
Richard Henderson44fc7162023-05-17 17:48:34 -0700805# If a host-specific include directory exists, list that first...
806host_include = meson.current_source_dir() / 'host/include/'
807if fs.is_dir(host_include / host_arch)
808 add_project_arguments('-iquote', host_include / host_arch,
809 language: all_languages)
810endif
811# ... followed by the generic fallback.
812add_project_arguments('-iquote', host_include / 'generic',
813 language: all_languages)
814
Paolo Bonzinideb62372020-09-01 07:51:16 -0400815sparse = find_program('cgcc', required: get_option('sparse'))
816if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100817 run_target('sparse',
818 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400819 'compile_commands.json', sparse.full_path(), '-Wbitwise',
820 '-Wno-transparent-union', '-Wno-old-initializer',
821 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100822endif
823
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200824#####################################
825# Host-specific libraries and flags #
826#####################################
827
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200828libm = cc.find_library('m', required: false)
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +0200829threads = dependency('threads')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400830util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200831winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400832socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400833version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400834coref = []
835iokit = []
Phil Dennis-Jordan23521592023-06-14 22:57:33 +0000836pvg = not_found
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400837emulator_link_args = []
Marc-André Lureau23011f42022-02-01 12:55:21 +0400838midl = not_found
839widl = not_found
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900840pathcch = not_found
Akihiko Odaki1bc2c492025-05-29 14:45:51 +0900841synchronization = not_found
Paolo Bonzinia6305082021-10-07 15:08:15 +0200842host_dsosuf = '.so'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100843if host_os == 'windows'
Marc-André Lureau23011f42022-02-01 12:55:21 +0400844 midl = find_program('midl', required: false)
845 widl = find_program('widl', required: false)
Akihiko Odaki1bc2c492025-05-29 14:45:51 +0900846
Paolo Bonzini9a029322025-06-09 12:58:54 +0200847 # MinGW uses lowercase for library names
848 pathcch = cc.find_library('pathcch', required: true)
849 synchronization = cc.find_library('synchronization', required: true)
850 socket = cc.find_library('ws2_32', required: true)
851 winmm = cc.find_library('winmm', required: true)
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400852
853 win = import('windows')
854 version_res = win.compile_resources('version.rc',
855 depend_files: files('pc-bios/qemu-nsis.ico'),
856 include_directories: include_directories('.'))
Paolo Bonzinia6305082021-10-07 15:08:15 +0200857 host_dsosuf = '.dll'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100858elif host_os == 'darwin'
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400859 coref = dependency('appleframeworks', modules: 'CoreFoundation')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700860 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
Paolo Bonzinia6305082021-10-07 15:08:15 +0200861 host_dsosuf = '.dylib'
Paolo Bonzinid50ea7f2025-02-20 14:20:27 +0100862 pvg = dependency('appleframeworks', modules: ['ParavirtualizedGraphics', 'Metal'],
863 required: get_option('pvg'))
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100864elif host_os == 'sunos'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200865 socket = [cc.find_library('socket'),
866 cc.find_library('nsl'),
867 cc.find_library('resolv')]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100868elif host_os == 'haiku'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200869 socket = [cc.find_library('posix_error_mapper'),
870 cc.find_library('network'),
871 cc.find_library('bsd')]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100872elif host_os == 'openbsd'
Paolo Bonzinie3c426c2022-05-09 12:50:29 +0200873 if have_tcg
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400874 # Disable OpenBSD W^X if available
875 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
876 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400877endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200878
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200879###############################################
880# Host-specific configuration of accelerators #
881###############################################
882
Paolo Bonzini8a199802020-09-18 05:37:01 -0400883accelerators = []
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100884if get_option('kvm').allowed() and host_os == 'linux'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400885 accelerators += 'CONFIG_KVM'
886endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100887if get_option('whpx').allowed() and host_os == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000888 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400889 error('WHPX requires 64-bit host')
Philippe Mathieu-Daudé641b8412023-06-24 15:31:44 +0200890 elif cc.has_header('winhvplatform.h', required: get_option('whpx')) and \
891 cc.has_header('winhvemulation.h', required: get_option('whpx'))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400892 accelerators += 'CONFIG_WHPX'
893 endif
894endif
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200895
896hvf = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100897if get_option('hvf').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400898 hvf = dependency('appleframeworks', modules: 'Hypervisor',
899 required: get_option('hvf'))
900 if hvf.found()
901 accelerators += 'CONFIG_HVF'
902 endif
903endif
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200904
905nvmm = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100906if host_os == 'netbsd'
nia0cc49652021-10-13 13:54:17 +0000907 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200908 if nvmm.found()
909 accelerators += 'CONFIG_NVMM'
910 endif
911endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100912
Paolo Bonzini823eb012021-11-08 14:18:17 +0100913tcg_arch = host_arch
Paolo Bonzinie3c426c2022-05-09 12:50:29 +0200914if have_tcg
Paolo Bonzini823eb012021-11-08 14:18:17 +0100915 if host_arch == 'unknown'
Paolo Bonzinia24f15d2023-08-04 11:29:05 +0200916 if not get_option('tcg_interpreter')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400917 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
918 endif
Kohei Tokunagaccc403e2025-04-28 15:39:07 +0900919 elif host_arch == 'wasm32'
920 if not get_option('tcg_interpreter')
921 error('WebAssembly host requires --enable-tcg-interpreter')
922 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100923 elif get_option('tcg_interpreter')
Philippe Mathieu-Daudé1c282da2021-05-21 12:34:23 +0200924 warning('Use of the TCG interpreter is not recommended on this host')
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100925 warning('architecture. There is a native TCG execution backend available')
926 warning('which provides substantially better performance and reliability.')
927 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
928 warning('configuration option on this architecture to use the native')
929 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400930 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100931 if get_option('tcg_interpreter')
932 tcg_arch = 'tci'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100933 elif host_arch == 'x86_64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100934 tcg_arch = 'i386'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100935 elif host_arch == 'ppc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100936 tcg_arch = 'ppc'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100937 endif
938 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzinie5134022022-10-12 14:15:06 +0200939 language: all_languages)
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100940
Paolo Bonzini8a199802020-09-18 05:37:01 -0400941 accelerators += 'CONFIG_TCG'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400942endif
943
944if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
945 error('KVM not available on this platform')
946endif
947if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
948 error('HVF not available on this platform')
949endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200950if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
951 error('NVMM not available on this platform')
952endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400953if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
954 error('WHPX not available on this platform')
955endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400956
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200957xen = not_found
958if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
959 xencontrol = dependency('xencontrol', required: false,
960 method: 'pkg-config')
961 if xencontrol.found()
962 xen_pc = declare_dependency(version: xencontrol.version(),
963 dependencies: [
964 xencontrol,
965 # disabler: true makes xen_pc.found() return false if any is not found
966 dependency('xenstore', required: false,
967 method: 'pkg-config',
968 disabler: true),
969 dependency('xenforeignmemory', required: false,
970 method: 'pkg-config',
971 disabler: true),
972 dependency('xengnttab', required: false,
973 method: 'pkg-config',
974 disabler: true),
975 dependency('xenevtchn', required: false,
976 method: 'pkg-config',
977 disabler: true),
978 dependency('xendevicemodel', required: false,
979 method: 'pkg-config',
980 disabler: true),
981 # optional, no "disabler: true"
982 dependency('xentoolcore', required: false,
983 method: 'pkg-config')])
984 if xen_pc.found()
985 xen = xen_pc
986 endif
987 endif
988 if not xen.found()
989 xen_tests = [ '4.11.0', '4.10.0', '4.9.0', '4.8.0', '4.7.1' ]
990 xen_libs = {
991 '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
992 '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
993 '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
994 '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
995 '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
996 }
997 xen_deps = {}
998 foreach ver: xen_tests
999 # cache the various library tests to avoid polluting the logs
1000 xen_test_deps = []
1001 foreach l: xen_libs[ver]
1002 if l not in xen_deps
1003 xen_deps += { l: cc.find_library(l, required: false) }
1004 endif
1005 xen_test_deps += xen_deps[l]
1006 endforeach
1007
1008 # Use -D to pick just one of the test programs in scripts/xen-detect.c
1009 xen_version = ver.split('.')
1010 xen_ctrl_version = xen_version[0] + \
1011 ('0' + xen_version[1]).substring(-2) + \
1012 ('0' + xen_version[2]).substring(-2)
1013 if cc.links(files('scripts/xen-detect.c'),
1014 args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
1015 dependencies: xen_test_deps)
1016 xen = declare_dependency(version: ver, dependencies: xen_test_deps)
1017 break
1018 endif
1019 endforeach
1020 endif
1021 if xen.found()
1022 accelerators += 'CONFIG_XEN'
1023 elif get_option('xen').enabled()
1024 error('could not compile and link Xen test program')
1025 endif
1026endif
1027have_xen_pci_passthrough = get_option('xen_pci_passthrough') \
1028 .require(xen.found(),
1029 error_message: 'Xen PCI passthrough requested but Xen not enabled') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001030 .require(host_os == 'linux',
Paolo Bonzini0f63d962023-09-08 12:08:53 +02001031 error_message: 'Xen PCI passthrough not available on this platform') \
1032 .require(cpu == 'x86' or cpu == 'x86_64',
1033 error_message: 'Xen PCI passthrough not available on this platform') \
1034 .allowed()
1035
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001036################
1037# Dependencies #
1038################
1039
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001040# When bumping glib minimum version, please check also whether to increase
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03001041# the _WIN32_WINNT setting in osdep.h according to the value from glib.
1042# You should also check if any of the glib.version() checks
1043# below can also be removed.
Thomas Huth0d8caac2024-04-18 12:10:50 +02001044glib_req_ver = '>=2.66.0'
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001045glib_pc = dependency('glib-2.0', version: glib_req_ver, required: true,
1046 method: 'pkg-config')
1047glib_cflags = []
Paolo Bonzini60027112022-10-20 14:53:10 +02001048if enable_modules
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001049 gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true,
1050 method: 'pkg-config')
Paolo Bonzini2c13c572023-08-30 12:20:53 +02001051elif get_option('plugins')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001052 gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true,
1053 method: 'pkg-config')
1054else
1055 gmodule = not_found
Emilio Cotae3feb2c2023-02-05 11:37:57 -05001056endif
Marc-André Lureau953d5a92020-12-15 12:03:19 +04001057
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001058# This workaround is required due to a bug in pkg-config file for glib as it
1059# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001060if host_os == 'windows' and get_option('prefer_static')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001061 glib_cflags += ['-DGLIB_STATIC_COMPILATION']
1062endif
1063
1064# Sanity check that the current size_t matches the
1065# size that glib thinks it should be. This catches
1066# problems on multi-arch where people try to build
1067# 32-bit QEMU while pointing at 64-bit glib headers
1068
1069if not cc.compiles('''
1070 #include <glib.h>
1071 #include <unistd.h>
1072
1073 #define QEMU_BUILD_BUG_ON(x) \
1074 typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
1075
1076 int main(void) {
1077 QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
1078 return 0;
1079 }''', dependencies: glib_pc, args: glib_cflags)
1080 error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T.
1081 You probably need to set PKG_CONFIG_LIBDIR" to point
1082 to the right pkg-config files for your build target.''')
1083endif
1084
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001085glib = declare_dependency(dependencies: [glib_pc, gmodule],
1086 compile_args: glib_cflags,
1087 version: glib_pc.version())
1088
1089# Check whether glib has gslice, which we have to avoid for correctness.
1090# TODO: remove this check and the corresponding workaround (qtree) when
1091# the minimum supported glib is >= 2.75.3
1092glib_has_gslice = glib.version().version_compare('<2.75.3')
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03001093# Check whether glib has the aligned_alloc family of functions.
1094# <https://docs.gtk.org/glib/func.aligned_alloc.html>
1095glib_has_aligned_alloc = glib.version().version_compare('>=2.72.0')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001096
1097# override glib dep to include the above refinements
1098meson.override_dependency('glib-2.0', glib)
1099
1100# The path to glib.h is added to all compilation commands.
1101add_project_dependencies(glib.partial_dependency(compile_args: true, includes: true),
1102 native: false, language: all_languages)
1103
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001104gio = not_found
Paolo Bonzini75440602022-04-20 17:33:44 +02001105gdbus_codegen = not_found
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02001106gdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
Paolo Bonzini75440602022-04-20 17:33:44 +02001107if not get_option('gio').auto() or have_system
1108 gio = dependency('gio-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001109 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +02001110 if gio.found() and not cc.links('''
1111 #include <gio/gio.h>
1112 int main(void)
1113 {
1114 g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
1115 return 0;
1116 }''', dependencies: [glib, gio])
1117 if get_option('gio').enabled()
1118 error('The installed libgio is broken for static linking')
1119 endif
1120 gio = not_found
1121 endif
1122 if gio.found()
Marc-André Lureauc118c8e2024-10-08 16:50:22 +04001123 gdbus_codegen = find_program('gdbus-codegen',
Paolo Bonzini75440602022-04-20 17:33:44 +02001124 required: get_option('gio'))
1125 gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001126 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +02001127 gio = declare_dependency(dependencies: [gio, gio_unix],
1128 version: gio.version())
1129 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001130endif
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02001131if gdbus_codegen.found() and get_option('cfi')
1132 gdbus_codegen = not_found
1133 gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity'
1134endif
Paolo Bonzini75440602022-04-20 17:33:44 +02001135
Marc-André Lureau6cc5a612023-06-06 15:56:42 +04001136xml_pp = find_program('scripts/xml-preprocess.py')
1137
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001138lttng = not_found
Paolo Bonzini9c29b742021-10-07 15:08:14 +02001139if 'ust' in get_option('trace_backends')
Marc-André Lureaue32aaa52022-03-28 12:47:13 +04001140 lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001141 method: 'pkg-config')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001142endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001143pixman = not_found
Marc-André Lureaucca15752023-08-30 13:38:25 +04001144if not get_option('pixman').auto() or have_system or have_tools
1145 pixman = dependency('pixman-1', required: get_option('pixman'), version:'>=0.21.8',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001146 method: 'pkg-config')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001147endif
Marc-André Lureaucca15752023-08-30 13:38:25 +04001148
Paolo Bonzini063d5112022-07-14 14:56:58 +02001149zlib = dependency('zlib', required: true)
Paolo Bonzini53c22b62021-06-03 11:31:35 +02001150
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001151libaio = not_found
1152if not get_option('linux_aio').auto() or have_block
1153 libaio = cc.find_library('aio', has_headers: ['libaio.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001154 required: get_option('linux_aio'))
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001155endif
Leonardo Bras354081d2022-05-13 03:28:30 -03001156
1157linux_io_uring_test = '''
1158 #include <liburing.h>
1159 #include <linux/errqueue.h>
1160
1161 int main(void) { return 0; }'''
1162
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001163linux_io_uring = not_found
Paolo Bonzini53c22b62021-06-03 11:31:35 +02001164if not get_option('linux_io_uring').auto() or have_block
Daniel P. Berrangéa41b4fd2022-01-05 13:49:38 +00001165 linux_io_uring = dependency('liburing', version: '>=0.3',
1166 required: get_option('linux_io_uring'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001167 method: 'pkg-config')
Leonardo Bras354081d2022-05-13 03:28:30 -03001168 if not cc.links(linux_io_uring_test)
1169 linux_io_uring = not_found
1170 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001171endif
Leonardo Bras354081d2022-05-13 03:28:30 -03001172
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001173libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +01001174if not get_option('libnfs').auto() or have_block
Thomas Huthe2d98f22024-12-18 07:21:59 +01001175 libnfs = dependency('libnfs', version: ['>=1.9.3', '<6.0.0'],
Paolo Bonzini30045c02020-11-17 13:11:25 +01001176 required: get_option('libnfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001177 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001178endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001179
1180libattr_test = '''
1181 #include <stddef.h>
1182 #include <sys/types.h>
1183 #ifdef CONFIG_LIBATTR
1184 #include <attr/xattr.h>
1185 #else
1186 #include <sys/xattr.h>
1187 #endif
1188 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
1189
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001190libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001191have_old_libattr = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001192if get_option('attr').allowed()
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001193 if cc.links(libattr_test)
1194 libattr = declare_dependency()
1195 else
1196 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001197 required: get_option('attr'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001198 if libattr.found() and not \
1199 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
1200 libattr = not_found
1201 if get_option('attr').enabled()
1202 error('could not link libattr')
1203 else
1204 warning('could not link libattr, disabling')
1205 endif
1206 else
1207 have_old_libattr = libattr.found()
1208 endif
1209 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001210endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001211
Akihiko Odakid2277f02024-07-15 14:25:44 +09001212cocoa = dependency('appleframeworks',
1213 modules: ['Cocoa', 'CoreVideo', 'QuartzCore'],
Akihiko Odaki52eaefd2022-07-02 23:25:19 +09001214 required: get_option('cocoa'))
Paolo Bonzinic1ec4942021-01-07 14:04:00 +01001215
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03001216vmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet'))
1217if vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h',
1218 'VMNET_BRIDGED_MODE',
1219 dependencies: vmnet)
1220 vmnet = not_found
1221 if get_option('vmnet').enabled()
1222 error('vmnet.framework API is outdated')
1223 else
1224 warning('vmnet.framework API is outdated, disabling')
1225 endif
1226endif
1227
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001228seccomp = not_found
Michal Privoznik73422d92022-10-26 09:30:24 +02001229seccomp_has_sysrawrc = false
Paolo Bonzini90835c22020-11-17 14:22:24 +01001230if not get_option('seccomp').auto() or have_system or have_tools
1231 seccomp = dependency('libseccomp', version: '>=2.3.0',
1232 required: get_option('seccomp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001233 method: 'pkg-config')
Michal Privoznik73422d92022-10-26 09:30:24 +02001234 if seccomp.found()
1235 seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h',
1236 'SCMP_FLTATR_API_SYSRAWRC',
1237 dependencies: seccomp)
1238 endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001239endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001240
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001241libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001242if not get_option('cap_ng').auto() or have_system or have_tools
1243 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001244 required: get_option('cap_ng'))
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001245endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001246if libcap_ng.found() and not cc.links('''
1247 #include <cap-ng.h>
1248 int main(void)
1249 {
1250 capng_capability_to_name(CAPNG_EFFECTIVE);
1251 return 0;
1252 }''', dependencies: libcap_ng)
1253 libcap_ng = not_found
1254 if get_option('cap_ng').enabled()
1255 error('could not link libcap-ng')
1256 else
1257 warning('could not link libcap-ng, disabling')
1258 endif
1259endif
1260
Paolo Bonzini1917ec62020-08-26 03:24:11 -04001261if get_option('xkbcommon').auto() and not have_system and not have_tools
1262 xkbcommon = not_found
1263else
1264 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001265 method: 'pkg-config')
Marc-André Lureauade60d42019-07-15 14:48:31 +04001266endif
Paolo Bonzinie1723992021-10-07 15:08:21 +02001267
Thomas Huth58902582022-04-08 18:20:47 +02001268slirp = not_found
1269if not get_option('slirp').auto() or have_system
1270 slirp = dependency('slirp', required: get_option('slirp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001271 method: 'pkg-config')
Thomas Huth58902582022-04-08 18:20:47 +02001272 # slirp < 4.7 is incompatible with CFI support in QEMU. This is because
1273 # it passes function pointers within libslirp as callbacks for timers.
1274 # When using a system-wide shared libslirp, the type information for the
1275 # callback is missing and the timer call produces a false positive with CFI.
1276 # Do not use the "version" keyword argument to produce a better error.
1277 # with control-flow integrity.
1278 if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7')
1279 if get_option('slirp').enabled()
1280 error('Control-Flow Integrity requires libslirp 4.7.')
1281 else
1282 warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.')
1283 slirp = not_found
1284 endif
1285 endif
1286endif
1287
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001288vde = not_found
Paolo Bonzinie1723992021-10-07 15:08:21 +02001289if not get_option('vde').auto() or have_system or have_tools
1290 vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001291 required: get_option('vde'))
Paolo Bonzinie1723992021-10-07 15:08:21 +02001292endif
1293if vde.found() and not cc.links('''
1294 #include <libvdeplug.h>
1295 int main(void)
1296 {
1297 struct vde_open_args a = {0, 0, 0};
1298 char s[] = "";
1299 vde_open(s, s, &a);
1300 return 0;
1301 }''', dependencies: vde)
1302 vde = not_found
1303 if get_option('cap_ng').enabled()
1304 error('could not link libvdeplug')
1305 else
1306 warning('could not link libvdeplug, disabling')
1307 endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001308endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001309
Paolo Bonzini478e9432020-08-17 12:47:55 +02001310pulse = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001311if not get_option('pa').auto() or (host_os == 'linux' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001312 pulse = dependency('libpulse', required: get_option('pa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001313 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001314endif
1315alsa = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001316if not get_option('alsa').auto() or (host_os == 'linux' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001317 alsa = dependency('alsa', required: get_option('alsa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001318 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001319endif
1320jack = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001321if not get_option('jack').auto() or have_system
1322 jack = dependency('jack', required: get_option('jack'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001323 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001324endif
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001325pipewire = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001326if not get_option('pipewire').auto() or (host_os == 'linux' and have_system)
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001327 pipewire = dependency('libpipewire-0.3', version: '>=0.3.60',
1328 required: get_option('pipewire'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001329 method: 'pkg-config')
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001330endif
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001331sndio = not_found
1332if not get_option('sndio').auto() or have_system
1333 sndio = dependency('sndio', required: get_option('sndio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001334 method: 'pkg-config')
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001335endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001336
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001337spice_protocol = not_found
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001338if not get_option('spice_protocol').auto() or have_system
Markus Armbruster5c167b52023-01-09 20:03:07 +01001339 spice_protocol = dependency('spice-protocol', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001340 required: get_option('spice_protocol'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001341 method: 'pkg-config')
Paolo Bonzini26347332019-07-29 15:40:07 +02001342endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001343spice = not_found
Marc-André Lureauc98791e2023-08-30 13:38:35 +04001344if get_option('spice') \
1345 .disable_auto_if(not have_system) \
1346 .require(pixman.found(),
1347 error_message: 'cannot enable SPICE if pixman is not available') \
1348 .allowed()
Markus Armbruster34d55722023-01-09 20:03:09 +01001349 spice = dependency('spice-server', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001350 required: get_option('spice'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001351 method: 'pkg-config')
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001352endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001353spice_headers = spice.partial_dependency(compile_args: true, includes: true)
1354
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04001355rt = cc.find_library('rt', required: false)
Paolo Bonzinia399f912021-11-15 14:29:13 +00001356
Paolo Bonzini99650b62019-06-10 12:21:14 +02001357libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001358if not get_option('libiscsi').auto() or have_block
1359 libiscsi = dependency('libiscsi', version: '>=1.9.0',
1360 required: get_option('libiscsi'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001361 method: 'pkg-config')
Paolo Bonzini99650b62019-06-10 12:21:14 +02001362endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001363zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +01001364if not get_option('zstd').auto() or have_block
1365 zstd = dependency('libzstd', version: '>=1.4.0',
1366 required: get_option('zstd'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001367 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001368endif
Yuan Liub844a2c2024-06-10 18:21:06 +08001369qpl = not_found
1370if not get_option('qpl').auto() or have_system
1371 qpl = dependency('qpl', version: '>=1.5.0',
1372 required: get_option('qpl'),
1373 method: 'pkg-config')
1374endif
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01001375uadk = not_found
1376if not get_option('uadk').auto() or have_system
1377 libwd = dependency('libwd', version: '>=2.6',
1378 required: get_option('uadk'),
1379 method: 'pkg-config')
1380 libwd_comp = dependency('libwd_comp', version: '>=2.6',
1381 required: get_option('uadk'),
1382 method: 'pkg-config')
1383 if libwd.found() and libwd_comp.found()
1384 uadk = declare_dependency(dependencies: [libwd, libwd_comp])
1385 endif
1386endif
Bryan Zhange28ed312024-08-30 16:27:19 -07001387
1388qatzip = not_found
1389if not get_option('qatzip').auto() or have_system
1390 qatzip = dependency('qatzip', version: '>=1.1.2',
1391 required: get_option('qatzip'),
1392 method: 'pkg-config')
1393endif
1394
Marc-André Lureauea458962019-07-12 22:23:46 +04001395virgl = not_found
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001396
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001397have_vhost_user_gpu = have_tools and host_os == 'linux' and pixman.found()
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001398if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
Paolo Bonzini587d59d2021-06-03 11:31:35 +02001399 virgl = dependency('virglrenderer',
1400 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001401 required: get_option('virglrenderer'))
Marc-André Lureauea458962019-07-12 22:23:46 +04001402endif
Gurchetan Singhcd9adbe2023-03-21 09:47:36 -07001403rutabaga = not_found
1404if not get_option('rutabaga_gfx').auto() or have_system or have_vhost_user_gpu
1405 rutabaga = dependency('rutabaga_gfx_ffi',
1406 method: 'pkg-config',
1407 required: get_option('rutabaga_gfx'))
1408endif
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001409blkio = not_found
1410if not get_option('blkio').auto() or have_block
1411 blkio = dependency('blkio',
1412 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001413 required: get_option('blkio'))
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001414endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001415curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001416if not get_option('curl').auto() or have_block
1417 curl = dependency('libcurl', version: '>=7.29.0',
1418 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001419 required: get_option('curl'))
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001420endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001421libudev = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001422if host_os == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001423 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +01001424 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001425 required: get_option('libudev'))
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001426endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001427
Paolo Bonzini5c530152020-10-15 06:09:27 -04001428mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001429mpathpersist = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001430if host_os == 'linux' and have_tools and get_option('mpath').allowed()
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001431 mpath_test_source = '''
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001432 #include <libudev.h>
1433 #include <mpath_persist.h>
1434 unsigned mpath_mx_alloc_len = 1024;
1435 int logsink;
1436 static struct config *multipath_conf;
1437 extern struct udev *udev;
1438 extern struct config *get_multipath_config(void);
1439 extern void put_multipath_config(struct config *conf);
1440 struct udev *udev;
1441 struct config *get_multipath_config(void) { return multipath_conf; }
1442 void put_multipath_config(struct config *conf) { }
1443 int main(void) {
1444 udev = udev_new();
1445 multipath_conf = mpath_lib_init();
1446 return 0;
1447 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -04001448 libmpathpersist = cc.find_library('mpathpersist',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001449 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001450 if libmpathpersist.found()
1451 mpathlibs += libmpathpersist
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001452 if get_option('prefer_static')
Paolo Bonzini5c530152020-10-15 06:09:27 -04001453 mpathlibs += cc.find_library('devmapper',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001454 required: get_option('mpath'))
Paolo Bonzini43b43a42020-09-17 12:25:09 +02001455 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -04001456 mpathlibs += cc.find_library('multipath',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001457 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001458 foreach lib: mpathlibs
1459 if not lib.found()
1460 mpathlibs = []
1461 break
1462 endif
1463 endforeach
1464 if mpathlibs.length() == 0
1465 msg = 'Dependencies missing for libmpathpersist'
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001466 elif cc.links(mpath_test_source, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001467 mpathpersist = declare_dependency(dependencies: mpathlibs)
1468 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001469 msg = 'Cannot detect libmpathpersist API'
1470 endif
1471 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001472 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -04001473 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001474 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001475 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001476 endif
1477 endif
1478 endif
1479endif
1480
Yonggang Luo5285e592020-10-13 07:43:48 +08001481iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001482curses = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001483if have_system and get_option('curses').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001484 curses_test = '''
Brad Smithf8d31162024-10-11 23:38:55 -04001485 #ifdef __APPLE__
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001486 #define _XOPEN_SOURCE_EXTENDED 1
1487 #endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001488 #include <locale.h>
1489 #include <curses.h>
1490 #include <wchar.h>
1491 int main(void) {
1492 wchar_t wch = L'w';
1493 setlocale(LC_ALL, "");
1494 resize_term(0, 0);
1495 addwstr(L"wide chars\n");
1496 addnwstr(&wch, 1);
1497 add_wch(WACS_DEGREE);
1498 return 0;
1499 }'''
1500
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001501 curses_dep_list = host_os == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
Paolo Bonzini6d322632022-03-27 16:05:58 +02001502 curses = dependency(curses_dep_list,
1503 required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001504 method: 'pkg-config')
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001505 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001506 curses_compile_args = ['-DNCURSES_WIDECHAR=1']
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001507 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -05001508 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001509 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses],
1510 version: curses.version())
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001511 else
1512 msg = 'curses package not usable'
1513 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001514 endif
1515 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001516 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001517 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001518 if host_os != 'windows' and not has_curses_h
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001519 message('Trying with /usr/include/ncursesw')
1520 curses_compile_args += ['-I/usr/include/ncursesw']
1521 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
1522 endif
1523 if has_curses_h
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001524 curses_libname_list = (host_os == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001525 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +08001526 libcurses = cc.find_library(curses_libname,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001527 required: false)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001528 if libcurses.found()
1529 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
1530 curses = declare_dependency(compile_args: curses_compile_args,
1531 dependencies: [libcurses])
1532 break
1533 else
1534 msg = 'curses library not usable'
1535 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001536 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001537 endforeach
1538 endif
1539 endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001540 if get_option('iconv').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001541 foreach link_args : [ ['-liconv'], [] ]
1542 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
1543 # We need to use libiconv if available because mixing libiconv's headers with
1544 # the system libc does not work.
1545 # However, without adding glib to the dependencies -L/usr/local/lib will not be
1546 # included in the command line and libiconv will not be found.
1547 if cc.links('''
1548 #include <iconv.h>
1549 int main(void) {
1550 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
1551 return conv != (iconv_t) -1;
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001552 }''', args: link_args, dependencies: glib)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001553 iconv = declare_dependency(link_args: link_args, dependencies: glib)
1554 break
Yonggang Luo5285e592020-10-13 07:43:48 +08001555 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001556 endforeach
1557 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001558 if curses.found() and not iconv.found()
1559 if get_option('iconv').enabled()
1560 error('iconv not available')
1561 endif
1562 msg = 'iconv required for curses UI but not available'
1563 curses = not_found
1564 endif
1565 if not curses.found() and msg != ''
1566 if get_option('curses').enabled()
1567 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001568 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001569 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001570 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001571 endif
1572endif
1573
Paolo Bonzini26347332019-07-29 15:40:07 +02001574brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001575if not get_option('brlapi').auto() or have_system
1576 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001577 required: get_option('brlapi'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001578 if brlapi.found() and not cc.links('''
1579 #include <brlapi.h>
1580 #include <stddef.h>
1581 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
1582 brlapi = not_found
1583 if get_option('brlapi').enabled()
1584 error('could not link brlapi')
1585 else
1586 warning('could not link brlapi, disabling')
1587 endif
1588 endif
Paolo Bonzini26347332019-07-29 15:40:07 +02001589endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001590
Paolo Bonzini760e4322020-08-26 08:09:48 +02001591sdl = not_found
Akihiko Odaki64d3fec2022-08-19 22:27:56 +09001592if not get_option('sdl').auto() or have_system
Paolo Bonzini063d5112022-07-14 14:56:58 +02001593 sdl = dependency('sdl2', required: get_option('sdl'))
Paolo Bonzini760e4322020-08-26 08:09:48 +02001594 sdl_image = not_found
1595endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001596if sdl.found()
Thomas Huth6da5f222023-06-05 13:45:23 +02001597 # Some versions of SDL have problems with -Wundef
1598 if not cc.compiles('''
1599 #include <SDL.h>
1600 #include <SDL_syswm.h>
1601 int main(int argc, char *argv[]) { return 0; }
1602 ''', dependencies: sdl, args: '-Werror=undef')
1603 sdl = declare_dependency(compile_args: '-Wno-undef',
1604 dependencies: sdl,
1605 version: sdl.version())
1606 endif
Volker Rümelin7161a432020-08-29 12:41:58 +02001607 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001608 method: 'pkg-config')
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001609else
1610 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +01001611 error('sdl-image required, but SDL was @0@'.format(
1612 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001613 endif
1614 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +02001615endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001616
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001617rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001618if not get_option('rbd').auto() or have_block
Paolo Bonzini063d5112022-07-14 14:56:58 +02001619 librados = cc.find_library('rados', required: get_option('rbd'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001620 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001621 required: get_option('rbd'))
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001622 if librados.found() and librbd.found()
1623 if cc.links('''
1624 #include <stdio.h>
1625 #include <rbd/librbd.h>
1626 int main(void) {
1627 rados_t cluster;
1628 rados_create(&cluster, NULL);
Peter Lieven48672ac2021-07-02 19:23:51 +02001629 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
1630 #error
1631 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001632 return 0;
1633 }''', dependencies: [librbd, librados])
1634 rbd = declare_dependency(dependencies: [librbd, librados])
1635 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +02001636 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001637 else
Peter Lieven48672ac2021-07-02 19:23:51 +02001638 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001639 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001640 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001641endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001642
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001643glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001644glusterfs_ftruncate_has_stat = false
1645glusterfs_iocb_has_stat = false
1646if not get_option('glusterfs').auto() or have_block
1647 glusterfs = dependency('glusterfs-api', version: '>=3',
1648 required: get_option('glusterfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001649 method: 'pkg-config')
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001650 if glusterfs.found()
1651 glusterfs_ftruncate_has_stat = cc.links('''
1652 #include <glusterfs/api/glfs.h>
1653
1654 int
1655 main(void)
1656 {
1657 /* new glfs_ftruncate() passes two additional args */
1658 return glfs_ftruncate(NULL, 0, NULL, NULL);
1659 }
1660 ''', dependencies: glusterfs)
1661 glusterfs_iocb_has_stat = cc.links('''
1662 #include <glusterfs/api/glfs.h>
1663
1664 /* new glfs_io_cbk() passes two additional glfs_stat structs */
1665 static void
1666 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
1667 {}
1668
1669 int
1670 main(void)
1671 {
1672 glfs_io_cbk iocb = &glusterfs_iocb;
1673 iocb(NULL, 0 , NULL, NULL, NULL);
1674 return 0;
1675 }
1676 ''', dependencies: glusterfs)
1677 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001678endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001679
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02001680hv_balloon = false
1681if get_option('hv_balloon').allowed() and have_system
1682 if cc.links('''
1683 #include <string.h>
1684 #include <gmodule.h>
1685 int main(void) {
1686 GTree *tree;
1687
1688 tree = g_tree_new((GCompareFunc)strcmp);
1689 (void)g_tree_node_first(tree);
1690 g_tree_destroy(tree);
1691 return 0;
1692 }
1693 ''', dependencies: glib)
1694 hv_balloon = true
1695 else
1696 if get_option('hv_balloon').enabled()
1697 error('could not enable hv-balloon, update your glib')
1698 else
1699 warning('could not find glib support for hv-balloon, disabling')
1700 endif
1701 endif
1702endif
1703
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001704libssh = not_found
Thomas Huthe6a52b32021-12-09 15:48:01 +01001705if not get_option('libssh').auto() or have_block
1706 libssh = dependency('libssh', version: '>=0.8.7',
1707 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001708 required: get_option('libssh'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001709endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001710
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001711libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001712if not get_option('bzip2').auto() or have_block
1713 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001714 required: get_option('bzip2'))
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001715 if libbzip2.found() and not cc.links('''
1716 #include <bzlib.h>
1717 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
1718 libbzip2 = not_found
1719 if get_option('bzip2').enabled()
1720 error('could not link libbzip2')
1721 else
1722 warning('could not link libbzip2, disabling')
1723 endif
1724 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001725endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001726
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001727liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +01001728if not get_option('lzfse').auto() or have_block
1729 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001730 required: get_option('lzfse'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001731endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001732if liblzfse.found() and not cc.links('''
1733 #include <lzfse.h>
1734 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
1735 liblzfse = not_found
1736 if get_option('lzfse').enabled()
1737 error('could not link liblzfse')
1738 else
1739 warning('could not link liblzfse, disabling')
1740 endif
1741endif
1742
Paolo Bonzini478e9432020-08-17 12:47:55 +02001743oss = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001744if get_option('oss').allowed() and have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02001745 if not cc.has_header('sys/soundcard.h')
1746 # not found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001747 elif host_os == 'netbsd'
Paolo Bonzini063d5112022-07-14 14:56:58 +02001748 oss = cc.find_library('ossaudio', required: get_option('oss'))
Paolo Bonzini87430d52021-10-07 15:06:09 +02001749 else
1750 oss = declare_dependency()
1751 endif
1752
1753 if not oss.found()
1754 if get_option('oss').enabled()
1755 error('OSS not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001756 endif
1757 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001758endif
1759dsound = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001760if not get_option('dsound').auto() or (host_os == 'windows' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001761 if cc.has_header('dsound.h')
1762 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1763 endif
1764
1765 if not dsound.found()
1766 if get_option('dsound').enabled()
1767 error('DirectSound not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001768 endif
1769 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001770endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001771
Paolo Bonzini478e9432020-08-17 12:47:55 +02001772coreaudio = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001773if not get_option('coreaudio').auto() or (host_os == 'darwin' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001774 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
1775 required: get_option('coreaudio'))
Paolo Bonzini478e9432020-08-17 12:47:55 +02001776endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001777
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001778opengl = not_found
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001779if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
1780 epoxy = dependency('epoxy', method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001781 required: get_option('opengl'))
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001782 if cc.has_header('epoxy/egl.h', dependencies: epoxy)
1783 opengl = epoxy
1784 elif get_option('opengl').enabled()
1785 error('epoxy/egl.h not found')
1786 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001787endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001788gbm = not_found
1789if (have_system or have_tools) and (virgl.found() or opengl.found())
Paolo Bonzini063d5112022-07-14 14:56:58 +02001790 gbm = dependency('gbm', method: 'pkg-config', required: false)
Thomas Huth8bc51842021-07-13 13:09:02 +02001791endif
Marc-André Lureauf0caba42022-06-28 17:23:15 +04001792have_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001793
Dorjoy Chowdhurybb154e32024-10-09 03:17:23 +06001794libcbor = not_found
1795if not get_option('libcbor').auto() or have_system
1796 libcbor = dependency('libcbor', version: '>=0.7.0',
1797 required: get_option('libcbor'))
1798endif
1799
Paolo Bonzini57612512021-06-03 11:15:26 +02001800gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001801gnutls_crypto = not_found
Alyssa Rossabc14fd2021-08-06 14:49:47 +00001802if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001803 # For general TLS support our min gnutls matches
1804 # that implied by our platform support matrix
1805 #
1806 # For the crypto backends, we look for a newer
1807 # gnutls:
1808 #
1809 # Version 3.6.8 is needed to get XTS
1810 # Version 3.6.13 is needed to get PBKDF
1811 # Version 3.6.14 is needed to get HW accelerated XTS
1812 #
1813 # If newer enough gnutls isn't available, we can
1814 # still use a different crypto backend to satisfy
1815 # the platform support requirements
1816 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1817 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001818 required: false)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001819 if gnutls_crypto.found()
1820 gnutls = gnutls_crypto
1821 else
1822 # Our min version if all we need is TLS
1823 gnutls = dependency('gnutls', version: '>=3.5.18',
1824 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001825 required: get_option('gnutls'))
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001826 endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001827endif
1828
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001829# We prefer use of gnutls for crypto, unless the options
1830# explicitly asked for nettle or gcrypt.
1831#
1832# If gnutls isn't available for crypto, then we'll prefer
1833# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +02001834gcrypt = not_found
1835nettle = not_found
Lei He4c5e5122022-05-25 17:01:14 +08001836hogweed = not_found
Hyman Huang52ed9f42023-12-07 23:47:35 +08001837crypto_sm4 = not_found
liequan ched078da82024-10-30 08:51:46 +00001838crypto_sm3 = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +01001839xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001840
Paolo Bonzini57612512021-06-03 11:15:26 +02001841if get_option('nettle').enabled() and get_option('gcrypt').enabled()
1842 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +02001843endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001844
1845# Explicit nettle/gcrypt request, so ignore gnutls for crypto
1846if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001847 gnutls_crypto = not_found
1848endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001849
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001850if not gnutls_crypto.found()
1851 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
1852 gcrypt = dependency('libgcrypt', version: '>=1.8',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001853 required: get_option('gcrypt'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001854 # Debian has removed -lgpg-error from libgcrypt-config
1855 # as it "spreads unnecessary dependencies" which in
1856 # turn breaks static builds...
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001857 if gcrypt.found() and get_option('prefer_static')
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001858 gcrypt = declare_dependency(dependencies:
1859 [gcrypt,
1860 cc.find_library('gpg-error', required: true)],
1861 version: gcrypt.version())
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001862 endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08001863 crypto_sm4 = gcrypt
1864 # SM4 ALG is available in libgcrypt >= 1.9
1865 if gcrypt.found() and not cc.links('''
1866 #include <gcrypt.h>
1867 int main(void) {
1868 gcry_cipher_hd_t handler;
1869 gcry_cipher_open(&handler, GCRY_CIPHER_SM4, GCRY_CIPHER_MODE_ECB, 0);
1870 return 0;
1871 }''', dependencies: gcrypt)
1872 crypto_sm4 = not_found
1873 endif
liequan ched078da82024-10-30 08:51:46 +00001874 crypto_sm3 = gcrypt
1875 # SM3 ALG is available in libgcrypt >= 1.9
1876 if gcrypt.found() and not cc.links('''
1877 #include <gcrypt.h>
1878 int main(void) {
1879 gcry_md_hd_t handler;
1880 gcry_md_open(&handler, GCRY_MD_SM3, 0);
1881 return 0;
1882 }''', dependencies: gcrypt)
1883 crypto_sm3 = not_found
1884 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001885 endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001886 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1887 nettle = dependency('nettle', version: '>=3.4',
1888 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001889 required: get_option('nettle'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001890 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1891 xts = 'private'
1892 endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08001893 crypto_sm4 = nettle
1894 # SM4 ALG is available in nettle >= 3.9
1895 if nettle.found() and not cc.links('''
1896 #include <nettle/sm4.h>
1897 int main(void) {
1898 struct sm4_ctx ctx;
1899 unsigned char key[16] = {0};
1900 sm4_set_encrypt_key(&ctx, key);
1901 return 0;
1902 }''', dependencies: nettle)
1903 crypto_sm4 = not_found
1904 endif
liequan ched078da82024-10-30 08:51:46 +00001905 crypto_sm3 = nettle
1906 # SM3 ALG is available in nettle >= 3.8
1907 if nettle.found() and not cc.links('''
1908 #include <nettle/sm3.h>
1909 #include <nettle/hmac.h>
1910 int main(void) {
1911 struct sm3_ctx ctx;
1912 struct hmac_sm3_ctx hmac_ctx;
1913 unsigned char data[64] = {0};
1914 unsigned char output[32];
1915
1916 // SM3 hash function test
1917 sm3_init(&ctx);
1918 sm3_update(&ctx, 64, data);
1919 sm3_digest(&ctx, 32, data);
1920
1921 // HMAC-SM3 test
1922 hmac_sm3_set_key(&hmac_ctx, 32, data);
1923 hmac_sm3_update(&hmac_ctx, 64, data);
1924 hmac_sm3_digest(&hmac_ctx, 32, output);
1925
1926 return 0;
1927 }''', dependencies: nettle)
1928 crypto_sm3 = not_found
1929 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001930 endif
1931endif
1932
Paolo Bonzinia775c712023-09-08 12:09:22 +02001933capstone = not_found
1934if not get_option('capstone').auto() or have_system or have_user
1935 capstone = dependency('capstone', version: '>=3.0.5',
1936 method: 'pkg-config',
1937 required: get_option('capstone'))
1938
1939 # Some versions of capstone have broken pkg-config file
1940 # that reports a wrong -I path, causing the #include to
1941 # fail later. If the system has such a broken version
1942 # do not use it.
1943 if capstone.found() and not cc.compiles('#include <capstone.h>',
1944 dependencies: [capstone])
1945 capstone = not_found
1946 if get_option('capstone').enabled()
1947 error('capstone requested, but it does not appear to work')
1948 endif
1949 endif
1950endif
1951
Paolo Bonzini063d5112022-07-14 14:56:58 +02001952gmp = dependency('gmp', required: false, method: 'pkg-config')
Lei He4c5e5122022-05-25 17:01:14 +08001953if nettle.found() and gmp.found()
1954 hogweed = dependency('hogweed', version: '>=3.4',
1955 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001956 required: get_option('nettle'))
Lei He4c5e5122022-05-25 17:01:14 +08001957endif
1958
1959
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001960gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +01001961gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001962vte = not_found
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001963have_gtk_clipboard = get_option('gtk_clipboard').enabled()
1964
Marc-André Lureauda554e12023-08-30 13:38:36 +04001965if get_option('gtk') \
1966 .disable_auto_if(not have_system) \
1967 .require(pixman.found(),
1968 error_message: 'cannot enable GTK if pixman is not available') \
1969 .allowed()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001970 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1971 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001972 required: get_option('gtk'))
Paolo Bonzini1b695472021-01-07 14:02:29 +01001973 if gtk.found()
1974 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1975 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001976 required: false)
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001977 gtk = declare_dependency(dependencies: [gtk, gtkx11],
1978 version: gtk.version())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001979
1980 if not get_option('vte').auto() or have_system
1981 vte = dependency('vte-2.91',
1982 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001983 required: get_option('vte'))
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001984 endif
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001985 elif have_gtk_clipboard
1986 error('GTK clipboard requested, but GTK not found')
Paolo Bonzini1b695472021-01-07 14:02:29 +01001987 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001988endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001989
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001990x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +02001991if gtkx11.found()
Paolo Bonzini063d5112022-07-14 14:56:58 +02001992 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001993endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001994png = not_found
Kshitij Suri95f85102022-04-08 07:13:34 +00001995if get_option('png').allowed() and have_system
Thomas Huth1ec8c2c2022-06-23 19:49:41 +02001996 png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001997 method: 'pkg-config')
Kshitij Suri95f85102022-04-08 07:13:34 +00001998endif
1999vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04002000jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04002001sasl = not_found
Marc-André Lureau89fd3ea2023-08-30 13:38:34 +04002002if get_option('vnc') \
2003 .disable_auto_if(not have_system) \
2004 .require(pixman.found(),
2005 error_message: 'cannot enable VNC if pixman is not available') \
2006 .allowed()
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002007 vnc = declare_dependency() # dummy dependency
Paolo Bonzini8e242b32020-11-23 13:34:02 -05002008 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002009 method: 'pkg-config')
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002010 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002011 required: get_option('vnc_sasl'))
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002012 if sasl.found()
2013 sasl = declare_dependency(dependencies: sasl,
2014 compile_args: '-DSTRUCT_IOVEC_DEFINED')
2015 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04002016endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01002017
Paolo Bonzini05e391a2021-06-03 11:15:26 +02002018pam = not_found
2019if not get_option('auth_pam').auto() or have_system
2020 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002021 required: get_option('auth_pam'))
Paolo Bonzini05e391a2021-06-03 11:15:26 +02002022endif
2023if pam.found() and not cc.links('''
2024 #include <stddef.h>
2025 #include <security/pam_appl.h>
2026 int main(void) {
2027 const char *service_name = "qemu";
2028 const char *user = "frank";
2029 const struct pam_conv pam_conv = { 0 };
2030 pam_handle_t *pamh = NULL;
2031 pam_start(service_name, user, &pam_conv, &pamh);
2032 return 0;
2033 }''', dependencies: pam)
2034 pam = not_found
2035 if get_option('auth_pam').enabled()
2036 error('could not link libpam')
2037 else
2038 warning('could not link libpam, disabling')
2039 endif
2040endif
2041
Marc-André Lureau708eab42019-09-03 16:59:33 +04002042snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +01002043if not get_option('snappy').auto() or have_system
2044 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002045 required: get_option('snappy'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04002046endif
Thomas Huth785abf02023-07-06 08:47:36 +02002047if snappy.found() and not cc.links('''
Paolo Bonzini241611e2020-11-17 13:32:34 +01002048 #include <snappy-c.h>
2049 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
2050 snappy = not_found
2051 if get_option('snappy').enabled()
2052 error('could not link libsnappy')
2053 else
2054 warning('could not link libsnappy, disabling')
2055 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +04002056endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002057
Marc-André Lureau708eab42019-09-03 16:59:33 +04002058lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002059if not get_option('lzo').auto() or have_system
2060 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002061 required: get_option('lzo'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04002062endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002063if lzo.found() and not cc.links('''
2064 #include <lzo/lzo1x.h>
2065 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
2066 lzo = not_found
2067 if get_option('lzo').enabled()
2068 error('could not link liblzo2')
2069 else
2070 warning('could not link liblzo2, disabling')
2071 endif
2072endif
2073
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002074numa = not_found
2075if not get_option('numa').auto() or have_system or have_tools
2076 numa = cc.find_library('numa', has_headers: ['numa.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002077 required: get_option('numa'))
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002078endif
2079if numa.found() and not cc.links('''
2080 #include <numa.h>
2081 int main(void) { return numa_available(); }
2082 ''', dependencies: numa)
2083 numa = not_found
2084 if get_option('numa').enabled()
2085 error('could not link numa')
2086 else
2087 warning('could not link numa, disabling')
2088 endif
2089endif
2090
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01002091fdt = not_found
2092fdt_opt = get_option('fdt')
2093if fdt_opt == 'enabled' and get_option('wrap_mode') == 'nodownload'
2094 fdt_opt = 'system'
2095endif
2096if fdt_opt in ['enabled', 'system'] or (fdt_opt == 'auto' and have_system)
2097 fdt = cc.find_library('fdt', required: fdt_opt == 'system')
2098 if fdt.found() and cc.links('''
2099 #include <libfdt.h>
2100 #include <libfdt_env.h>
2101 int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
2102 dependencies: fdt)
2103 fdt_opt = 'system'
2104 elif fdt_opt != 'system'
2105 fdt_opt = get_option('wrap_mode') == 'nodownload' ? 'disabled' : 'internal'
2106 fdt = not_found
2107 else
2108 error('system libfdt is too old (1.5.1 or newer required)')
2109 endif
2110endif
2111if fdt_opt == 'internal'
2112 assert(not fdt.found())
2113 libfdt_proj = subproject('dtc', required: true,
2114 default_options: ['tools=false', 'yaml=disabled',
2115 'python=disabled', 'default_library=static'])
2116 fdt = libfdt_proj.get_variable('libfdt_dep')
2117endif
2118
Marc-André Lureau55166232019-07-24 19:16:22 +04002119rdma = not_found
Paolo Bonzini3730a732022-04-20 17:33:41 +02002120if not get_option('rdma').auto() or have_system
Paolo Bonzini3730a732022-04-20 17:33:41 +02002121 rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002122 required: get_option('rdma')),
zhenwei pi829858f2024-06-11 18:54:26 +08002123 cc.find_library('ibverbs', required: get_option('rdma'))]
Paolo Bonzini3730a732022-04-20 17:33:41 +02002124 rdma = declare_dependency(dependencies: rdma_libs)
2125 foreach lib: rdma_libs
2126 if not lib.found()
2127 rdma = not_found
2128 endif
2129 endforeach
Marc-André Lureau55166232019-07-24 19:16:22 +04002130endif
Paolo Bonzini3730a732022-04-20 17:33:41 +02002131
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002132cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02002133if not get_option('smartcard').auto() or have_system
2134 cacard = dependency('libcacard', required: get_option('smartcard'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002135 version: '>=2.5.1', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002136endif
César Belley0a40bcb2020-08-26 13:42:04 +02002137u2f = not_found
Paolo Bonzinie7c22ff2023-09-08 12:10:27 +02002138if not get_option('u2f').auto() or have_system
César Belley0a40bcb2020-08-26 13:42:04 +02002139 u2f = dependency('u2f-emu', required: get_option('u2f'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002140 method: 'pkg-config')
César Belley0a40bcb2020-08-26 13:42:04 +02002141endif
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002142canokey = not_found
Paolo Bonzinie7c22ff2023-09-08 12:10:27 +02002143if not get_option('canokey').auto() or have_system
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002144 canokey = dependency('canokey-qemu', required: get_option('canokey'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002145 method: 'pkg-config')
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002146endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002147usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02002148if not get_option('usb_redir').auto() or have_system
2149 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002150 version: '>=0.6', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002151endif
2152libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02002153if not get_option('libusb').auto() or have_system
2154 libusb = dependency('libusb-1.0', required: get_option('libusb'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002155 version: '>=1.0.13', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002156endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02002157
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002158libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02002159if not get_option('libpmem').auto() or have_system
2160 libpmem = dependency('libpmem', required: get_option('libpmem'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002161 method: 'pkg-config')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002162endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06002163libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02002164if not get_option('libdaxctl').auto() or have_system
2165 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002166 version: '>=57', method: 'pkg-config')
Bruce Rogersc7c91a72020-08-24 09:52:12 -06002167endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04002168tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02002169if gnutls.found()
2170 tasn1 = dependency('libtasn1',
Philippe Mathieu-Daudédc37d1c2024-05-02 11:56:42 +02002171 required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02002172 method: 'pkg-config')
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04002173endif
Max Fritz0db0fbb2023-05-22 02:12:02 +02002174keyutils = not_found
Thomas Huthc64023b2023-08-24 11:42:08 +02002175if not get_option('libkeyutils').auto() or have_block
2176 keyutils = dependency('libkeyutils', required: get_option('libkeyutils'),
2177 method: 'pkg-config')
Max Fritz0db0fbb2023-05-22 02:12:02 +02002178endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002179
Marc-André Lureau3909def2020-08-28 15:07:33 +04002180has_gettid = cc.has_function('gettid')
2181
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002182# libselinux
2183selinux = dependency('libselinux',
2184 required: get_option('selinux'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002185 method: 'pkg-config')
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002186
Paolo Bonziniaa087962020-09-01 11:15:30 -04002187# Malloc tests
2188
2189malloc = []
2190if get_option('malloc') == 'system'
2191 has_malloc_trim = \
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002192 get_option('malloc_trim').allowed() and \
Michal Privoznik09a49af2023-05-30 12:31:23 +02002193 cc.has_function('malloc_trim', prefix: '#include <malloc.h>')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002194else
2195 has_malloc_trim = false
2196 malloc = cc.find_library(get_option('malloc'), required: true)
2197endif
2198if not has_malloc_trim and get_option('malloc_trim').enabled()
2199 if get_option('malloc') == 'system'
2200 error('malloc_trim not available on this platform.')
2201 else
2202 error('malloc_trim not available with non-libc memory allocator')
2203 endif
2204endif
2205
Akihiko Odaki797150d2025-04-24 13:50:13 +09002206osdep_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01002207 #ifndef _GNU_SOURCE
2208 #define _GNU_SOURCE
2209 #endif
Akihiko Odaki797150d2025-04-24 13:50:13 +09002210
2211 #include <stddef.h>
2212 #include <sys/types.h>
2213
Akihiko Odakia5b30be2025-04-24 13:50:14 +09002214 #include <string.h>
Akihiko Odaki797150d2025-04-24 13:50:13 +09002215 #include <limits.h>
2216 /* Put unistd.h before time.h as that triggers localtime_r/gmtime_r
2217 * function availability on recentish Mingw-w64 platforms. */
2218 #include <unistd.h>
2219 #include <time.h>
2220 #include <errno.h>
2221 #include <fcntl.h>
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002222'''
Max Reitz84e319a2020-11-02 17:18:55 +01002223
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002224have_vhost_user_blk_server = get_option('vhost_user_blk_server') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002225 .require(host_os == 'linux',
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002226 error_message: 'vhost_user_blk_server requires linux') \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02002227 .require(have_vhost_user,
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002228 error_message: 'vhost_user_blk_server requires vhost-user support') \
Alex Bennée26ed5012022-05-24 16:40:42 +01002229 .disable_auto_if(not have_tools and not have_system) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002230 .allowed()
Daniele Buono9e62ba42020-12-04 18:06:14 -05002231
Max Reitzdf4ea702020-10-27 20:05:46 +01002232if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
2233 error('Cannot enable fuse-lseek while fuse is disabled')
2234endif
2235
Max Reitza484a712020-10-27 20:05:41 +01002236fuse = dependency('fuse3', required: get_option('fuse'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002237 version: '>=3.1', method: 'pkg-config')
Max Reitza484a712020-10-27 20:05:41 +01002238
Max Reitzdf4ea702020-10-27 20:05:46 +01002239fuse_lseek = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002240if get_option('fuse_lseek').allowed()
Max Reitzdf4ea702020-10-27 20:05:46 +01002241 if fuse.version().version_compare('>=3.8')
2242 # Dummy dependency
2243 fuse_lseek = declare_dependency()
2244 elif get_option('fuse_lseek').enabled()
2245 if fuse.found()
2246 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
2247 else
2248 error('fuse-lseek requires libfuse, which was not found')
2249 endif
2250 endif
2251endif
2252
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002253have_libvduse = (host_os == 'linux')
Xie Yongjia6caeee2022-05-23 16:46:08 +08002254if get_option('libvduse').enabled()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002255 if host_os != 'linux'
Xie Yongjia6caeee2022-05-23 16:46:08 +08002256 error('libvduse requires linux')
2257 endif
2258elif get_option('libvduse').disabled()
2259 have_libvduse = false
2260endif
2261
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002262have_vduse_blk_export = (have_libvduse and host_os == 'linux')
Xie Yongji2a2359b2022-05-23 16:46:09 +08002263if get_option('vduse_blk_export').enabled()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002264 if host_os != 'linux'
Xie Yongji2a2359b2022-05-23 16:46:09 +08002265 error('vduse_blk_export requires linux')
2266 elif not have_libvduse
2267 error('vduse_blk_export requires libvduse support')
2268 endif
2269elif get_option('vduse_blk_export').disabled()
2270 have_vduse_blk_export = false
2271endif
2272
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002273# libbpf
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002274bpf_version = '1.1.0'
2275libbpf = dependency('libbpf', version: '>=' + bpf_version, required: get_option('bpf'), method: 'pkg-config')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002276if libbpf.found() and not cc.links('''
2277 #include <bpf/libbpf.h>
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002278 #include <linux/bpf.h>
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002279 int main(void)
2280 {
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002281 // check flag availability
2282 int flag = BPF_F_MMAPABLE;
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002283 bpf_object__destroy_skeleton(NULL);
2284 return 0;
2285 }''', dependencies: libbpf)
2286 libbpf = not_found
2287 if get_option('bpf').enabled()
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002288 error('libbpf skeleton/mmaping test failed')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002289 else
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002290 warning('libbpf skeleton/mmaping test failed, disabling')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002291 endif
2292endif
2293
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002294# libxdp
2295libxdp = not_found
2296if not get_option('af_xdp').auto() or have_system
Daniel P. Berrangé1f372802024-10-23 09:50:56 +01002297 if libbpf.found()
2298 libxdp = dependency('libxdp', required: get_option('af_xdp'),
2299 version: '>=1.4.0', method: 'pkg-config')
2300 else
2301 if get_option('af_xdp').enabled()
2302 error('libxdp requested, but libbpf is not available')
2303 endif
2304 endif
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002305endif
2306
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002307# libdw
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002308libdw = not_found
Ilya Leoshkevich550c6d92023-02-10 01:52:08 +01002309if not get_option('libdw').auto() or \
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02002310 (not get_option('prefer_static') and (have_system or have_user))
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002311 libdw = dependency('libdw',
2312 method: 'pkg-config',
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002313 required: get_option('libdw'))
2314endif
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002315
Paolo Bonzini87430d52021-10-07 15:06:09 +02002316#################
2317# config-host.h #
2318#################
2319
Paolo Bonzini95933f12023-09-08 12:10:08 +02002320config_host_data = configuration_data()
2321
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03002322config_host_data.set('CONFIG_HAVE_RUST', have_rust)
Paolo Bonzini87430d52021-10-07 15:06:09 +02002323audio_drivers_selected = []
2324if have_system
2325 audio_drivers_available = {
2326 'alsa': alsa.found(),
2327 'coreaudio': coreaudio.found(),
2328 'dsound': dsound.found(),
2329 'jack': jack.found(),
2330 'oss': oss.found(),
2331 'pa': pulse.found(),
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02002332 'pipewire': pipewire.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002333 'sdl': sdl.found(),
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002334 'sndio': sndio.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002335 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02002336 foreach k, v: audio_drivers_available
2337 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
2338 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02002339
2340 # Default to native drivers first, OSS second, SDL third
2341 audio_drivers_priority = \
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002342 [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002343 (host_os == 'linux' ? [] : [ 'sdl' ])
Paolo Bonzini87430d52021-10-07 15:06:09 +02002344 audio_drivers_default = []
2345 foreach k: audio_drivers_priority
2346 if audio_drivers_available[k]
2347 audio_drivers_default += k
2348 endif
2349 endforeach
2350
2351 foreach k: get_option('audio_drv_list')
2352 if k == 'default'
2353 audio_drivers_selected += audio_drivers_default
2354 elif not audio_drivers_available[k]
2355 error('Audio driver "@0@" not available.'.format(k))
2356 else
2357 audio_drivers_selected += k
2358 endif
2359 endforeach
2360endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02002361config_host_data.set('CONFIG_AUDIO_DRIVERS',
2362 '"' + '", "'.join(audio_drivers_selected) + '", ')
2363
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002364have_host_block_device = (host_os != 'darwin' or
Joelle van Dyne14176c82021-03-15 11:03:38 -07002365 cc.has_header('IOKit/storage/IOMedia.h'))
2366
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002367dbus_display = get_option('dbus_display') \
2368 .require(gio.version().version_compare('>=2.64'),
2369 error_message: '-display dbus requires glib>=2.64') \
Paolo Bonzini75440602022-04-20 17:33:44 +02002370 .require(gdbus_codegen.found(),
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02002371 error_message: gdbus_codegen_error.format('-display dbus')) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002372 .allowed()
Marc-André Lureau142ca622021-07-15 11:53:53 +04002373
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002374have_virtfs = get_option('virtfs') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002375 .require(host_os == 'linux' or host_os == 'darwin',
Keno Fischer0fb1e192022-02-27 17:35:22 -05002376 error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002377 .require(host_os == 'linux' or cc.has_function('pthread_fchdir_np'),
Keno Fischer0fb1e192022-02-27 17:35:22 -05002378 error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002379 .require(host_os == 'darwin' or libattr.found(),
Peter Foley1a67e072023-05-03 09:07:56 -04002380 error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002381 .disable_auto_if(not have_tools and not have_system) \
2382 .allowed()
Paolo Bonzini69202b42020-11-17 14:46:21 +01002383
Daniel P. Berrangé4bb3da42024-07-12 14:24:44 +01002384qga_fsfreeze = false
2385qga_fstrim = false
2386if host_os == 'linux'
2387 if cc.has_header_symbol('linux/fs.h', 'FIFREEZE')
2388 qga_fsfreeze = true
2389 endif
2390 if cc.has_header_symbol('linux/fs.h', 'FITRIM')
2391 qga_fstrim = true
2392 endif
2393elif host_os == 'freebsd' and cc.has_header_symbol('ufs/ffs/fs.h', 'UFSSUSPEND')
2394 qga_fsfreeze = true
2395endif
2396
Paolo Bonzini622d64f2022-04-20 17:33:53 +02002397if get_option('block_drv_ro_whitelist') == ''
2398 config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
2399else
2400 config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
2401 '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
2402endif
2403if get_option('block_drv_rw_whitelist') == ''
2404 config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
2405else
2406 config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
2407 '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
2408endif
2409
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002410foreach k : get_option('trace_backends')
2411 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
2412endforeach
2413config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02002414config_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
Paolo Bonzini40c909f2022-04-20 17:33:49 +02002415if iasl.found()
2416 config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
Paolo Bonzini5dc46182021-10-13 13:19:00 +02002417endif
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002418config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
2419config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
2420config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
2421config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
2422config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09002423
2424qemu_firmwarepath = ''
2425foreach k : get_option('qemu_firmwarepath')
2426 qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
2427endforeach
2428config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
2429
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002430config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
2431config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
2432config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
2433config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
2434config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
2435config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
2436
Paolo Bonzini60027112022-10-20 14:53:10 +02002437if enable_modules
Paolo Bonzinib0b43232022-04-20 17:33:54 +02002438 config_host_data.set('CONFIG_STAMP', run_command(
2439 meson.current_source_dir() / 'scripts/qemu-stamp.py',
2440 meson.project_version(), get_option('pkgversion'), '--',
2441 meson.current_source_dir() / 'configure',
2442 capture: true, check: true).stdout().strip())
2443endif
2444
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002445have_slirp_smbd = get_option('slirp_smbd') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002446 .require(host_os != 'windows', error_message: 'Host smbd not supported on this platform.') \
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002447 .allowed()
2448if have_slirp_smbd
2449 smbd_path = get_option('smbd')
2450 if smbd_path == ''
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002451 smbd_path = (host_os == 'sunos' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002452 endif
2453 config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
2454endif
2455
Paolo Bonzini823eb012021-11-08 14:18:17 +01002456config_host_data.set('HOST_' + host_arch.to_upper(), 1)
2457
Paolo Bonzini95933f12023-09-08 12:10:08 +02002458kvm_targets_c = '""'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002459if get_option('kvm').allowed() and host_os == 'linux'
Paolo Bonzini95933f12023-09-08 12:10:08 +02002460 kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
2461endif
2462config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
2463
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02002464if get_option('module_upgrades') and not enable_modules
2465 error('Cannot enable module-upgrades as modules are not enabled')
2466endif
2467config_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
2468
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002469config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002470config_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002471config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002472config_host_data.set('CONFIG_BSD', host_os in bsd_oses)
Daniel P. Berrangé4be55a42024-07-12 14:24:54 +01002473config_host_data.set('CONFIG_FREEBSD', host_os == 'freebsd')
Paolo Bonzinia775c712023-09-08 12:09:22 +02002474config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04002475config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002476config_host_data.set('CONFIG_DARWIN', host_os == 'darwin')
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01002477config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini537b7242021-10-07 15:08:12 +02002478config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02002479config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002480config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002481config_host_data.set('CONFIG_LINUX', host_os == 'linux')
2482config_host_data.set('CONFIG_POSIX', host_os != 'windows')
2483config_host_data.set('CONFIG_WIN32', host_os == 'windows')
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002484config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002485config_host_data.set('CONFIG_MPATH', mpathpersist.found())
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04002486config_host_data.set('CONFIG_BLKIO', blkio.found())
Stefano Garzarella98b126f2023-05-30 09:19:41 +02002487if blkio.found()
2488 config_host_data.set('CONFIG_BLKIO_VHOST_VDPA_FD',
2489 blkio.version().version_compare('>=1.3.0'))
Stefano Garzarella547c4e52024-08-08 10:05:45 +02002490 config_host_data.set('CONFIG_BLKIO_WRITE_ZEROS_FUA',
2491 blkio.version().version_compare('>=1.4.0'))
Stefano Garzarella98b126f2023-05-30 09:19:41 +02002492endif
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002493config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08002494config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02002495config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini75440602022-04-20 17:33:44 +02002496config_host_data.set('CONFIG_GIO', gio.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002497config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
2498if glusterfs.found()
2499 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
2500 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
2501 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
2502 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
2503 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
2504 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
2505endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002506config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02002507config_host_data.set('CONFIG_VTE', vte.found())
Claudio Fontana29e0bff2022-11-21 14:55:38 +01002508config_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard)
Taylor Simpson63efb6a2023-04-27 15:59:52 -07002509config_host_data.set('CONFIG_HEXAGON_IDEF_PARSER', get_option('hexagon_idef_parser'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002510config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002511config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002512config_host_data.set('CONFIG_EBPF', libbpf.found())
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002513config_host_data.set('CONFIG_AF_XDP', libxdp.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002514config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002515config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01002516config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Thomas Huthe6a52b32021-12-09 15:48:01 +01002517config_host_data.set('CONFIG_LIBSSH', libssh.found())
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02002518config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002519config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
2520config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzini60027112022-10-20 14:53:10 +02002521config_host_data.set('CONFIG_MODULES', enable_modules)
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002522config_host_data.set('CONFIG_NUMA', numa.found())
Michal Privoznik6bb613f2022-12-15 10:55:03 +01002523if numa.found()
2524 config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY',
2525 cc.has_function('numa_has_preferred_many',
2526 dependencies: numa))
2527endif
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002528config_host_data.set('CONFIG_OPENGL', opengl.found())
Paolo Bonzini2c13c572023-08-30 12:20:53 +02002529config_host_data.set('CONFIG_PLUGIN', get_option('plugins'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002530config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini3730a732022-04-20 17:33:41 +02002531config_host_data.set('CONFIG_RDMA', rdma.found())
Paolo Bonzini655e2a72023-10-05 14:19:34 +02002532config_host_data.set('CONFIG_RELOCATABLE', get_option('relocatable'))
Paolo Bonzini721fa5e2022-10-12 11:59:51 +02002533config_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002534config_host_data.set('CONFIG_SDL', sdl.found())
2535config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01002536config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Michal Privoznik73422d92022-10-26 09:30:24 +02002537if seccomp.found()
2538 config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
2539endif
Marc-André Lureaucca15752023-08-30 13:38:25 +04002540config_host_data.set('CONFIG_PIXMAN', pixman.found())
Paolo Bonzinia775c712023-09-08 12:09:22 +02002541config_host_data.set('CONFIG_SLIRP', slirp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01002542config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002543config_host_data.set('CONFIG_SOLARIS', host_os == 'sunos')
Paolo Bonzinie3c426c2022-05-09 12:50:29 +02002544if have_tcg
Paolo Bonzini875be2872022-02-15 11:37:00 +01002545 config_host_data.set('CONFIG_TCG', 1)
2546 config_host_data.set('CONFIG_TCG_INTERPRETER', tcg_arch == 'tci')
2547endif
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002548config_host_data.set('CONFIG_TPM', have_tpm)
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002549config_host_data.set('CONFIG_TSAN', get_option('tsan'))
Paolo Bonzini90540f32021-06-03 11:15:26 +02002550config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Paolo Bonzinie1723992021-10-07 15:08:21 +02002551config_host_data.set('CONFIG_VDE', vde.found())
Stefan Hajnoczic0c4f142023-10-03 21:45:32 -04002552config_host_data.set('CONFIG_VHOST', have_vhost)
Paolo Bonzini2df89d52022-04-20 17:34:07 +02002553config_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
2554config_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
2555config_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
2556config_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
2557config_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
2558config_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
2559config_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03002560config_host_data.set('CONFIG_VMNET', vmnet.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002561config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Xie Yongji2a2359b2022-05-23 16:46:09 +08002562config_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
Kshitij Suri95f85102022-04-08 07:13:34 +00002563config_host_data.set('CONFIG_PNG', png.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002564config_host_data.set('CONFIG_VNC', vnc.found())
2565config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002566config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini95933f12023-09-08 12:10:08 +02002567if virgl.found()
Dmitry Osipenkoffac9642024-10-25 00:03:04 +03002568 config_host_data.set('VIRGL_VERSION_MAJOR', virgl.version().split('.')[0])
Paolo Bonzini95933f12023-09-08 12:10:08 +02002569endif
Paolo Bonzini69202b42020-11-17 14:46:21 +01002570config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002571config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002572config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04002573config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04002574config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02002575config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01002576config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Daniel P. Berrangéd47b83b2022-04-26 17:00:43 +01002577config_host_data.set('CONFIG_TASN1', tasn1.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002578config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
2579config_host_data.set('CONFIG_NETTLE', nettle.found())
Hyman Huang52ed9f42023-12-07 23:47:35 +08002580config_host_data.set('CONFIG_CRYPTO_SM4', crypto_sm4.found())
liequan ched078da82024-10-30 08:51:46 +00002581config_host_data.set('CONFIG_CRYPTO_SM3', crypto_sm3.found())
Lei He4c5e5122022-05-25 17:01:14 +08002582config_host_data.set('CONFIG_HOGWEED', hogweed.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002583config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002584config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Paolo Bonzinib1def332020-11-17 13:37:39 +01002585config_host_data.set('CONFIG_ZSTD', zstd.found())
Yuan Liub844a2c2024-06-10 18:21:06 +08002586config_host_data.set('CONFIG_QPL', qpl.found())
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01002587config_host_data.set('CONFIG_UADK', uadk.found())
Bryan Zhange28ed312024-08-30 16:27:19 -07002588config_host_data.set('CONFIG_QATZIP', qatzip.found())
Max Reitza484a712020-10-27 20:05:41 +01002589config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01002590config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002591config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
Marc-André Lureauddece462021-10-06 14:18:09 +04002592if spice_protocol.found()
2593config_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
2594config_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
2595config_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
2596endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002597config_host_data.set('CONFIG_SPICE', spice.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01002598config_host_data.set('CONFIG_X11', x11.found())
Marc-André Lureau142ca622021-07-15 11:53:53 +04002599config_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
Daniele Buono9e62ba42020-12-04 18:06:14 -05002600config_host_data.set('CONFIG_CFI', get_option('cfi'))
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002601config_host_data.set('CONFIG_SELINUX', selinux.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002602config_host_data.set('CONFIG_XEN_BACKEND', xen.found())
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002603config_host_data.set('CONFIG_LIBDW', libdw.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002604if xen.found()
2605 # protect from xen.version() having less than three components
2606 xen_version = xen.version().split('.') + ['0', '0']
2607 xen_ctrl_version = xen_version[0] + \
2608 ('0' + xen_version[1]).substring(-2) + \
2609 ('0' + xen_version[2]).substring(-2)
2610 config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
2611endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002612config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
2613config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
2614config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
2615config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
2616
Paolo Bonzinia6305082021-10-07 15:08:15 +02002617config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002618config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
2619
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002620have_coroutine_pool = get_option('coroutine_pool')
2621if get_option('debug_stack_usage') and have_coroutine_pool
2622 message('Disabling coroutine pool to measure stack usage')
2623 have_coroutine_pool = false
2624endif
Paolo Bonzini230f6e02023-10-05 14:31:27 +02002625config_host_data.set('CONFIG_COROUTINE_POOL', have_coroutine_pool)
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04002626config_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002627config_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002628config_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
Paolo Bonzini1d558c92023-08-28 11:48:30 +02002629config_host_data.set('CONFIG_DEBUG_TCG', get_option('debug_tcg'))
Ilya Leoshkevich1f2355f2024-03-12 01:23:30 +01002630config_host_data.set('CONFIG_DEBUG_REMAP', get_option('debug_remap'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002631config_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
Juan Quintelaabad1852022-09-02 18:51:25 +02002632config_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
Daniel P. Berrangé4bb3da42024-07-12 14:24:44 +01002633config_host_data.set('CONFIG_FSFREEZE', qga_fsfreeze)
2634config_host_data.set('CONFIG_FSTRIM', qga_fstrim)
Paolo Bonzini406523f2021-10-13 11:43:54 +02002635
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002636# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002637config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002638config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
Daniel P. Berrangé6b1c7442025-04-25 13:17:12 +01002639valgrind = false
2640if get_option('valgrind').allowed()
2641 if cc.has_header('valgrind/valgrind.h')
2642 valgrind = true
2643 else
2644 if get_option('valgrind').enabled()
2645 error('valgrind requested but valgrind.h not found')
2646 endif
2647 endif
2648endif
2649config_host_data.set('CONFIG_VALGRIND_H', valgrind)
Thomas Huth48f670e2020-11-18 18:10:52 +01002650config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01002651config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Michael Vogt97299302024-10-01 17:14:54 +02002652config_host_data.set('HAVE_OPENAT2_H', cc.has_header('linux/openat2.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01002653config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002654config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01002655config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01002656config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002657if host_os == 'windows'
Bin Mengd4093732022-08-02 15:51:58 +08002658 config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
2659endif
Thomas Huthded5d782020-11-14 11:10:11 +01002660
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002661# has_function
Claudio Imbrendac891c242022-08-12 15:34:53 +02002662config_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002663config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002664config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
2665config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
2666config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
2667config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Paolo Bonzini67504852023-06-21 00:47:31 +02002668config_host_data.set('CONFIG_SCHED_GETCPU', cc.has_function('sched_getcpu', prefix: '#include <sched.h>'))
Peter Maydell86983432022-02-26 18:07:19 +00002669# Note that we need to specify prefix: here to avoid incorrectly
2670# thinking that Windows has posix_memalign()
2671config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
Peter Maydell5c8c7142022-02-26 18:07:20 +00002672config_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
Peter Maydell88454f82022-02-26 18:07:21 +00002673config_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
2674config_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002675config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002676config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Keno Fischer029ed1b2022-02-27 17:35:20 -05002677config_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002678config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
2679config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
2680config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
2681config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
2682config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Daniel P. Berrangé5288d9d2024-12-02 12:19:27 +00002683config_host_data.set('CONFIG_GETLOADAVG', cc.has_function('getloadavg'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002684config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Andrew Deason59e35c72022-04-26 14:55:22 -05002685config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02002686config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03002687config_host_data.set('HAVE_GLIB_WITH_ALIGNED_ALLOC', glib_has_aligned_alloc)
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002688config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Akihiko Odakia5b30be2025-04-24 13:50:14 +09002689config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul', prefix: osdep_prefix))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002690config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Stefano Garzarella66dc5f92022-05-17 09:10:12 +02002691if rbd.found()
2692 config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
2693 cc.has_function('rbd_namespace_exists',
2694 dependencies: rbd,
2695 prefix: '#include <rbd/librbd.h>'))
2696endif
Li Zhijian911965a2021-09-10 15:02:55 +08002697if rdma.found()
2698 config_host_data.set('HAVE_IBV_ADVISE_MR',
2699 cc.has_function('ibv_advise_mr',
Paolo Bonzini3730a732022-04-20 17:33:41 +02002700 dependencies: rdma,
Li Zhijian911965a2021-09-10 15:02:55 +08002701 prefix: '#include <infiniband/verbs.h>'))
2702endif
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002703
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002704have_asan_fiber = false
Richard Hendersoncb771ac2024-08-13 19:52:15 +10002705if get_option('asan') and \
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002706 not cc.has_function('__sanitizer_start_switch_fiber',
2707 args: '-fsanitize=address',
2708 prefix: '#include <sanitizer/asan_interface.h>')
2709 warning('Missing ASAN due to missing fiber annotation interface')
2710 warning('Without code annotation, the report may be inferior.')
2711else
2712 have_asan_fiber = true
2713endif
2714config_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber)
2715
Ilya Leoshkevicha1a98002024-02-06 01:22:03 +01002716have_inotify_init = cc.has_header_symbol('sys/inotify.h', 'inotify_init')
2717have_inotify_init1 = cc.has_header_symbol('sys/inotify.h', 'inotify_init1')
2718inotify = not_found
2719if (have_inotify_init or have_inotify_init1) and host_os == 'freebsd'
2720 # libinotify-kqueue
2721 inotify = cc.find_library('inotify')
2722 if have_inotify_init
2723 have_inotify_init = inotify.found()
2724 endif
2725 if have_inotify_init1
2726 have_inotify_init1 = inotify.found()
2727 endif
2728endif
2729config_host_data.set('CONFIG_INOTIFY', have_inotify_init)
2730config_host_data.set('CONFIG_INOTIFY1', have_inotify_init1)
2731
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002732# has_header_symbol
Sam Li6d43eaa2023-05-08 12:55:28 +08002733config_host_data.set('CONFIG_BLKZONED',
2734 cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002735config_host_data.set('CONFIG_EPOLL_CREATE1',
2736 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
2737config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
2738 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
2739 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
2740config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
2741 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
2742config_host_data.set('CONFIG_FIEMAP',
2743 cc.has_header('linux/fiemap.h') and
2744 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Akihiko Odaki563cd692025-04-24 13:50:11 +09002745config_host_data.set('CONFIG_GETCPU',
Akihiko Odaki797150d2025-04-24 13:50:13 +09002746 cc.has_header_symbol('sched.h', 'getcpu', prefix: osdep_prefix))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002747config_host_data.set('CONFIG_GETRANDOM',
2748 cc.has_function('getrandom') and
2749 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002750config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
2751 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002752config_host_data.set('CONFIG_RTNETLINK',
2753 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
2754config_host_data.set('CONFIG_SYSMACROS',
2755 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002756config_host_data.set('HAVE_OPTRESET',
2757 cc.has_header_symbol('getopt.h', 'optreset'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04002758config_host_data.set('HAVE_IPPROTO_MPTCP',
2759 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Kevin Wolf984a32f2025-03-07 23:16:30 +01002760if libaio.found()
2761 config_host_data.set('HAVE_IO_PREP_PWRITEV2',
2762 cc.has_header_symbol('libaio.h', 'io_prep_pwritev2'))
2763endif
2764if linux_io_uring.found()
2765 config_host_data.set('HAVE_IO_URING_PREP_WRITEV2',
2766 cc.has_header_symbol('liburing.h', 'io_uring_prep_writev2'))
2767endif
Juraj Marcin1bd42372025-05-21 15:52:35 +02002768config_host_data.set('HAVE_TCP_KEEPCNT',
2769 cc.has_header_symbol('netinet/tcp.h', 'TCP_KEEPCNT') or
2770 cc.compiles('''
2771 #include <ws2tcpip.h>
2772 #ifndef TCP_KEEPCNT
2773 #error
2774 #endif
2775 int main(void) { return 0; }''',
2776 name: 'Win32 TCP_KEEPCNT'))
2777# On Darwin TCP_KEEPIDLE is available under different name, TCP_KEEPALIVE.
2778# https://github.com/apple/darwin-xnu/blob/xnu-4570.1.46/bsd/man/man4/tcp.4#L172
2779config_host_data.set('HAVE_TCP_KEEPIDLE',
2780 cc.has_header_symbol('netinet/tcp.h', 'TCP_KEEPIDLE') or
2781 cc.has_header_symbol('netinet/tcp.h', 'TCP_KEEPALIVE') or
2782 cc.compiles('''
2783 #include <ws2tcpip.h>
2784 #ifndef TCP_KEEPIDLE
2785 #error
2786 #endif
2787 int main(void) { return 0; }''',
2788 name: 'Win32 TCP_KEEPIDLE'))
2789config_host_data.set('HAVE_TCP_KEEPINTVL',
2790 cc.has_header_symbol('netinet/tcp.h', 'TCP_KEEPINTVL') or
2791 cc.compiles('''
2792 #include <ws2tcpip.h>
2793 #ifndef TCP_KEEPINTVL
2794 #error
2795 #endif
2796 int main(void) { return 0; }''',
2797 name: 'Win32 TCP_KEEPINTVL'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002798
2799# has_member
2800config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
2801 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
2802 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002803config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
2804 cc.has_member('struct stat', 'st_atim',
2805 prefix: '#include <sys/stat.h>'))
Sam Li6d43eaa2023-05-08 12:55:28 +08002806config_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY',
2807 cc.has_member('struct blk_zone', 'capacity',
2808 prefix: '#include <linux/blkzoned.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002809
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002810# has_type
2811config_host_data.set('CONFIG_IOVEC',
2812 cc.has_type('struct iovec',
2813 prefix: '#include <sys/uio.h>'))
2814config_host_data.set('HAVE_UTMPX',
2815 cc.has_type('struct utmpx',
2816 prefix: '#include <utmpx.h>'))
2817
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002818config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002819 #include <sys/eventfd.h>
2820 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Akihiko Odaki797150d2025-04-24 13:50:13 +09002821config_host_data.set('CONFIG_FDATASYNC', cc.links(osdep_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002822 int main(void) {
2823 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2824 return fdatasync(0);
2825 #else
2826 #error Not supported
2827 #endif
2828 }'''))
Andrew Deason8900c202022-03-15 22:52:25 -05002829
Akihiko Odaki797150d2025-04-24 13:50:13 +09002830has_madvise = cc.links(osdep_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002831 #include <sys/mman.h>
Andrew Deason8900c202022-03-15 22:52:25 -05002832 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
2833missing_madvise_proto = false
2834if has_madvise
2835 # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
2836 # but forget to prototype it. In this case, has_madvise will be true (the
2837 # test program links despite a compile warning). To detect the
2838 # missing-prototype case, we try again with a definitely-bogus prototype.
2839 # This will only compile if the system headers don't provide the prototype;
2840 # otherwise the conflicting prototypes will cause a compiler error.
Akihiko Odaki797150d2025-04-24 13:50:13 +09002841 missing_madvise_proto = cc.links(osdep_prefix + '''>
Andrew Deason8900c202022-03-15 22:52:25 -05002842 #include <sys/mman.h>
Andrew Deason8900c202022-03-15 22:52:25 -05002843 extern int madvise(int);
2844 int main(void) { return madvise(0); }''')
2845endif
2846config_host_data.set('CONFIG_MADVISE', has_madvise)
2847config_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
2848
Akihiko Odaki797150d2025-04-24 13:50:13 +09002849config_host_data.set('CONFIG_MEMFD', cc.links(osdep_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002850 #include <sys/mman.h>
2851 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Akihiko Odaki797150d2025-04-24 13:50:13 +09002852config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(osdep_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002853 #if !defined(AT_EMPTY_PATH)
2854 # error missing definition
2855 #else
2856 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2857 #endif'''))
Michal Privoznik12d7d0c2024-06-05 12:44:54 +02002858
2859# On Darwin posix_madvise() has the same return semantics as plain madvise(),
2860# i.e. errno is set and -1 is returned. That's not really how POSIX defines the
2861# function. On the flip side, it has madvise() which is preferred anyways.
2862if host_os != 'darwin'
Akihiko Odaki797150d2025-04-24 13:50:13 +09002863 config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(osdep_prefix + '''
Michal Privoznik12d7d0c2024-06-05 12:44:54 +02002864 #include <sys/mman.h>
Michal Privoznik12d7d0c2024-06-05 12:44:54 +02002865 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
2866endif
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002867
Akihiko Odaki797150d2025-04-24 13:50:13 +09002868config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(osdep_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002869 #include <pthread.h>
2870
2871 static void *f(void *p) { return NULL; }
2872 int main(void)
2873 {
2874 pthread_t thread;
2875 pthread_create(&thread, 0, f, 0);
2876 pthread_setname_np(thread, "QEMU");
2877 return 0;
2878 }''', dependencies: threads))
Akihiko Odaki797150d2025-04-24 13:50:13 +09002879config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(osdep_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002880 #include <pthread.h>
2881
2882 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
2883 int main(void)
2884 {
2885 pthread_t thread;
2886 pthread_create(&thread, 0, f, 0);
2887 return 0;
2888 }''', dependencies: threads))
Akihiko Odaki797150d2025-04-24 13:50:13 +09002889config_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(osdep_prefix + '''
Brad Smith3ada67a2022-12-18 03:22:04 -05002890 #include <pthread.h>
2891 #include <pthread_np.h>
2892
2893 static void *f(void *p) { return NULL; }
2894 int main(void)
2895 {
2896 pthread_t thread;
2897 pthread_create(&thread, 0, f, 0);
2898 pthread_set_name_np(thread, "QEMU");
2899 return 0;
2900 }''', dependencies: threads))
Akihiko Odaki797150d2025-04-24 13:50:13 +09002901config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(osdep_prefix + '''
Longpeng(Mike)657ac982022-02-22 17:05:05 +08002902 #include <pthread.h>
Longpeng(Mike)657ac982022-02-22 17:05:05 +08002903
2904 int main(void)
2905 {
2906 pthread_condattr_t attr
2907 pthread_condattr_init(&attr);
2908 pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2909 return 0;
2910 }''', dependencies: threads))
Akihiko Odaki797150d2025-04-24 13:50:13 +09002911config_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(osdep_prefix + '''
David Hildenbrand7730f322022-10-14 15:47:15 +02002912 #include <pthread.h>
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002913
David Hildenbrand7730f322022-10-14 15:47:15 +02002914 static void *f(void *p) { return NULL; }
2915 int main(void)
2916 {
2917 int setsize = CPU_ALLOC_SIZE(64);
2918 pthread_t thread;
2919 cpu_set_t *cpuset;
2920 pthread_create(&thread, 0, f, 0);
2921 cpuset = CPU_ALLOC(64);
2922 CPU_ZERO_S(setsize, cpuset);
2923 pthread_setaffinity_np(thread, setsize, cpuset);
2924 pthread_getaffinity_np(thread, setsize, cpuset);
2925 CPU_FREE(cpuset);
2926 return 0;
2927 }''', dependencies: threads))
Akihiko Odaki797150d2025-04-24 13:50:13 +09002928config_host_data.set('CONFIG_SIGNALFD', cc.links(osdep_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02002929 #include <sys/signalfd.h>
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02002930 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Akihiko Odaki797150d2025-04-24 13:50:13 +09002931config_host_data.set('CONFIG_SPLICE', cc.links(osdep_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002932 int main(void)
2933 {
2934 int len, fd = 0;
2935 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2936 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2937 return 0;
2938 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002939
Akihiko Odaki797150d2025-04-24 13:50:13 +09002940config_host_data.set('HAVE_MLOCKALL', cc.links(osdep_prefix + '''
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002941 #include <sys/mman.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002942 int main(void) {
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002943 return mlockall(MCL_FUTURE);
2944 }'''))
2945
Akihiko Odaki797150d2025-04-24 13:50:13 +09002946config_host_data.set('HAVE_MLOCK_ONFAULT', cc.links(osdep_prefix + '''
Daniil Tatianine76fadf2025-02-12 17:39:17 +03002947 #include <sys/mman.h>
2948 int main(void) {
2949 return mlockall(MCL_FUTURE | MCL_ONFAULT);
2950 }'''))
2951
Thomas Hutheea94532021-10-28 20:59:08 +02002952have_l2tpv3 = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002953if get_option('l2tpv3').allowed() and have_system
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002954 have_l2tpv3 = cc.has_type('struct mmsghdr',
Akihiko Odaki797150d2025-04-24 13:50:13 +09002955 prefix: osdep_prefix + '''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002956 #include <sys/socket.h>
2957 #include <linux/ip.h>''')
Thomas Hutheea94532021-10-28 20:59:08 +02002958endif
2959config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2960
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002961have_netmap = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002962if get_option('netmap').allowed() and have_system
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002963 have_netmap = cc.compiles('''
2964 #include <inttypes.h>
2965 #include <net/if.h>
2966 #include <net/netmap.h>
2967 #include <net/netmap_user.h>
2968 #if (NETMAP_API < 11) || (NETMAP_API > 15)
2969 #error
2970 #endif
2971 int main(void) { return 0; }''')
2972 if not have_netmap and get_option('netmap').enabled()
2973 error('Netmap headers not available')
2974 endif
2975endif
2976config_host_data.set('CONFIG_NETMAP', have_netmap)
2977
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002978# Work around a system header bug with some kernel/XFS header
2979# versions where they both try to define 'struct fsxattr':
2980# xfs headers will not try to redefine structs from linux headers
2981# if this macro is set.
2982config_host_data.set('HAVE_FSXATTR', cc.links('''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002983 #include <linux/fs.h>
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002984 struct fsxattr foo;
2985 int main(void) {
2986 return 0;
2987 }'''))
2988
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002989# Some versions of Mac OS X incorrectly define SIZE_MAX
2990config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2991 #include <stdint.h>
2992 #include <stdio.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002993 int main(void) {
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002994 return printf("%zu", SIZE_MAX);
2995 }''', args: ['-Werror']))
2996
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002997# See if 64-bit atomic operations are supported.
2998# Note that without __atomic builtins, we can only
2999# assume atomic loads/stores max at pointer size.
3000config_host_data.set('CONFIG_ATOMIC64', cc.links('''
Paolo Bonzinibd87a362021-10-07 15:08:25 +02003001 #include <stdint.h>
3002 int main(void)
3003 {
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003004 uint64_t x = 0, y = 0;
Paolo Bonzinibd87a362021-10-07 15:08:25 +02003005 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
3006 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
3007 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
3008 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
3009 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
3010 return 0;
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02003011 }''', args: qemu_isa_flags))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02003012
Kohei Tokunagaccc403e2025-04-28 15:39:07 +09003013# has_int128_type is set to false on Emscripten to avoid errors by libffi
3014# during runtime.
3015has_int128_type = host_os != 'emscripten' and cc.compiles('''
Richard Henderson6479dd72023-05-24 08:14:41 -07003016 __int128_t a;
3017 __uint128_t b;
3018 int main(void) { b = a; }''')
3019config_host_data.set('CONFIG_INT128_TYPE', has_int128_type)
3020
3021has_int128 = has_int128_type and cc.links('''
Marc-André Lureau848126d2022-02-28 15:49:19 +04003022 __int128_t a;
3023 __uint128_t b;
3024 int main (void) {
3025 a = a + b;
3026 b = a * b;
3027 a = a * a;
3028 return 0;
3029 }''')
Marc-André Lureau848126d2022-02-28 15:49:19 +04003030config_host_data.set('CONFIG_INT128', has_int128)
3031
Richard Henderson6479dd72023-05-24 08:14:41 -07003032if has_int128_type
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04003033 # "do we have 128-bit atomics which are handled inline and specifically not
3034 # via libatomic". The reason we can't use libatomic is documented in the
3035 # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003036 # We only care about these operations on 16-byte aligned pointers, so
3037 # force 16-byte alignment of the pointer, which may be greater than
3038 # __alignof(unsigned __int128) for the host.
3039 atomic_test_128 = '''
3040 int main(int ac, char **av) {
Richard Henderson6479dd72023-05-24 08:14:41 -07003041 __uint128_t *p = __builtin_assume_aligned(av[ac - 1], 16);
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003042 p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED);
3043 __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED);
3044 __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
3045 return 0;
3046 }'''
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02003047 has_atomic128 = cc.links(atomic_test_128, args: qemu_isa_flags)
Marc-André Lureau848126d2022-02-28 15:49:19 +04003048
3049 config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
3050
3051 if not has_atomic128
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003052 # Even with __builtin_assume_aligned, the above test may have failed
3053 # without optimization enabled. Try again with optimizations locally
3054 # enabled for the function. See
3055 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02003056 has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128,
3057 args: qemu_isa_flags)
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003058 config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt)
Marc-André Lureau848126d2022-02-28 15:49:19 +04003059
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003060 if not has_atomic128_opt
3061 config_host_data.set('CONFIG_CMPXCHG128', cc.links('''
3062 int main(void)
3063 {
Richard Henderson6479dd72023-05-24 08:14:41 -07003064 __uint128_t x = 0, y = 0;
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003065 __sync_val_compare_and_swap_16(&x, y, x);
3066 return 0;
3067 }
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02003068 ''', args: qemu_isa_flags))
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003069 endif
Marc-André Lureau848126d2022-02-28 15:49:19 +04003070 endif
3071endif
Paolo Bonzinibd87a362021-10-07 15:08:25 +02003072
Akihiko Odaki797150d2025-04-24 13:50:13 +09003073config_host_data.set('CONFIG_GETAUXVAL', cc.links(osdep_prefix + '''
Paolo Bonzinibd87a362021-10-07 15:08:25 +02003074 #include <sys/auxv.h>
3075 int main(void) {
3076 return getauxval(AT_HWCAP) == 0;
3077 }'''))
3078
Akihiko Odaki797150d2025-04-24 13:50:13 +09003079config_host_data.set('CONFIG_ELF_AUX_INFO', cc.links(osdep_prefix + '''
Brad Smith27fca0a2024-07-27 23:58:55 -04003080 #include <sys/auxv.h>
3081 int main(void) {
3082 unsigned long hwcap = 0;
3083 elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
3084 return hwcap;
3085 }'''))
3086
Paolo Bonzini0dae95d2022-04-20 17:33:43 +02003087config_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
3088 #include <linux/usbdevice_fs.h>
3089
3090 #ifndef USBDEVFS_GET_CAPABILITIES
3091 #error "USBDEVFS_GET_CAPABILITIES undefined"
3092 #endif
3093
3094 #ifndef USBDEVFS_DISCONNECT_CLAIM
3095 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
3096 #endif
3097
3098 int main(void) { return 0; }'''))
3099
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02003100have_keyring = get_option('keyring') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003101 .require(host_os == 'linux', error_message: 'keyring is only available on Linux') \
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02003102 .require(cc.compiles('''
3103 #include <errno.h>
3104 #include <asm/unistd.h>
3105 #include <linux/keyctl.h>
3106 #include <sys/syscall.h>
3107 #include <unistd.h>
3108 int main(void) {
3109 return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
3110 }'''), error_message: 'keyctl syscall not available on this system').allowed()
3111config_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
3112
Paolo Bonzini622753d2021-11-08 13:38:58 +01003113have_cpuid_h = cc.links('''
3114 #include <cpuid.h>
3115 int main(void) {
3116 unsigned a, b, c, d;
3117 unsigned max = __get_cpuid_max(0, 0);
3118
3119 if (max >= 1) {
3120 __cpuid(1, a, b, c, d);
3121 }
3122
3123 if (max >= 7) {
3124 __cpuid_count(7, 0, a, b, c, d);
3125 }
3126
3127 return 0;
3128 }''')
3129config_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
3130
Richard Hendersone5717302024-06-27 17:36:43 +00003131# Don't bother to advertise asm/hwprobe.h for old versions that do
3132# not contain RISCV_HWPROBE_EXT_ZBA.
3133config_host_data.set('CONFIG_ASM_HWPROBE_H',
3134 cc.has_header_symbol('asm/hwprobe.h',
3135 'RISCV_HWPROBE_EXT_ZBA'))
3136
Paolo Bonzini53466862024-07-05 09:12:20 +02003137if have_cpuid_h
3138 have_avx2 = cc.links('''
Paolo Bonzini622753d2021-11-08 13:38:58 +01003139 #include <immintrin.h>
Richard Henderson701ea582022-12-03 19:31:12 -06003140 static int __attribute__((target("avx2"))) bar(void *a) {
Paolo Bonzini622753d2021-11-08 13:38:58 +01003141 __m256i x = *(__m256i *)a;
3142 return _mm256_testz_si256(x, x);
3143 }
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01003144 int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
Paolo Bonzini53466862024-07-05 09:12:20 +02003145 ''')
3146 have_avx512bw = cc.links('''
ling xu04ffce12022-11-16 23:29:22 +08003147 #include <immintrin.h>
Richard Hendersondc165fc2023-05-01 22:05:55 +01003148 static int __attribute__((target("avx512bw"))) bar(void *a) {
ling xu04ffce12022-11-16 23:29:22 +08003149 __m512i *x = a;
3150 __m512i res= _mm512_abs_epi8(*x);
3151 return res[1];
3152 }
3153 int main(int argc, char *argv[]) { return bar(argv[0]); }
Paolo Bonzini53466862024-07-05 09:12:20 +02003154 ''')
3155 if get_option('x86_version') >= '3' and not have_avx2
3156 error('Cannot enable AVX optimizations due to missing intrinsics')
3157 elif get_option('x86_version') >= '4' and not have_avx512bw
3158 error('Cannot enable AVX512 optimizations due to missing intrinsics')
3159 endif
3160else
3161 have_avx2 = false
3162 have_avx512bw = false
3163 if get_option('x86_version') >= '3'
3164 error('Cannot enable AVX optimizations due to missing cpuid.h')
3165 endif
3166endif
3167config_host_data.set('CONFIG_AVX2_OPT', have_avx2)
3168config_host_data.set('CONFIG_AVX512BW_OPT', have_avx512bw)
ling xu04ffce12022-11-16 23:29:22 +08003169
Richard Henderson8d97f282023-06-02 07:43:40 +00003170# For both AArch64 and AArch32, detect if builtins are available.
3171config_host_data.set('CONFIG_ARM_AES_BUILTIN', cc.compiles('''
3172 #include <arm_neon.h>
3173 #ifndef __ARM_FEATURE_AES
3174 __attribute__((target("+crypto")))
3175 #endif
3176 void foo(uint8x16_t *p) { *p = vaesmcq_u8(*p); }
3177 '''))
3178
Paolo Bonzinib87df902021-11-08 13:52:11 +01003179if get_option('membarrier').disabled()
3180 have_membarrier = false
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003181elif host_os == 'windows'
Paolo Bonzinib87df902021-11-08 13:52:11 +01003182 have_membarrier = true
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003183elif host_os == 'linux'
Paolo Bonzinib87df902021-11-08 13:52:11 +01003184 have_membarrier = cc.compiles('''
3185 #include <linux/membarrier.h>
3186 #include <sys/syscall.h>
3187 #include <unistd.h>
3188 #include <stdlib.h>
3189 int main(void) {
3190 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
3191 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
3192 exit(0);
3193 }''')
3194endif
3195config_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
3196 .require(have_membarrier, error_message: 'membarrier system call not available') \
3197 .allowed())
3198
Paolo Bonzini34b52612021-11-08 14:02:42 +01003199have_afalg = get_option('crypto_afalg') \
Akihiko Odaki797150d2025-04-24 13:50:13 +09003200 .require(cc.compiles(osdep_prefix + '''
Paolo Bonzini34b52612021-11-08 14:02:42 +01003201 #include <sys/socket.h>
3202 #include <linux/if_alg.h>
3203 int main(void) {
3204 int sock;
3205 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
3206 return sock;
3207 }
3208 '''), error_message: 'AF_ALG requested but could not be detected').allowed()
3209config_host_data.set('CONFIG_AF_ALG', have_afalg)
3210
Marc-André Lureau9d734b82022-04-01 15:50:05 +04003211config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
3212 'linux/vm_sockets.h', 'AF_VSOCK',
3213 prefix: '#include <sys/socket.h>',
3214))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02003215
Marc-André Lureau8821a382022-02-01 16:53:43 +04003216have_vss = false
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003217have_vss_sdk = false # old xp/2003 SDK
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003218if host_os == 'windows' and 'cpp' in all_languages
Marc-André Lureau8821a382022-02-01 16:53:43 +04003219 have_vss = cxx.compiles('''
3220 #define __MIDL_user_allocate_free_DEFINED__
Marc-André Lureau32478cb2022-02-22 23:40:01 +04003221 #include <vss.h>
Marc-André Lureau8821a382022-02-01 16:53:43 +04003222 int main(void) { return VSS_CTX_BACKUP; }''')
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003223 have_vss_sdk = cxx.has_header('vscoordint.h')
Marc-André Lureau8821a382022-02-01 16:53:43 +04003224endif
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003225config_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
Marc-André Lureau8821a382022-02-01 16:53:43 +04003226
Richard Henderson6391c772022-04-17 11:30:06 -07003227# Older versions of MinGW do not import _lock_file and _unlock_file properly.
3228# This was fixed for v6.0.0 with commit b48e3ac8969d.
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003229if host_os == 'windows'
Richard Henderson6391c772022-04-17 11:30:06 -07003230 config_host_data.set('HAVE__LOCK_FILE', cc.links('''
3231 #include <stdio.h>
3232 int main(void) {
3233 _lock_file(NULL);
3234 _unlock_file(NULL);
3235 return 0;
3236 }''', name: '_lock_file and _unlock_file'))
3237endif
3238
Qiang Yu98a050c2025-03-27 10:58:48 +08003239if spice.found()
3240 config_host_data.set('HAVE_SPICE_QXL_GL_SCANOUT2',
3241 cc.has_function('spice_qxl_gl_scanout2', dependencies: spice))
3242endif
3243
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003244if host_os == 'windows'
Pierrick Bouvierdbd672c2023-02-21 16:30:04 +01003245 mingw_has_setjmp_longjmp = cc.links('''
3246 #include <setjmp.h>
3247 int main(void) {
3248 /*
3249 * These functions are not available in setjmp header, but may be
3250 * available at link time, from libmingwex.a.
3251 */
3252 extern int __mingw_setjmp(jmp_buf);
3253 extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int);
3254 jmp_buf env;
3255 __mingw_setjmp(env);
3256 __mingw_longjmp(env, 0);
3257 }
3258 ''', name: 'mingw setjmp and longjmp')
3259
3260 if cpu == 'aarch64' and not mingw_has_setjmp_longjmp
3261 error('mingw must provide setjmp/longjmp for windows-arm64')
3262 endif
3263endif
3264
Richard Hendersonacce7282025-02-02 15:09:23 -08003265# Detect host pointer size for the target configuration loop.
3266host_long_bits = cc.sizeof('void *') * 8
3267
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003268########################
3269# Target configuration #
3270########################
3271
Paolo Bonzini2becc362020-02-03 11:42:03 +01003272minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003273
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02003274config_all_accel = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04003275config_all_devices = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003276config_devices_mak_list = []
3277config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02003278config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003279config_target_mak = {}
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07003280config_base_arch_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003281
3282disassemblers = {
3283 'alpha' : ['CONFIG_ALPHA_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003284 'avr' : ['CONFIG_AVR_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06003285 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003286 'hppa' : ['CONFIG_HPPA_DIS'],
3287 'i386' : ['CONFIG_I386_DIS'],
3288 'x86_64' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003289 'm68k' : ['CONFIG_M68K_DIS'],
3290 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
3291 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003292 'or1k' : ['CONFIG_OPENRISC_DIS'],
3293 'ppc' : ['CONFIG_PPC_DIS'],
3294 'riscv' : ['CONFIG_RISCV_DIS'],
3295 'rx' : ['CONFIG_RX_DIS'],
3296 's390' : ['CONFIG_S390_DIS'],
3297 'sh4' : ['CONFIG_SH4_DIS'],
3298 'sparc' : ['CONFIG_SPARC_DIS'],
3299 'xtensa' : ['CONFIG_XTENSA_DIS'],
Song Gaoaae17462022-06-06 20:43:06 +08003300 'loongarch' : ['CONFIG_LOONGARCH_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003301}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003302
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02003303have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01003304host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02003305 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01003306 (have_tpm ? ['CONFIG_TPM=y'] : []) + \
Marc-André Lureaucca15752023-08-30 13:38:25 +04003307 (pixman.found() ? ['CONFIG_PIXMAN=y'] : []) + \
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02003308 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02003309 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini88b6e612022-04-20 17:33:40 +02003310 (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
Dorjoy Chowdhurybb154e32024-10-09 03:17:23 +06003311 (libcbor.found() ? ['CONFIG_LIBCBOR=y'] : []) + \
Dorjoy Chowdhury63d2a5c2024-10-09 03:17:24 +06003312 (gnutls.found() ? ['CONFIG_GNUTLS=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01003313 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini1935b7e2024-05-07 14:13:46 +02003314 (fdt.found() ? ['CONFIG_FDT=y'] : []) + \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003315 (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
3316 (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
3317 (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01003318 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003319 (host_os == 'linux' ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman55116962022-06-13 16:26:24 -04003320 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02003321 (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : []) + \
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03003322 (hv_balloon ? ['CONFIG_HV_BALLOON_POSSIBLE=y'] : []) + \
3323 (have_rust ? ['CONFIG_HAVE_RUST=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01003324
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003325ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003326
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003327default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
3328actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003329fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003330foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04003331 config_target = { 'TARGET_NAME': target.split('-')[0] }
3332 if target.endswith('linux-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003333 if host_os != 'linux'
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003334 if default_targets
3335 continue
3336 endif
3337 error('Target @0@ is only available on a Linux host'.format(target))
3338 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04003339 config_target += { 'CONFIG_LINUX_USER': 'y' }
3340 elif target.endswith('bsd-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003341 if host_os not in bsd_oses
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003342 if default_targets
3343 continue
3344 endif
3345 error('Target @0@ is only available on a BSD host'.format(target))
3346 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04003347 config_target += { 'CONFIG_BSD_USER': 'y' }
3348 elif target.endswith('softmmu')
Philippe Mathieu-Daudébd0c03b2023-06-13 15:33:45 +02003349 config_target += { 'CONFIG_SYSTEM_ONLY': 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04003350 config_target += { 'CONFIG_SOFTMMU': 'y' }
3351 endif
3352 if target.endswith('-user')
3353 config_target += {
3354 'CONFIG_USER_ONLY': 'y',
3355 'CONFIG_QEMU_INTERP_PREFIX':
Ilya Leoshkevichc1075212024-10-30 00:17:47 +01003356 get_option('interp_prefix').replace('%M', config_target['TARGET_NAME']),
3357 'CONFIG_QEMU_RTSIG_MAP': get_option('rtsig_map'),
Paolo Bonzini765686d2020-09-18 06:37:21 -04003358 }
3359 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02003360
Richard Hendersonacce7282025-02-02 15:09:23 -08003361 config_target += keyval.load('configs/targets' / target + '.mak')
3362
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003363 target_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04003364 foreach sym: accelerators
Richard Hendersonacce7282025-02-02 15:09:23 -08003365 # Disallow 64-bit on 32-bit emulation and virtualization
3366 if host_long_bits < config_target['TARGET_LONG_BITS'].to_int()
3367 continue
3368 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04003369 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
3370 config_target += { sym: 'y' }
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02003371 config_all_accel += { sym: 'y' }
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003372 target_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04003373 endif
3374 endforeach
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003375 if target_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003376 if default_targets
3377 continue
3378 endif
3379 error('No accelerator available for target @0@'.format(target))
3380 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04003381
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003382 if 'TARGET_NEED_FDT' in config_target and not fdt.found()
Paolo Bonzini9b089d22024-05-08 09:25:48 +02003383 if default_targets
3384 warning('Disabling ' + target + ' due to missing libfdt')
3385 else
3386 fdt_required += target
3387 endif
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003388 continue
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003389 endif
3390
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003391 actual_target_dirs += target
3392
Paolo Bonzinifa731682020-09-21 05:19:07 -04003393 # Add default keys
Richard Hendersonacce7282025-02-02 15:09:23 -08003394 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzinifa731682020-09-21 05:19:07 -04003395 if 'TARGET_BASE_ARCH' not in config_target
3396 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
3397 endif
3398 if 'TARGET_ABI_DIR' not in config_target
3399 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
3400 endif
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003401 if 'TARGET_BIG_ENDIAN' not in config_target
3402 config_target += {'TARGET_BIG_ENDIAN': 'n'}
3403 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02003404
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003405 foreach k, v: disassemblers
Paolo Bonzini823eb012021-11-08 14:18:17 +01003406 if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003407 foreach sym: v
3408 config_target += { sym: 'y' }
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003409 endforeach
3410 endif
3411 endforeach
3412
Paolo Bonzini859aef02020-08-04 18:14:26 +02003413 config_target_data = configuration_data()
3414 foreach k, v: config_target
3415 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
3416 # do nothing
3417 elif ignored.contains(k)
3418 # do nothing
3419 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003420 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
3421 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02003422 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04003423 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02003424 config_target_data.set_quoted(k, v)
3425 elif v == 'y'
3426 config_target_data.set(k, 1)
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003427 elif v == 'n'
3428 config_target_data.set(k, 0)
Paolo Bonzini859aef02020-08-04 18:14:26 +02003429 else
3430 config_target_data.set(k, v)
3431 endif
3432 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01003433 config_target_data.set('QEMU_ARCH',
3434 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02003435 config_target_h += {target: configure_file(output: target + '-config-target.h',
3436 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003437
3438 if target.endswith('-softmmu')
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003439 target_kconfig += 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'
3440 target_kconfig += 'CONFIG_TARGET_BIG_ENDIAN=' + config_target['TARGET_BIG_ENDIAN']
3441
Paolo Bonziniae3a4202025-02-19 11:18:28 +01003442 # PVG is not cross-architecture. Use accelerator_targets as a proxy to
3443 # figure out which target can support PVG on this host
3444 if pvg.found() and target in accelerator_targets.get('CONFIG_HVF', [])
3445 target_kconfig += 'CONFIG_MAC_PVG=y'
3446 endif
3447
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003448 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003449 config_devices_mak = target + '-config-devices.mak'
3450 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003451 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01003452 output: config_devices_mak,
3453 depfile: config_devices_mak + '.d',
3454 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01003455 command: [minikconf,
3456 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01003457 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003458 host_kconfig, target_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02003459
3460 config_devices_data = configuration_data()
3461 config_devices = keyval.load(config_devices_mak)
3462 foreach k, v: config_devices
3463 config_devices_data.set(k, 1)
3464 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003465 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02003466 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
3467 configuration: config_devices_data)}
3468 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04003469 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01003470 endif
3471 config_target_mak += {target: config_target}
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07003472
3473 # build a merged config for all targets with the same TARGET_BASE_ARCH
3474 target_base_arch = config_target['TARGET_BASE_ARCH']
3475 config_base_arch = config_base_arch_mak.get(target_base_arch, {}) + config_target
3476 config_base_arch_mak += {target_base_arch: config_base_arch}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003477endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003478target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003479
Paolo Bonzinieed56e92021-11-10 11:01:26 +01003480target_configs_h = []
3481foreach target: target_dirs
3482 target_configs_h += config_target_h[target]
3483 target_configs_h += config_devices_h.get(target, [])
3484endforeach
3485genh += custom_target('config-poison.h',
3486 input: [target_configs_h],
3487 output: 'config-poison.h',
3488 capture: true,
3489 command: [find_program('scripts/make-config-poison.sh'),
3490 target_configs_h])
3491
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003492if fdt_required.length() > 0
3493 error('fdt disabled but required by targets ' + ', '.join(fdt_required))
3494endif
3495
Paolo Bonzinia775c712023-09-08 12:09:22 +02003496###############
3497# Subprojects #
3498###############
Paolo Bonzini4d34a862020-10-05 11:31:15 +02003499
Jagannathan Raman55116962022-06-13 16:26:24 -04003500libvfio_user_dep = not_found
3501if have_system and vfio_user_server_allowed
Paolo Bonzini2019cab2023-05-18 16:50:00 +02003502 libvfio_user_proj = subproject('libvfio-user', required: true)
Paolo Bonzini53283532023-03-30 12:47:23 +02003503 libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
Jagannathan Raman55116962022-06-13 16:26:24 -04003504endif
3505
Paolo Bonzinia775c712023-09-08 12:09:22 +02003506vhost_user = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003507if host_os == 'linux' and have_vhost_user
Paolo Bonzinia775c712023-09-08 12:09:22 +02003508 libvhost_user = subproject('libvhost-user')
3509 vhost_user = libvhost_user.get_variable('vhost_user_dep')
3510endif
3511
3512libvduse = not_found
3513if have_libvduse
3514 libvduse_proj = subproject('libvduse')
3515 libvduse = libvduse_proj.get_variable('libvduse_dep')
3516endif
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003517
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003518#####################
3519# Generated sources #
3520#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003521
Paolo Bonzinif3a6e9b2024-11-12 11:54:11 +01003522config_host_h = configure_file(output: 'config-host.h', configuration: config_host_data)
3523genh += config_host_h
Paolo Bonzini7b72c7d2024-10-15 11:14:18 +02003524
Marc-André Lureau3f885652019-07-15 18:06:04 +04003525hxtool = find_program('scripts/hxtool')
Marc-André Lureaue2c40122023-01-24 18:00:57 +00003526shaderinclude = find_program('scripts/shaderinclude.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003527qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003528qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
3529 meson.current_source_dir() / 'scripts/qapi/commands.py',
3530 meson.current_source_dir() / 'scripts/qapi/common.py',
3531 meson.current_source_dir() / 'scripts/qapi/error.py',
3532 meson.current_source_dir() / 'scripts/qapi/events.py',
3533 meson.current_source_dir() / 'scripts/qapi/expr.py',
3534 meson.current_source_dir() / 'scripts/qapi/gen.py',
3535 meson.current_source_dir() / 'scripts/qapi/introspect.py',
Markus Armbruster88d357d2023-04-28 12:54:16 +02003536 meson.current_source_dir() / 'scripts/qapi/main.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003537 meson.current_source_dir() / 'scripts/qapi/parser.py',
3538 meson.current_source_dir() / 'scripts/qapi/schema.py',
3539 meson.current_source_dir() / 'scripts/qapi/source.py',
3540 meson.current_source_dir() / 'scripts/qapi/types.py',
Daniel P. Berrangé2ebb09f2025-02-05 12:35:50 +00003541 meson.current_source_dir() / 'scripts/qapi/features.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003542 meson.current_source_dir() / 'scripts/qapi/visit.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003543 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003544]
3545
3546tracetool = [
3547 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003548 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003549]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003550tracetool_depends = files(
3551 'scripts/tracetool/backend/log.py',
3552 'scripts/tracetool/backend/__init__.py',
3553 'scripts/tracetool/backend/dtrace.py',
3554 'scripts/tracetool/backend/ftrace.py',
3555 'scripts/tracetool/backend/simple.py',
3556 'scripts/tracetool/backend/syslog.py',
3557 'scripts/tracetool/backend/ust.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003558 'scripts/tracetool/format/ust_events_c.py',
3559 'scripts/tracetool/format/ust_events_h.py',
3560 'scripts/tracetool/format/__init__.py',
3561 'scripts/tracetool/format/d.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003562 'scripts/tracetool/format/simpletrace_stap.py',
3563 'scripts/tracetool/format/c.py',
3564 'scripts/tracetool/format/h.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003565 'scripts/tracetool/format/log_stap.py',
3566 'scripts/tracetool/format/stap.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003567 'scripts/tracetool/__init__.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003568)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003569
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003570qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
3571 meson.current_source_dir(),
Paolo Bonzinib0b43232022-04-20 17:33:54 +02003572 get_option('pkgversion'), meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003573qemu_version = custom_target('qemu-version.h',
3574 output: 'qemu-version.h',
3575 command: qemu_version_cmd,
3576 capture: true,
3577 build_by_default: true,
3578 build_always_stale: true)
3579genh += qemu_version
3580
Marc-André Lureau3f885652019-07-15 18:06:04 +04003581hxdep = []
3582hx_headers = [
3583 ['qemu-options.hx', 'qemu-options.def'],
3584 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
3585]
3586if have_system
3587 hx_headers += [
3588 ['hmp-commands.hx', 'hmp-commands.h'],
3589 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
3590 ]
3591endif
3592foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003593 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04003594 input: files(d[0]),
3595 output: d[1],
3596 capture: true,
Marc-André Lureau3f885652019-07-15 18:06:04 +04003597 command: [hxtool, '-h', '@INPUT0@'])
3598endforeach
3599genh += hxdep
3600
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003601###############
3602# Trace files #
3603###############
3604
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003605# TODO: add each directory to the subdirs from its own meson.build, once
3606# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003607trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003608 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003609 'qapi',
3610 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003611 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003612 'util',
Alex Bennée842b42d2022-09-29 12:42:22 +01003613 'gdbstub',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003614]
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003615if have_linux_user
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003616 trace_events_subdirs += [ 'linux-user' ]
3617endif
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003618if have_bsd_user
3619 trace_events_subdirs += [ 'bsd-user' ]
3620endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003621if have_block
3622 trace_events_subdirs += [
3623 'authz',
3624 'block',
Daniel P. Berrangé48fc8872024-07-23 11:31:24 +01003625 'chardev',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003626 'io',
3627 'nbd',
3628 'scsi',
3629 ]
3630endif
3631if have_system
3632 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003633 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003634 'audio',
3635 'backends',
3636 'backends/tpm',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003637 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003638 'hw/9pfs',
3639 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08003640 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003641 'hw/alpha',
3642 'hw/arm',
3643 'hw/audio',
3644 'hw/block',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003645 'hw/char',
3646 'hw/display',
3647 'hw/dma',
Ninad Palsule99f0c042024-01-26 04:49:46 -06003648 'hw/fsi',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003649 'hw/hyperv',
3650 'hw/i2c',
3651 'hw/i386',
3652 'hw/i386/xen',
David Woodhouseaa98ee32023-01-13 19:51:32 +00003653 'hw/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003654 'hw/ide',
3655 'hw/input',
3656 'hw/intc',
3657 'hw/isa',
3658 'hw/mem',
3659 'hw/mips',
3660 'hw/misc',
3661 'hw/misc/macio',
3662 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08003663 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01003664 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02003665 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003666 'hw/nvram',
3667 'hw/pci',
3668 'hw/pci-host',
3669 'hw/ppc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003670 'hw/rtc',
Tomasz Jeznach0c54acb2024-10-16 17:40:27 -03003671 'hw/riscv',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003672 'hw/s390x',
3673 'hw/scsi',
3674 'hw/sd',
Bernhard Beschow3647dca2024-11-05 10:10:00 +00003675 'hw/sensor',
BALATON Zoltanad52cfc2021-10-29 23:02:09 +02003676 'hw/sh4',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003677 'hw/sparc',
3678 'hw/sparc64',
3679 'hw/ssi',
3680 'hw/timer',
3681 'hw/tpm',
Gerd Hoffmann736ca802025-02-25 17:30:21 +01003682 'hw/uefi',
Jeuk Kimbc4e68d2023-09-06 16:43:48 +09003683 'hw/ufs',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003684 'hw/usb',
3685 'hw/vfio',
John Levon0b3d8812025-06-25 20:29:55 +01003686 'hw/vfio-user',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003687 'hw/virtio',
Alexander Graf11fa0562023-06-14 22:56:23 +00003688 'hw/vmapple',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003689 'hw/watchdog',
3690 'hw/xen',
3691 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003692 'migration',
3693 'net',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003694 'system',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003695 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05003696 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003697 ]
3698endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003699if have_system or have_user
3700 trace_events_subdirs += [
3701 'accel/tcg',
3702 'hw/core',
3703 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02003704 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003705 'target/hppa',
3706 'target/i386',
3707 'target/i386/kvm',
Tianrui Zhaof8447432024-01-05 15:57:59 +08003708 'target/loongarch',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02003709 'target/mips/tcg',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003710 'target/ppc',
3711 'target/riscv',
3712 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08003713 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003714 'target/sparc',
3715 ]
3716endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003717
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003718###################
3719# Collect sources #
3720###################
3721
3722authz_ss = ss.source_set()
3723blockdev_ss = ss.source_set()
3724block_ss = ss.source_set()
3725chardev_ss = ss.source_set()
3726common_ss = ss.source_set()
3727crypto_ss = ss.source_set()
3728hwcore_ss = ss.source_set()
3729io_ss = ss.source_set()
3730qmp_ss = ss.source_set()
3731qom_ss = ss.source_set()
3732system_ss = ss.source_set()
3733specific_fuzz_ss = ss.source_set()
3734specific_ss = ss.source_set()
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02003735rust_devices_ss = ss.source_set()
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003736stub_ss = ss.source_set()
3737trace_ss = ss.source_set()
3738user_ss = ss.source_set()
3739util_ss = ss.source_set()
3740
3741# accel modules
3742qtest_module_ss = ss.source_set()
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003743
3744modules = {}
3745target_modules = {}
Pierrick Bouvier892b06c2025-03-04 22:24:15 +00003746plugin_modules = []
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003747hw_arch = {}
3748target_arch = {}
3749target_system_arch = {}
3750target_user_arch = {}
Pierrick Bouvierd4ecfc52025-03-24 21:59:08 -07003751hw_common_arch = {}
Pierrick Bouvierb2bb3f32025-05-12 11:04:17 -07003752target_common_arch = {}
3753target_common_system_arch = {}
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003754
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +01003755# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
3756# that is filled in by qapi/.
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003757subdir('qapi')
3758subdir('qobject')
3759subdir('stubs')
3760subdir('trace')
3761subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04003762subdir('qom')
3763subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003764subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04003765subdir('ui')
Alex Bennée842b42d2022-09-29 12:42:22 +01003766subdir('gdbstub')
Philippe Mathieu-Daudé68621262024-04-08 17:53:20 +02003767if have_system
3768 subdir('hw')
3769else
3770 subdir('hw/core')
3771endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003772
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003773if enable_modules
3774 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
Akihiko Odaki414b1802024-05-24 17:00:22 +09003775 modulecommon = declare_dependency(objects: libmodulecommon.extract_all_objects(recursive: false), compile_args: '-DBUILD_DSO')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003776endif
3777
Paolo Bonzini1220f582023-08-30 11:52:43 +02003778qom_ss = qom_ss.apply({})
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003779libqom = static_library('qom', qom_ss.sources() + genh,
3780 dependencies: [qom_ss.dependencies()],
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003781 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003782qom = declare_dependency(objects: libqom.extract_all_objects(recursive: false),
3783 dependencies: qom_ss.dependencies())
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003784
3785event_loop_base = files('event-loop-base.c')
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003786event_loop_base = static_library('event-loop-base',
3787 sources: event_loop_base + genh,
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003788 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003789event_loop_base = declare_dependency(objects: event_loop_base.extract_all_objects(recursive: false),
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003790 dependencies: [qom])
3791
Paolo Bonzini1220f582023-08-30 11:52:43 +02003792stub_ss = stub_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003793
3794util_ss.add_all(trace_ss)
Paolo Bonzini1220f582023-08-30 11:52:43 +02003795util_ss = util_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003796libqemuutil = static_library('qemuutil',
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003797 build_by_default: false,
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003798 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6190fd62024-04-08 17:53:13 +02003799 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc])
Steve Sistare57ad6ab2025-01-15 11:00:27 -08003800qemuutil_deps = [event_loop_base]
3801if host_os != 'windows'
3802 qemuutil_deps += [rt]
3803endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003804qemuutil = declare_dependency(link_with: libqemuutil,
Nicolas Saenz Julienne70ac26b2022-04-25 09:57:22 +02003805 sources: genh + version_res,
Steve Sistare57ad6ab2025-01-15 11:00:27 -08003806 dependencies: qemuutil_deps)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003807
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01003808if have_system or have_user
3809 decodetree = generator(find_program('scripts/decodetree.py'),
3810 output: 'decode-@BASENAME@.c.inc',
3811 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3812 subdir('libdecnumber')
3813 subdir('target')
3814endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003815
Paolo Bonzini478e9432020-08-17 12:47:55 +02003816subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04003817subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04003818subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003819subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04003820subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003821
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003822if have_block
3823 block_ss.add(files(
3824 'block.c',
3825 'blockjob.c',
3826 'job.c',
3827 'qemu-io-cmds.c',
3828 ))
Paolo Bonzini406523f2021-10-13 11:43:54 +02003829 if config_host_data.get('CONFIG_REPLICATION')
3830 block_ss.add(files('replication.c'))
3831 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003832
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003833 subdir('nbd')
3834 subdir('scsi')
3835 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003836
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003837 blockdev_ss.add(files(
3838 'blockdev.c',
3839 'blockdev-nbd.c',
3840 'iothread.c',
3841 'job-qmp.c',
Akihiko Odaki7b1070a2024-05-24 17:00:23 +09003842 ))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003843
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003844 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
3845 # os-win32.c does not
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003846 if host_os == 'windows'
Paolo Bonzinidc495492023-08-30 11:29:54 +02003847 system_ss.add(files('os-win32.c'))
Kohei Tokunagaccc403e2025-04-28 15:39:07 +09003848 elif host_os == 'emscripten'
3849 blockdev_ss.add(files('os-wasm.c'))
Paolo Bonzinidc495492023-08-30 11:29:54 +02003850 else
3851 blockdev_ss.add(files('os-posix.c'))
3852 endif
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003853endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02003854
Philippe Mathieu-Daudéfe0007f2023-09-14 20:57:12 +02003855common_ss.add(files('cpu-common.c'))
3856specific_ss.add(files('cpu-target.c'))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003857
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003858subdir('system')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003859
Richard Henderson44b99a62021-03-22 12:24:26 +01003860# Work around a gcc bug/misfeature wherein constant propagation looks
3861# through an alias:
3862# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
3863# to guess that a const variable is always zero. Without lto, this is
3864# impossible, as the alias is restricted to page-vary-common.c. Indeed,
3865# without lto, not even the alias is required -- we simply use different
3866# declarations in different compilation units.
3867pagevary = files('page-vary-common.c')
3868if get_option('b_lto')
3869 pagevary_flags = ['-fno-lto']
3870 if get_option('cfi')
3871 pagevary_flags += '-fno-sanitize=cfi-icall'
3872 endif
Thomas Huth54c9b192022-03-30 13:48:08 +02003873 pagevary = static_library('page-vary-common', sources: pagevary + genh,
Richard Henderson44b99a62021-03-22 12:24:26 +01003874 c_args: pagevary_flags)
3875 pagevary = declare_dependency(link_with: pagevary)
3876endif
3877common_ss.add(pagevary)
Philippe Mathieu-Daudé75bbe6a2023-12-07 10:41:27 +01003878specific_ss.add(files('page-target.c', 'page-vary-target.c'))
Richard Henderson6670d4d2021-03-22 12:24:24 +01003879
Philippe Mathieu-Daudé3d881162025-03-23 12:47:37 +01003880common_ss.add(files('target-info.c'))
Philippe Mathieu-Daudé2b7ae6e2025-04-17 17:59:35 +02003881specific_ss.add(files('target-info-stub.c'))
3882
Marc-André Lureauab318052019-07-24 19:23:16 +04003883subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04003884subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04003885subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003886subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04003887subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04003888subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00003889subdir('semihosting')
Markus Armbrusteraa09b3d2023-01-24 13:19:36 +01003890subdir('stats')
Richard Henderson104cc2c2021-03-08 12:04:33 -08003891subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08003892subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04003893subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003894subdir('plugins')
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003895subdir('ebpf')
3896
Pierrick Bouvier2181b922024-10-23 14:28:11 -07003897if 'CONFIG_TCG' in config_all_accel
3898 subdir('contrib/plugins')
3899endif
3900
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003901common_user_inc = []
3902
3903subdir('common-user')
Marc-André Lureaub309c322019-08-18 19:20:37 +04003904subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04003905subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003906
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003907# needed for fuzzing binaries
3908subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003909subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003910
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003911# accel modules
Richard Hendersona802d5c2025-02-02 13:38:14 -08003912target_modules += { 'accel' : { 'qtest': qtest_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003913
Paolo Bonziniea444d92023-09-08 12:06:12 +02003914##############################################
3915# Internal static_libraries and dependencies #
3916##############################################
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003917
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003918modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003919modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003920modinfo_files = []
3921
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003922block_mods = []
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003923system_mods = []
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003924emulator_modules = []
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003925foreach d, list : modules
Paolo Bonzinief709862023-05-04 10:20:46 +02003926 if not (d == 'block' ? have_block : have_system)
3927 continue
3928 endif
3929
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003930 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003931 if enable_modules
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003932 module_ss.add(modulecommon)
Paolo Bonzini0d665492023-08-31 11:18:24 +02003933 module_ss = module_ss.apply(config_all_devices, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003934 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003935 dependencies: module_ss.dependencies(), pic: true)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003936 if d == 'block'
3937 block_mods += sl
3938 else
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003939 system_mods += sl
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003940 endif
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003941 emulator_modules += shared_module(sl.name(),
3942 name_prefix: '',
Akihiko Odaki414b1802024-05-24 17:00:22 +09003943 objects: sl.extract_all_objects(recursive: false),
3944 dependencies: module_ss.dependencies(),
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003945 install: true,
3946 install_dir: qemu_moddir)
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003947 if module_ss.sources() != []
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003948 modinfo_files += custom_target(d + '-' + m + '.modinfo',
3949 output: d + '-' + m + '.modinfo',
Paolo Bonzini95d31312024-05-24 11:26:54 +02003950 input: sl.extract_all_objects(recursive: true),
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003951 capture: true,
Paolo Bonzini95d31312024-05-24 11:26:54 +02003952 command: [modinfo_collect, '@INPUT@'])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003953 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003954 else
3955 if d == 'block'
3956 block_ss.add_all(module_ss)
3957 else
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003958 system_ss.add_all(module_ss)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003959 endif
3960 endif
3961 endforeach
3962endforeach
3963
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003964foreach d, list : target_modules
3965 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003966 if enable_modules
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003967 module_ss.add(modulecommon)
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003968 foreach target : target_dirs
3969 if target.endswith('-softmmu')
3970 config_target = config_target_mak[target]
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003971 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
Philippe Mathieu-Daudé7d7a21b2023-06-13 16:29:11 +02003972 c_args = ['-DCOMPILING_PER_TARGET',
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003973 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3974 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3975 target_module_ss = module_ss.apply(config_target, strict: false)
3976 if target_module_ss.sources() != []
3977 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3978 sl = static_library(module_name,
3979 [genh, target_module_ss.sources()],
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003980 dependencies: target_module_ss.dependencies(),
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003981 include_directories: target_inc,
3982 c_args: c_args,
3983 pic: true)
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003984 system_mods += sl
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003985 emulator_modules += shared_module(sl.name(),
3986 name_prefix: '',
Akihiko Odaki414b1802024-05-24 17:00:22 +09003987 objects: sl.extract_all_objects(recursive: false),
3988 dependencies: target_module_ss.dependencies(),
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003989 install: true,
3990 install_dir: qemu_moddir)
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003991 modinfo_files += custom_target(module_name + '.modinfo',
3992 output: module_name + '.modinfo',
Paolo Bonzini95d31312024-05-24 11:26:54 +02003993 input: sl.extract_all_objects(recursive: true),
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003994 capture: true,
Paolo Bonzini95d31312024-05-24 11:26:54 +02003995 command: [modinfo_collect, '--target', target, '@INPUT@'])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003996 endif
3997 endif
3998 endforeach
3999 else
4000 specific_ss.add_all(module_ss)
4001 endif
4002 endforeach
4003endforeach
4004
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02004005if enable_modules
Jose R. Ziviani05d68142022-05-28 00:20:35 +02004006 foreach target : target_dirs
4007 if target.endswith('-softmmu')
4008 config_target = config_target_mak[target]
4009 config_devices_mak = target + '-config-devices.mak'
4010 modinfo_src = custom_target('modinfo-' + target + '.c',
4011 output: 'modinfo-' + target + '.c',
4012 input: modinfo_files,
4013 command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
4014 capture: true)
4015
4016 modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
4017 modinfo_dep = declare_dependency(link_with: modinfo_lib)
4018
4019 arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
4020 hw_arch[arch].add(modinfo_dep)
4021 endif
4022 endforeach
Paolo Bonzinifae7a422024-05-24 10:27:21 +02004023
4024 if emulator_modules.length() > 0
4025 alias_target('modules', emulator_modules)
4026 endif
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02004027endif
4028
Marc-André Lureau3154fee2019-08-29 22:07:01 +04004029nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08004030undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04004031block_syms = custom_target('block.syms', output: 'block.syms',
4032 input: [libqemuutil, block_mods],
4033 capture: true,
4034 command: [undefsym, nm, '@INPUT@'])
4035qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02004036 input: [libqemuutil, system_mods],
Marc-André Lureau3154fee2019-08-29 22:07:01 +04004037 capture: true,
4038 command: [undefsym, nm, '@INPUT@'])
4039
Paolo Bonzini1220f582023-08-30 11:52:43 +02004040authz_ss = authz_ss.apply({})
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02004041libauthz = static_library('authz', authz_ss.sources() + genh,
4042 dependencies: [authz_ss.dependencies()],
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02004043 build_by_default: false)
4044
Akihiko Odaki414b1802024-05-24 17:00:22 +09004045authz = declare_dependency(objects: libauthz.extract_all_objects(recursive: false),
4046 dependencies: [authz_ss.dependencies(), qom])
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02004047
Paolo Bonzini1220f582023-08-30 11:52:43 +02004048crypto_ss = crypto_ss.apply({})
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02004049libcrypto = static_library('crypto', crypto_ss.sources() + genh,
4050 dependencies: [crypto_ss.dependencies()],
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02004051 build_by_default: false)
4052
Akihiko Odaki414b1802024-05-24 17:00:22 +09004053crypto = declare_dependency(objects: libcrypto.extract_all_objects(recursive: false),
4054 dependencies: [crypto_ss.dependencies(), authz, qom])
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02004055
Paolo Bonzini1220f582023-08-30 11:52:43 +02004056io_ss = io_ss.apply({})
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02004057libio = static_library('io', io_ss.sources() + genh,
4058 dependencies: [io_ss.dependencies()],
4059 link_with: libqemuutil,
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02004060 build_by_default: false)
4061
Akihiko Odaki414b1802024-05-24 17:00:22 +09004062io = declare_dependency(objects: libio.extract_all_objects(recursive: false),
4063 dependencies: [io_ss.dependencies(), crypto, qom])
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02004064
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02004065libmigration = static_library('migration', sources: migration_files + genh,
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02004066 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09004067migration = declare_dependency(objects: libmigration.extract_all_objects(recursive: false),
Paolo Bonzini70eb5fd2024-05-24 18:16:08 +02004068 dependencies: [qom, io])
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02004069system_ss.add(migration)
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02004070
Paolo Bonzini1220f582023-08-30 11:52:43 +02004071block_ss = block_ss.apply({})
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04004072libblock = static_library('block', block_ss.sources() + genh,
4073 dependencies: block_ss.dependencies(),
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04004074 build_by_default: false)
4075
Akihiko Odaki414b1802024-05-24 17:00:22 +09004076block = declare_dependency(objects: libblock.extract_all_objects(recursive: false),
4077 dependencies: [block_ss.dependencies(), crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04004078
Paolo Bonzini1220f582023-08-30 11:52:43 +02004079blockdev_ss = blockdev_ss.apply({})
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01004080libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
4081 dependencies: blockdev_ss.dependencies(),
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01004082 build_by_default: false)
4083
Akihiko Odaki414b1802024-05-24 17:00:22 +09004084blockdev = declare_dependency(objects: libblockdev.extract_all_objects(recursive: false),
4085 dependencies: [blockdev_ss.dependencies(), block, event_loop_base])
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01004086
Paolo Bonzini1220f582023-08-30 11:52:43 +02004087qmp_ss = qmp_ss.apply({})
Paolo Bonziniff219dc2020-08-04 21:14:26 +02004088libqmp = static_library('qmp', qmp_ss.sources() + genh,
4089 dependencies: qmp_ss.dependencies(),
Paolo Bonziniff219dc2020-08-04 21:14:26 +02004090 build_by_default: false)
4091
Akihiko Odaki414b1802024-05-24 17:00:22 +09004092qmp = declare_dependency(objects: libqmp.extract_all_objects(recursive: false),
4093 dependencies: qmp_ss.dependencies())
Paolo Bonziniff219dc2020-08-04 21:14:26 +02004094
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02004095libchardev = static_library('chardev', chardev_ss.sources() + genh,
Marc-André Lureau22d1f7a2022-03-23 19:57:12 +04004096 dependencies: chardev_ss.dependencies(),
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02004097 build_by_default: false)
4098
Akihiko Odaki414b1802024-05-24 17:00:22 +09004099chardev = declare_dependency(objects: libchardev.extract_all_objects(recursive: false),
Paolo Bonzini41494da2025-02-27 13:34:30 +01004100 dependencies: [chardev_ss.dependencies(), io])
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02004101
Paolo Bonzini1220f582023-08-30 11:52:43 +02004102hwcore_ss = hwcore_ss.apply({})
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02004103libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02004104 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09004105hwcore = declare_dependency(objects: libhwcore.extract_all_objects(recursive: false))
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02004106common_ss.add(hwcore)
4107
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02004108###########
4109# Targets #
4110###########
4111
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02004112system_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004113common_ss.add(qom, qemuutil)
4114
Richard Henderson5983a202025-03-12 14:33:07 -07004115libuser = static_library('user',
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004116 user_ss.all_sources() + genh,
Richard Henderson8916c372025-03-12 20:24:44 -07004117 c_args: ['-DCONFIG_USER_ONLY',
4118 '-DCOMPILING_SYSTEM_VS_USER'],
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004119 include_directories: common_user_inc,
4120 dependencies: user_ss.all_dependencies(),
Richard Henderson5983a202025-03-12 14:33:07 -07004121 build_by_default: false)
Richard Henderson5983a202025-03-12 14:33:07 -07004122
Richard Henderson5983a202025-03-12 14:33:07 -07004123libsystem = static_library('system',
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004124 system_ss.all_sources() + genh,
Richard Henderson8916c372025-03-12 20:24:44 -07004125 c_args: ['-DCONFIG_SOFTMMU',
4126 '-DCOMPILING_SYSTEM_VS_USER'],
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004127 dependencies: system_ss.all_dependencies(),
Richard Henderson5983a202025-03-12 14:33:07 -07004128 build_by_default: false)
Richard Henderson5983a202025-03-12 14:33:07 -07004129
Paolo Bonzini0d665492023-08-31 11:18:24 +02004130# Note that this library is never used directly (only through extract_objects)
4131# and is not built by default; therefore, source files not used by the build
4132# configuration will be in build.ninja, but are never built by default.
Paolo Bonzini2becc362020-02-03 11:42:03 +01004133common_all = static_library('common',
4134 build_by_default: false,
Paolo Bonzini0d665492023-08-31 11:18:24 +02004135 sources: common_ss.all_sources() + genh,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09004136 implicit_include_directories: false,
Paolo Bonzini44081552024-05-24 10:56:55 +02004137 dependencies: common_ss.all_dependencies())
Paolo Bonzini2becc362020-02-03 11:42:03 +01004138
Pierrick Bouvierd4ecfc52025-03-24 21:59:08 -07004139# construct common libraries per base architecture
Pierrick Bouvierb2bb3f32025-05-12 11:04:17 -07004140target_common_arch_libs = {}
4141target_common_system_arch_libs = {}
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004142foreach target_base_arch, config_base_arch : config_base_arch_mak
Pierrick Bouvierb2bb3f32025-05-12 11:04:17 -07004143 target_inc = [include_directories('target' / target_base_arch)]
4144 inc = [common_user_inc + target_inc]
Pierrick Bouvierd4ecfc52025-03-24 21:59:08 -07004145
Pierrick Bouvier34d697f2025-06-02 16:38:01 -07004146 target_common = common_ss.apply(config_base_arch, strict: false)
4147 target_system = system_ss.apply(config_base_arch, strict: false)
4148 target_user = user_ss.apply(config_base_arch, strict: false)
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004149 common_deps = []
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004150 system_deps = []
4151 user_deps = []
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004152 foreach dep: target_common.dependencies()
4153 common_deps += dep.partial_dependency(compile_args: true, includes: true)
4154 endforeach
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004155 foreach dep: target_system.dependencies()
4156 system_deps += dep.partial_dependency(compile_args: true, includes: true)
4157 endforeach
4158 foreach dep: target_user.dependencies()
4159 user_deps += dep.partial_dependency(compile_args: true, includes: true)
4160 endforeach
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004161
Pierrick Bouvierb2bb3f32025-05-12 11:04:17 -07004162 # prevent common code to access cpu compile time definition,
4163 # but still allow access to cpu.h
4164 target_c_args = ['-DCPU_DEFS_H']
4165 target_system_c_args = target_c_args + ['-DCOMPILING_SYSTEM_VS_USER', '-DCONFIG_SOFTMMU']
Pierrick Bouvierd4ecfc52025-03-24 21:59:08 -07004166
Pierrick Bouvierb2bb3f32025-05-12 11:04:17 -07004167 if target_base_arch in target_common_arch
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004168 src = target_common_arch[target_base_arch]
4169 lib = static_library(
Pierrick Bouvierddc25eb2025-05-21 15:34:14 -07004170 'common_' + target_base_arch,
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004171 build_by_default: false,
4172 sources: src.all_sources() + genh,
4173 include_directories: inc,
4174 c_args: target_c_args,
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004175 dependencies: src.all_dependencies() + common_deps +
4176 system_deps + user_deps)
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004177 target_common_arch_libs += {target_base_arch: lib}
Pierrick Bouvierb2bb3f32025-05-12 11:04:17 -07004178 endif
4179
Pierrick Bouvierddc25eb2025-05-21 15:34:14 -07004180 # merge hw_common_arch in target_common_system_arch
4181 if target_base_arch in hw_common_arch
4182 hw_src = hw_common_arch[target_base_arch]
4183 if target_base_arch in target_common_system_arch
4184 target_common_system_arch[target_base_arch].add_all(hw_src)
4185 else
4186 target_common_system_arch += {target_base_arch: hw_src}
Pierrick Bouvierb2bb3f32025-05-12 11:04:17 -07004187 endif
4188 endif
4189
4190 if target_base_arch in target_common_system_arch
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004191 src = target_common_system_arch[target_base_arch]
4192 lib = static_library(
Pierrick Bouvierddc25eb2025-05-21 15:34:14 -07004193 'system_' + target_base_arch,
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004194 build_by_default: false,
4195 sources: src.all_sources() + genh,
4196 include_directories: inc,
4197 c_args: target_system_c_args,
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004198 dependencies: src.all_dependencies() + common_deps + system_deps)
Pierrick Bouvier4fb54de2025-05-21 15:34:08 -07004199 target_common_system_arch_libs += {target_base_arch: lib}
Pierrick Bouvierd4ecfc52025-03-24 21:59:08 -07004200 endif
4201endforeach
4202
Paolo Bonzinie2b39052024-10-18 19:33:22 +02004203if have_rust
Paolo Bonzini1548c5c2025-06-13 14:51:54 +02004204 bindings_incdir = include_directories('.', 'include')
Paolo Bonzinice4a1442024-10-25 09:20:16 +02004205 # We would like to use --generate-cstr, but it is only available
4206 # starting with bindgen 0.66.0. The oldest supported versions
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004207 # is 0.60.x (Debian 12 has 0.60.1) which introduces --allowlist-file.
Paolo Bonzini1548c5c2025-06-13 14:51:54 +02004208 bindgen_args_common = [
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004209 '--disable-header-comment',
4210 '--raw-line', '// @generated',
Paolo Bonzini9f7d4522024-10-24 13:53:59 +02004211 '--ctypes-prefix', 'std::os::raw',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004212 '--generate-block',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004213 '--impl-debug',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004214 '--no-doc-comments',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004215 '--with-derive-default',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004216 '--no-layout-tests',
4217 '--no-prepend-enum-name',
4218 '--allowlist-file', meson.project_source_root() + '/include/.*',
4219 '--allowlist-file', meson.project_source_root() + '/.*',
4220 '--allowlist-file', meson.project_build_root() + '/.*'
4221 ]
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +02004222 if not rustfmt.found()
4223 if bindgen.version().version_compare('<0.65.0')
Paolo Bonzini1548c5c2025-06-13 14:51:54 +02004224 bindgen_args_common += ['--no-rustfmt-bindings']
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +02004225 else
Paolo Bonzini1548c5c2025-06-13 14:51:54 +02004226 bindgen_args_common += ['--formatter', 'none']
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +02004227 endif
4228 endif
Paolo Bonzini131c5842025-02-06 12:15:13 +01004229 if bindgen.version().version_compare('>=0.66.0')
Paolo Bonzini1548c5c2025-06-13 14:51:54 +02004230 bindgen_args_common += ['--rust-target', '1.59']
Paolo Bonzini131c5842025-02-06 12:15:13 +01004231 endif
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004232 if bindgen.version().version_compare('<0.61.0')
4233 # default in 0.61+
Paolo Bonzini1548c5c2025-06-13 14:51:54 +02004234 bindgen_args_common += ['--size_t-is-usize']
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004235 else
Paolo Bonzini1548c5c2025-06-13 14:51:54 +02004236 bindgen_args_common += ['--merge-extern-blocks']
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004237 endif
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004238 subdir('rust')
4239endif
4240
4241
Akihiko Odaki956af7d2023-10-09 17:40:51 +01004242feature_to_c = find_program('scripts/feature_to_c.py')
Paolo Bonzinid1e526c2024-10-15 11:59:14 +02004243rust_root_crate = find_program('scripts/rust/rust_root_crate.sh')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04004244
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004245if host_os == 'darwin'
Philippe Mathieu-Daudé30cfa502022-02-15 17:25:03 +01004246 entitlement = find_program('scripts/entitlement.sh')
4247endif
4248
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004249traceable = []
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04004250emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01004251foreach target : target_dirs
4252 config_target = config_target_mak[target]
4253 target_name = config_target['TARGET_NAME']
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004254 target_base_arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02004255 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004256 arch_deps = []
Philippe Mathieu-Daudé7d7a21b2023-06-13 16:29:11 +02004257 c_args = ['-DCOMPILING_PER_TARGET',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004258 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
Philippe Mathieu-Daudéedbceac2024-12-18 15:36:07 +01004259 ]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04004260 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01004261
4262 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004263 if host_os == 'linux'
Paolo Bonzini2becc362020-02-03 11:42:03 +01004264 target_inc += include_directories('linux-headers', is_system: true)
4265 endif
4266 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01004267 target_type='system'
Philippe Mathieu-Daudé01c85e62023-10-04 11:06:27 +02004268 t = target_system_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004269 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004270 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004271
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004272 hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
Philippe Mathieu-Daudébf964322023-11-21 13:52:48 +01004273 if hw_arch.has_key(hw_dir)
4274 hw = hw_arch[hw_dir].apply(config_target, strict: false)
4275 arch_srcs += hw.sources()
4276 arch_deps += hw.dependencies()
4277 endif
Marc-André Lureau2c442202019-08-17 13:55:58 +04004278
Philippe Mathieu-Daudéedbceac2024-12-18 15:36:07 +01004279 c_args += ['-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzini2becc362020-02-03 11:42:03 +01004280 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004281 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01004282 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04004283 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01004284 target_type='user'
Paolo Bonzinia3a576b2021-12-21 16:23:55 +01004285 target_inc += common_user_inc
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004286 if target_base_arch in target_user_arch
4287 t = target_user_arch[target_base_arch].apply(config_target, strict: false)
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02004288 arch_srcs += t.sources()
4289 arch_deps += t.dependencies()
4290 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01004291 if 'CONFIG_LINUX_USER' in config_target
4292 base_dir = 'linux-user'
Warner Loshe2a74722021-08-03 17:17:17 -06004293 endif
4294 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01004295 base_dir = 'bsd-user'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004296 target_inc += include_directories('bsd-user/' / host_os)
Warner Losh85fc1b52022-01-08 17:27:34 -07004297 target_inc += include_directories('bsd-user/host/' / host_arch)
Warner Loshe2a74722021-08-03 17:17:17 -06004298 dir = base_dir / abi
Warner Losh19bf1292021-11-04 16:34:48 -06004299 arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01004300 endif
4301 target_inc += include_directories(
4302 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04004303 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01004304 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04004305 if 'CONFIG_LINUX_USER' in config_target
4306 dir = base_dir / abi
4307 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
4308 if config_target.has_key('TARGET_SYSTBL_ABI')
4309 arch_srcs += \
4310 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
4311 extra_args : config_target['TARGET_SYSTBL_ABI'])
4312 endif
4313 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01004314 endif
4315
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04004316 if 'TARGET_XML_FILES' in config_target
4317 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
4318 output: target + '-gdbstub-xml.c',
4319 input: files(config_target['TARGET_XML_FILES'].split()),
4320 command: [feature_to_c, '@INPUT@'],
4321 capture: true)
4322 arch_srcs += gdbstub_xml
4323 endif
4324
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004325 t = target_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004326 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004327 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004328
Paolo Bonzini2becc362020-02-03 11:42:03 +01004329 target_common = common_ss.apply(config_target, strict: false)
Pierrick Bouvierd4ecfc52025-03-24 21:59:08 -07004330 objects = [common_all.extract_objects(target_common.sources())]
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004331 arch_deps += target_common.dependencies()
Pierrick Bouvierb2bb3f32025-05-12 11:04:17 -07004332 if target_base_arch in target_common_arch_libs
4333 src = target_common_arch[target_base_arch].apply(config_target, strict: false)
4334 lib = target_common_arch_libs[target_base_arch]
4335 objects += lib.extract_objects(src.sources())
4336 arch_deps += src.dependencies()
4337 endif
Pierrick Bouvierb17b51d2025-05-21 15:34:11 -07004338 if target_type == 'system'
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004339 src = system_ss.apply(config_target, strict: false)
Pierrick Bouvierb17b51d2025-05-21 15:34:11 -07004340 objects += libsystem.extract_objects(src.sources())
4341 arch_deps += src.dependencies()
4342 endif
4343 if target_type == 'user'
Pierrick Bouvier7ca43322025-05-21 15:34:12 -07004344 src = user_ss.apply(config_target, strict: false)
Pierrick Bouvierb17b51d2025-05-21 15:34:11 -07004345 objects += libuser.extract_objects(src.sources())
Pierrick Bouvierd4ecfc52025-03-24 21:59:08 -07004346 arch_deps += src.dependencies()
4347 endif
Pierrick Bouvierb2bb3f32025-05-12 11:04:17 -07004348 if target_type == 'system' and target_base_arch in target_common_system_arch_libs
4349 src = target_common_system_arch[target_base_arch].apply(config_target, strict: false)
4350 lib = target_common_system_arch_libs[target_base_arch]
4351 objects += lib.extract_objects(src.sources())
4352 arch_deps += src.dependencies()
4353 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01004354
Paolo Bonzini2becc362020-02-03 11:42:03 +01004355 target_specific = specific_ss.apply(config_target, strict: false)
4356 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004357 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01004358
Paolo Bonzinie2b39052024-10-18 19:33:22 +02004359 if have_rust and target_type == 'system'
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004360 target_rust = rust_devices_ss.apply(config_target, strict: false)
4361 crates = []
4362 foreach dep : target_rust.dependencies()
4363 crates += dep.get_variable('crate')
4364 endforeach
4365 if crates.length() > 0
4366 rlib_rs = custom_target('rust_' + target.underscorify() + '.rs',
4367 output: 'rust_' + target.underscorify() + '.rs',
Paolo Bonzinid1e526c2024-10-15 11:59:14 +02004368 command: [rust_root_crate, crates],
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004369 capture: true,
4370 build_by_default: true,
4371 build_always_stale: true)
4372 rlib = static_library('rust_' + target.underscorify(),
Paolo Bonzini24090892025-04-05 14:18:17 +02004373 structured_sources([], {'.': rlib_rs}),
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004374 dependencies: target_rust.dependencies(),
4375 override_options: ['rust_std=2021', 'build.rust_std=2021'],
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004376 rust_abi: 'c')
4377 arch_deps += declare_dependency(link_whole: [rlib])
4378 endif
4379 endif
4380
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004381 # allow using headers from the dependencies but do not include the sources,
4382 # because this emulator only needs those in "objects". For external
4383 # dependencies, the full dependency is included below in the executable.
4384 lib_deps = []
4385 foreach dep : arch_deps
4386 lib_deps += dep.partial_dependency(compile_args: true, includes: true)
4387 endforeach
4388
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004389 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02004390 sources: arch_srcs + genh,
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004391 dependencies: lib_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01004392 objects: objects,
4393 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004394 c_args: c_args,
Paolo Bonzini44081552024-05-24 10:56:55 +02004395 build_by_default: false)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004396
4397 if target.endswith('-softmmu')
4398 execs = [{
4399 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004400 'win_subsystem': 'console',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02004401 'sources': files('system/main.c'),
Philippe Mathieu-Daudé51625572024-11-20 12:36:43 +01004402 'dependencies': [sdl]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004403 }]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004404 if host_os == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004405 execs += [{
4406 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004407 'win_subsystem': 'windows',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02004408 'sources': files('system/main.c'),
Philippe Mathieu-Daudé51625572024-11-20 12:36:43 +01004409 'dependencies': [sdl]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004410 }]
4411 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004412 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004413 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
4414 execs += [{
4415 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004416 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004417 'sources': specific_fuzz.sources(),
4418 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004419 }]
4420 endif
4421 else
4422 execs = [{
4423 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004424 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004425 'sources': [],
4426 'dependencies': []
4427 }]
4428 endif
4429 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01004430 exe_name = exe['name']
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004431 if host_os == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01004432 exe_name += '-unsigned'
4433 endif
4434
4435 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09004436 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004437 c_args: c_args,
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004438 dependencies: arch_deps + exe['dependencies'],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004439 objects: lib.extract_all_objects(recursive: true),
Paolo Bonzini05007252024-03-20 11:28:28 +01004440 link_depends: [block_syms, qemu_syms],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004441 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004442 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01004443
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004444 if host_os == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004445 icon = 'pc-bios/qemu.rsrc'
4446 build_input = [emulator, files(icon)]
4447 install_input = [
4448 get_option('bindir') / exe_name,
4449 meson.current_source_dir() / icon
4450 ]
4451 if 'CONFIG_HVF' in config_target
4452 entitlements = 'accel/hvf/entitlements.plist'
4453 build_input += files(entitlements)
4454 install_input += meson.current_source_dir() / entitlements
4455 endif
4456
Alexander Graf8a74ce62021-01-20 23:44:34 +01004457 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004458 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01004459 output: exe['name'],
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01004460 command: [entitlement, '@OUTPUT@', '@INPUT@'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01004461 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09004462
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01004463 meson.add_install_script(entitlement, '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09004464 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004465 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01004466 else
4467 emulators += {exe['name']: emulator}
4468 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04004469
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004470 traceable += [{
4471 'exe': exe['name'],
4472 'probe-prefix': 'qemu.' + target_type + '.' + target_name,
4473 }]
4474
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004475 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01004476endforeach
4477
Paolo Bonzini931049b2020-02-05 09:44:24 +01004478# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004479
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004480if get_option('plugins')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01004481 install_headers('include/qemu/qemu-plugin.h')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004482 if host_os == 'windows'
Greg Manning36fa0772023-11-06 18:51:06 +00004483 # On windows, we want to deliver the qemu_plugin_api.lib file in the qemu installer,
4484 # so that plugin authors can compile against it.
4485 install_data(win32_qemu_plugin_api_lib, install_dir: 'lib')
4486 endif
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01004487endif
4488
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004489subdir('qga')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02004490
Laurent Vivier9755c942020-08-24 17:24:30 +02004491# Don't build qemu-keymap if xkbcommon is not explicitly enabled
4492# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02004493if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04004494 # used for the update-keymaps target, so include rules even if !have_tools
4495 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
4496 dependencies: [qemuutil, xkbcommon], install: have_tools)
4497endif
4498
Paolo Bonzini931049b2020-02-05 09:44:24 +01004499if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004500 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004501 link_args: '@block.syms', link_depends: block_syms,
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004502 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
4503 qemu_io = executable('qemu-io', files('qemu-io.c'),
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004504 link_args: '@block.syms', link_depends: block_syms,
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004505 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01004506 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004507 link_args: '@block.syms', link_depends: block_syms,
Akihiko Odaki7b1070a2024-05-24 17:00:23 +09004508 dependencies: [blockdev, qemuutil, selinux],
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004509 install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004510
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02004511 subdir('storage-daemon')
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004512
4513 foreach exe: [ 'qemu-img', 'qemu-io', 'qemu-nbd', 'qemu-storage-daemon']
4514 traceable += [{
4515 'exe': exe,
4516 'probe-prefix': 'qemu.' + exe.substring(5).replace('-', '_')
4517 }]
4518 endforeach
4519
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04004520 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02004521
Marc-André Lureau157e7b12019-07-15 14:50:58 +04004522 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
Steve Sistare57ad6ab2025-01-15 11:00:27 -08004523 dependencies: [qemuutil, rt],
Marc-André Lureau157e7b12019-07-15 14:50:58 +04004524 install: true)
4525
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004526 if have_vhost_user
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02004527 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02004528 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04004529 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02004530 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01004531 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004532
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004533 if host_os == 'linux'
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004534 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
4535 dependencies: [qemuutil, libcap_ng],
4536 install: true,
4537 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004538
4539 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
4540 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02004541 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004542 install: true)
Anthony Harivel84369d72024-05-22 17:34:51 +02004543
4544 if cpu in ['x86', 'x86_64']
4545 executable('qemu-vmsr-helper', files('tools/i386/qemu-vmsr-helper.c'),
4546 dependencies: [authz, crypto, io, qom, qemuutil,
4547 libcap_ng, mpathpersist],
4548 install: true)
4549 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004550 endif
4551
Paolo Bonziniccd250a2021-06-03 12:50:17 +02004552 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04004553 subdir('contrib/ivshmem-client')
4554 subdir('contrib/ivshmem-server')
4555 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01004556endif
4557
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004558if stap.found()
4559 foreach t: traceable
4560 foreach stp: [
4561 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / t['exe'], 'install': false},
4562 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / t['exe'], 'install': true},
4563 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
4564 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
4565 ]
4566 cmd = [
4567 tracetool, '--group=all', '--format=' + stp['fmt'],
4568 '--binary=' + stp['bin'],
4569 '--probe-prefix=' + t['probe-prefix'],
4570 '@INPUT@', '@OUTPUT@'
4571 ]
4572
4573 custom_target(t['exe'] + stp['ext'],
4574 input: trace_events_all,
4575 output: t['exe'] + stp['ext'],
4576 install: stp['install'],
4577 install_dir: get_option('datadir') / 'systemtap/tapset',
4578 command: cmd,
4579 depend_files: tracetool_depends)
4580 endforeach
4581 endforeach
4582endif
4583
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04004584subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004585subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04004586subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02004587subdir('docs')
Kohei Tokunagaccc403e2025-04-28 15:39:07 +09004588# Tests are disabled on emscripten because they rely on host features that aren't
4589# supported by emscripten (e.g. fork and unix socket).
4590if host_os != 'emscripten'
4591 subdir('tests')
4592endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01004593if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04004594 subdir('po')
4595endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004596
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004597if host_machine.system() == 'windows'
4598 nsis_cmd = [
4599 find_program('scripts/nsis.py'),
4600 '@OUTPUT@',
4601 get_option('prefix'),
4602 meson.current_source_dir(),
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02004603 glib_pc.get_variable('bindir'),
Stefan Weil24bdcc92020-11-25 20:18:33 +01004604 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004605 '--',
4606 '-DDISPLAYVERSION=' + meson.project_version(),
4607 ]
4608 if build_docs
4609 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
4610 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01004611 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004612 nsis_cmd += '-DCONFIG_GTK=y'
4613 endif
4614
4615 nsis = custom_target('nsis',
4616 output: 'qemu-setup-' + meson.project_version() + '.exe',
4617 input: files('qemu.nsi'),
4618 build_always_stale: true,
4619 command: nsis_cmd + ['@INPUT@'])
4620 alias_target('installer', nsis)
4621endif
4622
Paolo Bonzinia0c91622020-10-07 11:01:51 -04004623#########################
4624# Configuration summary #
4625#########################
4626
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004627# Build environment
Paolo Bonzinif9332752020-02-03 13:28:38 +01004628summary_info = {}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004629summary_info += {'Build directory': meson.current_build_dir()}
4630summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004631summary_info += {'Download dependencies': get_option('wrap_mode') != 'nodownload'}
4632summary(summary_info, bool_yn: true, section: 'Build environment')
4633
4634# Directories
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004635summary_info += {'Install prefix': get_option('prefix')}
4636summary_info += {'BIOS directory': qemu_datadir}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004637pathsep = host_os == 'windows' ? ';' : ':'
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09004638summary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004639summary_info += {'binary directory': get_option('prefix') / get_option('bindir')}
4640summary_info += {'library directory': get_option('prefix') / get_option('libdir')}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004641summary_info += {'module directory': qemu_moddir}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004642summary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
4643summary_info += {'include directory': get_option('prefix') / get_option('includedir')}
4644summary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004645if host_os != 'windows'
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004646 summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
4647 summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004648else
4649 summary_info += {'local state directory': 'queried at runtime'}
4650endif
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004651summary_info += {'Doc directory': get_option('prefix') / get_option('docdir')}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004652summary(summary_info, bool_yn: true, section: 'Directories')
4653
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004654# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004655summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004656summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004657summary_info += {'sphinx-build': sphinx_build}
Paolo Bonzinib4d61d32023-09-28 12:00:48 +02004658
4659# FIXME: the [binaries] section of machine files, which can be probed
4660# with find_program(), would be great for passing gdb and genisoimage
4661# paths from configure to Meson. However, there seems to be no way to
4662# hide a program (for example if gdb is too old).
Paolo Bonzinia47dd5c2023-09-28 10:44:56 +02004663if config_host.has_key('GDB')
4664 summary_info += {'gdb': config_host['GDB']}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004665endif
Paolo Bonzini40c909f2022-04-20 17:33:49 +02004666summary_info += {'iasl': iasl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004667summary_info += {'genisoimage': config_host['GENISOIMAGE']}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004668if host_os == 'windows' and have_ga
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004669 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004670endif
Thomas Huth58902582022-04-08 18:20:47 +02004671if slirp.found() and have_system
Paolo Bonzini35acbb32021-10-13 13:43:36 +02004672 summary_info += {'smbd': have_slirp_smbd ? smbd_path : false}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004673endif
4674summary(summary_info, bool_yn: true, section: 'Host binaries')
4675
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004676# Configurable features
4677summary_info = {}
4678summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004679summary_info += {'system-mode emulation': have_system}
4680summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004681summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004682summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini60027112022-10-20 14:53:10 +02004683summary_info += {'module support': enable_modules}
4684if enable_modules
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02004685 summary_info += {'alternative module path': get_option('module_upgrades')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004686endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004687summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004688if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02004689 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004690endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02004691summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
4692if 'simple' in get_option('trace_backends')
4693 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004694endif
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004695summary_info += {'QOM debugging': get_option('qom_cast_debug')}
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004696summary_info += {'Relocatable install': get_option('relocatable')}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004697summary_info += {'vhost-kernel support': have_vhost_kernel}
4698summary_info += {'vhost-net support': have_vhost_net}
4699summary_info += {'vhost-user support': have_vhost_user}
4700summary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004701summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004702summary_info += {'vhost-vdpa support': have_vhost_vdpa}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004703summary_info += {'build guest agent': have_ga}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004704summary(summary_info, bool_yn: true, section: 'Configurable features')
4705
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004706# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004707summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004708summary_info += {'host CPU': cpu}
4709summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01004710summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
4711summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Thomas Huth785abf02023-07-06 08:47:36 +02004712if 'cpp' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004713 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004714else
4715 summary_info += {'C++ compiler': false}
4716endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004717if 'objc' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004718 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004719else
4720 summary_info += {'Objective-C compiler': false}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004721endif
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03004722summary_info += {'Rust support': have_rust}
4723if have_rust
Paolo Bonzini1a6ef6f2024-10-03 16:28:45 +03004724 summary_info += {'Rust target': config_host['RUST_TARGET_TRIPLE']}
Paolo Bonzinie2b39052024-10-18 19:33:22 +02004725 summary_info += {'rustc': ' '.join(rustc.cmd_array())}
4726 summary_info += {'rustc version': rustc.version()}
Paolo Bonzini53de9662025-05-02 19:06:43 +02004727 summary_info += {'rustdoc': rustdoc}
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004728 summary_info += {'bindgen': bindgen.full_path()}
4729 summary_info += {'bindgen version': bindgen.version()}
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03004730endif
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004731option_cflags = (get_option('debug') ? ['-g'] : [])
4732if get_option('optimization') != 'plain'
4733 option_cflags += ['-O' + get_option('optimization')]
4734endif
4735summary_info += {'CFLAGS': ' '.join(get_option('c_args') + option_cflags)}
Thomas Huth785abf02023-07-06 08:47:36 +02004736if 'cpp' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004737 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args') + option_cflags)}
Paolo Bonzini47b30832020-09-23 05:26:17 -04004738endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004739if 'objc' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004740 summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args') + option_cflags)}
Philippe Mathieu-Daudée910c7d2022-01-08 22:38:55 +01004741endif
Thomas Huth785abf02023-07-06 08:47:36 +02004742link_args = get_option('c_link_args')
Paolo Bonzini47b30832020-09-23 05:26:17 -04004743if link_args.length() > 0
4744 summary_info += {'LDFLAGS': ' '.join(link_args)}
4745endif
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004746summary_info += {'QEMU_CFLAGS': ' '.join(qemu_common_flags + qemu_cflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004747if 'cpp' in all_languages
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004748 summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_common_flags + qemu_cxxflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004749endif
4750if 'objc' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +01004751 summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_common_flags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004752endif
Paolo Bonzinid0651772022-04-20 17:33:34 +02004753summary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)}
Daniele Buonocdad7812020-12-04 18:06:11 -05004754summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004755summary_info += {'PIE': get_option('b_pie')}
Paolo Bonzinie58e55d2023-06-07 10:00:21 +02004756summary_info += {'static build': get_option('prefer_static')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004757summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinib87df902021-11-08 13:52:11 +01004758summary_info += {'membarrier': have_membarrier}
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04004759summary_info += {'debug graph lock': get_option('debug_graph_lock')}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004760summary_info += {'debug stack usage': get_option('debug_stack_usage')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004761summary_info += {'mutex debugging': get_option('debug_mutex')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004762summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01004763summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
ling xu04ffce12022-11-16 23:29:22 +08004764summary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004765summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzini34f983d2023-01-09 15:31:51 +01004766summary_info += {'thread sanitizer': get_option('tsan')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004767summary_info += {'CFI support': get_option('cfi')}
4768if get_option('cfi')
4769 summary_info += {'CFI debug support': get_option('cfi_debug')}
4770endif
4771summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004772summary_info += {'sparse': sparse}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004773summary_info += {'mingw32 support': host_os == 'windows'}
Paolo Bonzini12640f02022-06-06 11:48:47 +02004774summary(summary_info, bool_yn: true, section: 'Compilation')
Alex Bennée49e85652021-02-22 10:14:50 +00004775
4776# snarf the cross-compilation information for tests
Paolo Bonzini12640f02022-06-06 11:48:47 +02004777summary_info = {}
4778have_cross = false
Alex Bennée49e85652021-02-22 10:14:50 +00004779foreach target: target_dirs
Paolo Bonzinic7022a72022-09-29 12:42:07 +01004780 tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak'
Alex Bennée49e85652021-02-22 10:14:50 +00004781 if fs.exists(tcg_mak)
4782 config_cross_tcg = keyval.load(tcg_mak)
Alex Bennée85b141e2022-05-27 16:35:34 +01004783 if 'CC' in config_cross_tcg
Paolo Bonzini12640f02022-06-06 11:48:47 +02004784 summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
4785 have_cross = true
Alex Bennée49e85652021-02-22 10:14:50 +00004786 endif
Paolo Bonzini12640f02022-06-06 11:48:47 +02004787 endif
Alex Bennée49e85652021-02-22 10:14:50 +00004788endforeach
Paolo Bonzini12640f02022-06-06 11:48:47 +02004789if have_cross
4790 summary(summary_info, bool_yn: true, section: 'Cross compilers')
4791endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004792
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004793# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004794summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004795if have_system
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004796 summary_info += {'KVM support': config_all_accel.has_key('CONFIG_KVM')}
4797 summary_info += {'HVF support': config_all_accel.has_key('CONFIG_HVF')}
4798 summary_info += {'WHPX support': config_all_accel.has_key('CONFIG_WHPX')}
4799 summary_info += {'NVMM support': config_all_accel.has_key('CONFIG_NVMM')}
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02004800 summary_info += {'Xen support': xen.found()}
4801 if xen.found()
4802 summary_info += {'xen ctrl version': xen.version()}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004803 endif
Paolo Bonzini0d665492023-08-31 11:18:24 +02004804 summary_info += {'Xen emulation': config_all_devices.has_key('CONFIG_XEN_EMU')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004805endif
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004806summary_info += {'TCG support': config_all_accel.has_key('CONFIG_TCG')}
4807if config_all_accel.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004808 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +01004809 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004810 else
4811 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
4812 endif
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004813 summary_info += {'TCG plugins': get_option('plugins')}
Paolo Bonzini1d558c92023-08-28 11:48:30 +02004814 summary_info += {'TCG debug enabled': get_option('debug_tcg')}
Ilya Leoshkevich1f2355f2024-03-12 01:23:30 +01004815 if have_linux_user or have_bsd_user
4816 summary_info += {'syscall buffer debugging support': get_option('debug_remap')}
4817 endif
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004818endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004819summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004820if have_system
4821 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01004822 summary_info += {'out of process emulation': multiprocess_allowed}
Jagannathan Raman55116962022-06-13 16:26:24 -04004823 summary_info += {'vfio-user server': vfio_user_server_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004824endif
4825summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
4826
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004827# Block layer
4828summary_info = {}
Paolo Bonzini67398252022-10-12 13:19:35 +02004829summary_info += {'coroutine backend': coroutine_backend}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004830summary_info += {'coroutine pool': have_coroutine_pool}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004831if have_block
Paolo Bonzini622d64f2022-04-20 17:33:53 +02004832 summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
4833 summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004834 summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
Christian Schoenebeck38877022023-05-11 16:12:34 +02004835 summary_info += {'VirtFS (9P) support': have_virtfs}
Paolo Bonzini406523f2021-10-13 11:43:54 +02004836 summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004837 summary_info += {'bochs support': get_option('bochs').allowed()}
4838 summary_info += {'cloop support': get_option('cloop').allowed()}
4839 summary_info += {'dmg support': get_option('dmg').allowed()}
4840 summary_info += {'qcow v1 support': get_option('qcow1').allowed()}
4841 summary_info += {'vdi support': get_option('vdi').allowed()}
Vladimir Sementsov-Ogievskiy11cea422023-04-21 12:27:58 +03004842 summary_info += {'vhdx support': get_option('vhdx').allowed()}
4843 summary_info += {'vmdk support': get_option('vmdk').allowed()}
4844 summary_info += {'vpc support': get_option('vpc').allowed()}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004845 summary_info += {'vvfat support': get_option('vvfat').allowed()}
4846 summary_info += {'qed support': get_option('qed').allowed()}
4847 summary_info += {'parallels support': get_option('parallels').allowed()}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004848 summary_info += {'FUSE exports': fuse}
Xie Yongji2a2359b2022-05-23 16:46:09 +08004849 summary_info += {'VDUSE block exports': have_vduse_blk_export}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004850endif
4851summary(summary_info, bool_yn: true, section: 'Block layer support')
4852
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004853# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004854summary_info = {}
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02004855summary_info += {'TLS priority': get_option('tls_priority')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004856summary_info += {'GNUTLS support': gnutls}
4857if gnutls.found()
4858 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
4859endif
4860summary_info += {'libgcrypt': gcrypt}
4861summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02004862if nettle.found()
4863 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004864endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08004865summary_info += {'SM4 ALG support': crypto_sm4}
liequan ched078da82024-10-30 08:51:46 +00004866summary_info += {'SM3 ALG support': crypto_sm3}
Paolo Bonzini34b52612021-11-08 14:02:42 +01004867summary_info += {'AF_ALG support': have_afalg}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004868summary_info += {'rng-none': get_option('rng_none')}
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02004869summary_info += {'Linux keyring': have_keyring}
Thomas Huthc64023b2023-08-24 11:42:08 +02004870summary_info += {'Linux keyutils': keyutils}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004871summary(summary_info, bool_yn: true, section: 'Crypto')
4872
Thomas Huth9e48afa2023-06-02 19:18:30 +02004873# UI
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004874summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004875if host_os == 'darwin'
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03004876 summary_info += {'Cocoa support': cocoa}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004877endif
Thomas Huthc6d82df2025-03-25 06:51:25 +01004878summary_info += {'D-Bus display': dbus_display}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004879summary_info += {'SDL support': sdl}
4880summary_info += {'SDL image support': sdl_image}
4881summary_info += {'GTK support': gtk}
4882summary_info += {'pixman': pixman}
4883summary_info += {'VTE support': vte}
Kshitij Suri95f85102022-04-08 07:13:34 +00004884summary_info += {'PNG support': png}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004885summary_info += {'VNC support': vnc}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01004886if vnc.found()
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004887 summary_info += {'VNC SASL support': sasl}
4888 summary_info += {'VNC JPEG support': jpeg}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004889endif
Thomas Huth9e48afa2023-06-02 19:18:30 +02004890summary_info += {'spice protocol support': spice_protocol}
4891if spice_protocol.found()
4892 summary_info += {' spice server support': spice}
4893endif
4894summary_info += {'curses support': curses}
4895summary_info += {'brlapi support': brlapi}
4896summary(summary_info, bool_yn: true, section: 'User interface')
4897
Alex Bennéef705c1f2023-12-22 11:48:46 +00004898# Graphics backends
4899summary_info = {}
4900summary_info += {'VirGL support': virgl}
4901summary_info += {'Rutabaga support': rutabaga}
4902summary(summary_info, bool_yn: true, section: 'Graphics backends')
4903
Thomas Huthaece7232023-06-02 19:18:32 +02004904# Audio backends
4905summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004906if host_os not in ['darwin', 'haiku', 'windows']
Paolo Bonzini87430d52021-10-07 15:06:09 +02004907 summary_info += {'OSS support': oss}
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02004908 summary_info += {'sndio support': sndio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004909elif host_os == 'darwin'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004910 summary_info += {'CoreAudio support': coreaudio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004911elif host_os == 'windows'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004912 summary_info += {'DirectSound support': dsound}
4913endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004914if host_os == 'linux'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004915 summary_info += {'ALSA support': alsa}
4916 summary_info += {'PulseAudio support': pulse}
4917endif
Marc-André Lureau20c51242023-05-06 20:37:26 +04004918summary_info += {'PipeWire support': pipewire}
Paolo Bonzini87430d52021-10-07 15:06:09 +02004919summary_info += {'JACK support': jack}
Thomas Huthaece7232023-06-02 19:18:32 +02004920summary(summary_info, bool_yn: true, section: 'Audio backends')
4921
Thomas Huthc3527c52023-06-02 19:18:31 +02004922# Network backends
Thomas Huth9e48afa2023-06-02 19:18:30 +02004923summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004924if host_os == 'darwin'
Thomas Huth9e48afa2023-06-02 19:18:30 +02004925 summary_info += {'vmnet.framework support': vmnet}
4926endif
Ilya Maximetscb039ef2023-09-13 20:34:37 +02004927summary_info += {'AF_XDP support': libxdp}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004928summary_info += {'slirp support': slirp}
Paolo Bonzinie1723992021-10-07 15:08:21 +02004929summary_info += {'vde support': vde}
Paolo Bonzini837b84b2021-10-07 15:08:22 +02004930summary_info += {'netmap support': have_netmap}
Thomas Hutheea94532021-10-28 20:59:08 +02004931summary_info += {'l2tpv3 support': have_l2tpv3}
Thomas Huthc3527c52023-06-02 19:18:31 +02004932summary(summary_info, bool_yn: true, section: 'Network backends')
4933
4934# Libraries
4935summary_info = {}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004936summary_info += {'libtasn1': tasn1}
4937summary_info += {'PAM': pam}
4938summary_info += {'iconv support': iconv}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004939summary_info += {'blkio support': blkio}
4940summary_info += {'curl support': curl}
4941summary_info += {'Multipath support': mpathpersist}
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02004942summary_info += {'Linux AIO support': libaio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004943summary_info += {'Linux io_uring support': linux_io_uring}
4944summary_info += {'ATTR/XATTR support': libattr}
Paolo Bonzini3730a732022-04-20 17:33:41 +02004945summary_info += {'RDMA support': rdma}
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01004946summary_info += {'fdt support': fdt_opt == 'internal' ? 'internal' : fdt}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004947summary_info += {'libcap-ng support': libcap_ng}
4948summary_info += {'bpf support': libbpf}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004949summary_info += {'rbd support': rbd}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004950summary_info += {'smartcard support': cacard}
4951summary_info += {'U2F support': u2f}
4952summary_info += {'libusb': libusb}
4953summary_info += {'usb net redir': usbredir}
Paolo Bonzini88b6e612022-04-20 17:33:40 +02004954summary_info += {'OpenGL support (epoxy)': opengl}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004955summary_info += {'GBM': gbm}
4956summary_info += {'libiscsi support': libiscsi}
4957summary_info += {'libnfs support': libnfs}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004958if host_os == 'windows'
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004959 if have_ga
Marc-André Lureau8821a382022-02-01 16:53:43 +04004960 summary_info += {'QGA VSS support': have_qga_vss}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01004961 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01004962endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004963summary_info += {'seccomp support': seccomp}
4964summary_info += {'GlusterFS support': glusterfs}
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02004965summary_info += {'hv-balloon support': hv_balloon}
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01004966summary_info += {'TPM support': have_tpm}
Thomas Huthe6a52b32021-12-09 15:48:01 +01004967summary_info += {'libssh support': libssh}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004968summary_info += {'lzo support': lzo}
4969summary_info += {'snappy support': snappy}
4970summary_info += {'bzip2 support': libbzip2}
4971summary_info += {'lzfse support': liblzfse}
4972summary_info += {'zstd support': zstd}
Yuan Liub844a2c2024-06-10 18:21:06 +08004973summary_info += {'Query Processing Library support': qpl}
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01004974summary_info += {'UADK Library support': uadk}
Bryan Zhange28ed312024-08-30 16:27:19 -07004975summary_info += {'qatzip support': qatzip}
Paolo Bonzini488a8c72021-12-21 12:38:27 +01004976summary_info += {'NUMA host support': numa}
Thomas Huth83602082022-05-16 16:58:23 +02004977summary_info += {'capstone': capstone}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004978summary_info += {'libpmem support': libpmem}
4979summary_info += {'libdaxctl support': libdaxctl}
Dorjoy Chowdhurybb154e32024-10-09 03:17:23 +06004980summary_info += {'libcbor support': libcbor}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004981summary_info += {'libudev': libudev}
4982# Dummy dependency, keep .found()
Max Reitzdf4ea702020-10-27 20:05:46 +01004983summary_info += {'FUSE lseek': fuse_lseek.found()}
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004984summary_info += {'selinux': selinux}
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01004985summary_info += {'libdw': libdw}
Ilya Leoshkevicha1a98002024-02-06 01:22:03 +01004986if host_os == 'freebsd'
4987 summary_info += {'libinotify-kqueue': inotify}
4988endif
Paolo Bonzinid50ea7f2025-02-20 14:20:27 +01004989if host_os == 'darwin'
4990 summary_info += {'ParavirtualizedGraphics support': pvg}
4991endif
Daniel P. Berrangé6b1c7442025-04-25 13:17:12 +01004992summary_info += {'valgrind': valgrind}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01004993summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004994
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004995if host_arch == 'unknown'
Paolo Bonzinif9332752020-02-03 13:28:38 +01004996 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004997 warning('UNSUPPORTED HOST CPU')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004998 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004999 message('Support for CPU host architecture ' + cpu + ' is not currently')
5000 message('maintained. The QEMU project does not guarantee that QEMU will')
5001 message('compile or work on this host CPU. You can help by volunteering')
5002 message('to maintain it and providing a build host for our continuous')
5003 message('integration setup.')
Paolo Bonzinie3c426c2022-05-09 12:50:29 +02005004 if have_tcg
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02005005 message()
5006 message('configure has succeeded and you can continue to build, but')
5007 message('QEMU will use a slow interpreter to emulate the target CPU.')
5008 endif
Richard Henderson6d701c92025-01-27 16:22:24 -08005009elif host_long_bits < 64
Paolo Bonzini14ed29d2024-10-27 14:07:01 +01005010 message()
5011 warning('DEPRECATED HOST CPU')
5012 message()
Richard Henderson6d701c92025-01-27 16:22:24 -08005013 message('Support for 32-bit CPU host architecture ' + cpu + ' is going')
5014 message('to be dropped in a future QEMU release.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01005015endif
5016
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01005017if not supported_oses.contains(host_os)
Paolo Bonzinif9332752020-02-03 13:28:38 +01005018 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02005019 warning('UNSUPPORTED HOST OS')
Paolo Bonzinif9332752020-02-03 13:28:38 +01005020 message()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01005021 message('Support for host OS ' + host_os + 'is not currently maintained.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01005022 message('configure has succeeded and you can continue to build, but')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02005023 message('the QEMU project does not guarantee that QEMU will compile or')
5024 message('work on this operating system. You can help by volunteering')
5025 message('to maintain it and providing a build host for our continuous')
5026 message('integration setup. This will ensure that future versions of QEMU')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01005027 message('will keep working on ' + host_os + '.')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02005028endif
5029
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01005030if host_arch == 'unknown' or not supported_oses.contains(host_os)
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02005031 message()
5032 message('If you want to help supporting QEMU on this platform, please')
5033 message('contact the developers at qemu-devel@nongnu.org.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01005034endif
Paolo Bonzini655e2a72023-10-05 14:19:34 +02005035
5036actually_reloc = get_option('relocatable')
5037# check if get_relocated_path() is actually able to relocate paths
5038if get_option('relocatable') and \
5039 not (get_option('prefix') / get_option('bindir')).startswith(get_option('prefix') / '')
5040 message()
5041 warning('bindir not included within prefix, the installation will not be relocatable.')
5042 actually_reloc = false
5043endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01005044if not actually_reloc and (host_os == 'windows' or get_option('relocatable'))
5045 if host_os == 'windows'
Paolo Bonzini655e2a72023-10-05 14:19:34 +02005046 message()
5047 warning('Windows installs should usually be relocatable.')
5048 endif
5049 message()
5050 message('QEMU will have to be installed under ' + get_option('prefix') + '.')
5051 message('Use --disable-relocatable to remove this warning.')
5052endif