blob: bae7a4370de4a12b2ef0b74d90e83c57ce63d74b [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
Thomas Huthe2870722022-03-10 08:50:48 +01006add_test_setup('quick', exclude_suites: ['slow', 'thorough'], is_default: true)
7add_test_setup('slow', exclude_suites: ['thorough'], env: ['G_TEST_SLOW=1', 'SPEED=slow'])
8add_test_setup('thorough', env: ['G_TEST_SLOW=1', 'SPEED=thorough'])
Paolo Bonzini3d2f73e2021-02-11 06:15:12 -05009
Akihiko Odakicf60ccc2022-06-24 23:50:37 +090010meson.add_postconf_script(find_program('scripts/symlink-install-tree.py'))
11
Paolo Bonziniea444d92023-09-08 12:06:12 +020012####################
13# Global variables #
14####################
15
Paolo Bonzinia5665052019-06-10 12:05:14 +020016not_found = dependency('', required: false)
Paolo Bonzini654d6b02021-02-09 14:59:26 +010017keyval = import('keyval')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040018ss = import('sourceset')
Richard Henderson8b18cdb2020-09-13 12:19:25 -070019fs = import('fs')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040020
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +010021host_os = host_machine.system()
Paolo Bonzinia5665052019-06-10 12:05:14 +020022config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +010023
Yonggang Luoe3667662020-10-16 06:06:25 +080024# Temporary directory used for files created while
25# configure runs. Since it is in the build directory
26# we can safely blow away any previous version of it
27# (and we need not jump through hoops to try to delete
28# it when configure exits.)
29tmpdir = meson.current_build_dir() / 'meson-private/temp'
Marc-André Lureau8fe11232020-09-11 14:42:48 +020030
31if get_option('qemu_suffix').startswith('/')
32 error('qemu_suffix cannot start with a /')
33endif
34
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040035qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
Marc-André Lureauab4c0992020-08-26 15:04:16 +040036qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040037qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040038qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
39
40qemu_desktopdir = get_option('datadir') / 'applications'
41qemu_icondir = get_option('datadir') / 'icons'
42
Paolo Bonzini859aef02020-08-04 18:14:26 +020043genh = []
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +010044qapi_trace_events = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020045
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020046bsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin']
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040047supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Philippe Mathieu-Daudé278c1bc2023-06-27 16:32:34 +020048supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
Richard Henderson6d0b52e2022-10-17 08:00:57 +030049 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64']
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040050
51cpu = host_machine.cpu_family()
Richard Hendersonc94c2392021-11-16 10:50:42 +010052
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020053target_dirs = config_host['TARGET_DIRS'].split()
Paolo Bonzini44458a62023-09-08 12:06:57 +020054
55############
56# Programs #
57############
58
59sh = find_program('sh')
60python = import('python').find_installation()
61
62cc = meson.get_compiler('c')
63all_languages = ['c']
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +010064if host_os == 'windows' and add_languages('cpp', required: false, native: false)
Paolo Bonzini44458a62023-09-08 12:06:57 +020065 all_languages += ['cpp']
66 cxx = meson.get_compiler('cpp')
67endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +010068if host_os == 'darwin' and \
Peter Maydell2ef938a2024-03-11 13:33:34 +000069 add_languages('objc', required: true, native: false)
Paolo Bonzini44458a62023-09-08 12:06:57 +020070 all_languages += ['objc']
71 objc = meson.get_compiler('objc')
72endif
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +030073have_rust = false
Paolo Bonzini95e82f9b2024-10-14 16:36:40 +020074if not get_option('rust').disabled() and add_languages('rust', required: get_option('rust'), native: false) \
75 and add_languages('rust', required: get_option('rust'), native: true)
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +030076 rustc = meson.get_compiler('rust')
77 have_rust = true
78 if rustc.version().version_compare('<1.80.0')
79 if get_option('rust').enabled()
80 error('rustc version ' + rustc.version() + ' is unsupported: Please upgrade to at least 1.80.0')
81 else
82 warning('rustc version ' + rustc.version() + ' is unsupported: Disabling Rust compilation. Please upgrade to at least 1.80.0 to use Rust.')
83 have_rust = false
84 endif
85 endif
86endif
Paolo Bonzini44458a62023-09-08 12:06:57 +020087
88dtrace = not_found
89stap = not_found
90if 'dtrace' in get_option('trace_backends')
91 dtrace = find_program('dtrace', required: true)
92 stap = find_program('stap', required: false)
93 if stap.found()
94 # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
95 # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
96 # instead. QEMU --enable-modules depends on this because the SystemTap
97 # semaphores are linked into the main binary and not the module's shared
98 # object.
99 add_global_arguments('-DSTAP_SDT_V2',
100 native: false, language: all_languages)
101 endif
102endif
103
104if get_option('iasl') == ''
105 iasl = find_program('iasl', required: false)
106else
107 iasl = find_program(get_option('iasl'), required: true)
108endif
109
Xianglai Lib883fb92024-07-24 10:22:45 +0800110edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu', 'riscv64-softmmu', 'loongarch64-softmmu' ]
Paolo Bonzini44458a62023-09-08 12:06:57 +0200111unpack_edk2_blobs = false
112foreach target : edk2_targets
113 if target in target_dirs
114 bzip2 = find_program('bzip2', required: get_option('install_blobs'))
115 unpack_edk2_blobs = bzip2.found()
116 break
117 endif
118endforeach
119
120#####################
121# Option validation #
122#####################
123
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100124# Fuzzing
125if get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
126 not cc.links('''
127 #include <stdint.h>
128 #include <sys/types.h>
129 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
130 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
131 ''',
132 args: ['-Werror', '-fsanitize=fuzzer'])
133 error('Your compiler does not support -fsanitize=fuzzer')
134endif
135
136# Tracing backends
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100137if 'ftrace' in get_option('trace_backends') and host_os != 'linux'
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100138 error('ftrace is supported only on Linux')
139endif
140if 'syslog' in get_option('trace_backends') and not cc.compiles('''
141 #include <syslog.h>
142 int main(void) {
143 openlog("qemu", LOG_PID, LOG_DAEMON);
144 syslog(LOG_INFO, "configure");
145 return 0;
146 }''')
147 error('syslog is not supported on this system')
148endif
149
150# Miscellaneous Linux-only features
151get_option('mpath') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100152 .require(host_os == 'linux', error_message: 'Multipath is supported only on Linux')
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100153
154multiprocess_allowed = get_option('multiprocess') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100155 .require(host_os == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100156 .allowed()
157
158vfio_user_server_allowed = get_option('vfio_user_server') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100159 .require(host_os == 'linux', error_message: 'vfio-user server is supported only on Linux') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100160 .allowed()
161
162have_tpm = get_option('tpm') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100163 .require(host_os != 'windows', error_message: 'TPM emulation only available on POSIX systems') \
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100164 .allowed()
165
166# vhost
167have_vhost_user = get_option('vhost_user') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100168 .disable_auto_if(host_os != 'linux') \
169 .require(host_os != 'windows',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100170 error_message: 'vhost-user is not available on Windows').allowed()
171have_vhost_vdpa = get_option('vhost_vdpa') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100172 .require(host_os == 'linux',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100173 error_message: 'vhost-vdpa is only available on Linux').allowed()
174have_vhost_kernel = get_option('vhost_kernel') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100175 .require(host_os == 'linux',
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100176 error_message: 'vhost-kernel is only available on Linux').allowed()
177have_vhost_user_crypto = get_option('vhost_crypto') \
178 .require(have_vhost_user,
179 error_message: 'vhost-crypto requires vhost-user to be enabled').allowed()
180
181have_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel
182
183have_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed()
184have_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed()
185have_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed()
186have_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa
187
188# type of binaries to build
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200189have_linux_user = false
190have_bsd_user = false
191have_system = false
192foreach target : target_dirs
193 have_linux_user = have_linux_user or target.endswith('linux-user')
194 have_bsd_user = have_bsd_user or target.endswith('bsd-user')
195 have_system = have_system or target.endswith('-softmmu')
196endforeach
197have_user = have_linux_user or have_bsd_user
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100198
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200199have_tools = get_option('tools') \
200 .disable_auto_if(not have_system) \
201 .allowed()
202have_ga = get_option('guest_agent') \
203 .disable_auto_if(not have_system and not have_tools) \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100204 .require(host_os in ['sunos', 'linux', 'windows', 'freebsd', 'netbsd', 'openbsd'],
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200205 error_message: 'unsupported OS for QEMU guest agent') \
206 .allowed()
Paolo Bonzinia9cba052023-12-30 18:42:30 +0100207have_block = have_system or have_tools
208
Paolo Bonzini60027112022-10-20 14:53:10 +0200209enable_modules = get_option('modules') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100210 .require(host_os != 'windows',
Paolo Bonzini60027112022-10-20 14:53:10 +0200211 error_message: 'Modules are not available for Windows') \
212 .require(not get_option('prefer_static'),
213 error_message: 'Modules are incompatible with static linking') \
214 .allowed()
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +0200215
Paolo Bonziniea444d92023-09-08 12:06:12 +0200216#######################################
217# Variables for host and accelerators #
218#######################################
219
Paolo Bonzini823eb012021-11-08 14:18:17 +0100220if cpu not in supported_cpus
221 host_arch = 'unknown'
222elif cpu == 'x86'
223 host_arch = 'i386'
Richard Henderson0e3ed772021-12-31 05:25:11 +0000224elif cpu == 'mips64'
225 host_arch = 'mips'
Philippe Mathieu-Daudé278c1bc2023-06-27 16:32:34 +0200226elif cpu in ['riscv32', 'riscv64']
227 host_arch = 'riscv'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100228else
229 host_arch = cpu
230endif
231
Paolo Bonzini8a199802020-09-18 05:37:01 -0400232if cpu in ['x86', 'x86_64']
233 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
234elif cpu == 'aarch64'
235 kvm_targets = ['aarch64-softmmu']
236elif cpu == 's390x'
237 kvm_targets = ['s390x-softmmu']
238elif cpu in ['ppc', 'ppc64']
239 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Huacai Chenfbc58842020-10-07 16:39:28 +0800240elif cpu in ['mips', 'mips64']
241 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Philippe Mathieu-Daudé4de81092023-06-27 16:32:35 +0200242elif cpu in ['riscv32']
243 kvm_targets = ['riscv32-softmmu']
244elif cpu in ['riscv64']
245 kvm_targets = ['riscv64-softmmu']
Tianrui Zhao714b03c2024-01-05 15:58:04 +0800246elif cpu in ['loongarch64']
247 kvm_targets = ['loongarch64-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400248else
249 kvm_targets = []
250endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400251accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alexander Graf844a06b2021-09-16 17:54:02 +0200252
Paolo Bonzini16b62732023-12-09 15:31:15 +0100253if cpu in ['x86', 'x86_64']
254 xen_targets = ['i386-softmmu', 'x86_64-softmmu']
255elif cpu in ['arm', 'aarch64']
256 # i386 emulator provides xenpv machine type for multiple architectures
257 xen_targets = ['i386-softmmu', 'x86_64-softmmu', 'aarch64-softmmu']
258else
259 xen_targets = []
260endif
261accelerator_targets += { 'CONFIG_XEN': xen_targets }
262
Alexander Graf844a06b2021-09-16 17:54:02 +0200263if cpu in ['aarch64']
264 accelerator_targets += {
265 'CONFIG_HVF': ['aarch64-softmmu']
266 }
267endif
268
Paolo Bonzini8a199802020-09-18 05:37:01 -0400269if cpu in ['x86', 'x86_64']
270 accelerator_targets += {
Paolo Bonzini8a199802020-09-18 05:37:01 -0400271 'CONFIG_HVF': ['x86_64-softmmu'],
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200272 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400273 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
274 }
275endif
276
Paolo Bonzinia1b176f2021-07-12 14:22:08 +0200277modular_tcg = []
278# Darwin does not support references to thread-local variables in modules
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100279if host_os != 'darwin'
Paolo Bonzinia1b176f2021-07-12 14:22:08 +0200280 modular_tcg = ['i386-softmmu', 'x86_64-softmmu']
281endif
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +0200282
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400283##################
284# Compiler flags #
285##################
286
Paolo Bonzini13f60de2022-10-20 14:34:27 +0200287foreach lang : all_languages
288 compiler = meson.get_compiler(lang)
289 if compiler.get_id() == 'gcc' and compiler.version().version_compare('>=7.4')
290 # ok
291 elif compiler.get_id() == 'clang' and compiler.compiles('''
292 #ifdef __apple_build_version__
293 # if __clang_major__ < 12 || (__clang_major__ == 12 && __clang_minor__ < 0)
294 # error You need at least XCode Clang v12.0 to compile QEMU
295 # endif
296 #else
297 # if __clang_major__ < 10 || (__clang_major__ == 10 && __clang_minor__ < 0)
298 # error You need at least Clang v10.0 to compile QEMU
299 # endif
300 #endif''')
301 # ok
302 else
303 error('You either need GCC v7.4 or Clang v10.0 (or XCode Clang v12.0) to compile QEMU')
304 endif
305endforeach
306
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200307# default flags for all hosts
308# We use -fwrapv to tell the compiler that we require a C dialect where
309# left shift of signed integers is well defined and has the expected
310# 2s-complement style results. (Both clang and gcc agree that it
311# provides these semantics.)
312
313qemu_common_flags = [
314 '-D_GNU_SOURCE', '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE_SOURCE',
315 '-fno-strict-aliasing', '-fno-common', '-fwrapv' ]
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200316qemu_cflags = []
Paolo Bonzini911d4ca2022-10-12 12:46:23 +0200317qemu_ldflags = []
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100318
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100319if host_os == 'darwin'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200320 # Disable attempts to use ObjectiveC features in os/object.h since they
321 # won't work when we're compiling with gcc as a C compiler.
Alexander Graf2fc36532023-08-30 16:14:14 +0000322 if compiler.get_id() == 'gcc'
323 qemu_common_flags += '-DOS_OBJECT_USE_OBJC=0'
324 endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100325elif host_os == 'sunos'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200326 # needed for CMSG_ macros in sys/socket.h
327 qemu_common_flags += '-D_XOPEN_SOURCE=600'
328 # needed for TIOCWIN* defines in termios.h
329 qemu_common_flags += '-D__EXTENSIONS__'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100330elif host_os == 'haiku'
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200331 qemu_common_flags += ['-DB_USE_POSITIVE_POSIX_ERRORS', '-D_BSD_SOURCE', '-fPIC']
Thomas Huthe25264f2024-08-15 14:27:19 +0200332elif host_os == 'windows'
333 if not compiler.compiles('struct x { int y; } __attribute__((gcc_struct));',
334 args: '-Werror')
335 error('Your compiler does not support __attribute__((gcc_struct)) - please use GCC instead of Clang')
336 endif
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200337endif
338
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200339# Choose instruction set (currently x86-only)
340
341qemu_isa_flags = []
342
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200343# __sync_fetch_and_and requires at least -march=i486. Many toolchains
344# use i686 as default anyway, but for those that don't, an explicit
345# specification is necessary
346if host_arch == 'i386' and not cc.links('''
347 static int sfaa(int *ptr)
348 {
349 return __sync_fetch_and_and(ptr, 0);
350 }
351
352 int main(void)
353 {
354 int val = 42;
355 val = __sync_val_compare_and_swap(&val, 0, 1);
356 sfaa(&val);
357 return val;
358 }''')
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200359 qemu_isa_flags += ['-march=i486']
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200360endif
361
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200362# Pick x86-64 baseline version
Paolo Bonzini294ac642024-05-31 10:37:06 +0200363if host_arch in ['i386', 'x86_64']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200364 if get_option('x86_version') == '0' and host_arch == 'x86_64'
365 error('x86_64-v1 required for x86-64 hosts')
366 endif
367
368 # add flags for individual instruction set extensions
369 if get_option('x86_version') >= '1'
370 if host_arch == 'i386'
371 qemu_common_flags = ['-mfpmath=sse'] + qemu_common_flags
372 else
373 # present on basically all processors but technically not part of
374 # x86-64-v1, so only include -mneeded for x86-64 version 2 and above
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200375 qemu_isa_flags += ['-mcx16']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200376 endif
377 endif
378 if get_option('x86_version') >= '2'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200379 qemu_isa_flags += ['-mpopcnt']
380 qemu_isa_flags += cc.get_supported_arguments('-mneeded')
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200381 endif
382 if get_option('x86_version') >= '3'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200383 qemu_isa_flags += ['-mmovbe', '-mabm', '-mbmi', '-mbmi2', '-mfma', '-mf16c']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200384 endif
385
386 # add required vector instruction set (each level implies those below)
387 if get_option('x86_version') == '1'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200388 qemu_isa_flags += ['-msse2']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200389 elif get_option('x86_version') == '2'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200390 qemu_isa_flags += ['-msse4.2']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200391 elif get_option('x86_version') == '3'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200392 qemu_isa_flags += ['-mavx2']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200393 elif get_option('x86_version') == '4'
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200394 qemu_isa_flags += ['-mavx512f', '-mavx512bw', '-mavx512cd', '-mavx512dq', '-mavx512vl']
Paolo Bonzinief7d1ad2024-06-18 17:32:52 +0200395 endif
Artyom Kunakovskyc2bf2cc2024-05-23 08:11:18 +0300396endif
397
Paolo Bonzini6ae8c532024-10-07 10:31:28 +0200398qemu_common_flags = qemu_isa_flags + qemu_common_flags
399
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +0200400if get_option('prefer_static')
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100401 qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
402endif
403
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200404# Meson currently only handles pie as a boolean for now, so if the user
405# has explicitly disabled PIE we need to extend our cflags.
Paolo Bonzinib03fcd62023-05-22 10:05:33 +0200406#
407# -no-pie is supposedly a linker flag that has no effect on the compiler
408# command line, but some distros, that didn't quite know what they were
409# doing, made local changes to gcc's specs file that turned it into
410# a compiler command-line flag.
411#
412# What about linker flags? For a static build, no PIE is implied by -static
413# which we added above (and if it's not because of the same specs patching,
414# there's nothing we can do: compilation will fail, report a bug to your
415# distro and do not use --disable-pie in the meanwhile). For dynamic linking,
416# instead, we can't add -no-pie because it overrides -shared: the linker then
417# tries to build an executable instead of a shared library and fails. So
418# don't add -no-pie anywhere and cross fingers. :(
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200419if not get_option('b_pie')
Paolo Bonzinib03fcd62023-05-22 10:05:33 +0200420 qemu_common_flags += cc.get_supported_arguments('-fno-pie', '-no-pie')
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200421endif
422
Paolo Bonzini911d4ca2022-10-12 12:46:23 +0200423if not get_option('stack_protector').disabled()
424 stack_protector_probe = '''
425 int main(int argc, char *argv[])
426 {
427 char arr[64], *p = arr, *c = argv[argc - 1];
428 while (*c) {
429 *p++ = *c++;
430 }
431 return 0;
432 }'''
433 have_stack_protector = false
434 foreach arg : ['-fstack-protector-strong', '-fstack-protector-all']
435 # We need to check both a compile and a link, since some compiler
436 # setups fail only on a .c->.o compile and some only at link time
437 if cc.compiles(stack_protector_probe, args: ['-Werror', arg]) and \
438 cc.links(stack_protector_probe, args: ['-Werror', arg])
439 have_stack_protector = true
440 qemu_cflags += arg
441 qemu_ldflags += arg
442 break
443 endif
444 endforeach
445 get_option('stack_protector') \
446 .require(have_stack_protector, error_message: 'Stack protector not supported')
447endif
448
Paolo Bonzini67398252022-10-12 13:19:35 +0200449coroutine_backend = get_option('coroutine_backend')
450ucontext_probe = '''
451 #include <ucontext.h>
452 #ifdef __stub_makecontext
453 #error Ignoring glibc stub makecontext which will always fail
454 #endif
455 int main(void) { makecontext(0, 0, 0); return 0; }'''
456
457# On Windows the only valid backend is the Windows specific one.
458# For POSIX prefer ucontext, but it's not always possible. The fallback
459# is sigcontext.
460supported_backends = []
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100461if host_os == 'windows'
Paolo Bonzini67398252022-10-12 13:19:35 +0200462 supported_backends += ['windows']
463else
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100464 if host_os != 'darwin' and cc.links(ucontext_probe)
Paolo Bonzini67398252022-10-12 13:19:35 +0200465 supported_backends += ['ucontext']
466 endif
467 supported_backends += ['sigaltstack']
468endif
469
470if coroutine_backend == 'auto'
471 coroutine_backend = supported_backends[0]
472elif coroutine_backend not in supported_backends
473 error('"@0@" backend requested but not available. Available backends: @1@' \
474 .format(coroutine_backend, ', '.join(supported_backends)))
475endif
476
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200477# Compiles if SafeStack *not* enabled
478safe_stack_probe = '''
479 int main(void)
480 {
481 #if defined(__has_feature)
482 #if __has_feature(safe_stack)
483 #error SafeStack Enabled
484 #endif
485 #endif
486 return 0;
487 }'''
488if get_option('safe_stack') != not cc.compiles(safe_stack_probe)
489 safe_stack_arg = get_option('safe_stack') ? '-fsanitize=safe-stack' : '-fno-sanitize=safe-stack'
490 if get_option('safe_stack') != not cc.compiles(safe_stack_probe, args: safe_stack_arg)
491 error(get_option('safe_stack') \
492 ? 'SafeStack not supported by your compiler' \
493 : 'Cannot disable SafeStack')
494 endif
495 qemu_cflags += safe_stack_arg
496 qemu_ldflags += safe_stack_arg
497endif
Paolo Bonzini67398252022-10-12 13:19:35 +0200498if get_option('safe_stack') and coroutine_backend != 'ucontext'
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200499 error('SafeStack is only supported with the ucontext coroutine backend')
500endif
501
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000502if get_option('asan')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100503 if cc.has_argument('-fsanitize=address')
504 qemu_cflags = ['-fsanitize=address'] + qemu_cflags
505 qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000506 else
507 error('Your compiler does not support -fsanitize=address')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100508 endif
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000509endif
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100510
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000511if get_option('ubsan')
512 # Detect static linking issue with ubsan:
513 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100514 if cc.links('int main(int argc, char **argv) { return argc + 1; }',
515 args: [qemu_ldflags, '-fsanitize=undefined'])
Richard Hendersondb770a22024-08-13 19:52:16 +1000516 qemu_cflags += ['-fsanitize=undefined']
517 qemu_ldflags += ['-fsanitize=undefined']
518
519 # Suppress undefined behaviour from function call to mismatched type.
520 # In addition, tcg prologue does not emit function type prefix
521 # required by function call sanitizer.
522 if cc.has_argument('-fno-sanitize=function')
523 qemu_cflags += ['-fno-sanitize=function']
524 endif
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000525 else
526 error('Your compiler does not support -fsanitize=undefined')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100527 endif
528endif
529
530# Thread sanitizer is, for now, much noisier than the other sanitizers;
531# keep it separate until that is not the case.
532if get_option('tsan')
Richard Hendersoncb771ac2024-08-13 19:52:15 +1000533 if get_option('asan') or get_option('ubsan')
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100534 error('TSAN is not supported with other sanitizers')
535 endif
536 if not cc.has_function('__tsan_create_fiber',
537 args: '-fsanitize=thread',
538 prefix: '#include <sanitizer/tsan_interface.h>')
539 error('Cannot enable TSAN due to missing fiber annotation interface')
540 endif
Pierrick Bouviercf6fbba2024-10-23 12:33:52 +0100541 tsan_warn_suppress = []
542 # gcc (>=11) will report constructions not supported by tsan:
543 # "error: ‘atomic_thread_fence’ is not supported with ‘-fsanitize=thread’"
544 # https://gcc.gnu.org/gcc-11/changes.html
545 # However, clang does not support this warning and this triggers an error.
546 if cc.has_argument('-Wno-tsan')
547 tsan_warn_suppress = ['-Wno-tsan']
548 endif
549 qemu_cflags = ['-fsanitize=thread'] + tsan_warn_suppress + qemu_cflags
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100550 qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags
551endif
552
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100553# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
554# The combination is known as "full relro", because .got.plt is read-only too.
555qemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
556
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100557if host_os == 'windows'
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200558 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat')
Paolo Bonzini2d73fa72022-11-02 13:03:51 +0100559 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200560endif
561
Paolo Bonzini537b7242021-10-07 15:08:12 +0200562if get_option('fuzzing')
Paolo Bonzini537b7242021-10-07 15:08:12 +0200563 # Specify a filter to only instrument code that is directly related to
564 # virtual-devices.
565 configure_file(output: 'instrumentation-filter',
566 input: 'scripts/oss-fuzz/instrumentation-filter-template',
567 copy: true)
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400568
569 if cc.compiles('int main () { return 0; }',
570 name: '-fsanitize-coverage-allowlist=/dev/null',
Alexander Bulekove56d0972022-06-21 16:45:07 -0400571 args: ['-fsanitize-coverage-allowlist=/dev/null',
572 '-fsanitize-coverage=trace-pc'] )
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200573 qemu_common_flags += ['-fsanitize-coverage-allowlist=instrumentation-filter']
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400574 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +0200575
576 if get_option('fuzzing_engine') == ''
577 # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
578 # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link
579 # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
580 # unable to bind the fuzzer-related callbacks added by instrumentation.
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200581 qemu_common_flags += ['-fsanitize=fuzzer-no-link']
582 qemu_ldflags += ['-fsanitize=fuzzer-no-link']
Paolo Bonzini537b7242021-10-07 15:08:12 +0200583 # For the actual fuzzer binaries, we need to link against the libfuzzer
584 # library. They need to be configurable, to support OSS-Fuzz
585 fuzz_exe_ldflags = ['-fsanitize=fuzzer']
586 else
587 # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
588 # the needed CFLAGS have already been provided
589 fuzz_exe_ldflags = get_option('fuzzing_engine').split()
590 endif
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400591endif
592
Paolo Bonzini82761292023-05-10 14:54:30 +0200593if get_option('cfi')
594 cfi_flags=[]
595 # Check for dependency on LTO
596 if not get_option('b_lto')
597 error('Selected Control-Flow Integrity but LTO is disabled')
598 endif
599 if enable_modules
600 error('Selected Control-Flow Integrity is not compatible with modules')
601 endif
602 # Check for cfi flags. CFI requires LTO so we can't use
603 # get_supported_arguments, but need a more complex "compiles" which allows
604 # custom arguments
605 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
606 args: ['-flto', '-fsanitize=cfi-icall'] )
607 cfi_flags += '-fsanitize=cfi-icall'
608 else
609 error('-fsanitize=cfi-icall is not supported by the compiler')
610 endif
611 if cc.compiles('int main () { return 0; }',
612 name: '-fsanitize-cfi-icall-generalize-pointers',
613 args: ['-flto', '-fsanitize=cfi-icall',
614 '-fsanitize-cfi-icall-generalize-pointers'] )
615 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
616 else
617 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
618 endif
619 if get_option('cfi_debug')
620 if cc.compiles('int main () { return 0; }',
621 name: '-fno-sanitize-trap=cfi-icall',
622 args: ['-flto', '-fsanitize=cfi-icall',
623 '-fno-sanitize-trap=cfi-icall'] )
624 cfi_flags += '-fno-sanitize-trap=cfi-icall'
625 else
626 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
627 endif
628 endif
629 add_global_arguments(cfi_flags, native: false, language: all_languages)
630 add_global_link_arguments(cfi_flags, native: false, language: all_languages)
631endif
632
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000633# Check further flags that make QEMU more robust against malicious parties
634
635hardening_flags = [
Daniel P. Berrangé7ff9ff032024-01-03 12:34:14 +0000636 # Initialize all stack variables to zero. This makes
637 # it harder to take advantage of uninitialized stack
638 # data to drive exploits
639 '-ftrivial-auto-var-init=zero',
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000640]
641
Daniel P. Berrangé95633112024-03-04 14:44:55 +0000642# Zero out registers used during a function call
643# upon its return. This makes it harder to assemble
644# ROP gadgets into something usable
645#
646# NB: Clang 17 is broken and SEGVs
647# https://github.com/llvm/llvm-project/issues/75168
Thomas Huth2d6d9952024-04-11 14:08:19 +0200648#
649# NB2: This clashes with the "retguard" extension of OpenBSD's Clang
650# https://gitlab.com/qemu-project/qemu/-/issues/2278
651if host_os != 'openbsd' and \
652 cc.compiles('extern struct { void (*cb)(void); } s; void f(void) { s.cb(); }',
Daniel P. Berrangé95633112024-03-04 14:44:55 +0000653 name: '-fzero-call-used-regs=used-gpr',
654 args: ['-O2', '-fzero-call-used-regs=used-gpr'])
655 hardening_flags += '-fzero-call-used-regs=used-gpr'
656endif
657
Daniel P. Berrangé043eaa02024-01-03 12:34:13 +0000658qemu_common_flags += cc.get_supported_arguments(hardening_flags)
659
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200660add_global_arguments(qemu_common_flags, native: false, language: all_languages)
661add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
662
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100663# Collect warning flags we want to set, sorted alphabetically
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100664warn_flags = [
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100665 # First enable interesting warnings
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100666 '-Wempty-body',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100667 '-Wendif-labels',
668 '-Wexpansion-to-defined',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100669 '-Wformat-security',
670 '-Wformat-y2k',
671 '-Wignored-qualifiers',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100672 '-Wimplicit-fallthrough=2',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100673 '-Winit-self',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100674 '-Wmissing-format-attribute',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100675 '-Wmissing-prototypes',
676 '-Wnested-externs',
677 '-Wold-style-declaration',
678 '-Wold-style-definition',
679 '-Wredundant-decls',
680 '-Wshadow=local',
681 '-Wstrict-prototypes',
682 '-Wtype-limits',
683 '-Wundef',
Peter Maydell64c1a542024-02-21 17:26:36 +0100684 '-Wvla',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100685 '-Wwrite-strings',
686
687 # Then disable some undesirable warnings
688 '-Wno-gnu-variable-sized-type-not-at-end',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100689 '-Wno-initializer-overrides',
690 '-Wno-missing-include-dirs',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100691 '-Wno-psabi',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100692 '-Wno-shift-negative-value',
693 '-Wno-string-plus-int',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100694 '-Wno-tautological-type-limit-compare',
Daniel P. Berrangéfdd51402023-09-21 10:12:51 +0100695 '-Wno-typedef-redefinition',
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100696]
697
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100698if host_os != 'darwin'
Kevin Wolf7e171112024-06-27 20:12:45 +0200699 tsa_has_cleanup = cc.compiles('''
700 struct __attribute__((capability("mutex"))) mutex {};
701 void lock(struct mutex *m) __attribute__((acquire_capability(m)));
702 void unlock(struct mutex *m) __attribute__((release_capability(m)));
703
704 void test(void) {
705 struct mutex __attribute__((cleanup(unlock))) m;
706 lock(&m);
707 }
708 ''', args: ['-Wthread-safety', '-Werror'])
709 if tsa_has_cleanup
710 warn_flags += ['-Wthread-safety']
711 endif
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100712endif
713
Thomas Huth785abf02023-07-06 08:47:36 +0200714# Set up C++ compiler flags
Paolo Bonzinib4854582021-11-08 12:31:52 +0100715qemu_cxxflags = []
Paolo Bonzinie5134022022-10-12 14:15:06 +0200716if 'cpp' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100717 qemu_cxxflags = ['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'] + qemu_cflags
Paolo Bonzinib4854582021-11-08 12:31:52 +0100718endif
719
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200720add_project_arguments(qemu_cflags, native: false, language: 'c')
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100721add_project_arguments(cc.get_supported_arguments(warn_flags), native: false, language: 'c')
722if 'cpp' in all_languages
723 add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
724 add_project_arguments(cxx.get_supported_arguments(warn_flags), native: false, language: 'cpp')
725endif
726if 'objc' in all_languages
727 # Note sanitizer flags are not applied to Objective-C sources!
728 add_project_arguments(objc.get_supported_arguments(warn_flags), native: false, language: 'objc')
729endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100730if host_os == 'linux'
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400731 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
732 '-isystem', 'linux-headers',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200733 language: all_languages)
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400734endif
735
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100736add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400737 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400738 '-iquote', meson.current_source_dir() / 'include',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200739 language: all_languages)
Paolo Bonzinia5665052019-06-10 12:05:14 +0200740
Richard Henderson44fc7162023-05-17 17:48:34 -0700741# If a host-specific include directory exists, list that first...
742host_include = meson.current_source_dir() / 'host/include/'
743if fs.is_dir(host_include / host_arch)
744 add_project_arguments('-iquote', host_include / host_arch,
745 language: all_languages)
746endif
747# ... followed by the generic fallback.
748add_project_arguments('-iquote', host_include / 'generic',
749 language: all_languages)
750
Paolo Bonzinideb62372020-09-01 07:51:16 -0400751sparse = find_program('cgcc', required: get_option('sparse'))
752if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100753 run_target('sparse',
754 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400755 'compile_commands.json', sparse.full_path(), '-Wbitwise',
756 '-Wno-transparent-union', '-Wno-old-initializer',
757 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100758endif
759
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200760#####################################
761# Host-specific libraries and flags #
762#####################################
763
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200764libm = cc.find_library('m', required: false)
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +0200765threads = dependency('threads')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400766util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200767winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400768socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400769version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400770coref = []
771iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400772emulator_link_args = []
Marc-André Lureau23011f42022-02-01 12:55:21 +0400773midl = not_found
774widl = not_found
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900775pathcch = not_found
Paolo Bonzinia6305082021-10-07 15:08:15 +0200776host_dsosuf = '.so'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100777if host_os == 'windows'
Marc-André Lureau23011f42022-02-01 12:55:21 +0400778 midl = find_program('midl', required: false)
779 widl = find_program('widl', required: false)
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900780 pathcch = cc.find_library('pathcch')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400781 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200782 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400783
784 win = import('windows')
785 version_res = win.compile_resources('version.rc',
786 depend_files: files('pc-bios/qemu-nsis.ico'),
787 include_directories: include_directories('.'))
Paolo Bonzinia6305082021-10-07 15:08:15 +0200788 host_dsosuf = '.dll'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100789elif host_os == 'darwin'
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400790 coref = dependency('appleframeworks', modules: 'CoreFoundation')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700791 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
Paolo Bonzinia6305082021-10-07 15:08:15 +0200792 host_dsosuf = '.dylib'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100793elif host_os == 'sunos'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200794 socket = [cc.find_library('socket'),
795 cc.find_library('nsl'),
796 cc.find_library('resolv')]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100797elif host_os == 'haiku'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200798 socket = [cc.find_library('posix_error_mapper'),
799 cc.find_library('network'),
800 cc.find_library('bsd')]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100801elif host_os == 'openbsd'
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100802 if get_option('tcg').allowed() and target_dirs.length() > 0
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400803 # Disable OpenBSD W^X if available
804 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
805 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400806endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200807
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200808###############################################
809# Host-specific configuration of accelerators #
810###############################################
811
Paolo Bonzini8a199802020-09-18 05:37:01 -0400812accelerators = []
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100813if get_option('kvm').allowed() and host_os == 'linux'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400814 accelerators += 'CONFIG_KVM'
815endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100816if get_option('whpx').allowed() and host_os == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000817 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400818 error('WHPX requires 64-bit host')
Philippe Mathieu-Daudé641b8412023-06-24 15:31:44 +0200819 elif cc.has_header('winhvplatform.h', required: get_option('whpx')) and \
820 cc.has_header('winhvemulation.h', required: get_option('whpx'))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400821 accelerators += 'CONFIG_WHPX'
822 endif
823endif
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200824
825hvf = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100826if get_option('hvf').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400827 hvf = dependency('appleframeworks', modules: 'Hypervisor',
828 required: get_option('hvf'))
829 if hvf.found()
830 accelerators += 'CONFIG_HVF'
831 endif
832endif
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200833
834nvmm = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100835if host_os == 'netbsd'
nia0cc49652021-10-13 13:54:17 +0000836 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200837 if nvmm.found()
838 accelerators += 'CONFIG_NVMM'
839 endif
840endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100841
Paolo Bonzini823eb012021-11-08 14:18:17 +0100842tcg_arch = host_arch
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100843if get_option('tcg').allowed()
Paolo Bonzini823eb012021-11-08 14:18:17 +0100844 if host_arch == 'unknown'
Paolo Bonzinia24f15d2023-08-04 11:29:05 +0200845 if not get_option('tcg_interpreter')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400846 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
847 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100848 elif get_option('tcg_interpreter')
Philippe Mathieu-Daudé1c282da2021-05-21 12:34:23 +0200849 warning('Use of the TCG interpreter is not recommended on this host')
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100850 warning('architecture. There is a native TCG execution backend available')
851 warning('which provides substantially better performance and reliability.')
852 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
853 warning('configuration option on this architecture to use the native')
854 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400855 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100856 if get_option('tcg_interpreter')
857 tcg_arch = 'tci'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100858 elif host_arch == 'x86_64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100859 tcg_arch = 'i386'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100860 elif host_arch == 'ppc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100861 tcg_arch = 'ppc'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100862 endif
863 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzinie5134022022-10-12 14:15:06 +0200864 language: all_languages)
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100865
Paolo Bonzini8a199802020-09-18 05:37:01 -0400866 accelerators += 'CONFIG_TCG'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400867endif
868
869if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
870 error('KVM not available on this platform')
871endif
872if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
873 error('HVF not available on this platform')
874endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200875if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
876 error('NVMM not available on this platform')
877endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400878if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
879 error('WHPX not available on this platform')
880endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400881
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200882xen = not_found
883if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
884 xencontrol = dependency('xencontrol', required: false,
885 method: 'pkg-config')
886 if xencontrol.found()
887 xen_pc = declare_dependency(version: xencontrol.version(),
888 dependencies: [
889 xencontrol,
890 # disabler: true makes xen_pc.found() return false if any is not found
891 dependency('xenstore', required: false,
892 method: 'pkg-config',
893 disabler: true),
894 dependency('xenforeignmemory', required: false,
895 method: 'pkg-config',
896 disabler: true),
897 dependency('xengnttab', required: false,
898 method: 'pkg-config',
899 disabler: true),
900 dependency('xenevtchn', required: false,
901 method: 'pkg-config',
902 disabler: true),
903 dependency('xendevicemodel', required: false,
904 method: 'pkg-config',
905 disabler: true),
906 # optional, no "disabler: true"
907 dependency('xentoolcore', required: false,
908 method: 'pkg-config')])
909 if xen_pc.found()
910 xen = xen_pc
911 endif
912 endif
913 if not xen.found()
914 xen_tests = [ '4.11.0', '4.10.0', '4.9.0', '4.8.0', '4.7.1' ]
915 xen_libs = {
916 '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
917 '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
918 '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
919 '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
920 '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
921 }
922 xen_deps = {}
923 foreach ver: xen_tests
924 # cache the various library tests to avoid polluting the logs
925 xen_test_deps = []
926 foreach l: xen_libs[ver]
927 if l not in xen_deps
928 xen_deps += { l: cc.find_library(l, required: false) }
929 endif
930 xen_test_deps += xen_deps[l]
931 endforeach
932
933 # Use -D to pick just one of the test programs in scripts/xen-detect.c
934 xen_version = ver.split('.')
935 xen_ctrl_version = xen_version[0] + \
936 ('0' + xen_version[1]).substring(-2) + \
937 ('0' + xen_version[2]).substring(-2)
938 if cc.links(files('scripts/xen-detect.c'),
939 args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
940 dependencies: xen_test_deps)
941 xen = declare_dependency(version: ver, dependencies: xen_test_deps)
942 break
943 endif
944 endforeach
945 endif
946 if xen.found()
947 accelerators += 'CONFIG_XEN'
948 elif get_option('xen').enabled()
949 error('could not compile and link Xen test program')
950 endif
951endif
952have_xen_pci_passthrough = get_option('xen_pci_passthrough') \
953 .require(xen.found(),
954 error_message: 'Xen PCI passthrough requested but Xen not enabled') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100955 .require(host_os == 'linux',
Paolo Bonzini0f63d962023-09-08 12:08:53 +0200956 error_message: 'Xen PCI passthrough not available on this platform') \
957 .require(cpu == 'x86' or cpu == 'x86_64',
958 error_message: 'Xen PCI passthrough not available on this platform') \
959 .allowed()
960
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200961################
962# Dependencies #
963################
964
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200965# When bumping glib minimum version, please check also whether to increase
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +0300966# the _WIN32_WINNT setting in osdep.h according to the value from glib.
967# You should also check if any of the glib.version() checks
968# below can also be removed.
Thomas Huth0d8caac2024-04-18 12:10:50 +0200969glib_req_ver = '>=2.66.0'
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200970glib_pc = dependency('glib-2.0', version: glib_req_ver, required: true,
971 method: 'pkg-config')
972glib_cflags = []
Paolo Bonzini60027112022-10-20 14:53:10 +0200973if enable_modules
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200974 gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true,
975 method: 'pkg-config')
Paolo Bonzini2c13c572023-08-30 12:20:53 +0200976elif get_option('plugins')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200977 gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true,
978 method: 'pkg-config')
979else
980 gmodule = not_found
Emilio Cotae3feb2c2023-02-05 11:37:57 -0500981endif
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400982
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200983# This workaround is required due to a bug in pkg-config file for glib as it
984# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +0100985if host_os == 'windows' and get_option('prefer_static')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200986 glib_cflags += ['-DGLIB_STATIC_COMPILATION']
987endif
988
989# Sanity check that the current size_t matches the
990# size that glib thinks it should be. This catches
991# problems on multi-arch where people try to build
992# 32-bit QEMU while pointing at 64-bit glib headers
993
994if not cc.compiles('''
995 #include <glib.h>
996 #include <unistd.h>
997
998 #define QEMU_BUILD_BUG_ON(x) \
999 typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
1000
1001 int main(void) {
1002 QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
1003 return 0;
1004 }''', dependencies: glib_pc, args: glib_cflags)
1005 error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T.
1006 You probably need to set PKG_CONFIG_LIBDIR" to point
1007 to the right pkg-config files for your build target.''')
1008endif
1009
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001010glib = declare_dependency(dependencies: [glib_pc, gmodule],
1011 compile_args: glib_cflags,
1012 version: glib_pc.version())
1013
1014# Check whether glib has gslice, which we have to avoid for correctness.
1015# TODO: remove this check and the corresponding workaround (qtree) when
1016# the minimum supported glib is >= 2.75.3
1017glib_has_gslice = glib.version().version_compare('<2.75.3')
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03001018# Check whether glib has the aligned_alloc family of functions.
1019# <https://docs.gtk.org/glib/func.aligned_alloc.html>
1020glib_has_aligned_alloc = glib.version().version_compare('>=2.72.0')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001021
1022# override glib dep to include the above refinements
1023meson.override_dependency('glib-2.0', glib)
1024
1025# The path to glib.h is added to all compilation commands.
1026add_project_dependencies(glib.partial_dependency(compile_args: true, includes: true),
1027 native: false, language: all_languages)
1028
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001029gio = not_found
Paolo Bonzini75440602022-04-20 17:33:44 +02001030gdbus_codegen = not_found
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02001031gdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
Paolo Bonzini75440602022-04-20 17:33:44 +02001032if not get_option('gio').auto() or have_system
1033 gio = dependency('gio-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001034 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +02001035 if gio.found() and not cc.links('''
1036 #include <gio/gio.h>
1037 int main(void)
1038 {
1039 g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
1040 return 0;
1041 }''', dependencies: [glib, gio])
1042 if get_option('gio').enabled()
1043 error('The installed libgio is broken for static linking')
1044 endif
1045 gio = not_found
1046 endif
1047 if gio.found()
Marc-André Lureauc118c8e2024-10-08 16:50:22 +04001048 gdbus_codegen = find_program('gdbus-codegen',
Paolo Bonzini75440602022-04-20 17:33:44 +02001049 required: get_option('gio'))
1050 gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001051 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +02001052 gio = declare_dependency(dependencies: [gio, gio_unix],
1053 version: gio.version())
1054 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001055endif
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02001056if gdbus_codegen.found() and get_option('cfi')
1057 gdbus_codegen = not_found
1058 gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity'
1059endif
Paolo Bonzini75440602022-04-20 17:33:44 +02001060
Marc-André Lureau6cc5a612023-06-06 15:56:42 +04001061xml_pp = find_program('scripts/xml-preprocess.py')
1062
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001063lttng = not_found
Paolo Bonzini9c29b742021-10-07 15:08:14 +02001064if 'ust' in get_option('trace_backends')
Marc-André Lureaue32aaa52022-03-28 12:47:13 +04001065 lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001066 method: 'pkg-config')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001067endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001068pixman = not_found
Marc-André Lureaucca15752023-08-30 13:38:25 +04001069if not get_option('pixman').auto() or have_system or have_tools
1070 pixman = dependency('pixman-1', required: get_option('pixman'), version:'>=0.21.8',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001071 method: 'pkg-config')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001072endif
Marc-André Lureaucca15752023-08-30 13:38:25 +04001073
Paolo Bonzini063d5112022-07-14 14:56:58 +02001074zlib = dependency('zlib', required: true)
Paolo Bonzini53c22b62021-06-03 11:31:35 +02001075
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001076libaio = not_found
1077if not get_option('linux_aio').auto() or have_block
1078 libaio = cc.find_library('aio', has_headers: ['libaio.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001079 required: get_option('linux_aio'))
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001080endif
Leonardo Bras354081d2022-05-13 03:28:30 -03001081
1082linux_io_uring_test = '''
1083 #include <liburing.h>
1084 #include <linux/errqueue.h>
1085
1086 int main(void) { return 0; }'''
1087
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001088linux_io_uring = not_found
Paolo Bonzini53c22b62021-06-03 11:31:35 +02001089if not get_option('linux_io_uring').auto() or have_block
Daniel P. Berrangéa41b4fd2022-01-05 13:49:38 +00001090 linux_io_uring = dependency('liburing', version: '>=0.3',
1091 required: get_option('linux_io_uring'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001092 method: 'pkg-config')
Leonardo Bras354081d2022-05-13 03:28:30 -03001093 if not cc.links(linux_io_uring_test)
1094 linux_io_uring = not_found
1095 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001096endif
Leonardo Bras354081d2022-05-13 03:28:30 -03001097
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001098libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +01001099if not get_option('libnfs').auto() or have_block
1100 libnfs = dependency('libnfs', version: '>=1.9.3',
1101 required: get_option('libnfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001102 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001103endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001104
1105libattr_test = '''
1106 #include <stddef.h>
1107 #include <sys/types.h>
1108 #ifdef CONFIG_LIBATTR
1109 #include <attr/xattr.h>
1110 #else
1111 #include <sys/xattr.h>
1112 #endif
1113 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
1114
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001115libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001116have_old_libattr = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001117if get_option('attr').allowed()
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001118 if cc.links(libattr_test)
1119 libattr = declare_dependency()
1120 else
1121 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001122 required: get_option('attr'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001123 if libattr.found() and not \
1124 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
1125 libattr = not_found
1126 if get_option('attr').enabled()
1127 error('could not link libattr')
1128 else
1129 warning('could not link libattr, disabling')
1130 endif
1131 else
1132 have_old_libattr = libattr.found()
1133 endif
1134 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001135endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001136
Akihiko Odakid2277f02024-07-15 14:25:44 +09001137cocoa = dependency('appleframeworks',
1138 modules: ['Cocoa', 'CoreVideo', 'QuartzCore'],
Akihiko Odaki52eaefd2022-07-02 23:25:19 +09001139 required: get_option('cocoa'))
Paolo Bonzinic1ec4942021-01-07 14:04:00 +01001140
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03001141vmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet'))
1142if vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h',
1143 'VMNET_BRIDGED_MODE',
1144 dependencies: vmnet)
1145 vmnet = not_found
1146 if get_option('vmnet').enabled()
1147 error('vmnet.framework API is outdated')
1148 else
1149 warning('vmnet.framework API is outdated, disabling')
1150 endif
1151endif
1152
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001153seccomp = not_found
Michal Privoznik73422d92022-10-26 09:30:24 +02001154seccomp_has_sysrawrc = false
Paolo Bonzini90835c22020-11-17 14:22:24 +01001155if not get_option('seccomp').auto() or have_system or have_tools
1156 seccomp = dependency('libseccomp', version: '>=2.3.0',
1157 required: get_option('seccomp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001158 method: 'pkg-config')
Michal Privoznik73422d92022-10-26 09:30:24 +02001159 if seccomp.found()
1160 seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h',
1161 'SCMP_FLTATR_API_SYSRAWRC',
1162 dependencies: seccomp)
1163 endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001164endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001165
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001166libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001167if not get_option('cap_ng').auto() or have_system or have_tools
1168 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001169 required: get_option('cap_ng'))
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001170endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001171if libcap_ng.found() and not cc.links('''
1172 #include <cap-ng.h>
1173 int main(void)
1174 {
1175 capng_capability_to_name(CAPNG_EFFECTIVE);
1176 return 0;
1177 }''', dependencies: libcap_ng)
1178 libcap_ng = not_found
1179 if get_option('cap_ng').enabled()
1180 error('could not link libcap-ng')
1181 else
1182 warning('could not link libcap-ng, disabling')
1183 endif
1184endif
1185
Paolo Bonzini1917ec62020-08-26 03:24:11 -04001186if get_option('xkbcommon').auto() and not have_system and not have_tools
1187 xkbcommon = not_found
1188else
1189 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001190 method: 'pkg-config')
Marc-André Lureauade60d42019-07-15 14:48:31 +04001191endif
Paolo Bonzinie1723992021-10-07 15:08:21 +02001192
Thomas Huth58902582022-04-08 18:20:47 +02001193slirp = not_found
1194if not get_option('slirp').auto() or have_system
1195 slirp = dependency('slirp', required: get_option('slirp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001196 method: 'pkg-config')
Thomas Huth58902582022-04-08 18:20:47 +02001197 # slirp < 4.7 is incompatible with CFI support in QEMU. This is because
1198 # it passes function pointers within libslirp as callbacks for timers.
1199 # When using a system-wide shared libslirp, the type information for the
1200 # callback is missing and the timer call produces a false positive with CFI.
1201 # Do not use the "version" keyword argument to produce a better error.
1202 # with control-flow integrity.
1203 if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7')
1204 if get_option('slirp').enabled()
1205 error('Control-Flow Integrity requires libslirp 4.7.')
1206 else
1207 warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.')
1208 slirp = not_found
1209 endif
1210 endif
1211endif
1212
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001213vde = not_found
Paolo Bonzinie1723992021-10-07 15:08:21 +02001214if not get_option('vde').auto() or have_system or have_tools
1215 vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001216 required: get_option('vde'))
Paolo Bonzinie1723992021-10-07 15:08:21 +02001217endif
1218if vde.found() and not cc.links('''
1219 #include <libvdeplug.h>
1220 int main(void)
1221 {
1222 struct vde_open_args a = {0, 0, 0};
1223 char s[] = "";
1224 vde_open(s, s, &a);
1225 return 0;
1226 }''', dependencies: vde)
1227 vde = not_found
1228 if get_option('cap_ng').enabled()
1229 error('could not link libvdeplug')
1230 else
1231 warning('could not link libvdeplug, disabling')
1232 endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001233endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001234
Paolo Bonzini478e9432020-08-17 12:47:55 +02001235pulse = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001236if not get_option('pa').auto() or (host_os == 'linux' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001237 pulse = dependency('libpulse', required: get_option('pa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001238 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001239endif
1240alsa = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001241if not get_option('alsa').auto() or (host_os == 'linux' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001242 alsa = dependency('alsa', required: get_option('alsa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001243 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001244endif
1245jack = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001246if not get_option('jack').auto() or have_system
1247 jack = dependency('jack', required: get_option('jack'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001248 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001249endif
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001250pipewire = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001251if not get_option('pipewire').auto() or (host_os == 'linux' and have_system)
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001252 pipewire = dependency('libpipewire-0.3', version: '>=0.3.60',
1253 required: get_option('pipewire'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001254 method: 'pkg-config')
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001255endif
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001256sndio = not_found
1257if not get_option('sndio').auto() or have_system
1258 sndio = dependency('sndio', required: get_option('sndio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001259 method: 'pkg-config')
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001260endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001261
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001262spice_protocol = not_found
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001263if not get_option('spice_protocol').auto() or have_system
Markus Armbruster5c167b52023-01-09 20:03:07 +01001264 spice_protocol = dependency('spice-protocol', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001265 required: get_option('spice_protocol'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001266 method: 'pkg-config')
Paolo Bonzini26347332019-07-29 15:40:07 +02001267endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001268spice = not_found
Marc-André Lureauc98791e2023-08-30 13:38:35 +04001269if get_option('spice') \
1270 .disable_auto_if(not have_system) \
1271 .require(pixman.found(),
1272 error_message: 'cannot enable SPICE if pixman is not available') \
1273 .allowed()
Markus Armbruster34d55722023-01-09 20:03:09 +01001274 spice = dependency('spice-server', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001275 required: get_option('spice'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001276 method: 'pkg-config')
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001277endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001278spice_headers = spice.partial_dependency(compile_args: true, includes: true)
1279
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04001280rt = cc.find_library('rt', required: false)
Paolo Bonzinia399f912021-11-15 14:29:13 +00001281
Paolo Bonzini99650b62019-06-10 12:21:14 +02001282libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001283if not get_option('libiscsi').auto() or have_block
1284 libiscsi = dependency('libiscsi', version: '>=1.9.0',
1285 required: get_option('libiscsi'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001286 method: 'pkg-config')
Paolo Bonzini99650b62019-06-10 12:21:14 +02001287endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001288zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +01001289if not get_option('zstd').auto() or have_block
1290 zstd = dependency('libzstd', version: '>=1.4.0',
1291 required: get_option('zstd'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001292 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001293endif
Yuan Liub844a2c2024-06-10 18:21:06 +08001294qpl = not_found
1295if not get_option('qpl').auto() or have_system
1296 qpl = dependency('qpl', version: '>=1.5.0',
1297 required: get_option('qpl'),
1298 method: 'pkg-config')
1299endif
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01001300uadk = not_found
1301if not get_option('uadk').auto() or have_system
1302 libwd = dependency('libwd', version: '>=2.6',
1303 required: get_option('uadk'),
1304 method: 'pkg-config')
1305 libwd_comp = dependency('libwd_comp', version: '>=2.6',
1306 required: get_option('uadk'),
1307 method: 'pkg-config')
1308 if libwd.found() and libwd_comp.found()
1309 uadk = declare_dependency(dependencies: [libwd, libwd_comp])
1310 endif
1311endif
Bryan Zhange28ed312024-08-30 16:27:19 -07001312
1313qatzip = not_found
1314if not get_option('qatzip').auto() or have_system
1315 qatzip = dependency('qatzip', version: '>=1.1.2',
1316 required: get_option('qatzip'),
1317 method: 'pkg-config')
1318endif
1319
Marc-André Lureauea458962019-07-12 22:23:46 +04001320virgl = not_found
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001321
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001322have_vhost_user_gpu = have_tools and host_os == 'linux' and pixman.found()
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001323if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
Paolo Bonzini587d59d2021-06-03 11:31:35 +02001324 virgl = dependency('virglrenderer',
1325 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001326 required: get_option('virglrenderer'))
Marc-André Lureauea458962019-07-12 22:23:46 +04001327endif
Gurchetan Singhcd9adbe2023-03-21 09:47:36 -07001328rutabaga = not_found
1329if not get_option('rutabaga_gfx').auto() or have_system or have_vhost_user_gpu
1330 rutabaga = dependency('rutabaga_gfx_ffi',
1331 method: 'pkg-config',
1332 required: get_option('rutabaga_gfx'))
1333endif
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001334blkio = not_found
1335if not get_option('blkio').auto() or have_block
1336 blkio = dependency('blkio',
1337 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001338 required: get_option('blkio'))
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001339endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001340curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001341if not get_option('curl').auto() or have_block
1342 curl = dependency('libcurl', version: '>=7.29.0',
1343 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001344 required: get_option('curl'))
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001345endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001346libudev = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001347if host_os == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001348 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +01001349 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001350 required: get_option('libudev'))
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001351endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001352
Paolo Bonzini5c530152020-10-15 06:09:27 -04001353mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001354mpathpersist = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001355if host_os == 'linux' and have_tools and get_option('mpath').allowed()
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001356 mpath_test_source = '''
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001357 #include <libudev.h>
1358 #include <mpath_persist.h>
1359 unsigned mpath_mx_alloc_len = 1024;
1360 int logsink;
1361 static struct config *multipath_conf;
1362 extern struct udev *udev;
1363 extern struct config *get_multipath_config(void);
1364 extern void put_multipath_config(struct config *conf);
1365 struct udev *udev;
1366 struct config *get_multipath_config(void) { return multipath_conf; }
1367 void put_multipath_config(struct config *conf) { }
1368 int main(void) {
1369 udev = udev_new();
1370 multipath_conf = mpath_lib_init();
1371 return 0;
1372 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -04001373 libmpathpersist = cc.find_library('mpathpersist',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001374 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001375 if libmpathpersist.found()
1376 mpathlibs += libmpathpersist
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001377 if get_option('prefer_static')
Paolo Bonzini5c530152020-10-15 06:09:27 -04001378 mpathlibs += cc.find_library('devmapper',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001379 required: get_option('mpath'))
Paolo Bonzini43b43a42020-09-17 12:25:09 +02001380 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -04001381 mpathlibs += cc.find_library('multipath',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001382 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001383 foreach lib: mpathlibs
1384 if not lib.found()
1385 mpathlibs = []
1386 break
1387 endif
1388 endforeach
1389 if mpathlibs.length() == 0
1390 msg = 'Dependencies missing for libmpathpersist'
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001391 elif cc.links(mpath_test_source, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001392 mpathpersist = declare_dependency(dependencies: mpathlibs)
1393 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001394 msg = 'Cannot detect libmpathpersist API'
1395 endif
1396 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001397 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -04001398 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001399 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001400 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001401 endif
1402 endif
1403 endif
1404endif
1405
Yonggang Luo5285e592020-10-13 07:43:48 +08001406iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001407curses = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001408if have_system and get_option('curses').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001409 curses_test = '''
Brad Smithf8d31162024-10-11 23:38:55 -04001410 #ifdef __APPLE__
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001411 #define _XOPEN_SOURCE_EXTENDED 1
1412 #endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001413 #include <locale.h>
1414 #include <curses.h>
1415 #include <wchar.h>
1416 int main(void) {
1417 wchar_t wch = L'w';
1418 setlocale(LC_ALL, "");
1419 resize_term(0, 0);
1420 addwstr(L"wide chars\n");
1421 addnwstr(&wch, 1);
1422 add_wch(WACS_DEGREE);
1423 return 0;
1424 }'''
1425
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001426 curses_dep_list = host_os == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
Paolo Bonzini6d322632022-03-27 16:05:58 +02001427 curses = dependency(curses_dep_list,
1428 required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001429 method: 'pkg-config')
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001430 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001431 curses_compile_args = ['-DNCURSES_WIDECHAR=1']
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001432 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -05001433 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001434 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses],
1435 version: curses.version())
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001436 else
1437 msg = 'curses package not usable'
1438 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001439 endif
1440 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001441 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001442 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001443 if host_os != 'windows' and not has_curses_h
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001444 message('Trying with /usr/include/ncursesw')
1445 curses_compile_args += ['-I/usr/include/ncursesw']
1446 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
1447 endif
1448 if has_curses_h
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001449 curses_libname_list = (host_os == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001450 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +08001451 libcurses = cc.find_library(curses_libname,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001452 required: false)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001453 if libcurses.found()
1454 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
1455 curses = declare_dependency(compile_args: curses_compile_args,
1456 dependencies: [libcurses])
1457 break
1458 else
1459 msg = 'curses library not usable'
1460 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001461 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001462 endforeach
1463 endif
1464 endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001465 if get_option('iconv').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001466 foreach link_args : [ ['-liconv'], [] ]
1467 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
1468 # We need to use libiconv if available because mixing libiconv's headers with
1469 # the system libc does not work.
1470 # However, without adding glib to the dependencies -L/usr/local/lib will not be
1471 # included in the command line and libiconv will not be found.
1472 if cc.links('''
1473 #include <iconv.h>
1474 int main(void) {
1475 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
1476 return conv != (iconv_t) -1;
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001477 }''', args: link_args, dependencies: glib)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001478 iconv = declare_dependency(link_args: link_args, dependencies: glib)
1479 break
Yonggang Luo5285e592020-10-13 07:43:48 +08001480 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001481 endforeach
1482 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001483 if curses.found() and not iconv.found()
1484 if get_option('iconv').enabled()
1485 error('iconv not available')
1486 endif
1487 msg = 'iconv required for curses UI but not available'
1488 curses = not_found
1489 endif
1490 if not curses.found() and msg != ''
1491 if get_option('curses').enabled()
1492 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001493 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001494 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001495 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001496 endif
1497endif
1498
Paolo Bonzini26347332019-07-29 15:40:07 +02001499brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001500if not get_option('brlapi').auto() or have_system
1501 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001502 required: get_option('brlapi'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001503 if brlapi.found() and not cc.links('''
1504 #include <brlapi.h>
1505 #include <stddef.h>
1506 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
1507 brlapi = not_found
1508 if get_option('brlapi').enabled()
1509 error('could not link brlapi')
1510 else
1511 warning('could not link brlapi, disabling')
1512 endif
1513 endif
Paolo Bonzini26347332019-07-29 15:40:07 +02001514endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001515
Paolo Bonzini760e4322020-08-26 08:09:48 +02001516sdl = not_found
Akihiko Odaki64d3fec2022-08-19 22:27:56 +09001517if not get_option('sdl').auto() or have_system
Paolo Bonzini063d5112022-07-14 14:56:58 +02001518 sdl = dependency('sdl2', required: get_option('sdl'))
Paolo Bonzini760e4322020-08-26 08:09:48 +02001519 sdl_image = not_found
1520endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001521if sdl.found()
Thomas Huth6da5f222023-06-05 13:45:23 +02001522 # Some versions of SDL have problems with -Wundef
1523 if not cc.compiles('''
1524 #include <SDL.h>
1525 #include <SDL_syswm.h>
1526 int main(int argc, char *argv[]) { return 0; }
1527 ''', dependencies: sdl, args: '-Werror=undef')
1528 sdl = declare_dependency(compile_args: '-Wno-undef',
1529 dependencies: sdl,
1530 version: sdl.version())
1531 endif
Volker Rümelin7161a432020-08-29 12:41:58 +02001532 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001533 method: 'pkg-config')
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001534else
1535 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +01001536 error('sdl-image required, but SDL was @0@'.format(
1537 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001538 endif
1539 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +02001540endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001541
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001542rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001543if not get_option('rbd').auto() or have_block
Paolo Bonzini063d5112022-07-14 14:56:58 +02001544 librados = cc.find_library('rados', required: get_option('rbd'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001545 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001546 required: get_option('rbd'))
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001547 if librados.found() and librbd.found()
1548 if cc.links('''
1549 #include <stdio.h>
1550 #include <rbd/librbd.h>
1551 int main(void) {
1552 rados_t cluster;
1553 rados_create(&cluster, NULL);
Peter Lieven48672ac2021-07-02 19:23:51 +02001554 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
1555 #error
1556 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001557 return 0;
1558 }''', dependencies: [librbd, librados])
1559 rbd = declare_dependency(dependencies: [librbd, librados])
1560 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +02001561 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001562 else
Peter Lieven48672ac2021-07-02 19:23:51 +02001563 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001564 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001565 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001566endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001567
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001568glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001569glusterfs_ftruncate_has_stat = false
1570glusterfs_iocb_has_stat = false
1571if not get_option('glusterfs').auto() or have_block
1572 glusterfs = dependency('glusterfs-api', version: '>=3',
1573 required: get_option('glusterfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001574 method: 'pkg-config')
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001575 if glusterfs.found()
1576 glusterfs_ftruncate_has_stat = cc.links('''
1577 #include <glusterfs/api/glfs.h>
1578
1579 int
1580 main(void)
1581 {
1582 /* new glfs_ftruncate() passes two additional args */
1583 return glfs_ftruncate(NULL, 0, NULL, NULL);
1584 }
1585 ''', dependencies: glusterfs)
1586 glusterfs_iocb_has_stat = cc.links('''
1587 #include <glusterfs/api/glfs.h>
1588
1589 /* new glfs_io_cbk() passes two additional glfs_stat structs */
1590 static void
1591 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
1592 {}
1593
1594 int
1595 main(void)
1596 {
1597 glfs_io_cbk iocb = &glusterfs_iocb;
1598 iocb(NULL, 0 , NULL, NULL, NULL);
1599 return 0;
1600 }
1601 ''', dependencies: glusterfs)
1602 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001603endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001604
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02001605hv_balloon = false
1606if get_option('hv_balloon').allowed() and have_system
1607 if cc.links('''
1608 #include <string.h>
1609 #include <gmodule.h>
1610 int main(void) {
1611 GTree *tree;
1612
1613 tree = g_tree_new((GCompareFunc)strcmp);
1614 (void)g_tree_node_first(tree);
1615 g_tree_destroy(tree);
1616 return 0;
1617 }
1618 ''', dependencies: glib)
1619 hv_balloon = true
1620 else
1621 if get_option('hv_balloon').enabled()
1622 error('could not enable hv-balloon, update your glib')
1623 else
1624 warning('could not find glib support for hv-balloon, disabling')
1625 endif
1626 endif
1627endif
1628
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001629libssh = not_found
Thomas Huthe6a52b32021-12-09 15:48:01 +01001630if not get_option('libssh').auto() or have_block
1631 libssh = dependency('libssh', version: '>=0.8.7',
1632 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001633 required: get_option('libssh'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001634endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001635
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001636libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001637if not get_option('bzip2').auto() or have_block
1638 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001639 required: get_option('bzip2'))
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001640 if libbzip2.found() and not cc.links('''
1641 #include <bzlib.h>
1642 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
1643 libbzip2 = not_found
1644 if get_option('bzip2').enabled()
1645 error('could not link libbzip2')
1646 else
1647 warning('could not link libbzip2, disabling')
1648 endif
1649 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001650endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001651
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001652liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +01001653if not get_option('lzfse').auto() or have_block
1654 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001655 required: get_option('lzfse'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001656endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001657if liblzfse.found() and not cc.links('''
1658 #include <lzfse.h>
1659 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
1660 liblzfse = not_found
1661 if get_option('lzfse').enabled()
1662 error('could not link liblzfse')
1663 else
1664 warning('could not link liblzfse, disabling')
1665 endif
1666endif
1667
Paolo Bonzini478e9432020-08-17 12:47:55 +02001668oss = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001669if get_option('oss').allowed() and have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02001670 if not cc.has_header('sys/soundcard.h')
1671 # not found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001672 elif host_os == 'netbsd'
Paolo Bonzini063d5112022-07-14 14:56:58 +02001673 oss = cc.find_library('ossaudio', required: get_option('oss'))
Paolo Bonzini87430d52021-10-07 15:06:09 +02001674 else
1675 oss = declare_dependency()
1676 endif
1677
1678 if not oss.found()
1679 if get_option('oss').enabled()
1680 error('OSS not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001681 endif
1682 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001683endif
1684dsound = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001685if not get_option('dsound').auto() or (host_os == 'windows' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001686 if cc.has_header('dsound.h')
1687 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1688 endif
1689
1690 if not dsound.found()
1691 if get_option('dsound').enabled()
1692 error('DirectSound not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001693 endif
1694 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001695endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001696
Paolo Bonzini478e9432020-08-17 12:47:55 +02001697coreaudio = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01001698if not get_option('coreaudio').auto() or (host_os == 'darwin' and have_system)
Paolo Bonzini87430d52021-10-07 15:06:09 +02001699 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
1700 required: get_option('coreaudio'))
Paolo Bonzini478e9432020-08-17 12:47:55 +02001701endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001702
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001703opengl = not_found
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001704if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
1705 epoxy = dependency('epoxy', method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001706 required: get_option('opengl'))
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001707 if cc.has_header('epoxy/egl.h', dependencies: epoxy)
1708 opengl = epoxy
1709 elif get_option('opengl').enabled()
1710 error('epoxy/egl.h not found')
1711 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001712endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001713gbm = not_found
1714if (have_system or have_tools) and (virgl.found() or opengl.found())
Paolo Bonzini063d5112022-07-14 14:56:58 +02001715 gbm = dependency('gbm', method: 'pkg-config', required: false)
Thomas Huth8bc51842021-07-13 13:09:02 +02001716endif
Marc-André Lureauf0caba42022-06-28 17:23:15 +04001717have_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001718
Paolo Bonzini57612512021-06-03 11:15:26 +02001719gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001720gnutls_crypto = not_found
Alyssa Rossabc14fd2021-08-06 14:49:47 +00001721if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001722 # For general TLS support our min gnutls matches
1723 # that implied by our platform support matrix
1724 #
1725 # For the crypto backends, we look for a newer
1726 # gnutls:
1727 #
1728 # Version 3.6.8 is needed to get XTS
1729 # Version 3.6.13 is needed to get PBKDF
1730 # Version 3.6.14 is needed to get HW accelerated XTS
1731 #
1732 # If newer enough gnutls isn't available, we can
1733 # still use a different crypto backend to satisfy
1734 # the platform support requirements
1735 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1736 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001737 required: false)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001738 if gnutls_crypto.found()
1739 gnutls = gnutls_crypto
1740 else
1741 # Our min version if all we need is TLS
1742 gnutls = dependency('gnutls', version: '>=3.5.18',
1743 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001744 required: get_option('gnutls'))
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001745 endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001746endif
1747
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001748# We prefer use of gnutls for crypto, unless the options
1749# explicitly asked for nettle or gcrypt.
1750#
1751# If gnutls isn't available for crypto, then we'll prefer
1752# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +02001753gcrypt = not_found
1754nettle = not_found
Lei He4c5e5122022-05-25 17:01:14 +08001755hogweed = not_found
Hyman Huang52ed9f42023-12-07 23:47:35 +08001756crypto_sm4 = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +01001757xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001758
Paolo Bonzini57612512021-06-03 11:15:26 +02001759if get_option('nettle').enabled() and get_option('gcrypt').enabled()
1760 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +02001761endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001762
1763# Explicit nettle/gcrypt request, so ignore gnutls for crypto
1764if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001765 gnutls_crypto = not_found
1766endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001767
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001768if not gnutls_crypto.found()
1769 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
1770 gcrypt = dependency('libgcrypt', version: '>=1.8',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001771 required: get_option('gcrypt'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001772 # Debian has removed -lgpg-error from libgcrypt-config
1773 # as it "spreads unnecessary dependencies" which in
1774 # turn breaks static builds...
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001775 if gcrypt.found() and get_option('prefer_static')
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001776 gcrypt = declare_dependency(dependencies:
1777 [gcrypt,
1778 cc.find_library('gpg-error', required: true)],
1779 version: gcrypt.version())
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001780 endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08001781 crypto_sm4 = gcrypt
1782 # SM4 ALG is available in libgcrypt >= 1.9
1783 if gcrypt.found() and not cc.links('''
1784 #include <gcrypt.h>
1785 int main(void) {
1786 gcry_cipher_hd_t handler;
1787 gcry_cipher_open(&handler, GCRY_CIPHER_SM4, GCRY_CIPHER_MODE_ECB, 0);
1788 return 0;
1789 }''', dependencies: gcrypt)
1790 crypto_sm4 = not_found
1791 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001792 endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001793 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1794 nettle = dependency('nettle', version: '>=3.4',
1795 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001796 required: get_option('nettle'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001797 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1798 xts = 'private'
1799 endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08001800 crypto_sm4 = nettle
1801 # SM4 ALG is available in nettle >= 3.9
1802 if nettle.found() and not cc.links('''
1803 #include <nettle/sm4.h>
1804 int main(void) {
1805 struct sm4_ctx ctx;
1806 unsigned char key[16] = {0};
1807 sm4_set_encrypt_key(&ctx, key);
1808 return 0;
1809 }''', dependencies: nettle)
1810 crypto_sm4 = not_found
1811 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001812 endif
1813endif
1814
Paolo Bonzinia775c712023-09-08 12:09:22 +02001815capstone = not_found
1816if not get_option('capstone').auto() or have_system or have_user
1817 capstone = dependency('capstone', version: '>=3.0.5',
1818 method: 'pkg-config',
1819 required: get_option('capstone'))
1820
1821 # Some versions of capstone have broken pkg-config file
1822 # that reports a wrong -I path, causing the #include to
1823 # fail later. If the system has such a broken version
1824 # do not use it.
1825 if capstone.found() and not cc.compiles('#include <capstone.h>',
1826 dependencies: [capstone])
1827 capstone = not_found
1828 if get_option('capstone').enabled()
1829 error('capstone requested, but it does not appear to work')
1830 endif
1831 endif
1832endif
1833
Paolo Bonzini063d5112022-07-14 14:56:58 +02001834gmp = dependency('gmp', required: false, method: 'pkg-config')
Lei He4c5e5122022-05-25 17:01:14 +08001835if nettle.found() and gmp.found()
1836 hogweed = dependency('hogweed', version: '>=3.4',
1837 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001838 required: get_option('nettle'))
Lei He4c5e5122022-05-25 17:01:14 +08001839endif
1840
1841
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001842gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +01001843gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001844vte = not_found
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001845have_gtk_clipboard = get_option('gtk_clipboard').enabled()
1846
Marc-André Lureauda554e12023-08-30 13:38:36 +04001847if get_option('gtk') \
1848 .disable_auto_if(not have_system) \
1849 .require(pixman.found(),
1850 error_message: 'cannot enable GTK if pixman is not available') \
1851 .allowed()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001852 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1853 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001854 required: get_option('gtk'))
Paolo Bonzini1b695472021-01-07 14:02:29 +01001855 if gtk.found()
1856 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1857 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001858 required: false)
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001859 gtk = declare_dependency(dependencies: [gtk, gtkx11],
1860 version: gtk.version())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001861
1862 if not get_option('vte').auto() or have_system
1863 vte = dependency('vte-2.91',
1864 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001865 required: get_option('vte'))
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001866 endif
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001867 elif have_gtk_clipboard
1868 error('GTK clipboard requested, but GTK not found')
Paolo Bonzini1b695472021-01-07 14:02:29 +01001869 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001870endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001871
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001872x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +02001873if gtkx11.found()
Paolo Bonzini063d5112022-07-14 14:56:58 +02001874 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001875endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001876png = not_found
Kshitij Suri95f85102022-04-08 07:13:34 +00001877if get_option('png').allowed() and have_system
Thomas Huth1ec8c2c2022-06-23 19:49:41 +02001878 png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001879 method: 'pkg-config')
Kshitij Suri95f85102022-04-08 07:13:34 +00001880endif
1881vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001882jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001883sasl = not_found
Marc-André Lureau89fd3ea2023-08-30 13:38:34 +04001884if get_option('vnc') \
1885 .disable_auto_if(not have_system) \
1886 .require(pixman.found(),
1887 error_message: 'cannot enable VNC if pixman is not available') \
1888 .allowed()
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001889 vnc = declare_dependency() # dummy dependency
Paolo Bonzini8e242b32020-11-23 13:34:02 -05001890 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001891 method: 'pkg-config')
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001892 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001893 required: get_option('vnc_sasl'))
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001894 if sasl.found()
1895 sasl = declare_dependency(dependencies: sasl,
1896 compile_args: '-DSTRUCT_IOVEC_DEFINED')
1897 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001898endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01001899
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001900pam = not_found
1901if not get_option('auth_pam').auto() or have_system
1902 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001903 required: get_option('auth_pam'))
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001904endif
1905if pam.found() and not cc.links('''
1906 #include <stddef.h>
1907 #include <security/pam_appl.h>
1908 int main(void) {
1909 const char *service_name = "qemu";
1910 const char *user = "frank";
1911 const struct pam_conv pam_conv = { 0 };
1912 pam_handle_t *pamh = NULL;
1913 pam_start(service_name, user, &pam_conv, &pamh);
1914 return 0;
1915 }''', dependencies: pam)
1916 pam = not_found
1917 if get_option('auth_pam').enabled()
1918 error('could not link libpam')
1919 else
1920 warning('could not link libpam, disabling')
1921 endif
1922endif
1923
Marc-André Lureau708eab42019-09-03 16:59:33 +04001924snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +01001925if not get_option('snappy').auto() or have_system
1926 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001927 required: get_option('snappy'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04001928endif
Thomas Huth785abf02023-07-06 08:47:36 +02001929if snappy.found() and not cc.links('''
Paolo Bonzini241611e2020-11-17 13:32:34 +01001930 #include <snappy-c.h>
1931 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
1932 snappy = not_found
1933 if get_option('snappy').enabled()
1934 error('could not link libsnappy')
1935 else
1936 warning('could not link libsnappy, disabling')
1937 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +04001938endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001939
Marc-André Lureau708eab42019-09-03 16:59:33 +04001940lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001941if not get_option('lzo').auto() or have_system
1942 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001943 required: get_option('lzo'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04001944endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001945if lzo.found() and not cc.links('''
1946 #include <lzo/lzo1x.h>
1947 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
1948 lzo = not_found
1949 if get_option('lzo').enabled()
1950 error('could not link liblzo2')
1951 else
1952 warning('could not link liblzo2, disabling')
1953 endif
1954endif
1955
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001956numa = not_found
1957if not get_option('numa').auto() or have_system or have_tools
1958 numa = cc.find_library('numa', has_headers: ['numa.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001959 required: get_option('numa'))
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001960endif
1961if numa.found() and not cc.links('''
1962 #include <numa.h>
1963 int main(void) { return numa_available(); }
1964 ''', dependencies: numa)
1965 numa = not_found
1966 if get_option('numa').enabled()
1967 error('could not link numa')
1968 else
1969 warning('could not link numa, disabling')
1970 endif
1971endif
1972
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01001973fdt = not_found
1974fdt_opt = get_option('fdt')
1975if fdt_opt == 'enabled' and get_option('wrap_mode') == 'nodownload'
1976 fdt_opt = 'system'
1977endif
1978if fdt_opt in ['enabled', 'system'] or (fdt_opt == 'auto' and have_system)
1979 fdt = cc.find_library('fdt', required: fdt_opt == 'system')
1980 if fdt.found() and cc.links('''
1981 #include <libfdt.h>
1982 #include <libfdt_env.h>
1983 int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
1984 dependencies: fdt)
1985 fdt_opt = 'system'
1986 elif fdt_opt != 'system'
1987 fdt_opt = get_option('wrap_mode') == 'nodownload' ? 'disabled' : 'internal'
1988 fdt = not_found
1989 else
1990 error('system libfdt is too old (1.5.1 or newer required)')
1991 endif
1992endif
1993if fdt_opt == 'internal'
1994 assert(not fdt.found())
1995 libfdt_proj = subproject('dtc', required: true,
1996 default_options: ['tools=false', 'yaml=disabled',
1997 'python=disabled', 'default_library=static'])
1998 fdt = libfdt_proj.get_variable('libfdt_dep')
1999endif
2000
Marc-André Lureau55166232019-07-24 19:16:22 +04002001rdma = not_found
Paolo Bonzini3730a732022-04-20 17:33:41 +02002002if not get_option('rdma').auto() or have_system
Paolo Bonzini3730a732022-04-20 17:33:41 +02002003 rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02002004 required: get_option('rdma')),
zhenwei pi829858f2024-06-11 18:54:26 +08002005 cc.find_library('ibverbs', required: get_option('rdma'))]
Paolo Bonzini3730a732022-04-20 17:33:41 +02002006 rdma = declare_dependency(dependencies: rdma_libs)
2007 foreach lib: rdma_libs
2008 if not lib.found()
2009 rdma = not_found
2010 endif
2011 endforeach
Marc-André Lureau55166232019-07-24 19:16:22 +04002012endif
Paolo Bonzini3730a732022-04-20 17:33:41 +02002013
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002014cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02002015if not get_option('smartcard').auto() or have_system
2016 cacard = dependency('libcacard', required: get_option('smartcard'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002017 version: '>=2.5.1', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002018endif
César Belley0a40bcb2020-08-26 13:42:04 +02002019u2f = not_found
Paolo Bonzinie7c22ff2023-09-08 12:10:27 +02002020if not get_option('u2f').auto() or have_system
César Belley0a40bcb2020-08-26 13:42:04 +02002021 u2f = dependency('u2f-emu', required: get_option('u2f'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002022 method: 'pkg-config')
César Belley0a40bcb2020-08-26 13:42:04 +02002023endif
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002024canokey = not_found
Paolo Bonzinie7c22ff2023-09-08 12:10:27 +02002025if not get_option('canokey').auto() or have_system
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002026 canokey = dependency('canokey-qemu', required: get_option('canokey'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002027 method: 'pkg-config')
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08002028endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002029usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02002030if not get_option('usb_redir').auto() or have_system
2031 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002032 version: '>=0.6', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002033endif
2034libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02002035if not get_option('libusb').auto() or have_system
2036 libusb = dependency('libusb-1.0', required: get_option('libusb'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002037 version: '>=1.0.13', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02002038endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02002039
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002040libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02002041if not get_option('libpmem').auto() or have_system
2042 libpmem = dependency('libpmem', required: get_option('libpmem'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002043 method: 'pkg-config')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002044endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06002045libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02002046if not get_option('libdaxctl').auto() or have_system
2047 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002048 version: '>=57', method: 'pkg-config')
Bruce Rogersc7c91a72020-08-24 09:52:12 -06002049endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04002050tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02002051if gnutls.found()
2052 tasn1 = dependency('libtasn1',
Philippe Mathieu-Daudédc37d1c2024-05-02 11:56:42 +02002053 required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02002054 method: 'pkg-config')
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04002055endif
Max Fritz0db0fbb2023-05-22 02:12:02 +02002056keyutils = not_found
Thomas Huthc64023b2023-08-24 11:42:08 +02002057if not get_option('libkeyutils').auto() or have_block
2058 keyutils = dependency('libkeyutils', required: get_option('libkeyutils'),
2059 method: 'pkg-config')
Max Fritz0db0fbb2023-05-22 02:12:02 +02002060endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002061
Marc-André Lureau3909def2020-08-28 15:07:33 +04002062has_gettid = cc.has_function('gettid')
2063
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002064# libselinux
2065selinux = dependency('libselinux',
2066 required: get_option('selinux'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002067 method: 'pkg-config')
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002068
Paolo Bonziniaa087962020-09-01 11:15:30 -04002069# Malloc tests
2070
2071malloc = []
2072if get_option('malloc') == 'system'
2073 has_malloc_trim = \
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002074 get_option('malloc_trim').allowed() and \
Michal Privoznik09a49af2023-05-30 12:31:23 +02002075 cc.has_function('malloc_trim', prefix: '#include <malloc.h>')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002076else
2077 has_malloc_trim = false
2078 malloc = cc.find_library(get_option('malloc'), required: true)
2079endif
2080if not has_malloc_trim and get_option('malloc_trim').enabled()
2081 if get_option('malloc') == 'system'
2082 error('malloc_trim not available on this platform.')
2083 else
2084 error('malloc_trim not available with non-libc memory allocator')
2085 endif
2086endif
2087
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002088gnu_source_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01002089 #ifndef _GNU_SOURCE
2090 #define _GNU_SOURCE
2091 #endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002092'''
Max Reitz84e319a2020-11-02 17:18:55 +01002093
Michal Privoznik09a49af2023-05-30 12:31:23 +02002094# Check whether the glibc provides STATX_BASIC_STATS
2095
2096has_statx = cc.has_header_symbol('sys/stat.h', 'STATX_BASIC_STATS', prefix: gnu_source_prefix)
Max Reitz84e319a2020-11-02 17:18:55 +01002097
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002098# Check whether statx() provides mount ID information
2099
Michal Privoznik09a49af2023-05-30 12:31:23 +02002100has_statx_mnt_id = cc.has_header_symbol('sys/stat.h', 'STATX_MNT_ID', prefix: gnu_source_prefix)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002101
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002102have_vhost_user_blk_server = get_option('vhost_user_blk_server') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002103 .require(host_os == 'linux',
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002104 error_message: 'vhost_user_blk_server requires linux') \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02002105 .require(have_vhost_user,
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002106 error_message: 'vhost_user_blk_server requires vhost-user support') \
Alex Bennée26ed5012022-05-24 16:40:42 +01002107 .disable_auto_if(not have_tools and not have_system) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002108 .allowed()
Daniele Buono9e62ba42020-12-04 18:06:14 -05002109
Max Reitzdf4ea702020-10-27 20:05:46 +01002110if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
2111 error('Cannot enable fuse-lseek while fuse is disabled')
2112endif
2113
Max Reitza484a712020-10-27 20:05:41 +01002114fuse = dependency('fuse3', required: get_option('fuse'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02002115 version: '>=3.1', method: 'pkg-config')
Max Reitza484a712020-10-27 20:05:41 +01002116
Max Reitzdf4ea702020-10-27 20:05:46 +01002117fuse_lseek = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002118if get_option('fuse_lseek').allowed()
Max Reitzdf4ea702020-10-27 20:05:46 +01002119 if fuse.version().version_compare('>=3.8')
2120 # Dummy dependency
2121 fuse_lseek = declare_dependency()
2122 elif get_option('fuse_lseek').enabled()
2123 if fuse.found()
2124 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
2125 else
2126 error('fuse-lseek requires libfuse, which was not found')
2127 endif
2128 endif
2129endif
2130
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002131have_libvduse = (host_os == 'linux')
Xie Yongjia6caeee2022-05-23 16:46:08 +08002132if get_option('libvduse').enabled()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002133 if host_os != 'linux'
Xie Yongjia6caeee2022-05-23 16:46:08 +08002134 error('libvduse requires linux')
2135 endif
2136elif get_option('libvduse').disabled()
2137 have_libvduse = false
2138endif
2139
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002140have_vduse_blk_export = (have_libvduse and host_os == 'linux')
Xie Yongji2a2359b2022-05-23 16:46:09 +08002141if get_option('vduse_blk_export').enabled()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002142 if host_os != 'linux'
Xie Yongji2a2359b2022-05-23 16:46:09 +08002143 error('vduse_blk_export requires linux')
2144 elif not have_libvduse
2145 error('vduse_blk_export requires libvduse support')
2146 endif
2147elif get_option('vduse_blk_export').disabled()
2148 have_vduse_blk_export = false
2149endif
2150
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002151# libbpf
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002152bpf_version = '1.1.0'
2153libbpf = dependency('libbpf', version: '>=' + bpf_version, required: get_option('bpf'), method: 'pkg-config')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002154if libbpf.found() and not cc.links('''
2155 #include <bpf/libbpf.h>
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002156 #include <linux/bpf.h>
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002157 int main(void)
2158 {
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002159 // check flag availability
2160 int flag = BPF_F_MMAPABLE;
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002161 bpf_object__destroy_skeleton(NULL);
2162 return 0;
2163 }''', dependencies: libbpf)
2164 libbpf = not_found
2165 if get_option('bpf').enabled()
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002166 error('libbpf skeleton/mmaping test failed')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002167 else
Andrew Melnychenko0cc14182024-02-05 18:54:35 +02002168 warning('libbpf skeleton/mmaping test failed, disabling')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002169 endif
2170endif
2171
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002172# libxdp
2173libxdp = not_found
2174if not get_option('af_xdp').auto() or have_system
Daniel P. Berrangé1f372802024-10-23 09:50:56 +01002175 if libbpf.found()
2176 libxdp = dependency('libxdp', required: get_option('af_xdp'),
2177 version: '>=1.4.0', method: 'pkg-config')
2178 else
2179 if get_option('af_xdp').enabled()
2180 error('libxdp requested, but libbpf is not available')
2181 endif
2182 endif
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002183endif
2184
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002185# libdw
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002186libdw = not_found
Ilya Leoshkevich550c6d92023-02-10 01:52:08 +01002187if not get_option('libdw').auto() or \
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02002188 (not get_option('prefer_static') and (have_system or have_user))
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002189 libdw = dependency('libdw',
2190 method: 'pkg-config',
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002191 required: get_option('libdw'))
2192endif
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002193
Paolo Bonzini87430d52021-10-07 15:06:09 +02002194#################
2195# config-host.h #
2196#################
2197
Paolo Bonzini95933f12023-09-08 12:10:08 +02002198config_host_data = configuration_data()
2199
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03002200config_host_data.set('CONFIG_HAVE_RUST', have_rust)
Paolo Bonzini87430d52021-10-07 15:06:09 +02002201audio_drivers_selected = []
2202if have_system
2203 audio_drivers_available = {
2204 'alsa': alsa.found(),
2205 'coreaudio': coreaudio.found(),
2206 'dsound': dsound.found(),
2207 'jack': jack.found(),
2208 'oss': oss.found(),
2209 'pa': pulse.found(),
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02002210 'pipewire': pipewire.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002211 'sdl': sdl.found(),
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002212 'sndio': sndio.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002213 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02002214 foreach k, v: audio_drivers_available
2215 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
2216 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02002217
2218 # Default to native drivers first, OSS second, SDL third
2219 audio_drivers_priority = \
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002220 [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002221 (host_os == 'linux' ? [] : [ 'sdl' ])
Paolo Bonzini87430d52021-10-07 15:06:09 +02002222 audio_drivers_default = []
2223 foreach k: audio_drivers_priority
2224 if audio_drivers_available[k]
2225 audio_drivers_default += k
2226 endif
2227 endforeach
2228
2229 foreach k: get_option('audio_drv_list')
2230 if k == 'default'
2231 audio_drivers_selected += audio_drivers_default
2232 elif not audio_drivers_available[k]
2233 error('Audio driver "@0@" not available.'.format(k))
2234 else
2235 audio_drivers_selected += k
2236 endif
2237 endforeach
2238endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02002239config_host_data.set('CONFIG_AUDIO_DRIVERS',
2240 '"' + '", "'.join(audio_drivers_selected) + '", ')
2241
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002242have_host_block_device = (host_os != 'darwin' or
Joelle van Dyne14176c82021-03-15 11:03:38 -07002243 cc.has_header('IOKit/storage/IOMedia.h'))
2244
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002245dbus_display = get_option('dbus_display') \
2246 .require(gio.version().version_compare('>=2.64'),
2247 error_message: '-display dbus requires glib>=2.64') \
Paolo Bonzini75440602022-04-20 17:33:44 +02002248 .require(gdbus_codegen.found(),
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02002249 error_message: gdbus_codegen_error.format('-display dbus')) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002250 .allowed()
Marc-André Lureau142ca622021-07-15 11:53:53 +04002251
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002252have_virtfs = get_option('virtfs') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002253 .require(host_os == 'linux' or host_os == 'darwin',
Keno Fischer0fb1e192022-02-27 17:35:22 -05002254 error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002255 .require(host_os == 'linux' or cc.has_function('pthread_fchdir_np'),
Keno Fischer0fb1e192022-02-27 17:35:22 -05002256 error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002257 .require(host_os == 'darwin' or libattr.found(),
Peter Foley1a67e072023-05-03 09:07:56 -04002258 error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002259 .disable_auto_if(not have_tools and not have_system) \
2260 .allowed()
Paolo Bonzini69202b42020-11-17 14:46:21 +01002261
Daniel P. Berrangé4bb3da42024-07-12 14:24:44 +01002262qga_fsfreeze = false
2263qga_fstrim = false
2264if host_os == 'linux'
2265 if cc.has_header_symbol('linux/fs.h', 'FIFREEZE')
2266 qga_fsfreeze = true
2267 endif
2268 if cc.has_header_symbol('linux/fs.h', 'FITRIM')
2269 qga_fstrim = true
2270 endif
2271elif host_os == 'freebsd' and cc.has_header_symbol('ufs/ffs/fs.h', 'UFSSUSPEND')
2272 qga_fsfreeze = true
2273endif
2274
Paolo Bonzini622d64f2022-04-20 17:33:53 +02002275if get_option('block_drv_ro_whitelist') == ''
2276 config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
2277else
2278 config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
2279 '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
2280endif
2281if get_option('block_drv_rw_whitelist') == ''
2282 config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
2283else
2284 config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
2285 '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
2286endif
2287
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002288foreach k : get_option('trace_backends')
2289 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
2290endforeach
2291config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02002292config_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
Paolo Bonzini40c909f2022-04-20 17:33:49 +02002293if iasl.found()
2294 config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
Paolo Bonzini5dc46182021-10-13 13:19:00 +02002295endif
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002296config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
2297config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
2298config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
2299config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
2300config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09002301
2302qemu_firmwarepath = ''
2303foreach k : get_option('qemu_firmwarepath')
2304 qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
2305endforeach
2306config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
2307
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002308config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
2309config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
2310config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
2311config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
2312config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
2313config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
2314
Paolo Bonzini60027112022-10-20 14:53:10 +02002315if enable_modules
Paolo Bonzinib0b43232022-04-20 17:33:54 +02002316 config_host_data.set('CONFIG_STAMP', run_command(
2317 meson.current_source_dir() / 'scripts/qemu-stamp.py',
2318 meson.project_version(), get_option('pkgversion'), '--',
2319 meson.current_source_dir() / 'configure',
2320 capture: true, check: true).stdout().strip())
2321endif
2322
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002323have_slirp_smbd = get_option('slirp_smbd') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002324 .require(host_os != 'windows', error_message: 'Host smbd not supported on this platform.') \
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002325 .allowed()
2326if have_slirp_smbd
2327 smbd_path = get_option('smbd')
2328 if smbd_path == ''
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002329 smbd_path = (host_os == 'sunos' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002330 endif
2331 config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
2332endif
2333
Paolo Bonzini823eb012021-11-08 14:18:17 +01002334config_host_data.set('HOST_' + host_arch.to_upper(), 1)
2335
Paolo Bonzini95933f12023-09-08 12:10:08 +02002336kvm_targets_c = '""'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002337if get_option('kvm').allowed() and host_os == 'linux'
Paolo Bonzini95933f12023-09-08 12:10:08 +02002338 kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
2339endif
2340config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
2341
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02002342if get_option('module_upgrades') and not enable_modules
2343 error('Cannot enable module-upgrades as modules are not enabled')
2344endif
2345config_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
2346
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002347config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002348config_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002349config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002350config_host_data.set('CONFIG_BSD', host_os in bsd_oses)
Daniel P. Berrangé4be55a42024-07-12 14:24:54 +01002351config_host_data.set('CONFIG_FREEBSD', host_os == 'freebsd')
Paolo Bonzinia775c712023-09-08 12:09:22 +02002352config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04002353config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002354config_host_data.set('CONFIG_DARWIN', host_os == 'darwin')
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01002355config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini537b7242021-10-07 15:08:12 +02002356config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02002357config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002358config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002359config_host_data.set('CONFIG_LINUX', host_os == 'linux')
2360config_host_data.set('CONFIG_POSIX', host_os != 'windows')
2361config_host_data.set('CONFIG_WIN32', host_os == 'windows')
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002362config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002363config_host_data.set('CONFIG_MPATH', mpathpersist.found())
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04002364config_host_data.set('CONFIG_BLKIO', blkio.found())
Stefano Garzarella98b126f2023-05-30 09:19:41 +02002365if blkio.found()
2366 config_host_data.set('CONFIG_BLKIO_VHOST_VDPA_FD',
2367 blkio.version().version_compare('>=1.3.0'))
Stefano Garzarella547c4e52024-08-08 10:05:45 +02002368 config_host_data.set('CONFIG_BLKIO_WRITE_ZEROS_FUA',
2369 blkio.version().version_compare('>=1.4.0'))
Stefano Garzarella98b126f2023-05-30 09:19:41 +02002370endif
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002371config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08002372config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02002373config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini75440602022-04-20 17:33:44 +02002374config_host_data.set('CONFIG_GIO', gio.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002375config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
2376if glusterfs.found()
2377 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
2378 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
2379 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
2380 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
2381 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
2382 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
2383endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002384config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02002385config_host_data.set('CONFIG_VTE', vte.found())
Claudio Fontana29e0bff2022-11-21 14:55:38 +01002386config_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard)
Taylor Simpson63efb6a2023-04-27 15:59:52 -07002387config_host_data.set('CONFIG_HEXAGON_IDEF_PARSER', get_option('hexagon_idef_parser'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002388config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002389config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002390config_host_data.set('CONFIG_EBPF', libbpf.found())
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002391config_host_data.set('CONFIG_AF_XDP', libxdp.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002392config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002393config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01002394config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Thomas Huthe6a52b32021-12-09 15:48:01 +01002395config_host_data.set('CONFIG_LIBSSH', libssh.found())
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02002396config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002397config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
2398config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzini60027112022-10-20 14:53:10 +02002399config_host_data.set('CONFIG_MODULES', enable_modules)
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002400config_host_data.set('CONFIG_NUMA', numa.found())
Michal Privoznik6bb613f2022-12-15 10:55:03 +01002401if numa.found()
2402 config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY',
2403 cc.has_function('numa_has_preferred_many',
2404 dependencies: numa))
2405endif
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002406config_host_data.set('CONFIG_OPENGL', opengl.found())
Paolo Bonzini2c13c572023-08-30 12:20:53 +02002407config_host_data.set('CONFIG_PLUGIN', get_option('plugins'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002408config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini3730a732022-04-20 17:33:41 +02002409config_host_data.set('CONFIG_RDMA', rdma.found())
Paolo Bonzini655e2a72023-10-05 14:19:34 +02002410config_host_data.set('CONFIG_RELOCATABLE', get_option('relocatable'))
Paolo Bonzini721fa5e2022-10-12 11:59:51 +02002411config_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002412config_host_data.set('CONFIG_SDL', sdl.found())
2413config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01002414config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Michal Privoznik73422d92022-10-26 09:30:24 +02002415if seccomp.found()
2416 config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
2417endif
Marc-André Lureaucca15752023-08-30 13:38:25 +04002418config_host_data.set('CONFIG_PIXMAN', pixman.found())
Paolo Bonzinia775c712023-09-08 12:09:22 +02002419config_host_data.set('CONFIG_SLIRP', slirp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01002420config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002421config_host_data.set('CONFIG_SOLARIS', host_os == 'sunos')
Paolo Bonzini875be2872022-02-15 11:37:00 +01002422if get_option('tcg').allowed()
2423 config_host_data.set('CONFIG_TCG', 1)
2424 config_host_data.set('CONFIG_TCG_INTERPRETER', tcg_arch == 'tci')
2425endif
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002426config_host_data.set('CONFIG_TPM', have_tpm)
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002427config_host_data.set('CONFIG_TSAN', get_option('tsan'))
Paolo Bonzini90540f32021-06-03 11:15:26 +02002428config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Paolo Bonzinie1723992021-10-07 15:08:21 +02002429config_host_data.set('CONFIG_VDE', vde.found())
Stefan Hajnoczic0c4f142023-10-03 21:45:32 -04002430config_host_data.set('CONFIG_VHOST', have_vhost)
Paolo Bonzini2df89d52022-04-20 17:34:07 +02002431config_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
2432config_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
2433config_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
2434config_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
2435config_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
2436config_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
2437config_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03002438config_host_data.set('CONFIG_VMNET', vmnet.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002439config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Xie Yongji2a2359b2022-05-23 16:46:09 +08002440config_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
Kshitij Suri95f85102022-04-08 07:13:34 +00002441config_host_data.set('CONFIG_PNG', png.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002442config_host_data.set('CONFIG_VNC', vnc.found())
2443config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002444config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini95933f12023-09-08 12:10:08 +02002445if virgl.found()
2446 config_host_data.set('HAVE_VIRGL_D3D_INFO_EXT',
2447 cc.has_member('struct virgl_renderer_resource_info_ext', 'd3d_tex2d',
2448 prefix: '#include <virglrenderer.h>',
2449 dependencies: virgl))
2450endif
Paolo Bonzini69202b42020-11-17 14:46:21 +01002451config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002452config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002453config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04002454config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04002455config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02002456config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01002457config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Daniel P. Berrangéd47b83b2022-04-26 17:00:43 +01002458config_host_data.set('CONFIG_TASN1', tasn1.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002459config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
2460config_host_data.set('CONFIG_NETTLE', nettle.found())
Hyman Huang52ed9f42023-12-07 23:47:35 +08002461config_host_data.set('CONFIG_CRYPTO_SM4', crypto_sm4.found())
Lei He4c5e5122022-05-25 17:01:14 +08002462config_host_data.set('CONFIG_HOGWEED', hogweed.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002463config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002464config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01002465config_host_data.set('CONFIG_STATX', has_statx)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002466config_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id)
Paolo Bonzinib1def332020-11-17 13:37:39 +01002467config_host_data.set('CONFIG_ZSTD', zstd.found())
Yuan Liub844a2c2024-06-10 18:21:06 +08002468config_host_data.set('CONFIG_QPL', qpl.found())
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01002469config_host_data.set('CONFIG_UADK', uadk.found())
Bryan Zhange28ed312024-08-30 16:27:19 -07002470config_host_data.set('CONFIG_QATZIP', qatzip.found())
Max Reitza484a712020-10-27 20:05:41 +01002471config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01002472config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002473config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
Marc-André Lureauddece462021-10-06 14:18:09 +04002474if spice_protocol.found()
2475config_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
2476config_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
2477config_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
2478endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002479config_host_data.set('CONFIG_SPICE', spice.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01002480config_host_data.set('CONFIG_X11', x11.found())
Marc-André Lureau142ca622021-07-15 11:53:53 +04002481config_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
Daniele Buono9e62ba42020-12-04 18:06:14 -05002482config_host_data.set('CONFIG_CFI', get_option('cfi'))
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002483config_host_data.set('CONFIG_SELINUX', selinux.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002484config_host_data.set('CONFIG_XEN_BACKEND', xen.found())
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002485config_host_data.set('CONFIG_LIBDW', libdw.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002486if xen.found()
2487 # protect from xen.version() having less than three components
2488 xen_version = xen.version().split('.') + ['0', '0']
2489 xen_ctrl_version = xen_version[0] + \
2490 ('0' + xen_version[1]).substring(-2) + \
2491 ('0' + xen_version[2]).substring(-2)
2492 config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
2493endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002494config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
2495config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
2496config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
2497config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
2498
Paolo Bonzinia6305082021-10-07 15:08:15 +02002499config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002500config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
2501
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002502have_coroutine_pool = get_option('coroutine_pool')
2503if get_option('debug_stack_usage') and have_coroutine_pool
2504 message('Disabling coroutine pool to measure stack usage')
2505 have_coroutine_pool = false
2506endif
Paolo Bonzini230f6e02023-10-05 14:31:27 +02002507config_host_data.set('CONFIG_COROUTINE_POOL', have_coroutine_pool)
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04002508config_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002509config_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002510config_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
Paolo Bonzini1d558c92023-08-28 11:48:30 +02002511config_host_data.set('CONFIG_DEBUG_TCG', get_option('debug_tcg'))
Ilya Leoshkevich1f2355f2024-03-12 01:23:30 +01002512config_host_data.set('CONFIG_DEBUG_REMAP', get_option('debug_remap'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002513config_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
Juan Quintelaabad1852022-09-02 18:51:25 +02002514config_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
Daniel P. Berrangé4bb3da42024-07-12 14:24:44 +01002515config_host_data.set('CONFIG_FSFREEZE', qga_fsfreeze)
2516config_host_data.set('CONFIG_FSTRIM', qga_fstrim)
Paolo Bonzini406523f2021-10-13 11:43:54 +02002517
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002518# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002519config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002520config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
2521config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
Thomas Huth48f670e2020-11-18 18:10:52 +01002522config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01002523config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Michael Vogt97299302024-10-01 17:14:54 +02002524config_host_data.set('HAVE_OPENAT2_H', cc.has_header('linux/openat2.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01002525config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002526config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01002527config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01002528config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002529if host_os == 'windows'
Bin Mengd4093732022-08-02 15:51:58 +08002530 config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
2531endif
Thomas Huthded5d782020-11-14 11:10:11 +01002532
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002533# has_function
Claudio Imbrendac891c242022-08-12 15:34:53 +02002534config_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002535config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002536config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
2537config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
2538config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
2539config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Paolo Bonzini67504852023-06-21 00:47:31 +02002540config_host_data.set('CONFIG_GETCPU', cc.has_function('getcpu', prefix: gnu_source_prefix))
2541config_host_data.set('CONFIG_SCHED_GETCPU', cc.has_function('sched_getcpu', prefix: '#include <sched.h>'))
Peter Maydell86983432022-02-26 18:07:19 +00002542# Note that we need to specify prefix: here to avoid incorrectly
2543# thinking that Windows has posix_memalign()
2544config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
Peter Maydell5c8c7142022-02-26 18:07:20 +00002545config_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
Peter Maydell88454f82022-02-26 18:07:21 +00002546config_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
2547config_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002548config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002549config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Keno Fischer029ed1b2022-02-27 17:35:20 -05002550config_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002551config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
2552config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
2553config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
2554config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
2555config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002556config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Andrew Deason59e35c72022-04-26 14:55:22 -05002557config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02002558config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03002559config_host_data.set('HAVE_GLIB_WITH_ALIGNED_ALLOC', glib_has_aligned_alloc)
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002560config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002561config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002562config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Stefano Garzarella66dc5f92022-05-17 09:10:12 +02002563if rbd.found()
2564 config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
2565 cc.has_function('rbd_namespace_exists',
2566 dependencies: rbd,
2567 prefix: '#include <rbd/librbd.h>'))
2568endif
Li Zhijian911965a2021-09-10 15:02:55 +08002569if rdma.found()
2570 config_host_data.set('HAVE_IBV_ADVISE_MR',
2571 cc.has_function('ibv_advise_mr',
Paolo Bonzini3730a732022-04-20 17:33:41 +02002572 dependencies: rdma,
Li Zhijian911965a2021-09-10 15:02:55 +08002573 prefix: '#include <infiniband/verbs.h>'))
2574endif
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002575
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002576have_asan_fiber = false
Richard Hendersoncb771ac2024-08-13 19:52:15 +10002577if get_option('asan') and \
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002578 not cc.has_function('__sanitizer_start_switch_fiber',
2579 args: '-fsanitize=address',
2580 prefix: '#include <sanitizer/asan_interface.h>')
2581 warning('Missing ASAN due to missing fiber annotation interface')
2582 warning('Without code annotation, the report may be inferior.')
2583else
2584 have_asan_fiber = true
2585endif
2586config_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber)
2587
Ilya Leoshkevicha1a98002024-02-06 01:22:03 +01002588have_inotify_init = cc.has_header_symbol('sys/inotify.h', 'inotify_init')
2589have_inotify_init1 = cc.has_header_symbol('sys/inotify.h', 'inotify_init1')
2590inotify = not_found
2591if (have_inotify_init or have_inotify_init1) and host_os == 'freebsd'
2592 # libinotify-kqueue
2593 inotify = cc.find_library('inotify')
2594 if have_inotify_init
2595 have_inotify_init = inotify.found()
2596 endif
2597 if have_inotify_init1
2598 have_inotify_init1 = inotify.found()
2599 endif
2600endif
2601config_host_data.set('CONFIG_INOTIFY', have_inotify_init)
2602config_host_data.set('CONFIG_INOTIFY1', have_inotify_init1)
2603
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002604# has_header_symbol
Sam Li6d43eaa2023-05-08 12:55:28 +08002605config_host_data.set('CONFIG_BLKZONED',
2606 cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002607config_host_data.set('CONFIG_EPOLL_CREATE1',
2608 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
2609config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
2610 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
2611 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
2612config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
2613 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
2614config_host_data.set('CONFIG_FIEMAP',
2615 cc.has_header('linux/fiemap.h') and
2616 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002617config_host_data.set('CONFIG_GETRANDOM',
2618 cc.has_function('getrandom') and
2619 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002620config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
2621 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002622config_host_data.set('CONFIG_RTNETLINK',
2623 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
2624config_host_data.set('CONFIG_SYSMACROS',
2625 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002626config_host_data.set('HAVE_OPTRESET',
2627 cc.has_header_symbol('getopt.h', 'optreset'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04002628config_host_data.set('HAVE_IPPROTO_MPTCP',
2629 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002630
2631# has_member
2632config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
2633 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
2634 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002635config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
2636 cc.has_member('struct stat', 'st_atim',
2637 prefix: '#include <sys/stat.h>'))
Sam Li6d43eaa2023-05-08 12:55:28 +08002638config_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY',
2639 cc.has_member('struct blk_zone', 'capacity',
2640 prefix: '#include <linux/blkzoned.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002641
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002642# has_type
2643config_host_data.set('CONFIG_IOVEC',
2644 cc.has_type('struct iovec',
2645 prefix: '#include <sys/uio.h>'))
2646config_host_data.set('HAVE_UTMPX',
2647 cc.has_type('struct utmpx',
2648 prefix: '#include <utmpx.h>'))
2649
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002650config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002651 #include <sys/eventfd.h>
2652 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002653config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002654 #include <unistd.h>
2655 int main(void) {
2656 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2657 return fdatasync(0);
2658 #else
2659 #error Not supported
2660 #endif
2661 }'''))
Andrew Deason8900c202022-03-15 22:52:25 -05002662
2663has_madvise = cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002664 #include <sys/types.h>
2665 #include <sys/mman.h>
2666 #include <stddef.h>
Andrew Deason8900c202022-03-15 22:52:25 -05002667 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
2668missing_madvise_proto = false
2669if has_madvise
2670 # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
2671 # but forget to prototype it. In this case, has_madvise will be true (the
2672 # test program links despite a compile warning). To detect the
2673 # missing-prototype case, we try again with a definitely-bogus prototype.
2674 # This will only compile if the system headers don't provide the prototype;
2675 # otherwise the conflicting prototypes will cause a compiler error.
2676 missing_madvise_proto = cc.links(gnu_source_prefix + '''
2677 #include <sys/types.h>
2678 #include <sys/mman.h>
2679 #include <stddef.h>
2680 extern int madvise(int);
2681 int main(void) { return madvise(0); }''')
2682endif
2683config_host_data.set('CONFIG_MADVISE', has_madvise)
2684config_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
2685
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002686config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002687 #include <sys/mman.h>
2688 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002689config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002690 #include <fcntl.h>
2691 #if !defined(AT_EMPTY_PATH)
2692 # error missing definition
2693 #else
2694 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2695 #endif'''))
Michal Privoznik12d7d0c2024-06-05 12:44:54 +02002696
2697# On Darwin posix_madvise() has the same return semantics as plain madvise(),
2698# i.e. errno is set and -1 is returned. That's not really how POSIX defines the
2699# function. On the flip side, it has madvise() which is preferred anyways.
2700if host_os != 'darwin'
2701 config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
2702 #include <sys/mman.h>
2703 #include <stddef.h>
2704 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
2705endif
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002706
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002707config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002708 #include <pthread.h>
2709
2710 static void *f(void *p) { return NULL; }
2711 int main(void)
2712 {
2713 pthread_t thread;
2714 pthread_create(&thread, 0, f, 0);
2715 pthread_setname_np(thread, "QEMU");
2716 return 0;
2717 }''', dependencies: threads))
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002718config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002719 #include <pthread.h>
2720
2721 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
2722 int main(void)
2723 {
2724 pthread_t thread;
2725 pthread_create(&thread, 0, f, 0);
2726 return 0;
2727 }''', dependencies: threads))
Brad Smith3ada67a2022-12-18 03:22:04 -05002728config_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + '''
2729 #include <pthread.h>
2730 #include <pthread_np.h>
2731
2732 static void *f(void *p) { return NULL; }
2733 int main(void)
2734 {
2735 pthread_t thread;
2736 pthread_create(&thread, 0, f, 0);
2737 pthread_set_name_np(thread, "QEMU");
2738 return 0;
2739 }''', dependencies: threads))
Longpeng(Mike)657ac982022-02-22 17:05:05 +08002740config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
2741 #include <pthread.h>
2742 #include <time.h>
2743
2744 int main(void)
2745 {
2746 pthread_condattr_t attr
2747 pthread_condattr_init(&attr);
2748 pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2749 return 0;
2750 }''', dependencies: threads))
David Hildenbrand7730f322022-10-14 15:47:15 +02002751config_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + '''
2752 #include <pthread.h>
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002753
David Hildenbrand7730f322022-10-14 15:47:15 +02002754 static void *f(void *p) { return NULL; }
2755 int main(void)
2756 {
2757 int setsize = CPU_ALLOC_SIZE(64);
2758 pthread_t thread;
2759 cpu_set_t *cpuset;
2760 pthread_create(&thread, 0, f, 0);
2761 cpuset = CPU_ALLOC(64);
2762 CPU_ZERO_S(setsize, cpuset);
2763 pthread_setaffinity_np(thread, setsize, cpuset);
2764 pthread_getaffinity_np(thread, setsize, cpuset);
2765 CPU_FREE(cpuset);
2766 return 0;
2767 }''', dependencies: threads))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002768config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02002769 #include <sys/signalfd.h>
2770 #include <stddef.h>
2771 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002772config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002773 #include <unistd.h>
2774 #include <fcntl.h>
2775 #include <limits.h>
2776
2777 int main(void)
2778 {
2779 int len, fd = 0;
2780 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2781 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2782 return 0;
2783 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002784
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002785config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
2786 #include <sys/mman.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002787 int main(void) {
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002788 return mlockall(MCL_FUTURE);
2789 }'''))
2790
Thomas Hutheea94532021-10-28 20:59:08 +02002791have_l2tpv3 = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002792if get_option('l2tpv3').allowed() and have_system
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002793 have_l2tpv3 = cc.has_type('struct mmsghdr',
2794 prefix: gnu_source_prefix + '''
2795 #include <sys/socket.h>
2796 #include <linux/ip.h>''')
Thomas Hutheea94532021-10-28 20:59:08 +02002797endif
2798config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2799
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002800have_netmap = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002801if get_option('netmap').allowed() and have_system
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002802 have_netmap = cc.compiles('''
2803 #include <inttypes.h>
2804 #include <net/if.h>
2805 #include <net/netmap.h>
2806 #include <net/netmap_user.h>
2807 #if (NETMAP_API < 11) || (NETMAP_API > 15)
2808 #error
2809 #endif
2810 int main(void) { return 0; }''')
2811 if not have_netmap and get_option('netmap').enabled()
2812 error('Netmap headers not available')
2813 endif
2814endif
2815config_host_data.set('CONFIG_NETMAP', have_netmap)
2816
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002817# Work around a system header bug with some kernel/XFS header
2818# versions where they both try to define 'struct fsxattr':
2819# xfs headers will not try to redefine structs from linux headers
2820# if this macro is set.
2821config_host_data.set('HAVE_FSXATTR', cc.links('''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002822 #include <linux/fs.h>
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002823 struct fsxattr foo;
2824 int main(void) {
2825 return 0;
2826 }'''))
2827
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002828# Some versions of Mac OS X incorrectly define SIZE_MAX
2829config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2830 #include <stdint.h>
2831 #include <stdio.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002832 int main(void) {
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002833 return printf("%zu", SIZE_MAX);
2834 }''', args: ['-Werror']))
2835
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002836# See if 64-bit atomic operations are supported.
2837# Note that without __atomic builtins, we can only
2838# assume atomic loads/stores max at pointer size.
2839config_host_data.set('CONFIG_ATOMIC64', cc.links('''
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002840 #include <stdint.h>
2841 int main(void)
2842 {
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002843 uint64_t x = 0, y = 0;
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002844 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
2845 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
2846 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2847 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2848 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2849 return 0;
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02002850 }''', args: qemu_isa_flags))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002851
Richard Henderson6479dd72023-05-24 08:14:41 -07002852has_int128_type = cc.compiles('''
2853 __int128_t a;
2854 __uint128_t b;
2855 int main(void) { b = a; }''')
2856config_host_data.set('CONFIG_INT128_TYPE', has_int128_type)
2857
2858has_int128 = has_int128_type and cc.links('''
Marc-André Lureau848126d2022-02-28 15:49:19 +04002859 __int128_t a;
2860 __uint128_t b;
2861 int main (void) {
2862 a = a + b;
2863 b = a * b;
2864 a = a * a;
2865 return 0;
2866 }''')
Marc-André Lureau848126d2022-02-28 15:49:19 +04002867config_host_data.set('CONFIG_INT128', has_int128)
2868
Richard Henderson6479dd72023-05-24 08:14:41 -07002869if has_int128_type
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002870 # "do we have 128-bit atomics which are handled inline and specifically not
2871 # via libatomic". The reason we can't use libatomic is documented in the
2872 # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002873 # We only care about these operations on 16-byte aligned pointers, so
2874 # force 16-byte alignment of the pointer, which may be greater than
2875 # __alignof(unsigned __int128) for the host.
2876 atomic_test_128 = '''
2877 int main(int ac, char **av) {
Richard Henderson6479dd72023-05-24 08:14:41 -07002878 __uint128_t *p = __builtin_assume_aligned(av[ac - 1], 16);
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002879 p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED);
2880 __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED);
2881 __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2882 return 0;
2883 }'''
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02002884 has_atomic128 = cc.links(atomic_test_128, args: qemu_isa_flags)
Marc-André Lureau848126d2022-02-28 15:49:19 +04002885
2886 config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
2887
2888 if not has_atomic128
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002889 # Even with __builtin_assume_aligned, the above test may have failed
2890 # without optimization enabled. Try again with optimizations locally
2891 # enabled for the function. See
2892 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02002893 has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128,
2894 args: qemu_isa_flags)
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002895 config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt)
Marc-André Lureau848126d2022-02-28 15:49:19 +04002896
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002897 if not has_atomic128_opt
2898 config_host_data.set('CONFIG_CMPXCHG128', cc.links('''
2899 int main(void)
2900 {
Richard Henderson6479dd72023-05-24 08:14:41 -07002901 __uint128_t x = 0, y = 0;
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002902 __sync_val_compare_and_swap_16(&x, y, x);
2903 return 0;
2904 }
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02002905 ''', args: qemu_isa_flags))
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002906 endif
Marc-André Lureau848126d2022-02-28 15:49:19 +04002907 endif
2908endif
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002909
2910config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
2911 #include <sys/auxv.h>
2912 int main(void) {
2913 return getauxval(AT_HWCAP) == 0;
2914 }'''))
2915
Brad Smith27fca0a2024-07-27 23:58:55 -04002916config_host_data.set('CONFIG_ELF_AUX_INFO', cc.links(gnu_source_prefix + '''
2917 #include <sys/auxv.h>
2918 int main(void) {
2919 unsigned long hwcap = 0;
2920 elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
2921 return hwcap;
2922 }'''))
2923
Paolo Bonzini0dae95d2022-04-20 17:33:43 +02002924config_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
2925 #include <linux/usbdevice_fs.h>
2926
2927 #ifndef USBDEVFS_GET_CAPABILITIES
2928 #error "USBDEVFS_GET_CAPABILITIES undefined"
2929 #endif
2930
2931 #ifndef USBDEVFS_DISCONNECT_CLAIM
2932 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
2933 #endif
2934
2935 int main(void) { return 0; }'''))
2936
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02002937have_keyring = get_option('keyring') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002938 .require(host_os == 'linux', error_message: 'keyring is only available on Linux') \
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02002939 .require(cc.compiles('''
2940 #include <errno.h>
2941 #include <asm/unistd.h>
2942 #include <linux/keyctl.h>
2943 #include <sys/syscall.h>
2944 #include <unistd.h>
2945 int main(void) {
2946 return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
2947 }'''), error_message: 'keyctl syscall not available on this system').allowed()
2948config_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
2949
Paolo Bonzini622753d2021-11-08 13:38:58 +01002950have_cpuid_h = cc.links('''
2951 #include <cpuid.h>
2952 int main(void) {
2953 unsigned a, b, c, d;
2954 unsigned max = __get_cpuid_max(0, 0);
2955
2956 if (max >= 1) {
2957 __cpuid(1, a, b, c, d);
2958 }
2959
2960 if (max >= 7) {
2961 __cpuid_count(7, 0, a, b, c, d);
2962 }
2963
2964 return 0;
2965 }''')
2966config_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
2967
Richard Hendersone5717302024-06-27 17:36:43 +00002968# Don't bother to advertise asm/hwprobe.h for old versions that do
2969# not contain RISCV_HWPROBE_EXT_ZBA.
2970config_host_data.set('CONFIG_ASM_HWPROBE_H',
2971 cc.has_header_symbol('asm/hwprobe.h',
2972 'RISCV_HWPROBE_EXT_ZBA'))
2973
Paolo Bonzini622753d2021-11-08 13:38:58 +01002974config_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
2975 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
2976 .require(cc.links('''
Paolo Bonzini622753d2021-11-08 13:38:58 +01002977 #include <cpuid.h>
2978 #include <immintrin.h>
Richard Henderson701ea582022-12-03 19:31:12 -06002979 static int __attribute__((target("avx2"))) bar(void *a) {
Paolo Bonzini622753d2021-11-08 13:38:58 +01002980 __m256i x = *(__m256i *)a;
2981 return _mm256_testz_si256(x, x);
2982 }
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002983 int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
Paolo Bonzini622753d2021-11-08 13:38:58 +01002984 '''), error_message: 'AVX2 not available').allowed())
2985
ling xu04ffce12022-11-16 23:29:22 +08002986config_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \
2987 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \
2988 .require(cc.links('''
ling xu04ffce12022-11-16 23:29:22 +08002989 #include <cpuid.h>
2990 #include <immintrin.h>
Richard Hendersondc165fc2023-05-01 22:05:55 +01002991 static int __attribute__((target("avx512bw"))) bar(void *a) {
ling xu04ffce12022-11-16 23:29:22 +08002992 __m512i *x = a;
2993 __m512i res= _mm512_abs_epi8(*x);
2994 return res[1];
2995 }
2996 int main(int argc, char *argv[]) { return bar(argv[0]); }
2997 '''), error_message: 'AVX512BW not available').allowed())
2998
Richard Henderson8d97f282023-06-02 07:43:40 +00002999# For both AArch64 and AArch32, detect if builtins are available.
3000config_host_data.set('CONFIG_ARM_AES_BUILTIN', cc.compiles('''
3001 #include <arm_neon.h>
3002 #ifndef __ARM_FEATURE_AES
3003 __attribute__((target("+crypto")))
3004 #endif
3005 void foo(uint8x16_t *p) { *p = vaesmcq_u8(*p); }
3006 '''))
3007
Paolo Bonzinib87df902021-11-08 13:52:11 +01003008if get_option('membarrier').disabled()
3009 have_membarrier = false
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003010elif host_os == 'windows'
Paolo Bonzinib87df902021-11-08 13:52:11 +01003011 have_membarrier = true
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003012elif host_os == 'linux'
Paolo Bonzinib87df902021-11-08 13:52:11 +01003013 have_membarrier = cc.compiles('''
3014 #include <linux/membarrier.h>
3015 #include <sys/syscall.h>
3016 #include <unistd.h>
3017 #include <stdlib.h>
3018 int main(void) {
3019 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
3020 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
3021 exit(0);
3022 }''')
3023endif
3024config_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
3025 .require(have_membarrier, error_message: 'membarrier system call not available') \
3026 .allowed())
3027
Paolo Bonzini34b52612021-11-08 14:02:42 +01003028have_afalg = get_option('crypto_afalg') \
3029 .require(cc.compiles(gnu_source_prefix + '''
3030 #include <errno.h>
3031 #include <sys/types.h>
3032 #include <sys/socket.h>
3033 #include <linux/if_alg.h>
3034 int main(void) {
3035 int sock;
3036 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
3037 return sock;
3038 }
3039 '''), error_message: 'AF_ALG requested but could not be detected').allowed()
3040config_host_data.set('CONFIG_AF_ALG', have_afalg)
3041
Marc-André Lureau9d734b82022-04-01 15:50:05 +04003042config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
3043 'linux/vm_sockets.h', 'AF_VSOCK',
3044 prefix: '#include <sys/socket.h>',
3045))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02003046
Marc-André Lureau8821a382022-02-01 16:53:43 +04003047have_vss = false
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003048have_vss_sdk = false # old xp/2003 SDK
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003049if host_os == 'windows' and 'cpp' in all_languages
Marc-André Lureau8821a382022-02-01 16:53:43 +04003050 have_vss = cxx.compiles('''
3051 #define __MIDL_user_allocate_free_DEFINED__
Marc-André Lureau32478cb2022-02-22 23:40:01 +04003052 #include <vss.h>
Marc-André Lureau8821a382022-02-01 16:53:43 +04003053 int main(void) { return VSS_CTX_BACKUP; }''')
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003054 have_vss_sdk = cxx.has_header('vscoordint.h')
Marc-André Lureau8821a382022-02-01 16:53:43 +04003055endif
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003056config_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
Marc-André Lureau8821a382022-02-01 16:53:43 +04003057
Richard Henderson6391c772022-04-17 11:30:06 -07003058# Older versions of MinGW do not import _lock_file and _unlock_file properly.
3059# This was fixed for v6.0.0 with commit b48e3ac8969d.
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003060if host_os == 'windows'
Richard Henderson6391c772022-04-17 11:30:06 -07003061 config_host_data.set('HAVE__LOCK_FILE', cc.links('''
3062 #include <stdio.h>
3063 int main(void) {
3064 _lock_file(NULL);
3065 _unlock_file(NULL);
3066 return 0;
3067 }''', name: '_lock_file and _unlock_file'))
3068endif
3069
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003070if host_os == 'windows'
Pierrick Bouvierdbd672c2023-02-21 16:30:04 +01003071 mingw_has_setjmp_longjmp = cc.links('''
3072 #include <setjmp.h>
3073 int main(void) {
3074 /*
3075 * These functions are not available in setjmp header, but may be
3076 * available at link time, from libmingwex.a.
3077 */
3078 extern int __mingw_setjmp(jmp_buf);
3079 extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int);
3080 jmp_buf env;
3081 __mingw_setjmp(env);
3082 __mingw_longjmp(env, 0);
3083 }
3084 ''', name: 'mingw setjmp and longjmp')
3085
3086 if cpu == 'aarch64' and not mingw_has_setjmp_longjmp
3087 error('mingw must provide setjmp/longjmp for windows-arm64')
3088 endif
3089endif
3090
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003091########################
3092# Target configuration #
3093########################
3094
Paolo Bonzini2becc362020-02-03 11:42:03 +01003095minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003096
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02003097config_all_accel = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04003098config_all_devices = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003099config_devices_mak_list = []
3100config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02003101config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003102config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003103
3104disassemblers = {
3105 'alpha' : ['CONFIG_ALPHA_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003106 'avr' : ['CONFIG_AVR_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06003107 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003108 'hppa' : ['CONFIG_HPPA_DIS'],
3109 'i386' : ['CONFIG_I386_DIS'],
3110 'x86_64' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003111 'm68k' : ['CONFIG_M68K_DIS'],
3112 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
3113 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003114 'or1k' : ['CONFIG_OPENRISC_DIS'],
3115 'ppc' : ['CONFIG_PPC_DIS'],
3116 'riscv' : ['CONFIG_RISCV_DIS'],
3117 'rx' : ['CONFIG_RX_DIS'],
3118 's390' : ['CONFIG_S390_DIS'],
3119 'sh4' : ['CONFIG_SH4_DIS'],
3120 'sparc' : ['CONFIG_SPARC_DIS'],
3121 'xtensa' : ['CONFIG_XTENSA_DIS'],
Song Gaoaae17462022-06-06 20:43:06 +08003122 'loongarch' : ['CONFIG_LOONGARCH_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003123}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003124
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02003125have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01003126host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02003127 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01003128 (have_tpm ? ['CONFIG_TPM=y'] : []) + \
Marc-André Lureaucca15752023-08-30 13:38:25 +04003129 (pixman.found() ? ['CONFIG_PIXMAN=y'] : []) + \
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02003130 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02003131 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini88b6e612022-04-20 17:33:40 +02003132 (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01003133 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini1935b7e2024-05-07 14:13:46 +02003134 (fdt.found() ? ['CONFIG_FDT=y'] : []) + \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003135 (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
3136 (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
3137 (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01003138 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003139 (host_os == 'linux' ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman55116962022-06-13 16:26:24 -04003140 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02003141 (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : []) + \
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03003142 (hv_balloon ? ['CONFIG_HV_BALLOON_POSSIBLE=y'] : []) + \
3143 (have_rust ? ['CONFIG_HAVE_RUST=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01003144
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003145ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003146
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003147default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
3148actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003149fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003150foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04003151 config_target = { 'TARGET_NAME': target.split('-')[0] }
3152 if target.endswith('linux-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003153 if host_os != 'linux'
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003154 if default_targets
3155 continue
3156 endif
3157 error('Target @0@ is only available on a Linux host'.format(target))
3158 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04003159 config_target += { 'CONFIG_LINUX_USER': 'y' }
3160 elif target.endswith('bsd-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003161 if host_os not in bsd_oses
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003162 if default_targets
3163 continue
3164 endif
3165 error('Target @0@ is only available on a BSD host'.format(target))
3166 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04003167 config_target += { 'CONFIG_BSD_USER': 'y' }
3168 elif target.endswith('softmmu')
Philippe Mathieu-Daudébd0c03b2023-06-13 15:33:45 +02003169 config_target += { 'CONFIG_SYSTEM_ONLY': 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04003170 config_target += { 'CONFIG_SOFTMMU': 'y' }
3171 endif
3172 if target.endswith('-user')
3173 config_target += {
3174 'CONFIG_USER_ONLY': 'y',
3175 'CONFIG_QEMU_INTERP_PREFIX':
Paolo Bonzinice6119d2022-04-20 17:33:55 +02003176 get_option('interp_prefix').replace('%M', config_target['TARGET_NAME'])
Paolo Bonzini765686d2020-09-18 06:37:21 -04003177 }
3178 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02003179
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003180 target_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04003181 foreach sym: accelerators
3182 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
3183 config_target += { sym: 'y' }
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02003184 config_all_accel += { sym: 'y' }
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02003185 if target in modular_tcg
3186 config_target += { 'CONFIG_TCG_MODULAR': 'y' }
3187 else
3188 config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
3189 endif
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003190 target_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04003191 endif
3192 endforeach
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003193 if target_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003194 if default_targets
3195 continue
3196 endif
3197 error('No accelerator available for target @0@'.format(target))
3198 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04003199
Alex Bennée812b31d2021-07-07 14:17:43 +01003200 config_target += keyval.load('configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003201 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04003202
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003203 if 'TARGET_NEED_FDT' in config_target and not fdt.found()
Paolo Bonzini9b089d22024-05-08 09:25:48 +02003204 if default_targets
3205 warning('Disabling ' + target + ' due to missing libfdt')
3206 else
3207 fdt_required += target
3208 endif
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003209 continue
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003210 endif
3211
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003212 actual_target_dirs += target
3213
Paolo Bonzinifa731682020-09-21 05:19:07 -04003214 # Add default keys
3215 if 'TARGET_BASE_ARCH' not in config_target
3216 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
3217 endif
3218 if 'TARGET_ABI_DIR' not in config_target
3219 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
3220 endif
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003221 if 'TARGET_BIG_ENDIAN' not in config_target
3222 config_target += {'TARGET_BIG_ENDIAN': 'n'}
3223 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02003224
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003225 foreach k, v: disassemblers
Paolo Bonzini823eb012021-11-08 14:18:17 +01003226 if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003227 foreach sym: v
3228 config_target += { sym: 'y' }
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003229 endforeach
3230 endif
3231 endforeach
3232
Paolo Bonzini859aef02020-08-04 18:14:26 +02003233 config_target_data = configuration_data()
3234 foreach k, v: config_target
3235 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
3236 # do nothing
3237 elif ignored.contains(k)
3238 # do nothing
3239 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003240 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
3241 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02003242 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04003243 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02003244 config_target_data.set_quoted(k, v)
3245 elif v == 'y'
3246 config_target_data.set(k, 1)
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003247 elif v == 'n'
3248 config_target_data.set(k, 0)
Paolo Bonzini859aef02020-08-04 18:14:26 +02003249 else
3250 config_target_data.set(k, v)
3251 endif
3252 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01003253 config_target_data.set('QEMU_ARCH',
3254 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02003255 config_target_h += {target: configure_file(output: target + '-config-target.h',
3256 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003257
3258 if target.endswith('-softmmu')
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003259 target_kconfig += 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'
3260 target_kconfig += 'CONFIG_TARGET_BIG_ENDIAN=' + config_target['TARGET_BIG_ENDIAN']
3261
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003262 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003263 config_devices_mak = target + '-config-devices.mak'
3264 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003265 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01003266 output: config_devices_mak,
3267 depfile: config_devices_mak + '.d',
3268 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01003269 command: [minikconf,
3270 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01003271 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003272 host_kconfig, target_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02003273
3274 config_devices_data = configuration_data()
3275 config_devices = keyval.load(config_devices_mak)
3276 foreach k, v: config_devices
3277 config_devices_data.set(k, 1)
3278 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003279 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02003280 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
3281 configuration: config_devices_data)}
3282 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04003283 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01003284 endif
3285 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003286endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003287target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003288
Paolo Bonzinieed56e92021-11-10 11:01:26 +01003289target_configs_h = []
3290foreach target: target_dirs
3291 target_configs_h += config_target_h[target]
3292 target_configs_h += config_devices_h.get(target, [])
3293endforeach
3294genh += custom_target('config-poison.h',
3295 input: [target_configs_h],
3296 output: 'config-poison.h',
3297 capture: true,
3298 command: [find_program('scripts/make-config-poison.sh'),
3299 target_configs_h])
3300
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003301if fdt_required.length() > 0
3302 error('fdt disabled but required by targets ' + ', '.join(fdt_required))
3303endif
3304
Paolo Bonzinia775c712023-09-08 12:09:22 +02003305###############
3306# Subprojects #
3307###############
Paolo Bonzini4d34a862020-10-05 11:31:15 +02003308
Jagannathan Raman55116962022-06-13 16:26:24 -04003309libvfio_user_dep = not_found
3310if have_system and vfio_user_server_allowed
Paolo Bonzini2019cab2023-05-18 16:50:00 +02003311 libvfio_user_proj = subproject('libvfio-user', required: true)
Paolo Bonzini53283532023-03-30 12:47:23 +02003312 libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
Jagannathan Raman55116962022-06-13 16:26:24 -04003313endif
3314
Paolo Bonzinia775c712023-09-08 12:09:22 +02003315vhost_user = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003316if host_os == 'linux' and have_vhost_user
Paolo Bonzinia775c712023-09-08 12:09:22 +02003317 libvhost_user = subproject('libvhost-user')
3318 vhost_user = libvhost_user.get_variable('vhost_user_dep')
3319endif
3320
3321libvduse = not_found
3322if have_libvduse
3323 libvduse_proj = subproject('libvduse')
3324 libvduse = libvduse_proj.get_variable('libvduse_dep')
3325endif
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003326
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003327#####################
3328# Generated sources #
3329#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003330
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003331genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003332
Marc-André Lureau3f885652019-07-15 18:06:04 +04003333hxtool = find_program('scripts/hxtool')
Marc-André Lureaue2c40122023-01-24 18:00:57 +00003334shaderinclude = find_program('scripts/shaderinclude.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003335qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003336qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
3337 meson.current_source_dir() / 'scripts/qapi/commands.py',
3338 meson.current_source_dir() / 'scripts/qapi/common.py',
3339 meson.current_source_dir() / 'scripts/qapi/error.py',
3340 meson.current_source_dir() / 'scripts/qapi/events.py',
3341 meson.current_source_dir() / 'scripts/qapi/expr.py',
3342 meson.current_source_dir() / 'scripts/qapi/gen.py',
3343 meson.current_source_dir() / 'scripts/qapi/introspect.py',
Markus Armbruster88d357d2023-04-28 12:54:16 +02003344 meson.current_source_dir() / 'scripts/qapi/main.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003345 meson.current_source_dir() / 'scripts/qapi/parser.py',
3346 meson.current_source_dir() / 'scripts/qapi/schema.py',
3347 meson.current_source_dir() / 'scripts/qapi/source.py',
3348 meson.current_source_dir() / 'scripts/qapi/types.py',
3349 meson.current_source_dir() / 'scripts/qapi/visit.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003350 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003351]
3352
3353tracetool = [
3354 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003355 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003356]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003357tracetool_depends = files(
3358 'scripts/tracetool/backend/log.py',
3359 'scripts/tracetool/backend/__init__.py',
3360 'scripts/tracetool/backend/dtrace.py',
3361 'scripts/tracetool/backend/ftrace.py',
3362 'scripts/tracetool/backend/simple.py',
3363 'scripts/tracetool/backend/syslog.py',
3364 'scripts/tracetool/backend/ust.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003365 'scripts/tracetool/format/ust_events_c.py',
3366 'scripts/tracetool/format/ust_events_h.py',
3367 'scripts/tracetool/format/__init__.py',
3368 'scripts/tracetool/format/d.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003369 'scripts/tracetool/format/simpletrace_stap.py',
3370 'scripts/tracetool/format/c.py',
3371 'scripts/tracetool/format/h.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003372 'scripts/tracetool/format/log_stap.py',
3373 'scripts/tracetool/format/stap.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003374 'scripts/tracetool/__init__.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003375)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003376
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003377qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
3378 meson.current_source_dir(),
Paolo Bonzinib0b43232022-04-20 17:33:54 +02003379 get_option('pkgversion'), meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003380qemu_version = custom_target('qemu-version.h',
3381 output: 'qemu-version.h',
3382 command: qemu_version_cmd,
3383 capture: true,
3384 build_by_default: true,
3385 build_always_stale: true)
3386genh += qemu_version
3387
Marc-André Lureau3f885652019-07-15 18:06:04 +04003388hxdep = []
3389hx_headers = [
3390 ['qemu-options.hx', 'qemu-options.def'],
3391 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
3392]
3393if have_system
3394 hx_headers += [
3395 ['hmp-commands.hx', 'hmp-commands.h'],
3396 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
3397 ]
3398endif
3399foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003400 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04003401 input: files(d[0]),
3402 output: d[1],
3403 capture: true,
Marc-André Lureau3f885652019-07-15 18:06:04 +04003404 command: [hxtool, '-h', '@INPUT0@'])
3405endforeach
3406genh += hxdep
3407
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003408###############
3409# Trace files #
3410###############
3411
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003412# TODO: add each directory to the subdirs from its own meson.build, once
3413# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003414trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003415 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003416 'qapi',
3417 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003418 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003419 'util',
Alex Bennée842b42d2022-09-29 12:42:22 +01003420 'gdbstub',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003421]
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003422if have_linux_user
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003423 trace_events_subdirs += [ 'linux-user' ]
3424endif
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003425if have_bsd_user
3426 trace_events_subdirs += [ 'bsd-user' ]
3427endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003428if have_block
3429 trace_events_subdirs += [
3430 'authz',
3431 'block',
Daniel P. Berrangé48fc8872024-07-23 11:31:24 +01003432 'chardev',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003433 'io',
3434 'nbd',
3435 'scsi',
3436 ]
3437endif
3438if have_system
3439 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003440 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003441 'audio',
3442 'backends',
3443 'backends/tpm',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003444 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003445 'hw/9pfs',
3446 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08003447 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003448 'hw/alpha',
3449 'hw/arm',
3450 'hw/audio',
3451 'hw/block',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003452 'hw/char',
3453 'hw/display',
3454 'hw/dma',
Ninad Palsule99f0c042024-01-26 04:49:46 -06003455 'hw/fsi',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003456 'hw/hyperv',
3457 'hw/i2c',
3458 'hw/i386',
3459 'hw/i386/xen',
David Woodhouseaa98ee32023-01-13 19:51:32 +00003460 'hw/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003461 'hw/ide',
3462 'hw/input',
3463 'hw/intc',
3464 'hw/isa',
3465 'hw/mem',
3466 'hw/mips',
3467 'hw/misc',
3468 'hw/misc/macio',
3469 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08003470 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01003471 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02003472 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003473 'hw/nvram',
3474 'hw/pci',
3475 'hw/pci-host',
3476 'hw/ppc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003477 'hw/rtc',
3478 'hw/s390x',
3479 'hw/scsi',
3480 'hw/sd',
BALATON Zoltanad52cfc2021-10-29 23:02:09 +02003481 'hw/sh4',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003482 'hw/sparc',
3483 'hw/sparc64',
3484 'hw/ssi',
3485 'hw/timer',
3486 'hw/tpm',
Jeuk Kimbc4e68d2023-09-06 16:43:48 +09003487 'hw/ufs',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003488 'hw/usb',
3489 'hw/vfio',
3490 'hw/virtio',
3491 'hw/watchdog',
3492 'hw/xen',
3493 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003494 'migration',
3495 'net',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003496 'system',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003497 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05003498 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003499 ]
3500endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003501if have_system or have_user
3502 trace_events_subdirs += [
3503 'accel/tcg',
3504 'hw/core',
3505 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02003506 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003507 'target/hppa',
3508 'target/i386',
3509 'target/i386/kvm',
Tianrui Zhaof8447432024-01-05 15:57:59 +08003510 'target/loongarch',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02003511 'target/mips/tcg',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003512 'target/ppc',
3513 'target/riscv',
3514 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08003515 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003516 'target/sparc',
3517 ]
3518endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003519
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003520###################
3521# Collect sources #
3522###################
3523
3524authz_ss = ss.source_set()
3525blockdev_ss = ss.source_set()
3526block_ss = ss.source_set()
3527chardev_ss = ss.source_set()
3528common_ss = ss.source_set()
3529crypto_ss = ss.source_set()
3530hwcore_ss = ss.source_set()
3531io_ss = ss.source_set()
3532qmp_ss = ss.source_set()
3533qom_ss = ss.source_set()
3534system_ss = ss.source_set()
3535specific_fuzz_ss = ss.source_set()
3536specific_ss = ss.source_set()
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02003537rust_devices_ss = ss.source_set()
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003538stub_ss = ss.source_set()
3539trace_ss = ss.source_set()
3540user_ss = ss.source_set()
3541util_ss = ss.source_set()
3542
3543# accel modules
3544qtest_module_ss = ss.source_set()
3545tcg_module_ss = ss.source_set()
3546
3547modules = {}
3548target_modules = {}
3549hw_arch = {}
3550target_arch = {}
3551target_system_arch = {}
3552target_user_arch = {}
3553
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +01003554# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
3555# that is filled in by qapi/.
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003556subdir('qapi')
3557subdir('qobject')
3558subdir('stubs')
3559subdir('trace')
3560subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04003561subdir('qom')
3562subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003563subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04003564subdir('ui')
Alex Bennée842b42d2022-09-29 12:42:22 +01003565subdir('gdbstub')
Philippe Mathieu-Daudé68621262024-04-08 17:53:20 +02003566if have_system
3567 subdir('hw')
3568else
3569 subdir('hw/core')
3570endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003571
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003572if enable_modules
3573 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
Akihiko Odaki414b1802024-05-24 17:00:22 +09003574 modulecommon = declare_dependency(objects: libmodulecommon.extract_all_objects(recursive: false), compile_args: '-DBUILD_DSO')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003575endif
3576
Paolo Bonzini1220f582023-08-30 11:52:43 +02003577qom_ss = qom_ss.apply({})
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003578libqom = static_library('qom', qom_ss.sources() + genh,
3579 dependencies: [qom_ss.dependencies()],
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003580 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003581qom = declare_dependency(objects: libqom.extract_all_objects(recursive: false),
3582 dependencies: qom_ss.dependencies())
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003583
3584event_loop_base = files('event-loop-base.c')
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003585event_loop_base = static_library('event-loop-base',
3586 sources: event_loop_base + genh,
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003587 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003588event_loop_base = declare_dependency(objects: event_loop_base.extract_all_objects(recursive: false),
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003589 dependencies: [qom])
3590
Paolo Bonzini1220f582023-08-30 11:52:43 +02003591stub_ss = stub_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003592
3593util_ss.add_all(trace_ss)
Paolo Bonzini1220f582023-08-30 11:52:43 +02003594util_ss = util_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003595libqemuutil = static_library('qemuutil',
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003596 build_by_default: false,
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003597 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6190fd62024-04-08 17:53:13 +02003598 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003599qemuutil = declare_dependency(link_with: libqemuutil,
Nicolas Saenz Julienne70ac26b2022-04-25 09:57:22 +02003600 sources: genh + version_res,
3601 dependencies: [event_loop_base])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003602
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01003603if have_system or have_user
3604 decodetree = generator(find_program('scripts/decodetree.py'),
3605 output: 'decode-@BASENAME@.c.inc',
3606 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3607 subdir('libdecnumber')
3608 subdir('target')
3609endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003610
Paolo Bonzini478e9432020-08-17 12:47:55 +02003611subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04003612subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04003613subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003614subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04003615subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003616
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003617if have_block
3618 block_ss.add(files(
3619 'block.c',
3620 'blockjob.c',
3621 'job.c',
3622 'qemu-io-cmds.c',
3623 ))
Paolo Bonzini406523f2021-10-13 11:43:54 +02003624 if config_host_data.get('CONFIG_REPLICATION')
3625 block_ss.add(files('replication.c'))
3626 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003627
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003628 subdir('nbd')
3629 subdir('scsi')
3630 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003631
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003632 blockdev_ss.add(files(
3633 'blockdev.c',
3634 'blockdev-nbd.c',
3635 'iothread.c',
3636 'job-qmp.c',
Akihiko Odaki7b1070a2024-05-24 17:00:23 +09003637 ))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003638
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003639 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
3640 # os-win32.c does not
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003641 if host_os == 'windows'
Paolo Bonzinidc495492023-08-30 11:29:54 +02003642 system_ss.add(files('os-win32.c'))
3643 else
3644 blockdev_ss.add(files('os-posix.c'))
3645 endif
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003646endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02003647
Philippe Mathieu-Daudéfe0007f2023-09-14 20:57:12 +02003648common_ss.add(files('cpu-common.c'))
3649specific_ss.add(files('cpu-target.c'))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003650
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003651subdir('system')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003652
Richard Henderson44b99a62021-03-22 12:24:26 +01003653# Work around a gcc bug/misfeature wherein constant propagation looks
3654# through an alias:
3655# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
3656# to guess that a const variable is always zero. Without lto, this is
3657# impossible, as the alias is restricted to page-vary-common.c. Indeed,
3658# without lto, not even the alias is required -- we simply use different
3659# declarations in different compilation units.
3660pagevary = files('page-vary-common.c')
3661if get_option('b_lto')
3662 pagevary_flags = ['-fno-lto']
3663 if get_option('cfi')
3664 pagevary_flags += '-fno-sanitize=cfi-icall'
3665 endif
Thomas Huth54c9b192022-03-30 13:48:08 +02003666 pagevary = static_library('page-vary-common', sources: pagevary + genh,
Richard Henderson44b99a62021-03-22 12:24:26 +01003667 c_args: pagevary_flags)
3668 pagevary = declare_dependency(link_with: pagevary)
3669endif
3670common_ss.add(pagevary)
Philippe Mathieu-Daudé75bbe6a2023-12-07 10:41:27 +01003671specific_ss.add(files('page-target.c', 'page-vary-target.c'))
Richard Henderson6670d4d2021-03-22 12:24:24 +01003672
Marc-André Lureauab318052019-07-24 19:23:16 +04003673subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04003674subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04003675subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003676subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04003677subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04003678subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00003679subdir('semihosting')
Markus Armbrusteraa09b3d2023-01-24 13:19:36 +01003680subdir('stats')
Richard Henderson104cc2c2021-03-08 12:04:33 -08003681subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08003682subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04003683subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003684subdir('plugins')
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003685subdir('ebpf')
3686
3687common_user_inc = []
3688
3689subdir('common-user')
Marc-André Lureaub309c322019-08-18 19:20:37 +04003690subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04003691subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003692
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003693# needed for fuzzing binaries
3694subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003695subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003696
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003697# accel modules
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02003698tcg_real_module_ss = ss.source_set()
3699tcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
3700specific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
3701target_modules += { 'accel' : { 'qtest': qtest_module_ss,
3702 'tcg': tcg_real_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003703
Paolo Bonziniea444d92023-09-08 12:06:12 +02003704##############################################
3705# Internal static_libraries and dependencies #
3706##############################################
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003707
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003708modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003709modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003710modinfo_files = []
3711
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003712block_mods = []
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003713system_mods = []
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003714emulator_modules = []
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003715foreach d, list : modules
Paolo Bonzinief709862023-05-04 10:20:46 +02003716 if not (d == 'block' ? have_block : have_system)
3717 continue
3718 endif
3719
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003720 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003721 if enable_modules
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003722 module_ss.add(modulecommon)
Paolo Bonzini0d665492023-08-31 11:18:24 +02003723 module_ss = module_ss.apply(config_all_devices, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003724 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003725 dependencies: module_ss.dependencies(), pic: true)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003726 if d == 'block'
3727 block_mods += sl
3728 else
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003729 system_mods += sl
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003730 endif
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003731 emulator_modules += shared_module(sl.name(),
3732 name_prefix: '',
Akihiko Odaki414b1802024-05-24 17:00:22 +09003733 objects: sl.extract_all_objects(recursive: false),
3734 dependencies: module_ss.dependencies(),
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003735 install: true,
3736 install_dir: qemu_moddir)
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003737 if module_ss.sources() != []
3738 # FIXME: Should use sl.extract_all_objects(recursive: true) as
3739 # input. Sources can be used multiple times but objects are
3740 # unique when it comes to lookup in compile_commands.json.
3741 # Depnds on a mesion version with
3742 # https://github.com/mesonbuild/meson/pull/8900
3743 modinfo_files += custom_target(d + '-' + m + '.modinfo',
3744 output: d + '-' + m + '.modinfo',
Paolo Bonziniac347112021-07-21 18:51:57 +02003745 input: module_ss.sources() + genh,
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003746 capture: true,
Paolo Bonziniac347112021-07-21 18:51:57 +02003747 command: [modinfo_collect, module_ss.sources()])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003748 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003749 else
3750 if d == 'block'
3751 block_ss.add_all(module_ss)
3752 else
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003753 system_ss.add_all(module_ss)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003754 endif
3755 endif
3756 endforeach
3757endforeach
3758
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003759foreach d, list : target_modules
3760 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003761 if enable_modules
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003762 module_ss.add(modulecommon)
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003763 foreach target : target_dirs
3764 if target.endswith('-softmmu')
3765 config_target = config_target_mak[target]
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003766 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
Philippe Mathieu-Daudé7d7a21b2023-06-13 16:29:11 +02003767 c_args = ['-DCOMPILING_PER_TARGET',
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003768 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3769 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3770 target_module_ss = module_ss.apply(config_target, strict: false)
3771 if target_module_ss.sources() != []
3772 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3773 sl = static_library(module_name,
3774 [genh, target_module_ss.sources()],
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003775 dependencies: target_module_ss.dependencies(),
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003776 include_directories: target_inc,
3777 c_args: c_args,
3778 pic: true)
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003779 system_mods += sl
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003780 emulator_modules += shared_module(sl.name(),
3781 name_prefix: '',
Akihiko Odaki414b1802024-05-24 17:00:22 +09003782 objects: sl.extract_all_objects(recursive: false),
3783 dependencies: target_module_ss.dependencies(),
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003784 install: true,
3785 install_dir: qemu_moddir)
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003786 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
3787 modinfo_files += custom_target(module_name + '.modinfo',
3788 output: module_name + '.modinfo',
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003789 input: target_module_ss.sources() + genh,
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003790 capture: true,
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003791 command: [modinfo_collect, '--target', target, target_module_ss.sources()])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003792 endif
3793 endif
3794 endforeach
3795 else
3796 specific_ss.add_all(module_ss)
3797 endif
3798 endforeach
3799endforeach
3800
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003801if enable_modules
Jose R. Ziviani05d68142022-05-28 00:20:35 +02003802 foreach target : target_dirs
3803 if target.endswith('-softmmu')
3804 config_target = config_target_mak[target]
3805 config_devices_mak = target + '-config-devices.mak'
3806 modinfo_src = custom_target('modinfo-' + target + '.c',
3807 output: 'modinfo-' + target + '.c',
3808 input: modinfo_files,
3809 command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
3810 capture: true)
3811
3812 modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
3813 modinfo_dep = declare_dependency(link_with: modinfo_lib)
3814
3815 arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
3816 hw_arch[arch].add(modinfo_dep)
3817 endif
3818 endforeach
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003819
3820 if emulator_modules.length() > 0
3821 alias_target('modules', emulator_modules)
3822 endif
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003823endif
3824
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003825nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08003826undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003827block_syms = custom_target('block.syms', output: 'block.syms',
3828 input: [libqemuutil, block_mods],
3829 capture: true,
3830 command: [undefsym, nm, '@INPUT@'])
3831qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003832 input: [libqemuutil, system_mods],
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003833 capture: true,
3834 command: [undefsym, nm, '@INPUT@'])
3835
Paolo Bonzini1220f582023-08-30 11:52:43 +02003836authz_ss = authz_ss.apply({})
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003837libauthz = static_library('authz', authz_ss.sources() + genh,
3838 dependencies: [authz_ss.dependencies()],
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003839 build_by_default: false)
3840
Akihiko Odaki414b1802024-05-24 17:00:22 +09003841authz = declare_dependency(objects: libauthz.extract_all_objects(recursive: false),
3842 dependencies: [authz_ss.dependencies(), qom])
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003843
Paolo Bonzini1220f582023-08-30 11:52:43 +02003844crypto_ss = crypto_ss.apply({})
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003845libcrypto = static_library('crypto', crypto_ss.sources() + genh,
3846 dependencies: [crypto_ss.dependencies()],
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003847 build_by_default: false)
3848
Akihiko Odaki414b1802024-05-24 17:00:22 +09003849crypto = declare_dependency(objects: libcrypto.extract_all_objects(recursive: false),
3850 dependencies: [crypto_ss.dependencies(), authz, qom])
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003851
Paolo Bonzini1220f582023-08-30 11:52:43 +02003852io_ss = io_ss.apply({})
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003853libio = static_library('io', io_ss.sources() + genh,
3854 dependencies: [io_ss.dependencies()],
3855 link_with: libqemuutil,
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003856 build_by_default: false)
3857
Akihiko Odaki414b1802024-05-24 17:00:22 +09003858io = declare_dependency(objects: libio.extract_all_objects(recursive: false),
3859 dependencies: [io_ss.dependencies(), crypto, qom])
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003860
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003861libmigration = static_library('migration', sources: migration_files + genh,
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003862 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003863migration = declare_dependency(objects: libmigration.extract_all_objects(recursive: false),
Paolo Bonzini70eb5fd2024-05-24 18:16:08 +02003864 dependencies: [qom, io])
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003865system_ss.add(migration)
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003866
Paolo Bonzini1220f582023-08-30 11:52:43 +02003867block_ss = block_ss.apply({})
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003868libblock = static_library('block', block_ss.sources() + genh,
3869 dependencies: block_ss.dependencies(),
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003870 build_by_default: false)
3871
Akihiko Odaki414b1802024-05-24 17:00:22 +09003872block = declare_dependency(objects: libblock.extract_all_objects(recursive: false),
3873 dependencies: [block_ss.dependencies(), crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003874
Paolo Bonzini1220f582023-08-30 11:52:43 +02003875blockdev_ss = blockdev_ss.apply({})
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003876libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
3877 dependencies: blockdev_ss.dependencies(),
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003878 build_by_default: false)
3879
Akihiko Odaki414b1802024-05-24 17:00:22 +09003880blockdev = declare_dependency(objects: libblockdev.extract_all_objects(recursive: false),
3881 dependencies: [blockdev_ss.dependencies(), block, event_loop_base])
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003882
Paolo Bonzini1220f582023-08-30 11:52:43 +02003883qmp_ss = qmp_ss.apply({})
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003884libqmp = static_library('qmp', qmp_ss.sources() + genh,
3885 dependencies: qmp_ss.dependencies(),
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003886 build_by_default: false)
3887
Akihiko Odaki414b1802024-05-24 17:00:22 +09003888qmp = declare_dependency(objects: libqmp.extract_all_objects(recursive: false),
3889 dependencies: qmp_ss.dependencies())
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003890
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003891libchardev = static_library('chardev', chardev_ss.sources() + genh,
Marc-André Lureau22d1f7a2022-03-23 19:57:12 +04003892 dependencies: chardev_ss.dependencies(),
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003893 build_by_default: false)
3894
Akihiko Odaki414b1802024-05-24 17:00:22 +09003895chardev = declare_dependency(objects: libchardev.extract_all_objects(recursive: false),
3896 dependencies: chardev_ss.dependencies())
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003897
Paolo Bonzini1220f582023-08-30 11:52:43 +02003898hwcore_ss = hwcore_ss.apply({})
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02003899libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02003900 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003901hwcore = declare_dependency(objects: libhwcore.extract_all_objects(recursive: false))
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02003902common_ss.add(hwcore)
3903
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02003904###########
3905# Targets #
3906###########
3907
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003908system_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003909common_ss.add(qom, qemuutil)
3910
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003911common_ss.add_all(when: 'CONFIG_SYSTEM_ONLY', if_true: [system_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01003912common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
3913
Paolo Bonzini0d665492023-08-31 11:18:24 +02003914# Note that this library is never used directly (only through extract_objects)
3915# and is not built by default; therefore, source files not used by the build
3916# configuration will be in build.ninja, but are never built by default.
Paolo Bonzini2becc362020-02-03 11:42:03 +01003917common_all = static_library('common',
3918 build_by_default: false,
Paolo Bonzini0d665492023-08-31 11:18:24 +02003919 sources: common_ss.all_sources() + genh,
Paolo Bonzini9d24fb72021-12-21 16:09:54 +01003920 include_directories: common_user_inc,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09003921 implicit_include_directories: false,
Paolo Bonzini44081552024-05-24 10:56:55 +02003922 dependencies: common_ss.all_dependencies())
Paolo Bonzini2becc362020-02-03 11:42:03 +01003923
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03003924if have_rust and have_system
3925 rustc_args = run_command(
3926 find_program('scripts/rust/rustc_args.py'),
3927 '--config-headers', meson.project_build_root() / 'config-host.h',
3928 capture : true,
3929 check: true).stdout().strip().split()
3930 rustc_args += ['-D', 'unsafe_op_in_unsafe_fn']
3931 bindgen_args = [
3932 '--disable-header-comment',
3933 '--raw-line', '// @generated',
3934 '--ctypes-prefix', 'core::ffi',
3935 '--formatter', 'rustfmt',
3936 '--generate-block',
3937 '--generate-cstr',
3938 '--impl-debug',
3939 '--merge-extern-blocks',
3940 '--no-doc-comments',
3941 '--use-core',
3942 '--with-derive-default',
3943 '--no-size_t-is-usize',
3944 '--no-layout-tests',
3945 '--no-prepend-enum-name',
3946 '--allowlist-file', meson.project_source_root() + '/include/.*',
3947 '--allowlist-file', meson.project_source_root() + '/.*',
3948 '--allowlist-file', meson.project_build_root() + '/.*'
3949 ]
3950 c_enums = [
3951 'DeviceCategory',
3952 'GpioPolarity',
3953 'MachineInitPhase',
3954 'MemoryDeviceInfoKind',
3955 'MigrationPolicy',
3956 'MigrationPriority',
3957 'QEMUChrEvent',
3958 'QEMUClockType',
3959 'device_endian',
3960 'module_init_type',
3961 ]
3962 foreach enum : c_enums
3963 bindgen_args += ['--rustified-enum', enum]
3964 endforeach
3965 c_bitfields = [
3966 'ClockEvent',
3967 'VMStateFlags',
3968 ]
3969 foreach enum : c_bitfields
3970 bindgen_args += ['--bitfield-enum', enum]
3971 endforeach
3972
3973 # TODO: Remove this comment when the clang/libclang mismatch issue is solved.
3974 #
3975 # Rust bindings generation with `bindgen` might fail in some cases where the
3976 # detected `libclang` does not match the expected `clang` version/target. In
3977 # this case you must pass the path to `clang` and `libclang` to your build
3978 # command invocation using the environment variables CLANG_PATH and
3979 # LIBCLANG_PATH
3980 bindings_rs = import('rust').bindgen(
3981 input: 'rust/wrapper.h',
3982 dependencies: common_ss.all_dependencies(),
3983 output: 'bindings.rs',
3984 include_directories: include_directories('.', 'include'),
3985 bindgen_version: ['>=0.69.4'],
3986 args: bindgen_args,
3987 )
3988 subdir('rust')
3989endif
3990
3991
Akihiko Odaki956af7d2023-10-09 17:40:51 +01003992feature_to_c = find_program('scripts/feature_to_c.py')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003993
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003994if host_os == 'darwin'
Philippe Mathieu-Daudé30cfa502022-02-15 17:25:03 +01003995 entitlement = find_program('scripts/entitlement.sh')
3996endif
3997
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00003998traceable = []
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04003999emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01004000foreach target : target_dirs
4001 config_target = config_target_mak[target]
4002 target_name = config_target['TARGET_NAME']
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004003 target_base_arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02004004 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004005 arch_deps = []
Philippe Mathieu-Daudé7d7a21b2023-06-13 16:29:11 +02004006 c_args = ['-DCOMPILING_PER_TARGET',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004007 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
4008 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04004009 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01004010
4011 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004012 if host_os == 'linux'
Paolo Bonzini2becc362020-02-03 11:42:03 +01004013 target_inc += include_directories('linux-headers', is_system: true)
4014 endif
4015 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01004016 target_type='system'
Philippe Mathieu-Daudé01c85e62023-10-04 11:06:27 +02004017 t = target_system_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004018 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004019 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004020
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004021 hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
Philippe Mathieu-Daudébf964322023-11-21 13:52:48 +01004022 if hw_arch.has_key(hw_dir)
4023 hw = hw_arch[hw_dir].apply(config_target, strict: false)
4024 arch_srcs += hw.sources()
4025 arch_deps += hw.dependencies()
4026 endif
Marc-André Lureau2c442202019-08-17 13:55:58 +04004027
Paolo Bonzini2becc362020-02-03 11:42:03 +01004028 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004029 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01004030 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04004031 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01004032 target_type='user'
Paolo Bonzinia3a576b2021-12-21 16:23:55 +01004033 target_inc += common_user_inc
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004034 if target_base_arch in target_user_arch
4035 t = target_user_arch[target_base_arch].apply(config_target, strict: false)
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02004036 arch_srcs += t.sources()
4037 arch_deps += t.dependencies()
4038 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01004039 if 'CONFIG_LINUX_USER' in config_target
4040 base_dir = 'linux-user'
Warner Loshe2a74722021-08-03 17:17:17 -06004041 endif
4042 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01004043 base_dir = 'bsd-user'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004044 target_inc += include_directories('bsd-user/' / host_os)
Warner Losh85fc1b52022-01-08 17:27:34 -07004045 target_inc += include_directories('bsd-user/host/' / host_arch)
Warner Loshe2a74722021-08-03 17:17:17 -06004046 dir = base_dir / abi
Warner Losh19bf1292021-11-04 16:34:48 -06004047 arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01004048 endif
4049 target_inc += include_directories(
4050 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04004051 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01004052 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04004053 if 'CONFIG_LINUX_USER' in config_target
4054 dir = base_dir / abi
4055 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
4056 if config_target.has_key('TARGET_SYSTBL_ABI')
4057 arch_srcs += \
4058 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
4059 extra_args : config_target['TARGET_SYSTBL_ABI'])
4060 endif
4061 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01004062 endif
4063
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04004064 if 'TARGET_XML_FILES' in config_target
4065 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
4066 output: target + '-gdbstub-xml.c',
4067 input: files(config_target['TARGET_XML_FILES'].split()),
4068 command: [feature_to_c, '@INPUT@'],
4069 capture: true)
4070 arch_srcs += gdbstub_xml
4071 endif
4072
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004073 t = target_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004074 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004075 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004076
Paolo Bonzini2becc362020-02-03 11:42:03 +01004077 target_common = common_ss.apply(config_target, strict: false)
4078 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004079 arch_deps += target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01004080
Paolo Bonzini2becc362020-02-03 11:42:03 +01004081 target_specific = specific_ss.apply(config_target, strict: false)
4082 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004083 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01004084
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004085 if have_rust and have_system
4086 target_rust = rust_devices_ss.apply(config_target, strict: false)
4087 crates = []
4088 foreach dep : target_rust.dependencies()
4089 crates += dep.get_variable('crate')
4090 endforeach
4091 if crates.length() > 0
4092 rlib_rs = custom_target('rust_' + target.underscorify() + '.rs',
4093 output: 'rust_' + target.underscorify() + '.rs',
4094 command: [find_program('scripts/rust/rust_root_crate.sh')] + crates,
4095 capture: true,
4096 build_by_default: true,
4097 build_always_stale: true)
4098 rlib = static_library('rust_' + target.underscorify(),
4099 rlib_rs,
4100 dependencies: target_rust.dependencies(),
4101 override_options: ['rust_std=2021', 'build.rust_std=2021'],
4102 rust_args: rustc_args,
4103 rust_abi: 'c')
4104 arch_deps += declare_dependency(link_whole: [rlib])
4105 endif
4106 endif
4107
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004108 # allow using headers from the dependencies but do not include the sources,
4109 # because this emulator only needs those in "objects". For external
4110 # dependencies, the full dependency is included below in the executable.
4111 lib_deps = []
4112 foreach dep : arch_deps
4113 lib_deps += dep.partial_dependency(compile_args: true, includes: true)
4114 endforeach
4115
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004116 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02004117 sources: arch_srcs + genh,
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004118 dependencies: lib_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01004119 objects: objects,
4120 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004121 c_args: c_args,
Paolo Bonzini44081552024-05-24 10:56:55 +02004122 build_by_default: false)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004123
4124 if target.endswith('-softmmu')
4125 execs = [{
4126 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004127 'win_subsystem': 'console',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02004128 'sources': files('system/main.c'),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004129 'dependencies': []
4130 }]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004131 if host_os == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004132 execs += [{
4133 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004134 'win_subsystem': 'windows',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02004135 'sources': files('system/main.c'),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004136 'dependencies': []
4137 }]
4138 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004139 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004140 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
4141 execs += [{
4142 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004143 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004144 'sources': specific_fuzz.sources(),
4145 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004146 }]
4147 endif
4148 else
4149 execs = [{
4150 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004151 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004152 'sources': [],
4153 'dependencies': []
4154 }]
4155 endif
4156 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01004157 exe_name = exe['name']
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004158 if host_os == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01004159 exe_name += '-unsigned'
4160 endif
4161
4162 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09004163 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004164 c_args: c_args,
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004165 dependencies: arch_deps + exe['dependencies'],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004166 objects: lib.extract_all_objects(recursive: true),
Paolo Bonzini05007252024-03-20 11:28:28 +01004167 link_depends: [block_syms, qemu_syms],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004168 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004169 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01004170
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004171 if host_os == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004172 icon = 'pc-bios/qemu.rsrc'
4173 build_input = [emulator, files(icon)]
4174 install_input = [
4175 get_option('bindir') / exe_name,
4176 meson.current_source_dir() / icon
4177 ]
4178 if 'CONFIG_HVF' in config_target
4179 entitlements = 'accel/hvf/entitlements.plist'
4180 build_input += files(entitlements)
4181 install_input += meson.current_source_dir() / entitlements
4182 endif
4183
Alexander Graf8a74ce62021-01-20 23:44:34 +01004184 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004185 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01004186 output: exe['name'],
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01004187 command: [entitlement, '@OUTPUT@', '@INPUT@'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01004188 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09004189
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01004190 meson.add_install_script(entitlement, '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09004191 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004192 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01004193 else
4194 emulators += {exe['name']: emulator}
4195 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04004196
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004197 traceable += [{
4198 'exe': exe['name'],
4199 'probe-prefix': 'qemu.' + target_type + '.' + target_name,
4200 }]
4201
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004202 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01004203endforeach
4204
Paolo Bonzini931049b2020-02-05 09:44:24 +01004205# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004206
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004207if get_option('plugins')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01004208 install_headers('include/qemu/qemu-plugin.h')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004209 if host_os == 'windows'
Greg Manning36fa0772023-11-06 18:51:06 +00004210 # On windows, we want to deliver the qemu_plugin_api.lib file in the qemu installer,
4211 # so that plugin authors can compile against it.
4212 install_data(win32_qemu_plugin_api_lib, install_dir: 'lib')
4213 endif
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01004214endif
4215
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004216subdir('qga')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02004217
Laurent Vivier9755c942020-08-24 17:24:30 +02004218# Don't build qemu-keymap if xkbcommon is not explicitly enabled
4219# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02004220if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04004221 # used for the update-keymaps target, so include rules even if !have_tools
4222 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
4223 dependencies: [qemuutil, xkbcommon], install: have_tools)
4224endif
4225
Paolo Bonzini931049b2020-02-05 09:44:24 +01004226if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004227 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004228 link_args: '@block.syms', link_depends: block_syms,
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004229 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
4230 qemu_io = executable('qemu-io', files('qemu-io.c'),
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004231 link_args: '@block.syms', link_depends: block_syms,
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004232 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01004233 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004234 link_args: '@block.syms', link_depends: block_syms,
Akihiko Odaki7b1070a2024-05-24 17:00:23 +09004235 dependencies: [blockdev, qemuutil, selinux],
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004236 install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004237
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02004238 subdir('storage-daemon')
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004239
4240 foreach exe: [ 'qemu-img', 'qemu-io', 'qemu-nbd', 'qemu-storage-daemon']
4241 traceable += [{
4242 'exe': exe,
4243 'probe-prefix': 'qemu.' + exe.substring(5).replace('-', '_')
4244 }]
4245 endforeach
4246
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04004247 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02004248
Marc-André Lureau157e7b12019-07-15 14:50:58 +04004249 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
4250 dependencies: qemuutil,
4251 install: true)
4252
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004253 if have_vhost_user
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02004254 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02004255 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04004256 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02004257 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01004258 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004259
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004260 if host_os == 'linux'
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004261 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
4262 dependencies: [qemuutil, libcap_ng],
4263 install: true,
4264 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004265
4266 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
4267 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02004268 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004269 install: true)
Anthony Harivel84369d72024-05-22 17:34:51 +02004270
4271 if cpu in ['x86', 'x86_64']
4272 executable('qemu-vmsr-helper', files('tools/i386/qemu-vmsr-helper.c'),
4273 dependencies: [authz, crypto, io, qom, qemuutil,
4274 libcap_ng, mpathpersist],
4275 install: true)
4276 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004277 endif
4278
Paolo Bonziniccd250a2021-06-03 12:50:17 +02004279 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04004280 subdir('contrib/ivshmem-client')
4281 subdir('contrib/ivshmem-server')
4282 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01004283endif
4284
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004285if stap.found()
4286 foreach t: traceable
4287 foreach stp: [
4288 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / t['exe'], 'install': false},
4289 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / t['exe'], 'install': true},
4290 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
4291 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
4292 ]
4293 cmd = [
4294 tracetool, '--group=all', '--format=' + stp['fmt'],
4295 '--binary=' + stp['bin'],
4296 '--probe-prefix=' + t['probe-prefix'],
4297 '@INPUT@', '@OUTPUT@'
4298 ]
4299
4300 custom_target(t['exe'] + stp['ext'],
4301 input: trace_events_all,
4302 output: t['exe'] + stp['ext'],
4303 install: stp['install'],
4304 install_dir: get_option('datadir') / 'systemtap/tapset',
4305 command: cmd,
4306 depend_files: tracetool_depends)
4307 endforeach
4308 endforeach
4309endif
4310
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04004311subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004312subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04004313subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02004314subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08004315subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01004316if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04004317 subdir('po')
4318endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004319
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004320if host_machine.system() == 'windows'
4321 nsis_cmd = [
4322 find_program('scripts/nsis.py'),
4323 '@OUTPUT@',
4324 get_option('prefix'),
4325 meson.current_source_dir(),
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02004326 glib_pc.get_variable('bindir'),
Stefan Weil24bdcc92020-11-25 20:18:33 +01004327 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004328 '--',
4329 '-DDISPLAYVERSION=' + meson.project_version(),
4330 ]
4331 if build_docs
4332 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
4333 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01004334 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004335 nsis_cmd += '-DCONFIG_GTK=y'
4336 endif
4337
4338 nsis = custom_target('nsis',
4339 output: 'qemu-setup-' + meson.project_version() + '.exe',
4340 input: files('qemu.nsi'),
4341 build_always_stale: true,
4342 command: nsis_cmd + ['@INPUT@'])
4343 alias_target('installer', nsis)
4344endif
4345
Paolo Bonzinia0c91622020-10-07 11:01:51 -04004346#########################
4347# Configuration summary #
4348#########################
4349
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004350# Build environment
Paolo Bonzinif9332752020-02-03 13:28:38 +01004351summary_info = {}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004352summary_info += {'Build directory': meson.current_build_dir()}
4353summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004354summary_info += {'Download dependencies': get_option('wrap_mode') != 'nodownload'}
4355summary(summary_info, bool_yn: true, section: 'Build environment')
4356
4357# Directories
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004358summary_info += {'Install prefix': get_option('prefix')}
4359summary_info += {'BIOS directory': qemu_datadir}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004360pathsep = host_os == 'windows' ? ';' : ':'
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09004361summary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004362summary_info += {'binary directory': get_option('prefix') / get_option('bindir')}
4363summary_info += {'library directory': get_option('prefix') / get_option('libdir')}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004364summary_info += {'module directory': qemu_moddir}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004365summary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
4366summary_info += {'include directory': get_option('prefix') / get_option('includedir')}
4367summary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004368if host_os != 'windows'
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004369 summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
4370 summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004371else
4372 summary_info += {'local state directory': 'queried at runtime'}
4373endif
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004374summary_info += {'Doc directory': get_option('prefix') / get_option('docdir')}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004375summary(summary_info, bool_yn: true, section: 'Directories')
4376
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004377# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004378summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004379summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004380summary_info += {'sphinx-build': sphinx_build}
Paolo Bonzinib4d61d32023-09-28 12:00:48 +02004381
4382# FIXME: the [binaries] section of machine files, which can be probed
4383# with find_program(), would be great for passing gdb and genisoimage
4384# paths from configure to Meson. However, there seems to be no way to
4385# hide a program (for example if gdb is too old).
Paolo Bonzinia47dd5c2023-09-28 10:44:56 +02004386if config_host.has_key('GDB')
4387 summary_info += {'gdb': config_host['GDB']}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004388endif
Paolo Bonzini40c909f2022-04-20 17:33:49 +02004389summary_info += {'iasl': iasl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004390summary_info += {'genisoimage': config_host['GENISOIMAGE']}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004391if host_os == 'windows' and have_ga
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004392 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004393endif
Thomas Huth58902582022-04-08 18:20:47 +02004394if slirp.found() and have_system
Paolo Bonzini35acbb32021-10-13 13:43:36 +02004395 summary_info += {'smbd': have_slirp_smbd ? smbd_path : false}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004396endif
4397summary(summary_info, bool_yn: true, section: 'Host binaries')
4398
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004399# Configurable features
4400summary_info = {}
4401summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004402summary_info += {'system-mode emulation': have_system}
4403summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004404summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004405summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini60027112022-10-20 14:53:10 +02004406summary_info += {'module support': enable_modules}
4407if enable_modules
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02004408 summary_info += {'alternative module path': get_option('module_upgrades')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004409endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004410summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004411if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02004412 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004413endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02004414summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
4415if 'simple' in get_option('trace_backends')
4416 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004417endif
Marc-André Lureau142ca622021-07-15 11:53:53 +04004418summary_info += {'D-Bus display': dbus_display}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004419summary_info += {'QOM debugging': get_option('qom_cast_debug')}
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004420summary_info += {'Relocatable install': get_option('relocatable')}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004421summary_info += {'vhost-kernel support': have_vhost_kernel}
4422summary_info += {'vhost-net support': have_vhost_net}
4423summary_info += {'vhost-user support': have_vhost_user}
4424summary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004425summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004426summary_info += {'vhost-vdpa support': have_vhost_vdpa}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004427summary_info += {'build guest agent': have_ga}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004428summary(summary_info, bool_yn: true, section: 'Configurable features')
4429
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004430# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004431summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004432summary_info += {'host CPU': cpu}
4433summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01004434summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
4435summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Thomas Huth785abf02023-07-06 08:47:36 +02004436if 'cpp' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004437 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004438else
4439 summary_info += {'C++ compiler': false}
4440endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004441if 'objc' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004442 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004443else
4444 summary_info += {'Objective-C compiler': false}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004445endif
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03004446summary_info += {'Rust support': have_rust}
4447if have_rust
Paolo Bonzini1a6ef6f2024-10-03 16:28:45 +03004448 summary_info += {'rustc version': rustc.version()}
4449 summary_info += {'rustc': ' '.join(rustc.cmd_array())}
4450 summary_info += {'Rust target': config_host['RUST_TARGET_TRIPLE']}
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03004451endif
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004452option_cflags = (get_option('debug') ? ['-g'] : [])
4453if get_option('optimization') != 'plain'
4454 option_cflags += ['-O' + get_option('optimization')]
4455endif
4456summary_info += {'CFLAGS': ' '.join(get_option('c_args') + option_cflags)}
Thomas Huth785abf02023-07-06 08:47:36 +02004457if 'cpp' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004458 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args') + option_cflags)}
Paolo Bonzini47b30832020-09-23 05:26:17 -04004459endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004460if 'objc' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004461 summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args') + option_cflags)}
Philippe Mathieu-Daudée910c7d2022-01-08 22:38:55 +01004462endif
Thomas Huth785abf02023-07-06 08:47:36 +02004463link_args = get_option('c_link_args')
Paolo Bonzini47b30832020-09-23 05:26:17 -04004464if link_args.length() > 0
4465 summary_info += {'LDFLAGS': ' '.join(link_args)}
4466endif
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004467summary_info += {'QEMU_CFLAGS': ' '.join(qemu_common_flags + qemu_cflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004468if 'cpp' in all_languages
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004469 summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_common_flags + qemu_cxxflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004470endif
4471if 'objc' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +01004472 summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_common_flags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004473endif
Paolo Bonzinid0651772022-04-20 17:33:34 +02004474summary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)}
Daniele Buonocdad7812020-12-04 18:06:11 -05004475summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004476summary_info += {'PIE': get_option('b_pie')}
Paolo Bonzinie58e55d2023-06-07 10:00:21 +02004477summary_info += {'static build': get_option('prefer_static')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004478summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinib87df902021-11-08 13:52:11 +01004479summary_info += {'membarrier': have_membarrier}
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04004480summary_info += {'debug graph lock': get_option('debug_graph_lock')}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004481summary_info += {'debug stack usage': get_option('debug_stack_usage')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004482summary_info += {'mutex debugging': get_option('debug_mutex')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004483summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01004484summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
ling xu04ffce12022-11-16 23:29:22 +08004485summary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004486summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzini34f983d2023-01-09 15:31:51 +01004487summary_info += {'thread sanitizer': get_option('tsan')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004488summary_info += {'CFI support': get_option('cfi')}
4489if get_option('cfi')
4490 summary_info += {'CFI debug support': get_option('cfi_debug')}
4491endif
4492summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004493summary_info += {'sparse': sparse}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004494summary_info += {'mingw32 support': host_os == 'windows'}
Paolo Bonzini12640f02022-06-06 11:48:47 +02004495summary(summary_info, bool_yn: true, section: 'Compilation')
Alex Bennée49e85652021-02-22 10:14:50 +00004496
4497# snarf the cross-compilation information for tests
Paolo Bonzini12640f02022-06-06 11:48:47 +02004498summary_info = {}
4499have_cross = false
Alex Bennée49e85652021-02-22 10:14:50 +00004500foreach target: target_dirs
Paolo Bonzinic7022a72022-09-29 12:42:07 +01004501 tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak'
Alex Bennée49e85652021-02-22 10:14:50 +00004502 if fs.exists(tcg_mak)
4503 config_cross_tcg = keyval.load(tcg_mak)
Alex Bennée85b141e2022-05-27 16:35:34 +01004504 if 'CC' in config_cross_tcg
Paolo Bonzini12640f02022-06-06 11:48:47 +02004505 summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
4506 have_cross = true
Alex Bennée49e85652021-02-22 10:14:50 +00004507 endif
Paolo Bonzini12640f02022-06-06 11:48:47 +02004508 endif
Alex Bennée49e85652021-02-22 10:14:50 +00004509endforeach
Paolo Bonzini12640f02022-06-06 11:48:47 +02004510if have_cross
4511 summary(summary_info, bool_yn: true, section: 'Cross compilers')
4512endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004513
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004514# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004515summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004516if have_system
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004517 summary_info += {'KVM support': config_all_accel.has_key('CONFIG_KVM')}
4518 summary_info += {'HVF support': config_all_accel.has_key('CONFIG_HVF')}
4519 summary_info += {'WHPX support': config_all_accel.has_key('CONFIG_WHPX')}
4520 summary_info += {'NVMM support': config_all_accel.has_key('CONFIG_NVMM')}
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02004521 summary_info += {'Xen support': xen.found()}
4522 if xen.found()
4523 summary_info += {'xen ctrl version': xen.version()}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004524 endif
Paolo Bonzini0d665492023-08-31 11:18:24 +02004525 summary_info += {'Xen emulation': config_all_devices.has_key('CONFIG_XEN_EMU')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004526endif
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004527summary_info += {'TCG support': config_all_accel.has_key('CONFIG_TCG')}
4528if config_all_accel.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004529 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +01004530 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004531 else
4532 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
4533 endif
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004534 summary_info += {'TCG plugins': get_option('plugins')}
Paolo Bonzini1d558c92023-08-28 11:48:30 +02004535 summary_info += {'TCG debug enabled': get_option('debug_tcg')}
Ilya Leoshkevich1f2355f2024-03-12 01:23:30 +01004536 if have_linux_user or have_bsd_user
4537 summary_info += {'syscall buffer debugging support': get_option('debug_remap')}
4538 endif
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004539endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004540summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004541if have_system
4542 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01004543 summary_info += {'out of process emulation': multiprocess_allowed}
Jagannathan Raman55116962022-06-13 16:26:24 -04004544 summary_info += {'vfio-user server': vfio_user_server_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004545endif
4546summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
4547
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004548# Block layer
4549summary_info = {}
Paolo Bonzini67398252022-10-12 13:19:35 +02004550summary_info += {'coroutine backend': coroutine_backend}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004551summary_info += {'coroutine pool': have_coroutine_pool}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004552if have_block
Paolo Bonzini622d64f2022-04-20 17:33:53 +02004553 summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
4554 summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004555 summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
Christian Schoenebeck38877022023-05-11 16:12:34 +02004556 summary_info += {'VirtFS (9P) support': have_virtfs}
Paolo Bonzini406523f2021-10-13 11:43:54 +02004557 summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004558 summary_info += {'bochs support': get_option('bochs').allowed()}
4559 summary_info += {'cloop support': get_option('cloop').allowed()}
4560 summary_info += {'dmg support': get_option('dmg').allowed()}
4561 summary_info += {'qcow v1 support': get_option('qcow1').allowed()}
4562 summary_info += {'vdi support': get_option('vdi').allowed()}
Vladimir Sementsov-Ogievskiy11cea422023-04-21 12:27:58 +03004563 summary_info += {'vhdx support': get_option('vhdx').allowed()}
4564 summary_info += {'vmdk support': get_option('vmdk').allowed()}
4565 summary_info += {'vpc support': get_option('vpc').allowed()}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004566 summary_info += {'vvfat support': get_option('vvfat').allowed()}
4567 summary_info += {'qed support': get_option('qed').allowed()}
4568 summary_info += {'parallels support': get_option('parallels').allowed()}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004569 summary_info += {'FUSE exports': fuse}
Xie Yongji2a2359b2022-05-23 16:46:09 +08004570 summary_info += {'VDUSE block exports': have_vduse_blk_export}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004571endif
4572summary(summary_info, bool_yn: true, section: 'Block layer support')
4573
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004574# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004575summary_info = {}
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02004576summary_info += {'TLS priority': get_option('tls_priority')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004577summary_info += {'GNUTLS support': gnutls}
4578if gnutls.found()
4579 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
4580endif
4581summary_info += {'libgcrypt': gcrypt}
4582summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02004583if nettle.found()
4584 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004585endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08004586summary_info += {'SM4 ALG support': crypto_sm4}
Paolo Bonzini34b52612021-11-08 14:02:42 +01004587summary_info += {'AF_ALG support': have_afalg}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004588summary_info += {'rng-none': get_option('rng_none')}
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02004589summary_info += {'Linux keyring': have_keyring}
Thomas Huthc64023b2023-08-24 11:42:08 +02004590summary_info += {'Linux keyutils': keyutils}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004591summary(summary_info, bool_yn: true, section: 'Crypto')
4592
Thomas Huth9e48afa2023-06-02 19:18:30 +02004593# UI
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004594summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004595if host_os == 'darwin'
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03004596 summary_info += {'Cocoa support': cocoa}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004597endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004598summary_info += {'SDL support': sdl}
4599summary_info += {'SDL image support': sdl_image}
4600summary_info += {'GTK support': gtk}
4601summary_info += {'pixman': pixman}
4602summary_info += {'VTE support': vte}
Kshitij Suri95f85102022-04-08 07:13:34 +00004603summary_info += {'PNG support': png}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004604summary_info += {'VNC support': vnc}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01004605if vnc.found()
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004606 summary_info += {'VNC SASL support': sasl}
4607 summary_info += {'VNC JPEG support': jpeg}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004608endif
Thomas Huth9e48afa2023-06-02 19:18:30 +02004609summary_info += {'spice protocol support': spice_protocol}
4610if spice_protocol.found()
4611 summary_info += {' spice server support': spice}
4612endif
4613summary_info += {'curses support': curses}
4614summary_info += {'brlapi support': brlapi}
4615summary(summary_info, bool_yn: true, section: 'User interface')
4616
Alex Bennéef705c1f2023-12-22 11:48:46 +00004617# Graphics backends
4618summary_info = {}
4619summary_info += {'VirGL support': virgl}
4620summary_info += {'Rutabaga support': rutabaga}
4621summary(summary_info, bool_yn: true, section: 'Graphics backends')
4622
Thomas Huthaece7232023-06-02 19:18:32 +02004623# Audio backends
4624summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004625if host_os not in ['darwin', 'haiku', 'windows']
Paolo Bonzini87430d52021-10-07 15:06:09 +02004626 summary_info += {'OSS support': oss}
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02004627 summary_info += {'sndio support': sndio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004628elif host_os == 'darwin'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004629 summary_info += {'CoreAudio support': coreaudio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004630elif host_os == 'windows'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004631 summary_info += {'DirectSound support': dsound}
4632endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004633if host_os == 'linux'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004634 summary_info += {'ALSA support': alsa}
4635 summary_info += {'PulseAudio support': pulse}
4636endif
Marc-André Lureau20c51242023-05-06 20:37:26 +04004637summary_info += {'PipeWire support': pipewire}
Paolo Bonzini87430d52021-10-07 15:06:09 +02004638summary_info += {'JACK support': jack}
Thomas Huthaece7232023-06-02 19:18:32 +02004639summary(summary_info, bool_yn: true, section: 'Audio backends')
4640
Thomas Huthc3527c52023-06-02 19:18:31 +02004641# Network backends
Thomas Huth9e48afa2023-06-02 19:18:30 +02004642summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004643if host_os == 'darwin'
Thomas Huth9e48afa2023-06-02 19:18:30 +02004644 summary_info += {'vmnet.framework support': vmnet}
4645endif
Ilya Maximetscb039ef2023-09-13 20:34:37 +02004646summary_info += {'AF_XDP support': libxdp}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004647summary_info += {'slirp support': slirp}
Paolo Bonzinie1723992021-10-07 15:08:21 +02004648summary_info += {'vde support': vde}
Paolo Bonzini837b84b2021-10-07 15:08:22 +02004649summary_info += {'netmap support': have_netmap}
Thomas Hutheea94532021-10-28 20:59:08 +02004650summary_info += {'l2tpv3 support': have_l2tpv3}
Thomas Huthc3527c52023-06-02 19:18:31 +02004651summary(summary_info, bool_yn: true, section: 'Network backends')
4652
4653# Libraries
4654summary_info = {}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004655summary_info += {'libtasn1': tasn1}
4656summary_info += {'PAM': pam}
4657summary_info += {'iconv support': iconv}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004658summary_info += {'blkio support': blkio}
4659summary_info += {'curl support': curl}
4660summary_info += {'Multipath support': mpathpersist}
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02004661summary_info += {'Linux AIO support': libaio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004662summary_info += {'Linux io_uring support': linux_io_uring}
4663summary_info += {'ATTR/XATTR support': libattr}
Paolo Bonzini3730a732022-04-20 17:33:41 +02004664summary_info += {'RDMA support': rdma}
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01004665summary_info += {'fdt support': fdt_opt == 'internal' ? 'internal' : fdt}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004666summary_info += {'libcap-ng support': libcap_ng}
4667summary_info += {'bpf support': libbpf}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004668summary_info += {'rbd support': rbd}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004669summary_info += {'smartcard support': cacard}
4670summary_info += {'U2F support': u2f}
4671summary_info += {'libusb': libusb}
4672summary_info += {'usb net redir': usbredir}
Paolo Bonzini88b6e612022-04-20 17:33:40 +02004673summary_info += {'OpenGL support (epoxy)': opengl}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004674summary_info += {'GBM': gbm}
4675summary_info += {'libiscsi support': libiscsi}
4676summary_info += {'libnfs support': libnfs}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004677if host_os == 'windows'
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004678 if have_ga
Marc-André Lureau8821a382022-02-01 16:53:43 +04004679 summary_info += {'QGA VSS support': have_qga_vss}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01004680 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01004681endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004682summary_info += {'seccomp support': seccomp}
4683summary_info += {'GlusterFS support': glusterfs}
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02004684summary_info += {'hv-balloon support': hv_balloon}
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01004685summary_info += {'TPM support': have_tpm}
Thomas Huthe6a52b32021-12-09 15:48:01 +01004686summary_info += {'libssh support': libssh}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004687summary_info += {'lzo support': lzo}
4688summary_info += {'snappy support': snappy}
4689summary_info += {'bzip2 support': libbzip2}
4690summary_info += {'lzfse support': liblzfse}
4691summary_info += {'zstd support': zstd}
Yuan Liub844a2c2024-06-10 18:21:06 +08004692summary_info += {'Query Processing Library support': qpl}
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01004693summary_info += {'UADK Library support': uadk}
Bryan Zhange28ed312024-08-30 16:27:19 -07004694summary_info += {'qatzip support': qatzip}
Paolo Bonzini488a8c72021-12-21 12:38:27 +01004695summary_info += {'NUMA host support': numa}
Thomas Huth83602082022-05-16 16:58:23 +02004696summary_info += {'capstone': capstone}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004697summary_info += {'libpmem support': libpmem}
4698summary_info += {'libdaxctl support': libdaxctl}
4699summary_info += {'libudev': libudev}
4700# Dummy dependency, keep .found()
Max Reitzdf4ea702020-10-27 20:05:46 +01004701summary_info += {'FUSE lseek': fuse_lseek.found()}
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004702summary_info += {'selinux': selinux}
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01004703summary_info += {'libdw': libdw}
Ilya Leoshkevicha1a98002024-02-06 01:22:03 +01004704if host_os == 'freebsd'
4705 summary_info += {'libinotify-kqueue': inotify}
4706endif
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01004707summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004708
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004709if host_arch == 'unknown'
Paolo Bonzinif9332752020-02-03 13:28:38 +01004710 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004711 warning('UNSUPPORTED HOST CPU')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004712 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004713 message('Support for CPU host architecture ' + cpu + ' is not currently')
4714 message('maintained. The QEMU project does not guarantee that QEMU will')
4715 message('compile or work on this host CPU. You can help by volunteering')
4716 message('to maintain it and providing a build host for our continuous')
4717 message('integration setup.')
4718 if get_option('tcg').allowed() and target_dirs.length() > 0
4719 message()
4720 message('configure has succeeded and you can continue to build, but')
4721 message('QEMU will use a slow interpreter to emulate the target CPU.')
4722 endif
Paolo Bonzini14ed29d2024-10-27 14:07:01 +01004723elif host_arch == 'mips'
4724 message()
4725 warning('DEPRECATED HOST CPU')
4726 message()
4727 message('Support for CPU host architecture ' + cpu + ' is going to be')
4728 message('dropped as soon as the QEMU project stops supporting Debian 12')
4729 message('("Bookworm"). Going forward, the QEMU project will not guarantee')
4730 message('that QEMU will compile or work on this host CPU.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004731endif
4732
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004733if not supported_oses.contains(host_os)
Paolo Bonzinif9332752020-02-03 13:28:38 +01004734 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004735 warning('UNSUPPORTED HOST OS')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004736 message()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004737 message('Support for host OS ' + host_os + 'is not currently maintained.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004738 message('configure has succeeded and you can continue to build, but')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004739 message('the QEMU project does not guarantee that QEMU will compile or')
4740 message('work on this operating system. You can help by volunteering')
4741 message('to maintain it and providing a build host for our continuous')
4742 message('integration setup. This will ensure that future versions of QEMU')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004743 message('will keep working on ' + host_os + '.')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004744endif
4745
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004746if host_arch == 'unknown' or not supported_oses.contains(host_os)
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004747 message()
4748 message('If you want to help supporting QEMU on this platform, please')
4749 message('contact the developers at qemu-devel@nongnu.org.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004750endif
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004751
4752actually_reloc = get_option('relocatable')
4753# check if get_relocated_path() is actually able to relocate paths
4754if get_option('relocatable') and \
4755 not (get_option('prefix') / get_option('bindir')).startswith(get_option('prefix') / '')
4756 message()
4757 warning('bindir not included within prefix, the installation will not be relocatable.')
4758 actually_reloc = false
4759endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004760if not actually_reloc and (host_os == 'windows' or get_option('relocatable'))
4761 if host_os == 'windows'
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004762 message()
4763 warning('Windows installs should usually be relocatable.')
4764 endif
4765 message()
4766 message('QEMU will have to be installed under ' + get_option('prefix') + '.')
4767 message('Use --disable-relocatable to remove this warning.')
4768endif