blob: 8dc53c12fba8309802d04339f6d46f697fc6731d [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
2175 libxdp = dependency('libxdp', required: get_option('af_xdp'),
2176 version: '>=1.4.0', method: 'pkg-config')
2177endif
2178
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002179# libdw
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002180libdw = not_found
Ilya Leoshkevich550c6d92023-02-10 01:52:08 +01002181if not get_option('libdw').auto() or \
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02002182 (not get_option('prefer_static') and (have_system or have_user))
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002183 libdw = dependency('libdw',
2184 method: 'pkg-config',
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01002185 required: get_option('libdw'))
2186endif
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002187
Paolo Bonzini87430d52021-10-07 15:06:09 +02002188#################
2189# config-host.h #
2190#################
2191
Paolo Bonzini95933f12023-09-08 12:10:08 +02002192config_host_data = configuration_data()
2193
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03002194config_host_data.set('CONFIG_HAVE_RUST', have_rust)
Paolo Bonzini87430d52021-10-07 15:06:09 +02002195audio_drivers_selected = []
2196if have_system
2197 audio_drivers_available = {
2198 'alsa': alsa.found(),
2199 'coreaudio': coreaudio.found(),
2200 'dsound': dsound.found(),
2201 'jack': jack.found(),
2202 'oss': oss.found(),
2203 'pa': pulse.found(),
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02002204 'pipewire': pipewire.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002205 'sdl': sdl.found(),
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002206 'sndio': sndio.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02002207 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02002208 foreach k, v: audio_drivers_available
2209 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
2210 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02002211
2212 # Default to native drivers first, OSS second, SDL third
2213 audio_drivers_priority = \
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02002214 [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002215 (host_os == 'linux' ? [] : [ 'sdl' ])
Paolo Bonzini87430d52021-10-07 15:06:09 +02002216 audio_drivers_default = []
2217 foreach k: audio_drivers_priority
2218 if audio_drivers_available[k]
2219 audio_drivers_default += k
2220 endif
2221 endforeach
2222
2223 foreach k: get_option('audio_drv_list')
2224 if k == 'default'
2225 audio_drivers_selected += audio_drivers_default
2226 elif not audio_drivers_available[k]
2227 error('Audio driver "@0@" not available.'.format(k))
2228 else
2229 audio_drivers_selected += k
2230 endif
2231 endforeach
2232endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02002233config_host_data.set('CONFIG_AUDIO_DRIVERS',
2234 '"' + '", "'.join(audio_drivers_selected) + '", ')
2235
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002236have_host_block_device = (host_os != 'darwin' or
Joelle van Dyne14176c82021-03-15 11:03:38 -07002237 cc.has_header('IOKit/storage/IOMedia.h'))
2238
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002239dbus_display = get_option('dbus_display') \
2240 .require(gio.version().version_compare('>=2.64'),
2241 error_message: '-display dbus requires glib>=2.64') \
Paolo Bonzini75440602022-04-20 17:33:44 +02002242 .require(gdbus_codegen.found(),
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02002243 error_message: gdbus_codegen_error.format('-display dbus')) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002244 .allowed()
Marc-André Lureau142ca622021-07-15 11:53:53 +04002245
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002246have_virtfs = get_option('virtfs') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002247 .require(host_os == 'linux' or host_os == 'darwin',
Keno Fischer0fb1e192022-02-27 17:35:22 -05002248 error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002249 .require(host_os == 'linux' or cc.has_function('pthread_fchdir_np'),
Keno Fischer0fb1e192022-02-27 17:35:22 -05002250 error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002251 .require(host_os == 'darwin' or libattr.found(),
Peter Foley1a67e072023-05-03 09:07:56 -04002252 error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002253 .disable_auto_if(not have_tools and not have_system) \
2254 .allowed()
Paolo Bonzini69202b42020-11-17 14:46:21 +01002255
Daniel P. Berrangé4bb3da42024-07-12 14:24:44 +01002256qga_fsfreeze = false
2257qga_fstrim = false
2258if host_os == 'linux'
2259 if cc.has_header_symbol('linux/fs.h', 'FIFREEZE')
2260 qga_fsfreeze = true
2261 endif
2262 if cc.has_header_symbol('linux/fs.h', 'FITRIM')
2263 qga_fstrim = true
2264 endif
2265elif host_os == 'freebsd' and cc.has_header_symbol('ufs/ffs/fs.h', 'UFSSUSPEND')
2266 qga_fsfreeze = true
2267endif
2268
Paolo Bonzini622d64f2022-04-20 17:33:53 +02002269if get_option('block_drv_ro_whitelist') == ''
2270 config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
2271else
2272 config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
2273 '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
2274endif
2275if get_option('block_drv_rw_whitelist') == ''
2276 config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
2277else
2278 config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
2279 '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
2280endif
2281
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002282foreach k : get_option('trace_backends')
2283 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
2284endforeach
2285config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02002286config_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
Paolo Bonzini40c909f2022-04-20 17:33:49 +02002287if iasl.found()
2288 config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
Paolo Bonzini5dc46182021-10-13 13:19:00 +02002289endif
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002290config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
2291config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
2292config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
2293config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
2294config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09002295
2296qemu_firmwarepath = ''
2297foreach k : get_option('qemu_firmwarepath')
2298 qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
2299endforeach
2300config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
2301
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002302config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
2303config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
2304config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
2305config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
2306config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
2307config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
2308
Paolo Bonzini60027112022-10-20 14:53:10 +02002309if enable_modules
Paolo Bonzinib0b43232022-04-20 17:33:54 +02002310 config_host_data.set('CONFIG_STAMP', run_command(
2311 meson.current_source_dir() / 'scripts/qemu-stamp.py',
2312 meson.project_version(), get_option('pkgversion'), '--',
2313 meson.current_source_dir() / 'configure',
2314 capture: true, check: true).stdout().strip())
2315endif
2316
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002317have_slirp_smbd = get_option('slirp_smbd') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002318 .require(host_os != 'windows', error_message: 'Host smbd not supported on this platform.') \
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002319 .allowed()
2320if have_slirp_smbd
2321 smbd_path = get_option('smbd')
2322 if smbd_path == ''
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002323 smbd_path = (host_os == 'sunos' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002324 endif
2325 config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
2326endif
2327
Paolo Bonzini823eb012021-11-08 14:18:17 +01002328config_host_data.set('HOST_' + host_arch.to_upper(), 1)
2329
Paolo Bonzini95933f12023-09-08 12:10:08 +02002330kvm_targets_c = '""'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002331if get_option('kvm').allowed() and host_os == 'linux'
Paolo Bonzini95933f12023-09-08 12:10:08 +02002332 kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
2333endif
2334config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
2335
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02002336if get_option('module_upgrades') and not enable_modules
2337 error('Cannot enable module-upgrades as modules are not enabled')
2338endif
2339config_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
2340
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002341config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002342config_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002343config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002344config_host_data.set('CONFIG_BSD', host_os in bsd_oses)
Daniel P. Berrangé4be55a42024-07-12 14:24:54 +01002345config_host_data.set('CONFIG_FREEBSD', host_os == 'freebsd')
Paolo Bonzinia775c712023-09-08 12:09:22 +02002346config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04002347config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002348config_host_data.set('CONFIG_DARWIN', host_os == 'darwin')
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01002349config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini537b7242021-10-07 15:08:12 +02002350config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02002351config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002352config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002353config_host_data.set('CONFIG_LINUX', host_os == 'linux')
2354config_host_data.set('CONFIG_POSIX', host_os != 'windows')
2355config_host_data.set('CONFIG_WIN32', host_os == 'windows')
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002356config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002357config_host_data.set('CONFIG_MPATH', mpathpersist.found())
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04002358config_host_data.set('CONFIG_BLKIO', blkio.found())
Stefano Garzarella98b126f2023-05-30 09:19:41 +02002359if blkio.found()
2360 config_host_data.set('CONFIG_BLKIO_VHOST_VDPA_FD',
2361 blkio.version().version_compare('>=1.3.0'))
Stefano Garzarella547c4e52024-08-08 10:05:45 +02002362 config_host_data.set('CONFIG_BLKIO_WRITE_ZEROS_FUA',
2363 blkio.version().version_compare('>=1.4.0'))
Stefano Garzarella98b126f2023-05-30 09:19:41 +02002364endif
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002365config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08002366config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02002367config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini75440602022-04-20 17:33:44 +02002368config_host_data.set('CONFIG_GIO', gio.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002369config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
2370if glusterfs.found()
2371 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
2372 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
2373 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
2374 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
2375 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
2376 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
2377endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002378config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02002379config_host_data.set('CONFIG_VTE', vte.found())
Claudio Fontana29e0bff2022-11-21 14:55:38 +01002380config_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard)
Taylor Simpson63efb6a2023-04-27 15:59:52 -07002381config_host_data.set('CONFIG_HEXAGON_IDEF_PARSER', get_option('hexagon_idef_parser'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002382config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002383config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002384config_host_data.set('CONFIG_EBPF', libbpf.found())
Ilya Maximetscb039ef2023-09-13 20:34:37 +02002385config_host_data.set('CONFIG_AF_XDP', libxdp.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002386config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002387config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01002388config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Thomas Huthe6a52b32021-12-09 15:48:01 +01002389config_host_data.set('CONFIG_LIBSSH', libssh.found())
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02002390config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002391config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
2392config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzini60027112022-10-20 14:53:10 +02002393config_host_data.set('CONFIG_MODULES', enable_modules)
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002394config_host_data.set('CONFIG_NUMA', numa.found())
Michal Privoznik6bb613f2022-12-15 10:55:03 +01002395if numa.found()
2396 config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY',
2397 cc.has_function('numa_has_preferred_many',
2398 dependencies: numa))
2399endif
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002400config_host_data.set('CONFIG_OPENGL', opengl.found())
Paolo Bonzini2c13c572023-08-30 12:20:53 +02002401config_host_data.set('CONFIG_PLUGIN', get_option('plugins'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002402config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini3730a732022-04-20 17:33:41 +02002403config_host_data.set('CONFIG_RDMA', rdma.found())
Paolo Bonzini655e2a72023-10-05 14:19:34 +02002404config_host_data.set('CONFIG_RELOCATABLE', get_option('relocatable'))
Paolo Bonzini721fa5e2022-10-12 11:59:51 +02002405config_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002406config_host_data.set('CONFIG_SDL', sdl.found())
2407config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01002408config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Michal Privoznik73422d92022-10-26 09:30:24 +02002409if seccomp.found()
2410 config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
2411endif
Marc-André Lureaucca15752023-08-30 13:38:25 +04002412config_host_data.set('CONFIG_PIXMAN', pixman.found())
Paolo Bonzinia775c712023-09-08 12:09:22 +02002413config_host_data.set('CONFIG_SLIRP', slirp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01002414config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002415config_host_data.set('CONFIG_SOLARIS', host_os == 'sunos')
Paolo Bonzini875be2872022-02-15 11:37:00 +01002416if get_option('tcg').allowed()
2417 config_host_data.set('CONFIG_TCG', 1)
2418 config_host_data.set('CONFIG_TCG_INTERPRETER', tcg_arch == 'tci')
2419endif
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002420config_host_data.set('CONFIG_TPM', have_tpm)
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002421config_host_data.set('CONFIG_TSAN', get_option('tsan'))
Paolo Bonzini90540f32021-06-03 11:15:26 +02002422config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Paolo Bonzinie1723992021-10-07 15:08:21 +02002423config_host_data.set('CONFIG_VDE', vde.found())
Stefan Hajnoczic0c4f142023-10-03 21:45:32 -04002424config_host_data.set('CONFIG_VHOST', have_vhost)
Paolo Bonzini2df89d52022-04-20 17:34:07 +02002425config_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
2426config_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
2427config_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
2428config_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
2429config_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
2430config_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
2431config_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03002432config_host_data.set('CONFIG_VMNET', vmnet.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002433config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Xie Yongji2a2359b2022-05-23 16:46:09 +08002434config_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
Kshitij Suri95f85102022-04-08 07:13:34 +00002435config_host_data.set('CONFIG_PNG', png.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002436config_host_data.set('CONFIG_VNC', vnc.found())
2437config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002438config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini95933f12023-09-08 12:10:08 +02002439if virgl.found()
Dmitry Osipenkoffac9642024-10-25 00:03:04 +03002440 config_host_data.set('VIRGL_VERSION_MAJOR', virgl.version().split('.')[0])
Paolo Bonzini95933f12023-09-08 12:10:08 +02002441endif
Paolo Bonzini69202b42020-11-17 14:46:21 +01002442config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002443config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002444config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04002445config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04002446config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02002447config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01002448config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Daniel P. Berrangéd47b83b2022-04-26 17:00:43 +01002449config_host_data.set('CONFIG_TASN1', tasn1.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002450config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
2451config_host_data.set('CONFIG_NETTLE', nettle.found())
Hyman Huang52ed9f42023-12-07 23:47:35 +08002452config_host_data.set('CONFIG_CRYPTO_SM4', crypto_sm4.found())
Lei He4c5e5122022-05-25 17:01:14 +08002453config_host_data.set('CONFIG_HOGWEED', hogweed.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002454config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002455config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01002456config_host_data.set('CONFIG_STATX', has_statx)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002457config_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id)
Paolo Bonzinib1def332020-11-17 13:37:39 +01002458config_host_data.set('CONFIG_ZSTD', zstd.found())
Yuan Liub844a2c2024-06-10 18:21:06 +08002459config_host_data.set('CONFIG_QPL', qpl.found())
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01002460config_host_data.set('CONFIG_UADK', uadk.found())
Bryan Zhange28ed312024-08-30 16:27:19 -07002461config_host_data.set('CONFIG_QATZIP', qatzip.found())
Max Reitza484a712020-10-27 20:05:41 +01002462config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01002463config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002464config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
Marc-André Lureauddece462021-10-06 14:18:09 +04002465if spice_protocol.found()
2466config_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
2467config_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
2468config_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
2469endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002470config_host_data.set('CONFIG_SPICE', spice.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01002471config_host_data.set('CONFIG_X11', x11.found())
Marc-André Lureau142ca622021-07-15 11:53:53 +04002472config_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
Daniele Buono9e62ba42020-12-04 18:06:14 -05002473config_host_data.set('CONFIG_CFI', get_option('cfi'))
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002474config_host_data.set('CONFIG_SELINUX', selinux.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002475config_host_data.set('CONFIG_XEN_BACKEND', xen.found())
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002476config_host_data.set('CONFIG_LIBDW', libdw.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002477if xen.found()
2478 # protect from xen.version() having less than three components
2479 xen_version = xen.version().split('.') + ['0', '0']
2480 xen_ctrl_version = xen_version[0] + \
2481 ('0' + xen_version[1]).substring(-2) + \
2482 ('0' + xen_version[2]).substring(-2)
2483 config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
2484endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002485config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
2486config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
2487config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
2488config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
2489
Paolo Bonzinia6305082021-10-07 15:08:15 +02002490config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002491config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
2492
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002493have_coroutine_pool = get_option('coroutine_pool')
2494if get_option('debug_stack_usage') and have_coroutine_pool
2495 message('Disabling coroutine pool to measure stack usage')
2496 have_coroutine_pool = false
2497endif
Paolo Bonzini230f6e02023-10-05 14:31:27 +02002498config_host_data.set('CONFIG_COROUTINE_POOL', have_coroutine_pool)
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04002499config_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002500config_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002501config_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
Paolo Bonzini1d558c92023-08-28 11:48:30 +02002502config_host_data.set('CONFIG_DEBUG_TCG', get_option('debug_tcg'))
Ilya Leoshkevich1f2355f2024-03-12 01:23:30 +01002503config_host_data.set('CONFIG_DEBUG_REMAP', get_option('debug_remap'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002504config_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
Juan Quintelaabad1852022-09-02 18:51:25 +02002505config_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
Daniel P. Berrangé4bb3da42024-07-12 14:24:44 +01002506config_host_data.set('CONFIG_FSFREEZE', qga_fsfreeze)
2507config_host_data.set('CONFIG_FSTRIM', qga_fstrim)
Paolo Bonzini406523f2021-10-13 11:43:54 +02002508
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002509# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002510config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002511config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
2512config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
Thomas Huth48f670e2020-11-18 18:10:52 +01002513config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01002514config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Michael Vogt97299302024-10-01 17:14:54 +02002515config_host_data.set('HAVE_OPENAT2_H', cc.has_header('linux/openat2.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01002516config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002517config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01002518config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01002519config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002520if host_os == 'windows'
Bin Mengd4093732022-08-02 15:51:58 +08002521 config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
2522endif
Thomas Huthded5d782020-11-14 11:10:11 +01002523
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002524# has_function
Claudio Imbrendac891c242022-08-12 15:34:53 +02002525config_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002526config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002527config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
2528config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
2529config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
2530config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Paolo Bonzini67504852023-06-21 00:47:31 +02002531config_host_data.set('CONFIG_GETCPU', cc.has_function('getcpu', prefix: gnu_source_prefix))
2532config_host_data.set('CONFIG_SCHED_GETCPU', cc.has_function('sched_getcpu', prefix: '#include <sched.h>'))
Peter Maydell86983432022-02-26 18:07:19 +00002533# Note that we need to specify prefix: here to avoid incorrectly
2534# thinking that Windows has posix_memalign()
2535config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
Peter Maydell5c8c7142022-02-26 18:07:20 +00002536config_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
Peter Maydell88454f82022-02-26 18:07:21 +00002537config_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
2538config_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002539config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002540config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Keno Fischer029ed1b2022-02-27 17:35:20 -05002541config_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002542config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
2543config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
2544config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
2545config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
2546config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002547config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Andrew Deason59e35c72022-04-26 14:55:22 -05002548config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02002549config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)
Manos Pitsidianakisdc43b182024-10-03 16:28:48 +03002550config_host_data.set('HAVE_GLIB_WITH_ALIGNED_ALLOC', glib_has_aligned_alloc)
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002551config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002552config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002553config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Stefano Garzarella66dc5f92022-05-17 09:10:12 +02002554if rbd.found()
2555 config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
2556 cc.has_function('rbd_namespace_exists',
2557 dependencies: rbd,
2558 prefix: '#include <rbd/librbd.h>'))
2559endif
Li Zhijian911965a2021-09-10 15:02:55 +08002560if rdma.found()
2561 config_host_data.set('HAVE_IBV_ADVISE_MR',
2562 cc.has_function('ibv_advise_mr',
Paolo Bonzini3730a732022-04-20 17:33:41 +02002563 dependencies: rdma,
Li Zhijian911965a2021-09-10 15:02:55 +08002564 prefix: '#include <infiniband/verbs.h>'))
2565endif
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002566
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002567have_asan_fiber = false
Richard Hendersoncb771ac2024-08-13 19:52:15 +10002568if get_option('asan') and \
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002569 not cc.has_function('__sanitizer_start_switch_fiber',
2570 args: '-fsanitize=address',
2571 prefix: '#include <sanitizer/asan_interface.h>')
2572 warning('Missing ASAN due to missing fiber annotation interface')
2573 warning('Without code annotation, the report may be inferior.')
2574else
2575 have_asan_fiber = true
2576endif
2577config_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber)
2578
Ilya Leoshkevicha1a98002024-02-06 01:22:03 +01002579have_inotify_init = cc.has_header_symbol('sys/inotify.h', 'inotify_init')
2580have_inotify_init1 = cc.has_header_symbol('sys/inotify.h', 'inotify_init1')
2581inotify = not_found
2582if (have_inotify_init or have_inotify_init1) and host_os == 'freebsd'
2583 # libinotify-kqueue
2584 inotify = cc.find_library('inotify')
2585 if have_inotify_init
2586 have_inotify_init = inotify.found()
2587 endif
2588 if have_inotify_init1
2589 have_inotify_init1 = inotify.found()
2590 endif
2591endif
2592config_host_data.set('CONFIG_INOTIFY', have_inotify_init)
2593config_host_data.set('CONFIG_INOTIFY1', have_inotify_init1)
2594
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002595# has_header_symbol
Sam Li6d43eaa2023-05-08 12:55:28 +08002596config_host_data.set('CONFIG_BLKZONED',
2597 cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002598config_host_data.set('CONFIG_EPOLL_CREATE1',
2599 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
2600config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
2601 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
2602 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
2603config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
2604 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
2605config_host_data.set('CONFIG_FIEMAP',
2606 cc.has_header('linux/fiemap.h') and
2607 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002608config_host_data.set('CONFIG_GETRANDOM',
2609 cc.has_function('getrandom') and
2610 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002611config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
2612 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002613config_host_data.set('CONFIG_RTNETLINK',
2614 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
2615config_host_data.set('CONFIG_SYSMACROS',
2616 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002617config_host_data.set('HAVE_OPTRESET',
2618 cc.has_header_symbol('getopt.h', 'optreset'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04002619config_host_data.set('HAVE_IPPROTO_MPTCP',
2620 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002621
2622# has_member
2623config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
2624 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
2625 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002626config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
2627 cc.has_member('struct stat', 'st_atim',
2628 prefix: '#include <sys/stat.h>'))
Sam Li6d43eaa2023-05-08 12:55:28 +08002629config_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY',
2630 cc.has_member('struct blk_zone', 'capacity',
2631 prefix: '#include <linux/blkzoned.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002632
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002633# has_type
2634config_host_data.set('CONFIG_IOVEC',
2635 cc.has_type('struct iovec',
2636 prefix: '#include <sys/uio.h>'))
2637config_host_data.set('HAVE_UTMPX',
2638 cc.has_type('struct utmpx',
2639 prefix: '#include <utmpx.h>'))
2640
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002641config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002642 #include <sys/eventfd.h>
2643 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002644config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002645 #include <unistd.h>
2646 int main(void) {
2647 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2648 return fdatasync(0);
2649 #else
2650 #error Not supported
2651 #endif
2652 }'''))
Andrew Deason8900c202022-03-15 22:52:25 -05002653
2654has_madvise = cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002655 #include <sys/types.h>
2656 #include <sys/mman.h>
2657 #include <stddef.h>
Andrew Deason8900c202022-03-15 22:52:25 -05002658 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
2659missing_madvise_proto = false
2660if has_madvise
2661 # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
2662 # but forget to prototype it. In this case, has_madvise will be true (the
2663 # test program links despite a compile warning). To detect the
2664 # missing-prototype case, we try again with a definitely-bogus prototype.
2665 # This will only compile if the system headers don't provide the prototype;
2666 # otherwise the conflicting prototypes will cause a compiler error.
2667 missing_madvise_proto = cc.links(gnu_source_prefix + '''
2668 #include <sys/types.h>
2669 #include <sys/mman.h>
2670 #include <stddef.h>
2671 extern int madvise(int);
2672 int main(void) { return madvise(0); }''')
2673endif
2674config_host_data.set('CONFIG_MADVISE', has_madvise)
2675config_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
2676
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002677config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002678 #include <sys/mman.h>
2679 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002680config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002681 #include <fcntl.h>
2682 #if !defined(AT_EMPTY_PATH)
2683 # error missing definition
2684 #else
2685 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2686 #endif'''))
Michal Privoznik12d7d0c2024-06-05 12:44:54 +02002687
2688# On Darwin posix_madvise() has the same return semantics as plain madvise(),
2689# i.e. errno is set and -1 is returned. That's not really how POSIX defines the
2690# function. On the flip side, it has madvise() which is preferred anyways.
2691if host_os != 'darwin'
2692 config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
2693 #include <sys/mman.h>
2694 #include <stddef.h>
2695 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
2696endif
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002697
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002698config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002699 #include <pthread.h>
2700
2701 static void *f(void *p) { return NULL; }
2702 int main(void)
2703 {
2704 pthread_t thread;
2705 pthread_create(&thread, 0, f, 0);
2706 pthread_setname_np(thread, "QEMU");
2707 return 0;
2708 }''', dependencies: threads))
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002709config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002710 #include <pthread.h>
2711
2712 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
2713 int main(void)
2714 {
2715 pthread_t thread;
2716 pthread_create(&thread, 0, f, 0);
2717 return 0;
2718 }''', dependencies: threads))
Brad Smith3ada67a2022-12-18 03:22:04 -05002719config_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + '''
2720 #include <pthread.h>
2721 #include <pthread_np.h>
2722
2723 static void *f(void *p) { return NULL; }
2724 int main(void)
2725 {
2726 pthread_t thread;
2727 pthread_create(&thread, 0, f, 0);
2728 pthread_set_name_np(thread, "QEMU");
2729 return 0;
2730 }''', dependencies: threads))
Longpeng(Mike)657ac982022-02-22 17:05:05 +08002731config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
2732 #include <pthread.h>
2733 #include <time.h>
2734
2735 int main(void)
2736 {
2737 pthread_condattr_t attr
2738 pthread_condattr_init(&attr);
2739 pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2740 return 0;
2741 }''', dependencies: threads))
David Hildenbrand7730f322022-10-14 15:47:15 +02002742config_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + '''
2743 #include <pthread.h>
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002744
David Hildenbrand7730f322022-10-14 15:47:15 +02002745 static void *f(void *p) { return NULL; }
2746 int main(void)
2747 {
2748 int setsize = CPU_ALLOC_SIZE(64);
2749 pthread_t thread;
2750 cpu_set_t *cpuset;
2751 pthread_create(&thread, 0, f, 0);
2752 cpuset = CPU_ALLOC(64);
2753 CPU_ZERO_S(setsize, cpuset);
2754 pthread_setaffinity_np(thread, setsize, cpuset);
2755 pthread_getaffinity_np(thread, setsize, cpuset);
2756 CPU_FREE(cpuset);
2757 return 0;
2758 }''', dependencies: threads))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002759config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02002760 #include <sys/signalfd.h>
2761 #include <stddef.h>
2762 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002763config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002764 #include <unistd.h>
2765 #include <fcntl.h>
2766 #include <limits.h>
2767
2768 int main(void)
2769 {
2770 int len, fd = 0;
2771 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2772 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2773 return 0;
2774 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002775
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002776config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
2777 #include <sys/mman.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002778 int main(void) {
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002779 return mlockall(MCL_FUTURE);
2780 }'''))
2781
Thomas Hutheea94532021-10-28 20:59:08 +02002782have_l2tpv3 = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002783if get_option('l2tpv3').allowed() and have_system
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002784 have_l2tpv3 = cc.has_type('struct mmsghdr',
2785 prefix: gnu_source_prefix + '''
2786 #include <sys/socket.h>
2787 #include <linux/ip.h>''')
Thomas Hutheea94532021-10-28 20:59:08 +02002788endif
2789config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2790
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002791have_netmap = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002792if get_option('netmap').allowed() and have_system
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002793 have_netmap = cc.compiles('''
2794 #include <inttypes.h>
2795 #include <net/if.h>
2796 #include <net/netmap.h>
2797 #include <net/netmap_user.h>
2798 #if (NETMAP_API < 11) || (NETMAP_API > 15)
2799 #error
2800 #endif
2801 int main(void) { return 0; }''')
2802 if not have_netmap and get_option('netmap').enabled()
2803 error('Netmap headers not available')
2804 endif
2805endif
2806config_host_data.set('CONFIG_NETMAP', have_netmap)
2807
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002808# Work around a system header bug with some kernel/XFS header
2809# versions where they both try to define 'struct fsxattr':
2810# xfs headers will not try to redefine structs from linux headers
2811# if this macro is set.
2812config_host_data.set('HAVE_FSXATTR', cc.links('''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002813 #include <linux/fs.h>
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002814 struct fsxattr foo;
2815 int main(void) {
2816 return 0;
2817 }'''))
2818
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002819# Some versions of Mac OS X incorrectly define SIZE_MAX
2820config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2821 #include <stdint.h>
2822 #include <stdio.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002823 int main(void) {
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002824 return printf("%zu", SIZE_MAX);
2825 }''', args: ['-Werror']))
2826
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002827# See if 64-bit atomic operations are supported.
2828# Note that without __atomic builtins, we can only
2829# assume atomic loads/stores max at pointer size.
2830config_host_data.set('CONFIG_ATOMIC64', cc.links('''
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002831 #include <stdint.h>
2832 int main(void)
2833 {
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002834 uint64_t x = 0, y = 0;
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002835 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
2836 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
2837 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2838 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2839 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2840 return 0;
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02002841 }''', args: qemu_isa_flags))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002842
Richard Henderson6479dd72023-05-24 08:14:41 -07002843has_int128_type = cc.compiles('''
2844 __int128_t a;
2845 __uint128_t b;
2846 int main(void) { b = a; }''')
2847config_host_data.set('CONFIG_INT128_TYPE', has_int128_type)
2848
2849has_int128 = has_int128_type and cc.links('''
Marc-André Lureau848126d2022-02-28 15:49:19 +04002850 __int128_t a;
2851 __uint128_t b;
2852 int main (void) {
2853 a = a + b;
2854 b = a * b;
2855 a = a * a;
2856 return 0;
2857 }''')
Marc-André Lureau848126d2022-02-28 15:49:19 +04002858config_host_data.set('CONFIG_INT128', has_int128)
2859
Richard Henderson6479dd72023-05-24 08:14:41 -07002860if has_int128_type
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002861 # "do we have 128-bit atomics which are handled inline and specifically not
2862 # via libatomic". The reason we can't use libatomic is documented in the
2863 # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002864 # We only care about these operations on 16-byte aligned pointers, so
2865 # force 16-byte alignment of the pointer, which may be greater than
2866 # __alignof(unsigned __int128) for the host.
2867 atomic_test_128 = '''
2868 int main(int ac, char **av) {
Richard Henderson6479dd72023-05-24 08:14:41 -07002869 __uint128_t *p = __builtin_assume_aligned(av[ac - 1], 16);
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002870 p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED);
2871 __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED);
2872 __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2873 return 0;
2874 }'''
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02002875 has_atomic128 = cc.links(atomic_test_128, args: qemu_isa_flags)
Marc-André Lureau848126d2022-02-28 15:49:19 +04002876
2877 config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
2878
2879 if not has_atomic128
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002880 # Even with __builtin_assume_aligned, the above test may have failed
2881 # without optimization enabled. Try again with optimizations locally
2882 # enabled for the function. See
2883 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02002884 has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128,
2885 args: qemu_isa_flags)
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002886 config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt)
Marc-André Lureau848126d2022-02-28 15:49:19 +04002887
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002888 if not has_atomic128_opt
2889 config_host_data.set('CONFIG_CMPXCHG128', cc.links('''
2890 int main(void)
2891 {
Richard Henderson6479dd72023-05-24 08:14:41 -07002892 __uint128_t x = 0, y = 0;
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002893 __sync_val_compare_and_swap_16(&x, y, x);
2894 return 0;
2895 }
Paolo Bonzini8db4e0f2024-10-06 09:44:00 +02002896 ''', args: qemu_isa_flags))
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002897 endif
Marc-André Lureau848126d2022-02-28 15:49:19 +04002898 endif
2899endif
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002900
2901config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
2902 #include <sys/auxv.h>
2903 int main(void) {
2904 return getauxval(AT_HWCAP) == 0;
2905 }'''))
2906
Brad Smith27fca0a2024-07-27 23:58:55 -04002907config_host_data.set('CONFIG_ELF_AUX_INFO', cc.links(gnu_source_prefix + '''
2908 #include <sys/auxv.h>
2909 int main(void) {
2910 unsigned long hwcap = 0;
2911 elf_aux_info(AT_HWCAP, &hwcap, sizeof(hwcap));
2912 return hwcap;
2913 }'''))
2914
Paolo Bonzini0dae95d2022-04-20 17:33:43 +02002915config_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
2916 #include <linux/usbdevice_fs.h>
2917
2918 #ifndef USBDEVFS_GET_CAPABILITIES
2919 #error "USBDEVFS_GET_CAPABILITIES undefined"
2920 #endif
2921
2922 #ifndef USBDEVFS_DISCONNECT_CLAIM
2923 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
2924 #endif
2925
2926 int main(void) { return 0; }'''))
2927
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02002928have_keyring = get_option('keyring') \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01002929 .require(host_os == 'linux', error_message: 'keyring is only available on Linux') \
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02002930 .require(cc.compiles('''
2931 #include <errno.h>
2932 #include <asm/unistd.h>
2933 #include <linux/keyctl.h>
2934 #include <sys/syscall.h>
2935 #include <unistd.h>
2936 int main(void) {
2937 return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
2938 }'''), error_message: 'keyctl syscall not available on this system').allowed()
2939config_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
2940
Paolo Bonzini622753d2021-11-08 13:38:58 +01002941have_cpuid_h = cc.links('''
2942 #include <cpuid.h>
2943 int main(void) {
2944 unsigned a, b, c, d;
2945 unsigned max = __get_cpuid_max(0, 0);
2946
2947 if (max >= 1) {
2948 __cpuid(1, a, b, c, d);
2949 }
2950
2951 if (max >= 7) {
2952 __cpuid_count(7, 0, a, b, c, d);
2953 }
2954
2955 return 0;
2956 }''')
2957config_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
2958
Richard Hendersone5717302024-06-27 17:36:43 +00002959# Don't bother to advertise asm/hwprobe.h for old versions that do
2960# not contain RISCV_HWPROBE_EXT_ZBA.
2961config_host_data.set('CONFIG_ASM_HWPROBE_H',
2962 cc.has_header_symbol('asm/hwprobe.h',
2963 'RISCV_HWPROBE_EXT_ZBA'))
2964
Paolo Bonzini622753d2021-11-08 13:38:58 +01002965config_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
2966 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
2967 .require(cc.links('''
Paolo Bonzini622753d2021-11-08 13:38:58 +01002968 #include <cpuid.h>
2969 #include <immintrin.h>
Richard Henderson701ea582022-12-03 19:31:12 -06002970 static int __attribute__((target("avx2"))) bar(void *a) {
Paolo Bonzini622753d2021-11-08 13:38:58 +01002971 __m256i x = *(__m256i *)a;
2972 return _mm256_testz_si256(x, x);
2973 }
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002974 int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
Paolo Bonzini622753d2021-11-08 13:38:58 +01002975 '''), error_message: 'AVX2 not available').allowed())
2976
ling xu04ffce12022-11-16 23:29:22 +08002977config_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \
2978 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \
2979 .require(cc.links('''
ling xu04ffce12022-11-16 23:29:22 +08002980 #include <cpuid.h>
2981 #include <immintrin.h>
Richard Hendersondc165fc2023-05-01 22:05:55 +01002982 static int __attribute__((target("avx512bw"))) bar(void *a) {
ling xu04ffce12022-11-16 23:29:22 +08002983 __m512i *x = a;
2984 __m512i res= _mm512_abs_epi8(*x);
2985 return res[1];
2986 }
2987 int main(int argc, char *argv[]) { return bar(argv[0]); }
2988 '''), error_message: 'AVX512BW not available').allowed())
2989
Richard Henderson8d97f282023-06-02 07:43:40 +00002990# For both AArch64 and AArch32, detect if builtins are available.
2991config_host_data.set('CONFIG_ARM_AES_BUILTIN', cc.compiles('''
2992 #include <arm_neon.h>
2993 #ifndef __ARM_FEATURE_AES
2994 __attribute__((target("+crypto")))
2995 #endif
2996 void foo(uint8x16_t *p) { *p = vaesmcq_u8(*p); }
2997 '''))
2998
Paolo Bonzinib87df902021-11-08 13:52:11 +01002999if get_option('membarrier').disabled()
3000 have_membarrier = false
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003001elif host_os == 'windows'
Paolo Bonzinib87df902021-11-08 13:52:11 +01003002 have_membarrier = true
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003003elif host_os == 'linux'
Paolo Bonzinib87df902021-11-08 13:52:11 +01003004 have_membarrier = cc.compiles('''
3005 #include <linux/membarrier.h>
3006 #include <sys/syscall.h>
3007 #include <unistd.h>
3008 #include <stdlib.h>
3009 int main(void) {
3010 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
3011 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
3012 exit(0);
3013 }''')
3014endif
3015config_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
3016 .require(have_membarrier, error_message: 'membarrier system call not available') \
3017 .allowed())
3018
Paolo Bonzini34b52612021-11-08 14:02:42 +01003019have_afalg = get_option('crypto_afalg') \
3020 .require(cc.compiles(gnu_source_prefix + '''
3021 #include <errno.h>
3022 #include <sys/types.h>
3023 #include <sys/socket.h>
3024 #include <linux/if_alg.h>
3025 int main(void) {
3026 int sock;
3027 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
3028 return sock;
3029 }
3030 '''), error_message: 'AF_ALG requested but could not be detected').allowed()
3031config_host_data.set('CONFIG_AF_ALG', have_afalg)
3032
Marc-André Lureau9d734b82022-04-01 15:50:05 +04003033config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
3034 'linux/vm_sockets.h', 'AF_VSOCK',
3035 prefix: '#include <sys/socket.h>',
3036))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02003037
Marc-André Lureau8821a382022-02-01 16:53:43 +04003038have_vss = false
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003039have_vss_sdk = false # old xp/2003 SDK
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003040if host_os == 'windows' and 'cpp' in all_languages
Marc-André Lureau8821a382022-02-01 16:53:43 +04003041 have_vss = cxx.compiles('''
3042 #define __MIDL_user_allocate_free_DEFINED__
Marc-André Lureau32478cb2022-02-22 23:40:01 +04003043 #include <vss.h>
Marc-André Lureau8821a382022-02-01 16:53:43 +04003044 int main(void) { return VSS_CTX_BACKUP; }''')
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003045 have_vss_sdk = cxx.has_header('vscoordint.h')
Marc-André Lureau8821a382022-02-01 16:53:43 +04003046endif
Marc-André Lureau872b69e2022-02-22 23:40:02 +04003047config_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
Marc-André Lureau8821a382022-02-01 16:53:43 +04003048
Richard Henderson6391c772022-04-17 11:30:06 -07003049# Older versions of MinGW do not import _lock_file and _unlock_file properly.
3050# This was fixed for v6.0.0 with commit b48e3ac8969d.
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003051if host_os == 'windows'
Richard Henderson6391c772022-04-17 11:30:06 -07003052 config_host_data.set('HAVE__LOCK_FILE', cc.links('''
3053 #include <stdio.h>
3054 int main(void) {
3055 _lock_file(NULL);
3056 _unlock_file(NULL);
3057 return 0;
3058 }''', name: '_lock_file and _unlock_file'))
3059endif
3060
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003061if host_os == 'windows'
Pierrick Bouvierdbd672c2023-02-21 16:30:04 +01003062 mingw_has_setjmp_longjmp = cc.links('''
3063 #include <setjmp.h>
3064 int main(void) {
3065 /*
3066 * These functions are not available in setjmp header, but may be
3067 * available at link time, from libmingwex.a.
3068 */
3069 extern int __mingw_setjmp(jmp_buf);
3070 extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int);
3071 jmp_buf env;
3072 __mingw_setjmp(env);
3073 __mingw_longjmp(env, 0);
3074 }
3075 ''', name: 'mingw setjmp and longjmp')
3076
3077 if cpu == 'aarch64' and not mingw_has_setjmp_longjmp
3078 error('mingw must provide setjmp/longjmp for windows-arm64')
3079 endif
3080endif
3081
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003082########################
3083# Target configuration #
3084########################
3085
Paolo Bonzini2becc362020-02-03 11:42:03 +01003086minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003087
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02003088config_all_accel = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04003089config_all_devices = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003090config_devices_mak_list = []
3091config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02003092config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003093config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003094
3095disassemblers = {
3096 'alpha' : ['CONFIG_ALPHA_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003097 'avr' : ['CONFIG_AVR_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06003098 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003099 'hppa' : ['CONFIG_HPPA_DIS'],
3100 'i386' : ['CONFIG_I386_DIS'],
3101 'x86_64' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003102 'm68k' : ['CONFIG_M68K_DIS'],
3103 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
3104 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003105 'or1k' : ['CONFIG_OPENRISC_DIS'],
3106 'ppc' : ['CONFIG_PPC_DIS'],
3107 'riscv' : ['CONFIG_RISCV_DIS'],
3108 'rx' : ['CONFIG_RX_DIS'],
3109 's390' : ['CONFIG_S390_DIS'],
3110 'sh4' : ['CONFIG_SH4_DIS'],
3111 'sparc' : ['CONFIG_SPARC_DIS'],
3112 'xtensa' : ['CONFIG_XTENSA_DIS'],
Song Gaoaae17462022-06-06 20:43:06 +08003113 'loongarch' : ['CONFIG_LOONGARCH_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003114}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003115
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02003116have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01003117host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02003118 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01003119 (have_tpm ? ['CONFIG_TPM=y'] : []) + \
Marc-André Lureaucca15752023-08-30 13:38:25 +04003120 (pixman.found() ? ['CONFIG_PIXMAN=y'] : []) + \
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02003121 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02003122 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini88b6e612022-04-20 17:33:40 +02003123 (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01003124 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini1935b7e2024-05-07 14:13:46 +02003125 (fdt.found() ? ['CONFIG_FDT=y'] : []) + \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003126 (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
3127 (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
3128 (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01003129 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003130 (host_os == 'linux' ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman55116962022-06-13 16:26:24 -04003131 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02003132 (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : []) + \
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03003133 (hv_balloon ? ['CONFIG_HV_BALLOON_POSSIBLE=y'] : []) + \
3134 (have_rust ? ['CONFIG_HAVE_RUST=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01003135
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003136ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003137
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003138default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
3139actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003140fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003141foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04003142 config_target = { 'TARGET_NAME': target.split('-')[0] }
3143 if target.endswith('linux-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003144 if host_os != 'linux'
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003145 if default_targets
3146 continue
3147 endif
3148 error('Target @0@ is only available on a Linux host'.format(target))
3149 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04003150 config_target += { 'CONFIG_LINUX_USER': 'y' }
3151 elif target.endswith('bsd-user')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003152 if host_os not in bsd_oses
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003153 if default_targets
3154 continue
3155 endif
3156 error('Target @0@ is only available on a BSD host'.format(target))
3157 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04003158 config_target += { 'CONFIG_BSD_USER': 'y' }
3159 elif target.endswith('softmmu')
Philippe Mathieu-Daudébd0c03b2023-06-13 15:33:45 +02003160 config_target += { 'CONFIG_SYSTEM_ONLY': 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04003161 config_target += { 'CONFIG_SOFTMMU': 'y' }
3162 endif
3163 if target.endswith('-user')
3164 config_target += {
3165 'CONFIG_USER_ONLY': 'y',
3166 'CONFIG_QEMU_INTERP_PREFIX':
Paolo Bonzinice6119d2022-04-20 17:33:55 +02003167 get_option('interp_prefix').replace('%M', config_target['TARGET_NAME'])
Paolo Bonzini765686d2020-09-18 06:37:21 -04003168 }
3169 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02003170
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003171 target_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04003172 foreach sym: accelerators
3173 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
3174 config_target += { sym: 'y' }
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02003175 config_all_accel += { sym: 'y' }
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02003176 if target in modular_tcg
3177 config_target += { 'CONFIG_TCG_MODULAR': 'y' }
3178 else
3179 config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
3180 endif
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003181 target_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04003182 endif
3183 endforeach
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003184 if target_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003185 if default_targets
3186 continue
3187 endif
3188 error('No accelerator available for target @0@'.format(target))
3189 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04003190
Alex Bennée812b31d2021-07-07 14:17:43 +01003191 config_target += keyval.load('configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003192 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04003193
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003194 if 'TARGET_NEED_FDT' in config_target and not fdt.found()
Paolo Bonzini9b089d22024-05-08 09:25:48 +02003195 if default_targets
3196 warning('Disabling ' + target + ' due to missing libfdt')
3197 else
3198 fdt_required += target
3199 endif
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003200 continue
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003201 endif
3202
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003203 actual_target_dirs += target
3204
Paolo Bonzinifa731682020-09-21 05:19:07 -04003205 # Add default keys
3206 if 'TARGET_BASE_ARCH' not in config_target
3207 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
3208 endif
3209 if 'TARGET_ABI_DIR' not in config_target
3210 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
3211 endif
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003212 if 'TARGET_BIG_ENDIAN' not in config_target
3213 config_target += {'TARGET_BIG_ENDIAN': 'n'}
3214 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02003215
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003216 foreach k, v: disassemblers
Paolo Bonzini823eb012021-11-08 14:18:17 +01003217 if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003218 foreach sym: v
3219 config_target += { sym: 'y' }
Paolo Bonzinica0fc782020-09-01 06:04:28 -04003220 endforeach
3221 endif
3222 endforeach
3223
Paolo Bonzini859aef02020-08-04 18:14:26 +02003224 config_target_data = configuration_data()
3225 foreach k, v: config_target
3226 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
3227 # do nothing
3228 elif ignored.contains(k)
3229 # do nothing
3230 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04003231 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
3232 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02003233 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04003234 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02003235 config_target_data.set_quoted(k, v)
3236 elif v == 'y'
3237 config_target_data.set(k, 1)
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04003238 elif v == 'n'
3239 config_target_data.set(k, 0)
Paolo Bonzini859aef02020-08-04 18:14:26 +02003240 else
3241 config_target_data.set(k, v)
3242 endif
3243 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01003244 config_target_data.set('QEMU_ARCH',
3245 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02003246 config_target_h += {target: configure_file(output: target + '-config-target.h',
3247 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003248
3249 if target.endswith('-softmmu')
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003250 target_kconfig += 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'
3251 target_kconfig += 'CONFIG_TARGET_BIG_ENDIAN=' + config_target['TARGET_BIG_ENDIAN']
3252
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003253 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003254 config_devices_mak = target + '-config-devices.mak'
3255 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01003256 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01003257 output: config_devices_mak,
3258 depfile: config_devices_mak + '.d',
3259 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01003260 command: [minikconf,
3261 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01003262 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzinibae3e3a2024-01-29 11:53:17 +01003263 host_kconfig, target_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02003264
3265 config_devices_data = configuration_data()
3266 config_devices = keyval.load(config_devices_mak)
3267 foreach k, v: config_devices
3268 config_devices_data.set(k, 1)
3269 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003270 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02003271 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
3272 configuration: config_devices_data)}
3273 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04003274 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01003275 endif
3276 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003277endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04003278target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003279
Paolo Bonzinieed56e92021-11-10 11:01:26 +01003280target_configs_h = []
3281foreach target: target_dirs
3282 target_configs_h += config_target_h[target]
3283 target_configs_h += config_devices_h.get(target, [])
3284endforeach
3285genh += custom_target('config-poison.h',
3286 input: [target_configs_h],
3287 output: 'config-poison.h',
3288 capture: true,
3289 command: [find_program('scripts/make-config-poison.sh'),
3290 target_configs_h])
3291
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01003292if fdt_required.length() > 0
3293 error('fdt disabled but required by targets ' + ', '.join(fdt_required))
3294endif
3295
Paolo Bonzinia775c712023-09-08 12:09:22 +02003296###############
3297# Subprojects #
3298###############
Paolo Bonzini4d34a862020-10-05 11:31:15 +02003299
Jagannathan Raman55116962022-06-13 16:26:24 -04003300libvfio_user_dep = not_found
3301if have_system and vfio_user_server_allowed
Paolo Bonzini2019cab2023-05-18 16:50:00 +02003302 libvfio_user_proj = subproject('libvfio-user', required: true)
Paolo Bonzini53283532023-03-30 12:47:23 +02003303 libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
Jagannathan Raman55116962022-06-13 16:26:24 -04003304endif
3305
Paolo Bonzinia775c712023-09-08 12:09:22 +02003306vhost_user = not_found
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003307if host_os == 'linux' and have_vhost_user
Paolo Bonzinia775c712023-09-08 12:09:22 +02003308 libvhost_user = subproject('libvhost-user')
3309 vhost_user = libvhost_user.get_variable('vhost_user_dep')
3310endif
3311
3312libvduse = not_found
3313if have_libvduse
3314 libvduse_proj = subproject('libvduse')
3315 libvduse = libvduse_proj.get_variable('libvduse_dep')
3316endif
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003317
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003318#####################
3319# Generated sources #
3320#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003321
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003322genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003323
Marc-André Lureau3f885652019-07-15 18:06:04 +04003324hxtool = find_program('scripts/hxtool')
Marc-André Lureaue2c40122023-01-24 18:00:57 +00003325shaderinclude = find_program('scripts/shaderinclude.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003326qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003327qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
3328 meson.current_source_dir() / 'scripts/qapi/commands.py',
3329 meson.current_source_dir() / 'scripts/qapi/common.py',
3330 meson.current_source_dir() / 'scripts/qapi/error.py',
3331 meson.current_source_dir() / 'scripts/qapi/events.py',
3332 meson.current_source_dir() / 'scripts/qapi/expr.py',
3333 meson.current_source_dir() / 'scripts/qapi/gen.py',
3334 meson.current_source_dir() / 'scripts/qapi/introspect.py',
Markus Armbruster88d357d2023-04-28 12:54:16 +02003335 meson.current_source_dir() / 'scripts/qapi/main.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003336 meson.current_source_dir() / 'scripts/qapi/parser.py',
3337 meson.current_source_dir() / 'scripts/qapi/schema.py',
3338 meson.current_source_dir() / 'scripts/qapi/source.py',
3339 meson.current_source_dir() / 'scripts/qapi/types.py',
3340 meson.current_source_dir() / 'scripts/qapi/visit.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003341 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003342]
3343
3344tracetool = [
3345 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003346 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003347]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003348tracetool_depends = files(
3349 'scripts/tracetool/backend/log.py',
3350 'scripts/tracetool/backend/__init__.py',
3351 'scripts/tracetool/backend/dtrace.py',
3352 'scripts/tracetool/backend/ftrace.py',
3353 'scripts/tracetool/backend/simple.py',
3354 'scripts/tracetool/backend/syslog.py',
3355 'scripts/tracetool/backend/ust.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003356 'scripts/tracetool/format/ust_events_c.py',
3357 'scripts/tracetool/format/ust_events_h.py',
3358 'scripts/tracetool/format/__init__.py',
3359 'scripts/tracetool/format/d.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003360 'scripts/tracetool/format/simpletrace_stap.py',
3361 'scripts/tracetool/format/c.py',
3362 'scripts/tracetool/format/h.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003363 'scripts/tracetool/format/log_stap.py',
3364 'scripts/tracetool/format/stap.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003365 'scripts/tracetool/__init__.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003366)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003367
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003368qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
3369 meson.current_source_dir(),
Paolo Bonzinib0b43232022-04-20 17:33:54 +02003370 get_option('pkgversion'), meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003371qemu_version = custom_target('qemu-version.h',
3372 output: 'qemu-version.h',
3373 command: qemu_version_cmd,
3374 capture: true,
3375 build_by_default: true,
3376 build_always_stale: true)
3377genh += qemu_version
3378
Marc-André Lureau3f885652019-07-15 18:06:04 +04003379hxdep = []
3380hx_headers = [
3381 ['qemu-options.hx', 'qemu-options.def'],
3382 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
3383]
3384if have_system
3385 hx_headers += [
3386 ['hmp-commands.hx', 'hmp-commands.h'],
3387 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
3388 ]
3389endif
3390foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003391 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04003392 input: files(d[0]),
3393 output: d[1],
3394 capture: true,
Marc-André Lureau3f885652019-07-15 18:06:04 +04003395 command: [hxtool, '-h', '@INPUT0@'])
3396endforeach
3397genh += hxdep
3398
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003399###############
3400# Trace files #
3401###############
3402
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003403# TODO: add each directory to the subdirs from its own meson.build, once
3404# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003405trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003406 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003407 'qapi',
3408 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003409 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003410 'util',
Alex Bennée842b42d2022-09-29 12:42:22 +01003411 'gdbstub',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003412]
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003413if have_linux_user
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003414 trace_events_subdirs += [ 'linux-user' ]
3415endif
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003416if have_bsd_user
3417 trace_events_subdirs += [ 'bsd-user' ]
3418endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003419if have_block
3420 trace_events_subdirs += [
3421 'authz',
3422 'block',
Daniel P. Berrangé48fc8872024-07-23 11:31:24 +01003423 'chardev',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003424 'io',
3425 'nbd',
3426 'scsi',
3427 ]
3428endif
3429if have_system
3430 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003431 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003432 'audio',
3433 'backends',
3434 'backends/tpm',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003435 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003436 'hw/9pfs',
3437 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08003438 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003439 'hw/alpha',
3440 'hw/arm',
3441 'hw/audio',
3442 'hw/block',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003443 'hw/char',
3444 'hw/display',
3445 'hw/dma',
Ninad Palsule99f0c042024-01-26 04:49:46 -06003446 'hw/fsi',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003447 'hw/hyperv',
3448 'hw/i2c',
3449 'hw/i386',
3450 'hw/i386/xen',
David Woodhouseaa98ee32023-01-13 19:51:32 +00003451 'hw/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003452 'hw/ide',
3453 'hw/input',
3454 'hw/intc',
3455 'hw/isa',
3456 'hw/mem',
3457 'hw/mips',
3458 'hw/misc',
3459 'hw/misc/macio',
3460 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08003461 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01003462 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02003463 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003464 'hw/nvram',
3465 'hw/pci',
3466 'hw/pci-host',
3467 'hw/ppc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003468 'hw/rtc',
3469 'hw/s390x',
3470 'hw/scsi',
3471 'hw/sd',
BALATON Zoltanad52cfc2021-10-29 23:02:09 +02003472 'hw/sh4',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003473 'hw/sparc',
3474 'hw/sparc64',
3475 'hw/ssi',
3476 'hw/timer',
3477 'hw/tpm',
Jeuk Kimbc4e68d2023-09-06 16:43:48 +09003478 'hw/ufs',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003479 'hw/usb',
3480 'hw/vfio',
3481 'hw/virtio',
3482 'hw/watchdog',
3483 'hw/xen',
3484 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003485 'migration',
3486 'net',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003487 'system',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003488 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05003489 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003490 ]
3491endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003492if have_system or have_user
3493 trace_events_subdirs += [
3494 'accel/tcg',
3495 'hw/core',
3496 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02003497 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003498 'target/hppa',
3499 'target/i386',
3500 'target/i386/kvm',
Tianrui Zhaof8447432024-01-05 15:57:59 +08003501 'target/loongarch',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02003502 'target/mips/tcg',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003503 'target/ppc',
3504 'target/riscv',
3505 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08003506 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003507 'target/sparc',
3508 ]
3509endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003510
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003511###################
3512# Collect sources #
3513###################
3514
3515authz_ss = ss.source_set()
3516blockdev_ss = ss.source_set()
3517block_ss = ss.source_set()
3518chardev_ss = ss.source_set()
3519common_ss = ss.source_set()
3520crypto_ss = ss.source_set()
3521hwcore_ss = ss.source_set()
3522io_ss = ss.source_set()
3523qmp_ss = ss.source_set()
3524qom_ss = ss.source_set()
3525system_ss = ss.source_set()
3526specific_fuzz_ss = ss.source_set()
3527specific_ss = ss.source_set()
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02003528rust_devices_ss = ss.source_set()
Paolo Bonzini9cd76c92023-11-03 09:33:57 +01003529stub_ss = ss.source_set()
3530trace_ss = ss.source_set()
3531user_ss = ss.source_set()
3532util_ss = ss.source_set()
3533
3534# accel modules
3535qtest_module_ss = ss.source_set()
3536tcg_module_ss = ss.source_set()
3537
3538modules = {}
3539target_modules = {}
3540hw_arch = {}
3541target_arch = {}
3542target_system_arch = {}
3543target_user_arch = {}
3544
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +01003545# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
3546# that is filled in by qapi/.
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003547subdir('qapi')
3548subdir('qobject')
3549subdir('stubs')
3550subdir('trace')
3551subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04003552subdir('qom')
3553subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003554subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04003555subdir('ui')
Alex Bennée842b42d2022-09-29 12:42:22 +01003556subdir('gdbstub')
Philippe Mathieu-Daudé68621262024-04-08 17:53:20 +02003557if have_system
3558 subdir('hw')
3559else
3560 subdir('hw/core')
3561endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003562
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003563if enable_modules
3564 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
Akihiko Odaki414b1802024-05-24 17:00:22 +09003565 modulecommon = declare_dependency(objects: libmodulecommon.extract_all_objects(recursive: false), compile_args: '-DBUILD_DSO')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003566endif
3567
Paolo Bonzini1220f582023-08-30 11:52:43 +02003568qom_ss = qom_ss.apply({})
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003569libqom = static_library('qom', qom_ss.sources() + genh,
3570 dependencies: [qom_ss.dependencies()],
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003571 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003572qom = declare_dependency(objects: libqom.extract_all_objects(recursive: false),
3573 dependencies: qom_ss.dependencies())
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003574
3575event_loop_base = files('event-loop-base.c')
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003576event_loop_base = static_library('event-loop-base',
3577 sources: event_loop_base + genh,
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003578 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003579event_loop_base = declare_dependency(objects: event_loop_base.extract_all_objects(recursive: false),
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003580 dependencies: [qom])
3581
Paolo Bonzini1220f582023-08-30 11:52:43 +02003582stub_ss = stub_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003583
3584util_ss.add_all(trace_ss)
Paolo Bonzini1220f582023-08-30 11:52:43 +02003585util_ss = util_ss.apply({})
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003586libqemuutil = static_library('qemuutil',
Paolo Bonzini4c545a02023-09-27 15:48:31 +02003587 build_by_default: false,
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003588 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6190fd62024-04-08 17:53:13 +02003589 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003590qemuutil = declare_dependency(link_with: libqemuutil,
Nicolas Saenz Julienne70ac26b2022-04-25 09:57:22 +02003591 sources: genh + version_res,
3592 dependencies: [event_loop_base])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003593
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01003594if have_system or have_user
3595 decodetree = generator(find_program('scripts/decodetree.py'),
3596 output: 'decode-@BASENAME@.c.inc',
3597 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3598 subdir('libdecnumber')
3599 subdir('target')
3600endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003601
Paolo Bonzini478e9432020-08-17 12:47:55 +02003602subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04003603subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04003604subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003605subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04003606subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003607
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003608if have_block
3609 block_ss.add(files(
3610 'block.c',
3611 'blockjob.c',
3612 'job.c',
3613 'qemu-io-cmds.c',
3614 ))
Paolo Bonzini406523f2021-10-13 11:43:54 +02003615 if config_host_data.get('CONFIG_REPLICATION')
3616 block_ss.add(files('replication.c'))
3617 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003618
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003619 subdir('nbd')
3620 subdir('scsi')
3621 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003622
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003623 blockdev_ss.add(files(
3624 'blockdev.c',
3625 'blockdev-nbd.c',
3626 'iothread.c',
3627 'job-qmp.c',
Akihiko Odaki7b1070a2024-05-24 17:00:23 +09003628 ))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003629
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003630 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
3631 # os-win32.c does not
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003632 if host_os == 'windows'
Paolo Bonzinidc495492023-08-30 11:29:54 +02003633 system_ss.add(files('os-win32.c'))
3634 else
3635 blockdev_ss.add(files('os-posix.c'))
3636 endif
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003637endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02003638
Philippe Mathieu-Daudéfe0007f2023-09-14 20:57:12 +02003639common_ss.add(files('cpu-common.c'))
3640specific_ss.add(files('cpu-target.c'))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003641
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02003642subdir('system')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003643
Richard Henderson44b99a62021-03-22 12:24:26 +01003644# Work around a gcc bug/misfeature wherein constant propagation looks
3645# through an alias:
3646# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
3647# to guess that a const variable is always zero. Without lto, this is
3648# impossible, as the alias is restricted to page-vary-common.c. Indeed,
3649# without lto, not even the alias is required -- we simply use different
3650# declarations in different compilation units.
3651pagevary = files('page-vary-common.c')
3652if get_option('b_lto')
3653 pagevary_flags = ['-fno-lto']
3654 if get_option('cfi')
3655 pagevary_flags += '-fno-sanitize=cfi-icall'
3656 endif
Thomas Huth54c9b192022-03-30 13:48:08 +02003657 pagevary = static_library('page-vary-common', sources: pagevary + genh,
Richard Henderson44b99a62021-03-22 12:24:26 +01003658 c_args: pagevary_flags)
3659 pagevary = declare_dependency(link_with: pagevary)
3660endif
3661common_ss.add(pagevary)
Philippe Mathieu-Daudé75bbe6a2023-12-07 10:41:27 +01003662specific_ss.add(files('page-target.c', 'page-vary-target.c'))
Richard Henderson6670d4d2021-03-22 12:24:24 +01003663
Marc-André Lureauab318052019-07-24 19:23:16 +04003664subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04003665subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04003666subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003667subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04003668subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04003669subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00003670subdir('semihosting')
Markus Armbrusteraa09b3d2023-01-24 13:19:36 +01003671subdir('stats')
Richard Henderson104cc2c2021-03-08 12:04:33 -08003672subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08003673subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04003674subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003675subdir('plugins')
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003676subdir('ebpf')
3677
3678common_user_inc = []
3679
3680subdir('common-user')
Marc-André Lureaub309c322019-08-18 19:20:37 +04003681subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04003682subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003683
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003684# needed for fuzzing binaries
3685subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003686subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003687
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003688# accel modules
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02003689tcg_real_module_ss = ss.source_set()
3690tcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
3691specific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
3692target_modules += { 'accel' : { 'qtest': qtest_module_ss,
3693 'tcg': tcg_real_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003694
Paolo Bonziniea444d92023-09-08 12:06:12 +02003695##############################################
3696# Internal static_libraries and dependencies #
3697##############################################
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003698
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003699modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003700modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003701modinfo_files = []
3702
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003703block_mods = []
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003704system_mods = []
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003705emulator_modules = []
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003706foreach d, list : modules
Paolo Bonzinief709862023-05-04 10:20:46 +02003707 if not (d == 'block' ? have_block : have_system)
3708 continue
3709 endif
3710
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003711 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003712 if enable_modules
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003713 module_ss.add(modulecommon)
Paolo Bonzini0d665492023-08-31 11:18:24 +02003714 module_ss = module_ss.apply(config_all_devices, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003715 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003716 dependencies: module_ss.dependencies(), pic: true)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003717 if d == 'block'
3718 block_mods += sl
3719 else
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003720 system_mods += sl
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003721 endif
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003722 emulator_modules += shared_module(sl.name(),
3723 name_prefix: '',
Akihiko Odaki414b1802024-05-24 17:00:22 +09003724 objects: sl.extract_all_objects(recursive: false),
3725 dependencies: module_ss.dependencies(),
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003726 install: true,
3727 install_dir: qemu_moddir)
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003728 if module_ss.sources() != []
3729 # FIXME: Should use sl.extract_all_objects(recursive: true) as
3730 # input. Sources can be used multiple times but objects are
3731 # unique when it comes to lookup in compile_commands.json.
3732 # Depnds on a mesion version with
3733 # https://github.com/mesonbuild/meson/pull/8900
3734 modinfo_files += custom_target(d + '-' + m + '.modinfo',
3735 output: d + '-' + m + '.modinfo',
Paolo Bonziniac347112021-07-21 18:51:57 +02003736 input: module_ss.sources() + genh,
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003737 capture: true,
Paolo Bonziniac347112021-07-21 18:51:57 +02003738 command: [modinfo_collect, module_ss.sources()])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003739 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003740 else
3741 if d == 'block'
3742 block_ss.add_all(module_ss)
3743 else
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003744 system_ss.add_all(module_ss)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003745 endif
3746 endif
3747 endforeach
3748endforeach
3749
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003750foreach d, list : target_modules
3751 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003752 if enable_modules
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003753 module_ss.add(modulecommon)
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003754 foreach target : target_dirs
3755 if target.endswith('-softmmu')
3756 config_target = config_target_mak[target]
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003757 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
Philippe Mathieu-Daudé7d7a21b2023-06-13 16:29:11 +02003758 c_args = ['-DCOMPILING_PER_TARGET',
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003759 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3760 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3761 target_module_ss = module_ss.apply(config_target, strict: false)
3762 if target_module_ss.sources() != []
3763 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3764 sl = static_library(module_name,
3765 [genh, target_module_ss.sources()],
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003766 dependencies: target_module_ss.dependencies(),
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003767 include_directories: target_inc,
3768 c_args: c_args,
3769 pic: true)
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003770 system_mods += sl
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003771 emulator_modules += shared_module(sl.name(),
3772 name_prefix: '',
Akihiko Odaki414b1802024-05-24 17:00:22 +09003773 objects: sl.extract_all_objects(recursive: false),
3774 dependencies: target_module_ss.dependencies(),
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003775 install: true,
3776 install_dir: qemu_moddir)
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003777 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
3778 modinfo_files += custom_target(module_name + '.modinfo',
3779 output: module_name + '.modinfo',
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003780 input: target_module_ss.sources() + genh,
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003781 capture: true,
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003782 command: [modinfo_collect, '--target', target, target_module_ss.sources()])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003783 endif
3784 endif
3785 endforeach
3786 else
3787 specific_ss.add_all(module_ss)
3788 endif
3789 endforeach
3790endforeach
3791
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003792if enable_modules
Jose R. Ziviani05d68142022-05-28 00:20:35 +02003793 foreach target : target_dirs
3794 if target.endswith('-softmmu')
3795 config_target = config_target_mak[target]
3796 config_devices_mak = target + '-config-devices.mak'
3797 modinfo_src = custom_target('modinfo-' + target + '.c',
3798 output: 'modinfo-' + target + '.c',
3799 input: modinfo_files,
3800 command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
3801 capture: true)
3802
3803 modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
3804 modinfo_dep = declare_dependency(link_with: modinfo_lib)
3805
3806 arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
3807 hw_arch[arch].add(modinfo_dep)
3808 endif
3809 endforeach
Paolo Bonzinifae7a422024-05-24 10:27:21 +02003810
3811 if emulator_modules.length() > 0
3812 alias_target('modules', emulator_modules)
3813 endif
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003814endif
3815
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003816nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08003817undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003818block_syms = custom_target('block.syms', output: 'block.syms',
3819 input: [libqemuutil, block_mods],
3820 capture: true,
3821 command: [undefsym, nm, '@INPUT@'])
3822qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
Philippe Mathieu-Daudé21d21402023-10-04 11:06:26 +02003823 input: [libqemuutil, system_mods],
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003824 capture: true,
3825 command: [undefsym, nm, '@INPUT@'])
3826
Paolo Bonzini1220f582023-08-30 11:52:43 +02003827authz_ss = authz_ss.apply({})
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003828libauthz = static_library('authz', authz_ss.sources() + genh,
3829 dependencies: [authz_ss.dependencies()],
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003830 build_by_default: false)
3831
Akihiko Odaki414b1802024-05-24 17:00:22 +09003832authz = declare_dependency(objects: libauthz.extract_all_objects(recursive: false),
3833 dependencies: [authz_ss.dependencies(), qom])
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003834
Paolo Bonzini1220f582023-08-30 11:52:43 +02003835crypto_ss = crypto_ss.apply({})
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003836libcrypto = static_library('crypto', crypto_ss.sources() + genh,
3837 dependencies: [crypto_ss.dependencies()],
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003838 build_by_default: false)
3839
Akihiko Odaki414b1802024-05-24 17:00:22 +09003840crypto = declare_dependency(objects: libcrypto.extract_all_objects(recursive: false),
3841 dependencies: [crypto_ss.dependencies(), authz, qom])
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003842
Paolo Bonzini1220f582023-08-30 11:52:43 +02003843io_ss = io_ss.apply({})
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003844libio = static_library('io', io_ss.sources() + genh,
3845 dependencies: [io_ss.dependencies()],
3846 link_with: libqemuutil,
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003847 build_by_default: false)
3848
Akihiko Odaki414b1802024-05-24 17:00:22 +09003849io = declare_dependency(objects: libio.extract_all_objects(recursive: false),
3850 dependencies: [io_ss.dependencies(), crypto, qom])
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003851
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003852libmigration = static_library('migration', sources: migration_files + genh,
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003853 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003854migration = declare_dependency(objects: libmigration.extract_all_objects(recursive: false),
Paolo Bonzini70eb5fd2024-05-24 18:16:08 +02003855 dependencies: [qom, io])
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003856system_ss.add(migration)
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003857
Paolo Bonzini1220f582023-08-30 11:52:43 +02003858block_ss = block_ss.apply({})
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003859libblock = static_library('block', block_ss.sources() + genh,
3860 dependencies: block_ss.dependencies(),
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003861 build_by_default: false)
3862
Akihiko Odaki414b1802024-05-24 17:00:22 +09003863block = declare_dependency(objects: libblock.extract_all_objects(recursive: false),
3864 dependencies: [block_ss.dependencies(), crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003865
Paolo Bonzini1220f582023-08-30 11:52:43 +02003866blockdev_ss = blockdev_ss.apply({})
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003867libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
3868 dependencies: blockdev_ss.dependencies(),
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003869 build_by_default: false)
3870
Akihiko Odaki414b1802024-05-24 17:00:22 +09003871blockdev = declare_dependency(objects: libblockdev.extract_all_objects(recursive: false),
3872 dependencies: [blockdev_ss.dependencies(), block, event_loop_base])
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003873
Paolo Bonzini1220f582023-08-30 11:52:43 +02003874qmp_ss = qmp_ss.apply({})
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003875libqmp = static_library('qmp', qmp_ss.sources() + genh,
3876 dependencies: qmp_ss.dependencies(),
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003877 build_by_default: false)
3878
Akihiko Odaki414b1802024-05-24 17:00:22 +09003879qmp = declare_dependency(objects: libqmp.extract_all_objects(recursive: false),
3880 dependencies: qmp_ss.dependencies())
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003881
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003882libchardev = static_library('chardev', chardev_ss.sources() + genh,
Marc-André Lureau22d1f7a2022-03-23 19:57:12 +04003883 dependencies: chardev_ss.dependencies(),
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003884 build_by_default: false)
3885
Akihiko Odaki414b1802024-05-24 17:00:22 +09003886chardev = declare_dependency(objects: libchardev.extract_all_objects(recursive: false),
3887 dependencies: chardev_ss.dependencies())
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003888
Paolo Bonzini1220f582023-08-30 11:52:43 +02003889hwcore_ss = hwcore_ss.apply({})
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02003890libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02003891 build_by_default: false)
Akihiko Odaki414b1802024-05-24 17:00:22 +09003892hwcore = declare_dependency(objects: libhwcore.extract_all_objects(recursive: false))
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02003893common_ss.add(hwcore)
3894
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02003895###########
3896# Targets #
3897###########
3898
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003899system_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003900common_ss.add(qom, qemuutil)
3901
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003902common_ss.add_all(when: 'CONFIG_SYSTEM_ONLY', if_true: [system_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01003903common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
3904
Paolo Bonzini0d665492023-08-31 11:18:24 +02003905# Note that this library is never used directly (only through extract_objects)
3906# and is not built by default; therefore, source files not used by the build
3907# configuration will be in build.ninja, but are never built by default.
Paolo Bonzini2becc362020-02-03 11:42:03 +01003908common_all = static_library('common',
3909 build_by_default: false,
Paolo Bonzini0d665492023-08-31 11:18:24 +02003910 sources: common_ss.all_sources() + genh,
Paolo Bonzini9d24fb72021-12-21 16:09:54 +01003911 include_directories: common_user_inc,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09003912 implicit_include_directories: false,
Paolo Bonzini44081552024-05-24 10:56:55 +02003913 dependencies: common_ss.all_dependencies())
Paolo Bonzini2becc362020-02-03 11:42:03 +01003914
Manos Pitsidianakis6fdc5bc2024-10-03 16:28:46 +03003915if have_rust and have_system
3916 rustc_args = run_command(
3917 find_program('scripts/rust/rustc_args.py'),
3918 '--config-headers', meson.project_build_root() / 'config-host.h',
3919 capture : true,
3920 check: true).stdout().strip().split()
3921 rustc_args += ['-D', 'unsafe_op_in_unsafe_fn']
3922 bindgen_args = [
3923 '--disable-header-comment',
3924 '--raw-line', '// @generated',
3925 '--ctypes-prefix', 'core::ffi',
3926 '--formatter', 'rustfmt',
3927 '--generate-block',
3928 '--generate-cstr',
3929 '--impl-debug',
3930 '--merge-extern-blocks',
3931 '--no-doc-comments',
3932 '--use-core',
3933 '--with-derive-default',
3934 '--no-size_t-is-usize',
3935 '--no-layout-tests',
3936 '--no-prepend-enum-name',
3937 '--allowlist-file', meson.project_source_root() + '/include/.*',
3938 '--allowlist-file', meson.project_source_root() + '/.*',
3939 '--allowlist-file', meson.project_build_root() + '/.*'
3940 ]
3941 c_enums = [
3942 'DeviceCategory',
3943 'GpioPolarity',
3944 'MachineInitPhase',
3945 'MemoryDeviceInfoKind',
3946 'MigrationPolicy',
3947 'MigrationPriority',
3948 'QEMUChrEvent',
3949 'QEMUClockType',
3950 'device_endian',
3951 'module_init_type',
3952 ]
3953 foreach enum : c_enums
3954 bindgen_args += ['--rustified-enum', enum]
3955 endforeach
3956 c_bitfields = [
3957 'ClockEvent',
3958 'VMStateFlags',
3959 ]
3960 foreach enum : c_bitfields
3961 bindgen_args += ['--bitfield-enum', enum]
3962 endforeach
3963
3964 # TODO: Remove this comment when the clang/libclang mismatch issue is solved.
3965 #
3966 # Rust bindings generation with `bindgen` might fail in some cases where the
3967 # detected `libclang` does not match the expected `clang` version/target. In
3968 # this case you must pass the path to `clang` and `libclang` to your build
3969 # command invocation using the environment variables CLANG_PATH and
3970 # LIBCLANG_PATH
3971 bindings_rs = import('rust').bindgen(
3972 input: 'rust/wrapper.h',
3973 dependencies: common_ss.all_dependencies(),
3974 output: 'bindings.rs',
3975 include_directories: include_directories('.', 'include'),
3976 bindgen_version: ['>=0.69.4'],
3977 args: bindgen_args,
3978 )
3979 subdir('rust')
3980endif
3981
3982
Akihiko Odaki956af7d2023-10-09 17:40:51 +01003983feature_to_c = find_program('scripts/feature_to_c.py')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003984
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01003985if host_os == 'darwin'
Philippe Mathieu-Daudé30cfa502022-02-15 17:25:03 +01003986 entitlement = find_program('scripts/entitlement.sh')
3987endif
3988
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00003989traceable = []
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04003990emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003991foreach target : target_dirs
3992 config_target = config_target_mak[target]
3993 target_name = config_target['TARGET_NAME']
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003994 target_base_arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02003995 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003996 arch_deps = []
Philippe Mathieu-Daudé7d7a21b2023-06-13 16:29:11 +02003997 c_args = ['-DCOMPILING_PER_TARGET',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003998 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3999 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04004000 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01004001
4002 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004003 if host_os == 'linux'
Paolo Bonzini2becc362020-02-03 11:42:03 +01004004 target_inc += include_directories('linux-headers', is_system: true)
4005 endif
4006 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01004007 target_type='system'
Philippe Mathieu-Daudé01c85e62023-10-04 11:06:27 +02004008 t = target_system_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004009 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004010 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004011
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004012 hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
Philippe Mathieu-Daudébf964322023-11-21 13:52:48 +01004013 if hw_arch.has_key(hw_dir)
4014 hw = hw_arch[hw_dir].apply(config_target, strict: false)
4015 arch_srcs += hw.sources()
4016 arch_deps += hw.dependencies()
4017 endif
Marc-André Lureau2c442202019-08-17 13:55:58 +04004018
Paolo Bonzini2becc362020-02-03 11:42:03 +01004019 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004020 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01004021 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04004022 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01004023 target_type='user'
Paolo Bonzinia3a576b2021-12-21 16:23:55 +01004024 target_inc += common_user_inc
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004025 if target_base_arch in target_user_arch
4026 t = target_user_arch[target_base_arch].apply(config_target, strict: false)
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02004027 arch_srcs += t.sources()
4028 arch_deps += t.dependencies()
4029 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01004030 if 'CONFIG_LINUX_USER' in config_target
4031 base_dir = 'linux-user'
Warner Loshe2a74722021-08-03 17:17:17 -06004032 endif
4033 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01004034 base_dir = 'bsd-user'
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004035 target_inc += include_directories('bsd-user/' / host_os)
Warner Losh85fc1b52022-01-08 17:27:34 -07004036 target_inc += include_directories('bsd-user/host/' / host_arch)
Warner Loshe2a74722021-08-03 17:17:17 -06004037 dir = base_dir / abi
Warner Losh19bf1292021-11-04 16:34:48 -06004038 arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01004039 endif
4040 target_inc += include_directories(
4041 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04004042 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01004043 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04004044 if 'CONFIG_LINUX_USER' in config_target
4045 dir = base_dir / abi
4046 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
4047 if config_target.has_key('TARGET_SYSTBL_ABI')
4048 arch_srcs += \
4049 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
4050 extra_args : config_target['TARGET_SYSTBL_ABI'])
4051 endif
4052 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01004053 endif
4054
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04004055 if 'TARGET_XML_FILES' in config_target
4056 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
4057 output: target + '-gdbstub-xml.c',
4058 input: files(config_target['TARGET_XML_FILES'].split()),
4059 command: [feature_to_c, '@INPUT@'],
4060 capture: true)
4061 arch_srcs += gdbstub_xml
4062 endif
4063
Paolo Bonziniffb91f62021-11-08 15:44:39 +01004064 t = target_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004065 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004066 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02004067
Paolo Bonzini2becc362020-02-03 11:42:03 +01004068 target_common = common_ss.apply(config_target, strict: false)
4069 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004070 arch_deps += target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01004071
Paolo Bonzini2becc362020-02-03 11:42:03 +01004072 target_specific = specific_ss.apply(config_target, strict: false)
4073 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004074 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01004075
Paolo Bonzinid0f0cd52024-10-10 16:11:28 +02004076 if have_rust and have_system
4077 target_rust = rust_devices_ss.apply(config_target, strict: false)
4078 crates = []
4079 foreach dep : target_rust.dependencies()
4080 crates += dep.get_variable('crate')
4081 endforeach
4082 if crates.length() > 0
4083 rlib_rs = custom_target('rust_' + target.underscorify() + '.rs',
4084 output: 'rust_' + target.underscorify() + '.rs',
4085 command: [find_program('scripts/rust/rust_root_crate.sh')] + crates,
4086 capture: true,
4087 build_by_default: true,
4088 build_always_stale: true)
4089 rlib = static_library('rust_' + target.underscorify(),
4090 rlib_rs,
4091 dependencies: target_rust.dependencies(),
4092 override_options: ['rust_std=2021', 'build.rust_std=2021'],
4093 rust_args: rustc_args,
4094 rust_abi: 'c')
4095 arch_deps += declare_dependency(link_whole: [rlib])
4096 endif
4097 endif
4098
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004099 # allow using headers from the dependencies but do not include the sources,
4100 # because this emulator only needs those in "objects". For external
4101 # dependencies, the full dependency is included below in the executable.
4102 lib_deps = []
4103 foreach dep : arch_deps
4104 lib_deps += dep.partial_dependency(compile_args: true, includes: true)
4105 endforeach
4106
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004107 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02004108 sources: arch_srcs + genh,
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004109 dependencies: lib_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01004110 objects: objects,
4111 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004112 c_args: c_args,
Paolo Bonzini44081552024-05-24 10:56:55 +02004113 build_by_default: false)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004114
4115 if target.endswith('-softmmu')
4116 execs = [{
4117 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004118 'win_subsystem': 'console',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02004119 'sources': files('system/main.c'),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004120 'dependencies': []
4121 }]
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004122 if host_os == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004123 execs += [{
4124 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004125 'win_subsystem': 'windows',
Philippe Mathieu-Daudé8d7f2e72023-10-04 11:06:28 +02004126 'sources': files('system/main.c'),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004127 'dependencies': []
4128 }]
4129 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004130 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004131 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
4132 execs += [{
4133 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004134 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004135 'sources': specific_fuzz.sources(),
4136 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004137 }]
4138 endif
4139 else
4140 execs = [{
4141 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004142 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004143 'sources': [],
4144 'dependencies': []
4145 }]
4146 endif
4147 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01004148 exe_name = exe['name']
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004149 if host_os == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01004150 exe_name += '-unsigned'
4151 endif
4152
4153 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09004154 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004155 c_args: c_args,
Paolo Bonzini727bb5b2024-05-07 12:22:31 +02004156 dependencies: arch_deps + exe['dependencies'],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004157 objects: lib.extract_all_objects(recursive: true),
Paolo Bonzini05007252024-03-20 11:28:28 +01004158 link_depends: [block_syms, qemu_syms],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004159 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004160 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01004161
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004162 if host_os == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004163 icon = 'pc-bios/qemu.rsrc'
4164 build_input = [emulator, files(icon)]
4165 install_input = [
4166 get_option('bindir') / exe_name,
4167 meson.current_source_dir() / icon
4168 ]
4169 if 'CONFIG_HVF' in config_target
4170 entitlements = 'accel/hvf/entitlements.plist'
4171 build_input += files(entitlements)
4172 install_input += meson.current_source_dir() / entitlements
4173 endif
4174
Alexander Graf8a74ce62021-01-20 23:44:34 +01004175 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004176 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01004177 output: exe['name'],
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01004178 command: [entitlement, '@OUTPUT@', '@INPUT@'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01004179 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09004180
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01004181 meson.add_install_script(entitlement, '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09004182 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09004183 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01004184 else
4185 emulators += {exe['name']: emulator}
4186 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04004187
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004188 traceable += [{
4189 'exe': exe['name'],
4190 'probe-prefix': 'qemu.' + target_type + '.' + target_name,
4191 }]
4192
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02004193 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01004194endforeach
4195
Paolo Bonzini931049b2020-02-05 09:44:24 +01004196# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004197
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004198if get_option('plugins')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01004199 install_headers('include/qemu/qemu-plugin.h')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004200 if host_os == 'windows'
Greg Manning36fa0772023-11-06 18:51:06 +00004201 # On windows, we want to deliver the qemu_plugin_api.lib file in the qemu installer,
4202 # so that plugin authors can compile against it.
4203 install_data(win32_qemu_plugin_api_lib, install_dir: 'lib')
4204 endif
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01004205endif
4206
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004207subdir('qga')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02004208
Laurent Vivier9755c942020-08-24 17:24:30 +02004209# Don't build qemu-keymap if xkbcommon is not explicitly enabled
4210# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02004211if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04004212 # used for the update-keymaps target, so include rules even if !have_tools
4213 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
4214 dependencies: [qemuutil, xkbcommon], install: have_tools)
4215endif
4216
Paolo Bonzini931049b2020-02-05 09:44:24 +01004217if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004218 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004219 link_args: '@block.syms', link_depends: block_syms,
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004220 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
4221 qemu_io = executable('qemu-io', files('qemu-io.c'),
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004222 link_args: '@block.syms', link_depends: block_syms,
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004223 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01004224 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Paolo Bonzinie8f62682024-05-24 13:17:08 +02004225 link_args: '@block.syms', link_depends: block_syms,
Akihiko Odaki7b1070a2024-05-24 17:00:23 +09004226 dependencies: [blockdev, qemuutil, selinux],
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004227 install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04004228
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02004229 subdir('storage-daemon')
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004230
4231 foreach exe: [ 'qemu-img', 'qemu-io', 'qemu-nbd', 'qemu-storage-daemon']
4232 traceable += [{
4233 'exe': exe,
4234 'probe-prefix': 'qemu.' + exe.substring(5).replace('-', '_')
4235 }]
4236 endforeach
4237
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04004238 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02004239
Marc-André Lureau157e7b12019-07-15 14:50:58 +04004240 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
4241 dependencies: qemuutil,
4242 install: true)
4243
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004244 if have_vhost_user
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02004245 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02004246 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04004247 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02004248 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01004249 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004250
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004251 if host_os == 'linux'
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004252 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
4253 dependencies: [qemuutil, libcap_ng],
4254 install: true,
4255 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004256
4257 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
4258 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02004259 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04004260 install: true)
Anthony Harivel84369d72024-05-22 17:34:51 +02004261
4262 if cpu in ['x86', 'x86_64']
4263 executable('qemu-vmsr-helper', files('tools/i386/qemu-vmsr-helper.c'),
4264 dependencies: [authz, crypto, io, qom, qemuutil,
4265 libcap_ng, mpathpersist],
4266 install: true)
4267 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04004268 endif
4269
Paolo Bonziniccd250a2021-06-03 12:50:17 +02004270 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04004271 subdir('contrib/ivshmem-client')
4272 subdir('contrib/ivshmem-server')
4273 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01004274endif
4275
Daniel P. Berrangé2b608e12024-01-08 17:13:56 +00004276if stap.found()
4277 foreach t: traceable
4278 foreach stp: [
4279 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / t['exe'], 'install': false},
4280 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / t['exe'], 'install': true},
4281 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
4282 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
4283 ]
4284 cmd = [
4285 tracetool, '--group=all', '--format=' + stp['fmt'],
4286 '--binary=' + stp['bin'],
4287 '--probe-prefix=' + t['probe-prefix'],
4288 '@INPUT@', '@OUTPUT@'
4289 ]
4290
4291 custom_target(t['exe'] + stp['ext'],
4292 input: trace_events_all,
4293 output: t['exe'] + stp['ext'],
4294 install: stp['install'],
4295 install_dir: get_option('datadir') / 'systemtap/tapset',
4296 command: cmd,
4297 depend_files: tracetool_depends)
4298 endforeach
4299 endforeach
4300endif
4301
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04004302subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004303subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04004304subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02004305subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08004306subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01004307if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04004308 subdir('po')
4309endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01004310
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004311if host_machine.system() == 'windows'
4312 nsis_cmd = [
4313 find_program('scripts/nsis.py'),
4314 '@OUTPUT@',
4315 get_option('prefix'),
4316 meson.current_source_dir(),
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02004317 glib_pc.get_variable('bindir'),
Stefan Weil24bdcc92020-11-25 20:18:33 +01004318 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004319 '--',
4320 '-DDISPLAYVERSION=' + meson.project_version(),
4321 ]
4322 if build_docs
4323 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
4324 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01004325 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04004326 nsis_cmd += '-DCONFIG_GTK=y'
4327 endif
4328
4329 nsis = custom_target('nsis',
4330 output: 'qemu-setup-' + meson.project_version() + '.exe',
4331 input: files('qemu.nsi'),
4332 build_always_stale: true,
4333 command: nsis_cmd + ['@INPUT@'])
4334 alias_target('installer', nsis)
4335endif
4336
Paolo Bonzinia0c91622020-10-07 11:01:51 -04004337#########################
4338# Configuration summary #
4339#########################
4340
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004341# Build environment
Paolo Bonzinif9332752020-02-03 13:28:38 +01004342summary_info = {}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004343summary_info += {'Build directory': meson.current_build_dir()}
4344summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004345summary_info += {'Download dependencies': get_option('wrap_mode') != 'nodownload'}
4346summary(summary_info, bool_yn: true, section: 'Build environment')
4347
4348# Directories
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004349summary_info += {'Install prefix': get_option('prefix')}
4350summary_info += {'BIOS directory': qemu_datadir}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004351pathsep = host_os == 'windows' ? ';' : ':'
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09004352summary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004353summary_info += {'binary directory': get_option('prefix') / get_option('bindir')}
4354summary_info += {'library directory': get_option('prefix') / get_option('libdir')}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004355summary_info += {'module directory': qemu_moddir}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004356summary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
4357summary_info += {'include directory': get_option('prefix') / get_option('includedir')}
4358summary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004359if host_os != 'windows'
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004360 summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
4361 summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004362else
4363 summary_info += {'local state directory': 'queried at runtime'}
4364endif
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004365summary_info += {'Doc directory': get_option('prefix') / get_option('docdir')}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004366summary(summary_info, bool_yn: true, section: 'Directories')
4367
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004368# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004369summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004370summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004371summary_info += {'sphinx-build': sphinx_build}
Paolo Bonzinib4d61d32023-09-28 12:00:48 +02004372
4373# FIXME: the [binaries] section of machine files, which can be probed
4374# with find_program(), would be great for passing gdb and genisoimage
4375# paths from configure to Meson. However, there seems to be no way to
4376# hide a program (for example if gdb is too old).
Paolo Bonzinia47dd5c2023-09-28 10:44:56 +02004377if config_host.has_key('GDB')
4378 summary_info += {'gdb': config_host['GDB']}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004379endif
Paolo Bonzini40c909f2022-04-20 17:33:49 +02004380summary_info += {'iasl': iasl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004381summary_info += {'genisoimage': config_host['GENISOIMAGE']}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004382if host_os == 'windows' and have_ga
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004383 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004384endif
Thomas Huth58902582022-04-08 18:20:47 +02004385if slirp.found() and have_system
Paolo Bonzini35acbb32021-10-13 13:43:36 +02004386 summary_info += {'smbd': have_slirp_smbd ? smbd_path : false}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004387endif
4388summary(summary_info, bool_yn: true, section: 'Host binaries')
4389
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004390# Configurable features
4391summary_info = {}
4392summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004393summary_info += {'system-mode emulation': have_system}
4394summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004395summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004396summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini60027112022-10-20 14:53:10 +02004397summary_info += {'module support': enable_modules}
4398if enable_modules
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02004399 summary_info += {'alternative module path': get_option('module_upgrades')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004400endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004401summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004402if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02004403 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004404endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02004405summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
4406if 'simple' in get_option('trace_backends')
4407 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004408endif
Marc-André Lureau142ca622021-07-15 11:53:53 +04004409summary_info += {'D-Bus display': dbus_display}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004410summary_info += {'QOM debugging': get_option('qom_cast_debug')}
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004411summary_info += {'Relocatable install': get_option('relocatable')}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004412summary_info += {'vhost-kernel support': have_vhost_kernel}
4413summary_info += {'vhost-net support': have_vhost_net}
4414summary_info += {'vhost-user support': have_vhost_user}
4415summary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004416summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004417summary_info += {'vhost-vdpa support': have_vhost_vdpa}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004418summary_info += {'build guest agent': have_ga}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004419summary(summary_info, bool_yn: true, section: 'Configurable features')
4420
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004421# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004422summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004423summary_info += {'host CPU': cpu}
4424summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01004425summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
4426summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Thomas Huth785abf02023-07-06 08:47:36 +02004427if 'cpp' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004428 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004429else
4430 summary_info += {'C++ compiler': false}
4431endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004432if 'objc' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004433 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004434else
4435 summary_info += {'Objective-C compiler': false}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004436endif
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03004437summary_info += {'Rust support': have_rust}
4438if have_rust
Paolo Bonzini1a6ef6f2024-10-03 16:28:45 +03004439 summary_info += {'rustc version': rustc.version()}
4440 summary_info += {'rustc': ' '.join(rustc.cmd_array())}
4441 summary_info += {'Rust target': config_host['RUST_TARGET_TRIPLE']}
Manos Pitsidianakis764a6ee2024-10-03 16:28:44 +03004442endif
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004443option_cflags = (get_option('debug') ? ['-g'] : [])
4444if get_option('optimization') != 'plain'
4445 option_cflags += ['-O' + get_option('optimization')]
4446endif
4447summary_info += {'CFLAGS': ' '.join(get_option('c_args') + option_cflags)}
Thomas Huth785abf02023-07-06 08:47:36 +02004448if 'cpp' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004449 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args') + option_cflags)}
Paolo Bonzini47b30832020-09-23 05:26:17 -04004450endif
Philippe Mathieu-Daudéda6f5542023-10-09 08:51:29 +02004451if 'objc' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004452 summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args') + option_cflags)}
Philippe Mathieu-Daudée910c7d2022-01-08 22:38:55 +01004453endif
Thomas Huth785abf02023-07-06 08:47:36 +02004454link_args = get_option('c_link_args')
Paolo Bonzini47b30832020-09-23 05:26:17 -04004455if link_args.length() > 0
4456 summary_info += {'LDFLAGS': ' '.join(link_args)}
4457endif
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004458summary_info += {'QEMU_CFLAGS': ' '.join(qemu_common_flags + qemu_cflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004459if 'cpp' in all_languages
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004460 summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_common_flags + qemu_cxxflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004461endif
4462if 'objc' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +01004463 summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_common_flags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004464endif
Paolo Bonzinid0651772022-04-20 17:33:34 +02004465summary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)}
Daniele Buonocdad7812020-12-04 18:06:11 -05004466summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004467summary_info += {'PIE': get_option('b_pie')}
Paolo Bonzinie58e55d2023-06-07 10:00:21 +02004468summary_info += {'static build': get_option('prefer_static')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004469summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinib87df902021-11-08 13:52:11 +01004470summary_info += {'membarrier': have_membarrier}
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04004471summary_info += {'debug graph lock': get_option('debug_graph_lock')}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004472summary_info += {'debug stack usage': get_option('debug_stack_usage')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004473summary_info += {'mutex debugging': get_option('debug_mutex')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004474summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01004475summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
ling xu04ffce12022-11-16 23:29:22 +08004476summary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004477summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzini34f983d2023-01-09 15:31:51 +01004478summary_info += {'thread sanitizer': get_option('tsan')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004479summary_info += {'CFI support': get_option('cfi')}
4480if get_option('cfi')
4481 summary_info += {'CFI debug support': get_option('cfi_debug')}
4482endif
4483summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004484summary_info += {'sparse': sparse}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004485summary_info += {'mingw32 support': host_os == 'windows'}
Paolo Bonzini12640f02022-06-06 11:48:47 +02004486summary(summary_info, bool_yn: true, section: 'Compilation')
Alex Bennée49e85652021-02-22 10:14:50 +00004487
4488# snarf the cross-compilation information for tests
Paolo Bonzini12640f02022-06-06 11:48:47 +02004489summary_info = {}
4490have_cross = false
Alex Bennée49e85652021-02-22 10:14:50 +00004491foreach target: target_dirs
Paolo Bonzinic7022a72022-09-29 12:42:07 +01004492 tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak'
Alex Bennée49e85652021-02-22 10:14:50 +00004493 if fs.exists(tcg_mak)
4494 config_cross_tcg = keyval.load(tcg_mak)
Alex Bennée85b141e2022-05-27 16:35:34 +01004495 if 'CC' in config_cross_tcg
Paolo Bonzini12640f02022-06-06 11:48:47 +02004496 summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
4497 have_cross = true
Alex Bennée49e85652021-02-22 10:14:50 +00004498 endif
Paolo Bonzini12640f02022-06-06 11:48:47 +02004499 endif
Alex Bennée49e85652021-02-22 10:14:50 +00004500endforeach
Paolo Bonzini12640f02022-06-06 11:48:47 +02004501if have_cross
4502 summary(summary_info, bool_yn: true, section: 'Cross compilers')
4503endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004504
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004505# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004506summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004507if have_system
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004508 summary_info += {'KVM support': config_all_accel.has_key('CONFIG_KVM')}
4509 summary_info += {'HVF support': config_all_accel.has_key('CONFIG_HVF')}
4510 summary_info += {'WHPX support': config_all_accel.has_key('CONFIG_WHPX')}
4511 summary_info += {'NVMM support': config_all_accel.has_key('CONFIG_NVMM')}
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02004512 summary_info += {'Xen support': xen.found()}
4513 if xen.found()
4514 summary_info += {'xen ctrl version': xen.version()}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004515 endif
Paolo Bonzini0d665492023-08-31 11:18:24 +02004516 summary_info += {'Xen emulation': config_all_devices.has_key('CONFIG_XEN_EMU')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004517endif
Paolo Bonzinicfc1a882023-09-29 11:40:03 +02004518summary_info += {'TCG support': config_all_accel.has_key('CONFIG_TCG')}
4519if config_all_accel.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004520 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +01004521 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004522 else
4523 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
4524 endif
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004525 summary_info += {'TCG plugins': get_option('plugins')}
Paolo Bonzini1d558c92023-08-28 11:48:30 +02004526 summary_info += {'TCG debug enabled': get_option('debug_tcg')}
Ilya Leoshkevich1f2355f2024-03-12 01:23:30 +01004527 if have_linux_user or have_bsd_user
4528 summary_info += {'syscall buffer debugging support': get_option('debug_remap')}
4529 endif
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004530endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004531summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004532if have_system
4533 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01004534 summary_info += {'out of process emulation': multiprocess_allowed}
Jagannathan Raman55116962022-06-13 16:26:24 -04004535 summary_info += {'vfio-user server': vfio_user_server_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004536endif
4537summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
4538
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004539# Block layer
4540summary_info = {}
Paolo Bonzini67398252022-10-12 13:19:35 +02004541summary_info += {'coroutine backend': coroutine_backend}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004542summary_info += {'coroutine pool': have_coroutine_pool}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004543if have_block
Paolo Bonzini622d64f2022-04-20 17:33:53 +02004544 summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
4545 summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004546 summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
Christian Schoenebeck38877022023-05-11 16:12:34 +02004547 summary_info += {'VirtFS (9P) support': have_virtfs}
Paolo Bonzini406523f2021-10-13 11:43:54 +02004548 summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004549 summary_info += {'bochs support': get_option('bochs').allowed()}
4550 summary_info += {'cloop support': get_option('cloop').allowed()}
4551 summary_info += {'dmg support': get_option('dmg').allowed()}
4552 summary_info += {'qcow v1 support': get_option('qcow1').allowed()}
4553 summary_info += {'vdi support': get_option('vdi').allowed()}
Vladimir Sementsov-Ogievskiy11cea422023-04-21 12:27:58 +03004554 summary_info += {'vhdx support': get_option('vhdx').allowed()}
4555 summary_info += {'vmdk support': get_option('vmdk').allowed()}
4556 summary_info += {'vpc support': get_option('vpc').allowed()}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004557 summary_info += {'vvfat support': get_option('vvfat').allowed()}
4558 summary_info += {'qed support': get_option('qed').allowed()}
4559 summary_info += {'parallels support': get_option('parallels').allowed()}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004560 summary_info += {'FUSE exports': fuse}
Xie Yongji2a2359b2022-05-23 16:46:09 +08004561 summary_info += {'VDUSE block exports': have_vduse_blk_export}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004562endif
4563summary(summary_info, bool_yn: true, section: 'Block layer support')
4564
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004565# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004566summary_info = {}
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02004567summary_info += {'TLS priority': get_option('tls_priority')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004568summary_info += {'GNUTLS support': gnutls}
4569if gnutls.found()
4570 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
4571endif
4572summary_info += {'libgcrypt': gcrypt}
4573summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02004574if nettle.found()
4575 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004576endif
Hyman Huang52ed9f42023-12-07 23:47:35 +08004577summary_info += {'SM4 ALG support': crypto_sm4}
Paolo Bonzini34b52612021-11-08 14:02:42 +01004578summary_info += {'AF_ALG support': have_afalg}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004579summary_info += {'rng-none': get_option('rng_none')}
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02004580summary_info += {'Linux keyring': have_keyring}
Thomas Huthc64023b2023-08-24 11:42:08 +02004581summary_info += {'Linux keyutils': keyutils}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004582summary(summary_info, bool_yn: true, section: 'Crypto')
4583
Thomas Huth9e48afa2023-06-02 19:18:30 +02004584# UI
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004585summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004586if host_os == 'darwin'
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03004587 summary_info += {'Cocoa support': cocoa}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004588endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004589summary_info += {'SDL support': sdl}
4590summary_info += {'SDL image support': sdl_image}
4591summary_info += {'GTK support': gtk}
4592summary_info += {'pixman': pixman}
4593summary_info += {'VTE support': vte}
Kshitij Suri95f85102022-04-08 07:13:34 +00004594summary_info += {'PNG support': png}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004595summary_info += {'VNC support': vnc}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01004596if vnc.found()
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004597 summary_info += {'VNC SASL support': sasl}
4598 summary_info += {'VNC JPEG support': jpeg}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004599endif
Thomas Huth9e48afa2023-06-02 19:18:30 +02004600summary_info += {'spice protocol support': spice_protocol}
4601if spice_protocol.found()
4602 summary_info += {' spice server support': spice}
4603endif
4604summary_info += {'curses support': curses}
4605summary_info += {'brlapi support': brlapi}
4606summary(summary_info, bool_yn: true, section: 'User interface')
4607
Alex Bennéef705c1f2023-12-22 11:48:46 +00004608# Graphics backends
4609summary_info = {}
4610summary_info += {'VirGL support': virgl}
4611summary_info += {'Rutabaga support': rutabaga}
4612summary(summary_info, bool_yn: true, section: 'Graphics backends')
4613
Thomas Huthaece7232023-06-02 19:18:32 +02004614# Audio backends
4615summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004616if host_os not in ['darwin', 'haiku', 'windows']
Paolo Bonzini87430d52021-10-07 15:06:09 +02004617 summary_info += {'OSS support': oss}
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02004618 summary_info += {'sndio support': sndio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004619elif host_os == 'darwin'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004620 summary_info += {'CoreAudio support': coreaudio}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004621elif host_os == 'windows'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004622 summary_info += {'DirectSound support': dsound}
4623endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004624if host_os == 'linux'
Paolo Bonzini87430d52021-10-07 15:06:09 +02004625 summary_info += {'ALSA support': alsa}
4626 summary_info += {'PulseAudio support': pulse}
4627endif
Marc-André Lureau20c51242023-05-06 20:37:26 +04004628summary_info += {'PipeWire support': pipewire}
Paolo Bonzini87430d52021-10-07 15:06:09 +02004629summary_info += {'JACK support': jack}
Thomas Huthaece7232023-06-02 19:18:32 +02004630summary(summary_info, bool_yn: true, section: 'Audio backends')
4631
Thomas Huthc3527c52023-06-02 19:18:31 +02004632# Network backends
Thomas Huth9e48afa2023-06-02 19:18:30 +02004633summary_info = {}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004634if host_os == 'darwin'
Thomas Huth9e48afa2023-06-02 19:18:30 +02004635 summary_info += {'vmnet.framework support': vmnet}
4636endif
Ilya Maximetscb039ef2023-09-13 20:34:37 +02004637summary_info += {'AF_XDP support': libxdp}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004638summary_info += {'slirp support': slirp}
Paolo Bonzinie1723992021-10-07 15:08:21 +02004639summary_info += {'vde support': vde}
Paolo Bonzini837b84b2021-10-07 15:08:22 +02004640summary_info += {'netmap support': have_netmap}
Thomas Hutheea94532021-10-28 20:59:08 +02004641summary_info += {'l2tpv3 support': have_l2tpv3}
Thomas Huthc3527c52023-06-02 19:18:31 +02004642summary(summary_info, bool_yn: true, section: 'Network backends')
4643
4644# Libraries
4645summary_info = {}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004646summary_info += {'libtasn1': tasn1}
4647summary_info += {'PAM': pam}
4648summary_info += {'iconv support': iconv}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004649summary_info += {'blkio support': blkio}
4650summary_info += {'curl support': curl}
4651summary_info += {'Multipath support': mpathpersist}
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02004652summary_info += {'Linux AIO support': libaio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004653summary_info += {'Linux io_uring support': linux_io_uring}
4654summary_info += {'ATTR/XATTR support': libattr}
Paolo Bonzini3730a732022-04-20 17:33:41 +02004655summary_info += {'RDMA support': rdma}
Paolo Bonzini7a6f3342024-01-25 12:22:57 +01004656summary_info += {'fdt support': fdt_opt == 'internal' ? 'internal' : fdt}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004657summary_info += {'libcap-ng support': libcap_ng}
4658summary_info += {'bpf support': libbpf}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004659summary_info += {'rbd support': rbd}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004660summary_info += {'smartcard support': cacard}
4661summary_info += {'U2F support': u2f}
4662summary_info += {'libusb': libusb}
4663summary_info += {'usb net redir': usbredir}
Paolo Bonzini88b6e612022-04-20 17:33:40 +02004664summary_info += {'OpenGL support (epoxy)': opengl}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004665summary_info += {'GBM': gbm}
4666summary_info += {'libiscsi support': libiscsi}
4667summary_info += {'libnfs support': libnfs}
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004668if host_os == 'windows'
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004669 if have_ga
Marc-André Lureau8821a382022-02-01 16:53:43 +04004670 summary_info += {'QGA VSS support': have_qga_vss}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01004671 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01004672endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004673summary_info += {'seccomp support': seccomp}
4674summary_info += {'GlusterFS support': glusterfs}
Maciej S. Szmigiero0d9e8c02023-06-12 16:00:54 +02004675summary_info += {'hv-balloon support': hv_balloon}
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01004676summary_info += {'TPM support': have_tpm}
Thomas Huthe6a52b32021-12-09 15:48:01 +01004677summary_info += {'libssh support': libssh}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004678summary_info += {'lzo support': lzo}
4679summary_info += {'snappy support': snappy}
4680summary_info += {'bzip2 support': libbzip2}
4681summary_info += {'lzfse support': liblzfse}
4682summary_info += {'zstd support': zstd}
Yuan Liub844a2c2024-06-10 18:21:06 +08004683summary_info += {'Query Processing Library support': qpl}
Shameer Kolothumcfc589a2024-06-07 14:53:05 +01004684summary_info += {'UADK Library support': uadk}
Bryan Zhange28ed312024-08-30 16:27:19 -07004685summary_info += {'qatzip support': qatzip}
Paolo Bonzini488a8c72021-12-21 12:38:27 +01004686summary_info += {'NUMA host support': numa}
Thomas Huth83602082022-05-16 16:58:23 +02004687summary_info += {'capstone': capstone}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004688summary_info += {'libpmem support': libpmem}
4689summary_info += {'libdaxctl support': libdaxctl}
4690summary_info += {'libudev': libudev}
4691# Dummy dependency, keep .found()
Max Reitzdf4ea702020-10-27 20:05:46 +01004692summary_info += {'FUSE lseek': fuse_lseek.found()}
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004693summary_info += {'selinux': selinux}
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01004694summary_info += {'libdw': libdw}
Ilya Leoshkevicha1a98002024-02-06 01:22:03 +01004695if host_os == 'freebsd'
4696 summary_info += {'libinotify-kqueue': inotify}
4697endif
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01004698summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004699
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004700if host_arch == 'unknown'
Paolo Bonzinif9332752020-02-03 13:28:38 +01004701 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004702 warning('UNSUPPORTED HOST CPU')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004703 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004704 message('Support for CPU host architecture ' + cpu + ' is not currently')
4705 message('maintained. The QEMU project does not guarantee that QEMU will')
4706 message('compile or work on this host CPU. You can help by volunteering')
4707 message('to maintain it and providing a build host for our continuous')
4708 message('integration setup.')
4709 if get_option('tcg').allowed() and target_dirs.length() > 0
4710 message()
4711 message('configure has succeeded and you can continue to build, but')
4712 message('QEMU will use a slow interpreter to emulate the target CPU.')
4713 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01004714endif
4715
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004716if not supported_oses.contains(host_os)
Paolo Bonzinif9332752020-02-03 13:28:38 +01004717 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004718 warning('UNSUPPORTED HOST OS')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004719 message()
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004720 message('Support for host OS ' + host_os + 'is not currently maintained.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004721 message('configure has succeeded and you can continue to build, but')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004722 message('the QEMU project does not guarantee that QEMU will compile or')
4723 message('work on this operating system. You can help by volunteering')
4724 message('to maintain it and providing a build host for our continuous')
4725 message('integration setup. This will ensure that future versions of QEMU')
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004726 message('will keep working on ' + host_os + '.')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004727endif
4728
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004729if host_arch == 'unknown' or not supported_oses.contains(host_os)
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004730 message()
4731 message('If you want to help supporting QEMU on this platform, please')
4732 message('contact the developers at qemu-devel@nongnu.org.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004733endif
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004734
4735actually_reloc = get_option('relocatable')
4736# check if get_relocated_path() is actually able to relocate paths
4737if get_option('relocatable') and \
4738 not (get_option('prefix') / get_option('bindir')).startswith(get_option('prefix') / '')
4739 message()
4740 warning('bindir not included within prefix, the installation will not be relocatable.')
4741 actually_reloc = false
4742endif
Paolo Bonzinid0cda6f2023-11-03 09:17:48 +01004743if not actually_reloc and (host_os == 'windows' or get_option('relocatable'))
4744 if host_os == 'windows'
Paolo Bonzini655e2a72023-10-05 14:19:34 +02004745 message()
4746 warning('Windows installs should usually be relocatable.')
4747 endif
4748 message()
4749 message('QEMU will have to be installed under ' + get_option('prefix') + '.')
4750 message('Use --disable-relocatable to remove this warning.')
4751endif