blob: 7f75256acf96b993fdd6569bc9e1e1f2d6468020 [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']
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040053supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Philippe Mathieu-Daudé278c1bc2023-06-27 16:32:34 +020054supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
Richard Henderson6d0b52e2022-10-17 08:00:57 +030055 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64']
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 Bonzini4fe14692024-10-15 09:50:02 +020097 if rustc.version().version_compare('<1.63.0')
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +030098 if get_option('rust').enabled()
Paolo Bonzini4fe14692024-10-15 09:50:02 +020099 error('rustc version ' + rustc.version() + ' is unsupported. Please upgrade to at least 1.63.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.')
102 message('Please upgrade to at least 1.63.0 to use Rust.')
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +0300103 have_rust = false
104 endif
105 endif
106endif
Paolo Bonzini44458a62023-09-08 12:06:57 +0200107
Paolo Bonzinic2988df2024-10-15 15:00:41 +0200108if have_rust
109 bindgen = find_program('bindgen', required: get_option('rust'))
110 if not bindgen.found() or bindgen.version().version_compare('<0.60.0')
111 if get_option('rust').enabled()
112 error('bindgen version ' + bindgen.version() + ' is unsupported. You can install a new version with "cargo install bindgen-cli"')
113 else
114 if bindgen.found()
115 warning('bindgen version ' + bindgen.version() + ' is unsupported, disabling Rust compilation.')
116 else
117 warning('bindgen not found, disabling Rust compilation.')
118 endif
119 message('To use Rust you can install a new version with "cargo install bindgen-cli"')
120 have_rust = false
121 endif
122 endif
123endif
124
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +0200125if have_rust
Paolo Bonzini97ed1e92024-11-07 10:02:15 +0100126 rustc_args = [find_program('scripts/rust/rustc_args.py'),
Paolo Bonzini90868c32024-11-06 13:03:45 +0100127 '--rustc-version', rustc.version(),
128 '--workspace', meson.project_source_root() / 'rust']
Paolo Bonzinide98c172024-11-07 10:14:49 +0100129 if get_option('strict_rust_lints')
130 rustc_args += ['--strict-lints']
131 endif
132
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +0200133 rustfmt = find_program('rustfmt', required: false)
Paolo Bonzinif3a6e9b2024-11-12 11:54:11 +0100134
Paolo Bonzini90868c32024-11-06 13:03:45 +0100135 rustc_lint_args = run_command(rustc_args, '--lints',
136 capture: true, check: true).stdout().strip().splitlines()
Paolo Bonzinif3a6e9b2024-11-12 11:54:11 +0100137
Paolo Bonzinif3a6e9b2024-11-12 11:54:11 +0100138 # Apart from procedural macros, our Rust executables will often link
139 # with C code, so include all the libraries that C code needs. This
140 # is safe; https://github.com/rust-lang/rust/pull/54675 says that
141 # passing -nodefaultlibs to the linker "was more ideological to
142 # start with than anything".
143 add_project_arguments(rustc_lint_args +
144 ['--cfg', 'MESON', '-C', 'default-linker-libraries'],
145 native: false, language: 'rust')
146 add_project_arguments(rustc_lint_args + ['--cfg', 'MESON'],
147 native: true, language: 'rust')
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +0200148endif
149
Paolo Bonzini44458a62023-09-08 12:06:57 +0200150dtrace = not_found
151stap = not_found
152if 'dtrace' in get_option('trace_backends')
153 dtrace = find_program('dtrace', required: true)
154 stap = find_program('stap', required: false)
155 if stap.found()
156 # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
157 # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
158 # instead. QEMU --enable-modules depends on this because the SystemTap
159 # semaphores are linked into the main binary and not the module's shared
160 # object.
161 add_global_arguments('-DSTAP_SDT_V2',
162 native: false, language: all_languages)
163 endif
164endif
165
166if get_option('iasl') == ''
167 iasl = find_program('iasl', required: false)
168else
169 iasl = find_program(get_option('iasl'), required: true)
170endif
171
Xianglai Lib883fb92024-07-24 10:22:45 +0800172edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu', 'riscv64-softmmu', 'loongarch64-softmmu' ]
Paolo Bonzini44458a62023-09-08 12:06:57 +0200173unpack_edk2_blobs = false
174foreach target : edk2_targets
175 if target in target_dirs
176 bzip2 = find_program('bzip2', required: get_option('install_blobs'))
177 unpack_edk2_blobs = bzip2.found()
178 break
179 endif
180endforeach
181
182#####################
183# Option validation #
184#####################
185
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100186# Fuzzing
187if get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
188 not cc.links('''
189 #include <stdint.h>
190 #include <sys/types.h>
191 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
192 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
193 ''',
194 args: ['-Werror', '-fsanitize=fuzzer'])
195 error('Your compiler does not support -fsanitize=fuzzer')
196endif
197
198# Tracing backends
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100199if 'ftrace' in get_option('trace_backends') and host_os != 'linux'
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100200 error('ftrace is supported only on Linux')
201endif
202if 'syslog' in get_option('trace_backends') and not cc.compiles('''
203 #include <syslog.h>
204 int main(void) {
205 openlog("qemu", LOG_PID, LOG_DAEMON);
206 syslog(LOG_INFO, "configure");
207 return 0;
208 }''')
209 error('syslog is not supported on this system')
210endif
211
212# Miscellaneous Linux-only features
213get_option('mpath') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100214 .require(host_os == 'linux', error_message: 'Multipath is supported only on Linux')
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100215
216multiprocess_allowed = get_option('multiprocess') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100217 .require(host_os == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100218 .allowed()
219
220vfio_user_server_allowed = get_option('vfio_user_server') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100221 .require(host_os == 'linux', error_message: 'vfio-user server is supported only on Linux') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100222 .allowed()
223
224have_tpm = get_option('tpm') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100225 .require(host_os != 'windows', error_message: 'TPM emulation only available on POSIX systems') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100226 .allowed()
227
228# vhost
229have_vhost_user = get_option('vhost_user') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100230 .disable_auto_if(host_os != 'linux') \
231 .require(host_os != 'windows',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100232 error_message: 'vhost-user is not available on Windows').allowed()
233have_vhost_vdpa = get_option('vhost_vdpa') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100234 .require(host_os == 'linux',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100235 error_message: 'vhost-vdpa is only available on Linux').allowed()
236have_vhost_kernel = get_option('vhost_kernel') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100237 .require(host_os == 'linux',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100238 error_message: 'vhost-kernel is only available on Linux').allowed()
239have_vhost_user_crypto = get_option('vhost_crypto') \
240 .require(have_vhost_user,
241 error_message: 'vhost-crypto requires vhost-user to be enabled').allowed()
242
243have_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel
244
245have_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed()
246have_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed()
247have_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed()
248have_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa
249
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200250have_tools = get_option('tools') \
251 .disable_auto_if(not have_system) \
252 .allowed()
253have_ga = get_option('guest_agent') \
254 .disable_auto_if(not have_system and not have_tools) \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100255 .require(host_os in ['sunos', 'linux', 'windows', 'freebsd', 'netbsd', 'openbsd'],
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200256 error_message: 'unsupported OS for QEMU guest agent') \
257 .allowed()
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100258have_block = have_system or have_tools
259
Paolo Bonzini60027112022-10-20 14:53:10 +0200260enable_modules = get_option('modules') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100261 .require(host_os != 'windows',
Paolo Bonzini60027112022-10-20 14:53:10 +0200262 error_message: 'Modules are not available for Windows') \
263 .require(not get_option('prefer_static'),
264 error_message: 'Modules are incompatible with static linking') \
265 .allowed()
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200266
Paolo Bonziniea444d92023-09-08 12:06:12 +0200267#######################################
268# Variables for host and accelerators #
269#######################################
270
Paolo Bonzini823eb012021-11-08 14:18:17 +0100271if cpu not in supported_cpus
272 host_arch = 'unknown'
273elif cpu == 'x86'
274 host_arch = 'i386'
Richard Henderson0e3ed772021-12-31 05:25:11 +0000275elif cpu == 'mips64'
276 host_arch = 'mips'
Philippe Mathieu-Daudé278c1bc2023-06-27 16:32:34 +0200277elif cpu in ['riscv32', 'riscv64']
278 host_arch = 'riscv'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100279else
280 host_arch = cpu
281endif
282
Richard Henderson33614fa2025-02-03 12:28:59 -0800283if cpu == 'x86'
284 kvm_targets = ['i386-softmmu']
285elif cpu == 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400286 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
287elif cpu == 'aarch64'
288 kvm_targets = ['aarch64-softmmu']
289elif cpu == 's390x'
290 kvm_targets = ['s390x-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800291elif cpu == 'ppc'
292 kvm_targets = ['ppc-softmmu']
293elif cpu == 'ppc64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400294 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800295elif cpu == 'mips'
296 kvm_targets = ['mips-softmmu', 'mipsel-softmmu']
297elif cpu == 'mips64'
Huacai Chenfbc58842020-10-07 16:39:28 +0800298 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800299elif cpu == 'riscv32'
Philippe Mathieu-Daudé4de81092023-06-27 16:32:35 +0200300 kvm_targets = ['riscv32-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800301elif cpu == 'riscv64'
Philippe Mathieu-Daudé4de81092023-06-27 16:32:35 +0200302 kvm_targets = ['riscv64-softmmu']
Richard Henderson33614fa2025-02-03 12:28:59 -0800303elif cpu == 'loongarch64'
Tianrui Zhao714b03c2024-01-05 15:58:04 +0800304 kvm_targets = ['loongarch64-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400305else
306 kvm_targets = []
307endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400308accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alexander Graf844a06b2021-09-16 17:54:02 +0200309
Richard Henderson807a85d2025-02-04 08:16:36 -0800310if cpu == 'x86'
311 xen_targets = ['i386-softmmu']
312elif cpu == 'x86_64'
Paolo Bonzini16b62732023-12-09 15:31:15 +0100313 xen_targets = ['i386-softmmu', 'x86_64-softmmu']
Richard Henderson807a85d2025-02-04 08:16:36 -0800314elif cpu == 'arm'
315 # i386 emulator provides xenpv machine type for multiple architectures
316 xen_targets = ['i386-softmmu']
317elif cpu == 'aarch64'
Paolo Bonzini16b62732023-12-09 15:31:15 +0100318 # i386 emulator provides xenpv machine type for multiple architectures
319 xen_targets = ['i386-softmmu', 'x86_64-softmmu', 'aarch64-softmmu']
320else
321 xen_targets = []
322endif
323accelerator_targets += { 'CONFIG_XEN': xen_targets }
324
Richard Henderson83ef4862025-02-04 08:20:42 -0800325if cpu == 'aarch64'
Alexander Graf844a06b2021-09-16 17:54:02 +0200326 accelerator_targets += {
327 'CONFIG_HVF': ['aarch64-softmmu']
328 }
Richard Henderson83ef4862025-02-04 08:20:42 -0800329elif cpu == 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400330 accelerator_targets += {
Paolo Bonzini8a199802020-09-18 05:37:01 -0400331 'CONFIG_HVF': ['x86_64-softmmu'],
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200332 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400333 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
334 }
335endif
336
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400337##################
338# Compiler flags #
339##################
340
Paolo Bonzini13f60de2022-10-20 14:34:27 +0200341foreach lang : all_languages
342 compiler = meson.get_compiler(lang)
343 if compiler.get_id() == 'gcc' and compiler.version().version_compare('>=7.4')
344 # ok
345 elif compiler.get_id() == 'clang' and compiler.compiles('''
346 #ifdef __apple_build_version__
Thomas Huth4e035202024-11-26 09:10:54 +0100347 # if __clang_major__ < 15 || (__clang_major__ == 15 && __clang_minor__ < 0)
348 # error You need at least XCode Clang v15.0 to compile QEMU
Paolo Bonzini13f60de2022-10-20 14:34:27 +0200349 # endif
350 #else
351 # if __clang_major__ < 10 || (__clang_major__ == 10 && __clang_minor__ < 0)
352 # error You need at least Clang v10.0 to compile QEMU
353 # endif
354 #endif''')
355 # ok
356 else
Thomas Huth4e035202024-11-26 09:10:54 +0100357 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 +0200358 endif
359endforeach
360
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200361# default flags for all hosts
362# We use -fwrapv to tell the compiler that we require a C dialect where
363# left shift of signed integers is well defined and has the expected
364# 2s-complement style results. (Both clang and gcc agree that it
365# provides these semantics.)
366
367qemu_common_flags = [
368 '-D_GNU_SOURCE', '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE_SOURCE',
369 '-fno-strict-aliasing', '-fno-common', '-fwrapv' ]
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200370qemu_cflags = []
Paolo Bonzini911d4ca2022-10-12 12:46:23 +0200371qemu_ldflags = []
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100372
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100373if host_os == 'darwin'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200374 # Disable attempts to use ObjectiveC features in os/object.h since they
375 # won't work when we're compiling with gcc as a C compiler.
Alexander Graf2fc36532023-08-30 16:14:14 +0000376 if compiler.get_id() == 'gcc'
377 qemu_common_flags += '-DOS_OBJECT_USE_OBJC=0'
378 endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100379elif host_os == 'sunos'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200380 # needed for CMSG_ macros in sys/socket.h
381 qemu_common_flags += '-D_XOPEN_SOURCE=600'
382 # needed for TIOCWIN* defines in termios.h
383 qemu_common_flags += '-D__EXTENSIONS__'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100384elif host_os == 'haiku'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200385 qemu_common_flags += ['-DB_USE_POSITIVE_POSIX_ERRORS', '-D_BSD_SOURCE', '-fPIC']
Pierrick Bouvier923710b2025-01-16 16:02:54 +0000386elif host_os == 'windows'
387 # plugins use delaylib, and clang needs to be used with lld to make it work.
388 if compiler.get_id() == 'clang' and compiler.get_linker_id() != 'ld.lld'
389 error('On windows, you need to use lld with clang - use msys2 clang64/clangarm64 env')
390 endif
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200391endif
392
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200393# Choose instruction set (currently x86-only)
394
395qemu_isa_flags = []
396
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200397# __sync_fetch_and_and requires at least -march=i486. Many toolchains
398# use i686 as default anyway, but for those that don't, an explicit
399# specification is necessary
400if host_arch == 'i386' and not cc.links('''
401 static int sfaa(int *ptr)
402 {
403 return __sync_fetch_and_and(ptr, 0);
404 }
405
406 int main(void)
407 {
408 int val = 42;
409 val = __sync_val_compare_and_swap(&val, 0, 1);
410 sfaa(&val);
411 return val;
412 }''')
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200413 qemu_isa_flags += ['-march=i486']
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200414endif
415
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200416# Pick x86-64 baseline version
Paolo Bonzini294ac642024-05-31 10:37:06 +0200417if host_arch in ['i386', 'x86_64']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200418 if get_option('x86_version') == '0' and host_arch == 'x86_64'
419 error('x86_64-v1 required for x86-64 hosts')
420 endif
421
422 # add flags for individual instruction set extensions
423 if get_option('x86_version') >= '1'
424 if host_arch == 'i386'
425 qemu_common_flags = ['-mfpmath=sse'] + qemu_common_flags
426 else
427 # present on basically all processors but technically not part of
428 # x86-64-v1, so only include -mneeded for x86-64 version 2 and above
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200429 qemu_isa_flags += ['-mcx16']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200430 endif
431 endif
432 if get_option('x86_version') >= '2'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200433 qemu_isa_flags += ['-mpopcnt']
434 qemu_isa_flags += cc.get_supported_arguments('-mneeded')
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200435 endif
436 if get_option('x86_version') >= '3'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200437 qemu_isa_flags += ['-mmovbe', '-mabm', '-mbmi', '-mbmi2', '-mfma', '-mf16c']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200438 endif
439
440 # add required vector instruction set (each level implies those below)
441 if get_option('x86_version') == '1'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200442 qemu_isa_flags += ['-msse2']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200443 elif get_option('x86_version') == '2'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200444 qemu_isa_flags += ['-msse4.2']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200445 elif get_option('x86_version') == '3'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200446 qemu_isa_flags += ['-mavx2']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200447 elif get_option('x86_version') == '4'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200448 qemu_isa_flags += ['-mavx512f', '-mavx512bw', '-mavx512cd', '-mavx512dq', '-mavx512vl']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200449 endif
Artyom Kunakovskyc2bf2cc2024-05-23 08:11:18 +0300450endif
451
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200452qemu_common_flags = qemu_isa_flags + qemu_common_flags
453
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +0200454if get_option('prefer_static')
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100455 qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
456endif
457
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200458# Meson currently only handles pie as a boolean for now, so if the user
459# has explicitly disabled PIE we need to extend our cflags.
Paolo Bonzinib03fcd62023-05-22 10:05:33 +0200460#
461# -no-pie is supposedly a linker flag that has no effect on the compiler
462# command line, but some distros, that didn't quite know what they were
463# doing, made local changes to gcc's specs file that turned it into
464# a compiler command-line flag.
465#
466# What about linker flags? For a static build, no PIE is implied by -static
467# which we added above (and if it's not because of the same specs patching,
468# there's nothing we can do: compilation will fail, report a bug to your
469# distro and do not use --disable-pie in the meanwhile). For dynamic linking,
470# instead, we can't add -no-pie because it overrides -shared: the linker then
471# tries to build an executable instead of a shared library and fails. So
472# don't add -no-pie anywhere and cross fingers. :(
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200473if not get_option('b_pie')
Paolo Bonzinib03fcd62023-05-22 10:05:33 +0200474 qemu_common_flags += cc.get_supported_arguments('-fno-pie', '-no-pie')
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200475endif
476
Paolo Bonzini911d4ca2022-10-12 12:46:23 +0200477if not get_option('stack_protector').disabled()
478 stack_protector_probe = '''
479 int main(int argc, char *argv[])
480 {
481 char arr[64], *p = arr, *c = argv[argc - 1];
482 while (*c) {
483 *p++ = *c++;
484 }
485 return 0;
486 }'''
487 have_stack_protector = false
488 foreach arg : ['-fstack-protector-strong', '-fstack-protector-all']
489 # We need to check both a compile and a link, since some compiler
490 # setups fail only on a .c->.o compile and some only at link time
491 if cc.compiles(stack_protector_probe, args: ['-Werror', arg]) and \
492 cc.links(stack_protector_probe, args: ['-Werror', arg])
493 have_stack_protector = true
494 qemu_cflags += arg
495 qemu_ldflags += arg
496 break
497 endif
498 endforeach
499 get_option('stack_protector') \
500 .require(have_stack_protector, error_message: 'Stack protector not supported')
501endif
502
Paolo Bonzini67398252022-10-12 13:19:35 +0200503coroutine_backend = get_option('coroutine_backend')
504ucontext_probe = '''
505 #include <ucontext.h>
506 #ifdef __stub_makecontext
507 #error Ignoring glibc stub makecontext which will always fail
508 #endif
509 int main(void) { makecontext(0, 0, 0); return 0; }'''
510
511# On Windows the only valid backend is the Windows specific one.
512# For POSIX prefer ucontext, but it's not always possible. The fallback
513# is sigcontext.
514supported_backends = []
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100515if host_os == 'windows'
Paolo Bonzini67398252022-10-12 13:19:35 +0200516 supported_backends += ['windows']
517else
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100518 if host_os != 'darwin' and cc.links(ucontext_probe)
Paolo Bonzini67398252022-10-12 13:19:35 +0200519 supported_backends += ['ucontext']
520 endif
521 supported_backends += ['sigaltstack']
522endif
523
524if coroutine_backend == 'auto'
525 coroutine_backend = supported_backends[0]
526elif coroutine_backend not in supported_backends
527 error('"@0@" backend requested but not available. Available backends: @1@' \
528 .format(coroutine_backend, ', '.join(supported_backends)))
529endif
530
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200531# Compiles if SafeStack *not* enabled
532safe_stack_probe = '''
533 int main(void)
534 {
535 #if defined(__has_feature)
536 #if __has_feature(safe_stack)
537 #error SafeStack Enabled
538 #endif
539 #endif
540 return 0;
541 }'''
542if get_option('safe_stack') != not cc.compiles(safe_stack_probe)
543 safe_stack_arg = get_option('safe_stack') ? '-fsanitize=safe-stack' : '-fno-sanitize=safe-stack'
544 if get_option('safe_stack') != not cc.compiles(safe_stack_probe, args: safe_stack_arg)
545 error(get_option('safe_stack') \
546 ? 'SafeStack not supported by your compiler' \
547 : 'Cannot disable SafeStack')
548 endif
549 qemu_cflags += safe_stack_arg
550 qemu_ldflags += safe_stack_arg
551endif
Paolo Bonzini67398252022-10-12 13:19:35 +0200552if get_option('safe_stack') and coroutine_backend != 'ucontext'
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200553 error('SafeStack is only supported with the ucontext coroutine backend')
554endif
555
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000556if get_option('asan')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100557 if cc.has_argument('-fsanitize=address')
558 qemu_cflags = ['-fsanitize=address'] + qemu_cflags
559 qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000560 else
561 error('Your compiler does not support -fsanitize=address')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100562 endif
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000563endif
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100564
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000565if get_option('ubsan')
566 # Detect static linking issue with ubsan:
567 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100568 if cc.links('int main(int argc, char **argv) { return argc + 1; }',
569 args: [qemu_ldflags, '-fsanitize=undefined'])
Richard Hendersondb770a22024-08-13 19:52:16 +1000570 qemu_cflags += ['-fsanitize=undefined']
571 qemu_ldflags += ['-fsanitize=undefined']
572
573 # Suppress undefined behaviour from function call to mismatched type.
574 # In addition, tcg prologue does not emit function type prefix
575 # required by function call sanitizer.
576 if cc.has_argument('-fno-sanitize=function')
577 qemu_cflags += ['-fno-sanitize=function']
578 endif
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000579 else
580 error('Your compiler does not support -fsanitize=undefined')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100581 endif
582endif
583
584# Thread sanitizer is, for now, much noisier than the other sanitizers;
585# keep it separate until that is not the case.
586if get_option('tsan')
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000587 if get_option('asan') or get_option('ubsan')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100588 error('TSAN is not supported with other sanitizers')
589 endif
590 if not cc.has_function('__tsan_create_fiber',
591 args: '-fsanitize=thread',
592 prefix: '#include <sanitizer/tsan_interface.h>')
593 error('Cannot enable TSAN due to missing fiber annotation interface')
594 endif
Pierrick Bouviercf6fbba2024-10-23 12:33:52 +0100595 tsan_warn_suppress = []
596 # gcc (>=11) will report constructions not supported by tsan:
597 # "error: ‘atomic_thread_fence’ is not supported with ‘-fsanitize=thread’"
598 # https://gcc.gnu.org/gcc-11/changes.html
599 # However, clang does not support this warning and this triggers an error.
600 if cc.has_argument('-Wno-tsan')
601 tsan_warn_suppress = ['-Wno-tsan']
602 endif
603 qemu_cflags = ['-fsanitize=thread'] + tsan_warn_suppress + qemu_cflags
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100604 qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags
605endif
606
Alex Bennée563b1a32025-03-06 16:16:31 +0000607if get_option('debug') and get_option('split_debug')
608 qemu_cflags += '-gsplit-dwarf'
609endif
610
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100611# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
612# The combination is known as "full relro", because .got.plt is read-only too.
613qemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
614
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100615if host_os == 'windows'
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200616 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat')
Paolo Bonzini2d73fa72022-11-02 13:03:51 +0100617 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200618endif
619
Paolo Bonzini537b7242021-10-07 15:08:12 +0200620if get_option('fuzzing')
Paolo Bonzini537b7242021-10-07 15:08:12 +0200621 # Specify a filter to only instrument code that is directly related to
622 # virtual-devices.
623 configure_file(output: 'instrumentation-filter',
624 input: 'scripts/oss-fuzz/instrumentation-filter-template',
625 copy: true)
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400626
627 if cc.compiles('int main () { return 0; }',
628 name: '-fsanitize-coverage-allowlist=/dev/null',
Alexander Bulekove56d0972022-06-21 16:45:07 -0400629 args: ['-fsanitize-coverage-allowlist=/dev/null',
630 '-fsanitize-coverage=trace-pc'] )
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200631 qemu_common_flags += ['-fsanitize-coverage-allowlist=instrumentation-filter']
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400632 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +0200633
634 if get_option('fuzzing_engine') == ''
635 # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
636 # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link
637 # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
638 # unable to bind the fuzzer-related callbacks added by instrumentation.
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200639 qemu_common_flags += ['-fsanitize=fuzzer-no-link']
640 qemu_ldflags += ['-fsanitize=fuzzer-no-link']
Paolo Bonzini537b7242021-10-07 15:08:12 +0200641 # For the actual fuzzer binaries, we need to link against the libfuzzer
642 # library. They need to be configurable, to support OSS-Fuzz
643 fuzz_exe_ldflags = ['-fsanitize=fuzzer']
644 else
645 # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
646 # the needed CFLAGS have already been provided
647 fuzz_exe_ldflags = get_option('fuzzing_engine').split()
648 endif
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400649endif
650
Paolo Bonzini82761292023-05-10 14:54:30 +0200651if get_option('cfi')
652 cfi_flags=[]
653 # Check for dependency on LTO
654 if not get_option('b_lto')
655 error('Selected Control-Flow Integrity but LTO is disabled')
656 endif
657 if enable_modules
658 error('Selected Control-Flow Integrity is not compatible with modules')
659 endif
660 # Check for cfi flags. CFI requires LTO so we can't use
661 # get_supported_arguments, but need a more complex "compiles" which allows
662 # custom arguments
663 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
664 args: ['-flto', '-fsanitize=cfi-icall'] )
665 cfi_flags += '-fsanitize=cfi-icall'
666 else
667 error('-fsanitize=cfi-icall is not supported by the compiler')
668 endif
669 if cc.compiles('int main () { return 0; }',
670 name: '-fsanitize-cfi-icall-generalize-pointers',
671 args: ['-flto', '-fsanitize=cfi-icall',
672 '-fsanitize-cfi-icall-generalize-pointers'] )
673 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
674 else
675 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
676 endif
677 if get_option('cfi_debug')
678 if cc.compiles('int main () { return 0; }',
679 name: '-fno-sanitize-trap=cfi-icall',
680 args: ['-flto', '-fsanitize=cfi-icall',
681 '-fno-sanitize-trap=cfi-icall'] )
682 cfi_flags += '-fno-sanitize-trap=cfi-icall'
683 else
684 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
685 endif
686 endif
687 add_global_arguments(cfi_flags, native: false, language: all_languages)
688 add_global_link_arguments(cfi_flags, native: false, language: all_languages)
689endif
690
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000691# Check further flags that make QEMU more robust against malicious parties
692
693hardening_flags = [
Daniel P. Berrangé7ff9ff032024-01-03 12:34:14 +0000694 # Initialize all stack variables to zero. This makes
695 # it harder to take advantage of uninitialized stack
696 # data to drive exploits
697 '-ftrivial-auto-var-init=zero',
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000698]
699
Daniel P. Berrangé95633112024-03-04 14:44:55 +0000700# Zero out registers used during a function call
701# upon its return. This makes it harder to assemble
702# ROP gadgets into something usable
703#
704# NB: Clang 17 is broken and SEGVs
705# https://github.com/llvm/llvm-project/issues/75168
Thomas Huth2d6d9952024-04-11 14:08:19 +0200706#
707# NB2: This clashes with the "retguard" extension of OpenBSD's Clang
708# https://gitlab.com/qemu-project/qemu/-/issues/2278
709if host_os != 'openbsd' and \
710 cc.compiles('extern struct { void (*cb)(void); } s; void f(void) { s.cb(); }',
Daniel P. Berrangé95633112024-03-04 14:44:55 +0000711 name: '-fzero-call-used-regs=used-gpr',
712 args: ['-O2', '-fzero-call-used-regs=used-gpr'])
713 hardening_flags += '-fzero-call-used-regs=used-gpr'
714endif
715
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000716qemu_common_flags += cc.get_supported_arguments(hardening_flags)
717
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200718add_global_arguments(qemu_common_flags, native: false, language: all_languages)
719add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
720
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100721# Collect warning flags we want to set, sorted alphabetically
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100722warn_flags = [
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100723 # First enable interesting warnings
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100724 '-Wempty-body',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100725 '-Wendif-labels',
726 '-Wexpansion-to-defined',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100727 '-Wformat-security',
728 '-Wformat-y2k',
729 '-Wignored-qualifiers',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100730 '-Wimplicit-fallthrough=2',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100731 '-Winit-self',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100732 '-Wmissing-format-attribute',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100733 '-Wmissing-prototypes',
734 '-Wnested-externs',
735 '-Wold-style-declaration',
736 '-Wold-style-definition',
737 '-Wredundant-decls',
738 '-Wshadow=local',
739 '-Wstrict-prototypes',
740 '-Wtype-limits',
741 '-Wundef',
Peter Maydell64c1a542024-02-21 17:26:36 +0100742 '-Wvla',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100743 '-Wwrite-strings',
744
745 # Then disable some undesirable warnings
746 '-Wno-gnu-variable-sized-type-not-at-end',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100747 '-Wno-initializer-overrides',
748 '-Wno-missing-include-dirs',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100749 '-Wno-psabi',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100750 '-Wno-shift-negative-value',
751 '-Wno-string-plus-int',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100752 '-Wno-tautological-type-limit-compare',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100753 '-Wno-typedef-redefinition',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100754]
755
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100756if host_os != 'darwin'
Kevin Wolf7e171112024-06-27 20:12:45 +0200757 tsa_has_cleanup = cc.compiles('''
758 struct __attribute__((capability("mutex"))) mutex {};
759 void lock(struct mutex *m) __attribute__((acquire_capability(m)));
760 void unlock(struct mutex *m) __attribute__((release_capability(m)));
761
762 void test(void) {
763 struct mutex __attribute__((cleanup(unlock))) m;
764 lock(&m);
765 }
766 ''', args: ['-Wthread-safety', '-Werror'])
767 if tsa_has_cleanup
768 warn_flags += ['-Wthread-safety']
769 endif
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100770endif
771
Thomas Huth785abf02023-07-06 08:47:36 +0200772# Set up C++ compiler flags
Paolo Bonzinib4854582021-11-08 12:31:52 +0100773qemu_cxxflags = []
Paolo Bonzinie5134022022-10-12 14:15:06 +0200774if 'cpp' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100775 qemu_cxxflags = ['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'] + qemu_cflags
Paolo Bonzinib4854582021-11-08 12:31:52 +0100776endif
777
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200778add_project_arguments(qemu_cflags, native: false, language: 'c')
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100779add_project_arguments(cc.get_supported_arguments(warn_flags), native: false, language: 'c')
780if 'cpp' in all_languages
781 add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
782 add_project_arguments(cxx.get_supported_arguments(warn_flags), native: false, language: 'cpp')
783endif
784if 'objc' in all_languages
785 # Note sanitizer flags are not applied to Objective-C sources!
786 add_project_arguments(objc.get_supported_arguments(warn_flags), native: false, language: 'objc')
787endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100788if host_os == 'linux'
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400789 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
790 '-isystem', 'linux-headers',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200791 language: all_languages)
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400792endif
793
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100794add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400795 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400796 '-iquote', meson.current_source_dir() / 'include',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200797 language: all_languages)
Paolo Bonzinia5665052019-06-10 12:05:14 +0200798
Richard Henderson44fc7162023-05-17 17:48:34 -0700799# If a host-specific include directory exists, list that first...
800host_include = meson.current_source_dir() / 'host/include/'
801if fs.is_dir(host_include / host_arch)
802 add_project_arguments('-iquote', host_include / host_arch,
803 language: all_languages)
804endif
805# ... followed by the generic fallback.
806add_project_arguments('-iquote', host_include / 'generic',
807 language: all_languages)
808
Paolo Bonzinideb62372020-09-01 07:51:16 -0400809sparse = find_program('cgcc', required: get_option('sparse'))
810if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100811 run_target('sparse',
812 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400813 'compile_commands.json', sparse.full_path(), '-Wbitwise',
814 '-Wno-transparent-union', '-Wno-old-initializer',
815 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100816endif
817
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200818#####################################
819# Host-specific libraries and flags #
820#####################################
821
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200822libm = cc.find_library('m', required: false)
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +0200823threads = dependency('threads')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400824util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200825winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400826socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400827version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400828coref = []
829iokit = []
Phil Dennis-Jordan23521592023-06-14 22:57:33 +0000830pvg = not_found
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400831emulator_link_args = []
Marc-André Lureau23011f42022-02-01 12:55:21 +0400832midl = not_found
833widl = not_found
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900834pathcch = not_found
Paolo Bonzinia6305082021-10-07 15:08:15 +0200835host_dsosuf = '.so'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100836if host_os == 'windows'
Marc-André Lureau23011f42022-02-01 12:55:21 +0400837 midl = find_program('midl', required: false)
838 widl = find_program('widl', required: false)
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900839 pathcch = cc.find_library('pathcch')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400840 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200841 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400842
843 win = import('windows')
844 version_res = win.compile_resources('version.rc',
845 depend_files: files('pc-bios/qemu-nsis.ico'),
846 include_directories: include_directories('.'))
Paolo Bonzinia6305082021-10-07 15:08:15 +0200847 host_dsosuf = '.dll'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100848elif host_os == 'darwin'
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400849 coref = dependency('appleframeworks', modules: 'CoreFoundation')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700850 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
Paolo Bonzinia6305082021-10-07 15:08:15 +0200851 host_dsosuf = '.dylib'
Paolo Bonzinid50ea7f2025-02-20 14:20:27 +0100852 pvg = dependency('appleframeworks', modules: ['ParavirtualizedGraphics', 'Metal'],
853 required: get_option('pvg'))
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100854elif host_os == 'sunos'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200855 socket = [cc.find_library('socket'),
856 cc.find_library('nsl'),
857 cc.find_library('resolv')]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100858elif host_os == 'haiku'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200859 socket = [cc.find_library('posix_error_mapper'),
860 cc.find_library('network'),
861 cc.find_library('bsd')]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100862elif host_os == 'openbsd'
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100863 if get_option('tcg').allowed() and target_dirs.length() > 0
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400864 # Disable OpenBSD W^X if available
865 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
866 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400867endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200868
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200869###############################################
870# Host-specific configuration of accelerators #
871###############################################
872
Paolo Bonzini8a199802020-09-18 05:37:01 -0400873accelerators = []
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100874if get_option('kvm').allowed() and host_os == 'linux'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400875 accelerators += 'CONFIG_KVM'
876endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100877if get_option('whpx').allowed() and host_os == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000878 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400879 error('WHPX requires 64-bit host')
Philippe Mathieu-Daudé641b8412023-06-24 15:31:44 +0200880 elif cc.has_header('winhvplatform.h', required: get_option('whpx')) and \
881 cc.has_header('winhvemulation.h', required: get_option('whpx'))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400882 accelerators += 'CONFIG_WHPX'
883 endif
884endif
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200885
886hvf = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100887if get_option('hvf').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400888 hvf = dependency('appleframeworks', modules: 'Hypervisor',
889 required: get_option('hvf'))
890 if hvf.found()
891 accelerators += 'CONFIG_HVF'
892 endif
893endif
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200894
895nvmm = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100896if host_os == 'netbsd'
nia0cc49652021-10-13 13:54:17 +0000897 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200898 if nvmm.found()
899 accelerators += 'CONFIG_NVMM'
900 endif
901endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100902
Paolo Bonzini823eb012021-11-08 14:18:17 +0100903tcg_arch = host_arch
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100904if get_option('tcg').allowed()
Paolo Bonzini823eb012021-11-08 14:18:17 +0100905 if host_arch == 'unknown'
Paolo Bonzinia24f15d2023-08-04 11:29:05 +0200906 if not get_option('tcg_interpreter')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400907 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
908 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100909 elif get_option('tcg_interpreter')
Philippe Mathieu-Daudé1c282da2021-05-21 12:34:23 +0200910 warning('Use of the TCG interpreter is not recommended on this host')
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100911 warning('architecture. There is a native TCG execution backend available')
912 warning('which provides substantially better performance and reliability.')
913 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
914 warning('configuration option on this architecture to use the native')
915 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400916 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100917 if get_option('tcg_interpreter')
918 tcg_arch = 'tci'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100919 elif host_arch == 'x86_64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100920 tcg_arch = 'i386'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100921 elif host_arch == 'ppc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100922 tcg_arch = 'ppc'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100923 endif
924 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzinie5134022022-10-12 14:15:06 +0200925 language: all_languages)
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100926
Paolo Bonzini8a199802020-09-18 05:37:01 -0400927 accelerators += 'CONFIG_TCG'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400928endif
929
930if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
931 error('KVM not available on this platform')
932endif
933if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
934 error('HVF not available on this platform')
935endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200936if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
937 error('NVMM not available on this platform')
938endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400939if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
940 error('WHPX not available on this platform')
941endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400942
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200943xen = not_found
944if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
945 xencontrol = dependency('xencontrol', required: false,
946 method: 'pkg-config')
947 if xencontrol.found()
948 xen_pc = declare_dependency(version: xencontrol.version(),
949 dependencies: [
950 xencontrol,
951 # disabler: true makes xen_pc.found() return false if any is not found
952 dependency('xenstore', required: false,
953 method: 'pkg-config',
954 disabler: true),
955 dependency('xenforeignmemory', required: false,
956 method: 'pkg-config',
957 disabler: true),
958 dependency('xengnttab', required: false,
959 method: 'pkg-config',
960 disabler: true),
961 dependency('xenevtchn', required: false,
962 method: 'pkg-config',
963 disabler: true),
964 dependency('xendevicemodel', required: false,
965 method: 'pkg-config',
966 disabler: true),
967 # optional, no "disabler: true"
968 dependency('xentoolcore', required: false,
969 method: 'pkg-config')])
970 if xen_pc.found()
971 xen = xen_pc
972 endif
973 endif
974 if not xen.found()
975 xen_tests = [ '4.11.0', '4.10.0', '4.9.0', '4.8.0', '4.7.1' ]
976 xen_libs = {
977 '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
978 '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
979 '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
980 '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
981 '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
982 }
983 xen_deps = {}
984 foreach ver: xen_tests
985 # cache the various library tests to avoid polluting the logs
986 xen_test_deps = []
987 foreach l: xen_libs[ver]
988 if l not in xen_deps
989 xen_deps += { l: cc.find_library(l, required: false) }
990 endif
991 xen_test_deps += xen_deps[l]
992 endforeach
993
994 # Use -D to pick just one of the test programs in scripts/xen-detect.c
995 xen_version = ver.split('.')
996 xen_ctrl_version = xen_version[0] + \
997 ('0' + xen_version[1]).substring(-2) + \
998 ('0' + xen_version[2]).substring(-2)
999 if cc.links(files('scripts/xen-detect.c'),
1000 args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
1001 dependencies: xen_test_deps)
1002 xen = declare_dependency(version: ver, dependencies: xen_test_deps)
1003 break
1004 endif
1005 endforeach
1006 endif
1007 if xen.found()
1008 accelerators += 'CONFIG_XEN'
1009 elif get_option('xen').enabled()
1010 error('could not compile and link Xen test program')
1011 endif
1012endif
1013have_xen_pci_passthrough = get_option('xen_pci_passthrough') \
1014 .require(xen.found(),
1015 error_message: 'Xen PCI passthrough requested but Xen not enabled') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001016 .require(host_os == 'linux',
Paolo Bonzini0f63d962023-09-08 12:08:53 +02001017 error_message: 'Xen PCI passthrough not available on this platform') \
1018 .require(cpu == 'x86' or cpu == 'x86_64',
1019 error_message: 'Xen PCI passthrough not available on this platform') \
1020 .allowed()
1021
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001022################
1023# Dependencies #
1024################
1025
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001026# When bumping glib minimum version, please check also whether to increase
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03001027# the _WIN32_WINNT setting in osdep.h according to the value from glib.
1028# You should also check if any of the glib.version() checks
1029# below can also be removed.
Thomas Huth0d8caac2024-04-18 12:10:50 +02001030glib_req_ver = '>=2.66.0'
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001031glib_pc = dependency('glib-2.0', version: glib_req_ver, required: true,
1032 method: 'pkg-config')
1033glib_cflags = []
Paolo Bonzini60027112022-10-20 14:53:10 +02001034if enable_modules
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001035 gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true,
1036 method: 'pkg-config')
Paolo Bonzini2c13c572023-08-30 12:20:53 +02001037elif get_option('plugins')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001038 gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true,
1039 method: 'pkg-config')
1040else
1041 gmodule = not_found
Emilio Cotae3feb2c2023-02-05 11:37:57 -05001042endif
Marc-André Lureau953d5a92020-12-15 12:03:19 +04001043
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001044# This workaround is required due to a bug in pkg-config file for glib as it
1045# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001046if host_os == 'windows' and get_option('prefer_static')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001047 glib_cflags += ['-DGLIB_STATIC_COMPILATION']
1048endif
1049
1050# Sanity check that the current size_t matches the
1051# size that glib thinks it should be. This catches
1052# problems on multi-arch where people try to build
1053# 32-bit QEMU while pointing at 64-bit glib headers
1054
1055if not cc.compiles('''
1056 #include <glib.h>
1057 #include <unistd.h>
1058
1059 #define QEMU_BUILD_BUG_ON(x) \
1060 typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
1061
1062 int main(void) {
1063 QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
1064 return 0;
1065 }''', dependencies: glib_pc, args: glib_cflags)
1066 error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T.
1067 You probably need to set PKG_CONFIG_LIBDIR" to point
1068 to the right pkg-config files for your build target.''')
1069endif
1070
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001071glib = declare_dependency(dependencies: [glib_pc, gmodule],
1072 compile_args: glib_cflags,
1073 version: glib_pc.version())
1074
1075# Check whether glib has gslice, which we have to avoid for correctness.
1076# TODO: remove this check and the corresponding workaround (qtree) when
1077# the minimum supported glib is >= 2.75.3
1078glib_has_gslice = glib.version().version_compare('<2.75.3')
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03001079# Check whether glib has the aligned_alloc family of functions.
1080# <https://docs.gtk.org/glib/func.aligned_alloc.html>
1081glib_has_aligned_alloc = glib.version().version_compare('>=2.72.0')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001082
1083# override glib dep to include the above refinements
1084meson.override_dependency('glib-2.0', glib)
1085
1086# The path to glib.h is added to all compilation commands.
1087add_project_dependencies(glib.partial_dependency(compile_args: true, includes: true),
1088 native: false, language: all_languages)
1089
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001090gio = not_found
Paolo Bonzini75440602022-04-20 17:33:44 +02001091gdbus_codegen = not_found
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02001092gdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
Paolo Bonzini75440602022-04-20 17:33:44 +02001093if not get_option('gio').auto() or have_system
1094 gio = dependency('gio-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001095 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +02001096 if gio.found() and not cc.links('''
1097 #include <gio/gio.h>
1098 int main(void)
1099 {
1100 g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
1101 return 0;
1102 }''', dependencies: [glib, gio])
1103 if get_option('gio').enabled()
1104 error('The installed libgio is broken for static linking')
1105 endif
1106 gio = not_found
1107 endif
1108 if gio.found()
Marc-André Lureauc118c8e2024-10-08 16:50:22 +04001109 gdbus_codegen = find_program('gdbus-codegen',
Paolo Bonzini75440602022-04-20 17:33:44 +02001110 required: get_option('gio'))
1111 gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001112 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +02001113 gio = declare_dependency(dependencies: [gio, gio_unix],
1114 version: gio.version())
1115 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001116endif
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02001117if gdbus_codegen.found() and get_option('cfi')
1118 gdbus_codegen = not_found
1119 gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity'
1120endif
Paolo Bonzini75440602022-04-20 17:33:44 +02001121
Marc-André Lureau6cc5a612023-06-06 15:56:42 +04001122xml_pp = find_program('scripts/xml-preprocess.py')
1123
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001124lttng = not_found
Paolo Bonzini9c29b742021-10-07 15:08:14 +02001125if 'ust' in get_option('trace_backends')
Marc-André Lureaue32aaa52022-03-28 12:47:13 +04001126 lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001127 method: 'pkg-config')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001128endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001129pixman = not_found
Marc-André Lureaucca15752023-08-30 13:38:25 +04001130if not get_option('pixman').auto() or have_system or have_tools
1131 pixman = dependency('pixman-1', required: get_option('pixman'), version:'>=0.21.8',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001132 method: 'pkg-config')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001133endif
Marc-André Lureaucca15752023-08-30 13:38:25 +04001134
Paolo Bonzini063d5112022-07-14 14:56:58 +02001135zlib = dependency('zlib', required: true)
Paolo Bonzini53c22b62021-06-03 11:31:35 +02001136
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001137libaio = not_found
1138if not get_option('linux_aio').auto() or have_block
1139 libaio = cc.find_library('aio', has_headers: ['libaio.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001140 required: get_option('linux_aio'))
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001141endif
Leonardo Bras354081d2022-05-13 03:28:30 -03001142
1143linux_io_uring_test = '''
1144 #include <liburing.h>
1145 #include <linux/errqueue.h>
1146
1147 int main(void) { return 0; }'''
1148
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001149linux_io_uring = not_found
Paolo Bonzini53c22b62021-06-03 11:31:35 +02001150if not get_option('linux_io_uring').auto() or have_block
Daniel P. Berrangéa41b4fd2022-01-05 13:49:38 +00001151 linux_io_uring = dependency('liburing', version: '>=0.3',
1152 required: get_option('linux_io_uring'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001153 method: 'pkg-config')
Leonardo Bras354081d2022-05-13 03:28:30 -03001154 if not cc.links(linux_io_uring_test)
1155 linux_io_uring = not_found
1156 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001157endif
Leonardo Bras354081d2022-05-13 03:28:30 -03001158
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001159libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +01001160if not get_option('libnfs').auto() or have_block
Thomas Huthe2d98f22024-12-18 07:21:59 +01001161 libnfs = dependency('libnfs', version: ['>=1.9.3', '<6.0.0'],
Paolo Bonzini30045c02020-11-17 13:11:25 +01001162 required: get_option('libnfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001163 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001164endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001165
1166libattr_test = '''
1167 #include <stddef.h>
1168 #include <sys/types.h>
1169 #ifdef CONFIG_LIBATTR
1170 #include <attr/xattr.h>
1171 #else
1172 #include <sys/xattr.h>
1173 #endif
1174 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
1175
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001176libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001177have_old_libattr = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001178if get_option('attr').allowed()
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001179 if cc.links(libattr_test)
1180 libattr = declare_dependency()
1181 else
1182 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001183 required: get_option('attr'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001184 if libattr.found() and not \
1185 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
1186 libattr = not_found
1187 if get_option('attr').enabled()
1188 error('could not link libattr')
1189 else
1190 warning('could not link libattr, disabling')
1191 endif
1192 else
1193 have_old_libattr = libattr.found()
1194 endif
1195 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001196endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001197
Akihiko Odakid2277f02024-07-15 14:25:44 +09001198cocoa = dependency('appleframeworks',
1199 modules: ['Cocoa', 'CoreVideo', 'QuartzCore'],
Akihiko Odaki52eaefd2022-07-02 23:25:19 +09001200 required: get_option('cocoa'))
Paolo Bonzinic1ec4942021-01-07 14:04:00 +01001201
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03001202vmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet'))
1203if vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h',
1204 'VMNET_BRIDGED_MODE',
1205 dependencies: vmnet)
1206 vmnet = not_found
1207 if get_option('vmnet').enabled()
1208 error('vmnet.framework API is outdated')
1209 else
1210 warning('vmnet.framework API is outdated, disabling')
1211 endif
1212endif
1213
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001214seccomp = not_found
Michal Privoznik73422d92022-10-26 09:30:24 +02001215seccomp_has_sysrawrc = false
Paolo Bonzini90835c22020-11-17 14:22:24 +01001216if not get_option('seccomp').auto() or have_system or have_tools
1217 seccomp = dependency('libseccomp', version: '>=2.3.0',
1218 required: get_option('seccomp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001219 method: 'pkg-config')
Michal Privoznik73422d92022-10-26 09:30:24 +02001220 if seccomp.found()
1221 seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h',
1222 'SCMP_FLTATR_API_SYSRAWRC',
1223 dependencies: seccomp)
1224 endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001225endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001226
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001227libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001228if not get_option('cap_ng').auto() or have_system or have_tools
1229 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001230 required: get_option('cap_ng'))
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001231endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001232if libcap_ng.found() and not cc.links('''
1233 #include <cap-ng.h>
1234 int main(void)
1235 {
1236 capng_capability_to_name(CAPNG_EFFECTIVE);
1237 return 0;
1238 }''', dependencies: libcap_ng)
1239 libcap_ng = not_found
1240 if get_option('cap_ng').enabled()
1241 error('could not link libcap-ng')
1242 else
1243 warning('could not link libcap-ng, disabling')
1244 endif
1245endif
1246
Paolo Bonzini1917ec62020-08-26 03:24:11 -04001247if get_option('xkbcommon').auto() and not have_system and not have_tools
1248 xkbcommon = not_found
1249else
1250 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001251 method: 'pkg-config')
Marc-André Lureauade60d42019-07-15 14:48:31 +04001252endif
Paolo Bonzinie1723992021-10-07 15:08:21 +02001253
Thomas Huth58902582022-04-08 18:20:47 +02001254slirp = not_found
1255if not get_option('slirp').auto() or have_system
1256 slirp = dependency('slirp', required: get_option('slirp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001257 method: 'pkg-config')
Thomas Huth58902582022-04-08 18:20:47 +02001258 # slirp < 4.7 is incompatible with CFI support in QEMU. This is because
1259 # it passes function pointers within libslirp as callbacks for timers.
1260 # When using a system-wide shared libslirp, the type information for the
1261 # callback is missing and the timer call produces a false positive with CFI.
1262 # Do not use the "version" keyword argument to produce a better error.
1263 # with control-flow integrity.
1264 if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7')
1265 if get_option('slirp').enabled()
1266 error('Control-Flow Integrity requires libslirp 4.7.')
1267 else
1268 warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.')
1269 slirp = not_found
1270 endif
1271 endif
1272endif
1273
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001274vde = not_found
Paolo Bonzinie1723992021-10-07 15:08:21 +02001275if not get_option('vde').auto() or have_system or have_tools
1276 vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001277 required: get_option('vde'))
Paolo Bonzinie1723992021-10-07 15:08:21 +02001278endif
1279if vde.found() and not cc.links('''
1280 #include <libvdeplug.h>
1281 int main(void)
1282 {
1283 struct vde_open_args a = {0, 0, 0};
1284 char s[] = "";
1285 vde_open(s, s, &a);
1286 return 0;
1287 }''', dependencies: vde)
1288 vde = not_found
1289 if get_option('cap_ng').enabled()
1290 error('could not link libvdeplug')
1291 else
1292 warning('could not link libvdeplug, disabling')
1293 endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001294endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001295
Paolo Bonzini478e9432020-08-17 12:47:55 +02001296pulse = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001297if not get_option('pa').auto() or (host_os == 'linux' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001298 pulse = dependency('libpulse', required: get_option('pa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001299 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001300endif
1301alsa = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001302if not get_option('alsa').auto() or (host_os == 'linux' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001303 alsa = dependency('alsa', required: get_option('alsa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001304 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001305endif
1306jack = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001307if not get_option('jack').auto() or have_system
1308 jack = dependency('jack', required: get_option('jack'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001309 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001310endif
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001311pipewire = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001312if not get_option('pipewire').auto() or (host_os == 'linux' and have_system)
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001313 pipewire = dependency('libpipewire-0.3', version: '>=0.3.60',
1314 required: get_option('pipewire'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001315 method: 'pkg-config')
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001316endif
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001317sndio = not_found
1318if not get_option('sndio').auto() or have_system
1319 sndio = dependency('sndio', required: get_option('sndio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001320 method: 'pkg-config')
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001321endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001322
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001323spice_protocol = not_found
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001324if not get_option('spice_protocol').auto() or have_system
Markus Armbruster5c167b52023-01-09 20:03:07 +01001325 spice_protocol = dependency('spice-protocol', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001326 required: get_option('spice_protocol'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001327 method: 'pkg-config')
Paolo Bonzini26347332019-07-29 15:40:07 +02001328endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001329spice = not_found
Marc-André Lureauc98791e2023-08-30 13:38:35 +04001330if get_option('spice') \
1331 .disable_auto_if(not have_system) \
1332 .require(pixman.found(),
1333 error_message: 'cannot enable SPICE if pixman is not available') \
1334 .allowed()
Markus Armbruster34d55722023-01-09 20:03:09 +01001335 spice = dependency('spice-server', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001336 required: get_option('spice'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001337 method: 'pkg-config')
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001338endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001339spice_headers = spice.partial_dependency(compile_args: true, includes: true)
1340
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04001341rt = cc.find_library('rt', required: false)
Paolo Bonzinia399f912021-11-15 14:29:13 +00001342
Paolo Bonzini99650b62019-06-10 12:21:14 +02001343libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001344if not get_option('libiscsi').auto() or have_block
1345 libiscsi = dependency('libiscsi', version: '>=1.9.0',
1346 required: get_option('libiscsi'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001347 method: 'pkg-config')
Paolo Bonzini99650b62019-06-10 12:21:14 +02001348endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001349zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +01001350if not get_option('zstd').auto() or have_block
1351 zstd = dependency('libzstd', version: '>=1.4.0',
1352 required: get_option('zstd'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001353 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001354endif
Yuan Liub844a2c2024-06-10 18:21:06 +08001355qpl = not_found
1356if not get_option('qpl').auto() or have_system
1357 qpl = dependency('qpl', version: '>=1.5.0',
1358 required: get_option('qpl'),
1359 method: 'pkg-config')
1360endif
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01001361uadk = not_found
1362if not get_option('uadk').auto() or have_system
1363 libwd = dependency('libwd', version: '>=2.6',
1364 required: get_option('uadk'),
1365 method: 'pkg-config')
1366 libwd_comp = dependency('libwd_comp', version: '>=2.6',
1367 required: get_option('uadk'),
1368 method: 'pkg-config')
1369 if libwd.found() and libwd_comp.found()
1370 uadk = declare_dependency(dependencies: [libwd, libwd_comp])
1371 endif
1372endif
Bryan Zhange28ed312024-08-30 16:27:19 -07001373
1374qatzip = not_found
1375if not get_option('qatzip').auto() or have_system
1376 qatzip = dependency('qatzip', version: '>=1.1.2',
1377 required: get_option('qatzip'),
1378 method: 'pkg-config')
1379endif
1380
Marc-André Lureauea458962019-07-12 22:23:46 +04001381virgl = not_found
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001382
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001383have_vhost_user_gpu = have_tools and host_os == 'linux' and pixman.found()
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001384if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
Paolo Bonzini587d59d2021-06-03 11:31:35 +02001385 virgl = dependency('virglrenderer',
1386 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001387 required: get_option('virglrenderer'))
Marc-André Lureauea458962019-07-12 22:23:46 +04001388endif
Gurchetan Singhcd9adbe2023-03-21 09:47:36 -07001389rutabaga = not_found
1390if not get_option('rutabaga_gfx').auto() or have_system or have_vhost_user_gpu
1391 rutabaga = dependency('rutabaga_gfx_ffi',
1392 method: 'pkg-config',
1393 required: get_option('rutabaga_gfx'))
1394endif
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001395blkio = not_found
1396if not get_option('blkio').auto() or have_block
1397 blkio = dependency('blkio',
1398 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001399 required: get_option('blkio'))
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001400endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001401curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001402if not get_option('curl').auto() or have_block
1403 curl = dependency('libcurl', version: '>=7.29.0',
1404 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001405 required: get_option('curl'))
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001406endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001407libudev = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001408if host_os == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001409 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +01001410 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001411 required: get_option('libudev'))
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001412endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001413
Paolo Bonzini5c530152020-10-15 06:09:27 -04001414mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001415mpathpersist = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001416if host_os == 'linux' and have_tools and get_option('mpath').allowed()
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001417 mpath_test_source = '''
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001418 #include <libudev.h>
1419 #include <mpath_persist.h>
1420 unsigned mpath_mx_alloc_len = 1024;
1421 int logsink;
1422 static struct config *multipath_conf;
1423 extern struct udev *udev;
1424 extern struct config *get_multipath_config(void);
1425 extern void put_multipath_config(struct config *conf);
1426 struct udev *udev;
1427 struct config *get_multipath_config(void) { return multipath_conf; }
1428 void put_multipath_config(struct config *conf) { }
1429 int main(void) {
1430 udev = udev_new();
1431 multipath_conf = mpath_lib_init();
1432 return 0;
1433 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -04001434 libmpathpersist = cc.find_library('mpathpersist',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001435 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001436 if libmpathpersist.found()
1437 mpathlibs += libmpathpersist
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001438 if get_option('prefer_static')
Paolo Bonzini5c530152020-10-15 06:09:27 -04001439 mpathlibs += cc.find_library('devmapper',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001440 required: get_option('mpath'))
Paolo Bonzini43b43a42020-09-17 12:25:09 +02001441 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -04001442 mpathlibs += cc.find_library('multipath',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001443 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001444 foreach lib: mpathlibs
1445 if not lib.found()
1446 mpathlibs = []
1447 break
1448 endif
1449 endforeach
1450 if mpathlibs.length() == 0
1451 msg = 'Dependencies missing for libmpathpersist'
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001452 elif cc.links(mpath_test_source, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001453 mpathpersist = declare_dependency(dependencies: mpathlibs)
1454 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001455 msg = 'Cannot detect libmpathpersist API'
1456 endif
1457 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001458 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -04001459 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001460 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001461 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001462 endif
1463 endif
1464 endif
1465endif
1466
Yonggang Luo5285e592020-10-13 07:43:48 +08001467iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001468curses = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001469if have_system and get_option('curses').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001470 curses_test = '''
Brad Smithf8d31162024-10-11 23:38:55 -04001471 #ifdef __APPLE__
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001472 #define _XOPEN_SOURCE_EXTENDED 1
1473 #endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001474 #include <locale.h>
1475 #include <curses.h>
1476 #include <wchar.h>
1477 int main(void) {
1478 wchar_t wch = L'w';
1479 setlocale(LC_ALL, "");
1480 resize_term(0, 0);
1481 addwstr(L"wide chars\n");
1482 addnwstr(&wch, 1);
1483 add_wch(WACS_DEGREE);
1484 return 0;
1485 }'''
1486
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001487 curses_dep_list = host_os == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
Paolo Bonzini6d322632022-03-27 16:05:58 +02001488 curses = dependency(curses_dep_list,
1489 required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001490 method: 'pkg-config')
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001491 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001492 curses_compile_args = ['-DNCURSES_WIDECHAR=1']
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001493 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -05001494 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001495 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses],
1496 version: curses.version())
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001497 else
1498 msg = 'curses package not usable'
1499 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001500 endif
1501 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001502 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001503 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001504 if host_os != 'windows' and not has_curses_h
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001505 message('Trying with /usr/include/ncursesw')
1506 curses_compile_args += ['-I/usr/include/ncursesw']
1507 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
1508 endif
1509 if has_curses_h
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001510 curses_libname_list = (host_os == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001511 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +08001512 libcurses = cc.find_library(curses_libname,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001513 required: false)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001514 if libcurses.found()
1515 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
1516 curses = declare_dependency(compile_args: curses_compile_args,
1517 dependencies: [libcurses])
1518 break
1519 else
1520 msg = 'curses library not usable'
1521 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001522 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001523 endforeach
1524 endif
1525 endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001526 if get_option('iconv').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001527 foreach link_args : [ ['-liconv'], [] ]
1528 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
1529 # We need to use libiconv if available because mixing libiconv's headers with
1530 # the system libc does not work.
1531 # However, without adding glib to the dependencies -L/usr/local/lib will not be
1532 # included in the command line and libiconv will not be found.
1533 if cc.links('''
1534 #include <iconv.h>
1535 int main(void) {
1536 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
1537 return conv != (iconv_t) -1;
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001538 }''', args: link_args, dependencies: glib)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001539 iconv = declare_dependency(link_args: link_args, dependencies: glib)
1540 break
Yonggang Luo5285e592020-10-13 07:43:48 +08001541 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001542 endforeach
1543 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001544 if curses.found() and not iconv.found()
1545 if get_option('iconv').enabled()
1546 error('iconv not available')
1547 endif
1548 msg = 'iconv required for curses UI but not available'
1549 curses = not_found
1550 endif
1551 if not curses.found() and msg != ''
1552 if get_option('curses').enabled()
1553 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001554 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001555 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001556 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001557 endif
1558endif
1559
Paolo Bonzini26347332019-07-29 15:40:07 +02001560brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001561if not get_option('brlapi').auto() or have_system
1562 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001563 required: get_option('brlapi'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001564 if brlapi.found() and not cc.links('''
1565 #include <brlapi.h>
1566 #include <stddef.h>
1567 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
1568 brlapi = not_found
1569 if get_option('brlapi').enabled()
1570 error('could not link brlapi')
1571 else
1572 warning('could not link brlapi, disabling')
1573 endif
1574 endif
Paolo Bonzini26347332019-07-29 15:40:07 +02001575endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001576
Paolo Bonzini760e4322020-08-26 08:09:48 +02001577sdl = not_found
Akihiko Odaki64d3fec2022-08-19 22:27:56 +09001578if not get_option('sdl').auto() or have_system
Paolo Bonzini063d5112022-07-14 14:56:58 +02001579 sdl = dependency('sdl2', required: get_option('sdl'))
Paolo Bonzini760e4322020-08-26 08:09:48 +02001580 sdl_image = not_found
1581endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001582if sdl.found()
Thomas Huth6da5f222023-06-05 13:45:23 +02001583 # Some versions of SDL have problems with -Wundef
1584 if not cc.compiles('''
1585 #include <SDL.h>
1586 #include <SDL_syswm.h>
1587 int main(int argc, char *argv[]) { return 0; }
1588 ''', dependencies: sdl, args: '-Werror=undef')
1589 sdl = declare_dependency(compile_args: '-Wno-undef',
1590 dependencies: sdl,
1591 version: sdl.version())
1592 endif
Volker Rümelin7161a432020-08-29 12:41:58 +02001593 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001594 method: 'pkg-config')
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001595else
1596 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +01001597 error('sdl-image required, but SDL was @0@'.format(
1598 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001599 endif
1600 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +02001601endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001602
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001603rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001604if not get_option('rbd').auto() or have_block
Paolo Bonzini063d5112022-07-14 14:56:58 +02001605 librados = cc.find_library('rados', required: get_option('rbd'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001606 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001607 required: get_option('rbd'))
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001608 if librados.found() and librbd.found()
1609 if cc.links('''
1610 #include <stdio.h>
1611 #include <rbd/librbd.h>
1612 int main(void) {
1613 rados_t cluster;
1614 rados_create(&cluster, NULL);
Peter Lieven48672ac2021-07-02 19:23:51 +02001615 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
1616 #error
1617 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001618 return 0;
1619 }''', dependencies: [librbd, librados])
1620 rbd = declare_dependency(dependencies: [librbd, librados])
1621 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +02001622 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001623 else
Peter Lieven48672ac2021-07-02 19:23:51 +02001624 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001625 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001626 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001627endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001628
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001629glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001630glusterfs_ftruncate_has_stat = false
1631glusterfs_iocb_has_stat = false
1632if not get_option('glusterfs').auto() or have_block
1633 glusterfs = dependency('glusterfs-api', version: '>=3',
1634 required: get_option('glusterfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001635 method: 'pkg-config')
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001636 if glusterfs.found()
1637 glusterfs_ftruncate_has_stat = cc.links('''
1638 #include <glusterfs/api/glfs.h>
1639
1640 int
1641 main(void)
1642 {
1643 /* new glfs_ftruncate() passes two additional args */
1644 return glfs_ftruncate(NULL, 0, NULL, NULL);
1645 }
1646 ''', dependencies: glusterfs)
1647 glusterfs_iocb_has_stat = cc.links('''
1648 #include <glusterfs/api/glfs.h>
1649
1650 /* new glfs_io_cbk() passes two additional glfs_stat structs */
1651 static void
1652 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
1653 {}
1654
1655 int
1656 main(void)
1657 {
1658 glfs_io_cbk iocb = &glusterfs_iocb;
1659 iocb(NULL, 0 , NULL, NULL, NULL);
1660 return 0;
1661 }
1662 ''', dependencies: glusterfs)
1663 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001664endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001665
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02001666hv_balloon = false
1667if get_option('hv_balloon').allowed() and have_system
1668 if cc.links('''
1669 #include <string.h>
1670 #include <gmodule.h>
1671 int main(void) {
1672 GTree *tree;
1673
1674 tree = g_tree_new((GCompareFunc)strcmp);
1675 (void)g_tree_node_first(tree);
1676 g_tree_destroy(tree);
1677 return 0;
1678 }
1679 ''', dependencies: glib)
1680 hv_balloon = true
1681 else
1682 if get_option('hv_balloon').enabled()
1683 error('could not enable hv-balloon, update your glib')
1684 else
1685 warning('could not find glib support for hv-balloon, disabling')
1686 endif
1687 endif
1688endif
1689
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001690libssh = not_found
Thomas Huthe6a52b32021-12-09 15:48:01 +01001691if not get_option('libssh').auto() or have_block
1692 libssh = dependency('libssh', version: '>=0.8.7',
1693 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001694 required: get_option('libssh'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001695endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001696
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001697libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001698if not get_option('bzip2').auto() or have_block
1699 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001700 required: get_option('bzip2'))
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001701 if libbzip2.found() and not cc.links('''
1702 #include <bzlib.h>
1703 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
1704 libbzip2 = not_found
1705 if get_option('bzip2').enabled()
1706 error('could not link libbzip2')
1707 else
1708 warning('could not link libbzip2, disabling')
1709 endif
1710 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001711endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001712
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001713liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +01001714if not get_option('lzfse').auto() or have_block
1715 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001716 required: get_option('lzfse'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001717endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001718if liblzfse.found() and not cc.links('''
1719 #include <lzfse.h>
1720 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
1721 liblzfse = not_found
1722 if get_option('lzfse').enabled()
1723 error('could not link liblzfse')
1724 else
1725 warning('could not link liblzfse, disabling')
1726 endif
1727endif
1728
Paolo Bonzini478e9432020-08-17 12:47:55 +02001729oss = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001730if get_option('oss').allowed() and have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02001731 if not cc.has_header('sys/soundcard.h')
1732 # not found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001733 elif host_os == 'netbsd'
Paolo Bonzini063d5112022-07-14 14:56:58 +02001734 oss = cc.find_library('ossaudio', required: get_option('oss'))
Paolo Bonzini87430d52021-10-07 15:06:09 +02001735 else
1736 oss = declare_dependency()
1737 endif
1738
1739 if not oss.found()
1740 if get_option('oss').enabled()
1741 error('OSS not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001742 endif
1743 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001744endif
1745dsound = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001746if not get_option('dsound').auto() or (host_os == 'windows' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001747 if cc.has_header('dsound.h')
1748 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1749 endif
1750
1751 if not dsound.found()
1752 if get_option('dsound').enabled()
1753 error('DirectSound not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001754 endif
1755 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001756endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001757
Paolo Bonzini478e9432020-08-17 12:47:55 +02001758coreaudio = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001759if not get_option('coreaudio').auto() or (host_os == 'darwin' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001760 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
1761 required: get_option('coreaudio'))
Paolo Bonzini478e9432020-08-17 12:47:55 +02001762endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001763
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001764opengl = not_found
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001765if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
1766 epoxy = dependency('epoxy', method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001767 required: get_option('opengl'))
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001768 if cc.has_header('epoxy/egl.h', dependencies: epoxy)
1769 opengl = epoxy
1770 elif get_option('opengl').enabled()
1771 error('epoxy/egl.h not found')
1772 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001773endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001774gbm = not_found
1775if (have_system or have_tools) and (virgl.found() or opengl.found())
Paolo Bonzini063d5112022-07-14 14:56:58 +02001776 gbm = dependency('gbm', method: 'pkg-config', required: false)
Thomas Huth8bc51842021-07-13 13:09:02 +02001777endif
Marc-André Lureauf0caba42022-06-28 17:23:15 +04001778have_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001779
Dorjoy Chowdhurybb154e32024-10-09 03:17:23 +06001780libcbor = not_found
1781if not get_option('libcbor').auto() or have_system
1782 libcbor = dependency('libcbor', version: '>=0.7.0',
1783 required: get_option('libcbor'))
1784endif
1785
Paolo Bonzini57612512021-06-03 11:15:26 +02001786gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001787gnutls_crypto = not_found
Alyssa Rossabc14fd2021-08-06 14:49:47 +00001788if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001789 # For general TLS support our min gnutls matches
1790 # that implied by our platform support matrix
1791 #
1792 # For the crypto backends, we look for a newer
1793 # gnutls:
1794 #
1795 # Version 3.6.8 is needed to get XTS
1796 # Version 3.6.13 is needed to get PBKDF
1797 # Version 3.6.14 is needed to get HW accelerated XTS
1798 #
1799 # If newer enough gnutls isn't available, we can
1800 # still use a different crypto backend to satisfy
1801 # the platform support requirements
1802 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1803 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001804 required: false)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001805 if gnutls_crypto.found()
1806 gnutls = gnutls_crypto
1807 else
1808 # Our min version if all we need is TLS
1809 gnutls = dependency('gnutls', version: '>=3.5.18',
1810 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001811 required: get_option('gnutls'))
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001812 endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001813endif
1814
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001815# We prefer use of gnutls for crypto, unless the options
1816# explicitly asked for nettle or gcrypt.
1817#
1818# If gnutls isn't available for crypto, then we'll prefer
1819# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +02001820gcrypt = not_found
1821nettle = not_found
Lei He4c5e5122022-05-25 17:01:14 +08001822hogweed = not_found
Hyman Huang52ed9f42023-12-07 23:47:35 +08001823crypto_sm4 = not_found
liequan ched078da82024-10-30 08:51:46 +00001824crypto_sm3 = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +01001825xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001826
Paolo Bonzini57612512021-06-03 11:15:26 +02001827if get_option('nettle').enabled() and get_option('gcrypt').enabled()
1828 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +02001829endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001830
1831# Explicit nettle/gcrypt request, so ignore gnutls for crypto
1832if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001833 gnutls_crypto = not_found
1834endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001835
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001836if not gnutls_crypto.found()
1837 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
1838 gcrypt = dependency('libgcrypt', version: '>=1.8',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001839 required: get_option('gcrypt'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001840 # Debian has removed -lgpg-error from libgcrypt-config
1841 # as it "spreads unnecessary dependencies" which in
1842 # turn breaks static builds...
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001843 if gcrypt.found() and get_option('prefer_static')
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001844 gcrypt = declare_dependency(dependencies:
1845 [gcrypt,
1846 cc.find_library('gpg-error', required: true)],
1847 version: gcrypt.version())
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001848 endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08001849 crypto_sm4 = gcrypt
1850 # SM4 ALG is available in libgcrypt >= 1.9
1851 if gcrypt.found() and not cc.links('''
1852 #include <gcrypt.h>
1853 int main(void) {
1854 gcry_cipher_hd_t handler;
1855 gcry_cipher_open(&handler, GCRY_CIPHER_SM4, GCRY_CIPHER_MODE_ECB, 0);
1856 return 0;
1857 }''', dependencies: gcrypt)
1858 crypto_sm4 = not_found
1859 endif
liequan ched078da82024-10-30 08:51:46 +00001860 crypto_sm3 = gcrypt
1861 # SM3 ALG is available in libgcrypt >= 1.9
1862 if gcrypt.found() and not cc.links('''
1863 #include <gcrypt.h>
1864 int main(void) {
1865 gcry_md_hd_t handler;
1866 gcry_md_open(&handler, GCRY_MD_SM3, 0);
1867 return 0;
1868 }''', dependencies: gcrypt)
1869 crypto_sm3 = not_found
1870 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001871 endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001872 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1873 nettle = dependency('nettle', version: '>=3.4',
1874 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001875 required: get_option('nettle'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001876 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1877 xts = 'private'
1878 endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08001879 crypto_sm4 = nettle
1880 # SM4 ALG is available in nettle >= 3.9
1881 if nettle.found() and not cc.links('''
1882 #include <nettle/sm4.h>
1883 int main(void) {
1884 struct sm4_ctx ctx;
1885 unsigned char key[16] = {0};
1886 sm4_set_encrypt_key(&ctx, key);
1887 return 0;
1888 }''', dependencies: nettle)
1889 crypto_sm4 = not_found
1890 endif
liequan ched078da82024-10-30 08:51:46 +00001891 crypto_sm3 = nettle
1892 # SM3 ALG is available in nettle >= 3.8
1893 if nettle.found() and not cc.links('''
1894 #include <nettle/sm3.h>
1895 #include <nettle/hmac.h>
1896 int main(void) {
1897 struct sm3_ctx ctx;
1898 struct hmac_sm3_ctx hmac_ctx;
1899 unsigned char data[64] = {0};
1900 unsigned char output[32];
1901
1902 // SM3 hash function test
1903 sm3_init(&ctx);
1904 sm3_update(&ctx, 64, data);
1905 sm3_digest(&ctx, 32, data);
1906
1907 // HMAC-SM3 test
1908 hmac_sm3_set_key(&hmac_ctx, 32, data);
1909 hmac_sm3_update(&hmac_ctx, 64, data);
1910 hmac_sm3_digest(&hmac_ctx, 32, output);
1911
1912 return 0;
1913 }''', dependencies: nettle)
1914 crypto_sm3 = not_found
1915 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001916 endif
1917endif
1918
Paolo Bonzinia775c712023-09-08 12:09:22 +02001919capstone = not_found
1920if not get_option('capstone').auto() or have_system or have_user
1921 capstone = dependency('capstone', version: '>=3.0.5',
1922 method: 'pkg-config',
1923 required: get_option('capstone'))
1924
1925 # Some versions of capstone have broken pkg-config file
1926 # that reports a wrong -I path, causing the #include to
1927 # fail later. If the system has such a broken version
1928 # do not use it.
1929 if capstone.found() and not cc.compiles('#include <capstone.h>',
1930 dependencies: [capstone])
1931 capstone = not_found
1932 if get_option('capstone').enabled()
1933 error('capstone requested, but it does not appear to work')
1934 endif
1935 endif
1936endif
1937
Paolo Bonzini063d5112022-07-14 14:56:58 +02001938gmp = dependency('gmp', required: false, method: 'pkg-config')
Lei He4c5e5122022-05-25 17:01:14 +08001939if nettle.found() and gmp.found()
1940 hogweed = dependency('hogweed', version: '>=3.4',
1941 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001942 required: get_option('nettle'))
Lei He4c5e5122022-05-25 17:01:14 +08001943endif
1944
1945
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001946gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +01001947gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001948vte = not_found
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001949have_gtk_clipboard = get_option('gtk_clipboard').enabled()
1950
Marc-André Lureauda554e12023-08-30 13:38:36 +04001951if get_option('gtk') \
1952 .disable_auto_if(not have_system) \
1953 .require(pixman.found(),
1954 error_message: 'cannot enable GTK if pixman is not available') \
1955 .allowed()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001956 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1957 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001958 required: get_option('gtk'))
Paolo Bonzini1b695472021-01-07 14:02:29 +01001959 if gtk.found()
1960 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1961 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001962 required: false)
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001963 gtk = declare_dependency(dependencies: [gtk, gtkx11],
1964 version: gtk.version())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001965
1966 if not get_option('vte').auto() or have_system
1967 vte = dependency('vte-2.91',
1968 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001969 required: get_option('vte'))
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001970 endif
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001971 elif have_gtk_clipboard
1972 error('GTK clipboard requested, but GTK not found')
Paolo Bonzini1b695472021-01-07 14:02:29 +01001973 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001974endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001975
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001976x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +02001977if gtkx11.found()
Paolo Bonzini063d5112022-07-14 14:56:58 +02001978 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001979endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001980png = not_found
Kshitij Suri95f85102022-04-08 07:13:34 +00001981if get_option('png').allowed() and have_system
Thomas Huth1ec8c2c2022-06-23 19:49:41 +02001982 png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001983 method: 'pkg-config')
Kshitij Suri95f85102022-04-08 07:13:34 +00001984endif
1985vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001986jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001987sasl = not_found
Marc-André Lureau89fd3ea2023-08-30 13:38:34 +04001988if get_option('vnc') \
1989 .disable_auto_if(not have_system) \
1990 .require(pixman.found(),
1991 error_message: 'cannot enable VNC if pixman is not available') \
1992 .allowed()
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001993 vnc = declare_dependency() # dummy dependency
Paolo Bonzini8e242b32020-11-23 13:34:02 -05001994 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001995 method: 'pkg-config')
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001996 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001997 required: get_option('vnc_sasl'))
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001998 if sasl.found()
1999 sasl = declare_dependency(dependencies: sasl,
2000 compile_args: '-DSTRUCT_IOVEC_DEFINED')
2001 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04002002endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01002003
Paolo Bonzini05e391a2021-06-03 11:15:26 +02002004pam = not_found
2005if not get_option('auth_pam').auto() or have_system
2006 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002007 required: get_option('auth_pam'))
Paolo Bonzini05e391a2021-06-03 11:15:26 +02002008endif
2009if pam.found() and not cc.links('''
2010 #include <stddef.h>
2011 #include <security/pam_appl.h>
2012 int main(void) {
2013 const char *service_name = "qemu";
2014 const char *user = "frank";
2015 const struct pam_conv pam_conv = { 0 };
2016 pam_handle_t *pamh = NULL;
2017 pam_start(service_name, user, &pam_conv, &pamh);
2018 return 0;
2019 }''', dependencies: pam)
2020 pam = not_found
2021 if get_option('auth_pam').enabled()
2022 error('could not link libpam')
2023 else
2024 warning('could not link libpam, disabling')
2025 endif
2026endif
2027
Marc-André Lureau708eab42019-09-03 16:59:33 +04002028snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +01002029if not get_option('snappy').auto() or have_system
2030 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002031 required: get_option('snappy'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04002032endif
Thomas Huth785abf02023-07-06 08:47:36 +02002033if snappy.found() and not cc.links('''
Paolo Bonzini241611e2020-11-17 13:32:34 +01002034 #include <snappy-c.h>
2035 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
2036 snappy = not_found
2037 if get_option('snappy').enabled()
2038 error('could not link libsnappy')
2039 else
2040 warning('could not link libsnappy, disabling')
2041 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +04002042endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002043
Marc-André Lureau708eab42019-09-03 16:59:33 +04002044lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002045if not get_option('lzo').auto() or have_system
2046 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002047 required: get_option('lzo'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04002048endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002049if lzo.found() and not cc.links('''
2050 #include <lzo/lzo1x.h>
2051 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
2052 lzo = not_found
2053 if get_option('lzo').enabled()
2054 error('could not link liblzo2')
2055 else
2056 warning('could not link liblzo2, disabling')
2057 endif
2058endif
2059
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002060numa = not_found
2061if not get_option('numa').auto() or have_system or have_tools
2062 numa = cc.find_library('numa', has_headers: ['numa.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002063 required: get_option('numa'))
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002064endif
2065if numa.found() and not cc.links('''
2066 #include <numa.h>
2067 int main(void) { return numa_available(); }
2068 ''', dependencies: numa)
2069 numa = not_found
2070 if get_option('numa').enabled()
2071 error('could not link numa')
2072 else
2073 warning('could not link numa, disabling')
2074 endif
2075endif
2076
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01002077fdt = not_found
2078fdt_opt = get_option('fdt')
2079if fdt_opt == 'enabled' and get_option('wrap_mode') == 'nodownload'
2080 fdt_opt = 'system'
2081endif
2082if fdt_opt in ['enabled', 'system'] or (fdt_opt == 'auto' and have_system)
2083 fdt = cc.find_library('fdt', required: fdt_opt == 'system')
2084 if fdt.found() and cc.links('''
2085 #include <libfdt.h>
2086 #include <libfdt_env.h>
2087 int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
2088 dependencies: fdt)
2089 fdt_opt = 'system'
2090 elif fdt_opt != 'system'
2091 fdt_opt = get_option('wrap_mode') == 'nodownload' ? 'disabled' : 'internal'
2092 fdt = not_found
2093 else
2094 error('system libfdt is too old (1.5.1 or newer required)')
2095 endif
2096endif
2097if fdt_opt == 'internal'
2098 assert(not fdt.found())
2099 libfdt_proj = subproject('dtc', required: true,
2100 default_options: ['tools=false', 'yaml=disabled',
2101 'python=disabled', 'default_library=static'])
2102 fdt = libfdt_proj.get_variable('libfdt_dep')
2103endif
2104
Marc-André Lureau55166232019-07-24 19:16:22 +04002105rdma = not_found
Paolo Bonzini3730a732022-04-20 17:33:41 +02002106if not get_option('rdma').auto() or have_system
Paolo Bonzini3730a732022-04-20 17:33:41 +02002107 rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002108 required: get_option('rdma')),
zhenwei pi829858f2024-06-11 18:54:26 +08002109 cc.find_library('ibverbs', required: get_option('rdma'))]
Paolo Bonzini3730a732022-04-20 17:33:41 +02002110 rdma = declare_dependency(dependencies: rdma_libs)
2111 foreach lib: rdma_libs
2112 if not lib.found()
2113 rdma = not_found
2114 endif
2115 endforeach
Marc-André Lureau55166232019-07-24 19:16:22 +04002116endif
Paolo Bonzini3730a732022-04-20 17:33:41 +02002117
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002118cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02002119if not get_option('smartcard').auto() or have_system
2120 cacard = dependency('libcacard', required: get_option('smartcard'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002121 version: '>=2.5.1', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002122endif
César Belley0a40bcb2020-08-26 13:42:04 +02002123u2f = not_found
Paolo Bonzinie7c22ff2023-09-08 12:10:27 +02002124if not get_option('u2f').auto() or have_system
César Belley0a40bcb2020-08-26 13:42:04 +02002125 u2f = dependency('u2f-emu', required: get_option('u2f'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002126 method: 'pkg-config')
César Belley0a40bcb2020-08-26 13:42:04 +02002127endif
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002128canokey = not_found
Paolo Bonzinie7c22ff2023-09-08 12:10:27 +02002129if not get_option('canokey').auto() or have_system
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002130 canokey = dependency('canokey-qemu', required: get_option('canokey'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002131 method: 'pkg-config')
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002132endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002133usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02002134if not get_option('usb_redir').auto() or have_system
2135 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002136 version: '>=0.6', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002137endif
2138libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02002139if not get_option('libusb').auto() or have_system
2140 libusb = dependency('libusb-1.0', required: get_option('libusb'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002141 version: '>=1.0.13', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002142endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02002143
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002144libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02002145if not get_option('libpmem').auto() or have_system
2146 libpmem = dependency('libpmem', required: get_option('libpmem'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002147 method: 'pkg-config')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002148endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06002149libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02002150if not get_option('libdaxctl').auto() or have_system
2151 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002152 version: '>=57', method: 'pkg-config')
Bruce Rogersc7c91a72020-08-24 09:52:12 -06002153endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04002154tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02002155if gnutls.found()
2156 tasn1 = dependency('libtasn1',
Philippe Mathieu-Daudédc37d1c2024-05-02 11:56:42 +02002157 required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02002158 method: 'pkg-config')
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04002159endif
Max Fritz0db0fbb2023-05-22 02:12:02 +02002160keyutils = not_found
Thomas Huthc64023b2023-08-24 11:42:08 +02002161if not get_option('libkeyutils').auto() or have_block
2162 keyutils = dependency('libkeyutils', required: get_option('libkeyutils'),
2163 method: 'pkg-config')
Max Fritz0db0fbb2023-05-22 02:12:02 +02002164endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002165
Marc-André Lureau3909def2020-08-28 15:07:33 +04002166has_gettid = cc.has_function('gettid')
2167
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002168# libselinux
2169selinux = dependency('libselinux',
2170 required: get_option('selinux'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002171 method: 'pkg-config')
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002172
Paolo Bonziniaa087962020-09-01 11:15:30 -04002173# Malloc tests
2174
2175malloc = []
2176if get_option('malloc') == 'system'
2177 has_malloc_trim = \
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002178 get_option('malloc_trim').allowed() and \
Michal Privoznik09a49af2023-05-30 12:31:23 +02002179 cc.has_function('malloc_trim', prefix: '#include <malloc.h>')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002180else
2181 has_malloc_trim = false
2182 malloc = cc.find_library(get_option('malloc'), required: true)
2183endif
2184if not has_malloc_trim and get_option('malloc_trim').enabled()
2185 if get_option('malloc') == 'system'
2186 error('malloc_trim not available on this platform.')
2187 else
2188 error('malloc_trim not available with non-libc memory allocator')
2189 endif
2190endif
2191
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002192gnu_source_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01002193 #ifndef _GNU_SOURCE
2194 #define _GNU_SOURCE
2195 #endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002196'''
Max Reitz84e319a2020-11-02 17:18:55 +01002197
Michal Privoznik09a49af2023-05-30 12:31:23 +02002198# Check whether the glibc provides STATX_BASIC_STATS
2199
2200has_statx = cc.has_header_symbol('sys/stat.h', 'STATX_BASIC_STATS', prefix: gnu_source_prefix)
Max Reitz84e319a2020-11-02 17:18:55 +01002201
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002202# Check whether statx() provides mount ID information
2203
Michal Privoznik09a49af2023-05-30 12:31:23 +02002204has_statx_mnt_id = cc.has_header_symbol('sys/stat.h', 'STATX_MNT_ID', prefix: gnu_source_prefix)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002205
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002206have_vhost_user_blk_server = get_option('vhost_user_blk_server') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002207 .require(host_os == 'linux',
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002208 error_message: 'vhost_user_blk_server requires linux') \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02002209 .require(have_vhost_user,
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002210 error_message: 'vhost_user_blk_server requires vhost-user support') \
Alex Bennée26ed5012022-05-24 16:40:42 +01002211 .disable_auto_if(not have_tools and not have_system) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002212 .allowed()
Daniele Buono9e62ba42020-12-04 18:06:14 -05002213
Max Reitzdf4ea702020-10-27 20:05:46 +01002214if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
2215 error('Cannot enable fuse-lseek while fuse is disabled')
2216endif
2217
Max Reitza484a712020-10-27 20:05:41 +01002218fuse = dependency('fuse3', required: get_option('fuse'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002219 version: '>=3.1', method: 'pkg-config')
Max Reitza484a712020-10-27 20:05:41 +01002220
Max Reitzdf4ea702020-10-27 20:05:46 +01002221fuse_lseek = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002222if get_option('fuse_lseek').allowed()
Max Reitzdf4ea702020-10-27 20:05:46 +01002223 if fuse.version().version_compare('>=3.8')
2224 # Dummy dependency
2225 fuse_lseek = declare_dependency()
2226 elif get_option('fuse_lseek').enabled()
2227 if fuse.found()
2228 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
2229 else
2230 error('fuse-lseek requires libfuse, which was not found')
2231 endif
2232 endif
2233endif
2234
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002235have_libvduse = (host_os == 'linux')
Xie Yongjia6caeee2022-05-23 16:46:08 +08002236if get_option('libvduse').enabled()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002237 if host_os != 'linux'
Xie Yongjia6caeee2022-05-23 16:46:08 +08002238 error('libvduse requires linux')
2239 endif
2240elif get_option('libvduse').disabled()
2241 have_libvduse = false
2242endif
2243
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002244have_vduse_blk_export = (have_libvduse and host_os == 'linux')
Xie Yongji2a2359b2022-05-23 16:46:09 +08002245if get_option('vduse_blk_export').enabled()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002246 if host_os != 'linux'
Xie Yongji2a2359b2022-05-23 16:46:09 +08002247 error('vduse_blk_export requires linux')
2248 elif not have_libvduse
2249 error('vduse_blk_export requires libvduse support')
2250 endif
2251elif get_option('vduse_blk_export').disabled()
2252 have_vduse_blk_export = false
2253endif
2254
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002255# libbpf
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002256bpf_version = '1.1.0'
2257libbpf = dependency('libbpf', version: '>=' + bpf_version, required: get_option('bpf'), method: 'pkg-config')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002258if libbpf.found() and not cc.links('''
2259 #include <bpf/libbpf.h>
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002260 #include <linux/bpf.h>
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002261 int main(void)
2262 {
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002263 // check flag availability
2264 int flag = BPF_F_MMAPABLE;
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002265 bpf_object__destroy_skeleton(NULL);
2266 return 0;
2267 }''', dependencies: libbpf)
2268 libbpf = not_found
2269 if get_option('bpf').enabled()
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002270 error('libbpf skeleton/mmaping test failed')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002271 else
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002272 warning('libbpf skeleton/mmaping test failed, disabling')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002273 endif
2274endif
2275
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002276# libxdp
2277libxdp = not_found
2278if not get_option('af_xdp').auto() or have_system
Daniel P. Berrangé1f372802024-10-23 09:50:56 +01002279 if libbpf.found()
2280 libxdp = dependency('libxdp', required: get_option('af_xdp'),
2281 version: '>=1.4.0', method: 'pkg-config')
2282 else
2283 if get_option('af_xdp').enabled()
2284 error('libxdp requested, but libbpf is not available')
2285 endif
2286 endif
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002287endif
2288
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002289# libdw
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002290libdw = not_found
Ilya Leoshkevich550c6d92023-02-10 01:52:08 +01002291if not get_option('libdw').auto() or \
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02002292 (not get_option('prefer_static') and (have_system or have_user))
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002293 libdw = dependency('libdw',
2294 method: 'pkg-config',
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002295 required: get_option('libdw'))
2296endif
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002297
Paolo Bonzini87430d52021-10-07 15:06:09 +02002298#################
2299# config-host.h #
2300#################
2301
Paolo Bonzini95933f12023-09-08 12:10:08 +02002302config_host_data = configuration_data()
2303
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03002304config_host_data.set('CONFIG_HAVE_RUST', have_rust)
Paolo Bonzini87430d52021-10-07 15:06:09 +02002305audio_drivers_selected = []
2306if have_system
2307 audio_drivers_available = {
2308 'alsa': alsa.found(),
2309 'coreaudio': coreaudio.found(),
2310 'dsound': dsound.found(),
2311 'jack': jack.found(),
2312 'oss': oss.found(),
2313 'pa': pulse.found(),
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02002314 'pipewire': pipewire.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002315 'sdl': sdl.found(),
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002316 'sndio': sndio.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002317 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02002318 foreach k, v: audio_drivers_available
2319 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
2320 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02002321
2322 # Default to native drivers first, OSS second, SDL third
2323 audio_drivers_priority = \
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002324 [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002325 (host_os == 'linux' ? [] : [ 'sdl' ])
Paolo Bonzini87430d52021-10-07 15:06:09 +02002326 audio_drivers_default = []
2327 foreach k: audio_drivers_priority
2328 if audio_drivers_available[k]
2329 audio_drivers_default += k
2330 endif
2331 endforeach
2332
2333 foreach k: get_option('audio_drv_list')
2334 if k == 'default'
2335 audio_drivers_selected += audio_drivers_default
2336 elif not audio_drivers_available[k]
2337 error('Audio driver "@0@" not available.'.format(k))
2338 else
2339 audio_drivers_selected += k
2340 endif
2341 endforeach
2342endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02002343config_host_data.set('CONFIG_AUDIO_DRIVERS',
2344 '"' + '", "'.join(audio_drivers_selected) + '", ')
2345
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002346have_host_block_device = (host_os != 'darwin' or
Joelle van Dyne14176c82021-03-15 11:03:38 -07002347 cc.has_header('IOKit/storage/IOMedia.h'))
2348
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002349dbus_display = get_option('dbus_display') \
2350 .require(gio.version().version_compare('>=2.64'),
2351 error_message: '-display dbus requires glib>=2.64') \
Paolo Bonzini75440602022-04-20 17:33:44 +02002352 .require(gdbus_codegen.found(),
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02002353 error_message: gdbus_codegen_error.format('-display dbus')) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002354 .allowed()
Marc-André Lureau142ca622021-07-15 11:53:53 +04002355
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002356have_virtfs = get_option('virtfs') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002357 .require(host_os == 'linux' or host_os == 'darwin',
Keno Fischer0fb1e192022-02-27 17:35:22 -05002358 error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002359 .require(host_os == 'linux' or cc.has_function('pthread_fchdir_np'),
Keno Fischer0fb1e192022-02-27 17:35:22 -05002360 error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002361 .require(host_os == 'darwin' or libattr.found(),
Peter Foley1a67e072023-05-03 09:07:56 -04002362 error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002363 .disable_auto_if(not have_tools and not have_system) \
2364 .allowed()
Paolo Bonzini69202b42020-11-17 14:46:21 +01002365
Daniel P. Berrangé4bb3da42024-07-12 14:24:44 +01002366qga_fsfreeze = false
2367qga_fstrim = false
2368if host_os == 'linux'
2369 if cc.has_header_symbol('linux/fs.h', 'FIFREEZE')
2370 qga_fsfreeze = true
2371 endif
2372 if cc.has_header_symbol('linux/fs.h', 'FITRIM')
2373 qga_fstrim = true
2374 endif
2375elif host_os == 'freebsd' and cc.has_header_symbol('ufs/ffs/fs.h', 'UFSSUSPEND')
2376 qga_fsfreeze = true
2377endif
2378
Paolo Bonzini622d64f2022-04-20 17:33:53 +02002379if get_option('block_drv_ro_whitelist') == ''
2380 config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
2381else
2382 config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
2383 '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
2384endif
2385if get_option('block_drv_rw_whitelist') == ''
2386 config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
2387else
2388 config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
2389 '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
2390endif
2391
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002392foreach k : get_option('trace_backends')
2393 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
2394endforeach
2395config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02002396config_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
Paolo Bonzini40c909f2022-04-20 17:33:49 +02002397if iasl.found()
2398 config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
Paolo Bonzini5dc46182021-10-13 13:19:00 +02002399endif
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002400config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
2401config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
2402config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
2403config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
2404config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09002405
2406qemu_firmwarepath = ''
2407foreach k : get_option('qemu_firmwarepath')
2408 qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
2409endforeach
2410config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
2411
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002412config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
2413config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
2414config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
2415config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
2416config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
2417config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
2418
Paolo Bonzini60027112022-10-20 14:53:10 +02002419if enable_modules
Paolo Bonzinib0b43232022-04-20 17:33:54 +02002420 config_host_data.set('CONFIG_STAMP', run_command(
2421 meson.current_source_dir() / 'scripts/qemu-stamp.py',
2422 meson.project_version(), get_option('pkgversion'), '--',
2423 meson.current_source_dir() / 'configure',
2424 capture: true, check: true).stdout().strip())
2425endif
2426
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002427have_slirp_smbd = get_option('slirp_smbd') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002428 .require(host_os != 'windows', error_message: 'Host smbd not supported on this platform.') \
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002429 .allowed()
2430if have_slirp_smbd
2431 smbd_path = get_option('smbd')
2432 if smbd_path == ''
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002433 smbd_path = (host_os == 'sunos' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002434 endif
2435 config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
2436endif
2437
Paolo Bonzini823eb012021-11-08 14:18:17 +01002438config_host_data.set('HOST_' + host_arch.to_upper(), 1)
2439
Paolo Bonzini95933f12023-09-08 12:10:08 +02002440kvm_targets_c = '""'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002441if get_option('kvm').allowed() and host_os == 'linux'
Paolo Bonzini95933f12023-09-08 12:10:08 +02002442 kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
2443endif
2444config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
2445
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02002446if get_option('module_upgrades') and not enable_modules
2447 error('Cannot enable module-upgrades as modules are not enabled')
2448endif
2449config_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
2450
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002451config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002452config_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002453config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002454config_host_data.set('CONFIG_BSD', host_os in bsd_oses)
Daniel P. Berrangé4be55a42024-07-12 14:24:54 +01002455config_host_data.set('CONFIG_FREEBSD', host_os == 'freebsd')
Paolo Bonzinia775c712023-09-08 12:09:22 +02002456config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04002457config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002458config_host_data.set('CONFIG_DARWIN', host_os == 'darwin')
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01002459config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini537b7242021-10-07 15:08:12 +02002460config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02002461config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002462config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002463config_host_data.set('CONFIG_LINUX', host_os == 'linux')
2464config_host_data.set('CONFIG_POSIX', host_os != 'windows')
2465config_host_data.set('CONFIG_WIN32', host_os == 'windows')
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002466config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002467config_host_data.set('CONFIG_MPATH', mpathpersist.found())
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04002468config_host_data.set('CONFIG_BLKIO', blkio.found())
Stefano Garzarella98b126f2023-05-30 09:19:41 +02002469if blkio.found()
2470 config_host_data.set('CONFIG_BLKIO_VHOST_VDPA_FD',
2471 blkio.version().version_compare('>=1.3.0'))
Stefano Garzarella547c4e52024-08-08 10:05:45 +02002472 config_host_data.set('CONFIG_BLKIO_WRITE_ZEROS_FUA',
2473 blkio.version().version_compare('>=1.4.0'))
Stefano Garzarella98b126f2023-05-30 09:19:41 +02002474endif
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002475config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08002476config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02002477config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini75440602022-04-20 17:33:44 +02002478config_host_data.set('CONFIG_GIO', gio.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002479config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
2480if glusterfs.found()
2481 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
2482 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
2483 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
2484 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
2485 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
2486 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
2487endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002488config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02002489config_host_data.set('CONFIG_VTE', vte.found())
Claudio Fontana29e0bff2022-11-21 14:55:38 +01002490config_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard)
Taylor Simpson63efb6a2023-04-27 15:59:52 -07002491config_host_data.set('CONFIG_HEXAGON_IDEF_PARSER', get_option('hexagon_idef_parser'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002492config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002493config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002494config_host_data.set('CONFIG_EBPF', libbpf.found())
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002495config_host_data.set('CONFIG_AF_XDP', libxdp.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002496config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002497config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01002498config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Thomas Huthe6a52b32021-12-09 15:48:01 +01002499config_host_data.set('CONFIG_LIBSSH', libssh.found())
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02002500config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002501config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
2502config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzini60027112022-10-20 14:53:10 +02002503config_host_data.set('CONFIG_MODULES', enable_modules)
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002504config_host_data.set('CONFIG_NUMA', numa.found())
Michal Privoznik6bb613f2022-12-15 10:55:03 +01002505if numa.found()
2506 config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY',
2507 cc.has_function('numa_has_preferred_many',
2508 dependencies: numa))
2509endif
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002510config_host_data.set('CONFIG_OPENGL', opengl.found())
Paolo Bonzini2c13c572023-08-30 12:20:53 +02002511config_host_data.set('CONFIG_PLUGIN', get_option('plugins'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002512config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini3730a732022-04-20 17:33:41 +02002513config_host_data.set('CONFIG_RDMA', rdma.found())
Paolo Bonzini655e2a72023-10-05 14:19:34 +02002514config_host_data.set('CONFIG_RELOCATABLE', get_option('relocatable'))
Paolo Bonzini721fa5e2022-10-12 11:59:51 +02002515config_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002516config_host_data.set('CONFIG_SDL', sdl.found())
2517config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01002518config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Michal Privoznik73422d92022-10-26 09:30:24 +02002519if seccomp.found()
2520 config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
2521endif
Marc-André Lureaucca15752023-08-30 13:38:25 +04002522config_host_data.set('CONFIG_PIXMAN', pixman.found())
Paolo Bonzinia775c712023-09-08 12:09:22 +02002523config_host_data.set('CONFIG_SLIRP', slirp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01002524config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002525config_host_data.set('CONFIG_SOLARIS', host_os == 'sunos')
Paolo Bonzini875be2872022-02-15 11:37:00 +01002526if get_option('tcg').allowed()
2527 config_host_data.set('CONFIG_TCG', 1)
2528 config_host_data.set('CONFIG_TCG_INTERPRETER', tcg_arch == 'tci')
2529endif
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002530config_host_data.set('CONFIG_TPM', have_tpm)
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002531config_host_data.set('CONFIG_TSAN', get_option('tsan'))
Paolo Bonzini90540f32021-06-03 11:15:26 +02002532config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Paolo Bonzinie1723992021-10-07 15:08:21 +02002533config_host_data.set('CONFIG_VDE', vde.found())
Stefan Hajnoczic0c4f142023-10-03 21:45:32 -04002534config_host_data.set('CONFIG_VHOST', have_vhost)
Paolo Bonzini2df89d52022-04-20 17:34:07 +02002535config_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
2536config_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
2537config_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
2538config_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
2539config_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
2540config_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
2541config_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03002542config_host_data.set('CONFIG_VMNET', vmnet.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002543config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Xie Yongji2a2359b2022-05-23 16:46:09 +08002544config_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
Kshitij Suri95f85102022-04-08 07:13:34 +00002545config_host_data.set('CONFIG_PNG', png.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002546config_host_data.set('CONFIG_VNC', vnc.found())
2547config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002548config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini95933f12023-09-08 12:10:08 +02002549if virgl.found()
Dmitry Osipenkoffac9642024-10-25 00:03:04 +03002550 config_host_data.set('VIRGL_VERSION_MAJOR', virgl.version().split('.')[0])
Paolo Bonzini95933f12023-09-08 12:10:08 +02002551endif
Paolo Bonzini69202b42020-11-17 14:46:21 +01002552config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002553config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002554config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04002555config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04002556config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02002557config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01002558config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Daniel P. Berrangéd47b83b2022-04-26 17:00:43 +01002559config_host_data.set('CONFIG_TASN1', tasn1.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002560config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
2561config_host_data.set('CONFIG_NETTLE', nettle.found())
Hyman Huang52ed9f42023-12-07 23:47:35 +08002562config_host_data.set('CONFIG_CRYPTO_SM4', crypto_sm4.found())
liequan ched078da82024-10-30 08:51:46 +00002563config_host_data.set('CONFIG_CRYPTO_SM3', crypto_sm3.found())
Lei He4c5e5122022-05-25 17:01:14 +08002564config_host_data.set('CONFIG_HOGWEED', hogweed.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002565config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002566config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01002567config_host_data.set('CONFIG_STATX', has_statx)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002568config_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id)
Paolo Bonzinib1def332020-11-17 13:37:39 +01002569config_host_data.set('CONFIG_ZSTD', zstd.found())
Yuan Liub844a2c2024-06-10 18:21:06 +08002570config_host_data.set('CONFIG_QPL', qpl.found())
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01002571config_host_data.set('CONFIG_UADK', uadk.found())
Bryan Zhange28ed312024-08-30 16:27:19 -07002572config_host_data.set('CONFIG_QATZIP', qatzip.found())
Max Reitza484a712020-10-27 20:05:41 +01002573config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01002574config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002575config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
Marc-André Lureauddece462021-10-06 14:18:09 +04002576if spice_protocol.found()
2577config_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
2578config_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
2579config_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
2580endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002581config_host_data.set('CONFIG_SPICE', spice.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01002582config_host_data.set('CONFIG_X11', x11.found())
Marc-André Lureau142ca622021-07-15 11:53:53 +04002583config_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
Daniele Buono9e62ba42020-12-04 18:06:14 -05002584config_host_data.set('CONFIG_CFI', get_option('cfi'))
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002585config_host_data.set('CONFIG_SELINUX', selinux.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002586config_host_data.set('CONFIG_XEN_BACKEND', xen.found())
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002587config_host_data.set('CONFIG_LIBDW', libdw.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002588if xen.found()
2589 # protect from xen.version() having less than three components
2590 xen_version = xen.version().split('.') + ['0', '0']
2591 xen_ctrl_version = xen_version[0] + \
2592 ('0' + xen_version[1]).substring(-2) + \
2593 ('0' + xen_version[2]).substring(-2)
2594 config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
2595endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002596config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
2597config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
2598config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
2599config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
2600
Paolo Bonzinia6305082021-10-07 15:08:15 +02002601config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002602config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
2603
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002604have_coroutine_pool = get_option('coroutine_pool')
2605if get_option('debug_stack_usage') and have_coroutine_pool
2606 message('Disabling coroutine pool to measure stack usage')
2607 have_coroutine_pool = false
2608endif
Paolo Bonzini230f6e02023-10-05 14:31:27 +02002609config_host_data.set('CONFIG_COROUTINE_POOL', have_coroutine_pool)
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04002610config_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002611config_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002612config_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
Paolo Bonzini1d558c92023-08-28 11:48:30 +02002613config_host_data.set('CONFIG_DEBUG_TCG', get_option('debug_tcg'))
Ilya Leoshkevich1f2355f2024-03-12 01:23:30 +01002614config_host_data.set('CONFIG_DEBUG_REMAP', get_option('debug_remap'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002615config_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
Juan Quintelaabad1852022-09-02 18:51:25 +02002616config_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
Daniel P. Berrangé4bb3da42024-07-12 14:24:44 +01002617config_host_data.set('CONFIG_FSFREEZE', qga_fsfreeze)
2618config_host_data.set('CONFIG_FSTRIM', qga_fstrim)
Paolo Bonzini406523f2021-10-13 11:43:54 +02002619
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002620# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002621config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002622config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
2623config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
Thomas Huth48f670e2020-11-18 18:10:52 +01002624config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01002625config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Michael Vogt97299302024-10-01 17:14:54 +02002626config_host_data.set('HAVE_OPENAT2_H', cc.has_header('linux/openat2.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01002627config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002628config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01002629config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01002630config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002631if host_os == 'windows'
Bin Mengd4093732022-08-02 15:51:58 +08002632 config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
2633endif
Thomas Huthded5d782020-11-14 11:10:11 +01002634
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002635# has_function
Claudio Imbrendac891c242022-08-12 15:34:53 +02002636config_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002637config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002638config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
2639config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
2640config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
2641config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Paolo Bonzini67504852023-06-21 00:47:31 +02002642config_host_data.set('CONFIG_GETCPU', cc.has_function('getcpu', prefix: gnu_source_prefix))
2643config_host_data.set('CONFIG_SCHED_GETCPU', cc.has_function('sched_getcpu', prefix: '#include <sched.h>'))
Peter Maydell86983432022-02-26 18:07:19 +00002644# Note that we need to specify prefix: here to avoid incorrectly
2645# thinking that Windows has posix_memalign()
2646config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
Peter Maydell5c8c7142022-02-26 18:07:20 +00002647config_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
Peter Maydell88454f82022-02-26 18:07:21 +00002648config_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
2649config_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002650config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002651config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Keno Fischer029ed1b2022-02-27 17:35:20 -05002652config_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002653config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
2654config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
2655config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
2656config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
2657config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Daniel P. Berrangé5288d9d2024-12-02 12:19:27 +00002658config_host_data.set('CONFIG_GETLOADAVG', cc.has_function('getloadavg'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002659config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Andrew Deason59e35c72022-04-26 14:55:22 -05002660config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02002661config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03002662config_host_data.set('HAVE_GLIB_WITH_ALIGNED_ALLOC', glib_has_aligned_alloc)
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002663config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002664config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002665config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Stefano Garzarella66dc5f92022-05-17 09:10:12 +02002666if rbd.found()
2667 config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
2668 cc.has_function('rbd_namespace_exists',
2669 dependencies: rbd,
2670 prefix: '#include <rbd/librbd.h>'))
2671endif
Li Zhijian911965a2021-09-10 15:02:55 +08002672if rdma.found()
2673 config_host_data.set('HAVE_IBV_ADVISE_MR',
2674 cc.has_function('ibv_advise_mr',
Paolo Bonzini3730a732022-04-20 17:33:41 +02002675 dependencies: rdma,
Li Zhijian911965a2021-09-10 15:02:55 +08002676 prefix: '#include <infiniband/verbs.h>'))
2677endif
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002678
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002679have_asan_fiber = false
Richard Hendersoncb771ac2024-08-13 19:52:15 +10002680if get_option('asan') and \
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002681 not cc.has_function('__sanitizer_start_switch_fiber',
2682 args: '-fsanitize=address',
2683 prefix: '#include <sanitizer/asan_interface.h>')
2684 warning('Missing ASAN due to missing fiber annotation interface')
2685 warning('Without code annotation, the report may be inferior.')
2686else
2687 have_asan_fiber = true
2688endif
2689config_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber)
2690
Ilya Leoshkevicha1a98002024-02-06 01:22:03 +01002691have_inotify_init = cc.has_header_symbol('sys/inotify.h', 'inotify_init')
2692have_inotify_init1 = cc.has_header_symbol('sys/inotify.h', 'inotify_init1')
2693inotify = not_found
2694if (have_inotify_init or have_inotify_init1) and host_os == 'freebsd'
2695 # libinotify-kqueue
2696 inotify = cc.find_library('inotify')
2697 if have_inotify_init
2698 have_inotify_init = inotify.found()
2699 endif
2700 if have_inotify_init1
2701 have_inotify_init1 = inotify.found()
2702 endif
2703endif
2704config_host_data.set('CONFIG_INOTIFY', have_inotify_init)
2705config_host_data.set('CONFIG_INOTIFY1', have_inotify_init1)
2706
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002707# has_header_symbol
Sam Li6d43eaa2023-05-08 12:55:28 +08002708config_host_data.set('CONFIG_BLKZONED',
2709 cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002710config_host_data.set('CONFIG_EPOLL_CREATE1',
2711 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
2712config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
2713 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
2714 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
2715config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
2716 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
2717config_host_data.set('CONFIG_FIEMAP',
2718 cc.has_header('linux/fiemap.h') and
2719 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002720config_host_data.set('CONFIG_GETRANDOM',
2721 cc.has_function('getrandom') and
2722 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002723config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
2724 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002725config_host_data.set('CONFIG_RTNETLINK',
2726 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
2727config_host_data.set('CONFIG_SYSMACROS',
2728 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002729config_host_data.set('HAVE_OPTRESET',
2730 cc.has_header_symbol('getopt.h', 'optreset'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04002731config_host_data.set('HAVE_IPPROTO_MPTCP',
2732 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Kevin Wolf984a32f2025-03-07 23:16:30 +01002733if libaio.found()
2734 config_host_data.set('HAVE_IO_PREP_PWRITEV2',
2735 cc.has_header_symbol('libaio.h', 'io_prep_pwritev2'))
2736endif
2737if linux_io_uring.found()
2738 config_host_data.set('HAVE_IO_URING_PREP_WRITEV2',
2739 cc.has_header_symbol('liburing.h', 'io_uring_prep_writev2'))
2740endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002741
2742# has_member
2743config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
2744 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
2745 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002746config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
2747 cc.has_member('struct stat', 'st_atim',
2748 prefix: '#include <sys/stat.h>'))
Sam Li6d43eaa2023-05-08 12:55:28 +08002749config_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY',
2750 cc.has_member('struct blk_zone', 'capacity',
2751 prefix: '#include <linux/blkzoned.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002752
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002753# has_type
2754config_host_data.set('CONFIG_IOVEC',
2755 cc.has_type('struct iovec',
2756 prefix: '#include <sys/uio.h>'))
2757config_host_data.set('HAVE_UTMPX',
2758 cc.has_type('struct utmpx',
2759 prefix: '#include <utmpx.h>'))
2760
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002761config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002762 #include <sys/eventfd.h>
2763 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002764config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002765 #include <unistd.h>
2766 int main(void) {
2767 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2768 return fdatasync(0);
2769 #else
2770 #error Not supported
2771 #endif
2772 }'''))
Andrew Deason8900c202022-03-15 22:52:25 -05002773
2774has_madvise = cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002775 #include <sys/types.h>
2776 #include <sys/mman.h>
2777 #include <stddef.h>
Andrew Deason8900c202022-03-15 22:52:25 -05002778 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
2779missing_madvise_proto = false
2780if has_madvise
2781 # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
2782 # but forget to prototype it. In this case, has_madvise will be true (the
2783 # test program links despite a compile warning). To detect the
2784 # missing-prototype case, we try again with a definitely-bogus prototype.
2785 # This will only compile if the system headers don't provide the prototype;
2786 # otherwise the conflicting prototypes will cause a compiler error.
2787 missing_madvise_proto = cc.links(gnu_source_prefix + '''
2788 #include <sys/types.h>
2789 #include <sys/mman.h>
2790 #include <stddef.h>
2791 extern int madvise(int);
2792 int main(void) { return madvise(0); }''')
2793endif
2794config_host_data.set('CONFIG_MADVISE', has_madvise)
2795config_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
2796
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002797config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002798 #include <sys/mman.h>
2799 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002800config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002801 #include <fcntl.h>
2802 #if !defined(AT_EMPTY_PATH)
2803 # error missing definition
2804 #else
2805 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2806 #endif'''))
Michal Privoznik12d7d0c2024-06-05 12:44:54 +02002807
2808# On Darwin posix_madvise() has the same return semantics as plain madvise(),
2809# i.e. errno is set and -1 is returned. That's not really how POSIX defines the
2810# function. On the flip side, it has madvise() which is preferred anyways.
2811if host_os != 'darwin'
2812 config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
2813 #include <sys/mman.h>
2814 #include <stddef.h>
2815 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
2816endif
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002817
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002818config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002819 #include <pthread.h>
2820
2821 static void *f(void *p) { return NULL; }
2822 int main(void)
2823 {
2824 pthread_t thread;
2825 pthread_create(&thread, 0, f, 0);
2826 pthread_setname_np(thread, "QEMU");
2827 return 0;
2828 }''', dependencies: threads))
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002829config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002830 #include <pthread.h>
2831
2832 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
2833 int main(void)
2834 {
2835 pthread_t thread;
2836 pthread_create(&thread, 0, f, 0);
2837 return 0;
2838 }''', dependencies: threads))
Brad Smith3ada67a2022-12-18 03:22:04 -05002839config_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + '''
2840 #include <pthread.h>
2841 #include <pthread_np.h>
2842
2843 static void *f(void *p) { return NULL; }
2844 int main(void)
2845 {
2846 pthread_t thread;
2847 pthread_create(&thread, 0, f, 0);
2848 pthread_set_name_np(thread, "QEMU");
2849 return 0;
2850 }''', dependencies: threads))
Longpeng(Mike)657ac982022-02-22 17:05:05 +08002851config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
2852 #include <pthread.h>
2853 #include <time.h>
2854
2855 int main(void)
2856 {
2857 pthread_condattr_t attr
2858 pthread_condattr_init(&attr);
2859 pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2860 return 0;
2861 }''', dependencies: threads))
David Hildenbrand7730f322022-10-14 15:47:15 +02002862config_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + '''
2863 #include <pthread.h>
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002864
David Hildenbrand7730f322022-10-14 15:47:15 +02002865 static void *f(void *p) { return NULL; }
2866 int main(void)
2867 {
2868 int setsize = CPU_ALLOC_SIZE(64);
2869 pthread_t thread;
2870 cpu_set_t *cpuset;
2871 pthread_create(&thread, 0, f, 0);
2872 cpuset = CPU_ALLOC(64);
2873 CPU_ZERO_S(setsize, cpuset);
2874 pthread_setaffinity_np(thread, setsize, cpuset);
2875 pthread_getaffinity_np(thread, setsize, cpuset);
2876 CPU_FREE(cpuset);
2877 return 0;
2878 }''', dependencies: threads))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002879config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02002880 #include <sys/signalfd.h>
2881 #include <stddef.h>
2882 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002883config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002884 #include <unistd.h>
2885 #include <fcntl.h>
2886 #include <limits.h>
2887
2888 int main(void)
2889 {
2890 int len, fd = 0;
2891 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2892 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2893 return 0;
2894 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002895
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002896config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
2897 #include <sys/mman.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002898 int main(void) {
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002899 return mlockall(MCL_FUTURE);
2900 }'''))
2901
Daniil Tatianine76fadf2025-02-12 17:39:17 +03002902config_host_data.set('HAVE_MLOCK_ONFAULT', cc.links(gnu_source_prefix + '''
2903 #include <sys/mman.h>
2904 int main(void) {
2905 return mlockall(MCL_FUTURE | MCL_ONFAULT);
2906 }'''))
2907
Thomas Hutheea94532021-10-28 20:59:08 +02002908have_l2tpv3 = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002909if get_option('l2tpv3').allowed() and have_system
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002910 have_l2tpv3 = cc.has_type('struct mmsghdr',
2911 prefix: gnu_source_prefix + '''
2912 #include <sys/socket.h>
2913 #include <linux/ip.h>''')
Thomas Hutheea94532021-10-28 20:59:08 +02002914endif
2915config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2916
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002917have_netmap = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002918if get_option('netmap').allowed() and have_system
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002919 have_netmap = cc.compiles('''
2920 #include <inttypes.h>
2921 #include <net/if.h>
2922 #include <net/netmap.h>
2923 #include <net/netmap_user.h>
2924 #if (NETMAP_API < 11) || (NETMAP_API > 15)
2925 #error
2926 #endif
2927 int main(void) { return 0; }''')
2928 if not have_netmap and get_option('netmap').enabled()
2929 error('Netmap headers not available')
2930 endif
2931endif
2932config_host_data.set('CONFIG_NETMAP', have_netmap)
2933
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002934# Work around a system header bug with some kernel/XFS header
2935# versions where they both try to define 'struct fsxattr':
2936# xfs headers will not try to redefine structs from linux headers
2937# if this macro is set.
2938config_host_data.set('HAVE_FSXATTR', cc.links('''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002939 #include <linux/fs.h>
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002940 struct fsxattr foo;
2941 int main(void) {
2942 return 0;
2943 }'''))
2944
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002945# Some versions of Mac OS X incorrectly define SIZE_MAX
2946config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2947 #include <stdint.h>
2948 #include <stdio.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002949 int main(void) {
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002950 return printf("%zu", SIZE_MAX);
2951 }''', args: ['-Werror']))
2952
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002953# See if 64-bit atomic operations are supported.
2954# Note that without __atomic builtins, we can only
2955# assume atomic loads/stores max at pointer size.
2956config_host_data.set('CONFIG_ATOMIC64', cc.links('''
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002957 #include <stdint.h>
2958 int main(void)
2959 {
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002960 uint64_t x = 0, y = 0;
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002961 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
2962 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
2963 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2964 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2965 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2966 return 0;
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02002967 }''', args: qemu_isa_flags))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002968
Richard Henderson6479dd72023-05-24 08:14:41 -07002969has_int128_type = cc.compiles('''
2970 __int128_t a;
2971 __uint128_t b;
2972 int main(void) { b = a; }''')
2973config_host_data.set('CONFIG_INT128_TYPE', has_int128_type)
2974
2975has_int128 = has_int128_type and cc.links('''
Marc-André Lureau848126d2022-02-28 15:49:19 +04002976 __int128_t a;
2977 __uint128_t b;
2978 int main (void) {
2979 a = a + b;
2980 b = a * b;
2981 a = a * a;
2982 return 0;
2983 }''')
Marc-André Lureau848126d2022-02-28 15:49:19 +04002984config_host_data.set('CONFIG_INT128', has_int128)
2985
Richard Henderson6479dd72023-05-24 08:14:41 -07002986if has_int128_type
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002987 # "do we have 128-bit atomics which are handled inline and specifically not
2988 # via libatomic". The reason we can't use libatomic is documented in the
2989 # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002990 # We only care about these operations on 16-byte aligned pointers, so
2991 # force 16-byte alignment of the pointer, which may be greater than
2992 # __alignof(unsigned __int128) for the host.
2993 atomic_test_128 = '''
2994 int main(int ac, char **av) {
Richard Henderson6479dd72023-05-24 08:14:41 -07002995 __uint128_t *p = __builtin_assume_aligned(av[ac - 1], 16);
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002996 p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED);
2997 __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED);
2998 __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2999 return 0;
3000 }'''
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02003001 has_atomic128 = cc.links(atomic_test_128, args: qemu_isa_flags)
Marc-André Lureau848126d2022-02-28 15:49:19 +04003002
3003 config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
3004
3005 if not has_atomic128
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003006 # Even with __builtin_assume_aligned, the above test may have failed
3007 # without optimization enabled. Try again with optimizations locally
3008 # enabled for the function. See
3009 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02003010 has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128,
3011 args: qemu_isa_flags)
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003012 config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt)
Marc-André Lureau848126d2022-02-28 15:49:19 +04003013
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003014 if not has_atomic128_opt
3015 config_host_data.set('CONFIG_CMPXCHG128', cc.links('''
3016 int main(void)
3017 {
Richard Henderson6479dd72023-05-24 08:14:41 -07003018 __uint128_t x = 0, y = 0;
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003019 __sync_val_compare_and_swap_16(&x, y, x);
3020 return 0;
3021 }
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02003022 ''', args: qemu_isa_flags))
Richard Hendersone61f1ef2022-11-05 11:34:58 +00003023 endif
Marc-André Lureau848126d2022-02-28 15:49:19 +04003024 endif
3025endif
Paolo Bonzinibd87a362021-10-07 15:08:25 +02003026
3027config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
3028 #include <sys/auxv.h>
3029 int main(void) {
3030 return getauxval(AT_HWCAP) == 0;
3031 }'''))
3032
Brad Smith27fca0a2024-07-27 23:58:55 -04003033config_host_data.set('CONFIG_ELF_AUX_INFO', cc.links(gnu_source_prefix + '''
3034 #include <sys/auxv.h>
3035 int main(void) {
3036 unsigned long hwcap = 0;
3037 elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
3038 return hwcap;
3039 }'''))
3040
Paolo Bonzini0dae95d2022-04-20 17:33:43 +02003041config_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
3042 #include <linux/usbdevice_fs.h>
3043
3044 #ifndef USBDEVFS_GET_CAPABILITIES
3045 #error "USBDEVFS_GET_CAPABILITIES undefined"
3046 #endif
3047
3048 #ifndef USBDEVFS_DISCONNECT_CLAIM
3049 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
3050 #endif
3051
3052 int main(void) { return 0; }'''))
3053
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02003054have_keyring = get_option('keyring') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003055 .require(host_os == 'linux', error_message: 'keyring is only available on Linux') \
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02003056 .require(cc.compiles('''
3057 #include <errno.h>
3058 #include <asm/unistd.h>
3059 #include <linux/keyctl.h>
3060 #include <sys/syscall.h>
3061 #include <unistd.h>
3062 int main(void) {
3063 return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
3064 }'''), error_message: 'keyctl syscall not available on this system').allowed()
3065config_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
3066
Paolo Bonzini622753d2021-11-08 13:38:58 +01003067have_cpuid_h = cc.links('''
3068 #include <cpuid.h>
3069 int main(void) {
3070 unsigned a, b, c, d;
3071 unsigned max = __get_cpuid_max(0, 0);
3072
3073 if (max >= 1) {
3074 __cpuid(1, a, b, c, d);
3075 }
3076
3077 if (max >= 7) {
3078 __cpuid_count(7, 0, a, b, c, d);
3079 }
3080
3081 return 0;
3082 }''')
3083config_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
3084
Richard Hendersone5717302024-06-27 17:36:43 +00003085# Don't bother to advertise asm/hwprobe.h for old versions that do
3086# not contain RISCV_HWPROBE_EXT_ZBA.
3087config_host_data.set('CONFIG_ASM_HWPROBE_H',
3088 cc.has_header_symbol('asm/hwprobe.h',
3089 'RISCV_HWPROBE_EXT_ZBA'))
3090
Paolo Bonzini622753d2021-11-08 13:38:58 +01003091config_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
3092 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
3093 .require(cc.links('''
Paolo Bonzini622753d2021-11-08 13:38:58 +01003094 #include <cpuid.h>
3095 #include <immintrin.h>
Richard Henderson701ea582022-12-03 19:31:12 -06003096 static int __attribute__((target("avx2"))) bar(void *a) {
Paolo Bonzini622753d2021-11-08 13:38:58 +01003097 __m256i x = *(__m256i *)a;
3098 return _mm256_testz_si256(x, x);
3099 }
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01003100 int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
Paolo Bonzini622753d2021-11-08 13:38:58 +01003101 '''), error_message: 'AVX2 not available').allowed())
3102
ling xu04ffce12022-11-16 23:29:22 +08003103config_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \
3104 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \
3105 .require(cc.links('''
ling xu04ffce12022-11-16 23:29:22 +08003106 #include <cpuid.h>
3107 #include <immintrin.h>
Richard Hendersondc165fc2023-05-01 22:05:55 +01003108 static int __attribute__((target("avx512bw"))) bar(void *a) {
ling xu04ffce12022-11-16 23:29:22 +08003109 __m512i *x = a;
3110 __m512i res= _mm512_abs_epi8(*x);
3111 return res[1];
3112 }
3113 int main(int argc, char *argv[]) { return bar(argv[0]); }
3114 '''), error_message: 'AVX512BW not available').allowed())
3115
Richard Henderson8d97f282023-06-02 07:43:40 +00003116# For both AArch64 and AArch32, detect if builtins are available.
3117config_host_data.set('CONFIG_ARM_AES_BUILTIN', cc.compiles('''
3118 #include <arm_neon.h>
3119 #ifndef __ARM_FEATURE_AES
3120 __attribute__((target("+crypto")))
3121 #endif
3122 void foo(uint8x16_t *p) { *p = vaesmcq_u8(*p); }
3123 '''))
3124
Paolo Bonzinib87df902021-11-08 13:52:11 +01003125if get_option('membarrier').disabled()
3126 have_membarrier = false
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003127elif host_os == 'windows'
Paolo Bonzinib87df902021-11-08 13:52:11 +01003128 have_membarrier = true
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003129elif host_os == 'linux'
Paolo Bonzinib87df902021-11-08 13:52:11 +01003130 have_membarrier = cc.compiles('''
3131 #include <linux/membarrier.h>
3132 #include <sys/syscall.h>
3133 #include <unistd.h>
3134 #include <stdlib.h>
3135 int main(void) {
3136 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
3137 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
3138 exit(0);
3139 }''')
3140endif
3141config_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
3142 .require(have_membarrier, error_message: 'membarrier system call not available') \
3143 .allowed())
3144
Paolo Bonzini34b52612021-11-08 14:02:42 +01003145have_afalg = get_option('crypto_afalg') \
3146 .require(cc.compiles(gnu_source_prefix + '''
3147 #include <errno.h>
3148 #include <sys/types.h>
3149 #include <sys/socket.h>
3150 #include <linux/if_alg.h>
3151 int main(void) {
3152 int sock;
3153 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
3154 return sock;
3155 }
3156 '''), error_message: 'AF_ALG requested but could not be detected').allowed()
3157config_host_data.set('CONFIG_AF_ALG', have_afalg)
3158
Marc-André Lureau9d734b82022-04-01 15:50:05 +04003159config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
3160 'linux/vm_sockets.h', 'AF_VSOCK',
3161 prefix: '#include <sys/socket.h>',
3162))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02003163
Marc-André Lureau8821a382022-02-01 16:53:43 +04003164have_vss = false
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003165have_vss_sdk = false # old xp/2003 SDK
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003166if host_os == 'windows' and 'cpp' in all_languages
Marc-André Lureau8821a382022-02-01 16:53:43 +04003167 have_vss = cxx.compiles('''
3168 #define __MIDL_user_allocate_free_DEFINED__
Marc-André Lureau32478cb2022-02-22 23:40:01 +04003169 #include <vss.h>
Marc-André Lureau8821a382022-02-01 16:53:43 +04003170 int main(void) { return VSS_CTX_BACKUP; }''')
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003171 have_vss_sdk = cxx.has_header('vscoordint.h')
Marc-André Lureau8821a382022-02-01 16:53:43 +04003172endif
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003173config_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
Marc-André Lureau8821a382022-02-01 16:53:43 +04003174
Richard Henderson6391c772022-04-17 11:30:06 -07003175# Older versions of MinGW do not import _lock_file and _unlock_file properly.
3176# This was fixed for v6.0.0 with commit b48e3ac8969d.
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003177if host_os == 'windows'
Richard Henderson6391c772022-04-17 11:30:06 -07003178 config_host_data.set('HAVE__LOCK_FILE', cc.links('''
3179 #include <stdio.h>
3180 int main(void) {
3181 _lock_file(NULL);
3182 _unlock_file(NULL);
3183 return 0;
3184 }''', name: '_lock_file and _unlock_file'))
3185endif
3186
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003187if host_os == 'windows'
Pierrick Bouvierdbd672c2023-02-21 16:30:04 +01003188 mingw_has_setjmp_longjmp = cc.links('''
3189 #include <setjmp.h>
3190 int main(void) {
3191 /*
3192 * These functions are not available in setjmp header, but may be
3193 * available at link time, from libmingwex.a.
3194 */
3195 extern int __mingw_setjmp(jmp_buf);
3196 extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int);
3197 jmp_buf env;
3198 __mingw_setjmp(env);
3199 __mingw_longjmp(env, 0);
3200 }
3201 ''', name: 'mingw setjmp and longjmp')
3202
3203 if cpu == 'aarch64' and not mingw_has_setjmp_longjmp
3204 error('mingw must provide setjmp/longjmp for windows-arm64')
3205 endif
3206endif
3207
Richard Hendersonacce7282025-02-02 15:09:23 -08003208# Detect host pointer size for the target configuration loop.
3209host_long_bits = cc.sizeof('void *') * 8
3210
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003211########################
3212# Target configuration #
3213########################
3214
Paolo Bonzini2becc362020-02-03 11:42:03 +01003215minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003216
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02003217config_all_accel = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04003218config_all_devices = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003219config_devices_mak_list = []
3220config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02003221config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003222config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003223
3224disassemblers = {
3225 'alpha' : ['CONFIG_ALPHA_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003226 'avr' : ['CONFIG_AVR_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06003227 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003228 'hppa' : ['CONFIG_HPPA_DIS'],
3229 'i386' : ['CONFIG_I386_DIS'],
3230 'x86_64' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003231 'm68k' : ['CONFIG_M68K_DIS'],
3232 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
3233 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003234 'or1k' : ['CONFIG_OPENRISC_DIS'],
3235 'ppc' : ['CONFIG_PPC_DIS'],
3236 'riscv' : ['CONFIG_RISCV_DIS'],
3237 'rx' : ['CONFIG_RX_DIS'],
3238 's390' : ['CONFIG_S390_DIS'],
3239 'sh4' : ['CONFIG_SH4_DIS'],
3240 'sparc' : ['CONFIG_SPARC_DIS'],
3241 'xtensa' : ['CONFIG_XTENSA_DIS'],
Song Gaoaae17462022-06-06 20:43:06 +08003242 'loongarch' : ['CONFIG_LOONGARCH_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003243}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003244
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02003245have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01003246host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02003247 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01003248 (have_tpm ? ['CONFIG_TPM=y'] : []) + \
Marc-André Lureaucca15752023-08-30 13:38:25 +04003249 (pixman.found() ? ['CONFIG_PIXMAN=y'] : []) + \
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02003250 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02003251 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini88b6e612022-04-20 17:33:40 +02003252 (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
Dorjoy Chowdhurybb154e32024-10-09 03:17:23 +06003253 (libcbor.found() ? ['CONFIG_LIBCBOR=y'] : []) + \
Dorjoy Chowdhury63d2a5c2024-10-09 03:17:24 +06003254 (gnutls.found() ? ['CONFIG_GNUTLS=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01003255 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini1935b7e2024-05-07 14:13:46 +02003256 (fdt.found() ? ['CONFIG_FDT=y'] : []) + \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003257 (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
3258 (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
3259 (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01003260 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003261 (host_os == 'linux' ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman55116962022-06-13 16:26:24 -04003262 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02003263 (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : []) + \
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03003264 (hv_balloon ? ['CONFIG_HV_BALLOON_POSSIBLE=y'] : []) + \
3265 (have_rust ? ['CONFIG_HAVE_RUST=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01003266
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003267ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003268
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003269default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
3270actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003271fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003272foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04003273 config_target = { 'TARGET_NAME': target.split('-')[0] }
3274 if target.endswith('linux-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003275 if host_os != 'linux'
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003276 if default_targets
3277 continue
3278 endif
3279 error('Target @0@ is only available on a Linux host'.format(target))
3280 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04003281 config_target += { 'CONFIG_LINUX_USER': 'y' }
3282 elif target.endswith('bsd-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003283 if host_os not in bsd_oses
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003284 if default_targets
3285 continue
3286 endif
3287 error('Target @0@ is only available on a BSD host'.format(target))
3288 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04003289 config_target += { 'CONFIG_BSD_USER': 'y' }
3290 elif target.endswith('softmmu')
Philippe Mathieu-Daudébd0c03b2023-06-13 15:33:45 +02003291 config_target += { 'CONFIG_SYSTEM_ONLY': 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04003292 config_target += { 'CONFIG_SOFTMMU': 'y' }
3293 endif
3294 if target.endswith('-user')
3295 config_target += {
3296 'CONFIG_USER_ONLY': 'y',
3297 'CONFIG_QEMU_INTERP_PREFIX':
Ilya Leoshkevichc1075212024-10-30 00:17:47 +01003298 get_option('interp_prefix').replace('%M', config_target['TARGET_NAME']),
3299 'CONFIG_QEMU_RTSIG_MAP': get_option('rtsig_map'),
Paolo Bonzini765686d2020-09-18 06:37:21 -04003300 }
3301 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02003302
Richard Hendersonacce7282025-02-02 15:09:23 -08003303 config_target += keyval.load('configs/targets' / target + '.mak')
3304
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003305 target_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04003306 foreach sym: accelerators
Richard Hendersonacce7282025-02-02 15:09:23 -08003307 # Disallow 64-bit on 32-bit emulation and virtualization
3308 if host_long_bits < config_target['TARGET_LONG_BITS'].to_int()
3309 continue
3310 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04003311 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
3312 config_target += { sym: 'y' }
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02003313 config_all_accel += { sym: 'y' }
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003314 target_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04003315 endif
3316 endforeach
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003317 if target_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003318 if default_targets
3319 continue
3320 endif
3321 error('No accelerator available for target @0@'.format(target))
3322 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04003323
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003324 if 'TARGET_NEED_FDT' in config_target and not fdt.found()
Paolo Bonzini9b089d22024-05-08 09:25:48 +02003325 if default_targets
3326 warning('Disabling ' + target + ' due to missing libfdt')
3327 else
3328 fdt_required += target
3329 endif
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003330 continue
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003331 endif
3332
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003333 actual_target_dirs += target
3334
Paolo Bonzinifa731682020-09-21 05:19:07 -04003335 # Add default keys
Richard Hendersonacce7282025-02-02 15:09:23 -08003336 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzinifa731682020-09-21 05:19:07 -04003337 if 'TARGET_BASE_ARCH' not in config_target
3338 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
3339 endif
3340 if 'TARGET_ABI_DIR' not in config_target
3341 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
3342 endif
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003343 if 'TARGET_BIG_ENDIAN' not in config_target
3344 config_target += {'TARGET_BIG_ENDIAN': 'n'}
3345 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02003346
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003347 foreach k, v: disassemblers
Paolo Bonzini823eb012021-11-08 14:18:17 +01003348 if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003349 foreach sym: v
3350 config_target += { sym: 'y' }
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003351 endforeach
3352 endif
3353 endforeach
3354
Paolo Bonzini859aef02020-08-04 18:14:26 +02003355 config_target_data = configuration_data()
3356 foreach k, v: config_target
3357 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
3358 # do nothing
3359 elif ignored.contains(k)
3360 # do nothing
3361 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003362 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
3363 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02003364 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04003365 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02003366 config_target_data.set_quoted(k, v)
3367 elif v == 'y'
3368 config_target_data.set(k, 1)
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003369 elif v == 'n'
3370 config_target_data.set(k, 0)
Paolo Bonzini859aef02020-08-04 18:14:26 +02003371 else
3372 config_target_data.set(k, v)
3373 endif
3374 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01003375 config_target_data.set('QEMU_ARCH',
3376 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02003377 config_target_h += {target: configure_file(output: target + '-config-target.h',
3378 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003379
3380 if target.endswith('-softmmu')
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003381 target_kconfig += 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'
3382 target_kconfig += 'CONFIG_TARGET_BIG_ENDIAN=' + config_target['TARGET_BIG_ENDIAN']
3383
Paolo Bonziniae3a4202025-02-19 11:18:28 +01003384 # PVG is not cross-architecture. Use accelerator_targets as a proxy to
3385 # figure out which target can support PVG on this host
3386 if pvg.found() and target in accelerator_targets.get('CONFIG_HVF', [])
3387 target_kconfig += 'CONFIG_MAC_PVG=y'
3388 endif
3389
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003390 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003391 config_devices_mak = target + '-config-devices.mak'
3392 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003393 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01003394 output: config_devices_mak,
3395 depfile: config_devices_mak + '.d',
3396 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01003397 command: [minikconf,
3398 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01003399 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003400 host_kconfig, target_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02003401
3402 config_devices_data = configuration_data()
3403 config_devices = keyval.load(config_devices_mak)
3404 foreach k, v: config_devices
3405 config_devices_data.set(k, 1)
3406 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003407 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02003408 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
3409 configuration: config_devices_data)}
3410 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04003411 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01003412 endif
3413 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003414endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003415target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003416
Paolo Bonzinieed56e92021-11-10 11:01:26 +01003417target_configs_h = []
3418foreach target: target_dirs
3419 target_configs_h += config_target_h[target]
3420 target_configs_h += config_devices_h.get(target, [])
3421endforeach
3422genh += custom_target('config-poison.h',
3423 input: [target_configs_h],
3424 output: 'config-poison.h',
3425 capture: true,
3426 command: [find_program('scripts/make-config-poison.sh'),
3427 target_configs_h])
3428
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003429if fdt_required.length() > 0
3430 error('fdt disabled but required by targets ' + ', '.join(fdt_required))
3431endif
3432
Paolo Bonzinia775c712023-09-08 12:09:22 +02003433###############
3434# Subprojects #
3435###############
Paolo Bonzini4d34a862020-10-05 11:31:15 +02003436
Jagannathan Raman55116962022-06-13 16:26:24 -04003437libvfio_user_dep = not_found
3438if have_system and vfio_user_server_allowed
Paolo Bonzini2019cab2023-05-18 16:50:00 +02003439 libvfio_user_proj = subproject('libvfio-user', required: true)
Paolo Bonzini53283532023-03-30 12:47:23 +02003440 libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
Jagannathan Raman55116962022-06-13 16:26:24 -04003441endif
3442
Paolo Bonzinia775c712023-09-08 12:09:22 +02003443vhost_user = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003444if host_os == 'linux' and have_vhost_user
Paolo Bonzinia775c712023-09-08 12:09:22 +02003445 libvhost_user = subproject('libvhost-user')
3446 vhost_user = libvhost_user.get_variable('vhost_user_dep')
3447endif
3448
3449libvduse = not_found
3450if have_libvduse
3451 libvduse_proj = subproject('libvduse')
3452 libvduse = libvduse_proj.get_variable('libvduse_dep')
3453endif
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003454
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003455#####################
3456# Generated sources #
3457#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003458
Paolo Bonzinif3a6e9b2024-11-12 11:54:11 +01003459config_host_h = configure_file(output: 'config-host.h', configuration: config_host_data)
3460genh += config_host_h
Paolo Bonzini7b72c7d2024-10-15 11:14:18 +02003461
Marc-André Lureau3f885652019-07-15 18:06:04 +04003462hxtool = find_program('scripts/hxtool')
Marc-André Lureaue2c40122023-01-24 18:00:57 +00003463shaderinclude = find_program('scripts/shaderinclude.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003464qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003465qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
3466 meson.current_source_dir() / 'scripts/qapi/commands.py',
3467 meson.current_source_dir() / 'scripts/qapi/common.py',
3468 meson.current_source_dir() / 'scripts/qapi/error.py',
3469 meson.current_source_dir() / 'scripts/qapi/events.py',
3470 meson.current_source_dir() / 'scripts/qapi/expr.py',
3471 meson.current_source_dir() / 'scripts/qapi/gen.py',
3472 meson.current_source_dir() / 'scripts/qapi/introspect.py',
Markus Armbruster88d357d2023-04-28 12:54:16 +02003473 meson.current_source_dir() / 'scripts/qapi/main.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003474 meson.current_source_dir() / 'scripts/qapi/parser.py',
3475 meson.current_source_dir() / 'scripts/qapi/schema.py',
3476 meson.current_source_dir() / 'scripts/qapi/source.py',
3477 meson.current_source_dir() / 'scripts/qapi/types.py',
Daniel P. Berrangé2ebb09f2025-02-05 12:35:50 +00003478 meson.current_source_dir() / 'scripts/qapi/features.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003479 meson.current_source_dir() / 'scripts/qapi/visit.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003480 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003481]
3482
3483tracetool = [
3484 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003485 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003486]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003487tracetool_depends = files(
3488 'scripts/tracetool/backend/log.py',
3489 'scripts/tracetool/backend/__init__.py',
3490 'scripts/tracetool/backend/dtrace.py',
3491 'scripts/tracetool/backend/ftrace.py',
3492 'scripts/tracetool/backend/simple.py',
3493 'scripts/tracetool/backend/syslog.py',
3494 'scripts/tracetool/backend/ust.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003495 'scripts/tracetool/format/ust_events_c.py',
3496 'scripts/tracetool/format/ust_events_h.py',
3497 'scripts/tracetool/format/__init__.py',
3498 'scripts/tracetool/format/d.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003499 'scripts/tracetool/format/simpletrace_stap.py',
3500 'scripts/tracetool/format/c.py',
3501 'scripts/tracetool/format/h.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003502 'scripts/tracetool/format/log_stap.py',
3503 'scripts/tracetool/format/stap.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003504 'scripts/tracetool/__init__.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003505)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003506
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003507qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
3508 meson.current_source_dir(),
Paolo Bonzinib0b43232022-04-20 17:33:54 +02003509 get_option('pkgversion'), meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003510qemu_version = custom_target('qemu-version.h',
3511 output: 'qemu-version.h',
3512 command: qemu_version_cmd,
3513 capture: true,
3514 build_by_default: true,
3515 build_always_stale: true)
3516genh += qemu_version
3517
Marc-André Lureau3f885652019-07-15 18:06:04 +04003518hxdep = []
3519hx_headers = [
3520 ['qemu-options.hx', 'qemu-options.def'],
3521 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
3522]
3523if have_system
3524 hx_headers += [
3525 ['hmp-commands.hx', 'hmp-commands.h'],
3526 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
3527 ]
3528endif
3529foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003530 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04003531 input: files(d[0]),
3532 output: d[1],
3533 capture: true,
Marc-André Lureau3f885652019-07-15 18:06:04 +04003534 command: [hxtool, '-h', '@INPUT0@'])
3535endforeach
3536genh += hxdep
3537
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003538###############
3539# Trace files #
3540###############
3541
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003542# TODO: add each directory to the subdirs from its own meson.build, once
3543# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003544trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003545 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003546 'qapi',
3547 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003548 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003549 'util',
Alex Bennée842b42d2022-09-29 12:42:22 +01003550 'gdbstub',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003551]
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003552if have_linux_user
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003553 trace_events_subdirs += [ 'linux-user' ]
3554endif
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003555if have_bsd_user
3556 trace_events_subdirs += [ 'bsd-user' ]
3557endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003558if have_block
3559 trace_events_subdirs += [
3560 'authz',
3561 'block',
Daniel P. Berrangé48fc8872024-07-23 11:31:24 +01003562 'chardev',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003563 'io',
3564 'nbd',
3565 'scsi',
3566 ]
3567endif
3568if have_system
3569 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003570 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003571 'audio',
3572 'backends',
3573 'backends/tpm',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003574 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003575 'hw/9pfs',
3576 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08003577 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003578 'hw/alpha',
3579 'hw/arm',
3580 'hw/audio',
3581 'hw/block',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003582 'hw/char',
3583 'hw/display',
3584 'hw/dma',
Ninad Palsule99f0c042024-01-26 04:49:46 -06003585 'hw/fsi',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003586 'hw/hyperv',
3587 'hw/i2c',
3588 'hw/i386',
3589 'hw/i386/xen',
David Woodhouseaa98ee32023-01-13 19:51:32 +00003590 'hw/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003591 'hw/ide',
3592 'hw/input',
3593 'hw/intc',
3594 'hw/isa',
3595 'hw/mem',
3596 'hw/mips',
3597 'hw/misc',
3598 'hw/misc/macio',
3599 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08003600 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01003601 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02003602 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003603 'hw/nvram',
3604 'hw/pci',
3605 'hw/pci-host',
3606 'hw/ppc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003607 'hw/rtc',
Tomasz Jeznach0c54acb2024-10-16 17:40:27 -03003608 'hw/riscv',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003609 'hw/s390x',
3610 'hw/scsi',
3611 'hw/sd',
Bernhard Beschow3647dca2024-11-05 10:10:00 +00003612 'hw/sensor',
BALATON Zoltanad52cfc2021-10-29 23:02:09 +02003613 'hw/sh4',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003614 'hw/sparc',
3615 'hw/sparc64',
3616 'hw/ssi',
3617 'hw/timer',
3618 'hw/tpm',
Gerd Hoffmann736ca802025-02-25 17:30:21 +01003619 'hw/uefi',
Jeuk Kimbc4e68d2023-09-06 16:43:48 +09003620 'hw/ufs',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003621 'hw/usb',
3622 'hw/vfio',
3623 'hw/virtio',
Alexander Graf11fa0562023-06-14 22:56:23 +00003624 'hw/vmapple',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003625 'hw/watchdog',
3626 'hw/xen',
3627 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003628 'migration',
3629 'net',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003630 'system',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003631 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05003632 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003633 ]
3634endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003635if have_system or have_user
3636 trace_events_subdirs += [
3637 'accel/tcg',
3638 'hw/core',
3639 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02003640 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003641 'target/hppa',
3642 'target/i386',
3643 'target/i386/kvm',
Tianrui Zhaof8447432024-01-05 15:57:59 +08003644 'target/loongarch',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02003645 'target/mips/tcg',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003646 'target/ppc',
3647 'target/riscv',
3648 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08003649 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003650 'target/sparc',
3651 ]
3652endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003653
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003654###################
3655# Collect sources #
3656###################
3657
3658authz_ss = ss.source_set()
3659blockdev_ss = ss.source_set()
3660block_ss = ss.source_set()
3661chardev_ss = ss.source_set()
3662common_ss = ss.source_set()
3663crypto_ss = ss.source_set()
3664hwcore_ss = ss.source_set()
3665io_ss = ss.source_set()
3666qmp_ss = ss.source_set()
3667qom_ss = ss.source_set()
3668system_ss = ss.source_set()
3669specific_fuzz_ss = ss.source_set()
3670specific_ss = ss.source_set()
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02003671rust_devices_ss = ss.source_set()
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003672stub_ss = ss.source_set()
3673trace_ss = ss.source_set()
3674user_ss = ss.source_set()
3675util_ss = ss.source_set()
3676
3677# accel modules
3678qtest_module_ss = ss.source_set()
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003679
3680modules = {}
3681target_modules = {}
Pierrick Bouvier892b06c2025-03-04 22:24:15 +00003682plugin_modules = []
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003683hw_arch = {}
3684target_arch = {}
3685target_system_arch = {}
3686target_user_arch = {}
3687
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +01003688# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
3689# that is filled in by qapi/.
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003690subdir('qapi')
3691subdir('qobject')
3692subdir('stubs')
3693subdir('trace')
3694subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04003695subdir('qom')
3696subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003697subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04003698subdir('ui')
Alex Bennée842b42d2022-09-29 12:42:22 +01003699subdir('gdbstub')
Philippe Mathieu-Daudé68621262024-04-08 17:53:20 +02003700if have_system
3701 subdir('hw')
3702else
3703 subdir('hw/core')
3704endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003705
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003706if enable_modules
3707 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
Akihiko Odaki414b1802024-05-24 17:00:22 +09003708 modulecommon = declare_dependency(objects: libmodulecommon.extract_all_objects(recursive: false), compile_args: '-DBUILD_DSO')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003709endif
3710
Paolo Bonzini1220f582023-08-30 11:52:43 +02003711qom_ss = qom_ss.apply({})
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003712libqom = static_library('qom', qom_ss.sources() + genh,
3713 dependencies: [qom_ss.dependencies()],
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003714 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003715qom = declare_dependency(objects: libqom.extract_all_objects(recursive: false),
3716 dependencies: qom_ss.dependencies())
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003717
3718event_loop_base = files('event-loop-base.c')
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003719event_loop_base = static_library('event-loop-base',
3720 sources: event_loop_base + genh,
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003721 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003722event_loop_base = declare_dependency(objects: event_loop_base.extract_all_objects(recursive: false),
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003723 dependencies: [qom])
3724
Paolo Bonzini1220f582023-08-30 11:52:43 +02003725stub_ss = stub_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003726
3727util_ss.add_all(trace_ss)
Paolo Bonzini1220f582023-08-30 11:52:43 +02003728util_ss = util_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003729libqemuutil = static_library('qemuutil',
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003730 build_by_default: false,
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003731 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6190fd62024-04-08 17:53:13 +02003732 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc])
Steve Sistare57ad6ab2025-01-15 11:00:27 -08003733qemuutil_deps = [event_loop_base]
3734if host_os != 'windows'
3735 qemuutil_deps += [rt]
3736endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003737qemuutil = declare_dependency(link_with: libqemuutil,
Nicolas Saenz Julienne70ac26b2022-04-25 09:57:22 +02003738 sources: genh + version_res,
Steve Sistare57ad6ab2025-01-15 11:00:27 -08003739 dependencies: qemuutil_deps)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003740
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01003741if have_system or have_user
3742 decodetree = generator(find_program('scripts/decodetree.py'),
3743 output: 'decode-@BASENAME@.c.inc',
3744 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3745 subdir('libdecnumber')
3746 subdir('target')
3747endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003748
Paolo Bonzini478e9432020-08-17 12:47:55 +02003749subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04003750subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04003751subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003752subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04003753subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003754
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003755if have_block
3756 block_ss.add(files(
3757 'block.c',
3758 'blockjob.c',
3759 'job.c',
3760 'qemu-io-cmds.c',
3761 ))
Paolo Bonzini406523f2021-10-13 11:43:54 +02003762 if config_host_data.get('CONFIG_REPLICATION')
3763 block_ss.add(files('replication.c'))
3764 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003765
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003766 subdir('nbd')
3767 subdir('scsi')
3768 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003769
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003770 blockdev_ss.add(files(
3771 'blockdev.c',
3772 'blockdev-nbd.c',
3773 'iothread.c',
3774 'job-qmp.c',
Akihiko Odaki7b1070a2024-05-24 17:00:23 +09003775 ))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003776
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003777 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
3778 # os-win32.c does not
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003779 if host_os == 'windows'
Paolo Bonzinidc495492023-08-30 11:29:54 +02003780 system_ss.add(files('os-win32.c'))
3781 else
3782 blockdev_ss.add(files('os-posix.c'))
3783 endif
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003784endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02003785
Philippe Mathieu-Daudéfe0007f2023-09-14 20:57:12 +02003786common_ss.add(files('cpu-common.c'))
3787specific_ss.add(files('cpu-target.c'))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003788
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003789subdir('system')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003790
Richard Henderson44b99a62021-03-22 12:24:26 +01003791# Work around a gcc bug/misfeature wherein constant propagation looks
3792# through an alias:
3793# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
3794# to guess that a const variable is always zero. Without lto, this is
3795# impossible, as the alias is restricted to page-vary-common.c. Indeed,
3796# without lto, not even the alias is required -- we simply use different
3797# declarations in different compilation units.
3798pagevary = files('page-vary-common.c')
3799if get_option('b_lto')
3800 pagevary_flags = ['-fno-lto']
3801 if get_option('cfi')
3802 pagevary_flags += '-fno-sanitize=cfi-icall'
3803 endif
Thomas Huth54c9b192022-03-30 13:48:08 +02003804 pagevary = static_library('page-vary-common', sources: pagevary + genh,
Richard Henderson44b99a62021-03-22 12:24:26 +01003805 c_args: pagevary_flags)
3806 pagevary = declare_dependency(link_with: pagevary)
3807endif
3808common_ss.add(pagevary)
Philippe Mathieu-Daudé75bbe6a2023-12-07 10:41:27 +01003809specific_ss.add(files('page-target.c', 'page-vary-target.c'))
Richard Henderson6670d4d2021-03-22 12:24:24 +01003810
Marc-André Lureauab318052019-07-24 19:23:16 +04003811subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04003812subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04003813subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003814subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04003815subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04003816subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00003817subdir('semihosting')
Markus Armbrusteraa09b3d2023-01-24 13:19:36 +01003818subdir('stats')
Richard Henderson104cc2c2021-03-08 12:04:33 -08003819subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08003820subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04003821subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003822subdir('plugins')
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003823subdir('ebpf')
3824
Pierrick Bouvier2181b922024-10-23 14:28:11 -07003825if 'CONFIG_TCG' in config_all_accel
3826 subdir('contrib/plugins')
3827endif
3828
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003829common_user_inc = []
3830
3831subdir('common-user')
Marc-André Lureaub309c322019-08-18 19:20:37 +04003832subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04003833subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003834
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003835# needed for fuzzing binaries
3836subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003837subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003838
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003839# accel modules
Richard Hendersona802d5c2025-02-02 13:38:14 -08003840target_modules += { 'accel' : { 'qtest': qtest_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003841
Paolo Bonziniea444d92023-09-08 12:06:12 +02003842##############################################
3843# Internal static_libraries and dependencies #
3844##############################################
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003845
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003846modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003847modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003848modinfo_files = []
3849
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003850block_mods = []
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003851system_mods = []
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003852emulator_modules = []
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003853foreach d, list : modules
Paolo Bonzinief709862023-05-04 10:20:46 +02003854 if not (d == 'block' ? have_block : have_system)
3855 continue
3856 endif
3857
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003858 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003859 if enable_modules
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003860 module_ss.add(modulecommon)
Paolo Bonzini0d665492023-08-31 11:18:24 +02003861 module_ss = module_ss.apply(config_all_devices, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003862 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003863 dependencies: module_ss.dependencies(), pic: true)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003864 if d == 'block'
3865 block_mods += sl
3866 else
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003867 system_mods += sl
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003868 endif
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003869 emulator_modules += shared_module(sl.name(),
3870 name_prefix: '',
Akihiko Odaki414b1802024-05-24 17:00:22 +09003871 objects: sl.extract_all_objects(recursive: false),
3872 dependencies: module_ss.dependencies(),
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003873 install: true,
3874 install_dir: qemu_moddir)
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003875 if module_ss.sources() != []
3876 # FIXME: Should use sl.extract_all_objects(recursive: true) as
3877 # input. Sources can be used multiple times but objects are
3878 # unique when it comes to lookup in compile_commands.json.
3879 # Depnds on a mesion version with
3880 # https://github.com/mesonbuild/meson/pull/8900
3881 modinfo_files += custom_target(d + '-' + m + '.modinfo',
3882 output: d + '-' + m + '.modinfo',
Paolo Bonziniac347112021-07-21 18:51:57 +02003883 input: module_ss.sources() + genh,
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003884 capture: true,
Paolo Bonziniac347112021-07-21 18:51:57 +02003885 command: [modinfo_collect, module_ss.sources()])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003886 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003887 else
3888 if d == 'block'
3889 block_ss.add_all(module_ss)
3890 else
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003891 system_ss.add_all(module_ss)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003892 endif
3893 endif
3894 endforeach
3895endforeach
3896
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003897foreach d, list : target_modules
3898 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003899 if enable_modules
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003900 module_ss.add(modulecommon)
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003901 foreach target : target_dirs
3902 if target.endswith('-softmmu')
3903 config_target = config_target_mak[target]
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003904 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
Philippe Mathieu-Daudé7d7a21b2023-06-13 16:29:11 +02003905 c_args = ['-DCOMPILING_PER_TARGET',
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003906 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3907 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3908 target_module_ss = module_ss.apply(config_target, strict: false)
3909 if target_module_ss.sources() != []
3910 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3911 sl = static_library(module_name,
3912 [genh, target_module_ss.sources()],
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003913 dependencies: target_module_ss.dependencies(),
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003914 include_directories: target_inc,
3915 c_args: c_args,
3916 pic: true)
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003917 system_mods += sl
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003918 emulator_modules += shared_module(sl.name(),
3919 name_prefix: '',
Akihiko Odaki414b1802024-05-24 17:00:22 +09003920 objects: sl.extract_all_objects(recursive: false),
3921 dependencies: target_module_ss.dependencies(),
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003922 install: true,
3923 install_dir: qemu_moddir)
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003924 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
3925 modinfo_files += custom_target(module_name + '.modinfo',
3926 output: module_name + '.modinfo',
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003927 input: target_module_ss.sources() + genh,
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003928 capture: true,
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003929 command: [modinfo_collect, '--target', target, target_module_ss.sources()])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003930 endif
3931 endif
3932 endforeach
3933 else
3934 specific_ss.add_all(module_ss)
3935 endif
3936 endforeach
3937endforeach
3938
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003939if enable_modules
Jose R. Ziviani05d68142022-05-28 00:20:35 +02003940 foreach target : target_dirs
3941 if target.endswith('-softmmu')
3942 config_target = config_target_mak[target]
3943 config_devices_mak = target + '-config-devices.mak'
3944 modinfo_src = custom_target('modinfo-' + target + '.c',
3945 output: 'modinfo-' + target + '.c',
3946 input: modinfo_files,
3947 command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
3948 capture: true)
3949
3950 modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
3951 modinfo_dep = declare_dependency(link_with: modinfo_lib)
3952
3953 arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
3954 hw_arch[arch].add(modinfo_dep)
3955 endif
3956 endforeach
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003957
3958 if emulator_modules.length() > 0
3959 alias_target('modules', emulator_modules)
3960 endif
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003961endif
3962
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003963nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08003964undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003965block_syms = custom_target('block.syms', output: 'block.syms',
3966 input: [libqemuutil, block_mods],
3967 capture: true,
3968 command: [undefsym, nm, '@INPUT@'])
3969qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003970 input: [libqemuutil, system_mods],
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003971 capture: true,
3972 command: [undefsym, nm, '@INPUT@'])
3973
Paolo Bonzini1220f582023-08-30 11:52:43 +02003974authz_ss = authz_ss.apply({})
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003975libauthz = static_library('authz', authz_ss.sources() + genh,
3976 dependencies: [authz_ss.dependencies()],
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003977 build_by_default: false)
3978
Akihiko Odaki414b1802024-05-24 17:00:22 +09003979authz = declare_dependency(objects: libauthz.extract_all_objects(recursive: false),
3980 dependencies: [authz_ss.dependencies(), qom])
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003981
Paolo Bonzini1220f582023-08-30 11:52:43 +02003982crypto_ss = crypto_ss.apply({})
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003983libcrypto = static_library('crypto', crypto_ss.sources() + genh,
3984 dependencies: [crypto_ss.dependencies()],
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003985 build_by_default: false)
3986
Akihiko Odaki414b1802024-05-24 17:00:22 +09003987crypto = declare_dependency(objects: libcrypto.extract_all_objects(recursive: false),
3988 dependencies: [crypto_ss.dependencies(), authz, qom])
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003989
Paolo Bonzini1220f582023-08-30 11:52:43 +02003990io_ss = io_ss.apply({})
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003991libio = static_library('io', io_ss.sources() + genh,
3992 dependencies: [io_ss.dependencies()],
3993 link_with: libqemuutil,
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003994 build_by_default: false)
3995
Akihiko Odaki414b1802024-05-24 17:00:22 +09003996io = declare_dependency(objects: libio.extract_all_objects(recursive: false),
3997 dependencies: [io_ss.dependencies(), crypto, qom])
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003998
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003999libmigration = static_library('migration', sources: migration_files + genh,
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02004000 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09004001migration = declare_dependency(objects: libmigration.extract_all_objects(recursive: false),
Paolo Bonzini70eb5fd2024-05-24 18:16:08 +02004002 dependencies: [qom, io])
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02004003system_ss.add(migration)
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02004004
Paolo Bonzini1220f582023-08-30 11:52:43 +02004005block_ss = block_ss.apply({})
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04004006libblock = static_library('block', block_ss.sources() + genh,
4007 dependencies: block_ss.dependencies(),
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04004008 build_by_default: false)
4009
Akihiko Odaki414b1802024-05-24 17:00:22 +09004010block = declare_dependency(objects: libblock.extract_all_objects(recursive: false),
4011 dependencies: [block_ss.dependencies(), crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04004012
Paolo Bonzini1220f582023-08-30 11:52:43 +02004013blockdev_ss = blockdev_ss.apply({})
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01004014libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
4015 dependencies: blockdev_ss.dependencies(),
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01004016 build_by_default: false)
4017
Akihiko Odaki414b1802024-05-24 17:00:22 +09004018blockdev = declare_dependency(objects: libblockdev.extract_all_objects(recursive: false),
4019 dependencies: [blockdev_ss.dependencies(), block, event_loop_base])
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01004020
Paolo Bonzini1220f582023-08-30 11:52:43 +02004021qmp_ss = qmp_ss.apply({})
Paolo Bonziniff219dc2020-08-04 21:14:26 +02004022libqmp = static_library('qmp', qmp_ss.sources() + genh,
4023 dependencies: qmp_ss.dependencies(),
Paolo Bonziniff219dc2020-08-04 21:14:26 +02004024 build_by_default: false)
4025
Akihiko Odaki414b1802024-05-24 17:00:22 +09004026qmp = declare_dependency(objects: libqmp.extract_all_objects(recursive: false),
4027 dependencies: qmp_ss.dependencies())
Paolo Bonziniff219dc2020-08-04 21:14:26 +02004028
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02004029libchardev = static_library('chardev', chardev_ss.sources() + genh,
Marc-André Lureau22d1f7a2022-03-23 19:57:12 +04004030 dependencies: chardev_ss.dependencies(),
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02004031 build_by_default: false)
4032
Akihiko Odaki414b1802024-05-24 17:00:22 +09004033chardev = declare_dependency(objects: libchardev.extract_all_objects(recursive: false),
Paolo Bonzini41494da2025-02-27 13:34:30 +01004034 dependencies: [chardev_ss.dependencies(), io])
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02004035
Paolo Bonzini1220f582023-08-30 11:52:43 +02004036hwcore_ss = hwcore_ss.apply({})
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02004037libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02004038 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09004039hwcore = declare_dependency(objects: libhwcore.extract_all_objects(recursive: false))
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02004040common_ss.add(hwcore)
4041
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02004042###########
4043# Targets #
4044###########
4045
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02004046system_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004047common_ss.add(qom, qemuutil)
4048
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02004049common_ss.add_all(when: 'CONFIG_SYSTEM_ONLY', if_true: [system_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01004050common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
4051
Paolo Bonzini0d665492023-08-31 11:18:24 +02004052# Note that this library is never used directly (only through extract_objects)
4053# and is not built by default; therefore, source files not used by the build
4054# configuration will be in build.ninja, but are never built by default.
Paolo Bonzini2becc362020-02-03 11:42:03 +01004055common_all = static_library('common',
4056 build_by_default: false,
Paolo Bonzini0d665492023-08-31 11:18:24 +02004057 sources: common_ss.all_sources() + genh,
Paolo Bonzini9d24fb72021-12-21 16:09:54 +01004058 include_directories: common_user_inc,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09004059 implicit_include_directories: false,
Paolo Bonzini44081552024-05-24 10:56:55 +02004060 dependencies: common_ss.all_dependencies())
Paolo Bonzini2becc362020-02-03 11:42:03 +01004061
Paolo Bonzinie2b39052024-10-18 19:33:22 +02004062if have_rust
Paolo Bonzinice4a1442024-10-25 09:20:16 +02004063 # We would like to use --generate-cstr, but it is only available
4064 # starting with bindgen 0.66.0. The oldest supported versions
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004065 # is 0.60.x (Debian 12 has 0.60.1) which introduces --allowlist-file.
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004066 bindgen_args = [
4067 '--disable-header-comment',
4068 '--raw-line', '// @generated',
Paolo Bonzini9f7d4522024-10-24 13:53:59 +02004069 '--ctypes-prefix', 'std::os::raw',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004070 '--generate-block',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004071 '--impl-debug',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004072 '--no-doc-comments',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004073 '--with-derive-default',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004074 '--no-layout-tests',
4075 '--no-prepend-enum-name',
4076 '--allowlist-file', meson.project_source_root() + '/include/.*',
4077 '--allowlist-file', meson.project_source_root() + '/.*',
4078 '--allowlist-file', meson.project_build_root() + '/.*'
4079 ]
Paolo Bonzini5b1b5a82024-10-18 19:23:00 +02004080 if not rustfmt.found()
4081 if bindgen.version().version_compare('<0.65.0')
4082 bindgen_args += ['--no-rustfmt-bindings']
4083 else
4084 bindgen_args += ['--formatter', 'none']
4085 endif
4086 endif
Paolo Bonzini131c5842025-02-06 12:15:13 +01004087 if bindgen.version().version_compare('>=0.66.0')
4088 bindgen_args += ['--rust-target', '1.59']
4089 endif
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004090 if bindgen.version().version_compare('<0.61.0')
4091 # default in 0.61+
4092 bindgen_args += ['--size_t-is-usize']
4093 else
4094 bindgen_args += ['--merge-extern-blocks']
4095 endif
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004096 c_enums = [
4097 'DeviceCategory',
4098 'GpioPolarity',
4099 'MachineInitPhase',
4100 'MemoryDeviceInfoKind',
4101 'MigrationPolicy',
4102 'MigrationPriority',
4103 'QEMUChrEvent',
4104 'QEMUClockType',
Paolo Bonzini5472a382025-01-17 11:26:48 +01004105 'ResetType',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004106 'device_endian',
4107 'module_init_type',
4108 ]
4109 foreach enum : c_enums
4110 bindgen_args += ['--rustified-enum', enum]
4111 endforeach
4112 c_bitfields = [
4113 'ClockEvent',
4114 'VMStateFlags',
4115 ]
4116 foreach enum : c_bitfields
4117 bindgen_args += ['--bitfield-enum', enum]
4118 endforeach
4119
4120 # TODO: Remove this comment when the clang/libclang mismatch issue is solved.
4121 #
4122 # Rust bindings generation with `bindgen` might fail in some cases where the
4123 # detected `libclang` does not match the expected `clang` version/target. In
4124 # this case you must pass the path to `clang` and `libclang` to your build
4125 # command invocation using the environment variables CLANG_PATH and
4126 # LIBCLANG_PATH
Paolo Bonzinibe3fc972024-10-15 10:08:57 +02004127 bindings_rs = rust.bindgen(
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004128 input: 'rust/wrapper.h',
4129 dependencies: common_ss.all_dependencies(),
Paolo Bonzinicb7ada52024-11-12 11:52:23 +01004130 output: 'bindings.inc.rs',
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004131 include_directories: include_directories('.', 'include'),
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004132 bindgen_version: ['>=0.60.0'],
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03004133 args: bindgen_args,
4134 )
4135 subdir('rust')
4136endif
4137
4138
Akihiko Odaki956af7d2023-10-09 17:40:51 +01004139feature_to_c = find_program('scripts/feature_to_c.py')
Paolo Bonzinid1e526c2024-10-15 11:59:14 +02004140rust_root_crate = find_program('scripts/rust/rust_root_crate.sh')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04004141
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004142if host_os == 'darwin'
Philippe Mathieu-Daudé30cfa502022-02-15 17:25:03 +01004143 entitlement = find_program('scripts/entitlement.sh')
4144endif
4145
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004146traceable = []
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04004147emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01004148foreach target : target_dirs
4149 config_target = config_target_mak[target]
4150 target_name = config_target['TARGET_NAME']
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004151 target_base_arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02004152 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004153 arch_deps = []
Philippe Mathieu-Daudé7d7a21b2023-06-13 16:29:11 +02004154 c_args = ['-DCOMPILING_PER_TARGET',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004155 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
Philippe Mathieu-Daudéedbceac2024-12-18 15:36:07 +01004156 ]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04004157 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01004158
4159 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004160 if host_os == 'linux'
Paolo Bonzini2becc362020-02-03 11:42:03 +01004161 target_inc += include_directories('linux-headers', is_system: true)
4162 endif
4163 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01004164 target_type='system'
Philippe Mathieu-Daudé01c85e62023-10-04 11:06:27 +02004165 t = target_system_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004166 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004167 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004168
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004169 hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
Philippe Mathieu-Daudébf964322023-11-21 13:52:48 +01004170 if hw_arch.has_key(hw_dir)
4171 hw = hw_arch[hw_dir].apply(config_target, strict: false)
4172 arch_srcs += hw.sources()
4173 arch_deps += hw.dependencies()
4174 endif
Marc-André Lureau2c442202019-08-17 13:55:58 +04004175
Philippe Mathieu-Daudéedbceac2024-12-18 15:36:07 +01004176 c_args += ['-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzini2becc362020-02-03 11:42:03 +01004177 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004178 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01004179 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04004180 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01004181 target_type='user'
Paolo Bonzinia3a576b2021-12-21 16:23:55 +01004182 target_inc += common_user_inc
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004183 if target_base_arch in target_user_arch
4184 t = target_user_arch[target_base_arch].apply(config_target, strict: false)
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02004185 arch_srcs += t.sources()
4186 arch_deps += t.dependencies()
4187 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01004188 if 'CONFIG_LINUX_USER' in config_target
4189 base_dir = 'linux-user'
Warner Loshe2a74722021-08-03 17:17:17 -06004190 endif
4191 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01004192 base_dir = 'bsd-user'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004193 target_inc += include_directories('bsd-user/' / host_os)
Warner Losh85fc1b52022-01-08 17:27:34 -07004194 target_inc += include_directories('bsd-user/host/' / host_arch)
Warner Loshe2a74722021-08-03 17:17:17 -06004195 dir = base_dir / abi
Warner Losh19bf1292021-11-04 16:34:48 -06004196 arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01004197 endif
4198 target_inc += include_directories(
4199 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04004200 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01004201 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04004202 if 'CONFIG_LINUX_USER' in config_target
4203 dir = base_dir / abi
4204 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
4205 if config_target.has_key('TARGET_SYSTBL_ABI')
4206 arch_srcs += \
4207 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
4208 extra_args : config_target['TARGET_SYSTBL_ABI'])
4209 endif
4210 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01004211 endif
4212
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04004213 if 'TARGET_XML_FILES' in config_target
4214 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
4215 output: target + '-gdbstub-xml.c',
4216 input: files(config_target['TARGET_XML_FILES'].split()),
4217 command: [feature_to_c, '@INPUT@'],
4218 capture: true)
4219 arch_srcs += gdbstub_xml
4220 endif
4221
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004222 t = target_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004223 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004224 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004225
Paolo Bonzini2becc362020-02-03 11:42:03 +01004226 target_common = common_ss.apply(config_target, strict: false)
4227 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004228 arch_deps += target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01004229
Paolo Bonzini2becc362020-02-03 11:42:03 +01004230 target_specific = specific_ss.apply(config_target, strict: false)
4231 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004232 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01004233
Paolo Bonzinie2b39052024-10-18 19:33:22 +02004234 if have_rust and target_type == 'system'
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004235 target_rust = rust_devices_ss.apply(config_target, strict: false)
4236 crates = []
4237 foreach dep : target_rust.dependencies()
4238 crates += dep.get_variable('crate')
4239 endforeach
4240 if crates.length() > 0
4241 rlib_rs = custom_target('rust_' + target.underscorify() + '.rs',
4242 output: 'rust_' + target.underscorify() + '.rs',
Paolo Bonzinid1e526c2024-10-15 11:59:14 +02004243 command: [rust_root_crate, crates],
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004244 capture: true,
4245 build_by_default: true,
4246 build_always_stale: true)
4247 rlib = static_library('rust_' + target.underscorify(),
4248 rlib_rs,
4249 dependencies: target_rust.dependencies(),
4250 override_options: ['rust_std=2021', 'build.rust_std=2021'],
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004251 rust_abi: 'c')
4252 arch_deps += declare_dependency(link_whole: [rlib])
4253 endif
4254 endif
4255
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004256 # allow using headers from the dependencies but do not include the sources,
4257 # because this emulator only needs those in "objects". For external
4258 # dependencies, the full dependency is included below in the executable.
4259 lib_deps = []
4260 foreach dep : arch_deps
4261 lib_deps += dep.partial_dependency(compile_args: true, includes: true)
4262 endforeach
4263
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004264 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02004265 sources: arch_srcs + genh,
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004266 dependencies: lib_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01004267 objects: objects,
4268 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004269 c_args: c_args,
Paolo Bonzini44081552024-05-24 10:56:55 +02004270 build_by_default: false)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004271
4272 if target.endswith('-softmmu')
4273 execs = [{
4274 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004275 'win_subsystem': 'console',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02004276 'sources': files('system/main.c'),
Philippe Mathieu-Daudé51625572024-11-20 12:36:43 +01004277 'dependencies': [sdl]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004278 }]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004279 if host_os == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004280 execs += [{
4281 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004282 'win_subsystem': 'windows',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02004283 'sources': files('system/main.c'),
Philippe Mathieu-Daudé51625572024-11-20 12:36:43 +01004284 'dependencies': [sdl]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004285 }]
4286 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004287 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004288 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
4289 execs += [{
4290 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004291 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004292 'sources': specific_fuzz.sources(),
4293 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004294 }]
4295 endif
4296 else
4297 execs = [{
4298 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004299 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004300 'sources': [],
4301 'dependencies': []
4302 }]
4303 endif
4304 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01004305 exe_name = exe['name']
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004306 if host_os == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01004307 exe_name += '-unsigned'
4308 endif
4309
4310 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09004311 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004312 c_args: c_args,
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004313 dependencies: arch_deps + exe['dependencies'],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004314 objects: lib.extract_all_objects(recursive: true),
Paolo Bonzini05007252024-03-20 11:28:28 +01004315 link_depends: [block_syms, qemu_syms],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004316 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004317 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01004318
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004319 if host_os == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004320 icon = 'pc-bios/qemu.rsrc'
4321 build_input = [emulator, files(icon)]
4322 install_input = [
4323 get_option('bindir') / exe_name,
4324 meson.current_source_dir() / icon
4325 ]
4326 if 'CONFIG_HVF' in config_target
4327 entitlements = 'accel/hvf/entitlements.plist'
4328 build_input += files(entitlements)
4329 install_input += meson.current_source_dir() / entitlements
4330 endif
4331
Alexander Graf8a74ce62021-01-20 23:44:34 +01004332 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004333 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01004334 output: exe['name'],
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01004335 command: [entitlement, '@OUTPUT@', '@INPUT@'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01004336 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09004337
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01004338 meson.add_install_script(entitlement, '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09004339 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004340 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01004341 else
4342 emulators += {exe['name']: emulator}
4343 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04004344
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004345 traceable += [{
4346 'exe': exe['name'],
4347 'probe-prefix': 'qemu.' + target_type + '.' + target_name,
4348 }]
4349
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004350 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01004351endforeach
4352
Paolo Bonzini931049b2020-02-05 09:44:24 +01004353# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004354
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004355if get_option('plugins')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01004356 install_headers('include/qemu/qemu-plugin.h')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004357 if host_os == 'windows'
Greg Manning36fa0772023-11-06 18:51:06 +00004358 # On windows, we want to deliver the qemu_plugin_api.lib file in the qemu installer,
4359 # so that plugin authors can compile against it.
4360 install_data(win32_qemu_plugin_api_lib, install_dir: 'lib')
4361 endif
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01004362endif
4363
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004364subdir('qga')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02004365
Laurent Vivier9755c942020-08-24 17:24:30 +02004366# Don't build qemu-keymap if xkbcommon is not explicitly enabled
4367# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02004368if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04004369 # used for the update-keymaps target, so include rules even if !have_tools
4370 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
4371 dependencies: [qemuutil, xkbcommon], install: have_tools)
4372endif
4373
Paolo Bonzini931049b2020-02-05 09:44:24 +01004374if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004375 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004376 link_args: '@block.syms', link_depends: block_syms,
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004377 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
4378 qemu_io = executable('qemu-io', files('qemu-io.c'),
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004379 link_args: '@block.syms', link_depends: block_syms,
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004380 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01004381 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004382 link_args: '@block.syms', link_depends: block_syms,
Akihiko Odaki7b1070a2024-05-24 17:00:23 +09004383 dependencies: [blockdev, qemuutil, selinux],
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004384 install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004385
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02004386 subdir('storage-daemon')
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004387
4388 foreach exe: [ 'qemu-img', 'qemu-io', 'qemu-nbd', 'qemu-storage-daemon']
4389 traceable += [{
4390 'exe': exe,
4391 'probe-prefix': 'qemu.' + exe.substring(5).replace('-', '_')
4392 }]
4393 endforeach
4394
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04004395 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02004396
Marc-André Lureau157e7b12019-07-15 14:50:58 +04004397 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
Steve Sistare57ad6ab2025-01-15 11:00:27 -08004398 dependencies: [qemuutil, rt],
Marc-André Lureau157e7b12019-07-15 14:50:58 +04004399 install: true)
4400
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004401 if have_vhost_user
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02004402 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02004403 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04004404 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02004405 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01004406 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004407
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004408 if host_os == 'linux'
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004409 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
4410 dependencies: [qemuutil, libcap_ng],
4411 install: true,
4412 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004413
4414 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
4415 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02004416 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004417 install: true)
Anthony Harivel84369d72024-05-22 17:34:51 +02004418
4419 if cpu in ['x86', 'x86_64']
4420 executable('qemu-vmsr-helper', files('tools/i386/qemu-vmsr-helper.c'),
4421 dependencies: [authz, crypto, io, qom, qemuutil,
4422 libcap_ng, mpathpersist],
4423 install: true)
4424 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004425 endif
4426
Paolo Bonziniccd250a2021-06-03 12:50:17 +02004427 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04004428 subdir('contrib/ivshmem-client')
4429 subdir('contrib/ivshmem-server')
4430 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01004431endif
4432
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004433if stap.found()
4434 foreach t: traceable
4435 foreach stp: [
4436 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / t['exe'], 'install': false},
4437 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / t['exe'], 'install': true},
4438 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
4439 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
4440 ]
4441 cmd = [
4442 tracetool, '--group=all', '--format=' + stp['fmt'],
4443 '--binary=' + stp['bin'],
4444 '--probe-prefix=' + t['probe-prefix'],
4445 '@INPUT@', '@OUTPUT@'
4446 ]
4447
4448 custom_target(t['exe'] + stp['ext'],
4449 input: trace_events_all,
4450 output: t['exe'] + stp['ext'],
4451 install: stp['install'],
4452 install_dir: get_option('datadir') / 'systemtap/tapset',
4453 command: cmd,
4454 depend_files: tracetool_depends)
4455 endforeach
4456 endforeach
4457endif
4458
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04004459subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004460subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04004461subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02004462subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08004463subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01004464if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04004465 subdir('po')
4466endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004467
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004468if host_machine.system() == 'windows'
4469 nsis_cmd = [
4470 find_program('scripts/nsis.py'),
4471 '@OUTPUT@',
4472 get_option('prefix'),
4473 meson.current_source_dir(),
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02004474 glib_pc.get_variable('bindir'),
Stefan Weil24bdcc92020-11-25 20:18:33 +01004475 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004476 '--',
4477 '-DDISPLAYVERSION=' + meson.project_version(),
4478 ]
4479 if build_docs
4480 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
4481 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01004482 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004483 nsis_cmd += '-DCONFIG_GTK=y'
4484 endif
4485
4486 nsis = custom_target('nsis',
4487 output: 'qemu-setup-' + meson.project_version() + '.exe',
4488 input: files('qemu.nsi'),
4489 build_always_stale: true,
4490 command: nsis_cmd + ['@INPUT@'])
4491 alias_target('installer', nsis)
4492endif
4493
Paolo Bonzinia0c91622020-10-07 11:01:51 -04004494#########################
4495# Configuration summary #
4496#########################
4497
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004498# Build environment
Paolo Bonzinif9332752020-02-03 13:28:38 +01004499summary_info = {}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004500summary_info += {'Build directory': meson.current_build_dir()}
4501summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004502summary_info += {'Download dependencies': get_option('wrap_mode') != 'nodownload'}
4503summary(summary_info, bool_yn: true, section: 'Build environment')
4504
4505# Directories
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004506summary_info += {'Install prefix': get_option('prefix')}
4507summary_info += {'BIOS directory': qemu_datadir}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004508pathsep = host_os == 'windows' ? ';' : ':'
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09004509summary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004510summary_info += {'binary directory': get_option('prefix') / get_option('bindir')}
4511summary_info += {'library directory': get_option('prefix') / get_option('libdir')}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004512summary_info += {'module directory': qemu_moddir}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004513summary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
4514summary_info += {'include directory': get_option('prefix') / get_option('includedir')}
4515summary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004516if host_os != 'windows'
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004517 summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
4518 summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004519else
4520 summary_info += {'local state directory': 'queried at runtime'}
4521endif
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004522summary_info += {'Doc directory': get_option('prefix') / get_option('docdir')}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004523summary(summary_info, bool_yn: true, section: 'Directories')
4524
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004525# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004526summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004527summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004528summary_info += {'sphinx-build': sphinx_build}
Paolo Bonzinib4d61d32023-09-28 12:00:48 +02004529
4530# FIXME: the [binaries] section of machine files, which can be probed
4531# with find_program(), would be great for passing gdb and genisoimage
4532# paths from configure to Meson. However, there seems to be no way to
4533# hide a program (for example if gdb is too old).
Paolo Bonzinia47dd5c2023-09-28 10:44:56 +02004534if config_host.has_key('GDB')
4535 summary_info += {'gdb': config_host['GDB']}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004536endif
Paolo Bonzini40c909f2022-04-20 17:33:49 +02004537summary_info += {'iasl': iasl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004538summary_info += {'genisoimage': config_host['GENISOIMAGE']}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004539if host_os == 'windows' and have_ga
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004540 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004541endif
Thomas Huth58902582022-04-08 18:20:47 +02004542if slirp.found() and have_system
Paolo Bonzini35acbb32021-10-13 13:43:36 +02004543 summary_info += {'smbd': have_slirp_smbd ? smbd_path : false}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004544endif
4545summary(summary_info, bool_yn: true, section: 'Host binaries')
4546
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004547# Configurable features
4548summary_info = {}
4549summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004550summary_info += {'system-mode emulation': have_system}
4551summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004552summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004553summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini60027112022-10-20 14:53:10 +02004554summary_info += {'module support': enable_modules}
4555if enable_modules
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02004556 summary_info += {'alternative module path': get_option('module_upgrades')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004557endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004558summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004559if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02004560 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004561endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02004562summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
4563if 'simple' in get_option('trace_backends')
4564 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004565endif
Marc-André Lureau142ca622021-07-15 11:53:53 +04004566summary_info += {'D-Bus display': dbus_display}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004567summary_info += {'QOM debugging': get_option('qom_cast_debug')}
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004568summary_info += {'Relocatable install': get_option('relocatable')}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004569summary_info += {'vhost-kernel support': have_vhost_kernel}
4570summary_info += {'vhost-net support': have_vhost_net}
4571summary_info += {'vhost-user support': have_vhost_user}
4572summary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004573summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004574summary_info += {'vhost-vdpa support': have_vhost_vdpa}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004575summary_info += {'build guest agent': have_ga}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004576summary(summary_info, bool_yn: true, section: 'Configurable features')
4577
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004578# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004579summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004580summary_info += {'host CPU': cpu}
4581summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01004582summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
4583summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Thomas Huth785abf02023-07-06 08:47:36 +02004584if 'cpp' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004585 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004586else
4587 summary_info += {'C++ compiler': false}
4588endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004589if 'objc' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004590 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004591else
4592 summary_info += {'Objective-C compiler': false}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004593endif
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03004594summary_info += {'Rust support': have_rust}
4595if have_rust
Paolo Bonzini1a6ef6f2024-10-03 16:28:45 +03004596 summary_info += {'Rust target': config_host['RUST_TARGET_TRIPLE']}
Paolo Bonzinie2b39052024-10-18 19:33:22 +02004597 summary_info += {'rustc': ' '.join(rustc.cmd_array())}
4598 summary_info += {'rustc version': rustc.version()}
Paolo Bonzinic2988df2024-10-15 15:00:41 +02004599 summary_info += {'bindgen': bindgen.full_path()}
4600 summary_info += {'bindgen version': bindgen.version()}
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03004601endif
Alex Bennée563b1a32025-03-06 16:16:31 +00004602# option_cflags is purely for the summary display, meson will pass
4603# -g/-O options directly
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004604option_cflags = (get_option('debug') ? ['-g'] : [])
4605if get_option('optimization') != 'plain'
4606 option_cflags += ['-O' + get_option('optimization')]
4607endif
4608summary_info += {'CFLAGS': ' '.join(get_option('c_args') + option_cflags)}
Thomas Huth785abf02023-07-06 08:47:36 +02004609if 'cpp' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004610 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args') + option_cflags)}
Paolo Bonzini47b30832020-09-23 05:26:17 -04004611endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004612if 'objc' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004613 summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args') + option_cflags)}
Philippe Mathieu-Daudée910c7d2022-01-08 22:38:55 +01004614endif
Thomas Huth785abf02023-07-06 08:47:36 +02004615link_args = get_option('c_link_args')
Paolo Bonzini47b30832020-09-23 05:26:17 -04004616if link_args.length() > 0
4617 summary_info += {'LDFLAGS': ' '.join(link_args)}
4618endif
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004619summary_info += {'QEMU_CFLAGS': ' '.join(qemu_common_flags + qemu_cflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004620if 'cpp' in all_languages
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004621 summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_common_flags + qemu_cxxflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004622endif
4623if 'objc' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +01004624 summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_common_flags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004625endif
Paolo Bonzinid0651772022-04-20 17:33:34 +02004626summary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)}
Daniele Buonocdad7812020-12-04 18:06:11 -05004627summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004628summary_info += {'PIE': get_option('b_pie')}
Paolo Bonzinie58e55d2023-06-07 10:00:21 +02004629summary_info += {'static build': get_option('prefer_static')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004630summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinib87df902021-11-08 13:52:11 +01004631summary_info += {'membarrier': have_membarrier}
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04004632summary_info += {'debug graph lock': get_option('debug_graph_lock')}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004633summary_info += {'debug stack usage': get_option('debug_stack_usage')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004634summary_info += {'mutex debugging': get_option('debug_mutex')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004635summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01004636summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
ling xu04ffce12022-11-16 23:29:22 +08004637summary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004638summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzini34f983d2023-01-09 15:31:51 +01004639summary_info += {'thread sanitizer': get_option('tsan')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004640summary_info += {'CFI support': get_option('cfi')}
4641if get_option('cfi')
4642 summary_info += {'CFI debug support': get_option('cfi_debug')}
4643endif
4644summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004645summary_info += {'sparse': sparse}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004646summary_info += {'mingw32 support': host_os == 'windows'}
Paolo Bonzini12640f02022-06-06 11:48:47 +02004647summary(summary_info, bool_yn: true, section: 'Compilation')
Alex Bennée49e85652021-02-22 10:14:50 +00004648
4649# snarf the cross-compilation information for tests
Paolo Bonzini12640f02022-06-06 11:48:47 +02004650summary_info = {}
4651have_cross = false
Alex Bennée49e85652021-02-22 10:14:50 +00004652foreach target: target_dirs
Paolo Bonzinic7022a72022-09-29 12:42:07 +01004653 tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak'
Alex Bennée49e85652021-02-22 10:14:50 +00004654 if fs.exists(tcg_mak)
4655 config_cross_tcg = keyval.load(tcg_mak)
Alex Bennée85b141e2022-05-27 16:35:34 +01004656 if 'CC' in config_cross_tcg
Paolo Bonzini12640f02022-06-06 11:48:47 +02004657 summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
4658 have_cross = true
Alex Bennée49e85652021-02-22 10:14:50 +00004659 endif
Paolo Bonzini12640f02022-06-06 11:48:47 +02004660 endif
Alex Bennée49e85652021-02-22 10:14:50 +00004661endforeach
Paolo Bonzini12640f02022-06-06 11:48:47 +02004662if have_cross
4663 summary(summary_info, bool_yn: true, section: 'Cross compilers')
4664endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004665
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004666# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004667summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004668if have_system
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004669 summary_info += {'KVM support': config_all_accel.has_key('CONFIG_KVM')}
4670 summary_info += {'HVF support': config_all_accel.has_key('CONFIG_HVF')}
4671 summary_info += {'WHPX support': config_all_accel.has_key('CONFIG_WHPX')}
4672 summary_info += {'NVMM support': config_all_accel.has_key('CONFIG_NVMM')}
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02004673 summary_info += {'Xen support': xen.found()}
4674 if xen.found()
4675 summary_info += {'xen ctrl version': xen.version()}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004676 endif
Paolo Bonzini0d665492023-08-31 11:18:24 +02004677 summary_info += {'Xen emulation': config_all_devices.has_key('CONFIG_XEN_EMU')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004678endif
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004679summary_info += {'TCG support': config_all_accel.has_key('CONFIG_TCG')}
4680if config_all_accel.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004681 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +01004682 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004683 else
4684 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
4685 endif
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004686 summary_info += {'TCG plugins': get_option('plugins')}
Paolo Bonzini1d558c92023-08-28 11:48:30 +02004687 summary_info += {'TCG debug enabled': get_option('debug_tcg')}
Ilya Leoshkevich1f2355f2024-03-12 01:23:30 +01004688 if have_linux_user or have_bsd_user
4689 summary_info += {'syscall buffer debugging support': get_option('debug_remap')}
4690 endif
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004691endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004692summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004693if have_system
4694 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01004695 summary_info += {'out of process emulation': multiprocess_allowed}
Jagannathan Raman55116962022-06-13 16:26:24 -04004696 summary_info += {'vfio-user server': vfio_user_server_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004697endif
4698summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
4699
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004700# Block layer
4701summary_info = {}
Paolo Bonzini67398252022-10-12 13:19:35 +02004702summary_info += {'coroutine backend': coroutine_backend}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004703summary_info += {'coroutine pool': have_coroutine_pool}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004704if have_block
Paolo Bonzini622d64f2022-04-20 17:33:53 +02004705 summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
4706 summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004707 summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
Christian Schoenebeck38877022023-05-11 16:12:34 +02004708 summary_info += {'VirtFS (9P) support': have_virtfs}
Paolo Bonzini406523f2021-10-13 11:43:54 +02004709 summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004710 summary_info += {'bochs support': get_option('bochs').allowed()}
4711 summary_info += {'cloop support': get_option('cloop').allowed()}
4712 summary_info += {'dmg support': get_option('dmg').allowed()}
4713 summary_info += {'qcow v1 support': get_option('qcow1').allowed()}
4714 summary_info += {'vdi support': get_option('vdi').allowed()}
Vladimir Sementsov-Ogievskiy11cea422023-04-21 12:27:58 +03004715 summary_info += {'vhdx support': get_option('vhdx').allowed()}
4716 summary_info += {'vmdk support': get_option('vmdk').allowed()}
4717 summary_info += {'vpc support': get_option('vpc').allowed()}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004718 summary_info += {'vvfat support': get_option('vvfat').allowed()}
4719 summary_info += {'qed support': get_option('qed').allowed()}
4720 summary_info += {'parallels support': get_option('parallels').allowed()}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004721 summary_info += {'FUSE exports': fuse}
Xie Yongji2a2359b2022-05-23 16:46:09 +08004722 summary_info += {'VDUSE block exports': have_vduse_blk_export}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004723endif
4724summary(summary_info, bool_yn: true, section: 'Block layer support')
4725
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004726# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004727summary_info = {}
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02004728summary_info += {'TLS priority': get_option('tls_priority')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004729summary_info += {'GNUTLS support': gnutls}
4730if gnutls.found()
4731 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
4732endif
4733summary_info += {'libgcrypt': gcrypt}
4734summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02004735if nettle.found()
4736 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004737endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08004738summary_info += {'SM4 ALG support': crypto_sm4}
liequan ched078da82024-10-30 08:51:46 +00004739summary_info += {'SM3 ALG support': crypto_sm3}
Paolo Bonzini34b52612021-11-08 14:02:42 +01004740summary_info += {'AF_ALG support': have_afalg}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004741summary_info += {'rng-none': get_option('rng_none')}
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02004742summary_info += {'Linux keyring': have_keyring}
Thomas Huthc64023b2023-08-24 11:42:08 +02004743summary_info += {'Linux keyutils': keyutils}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004744summary(summary_info, bool_yn: true, section: 'Crypto')
4745
Thomas Huth9e48afa2023-06-02 19:18:30 +02004746# UI
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004747summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004748if host_os == 'darwin'
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03004749 summary_info += {'Cocoa support': cocoa}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004750endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004751summary_info += {'SDL support': sdl}
4752summary_info += {'SDL image support': sdl_image}
4753summary_info += {'GTK support': gtk}
4754summary_info += {'pixman': pixman}
4755summary_info += {'VTE support': vte}
Kshitij Suri95f85102022-04-08 07:13:34 +00004756summary_info += {'PNG support': png}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004757summary_info += {'VNC support': vnc}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01004758if vnc.found()
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004759 summary_info += {'VNC SASL support': sasl}
4760 summary_info += {'VNC JPEG support': jpeg}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004761endif
Thomas Huth9e48afa2023-06-02 19:18:30 +02004762summary_info += {'spice protocol support': spice_protocol}
4763if spice_protocol.found()
4764 summary_info += {' spice server support': spice}
4765endif
4766summary_info += {'curses support': curses}
4767summary_info += {'brlapi support': brlapi}
4768summary(summary_info, bool_yn: true, section: 'User interface')
4769
Alex Bennéef705c1f2023-12-22 11:48:46 +00004770# Graphics backends
4771summary_info = {}
4772summary_info += {'VirGL support': virgl}
4773summary_info += {'Rutabaga support': rutabaga}
4774summary(summary_info, bool_yn: true, section: 'Graphics backends')
4775
Thomas Huthaece7232023-06-02 19:18:32 +02004776# Audio backends
4777summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004778if host_os not in ['darwin', 'haiku', 'windows']
Paolo Bonzini87430d52021-10-07 15:06:09 +02004779 summary_info += {'OSS support': oss}
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02004780 summary_info += {'sndio support': sndio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004781elif host_os == 'darwin'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004782 summary_info += {'CoreAudio support': coreaudio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004783elif host_os == 'windows'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004784 summary_info += {'DirectSound support': dsound}
4785endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004786if host_os == 'linux'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004787 summary_info += {'ALSA support': alsa}
4788 summary_info += {'PulseAudio support': pulse}
4789endif
Marc-André Lureau20c51242023-05-06 20:37:26 +04004790summary_info += {'PipeWire support': pipewire}
Paolo Bonzini87430d52021-10-07 15:06:09 +02004791summary_info += {'JACK support': jack}
Thomas Huthaece7232023-06-02 19:18:32 +02004792summary(summary_info, bool_yn: true, section: 'Audio backends')
4793
Thomas Huthc3527c52023-06-02 19:18:31 +02004794# Network backends
Thomas Huth9e48afa2023-06-02 19:18:30 +02004795summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004796if host_os == 'darwin'
Thomas Huth9e48afa2023-06-02 19:18:30 +02004797 summary_info += {'vmnet.framework support': vmnet}
4798endif
Ilya Maximetscb039ef2023-09-13 20:34:37 +02004799summary_info += {'AF_XDP support': libxdp}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004800summary_info += {'slirp support': slirp}
Paolo Bonzinie1723992021-10-07 15:08:21 +02004801summary_info += {'vde support': vde}
Paolo Bonzini837b84b2021-10-07 15:08:22 +02004802summary_info += {'netmap support': have_netmap}
Thomas Hutheea94532021-10-28 20:59:08 +02004803summary_info += {'l2tpv3 support': have_l2tpv3}
Thomas Huthc3527c52023-06-02 19:18:31 +02004804summary(summary_info, bool_yn: true, section: 'Network backends')
4805
4806# Libraries
4807summary_info = {}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004808summary_info += {'libtasn1': tasn1}
4809summary_info += {'PAM': pam}
4810summary_info += {'iconv support': iconv}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004811summary_info += {'blkio support': blkio}
4812summary_info += {'curl support': curl}
4813summary_info += {'Multipath support': mpathpersist}
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02004814summary_info += {'Linux AIO support': libaio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004815summary_info += {'Linux io_uring support': linux_io_uring}
4816summary_info += {'ATTR/XATTR support': libattr}
Paolo Bonzini3730a732022-04-20 17:33:41 +02004817summary_info += {'RDMA support': rdma}
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01004818summary_info += {'fdt support': fdt_opt == 'internal' ? 'internal' : fdt}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004819summary_info += {'libcap-ng support': libcap_ng}
4820summary_info += {'bpf support': libbpf}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004821summary_info += {'rbd support': rbd}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004822summary_info += {'smartcard support': cacard}
4823summary_info += {'U2F support': u2f}
4824summary_info += {'libusb': libusb}
4825summary_info += {'usb net redir': usbredir}
Paolo Bonzini88b6e612022-04-20 17:33:40 +02004826summary_info += {'OpenGL support (epoxy)': opengl}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004827summary_info += {'GBM': gbm}
4828summary_info += {'libiscsi support': libiscsi}
4829summary_info += {'libnfs support': libnfs}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004830if host_os == 'windows'
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004831 if have_ga
Marc-André Lureau8821a382022-02-01 16:53:43 +04004832 summary_info += {'QGA VSS support': have_qga_vss}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01004833 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01004834endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004835summary_info += {'seccomp support': seccomp}
4836summary_info += {'GlusterFS support': glusterfs}
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02004837summary_info += {'hv-balloon support': hv_balloon}
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01004838summary_info += {'TPM support': have_tpm}
Thomas Huthe6a52b32021-12-09 15:48:01 +01004839summary_info += {'libssh support': libssh}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004840summary_info += {'lzo support': lzo}
4841summary_info += {'snappy support': snappy}
4842summary_info += {'bzip2 support': libbzip2}
4843summary_info += {'lzfse support': liblzfse}
4844summary_info += {'zstd support': zstd}
Yuan Liub844a2c2024-06-10 18:21:06 +08004845summary_info += {'Query Processing Library support': qpl}
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01004846summary_info += {'UADK Library support': uadk}
Bryan Zhange28ed312024-08-30 16:27:19 -07004847summary_info += {'qatzip support': qatzip}
Paolo Bonzini488a8c72021-12-21 12:38:27 +01004848summary_info += {'NUMA host support': numa}
Thomas Huth83602082022-05-16 16:58:23 +02004849summary_info += {'capstone': capstone}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004850summary_info += {'libpmem support': libpmem}
4851summary_info += {'libdaxctl support': libdaxctl}
Dorjoy Chowdhurybb154e32024-10-09 03:17:23 +06004852summary_info += {'libcbor support': libcbor}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004853summary_info += {'libudev': libudev}
4854# Dummy dependency, keep .found()
Max Reitzdf4ea702020-10-27 20:05:46 +01004855summary_info += {'FUSE lseek': fuse_lseek.found()}
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004856summary_info += {'selinux': selinux}
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01004857summary_info += {'libdw': libdw}
Ilya Leoshkevicha1a98002024-02-06 01:22:03 +01004858if host_os == 'freebsd'
4859 summary_info += {'libinotify-kqueue': inotify}
4860endif
Paolo Bonzinid50ea7f2025-02-20 14:20:27 +01004861if host_os == 'darwin'
4862 summary_info += {'ParavirtualizedGraphics support': pvg}
4863endif
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01004864summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004865
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004866if host_arch == 'unknown'
Paolo Bonzinif9332752020-02-03 13:28:38 +01004867 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004868 warning('UNSUPPORTED HOST CPU')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004869 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004870 message('Support for CPU host architecture ' + cpu + ' is not currently')
4871 message('maintained. The QEMU project does not guarantee that QEMU will')
4872 message('compile or work on this host CPU. You can help by volunteering')
4873 message('to maintain it and providing a build host for our continuous')
4874 message('integration setup.')
4875 if get_option('tcg').allowed() and target_dirs.length() > 0
4876 message()
4877 message('configure has succeeded and you can continue to build, but')
4878 message('QEMU will use a slow interpreter to emulate the target CPU.')
4879 endif
Richard Henderson6d701c92025-01-27 16:22:24 -08004880elif host_long_bits < 64
Paolo Bonzini14ed29d2024-10-27 14:07:01 +01004881 message()
4882 warning('DEPRECATED HOST CPU')
4883 message()
Richard Henderson6d701c92025-01-27 16:22:24 -08004884 message('Support for 32-bit CPU host architecture ' + cpu + ' is going')
4885 message('to be dropped in a future QEMU release.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004886endif
4887
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004888if not supported_oses.contains(host_os)
Paolo Bonzinif9332752020-02-03 13:28:38 +01004889 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004890 warning('UNSUPPORTED HOST OS')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004891 message()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004892 message('Support for host OS ' + host_os + 'is not currently maintained.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004893 message('configure has succeeded and you can continue to build, but')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004894 message('the QEMU project does not guarantee that QEMU will compile or')
4895 message('work on this operating system. You can help by volunteering')
4896 message('to maintain it and providing a build host for our continuous')
4897 message('integration setup. This will ensure that future versions of QEMU')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004898 message('will keep working on ' + host_os + '.')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004899endif
4900
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004901if host_arch == 'unknown' or not supported_oses.contains(host_os)
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004902 message()
4903 message('If you want to help supporting QEMU on this platform, please')
4904 message('contact the developers at qemu-devel@nongnu.org.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004905endif
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004906
4907actually_reloc = get_option('relocatable')
4908# check if get_relocated_path() is actually able to relocate paths
4909if get_option('relocatable') and \
4910 not (get_option('prefix') / get_option('bindir')).startswith(get_option('prefix') / '')
4911 message()
4912 warning('bindir not included within prefix, the installation will not be relocatable.')
4913 actually_reloc = false
4914endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004915if not actually_reloc and (host_os == 'windows' or get_option('relocatable'))
4916 if host_os == 'windows'
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004917 message()
4918 warning('Windows installs should usually be relocatable.')
4919 endif
4920 message()
4921 message('QEMU will have to be installed under ' + get_option('prefix') + '.')
4922 message('Use --disable-relocatable to remove this warning.')
4923endif