blob: c24ea69f7748575659fd398a67c5fbc2d529b432 [file] [log] [blame]
Paolo Bonzini3b087f72021-12-23 15:29:56 +01001project('qemu', ['c'], meson_version: '>=0.63.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 Bonzinia5665052019-06-10 12:05:14 +020012not_found = dependency('', required: false)
Paolo Bonzini654d6b02021-02-09 14:59:26 +010013keyval = import('keyval')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040014ss = import('sourceset')
Richard Henderson8b18cdb2020-09-13 12:19:25 -070015fs = import('fs')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040016
Paolo Bonzinie5134022022-10-12 14:15:06 +020017targetos = host_machine.system()
Paolo Bonzinice1c1e72020-01-28 16:41:44 +010018sh = find_program('sh')
Paolo Bonzinia5665052019-06-10 12:05:14 +020019config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +010020
Paolo Bonzinie5134022022-10-12 14:15:06 +020021cc = meson.get_compiler('c')
22all_languages = ['c']
Thomas Huth6db77bb2023-07-05 15:36:39 +020023if targetos == 'windows' and add_languages('cpp', required: false, native: false)
Paolo Bonzinie5134022022-10-12 14:15:06 +020024 all_languages += ['cpp']
25 cxx = meson.get_compiler('cpp')
26endif
27if targetos == 'darwin' and \
28 add_languages('objc', required: get_option('cocoa'), native: false)
29 all_languages += ['objc']
30 objc = meson.get_compiler('objc')
31endif
32
Yonggang Luoe3667662020-10-16 06:06:25 +080033# Temporary directory used for files created while
34# configure runs. Since it is in the build directory
35# we can safely blow away any previous version of it
36# (and we need not jump through hoops to try to delete
37# it when configure exits.)
38tmpdir = meson.current_build_dir() / 'meson-private/temp'
Marc-André Lureau8fe11232020-09-11 14:42:48 +020039
40if get_option('qemu_suffix').startswith('/')
41 error('qemu_suffix cannot start with a /')
42endif
43
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040044qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
Marc-André Lureauab4c0992020-08-26 15:04:16 +040045qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040046qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040047qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
48
49qemu_desktopdir = get_option('datadir') / 'applications'
50qemu_icondir = get_option('datadir') / 'icons'
51
Paolo Bonzini859aef02020-08-04 18:14:26 +020052config_host_data = configuration_data()
53genh = []
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +010054qapi_trace_events = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020055
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020056bsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin']
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040057supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Philippe Mathieu-Daudé278c1bc2023-06-27 16:32:34 +020058supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
Richard Henderson6d0b52e2022-10-17 08:00:57 +030059 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64']
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040060
61cpu = host_machine.cpu_family()
Richard Hendersonc94c2392021-11-16 10:50:42 +010062
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020063target_dirs = config_host['TARGET_DIRS'].split()
64have_linux_user = false
65have_bsd_user = false
66have_system = false
67foreach target : target_dirs
68 have_linux_user = have_linux_user or target.endswith('linux-user')
69 have_bsd_user = have_bsd_user or target.endswith('bsd-user')
70 have_system = have_system or target.endswith('-softmmu')
71endforeach
72have_user = have_linux_user or have_bsd_user
73have_tools = get_option('tools') \
74 .disable_auto_if(not have_system) \
75 .allowed()
76have_ga = get_option('guest_agent') \
77 .disable_auto_if(not have_system and not have_tools) \
Brad Smith28236ad2022-11-12 06:40:43 -050078 .require(targetos in ['sunos', 'linux', 'windows', 'freebsd', 'netbsd', 'openbsd'],
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020079 error_message: 'unsupported OS for QEMU guest agent') \
80 .allowed()
Paolo Bonzini60027112022-10-20 14:53:10 +020081enable_modules = get_option('modules') \
82 .require(targetos != 'windows',
83 error_message: 'Modules are not available for Windows') \
84 .require(not get_option('prefer_static'),
85 error_message: 'Modules are incompatible with static linking') \
86 .allowed()
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020087have_block = have_system or have_tools
88
89python = import('python').find_installation()
90
Paolo Bonzini823eb012021-11-08 14:18:17 +010091if cpu not in supported_cpus
92 host_arch = 'unknown'
93elif cpu == 'x86'
94 host_arch = 'i386'
Richard Henderson0e3ed772021-12-31 05:25:11 +000095elif cpu == 'mips64'
96 host_arch = 'mips'
Philippe Mathieu-Daudé278c1bc2023-06-27 16:32:34 +020097elif cpu in ['riscv32', 'riscv64']
98 host_arch = 'riscv'
Paolo Bonzini823eb012021-11-08 14:18:17 +010099else
100 host_arch = cpu
101endif
102
Paolo Bonzini8a199802020-09-18 05:37:01 -0400103if cpu in ['x86', 'x86_64']
104 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
105elif cpu == 'aarch64'
106 kvm_targets = ['aarch64-softmmu']
107elif cpu == 's390x'
108 kvm_targets = ['s390x-softmmu']
109elif cpu in ['ppc', 'ppc64']
110 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Huacai Chenfbc58842020-10-07 16:39:28 +0800111elif cpu in ['mips', 'mips64']
112 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Philippe Mathieu-Daudé4de81092023-06-27 16:32:35 +0200113elif cpu in ['riscv32']
114 kvm_targets = ['riscv32-softmmu']
115elif cpu in ['riscv64']
116 kvm_targets = ['riscv64-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400117else
118 kvm_targets = []
119endif
120
Igor Mammedov44d3d892021-10-27 11:10:12 -0400121kvm_targets_c = '""'
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100122if get_option('kvm').allowed() and targetos == 'linux'
Igor Mammedove741aff2021-09-02 07:35:38 -0400123 kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
124endif
125config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
126
Paolo Bonzini8a199802020-09-18 05:37:01 -0400127accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alexander Graf844a06b2021-09-16 17:54:02 +0200128
129if cpu in ['aarch64']
130 accelerator_targets += {
131 'CONFIG_HVF': ['aarch64-softmmu']
132 }
133endif
134
Alex Bennée0c3e41d2020-11-10 19:23:09 +0000135if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
Marc-André Lureau2a2d51b2021-09-14 16:30:45 +0400136 # i386 emulator provides xenpv machine type for multiple architectures
Alex Bennée0c3e41d2020-11-10 19:23:09 +0000137 accelerator_targets += {
Vikram Garhwalaaea6162023-06-14 17:03:38 -0700138 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu', 'aarch64-softmmu'],
Alex Bennée0c3e41d2020-11-10 19:23:09 +0000139 }
140endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400141if cpu in ['x86', 'x86_64']
142 accelerator_targets += {
143 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400144 'CONFIG_HVF': ['x86_64-softmmu'],
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200145 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400146 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
147 }
148endif
149
Paolo Bonzinia1b176f2021-07-12 14:22:08 +0200150modular_tcg = []
151# Darwin does not support references to thread-local variables in modules
152if targetos != 'darwin'
153 modular_tcg = ['i386-softmmu', 'x86_64-softmmu']
154endif
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +0200155
Philippe Mathieu-Daudéeae9a1d2021-01-14 18:45:08 +0100156edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
Paolo Bonzinie49c0ef2021-09-23 06:55:28 -0400157unpack_edk2_blobs = false
158foreach target : edk2_targets
159 if target in target_dirs
160 bzip2 = find_program('bzip2', required: get_option('install_blobs'))
161 unpack_edk2_blobs = bzip2.found()
162 break
163 endif
164endforeach
Philippe Mathieu-Daudé45b545d2021-01-14 18:45:09 +0100165
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200166dtrace = not_found
167stap = not_found
168if 'dtrace' in get_option('trace_backends')
169 dtrace = find_program('dtrace', required: true)
170 stap = find_program('stap', required: false)
171 if stap.found()
172 # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
173 # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
174 # instead. QEMU --enable-modules depends on this because the SystemTap
175 # semaphores are linked into the main binary and not the module's shared
176 # object.
177 add_global_arguments('-DSTAP_SDT_V2',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200178 native: false, language: all_languages)
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200179 endif
180endif
181
Paolo Bonzini40c909f2022-04-20 17:33:49 +0200182if get_option('iasl') == ''
183 iasl = find_program('iasl', required: false)
184else
185 iasl = find_program(get_option('iasl'), required: true)
186endif
187
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400188##################
189# Compiler flags #
190##################
191
Paolo Bonzini13f60de2022-10-20 14:34:27 +0200192foreach lang : all_languages
193 compiler = meson.get_compiler(lang)
194 if compiler.get_id() == 'gcc' and compiler.version().version_compare('>=7.4')
195 # ok
196 elif compiler.get_id() == 'clang' and compiler.compiles('''
197 #ifdef __apple_build_version__
198 # if __clang_major__ < 12 || (__clang_major__ == 12 && __clang_minor__ < 0)
199 # error You need at least XCode Clang v12.0 to compile QEMU
200 # endif
201 #else
202 # if __clang_major__ < 10 || (__clang_major__ == 10 && __clang_minor__ < 0)
203 # error You need at least Clang v10.0 to compile QEMU
204 # endif
205 #endif''')
206 # ok
207 else
208 error('You either need GCC v7.4 or Clang v10.0 (or XCode Clang v12.0) to compile QEMU')
209 endif
210endforeach
211
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200212# default flags for all hosts
213# We use -fwrapv to tell the compiler that we require a C dialect where
214# left shift of signed integers is well defined and has the expected
215# 2s-complement style results. (Both clang and gcc agree that it
216# provides these semantics.)
217
218qemu_common_flags = [
219 '-D_GNU_SOURCE', '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE_SOURCE',
220 '-fno-strict-aliasing', '-fno-common', '-fwrapv' ]
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200221qemu_cflags = []
Paolo Bonzini911d4ca2022-10-12 12:46:23 +0200222qemu_ldflags = []
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100223
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200224if targetos == 'darwin'
225 # Disable attempts to use ObjectiveC features in os/object.h since they
226 # won't work when we're compiling with gcc as a C compiler.
227 qemu_common_flags += '-DOS_OBJECT_USE_OBJC=0'
228elif targetos == 'solaris'
229 # needed for CMSG_ macros in sys/socket.h
230 qemu_common_flags += '-D_XOPEN_SOURCE=600'
231 # needed for TIOCWIN* defines in termios.h
232 qemu_common_flags += '-D__EXTENSIONS__'
233elif targetos == 'haiku'
234 qemu_common_flags += ['-DB_USE_POSITIVE_POSIX_ERRORS', '-D_BSD_SOURCE', '-fPIC']
235endif
236
237# __sync_fetch_and_and requires at least -march=i486. Many toolchains
238# use i686 as default anyway, but for those that don't, an explicit
239# specification is necessary
240if host_arch == 'i386' and not cc.links('''
241 static int sfaa(int *ptr)
242 {
243 return __sync_fetch_and_and(ptr, 0);
244 }
245
246 int main(void)
247 {
248 int val = 42;
249 val = __sync_val_compare_and_swap(&val, 0, 1);
250 sfaa(&val);
251 return val;
252 }''')
253 qemu_common_flags = ['-march=i486'] + qemu_common_flags
254endif
255
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200256if get_option('gprof')
257 qemu_common_flags += ['-p']
258 qemu_ldflags += ['-p']
259endif
260
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +0200261if get_option('prefer_static')
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100262 qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
263endif
264
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200265# Meson currently only handles pie as a boolean for now, so if the user
266# has explicitly disabled PIE we need to extend our cflags.
Paolo Bonzinib03fcd62023-05-22 10:05:33 +0200267#
268# -no-pie is supposedly a linker flag that has no effect on the compiler
269# command line, but some distros, that didn't quite know what they were
270# doing, made local changes to gcc's specs file that turned it into
271# a compiler command-line flag.
272#
273# What about linker flags? For a static build, no PIE is implied by -static
274# which we added above (and if it's not because of the same specs patching,
275# there's nothing we can do: compilation will fail, report a bug to your
276# distro and do not use --disable-pie in the meanwhile). For dynamic linking,
277# instead, we can't add -no-pie because it overrides -shared: the linker then
278# tries to build an executable instead of a shared library and fails. So
279# don't add -no-pie anywhere and cross fingers. :(
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200280if not get_option('b_pie')
Paolo Bonzinib03fcd62023-05-22 10:05:33 +0200281 qemu_common_flags += cc.get_supported_arguments('-fno-pie', '-no-pie')
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200282endif
283
Paolo Bonzini911d4ca2022-10-12 12:46:23 +0200284if not get_option('stack_protector').disabled()
285 stack_protector_probe = '''
286 int main(int argc, char *argv[])
287 {
288 char arr[64], *p = arr, *c = argv[argc - 1];
289 while (*c) {
290 *p++ = *c++;
291 }
292 return 0;
293 }'''
294 have_stack_protector = false
295 foreach arg : ['-fstack-protector-strong', '-fstack-protector-all']
296 # We need to check both a compile and a link, since some compiler
297 # setups fail only on a .c->.o compile and some only at link time
298 if cc.compiles(stack_protector_probe, args: ['-Werror', arg]) and \
299 cc.links(stack_protector_probe, args: ['-Werror', arg])
300 have_stack_protector = true
301 qemu_cflags += arg
302 qemu_ldflags += arg
303 break
304 endif
305 endforeach
306 get_option('stack_protector') \
307 .require(have_stack_protector, error_message: 'Stack protector not supported')
308endif
309
Paolo Bonzini67398252022-10-12 13:19:35 +0200310coroutine_backend = get_option('coroutine_backend')
311ucontext_probe = '''
312 #include <ucontext.h>
313 #ifdef __stub_makecontext
314 #error Ignoring glibc stub makecontext which will always fail
315 #endif
316 int main(void) { makecontext(0, 0, 0); return 0; }'''
317
318# On Windows the only valid backend is the Windows specific one.
319# For POSIX prefer ucontext, but it's not always possible. The fallback
320# is sigcontext.
321supported_backends = []
322if targetos == 'windows'
323 supported_backends += ['windows']
324else
325 if targetos != 'darwin' and cc.links(ucontext_probe)
326 supported_backends += ['ucontext']
327 endif
328 supported_backends += ['sigaltstack']
329endif
330
331if coroutine_backend == 'auto'
332 coroutine_backend = supported_backends[0]
333elif coroutine_backend not in supported_backends
334 error('"@0@" backend requested but not available. Available backends: @1@' \
335 .format(coroutine_backend, ', '.join(supported_backends)))
336endif
337
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200338# Compiles if SafeStack *not* enabled
339safe_stack_probe = '''
340 int main(void)
341 {
342 #if defined(__has_feature)
343 #if __has_feature(safe_stack)
344 #error SafeStack Enabled
345 #endif
346 #endif
347 return 0;
348 }'''
349if get_option('safe_stack') != not cc.compiles(safe_stack_probe)
350 safe_stack_arg = get_option('safe_stack') ? '-fsanitize=safe-stack' : '-fno-sanitize=safe-stack'
351 if get_option('safe_stack') != not cc.compiles(safe_stack_probe, args: safe_stack_arg)
352 error(get_option('safe_stack') \
353 ? 'SafeStack not supported by your compiler' \
354 : 'Cannot disable SafeStack')
355 endif
356 qemu_cflags += safe_stack_arg
357 qemu_ldflags += safe_stack_arg
358endif
Paolo Bonzini67398252022-10-12 13:19:35 +0200359if get_option('safe_stack') and coroutine_backend != 'ucontext'
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200360 error('SafeStack is only supported with the ucontext coroutine backend')
361endif
362
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100363if get_option('sanitizers')
364 if cc.has_argument('-fsanitize=address')
365 qemu_cflags = ['-fsanitize=address'] + qemu_cflags
366 qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags
367 endif
368
369 # Detect static linking issue with ubsan - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
370 if cc.links('int main(int argc, char **argv) { return argc + 1; }',
371 args: [qemu_ldflags, '-fsanitize=undefined'])
372 qemu_cflags = ['-fsanitize=undefined'] + qemu_cflags
373 qemu_ldflags = ['-fsanitize=undefined'] + qemu_ldflags
374 endif
375endif
376
377# Thread sanitizer is, for now, much noisier than the other sanitizers;
378# keep it separate until that is not the case.
379if get_option('tsan')
380 if get_option('sanitizers')
381 error('TSAN is not supported with other sanitizers')
382 endif
383 if not cc.has_function('__tsan_create_fiber',
384 args: '-fsanitize=thread',
385 prefix: '#include <sanitizer/tsan_interface.h>')
386 error('Cannot enable TSAN due to missing fiber annotation interface')
387 endif
388 qemu_cflags = ['-fsanitize=thread'] + qemu_cflags
389 qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags
390endif
391
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100392# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
393# The combination is known as "full relro", because .got.plt is read-only too.
394qemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
395
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200396if targetos == 'windows'
397 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat')
Paolo Bonzini2d73fa72022-11-02 13:03:51 +0100398 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200399endif
400
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200401# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100402if targetos != 'sunos' and not get_option('tsan')
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200403 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--warn-common')
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +0200404endif
405
Paolo Bonzini537b7242021-10-07 15:08:12 +0200406if get_option('fuzzing')
Paolo Bonzini537b7242021-10-07 15:08:12 +0200407 # Specify a filter to only instrument code that is directly related to
408 # virtual-devices.
409 configure_file(output: 'instrumentation-filter',
410 input: 'scripts/oss-fuzz/instrumentation-filter-template',
411 copy: true)
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400412
413 if cc.compiles('int main () { return 0; }',
414 name: '-fsanitize-coverage-allowlist=/dev/null',
Alexander Bulekove56d0972022-06-21 16:45:07 -0400415 args: ['-fsanitize-coverage-allowlist=/dev/null',
416 '-fsanitize-coverage=trace-pc'] )
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200417 qemu_common_flags += ['-fsanitize-coverage-allowlist=instrumentation-filter']
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400418 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +0200419
420 if get_option('fuzzing_engine') == ''
421 # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
422 # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link
423 # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
424 # unable to bind the fuzzer-related callbacks added by instrumentation.
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200425 qemu_common_flags += ['-fsanitize=fuzzer-no-link']
426 qemu_ldflags += ['-fsanitize=fuzzer-no-link']
Paolo Bonzini537b7242021-10-07 15:08:12 +0200427 # For the actual fuzzer binaries, we need to link against the libfuzzer
428 # library. They need to be configurable, to support OSS-Fuzz
429 fuzz_exe_ldflags = ['-fsanitize=fuzzer']
430 else
431 # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
432 # the needed CFLAGS have already been provided
433 fuzz_exe_ldflags = get_option('fuzzing_engine').split()
434 endif
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400435endif
436
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200437add_global_arguments(qemu_common_flags, native: false, language: all_languages)
438add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
439
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100440# Collect warnings that we want to enable
441
442warn_flags = [
443 '-Wundef',
444 '-Wwrite-strings',
445 '-Wmissing-prototypes',
446 '-Wstrict-prototypes',
447 '-Wredundant-decls',
448 '-Wold-style-declaration',
449 '-Wold-style-definition',
450 '-Wtype-limits',
451 '-Wformat-security',
452 '-Wformat-y2k',
453 '-Winit-self',
454 '-Wignored-qualifiers',
455 '-Wempty-body',
456 '-Wnested-externs',
457 '-Wendif-labels',
458 '-Wexpansion-to-defined',
459 '-Wimplicit-fallthrough=2',
460 '-Wmissing-format-attribute',
461 '-Wno-initializer-overrides',
462 '-Wno-missing-include-dirs',
463 '-Wno-shift-negative-value',
464 '-Wno-string-plus-int',
465 '-Wno-typedef-redefinition',
466 '-Wno-tautological-type-limit-compare',
467 '-Wno-psabi',
468 '-Wno-gnu-variable-sized-type-not-at-end',
469]
470
471if targetos != 'darwin'
472 warn_flags += ['-Wthread-safety']
473endif
474
Thomas Huth785abf02023-07-06 08:47:36 +0200475# Set up C++ compiler flags
Paolo Bonzinib4854582021-11-08 12:31:52 +0100476qemu_cxxflags = []
Paolo Bonzinie5134022022-10-12 14:15:06 +0200477if 'cpp' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100478 qemu_cxxflags = ['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'] + qemu_cflags
Paolo Bonzinib4854582021-11-08 12:31:52 +0100479endif
480
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100481# clang does not support glibc + FORTIFY_SOURCE (is it still true?)
482if get_option('optimization') != '0' and targetos == 'linux'
483 if cc.get_id() == 'gcc'
484 qemu_cflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2']
485 endif
486 if 'cpp' in all_languages and cxx.get_id() == 'gcc'
487 qemu_cxxflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2']
488 endif
489endif
490
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200491add_project_arguments(qemu_cflags, native: false, language: 'c')
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100492add_project_arguments(cc.get_supported_arguments(warn_flags), native: false, language: 'c')
493if 'cpp' in all_languages
494 add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
495 add_project_arguments(cxx.get_supported_arguments(warn_flags), native: false, language: 'cpp')
496endif
497if 'objc' in all_languages
498 # Note sanitizer flags are not applied to Objective-C sources!
499 add_project_arguments(objc.get_supported_arguments(warn_flags), native: false, language: 'objc')
500endif
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400501if targetos == 'linux'
502 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
503 '-isystem', 'linux-headers',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200504 language: all_languages)
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400505endif
506
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100507add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400508 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400509 '-iquote', meson.current_source_dir() / 'include',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200510 language: all_languages)
Paolo Bonzinia5665052019-06-10 12:05:14 +0200511
Richard Henderson44fc7162023-05-17 17:48:34 -0700512# If a host-specific include directory exists, list that first...
513host_include = meson.current_source_dir() / 'host/include/'
514if fs.is_dir(host_include / host_arch)
515 add_project_arguments('-iquote', host_include / host_arch,
516 language: all_languages)
517endif
518# ... followed by the generic fallback.
519add_project_arguments('-iquote', host_include / 'generic',
520 language: all_languages)
521
Paolo Bonzinideb62372020-09-01 07:51:16 -0400522sparse = find_program('cgcc', required: get_option('sparse'))
523if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100524 run_target('sparse',
525 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400526 'compile_commands.json', sparse.full_path(), '-Wbitwise',
527 '-Wno-transparent-union', '-Wno-old-initializer',
528 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100529endif
530
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200531###########################################
532# Target-specific checks and dependencies #
533###########################################
534
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100535# Fuzzing
Paolo Bonzini537b7242021-10-07 15:08:12 +0200536if get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
537 not cc.links('''
538 #include <stdint.h>
539 #include <sys/types.h>
540 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
541 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
542 ''',
543 args: ['-Werror', '-fsanitize=fuzzer'])
544 error('Your compiler does not support -fsanitize=fuzzer')
545endif
546
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100547# Tracing backends
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200548if 'ftrace' in get_option('trace_backends') and targetos != 'linux'
549 error('ftrace is supported only on Linux')
550endif
551if 'syslog' in get_option('trace_backends') and not cc.compiles('''
552 #include <syslog.h>
553 int main(void) {
554 openlog("qemu", LOG_PID, LOG_DAEMON);
555 syslog(LOG_INFO, "configure");
556 return 0;
557 }''')
558 error('syslog is not supported on this system')
559endif
560
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100561# Miscellaneous Linux-only features
Paolo Bonzinia436d6d2021-12-18 16:39:43 +0100562get_option('mpath') \
563 .require(targetos == 'linux', error_message: 'Multipath is supported only on Linux')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200564
Paolo Bonzinia436d6d2021-12-18 16:39:43 +0100565multiprocess_allowed = get_option('multiprocess') \
566 .require(targetos == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \
567 .allowed()
Paolo Bonzini106ad1f2021-02-17 16:24:25 +0100568
Jagannathan Raman55116962022-06-13 16:26:24 -0400569vfio_user_server_allowed = get_option('vfio_user_server') \
570 .require(targetos == 'linux', error_message: 'vfio-user server is supported only on Linux') \
571 .allowed()
572
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +0100573have_tpm = get_option('tpm') \
574 .require(targetos != 'windows', error_message: 'TPM emulation only available on POSIX systems') \
575 .allowed()
576
Paolo Bonzini2a3129a2022-04-20 17:34:05 +0200577# vhost
Paolo Bonzini2df89d52022-04-20 17:34:07 +0200578have_vhost_user = get_option('vhost_user') \
579 .disable_auto_if(targetos != 'linux') \
580 .require(targetos != 'windows',
581 error_message: 'vhost-user is not available on Windows').allowed()
582have_vhost_vdpa = get_option('vhost_vdpa') \
583 .require(targetos == 'linux',
584 error_message: 'vhost-vdpa is only available on Linux').allowed()
585have_vhost_kernel = get_option('vhost_kernel') \
586 .require(targetos == 'linux',
587 error_message: 'vhost-kernel is only available on Linux').allowed()
588have_vhost_user_crypto = get_option('vhost_crypto') \
589 .require(have_vhost_user,
590 error_message: 'vhost-crypto requires vhost-user to be enabled').allowed()
591
Paolo Bonzini43b6d7e2022-04-20 17:34:06 +0200592have_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel
Paolo Bonzini2df89d52022-04-20 17:34:07 +0200593
594have_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed()
595have_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed()
596have_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed()
597have_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa
Paolo Bonzini2a3129a2022-04-20 17:34:05 +0200598
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100599# Target-specific libraries and flags
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200600libm = cc.find_library('m', required: false)
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +0200601threads = dependency('threads')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400602util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200603winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400604socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400605version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400606coref = []
607iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400608emulator_link_args = []
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200609nvmm =not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400610hvf = not_found
Marc-André Lureau23011f42022-02-01 12:55:21 +0400611midl = not_found
612widl = not_found
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900613pathcch = not_found
Paolo Bonzinia6305082021-10-07 15:08:15 +0200614host_dsosuf = '.so'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400615if targetos == 'windows'
Marc-André Lureau23011f42022-02-01 12:55:21 +0400616 midl = find_program('midl', required: false)
617 widl = find_program('widl', required: false)
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900618 pathcch = cc.find_library('pathcch')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400619 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200620 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400621
622 win = import('windows')
623 version_res = win.compile_resources('version.rc',
624 depend_files: files('pc-bios/qemu-nsis.ico'),
625 include_directories: include_directories('.'))
Paolo Bonzinia6305082021-10-07 15:08:15 +0200626 host_dsosuf = '.dll'
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400627elif targetos == 'darwin'
628 coref = dependency('appleframeworks', modules: 'CoreFoundation')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700629 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
Paolo Bonzinia6305082021-10-07 15:08:15 +0200630 host_dsosuf = '.dylib'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200631elif targetos == 'sunos'
632 socket = [cc.find_library('socket'),
633 cc.find_library('nsl'),
634 cc.find_library('resolv')]
635elif targetos == 'haiku'
636 socket = [cc.find_library('posix_error_mapper'),
637 cc.find_library('network'),
638 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400639elif targetos == 'openbsd'
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100640 if get_option('tcg').allowed() and target_dirs.length() > 0
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400641 # Disable OpenBSD W^X if available
642 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
643 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400644endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200645
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100646# Target-specific configuration of accelerators
Paolo Bonzini8a199802020-09-18 05:37:01 -0400647accelerators = []
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100648if get_option('kvm').allowed() and targetos == 'linux'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400649 accelerators += 'CONFIG_KVM'
650endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100651if get_option('whpx').allowed() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000652 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400653 error('WHPX requires 64-bit host')
Philippe Mathieu-Daudé641b8412023-06-24 15:31:44 +0200654 elif cc.has_header('winhvplatform.h', required: get_option('whpx')) and \
655 cc.has_header('winhvemulation.h', required: get_option('whpx'))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400656 accelerators += 'CONFIG_WHPX'
657 endif
658endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100659if get_option('hvf').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400660 hvf = dependency('appleframeworks', modules: 'Hypervisor',
661 required: get_option('hvf'))
662 if hvf.found()
663 accelerators += 'CONFIG_HVF'
664 endif
665endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100666if get_option('hax').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400667 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
668 accelerators += 'CONFIG_HAX'
669 endif
670endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200671if targetos == 'netbsd'
nia0cc49652021-10-13 13:54:17 +0000672 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200673 if nvmm.found()
674 accelerators += 'CONFIG_NVMM'
675 endif
676endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100677
Paolo Bonzini823eb012021-11-08 14:18:17 +0100678tcg_arch = host_arch
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100679if get_option('tcg').allowed()
Paolo Bonzini823eb012021-11-08 14:18:17 +0100680 if host_arch == 'unknown'
Paolo Bonzinia24f15d2023-08-04 11:29:05 +0200681 if not get_option('tcg_interpreter')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400682 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
683 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100684 elif get_option('tcg_interpreter')
Philippe Mathieu-Daudé1c282da2021-05-21 12:34:23 +0200685 warning('Use of the TCG interpreter is not recommended on this host')
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100686 warning('architecture. There is a native TCG execution backend available')
687 warning('which provides substantially better performance and reliability.')
688 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
689 warning('configuration option on this architecture to use the native')
690 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400691 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100692 if get_option('tcg_interpreter')
693 tcg_arch = 'tci'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100694 elif host_arch == 'x86_64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100695 tcg_arch = 'i386'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100696 elif host_arch == 'ppc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100697 tcg_arch = 'ppc'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100698 endif
699 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzinie5134022022-10-12 14:15:06 +0200700 language: all_languages)
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100701
Paolo Bonzini8a199802020-09-18 05:37:01 -0400702 accelerators += 'CONFIG_TCG'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400703endif
704
705if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
706 error('KVM not available on this platform')
707endif
708if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
709 error('HVF not available on this platform')
710endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200711if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
712 error('NVMM not available on this platform')
713endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400714if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
715 error('WHPX not available on this platform')
716endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400717
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200718################
719# Dependencies #
720################
721
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200722# When bumping glib minimum version, please check also whether to increase
723# the _WIN32_WINNT setting in osdep.h according to the value from glib
724glib_req_ver = '>=2.56.0'
725glib_pc = dependency('glib-2.0', version: glib_req_ver, required: true,
726 method: 'pkg-config')
727glib_cflags = []
Paolo Bonzini60027112022-10-20 14:53:10 +0200728if enable_modules
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200729 gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true,
730 method: 'pkg-config')
Paolo Bonzini2c13c572023-08-30 12:20:53 +0200731elif get_option('plugins')
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200732 gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true,
733 method: 'pkg-config')
734else
735 gmodule = not_found
Emilio Cotae3feb2c2023-02-05 11:37:57 -0500736endif
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400737
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200738# This workaround is required due to a bug in pkg-config file for glib as it
739# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
740if targetos == 'windows' and get_option('prefer_static')
741 glib_cflags += ['-DGLIB_STATIC_COMPILATION']
742endif
743
744# Sanity check that the current size_t matches the
745# size that glib thinks it should be. This catches
746# problems on multi-arch where people try to build
747# 32-bit QEMU while pointing at 64-bit glib headers
748
749if not cc.compiles('''
750 #include <glib.h>
751 #include <unistd.h>
752
753 #define QEMU_BUILD_BUG_ON(x) \
754 typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
755
756 int main(void) {
757 QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
758 return 0;
759 }''', dependencies: glib_pc, args: glib_cflags)
760 error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T.
761 You probably need to set PKG_CONFIG_LIBDIR" to point
762 to the right pkg-config files for your build target.''')
763endif
764
765# Silence clang warnings triggered by glib < 2.57.2
766if not cc.compiles('''
767 #include <glib.h>
768 typedef struct Foo {
769 int i;
770 } Foo;
771 static void foo_free(Foo *f)
772 {
773 g_free(f);
774 }
775 G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free)
Nicolas Saenz Juliennef49d8832023-05-24 17:31:23 +0000776 int main(void) { return 0; }''', dependencies: glib_pc, args: ['-Wunused-function', '-Werror'])
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200777 glib_cflags += cc.get_supported_arguments('-Wno-unused-function')
778endif
779glib = declare_dependency(dependencies: [glib_pc, gmodule],
780 compile_args: glib_cflags,
781 version: glib_pc.version())
782
783# Check whether glib has gslice, which we have to avoid for correctness.
784# TODO: remove this check and the corresponding workaround (qtree) when
785# the minimum supported glib is >= 2.75.3
786glib_has_gslice = glib.version().version_compare('<2.75.3')
787
788# override glib dep to include the above refinements
789meson.override_dependency('glib-2.0', glib)
790
791# The path to glib.h is added to all compilation commands.
792add_project_dependencies(glib.partial_dependency(compile_args: true, includes: true),
793 native: false, language: all_languages)
794
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400795gio = not_found
Paolo Bonzini75440602022-04-20 17:33:44 +0200796gdbus_codegen = not_found
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +0200797gdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
Paolo Bonzini75440602022-04-20 17:33:44 +0200798if not get_option('gio').auto() or have_system
799 gio = dependency('gio-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200800 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +0200801 if gio.found() and not cc.links('''
802 #include <gio/gio.h>
803 int main(void)
804 {
805 g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
806 return 0;
807 }''', dependencies: [glib, gio])
808 if get_option('gio').enabled()
809 error('The installed libgio is broken for static linking')
810 endif
811 gio = not_found
812 endif
813 if gio.found()
814 gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'),
815 required: get_option('gio'))
816 gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200817 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +0200818 gio = declare_dependency(dependencies: [gio, gio_unix],
819 version: gio.version())
820 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400821endif
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +0200822if gdbus_codegen.found() and get_option('cfi')
823 gdbus_codegen = not_found
824 gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity'
825endif
Paolo Bonzini75440602022-04-20 17:33:44 +0200826
Marc-André Lureau6cc5a612023-06-06 15:56:42 +0400827xml_pp = find_program('scripts/xml-preprocess.py')
828
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400829lttng = not_found
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200830if 'ust' in get_option('trace_backends')
Marc-André Lureaue32aaa52022-03-28 12:47:13 +0400831 lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
Paolo Bonzini063d5112022-07-14 14:56:58 +0200832 method: 'pkg-config')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400833endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200834pixman = not_found
835if have_system or have_tools
836 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzini063d5112022-07-14 14:56:58 +0200837 method: 'pkg-config')
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200838endif
Paolo Bonzini063d5112022-07-14 14:56:58 +0200839zlib = dependency('zlib', required: true)
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200840
Paolo Bonziniff66f3e2021-10-07 15:08:20 +0200841libaio = not_found
842if not get_option('linux_aio').auto() or have_block
843 libaio = cc.find_library('aio', has_headers: ['libaio.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +0200844 required: get_option('linux_aio'))
Paolo Bonziniff66f3e2021-10-07 15:08:20 +0200845endif
Leonardo Bras354081d2022-05-13 03:28:30 -0300846
847linux_io_uring_test = '''
848 #include <liburing.h>
849 #include <linux/errqueue.h>
850
851 int main(void) { return 0; }'''
852
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400853linux_io_uring = not_found
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200854if not get_option('linux_io_uring').auto() or have_block
Daniel P. Berrangéa41b4fd2022-01-05 13:49:38 +0000855 linux_io_uring = dependency('liburing', version: '>=0.3',
856 required: get_option('linux_io_uring'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200857 method: 'pkg-config')
Leonardo Bras354081d2022-05-13 03:28:30 -0300858 if not cc.links(linux_io_uring_test)
859 linux_io_uring = not_found
860 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400861endif
Leonardo Bras354081d2022-05-13 03:28:30 -0300862
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400863libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +0100864if not get_option('libnfs').auto() or have_block
865 libnfs = dependency('libnfs', version: '>=1.9.3',
866 required: get_option('libnfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200867 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400868endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100869
870libattr_test = '''
871 #include <stddef.h>
872 #include <sys/types.h>
873 #ifdef CONFIG_LIBATTR
874 #include <attr/xattr.h>
875 #else
876 #include <sys/xattr.h>
877 #endif
878 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
879
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400880libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100881have_old_libattr = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100882if get_option('attr').allowed()
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100883 if cc.links(libattr_test)
884 libattr = declare_dependency()
885 else
886 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +0200887 required: get_option('attr'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100888 if libattr.found() and not \
889 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
890 libattr = not_found
891 if get_option('attr').enabled()
892 error('could not link libattr')
893 else
894 warning('could not link libattr, disabling')
895 endif
896 else
897 have_old_libattr = libattr.found()
898 endif
899 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400900endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100901
Akihiko Odaki52eaefd2022-07-02 23:25:19 +0900902cocoa = dependency('appleframeworks', modules: ['Cocoa', 'CoreVideo'],
903 required: get_option('cocoa'))
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100904
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +0300905vmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet'))
906if vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h',
907 'VMNET_BRIDGED_MODE',
908 dependencies: vmnet)
909 vmnet = not_found
910 if get_option('vmnet').enabled()
911 error('vmnet.framework API is outdated')
912 else
913 warning('vmnet.framework API is outdated, disabling')
914 endif
915endif
916
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100917seccomp = not_found
Michal Privoznik73422d92022-10-26 09:30:24 +0200918seccomp_has_sysrawrc = false
Paolo Bonzini90835c22020-11-17 14:22:24 +0100919if not get_option('seccomp').auto() or have_system or have_tools
920 seccomp = dependency('libseccomp', version: '>=2.3.0',
921 required: get_option('seccomp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200922 method: 'pkg-config')
Michal Privoznik73422d92022-10-26 09:30:24 +0200923 if seccomp.found()
924 seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h',
925 'SCMP_FLTATR_API_SYSRAWRC',
926 dependencies: seccomp)
927 endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100928endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100929
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100930libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100931if not get_option('cap_ng').auto() or have_system or have_tools
932 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +0200933 required: get_option('cap_ng'))
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100934endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100935if libcap_ng.found() and not cc.links('''
936 #include <cap-ng.h>
937 int main(void)
938 {
939 capng_capability_to_name(CAPNG_EFFECTIVE);
940 return 0;
941 }''', dependencies: libcap_ng)
942 libcap_ng = not_found
943 if get_option('cap_ng').enabled()
944 error('could not link libcap-ng')
945 else
946 warning('could not link libcap-ng, disabling')
947 endif
948endif
949
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400950if get_option('xkbcommon').auto() and not have_system and not have_tools
951 xkbcommon = not_found
952else
953 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200954 method: 'pkg-config')
Marc-André Lureauade60d42019-07-15 14:48:31 +0400955endif
Paolo Bonzinie1723992021-10-07 15:08:21 +0200956
Thomas Huth58902582022-04-08 18:20:47 +0200957slirp = not_found
958if not get_option('slirp').auto() or have_system
959 slirp = dependency('slirp', required: get_option('slirp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200960 method: 'pkg-config')
Thomas Huth58902582022-04-08 18:20:47 +0200961 # slirp < 4.7 is incompatible with CFI support in QEMU. This is because
962 # it passes function pointers within libslirp as callbacks for timers.
963 # When using a system-wide shared libslirp, the type information for the
964 # callback is missing and the timer call produces a false positive with CFI.
965 # Do not use the "version" keyword argument to produce a better error.
966 # with control-flow integrity.
967 if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7')
968 if get_option('slirp').enabled()
969 error('Control-Flow Integrity requires libslirp 4.7.')
970 else
971 warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.')
972 slirp = not_found
973 endif
974 endif
975endif
976
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400977vde = not_found
Paolo Bonzinie1723992021-10-07 15:08:21 +0200978if not get_option('vde').auto() or have_system or have_tools
979 vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +0200980 required: get_option('vde'))
Paolo Bonzinie1723992021-10-07 15:08:21 +0200981endif
982if vde.found() and not cc.links('''
983 #include <libvdeplug.h>
984 int main(void)
985 {
986 struct vde_open_args a = {0, 0, 0};
987 char s[] = "";
988 vde_open(s, s, &a);
989 return 0;
990 }''', dependencies: vde)
991 vde = not_found
992 if get_option('cap_ng').enabled()
993 error('could not link libvdeplug')
994 else
995 warning('could not link libvdeplug, disabling')
996 endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400997endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200998
Paolo Bonzini478e9432020-08-17 12:47:55 +0200999pulse = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001000if not get_option('pa').auto() or (targetos == 'linux' and have_system)
1001 pulse = dependency('libpulse', required: get_option('pa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001002 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001003endif
1004alsa = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001005if not get_option('alsa').auto() or (targetos == 'linux' and have_system)
1006 alsa = dependency('alsa', required: get_option('alsa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001007 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001008endif
1009jack = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001010if not get_option('jack').auto() or have_system
1011 jack = dependency('jack', required: get_option('jack'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001012 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001013endif
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001014pipewire = not_found
1015if not get_option('pipewire').auto() or (targetos == 'linux' and have_system)
1016 pipewire = dependency('libpipewire-0.3', version: '>=0.3.60',
1017 required: get_option('pipewire'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001018 method: 'pkg-config')
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001019endif
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001020sndio = not_found
1021if not get_option('sndio').auto() or have_system
1022 sndio = dependency('sndio', required: get_option('sndio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001023 method: 'pkg-config')
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001024endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001025
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001026spice_protocol = not_found
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001027if not get_option('spice_protocol').auto() or have_system
Markus Armbruster5c167b52023-01-09 20:03:07 +01001028 spice_protocol = dependency('spice-protocol', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001029 required: get_option('spice_protocol'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001030 method: 'pkg-config')
Paolo Bonzini26347332019-07-29 15:40:07 +02001031endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001032spice = not_found
1033if not get_option('spice').auto() or have_system
Markus Armbruster34d55722023-01-09 20:03:09 +01001034 spice = dependency('spice-server', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001035 required: get_option('spice'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001036 method: 'pkg-config')
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001037endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001038spice_headers = spice.partial_dependency(compile_args: true, includes: true)
1039
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04001040rt = cc.find_library('rt', required: false)
Paolo Bonzinia399f912021-11-15 14:29:13 +00001041
Paolo Bonzini99650b62019-06-10 12:21:14 +02001042libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001043if not get_option('libiscsi').auto() or have_block
1044 libiscsi = dependency('libiscsi', version: '>=1.9.0',
1045 required: get_option('libiscsi'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001046 method: 'pkg-config')
Paolo Bonzini99650b62019-06-10 12:21:14 +02001047endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001048zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +01001049if not get_option('zstd').auto() or have_block
1050 zstd = dependency('libzstd', version: '>=1.4.0',
1051 required: get_option('zstd'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001052 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001053endif
Marc-André Lureauea458962019-07-12 22:23:46 +04001054virgl = not_found
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001055
1056have_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found()
1057if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
Paolo Bonzini587d59d2021-06-03 11:31:35 +02001058 virgl = dependency('virglrenderer',
1059 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001060 required: get_option('virglrenderer'))
Marc-André Lureauc1600f82023-06-06 15:56:57 +04001061 if virgl.found()
1062 config_host_data.set('HAVE_VIRGL_D3D_INFO_EXT',
1063 cc.has_member('struct virgl_renderer_resource_info_ext', 'd3d_tex2d',
1064 prefix: '#include <virglrenderer.h>',
1065 dependencies: virgl))
1066 endif
Marc-André Lureauea458962019-07-12 22:23:46 +04001067endif
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001068blkio = not_found
1069if not get_option('blkio').auto() or have_block
1070 blkio = dependency('blkio',
1071 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001072 required: get_option('blkio'))
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001073endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001074curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001075if not get_option('curl').auto() or have_block
1076 curl = dependency('libcurl', version: '>=7.29.0',
1077 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001078 required: get_option('curl'))
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001079endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001080libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001081if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001082 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +01001083 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001084 required: get_option('libudev'))
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001085endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001086
Paolo Bonzini5c530152020-10-15 06:09:27 -04001087mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001088mpathpersist = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001089if targetos == 'linux' and have_tools and get_option('mpath').allowed()
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001090 mpath_test_source = '''
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001091 #include <libudev.h>
1092 #include <mpath_persist.h>
1093 unsigned mpath_mx_alloc_len = 1024;
1094 int logsink;
1095 static struct config *multipath_conf;
1096 extern struct udev *udev;
1097 extern struct config *get_multipath_config(void);
1098 extern void put_multipath_config(struct config *conf);
1099 struct udev *udev;
1100 struct config *get_multipath_config(void) { return multipath_conf; }
1101 void put_multipath_config(struct config *conf) { }
1102 int main(void) {
1103 udev = udev_new();
1104 multipath_conf = mpath_lib_init();
1105 return 0;
1106 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -04001107 libmpathpersist = cc.find_library('mpathpersist',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001108 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001109 if libmpathpersist.found()
1110 mpathlibs += libmpathpersist
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001111 if get_option('prefer_static')
Paolo Bonzini5c530152020-10-15 06:09:27 -04001112 mpathlibs += cc.find_library('devmapper',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001113 required: get_option('mpath'))
Paolo Bonzini43b43a42020-09-17 12:25:09 +02001114 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -04001115 mpathlibs += cc.find_library('multipath',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001116 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001117 foreach lib: mpathlibs
1118 if not lib.found()
1119 mpathlibs = []
1120 break
1121 endif
1122 endforeach
1123 if mpathlibs.length() == 0
1124 msg = 'Dependencies missing for libmpathpersist'
Philippe Mathieu-Daudé6b408472023-06-05 19:41:45 +02001125 elif cc.links(mpath_test_source, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001126 mpathpersist = declare_dependency(dependencies: mpathlibs)
1127 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001128 msg = 'Cannot detect libmpathpersist API'
1129 endif
1130 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001131 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -04001132 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001133 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001134 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001135 endif
1136 endif
1137 endif
1138endif
1139
Yonggang Luo5285e592020-10-13 07:43:48 +08001140iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001141curses = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001142if have_system and get_option('curses').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001143 curses_test = '''
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001144 #if defined(__APPLE__) || defined(__OpenBSD__)
1145 #define _XOPEN_SOURCE_EXTENDED 1
1146 #endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001147 #include <locale.h>
1148 #include <curses.h>
1149 #include <wchar.h>
1150 int main(void) {
1151 wchar_t wch = L'w';
1152 setlocale(LC_ALL, "");
1153 resize_term(0, 0);
1154 addwstr(L"wide chars\n");
1155 addnwstr(&wch, 1);
1156 add_wch(WACS_DEGREE);
1157 return 0;
1158 }'''
1159
Yonggang Luoca31e302020-11-17 05:31:06 +08001160 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
Paolo Bonzini6d322632022-03-27 16:05:58 +02001161 curses = dependency(curses_dep_list,
1162 required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001163 method: 'pkg-config')
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001164 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001165 curses_compile_args = ['-DNCURSES_WIDECHAR=1']
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001166 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -05001167 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001168 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses],
1169 version: curses.version())
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001170 else
1171 msg = 'curses package not usable'
1172 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001173 endif
1174 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001175 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001176 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
1177 if targetos != 'windows' and not has_curses_h
1178 message('Trying with /usr/include/ncursesw')
1179 curses_compile_args += ['-I/usr/include/ncursesw']
1180 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
1181 endif
1182 if has_curses_h
1183 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
1184 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +08001185 libcurses = cc.find_library(curses_libname,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001186 required: false)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001187 if libcurses.found()
1188 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
1189 curses = declare_dependency(compile_args: curses_compile_args,
1190 dependencies: [libcurses])
1191 break
1192 else
1193 msg = 'curses library not usable'
1194 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001195 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001196 endforeach
1197 endif
1198 endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001199 if get_option('iconv').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001200 foreach link_args : [ ['-liconv'], [] ]
1201 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
1202 # We need to use libiconv if available because mixing libiconv's headers with
1203 # the system libc does not work.
1204 # However, without adding glib to the dependencies -L/usr/local/lib will not be
1205 # included in the command line and libiconv will not be found.
1206 if cc.links('''
1207 #include <iconv.h>
1208 int main(void) {
1209 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
1210 return conv != (iconv_t) -1;
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001211 }''', args: link_args, dependencies: glib)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001212 iconv = declare_dependency(link_args: link_args, dependencies: glib)
1213 break
Yonggang Luo5285e592020-10-13 07:43:48 +08001214 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001215 endforeach
1216 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001217 if curses.found() and not iconv.found()
1218 if get_option('iconv').enabled()
1219 error('iconv not available')
1220 endif
1221 msg = 'iconv required for curses UI but not available'
1222 curses = not_found
1223 endif
1224 if not curses.found() and msg != ''
1225 if get_option('curses').enabled()
1226 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001227 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001228 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001229 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001230 endif
1231endif
1232
Paolo Bonzini26347332019-07-29 15:40:07 +02001233brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001234if not get_option('brlapi').auto() or have_system
1235 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001236 required: get_option('brlapi'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001237 if brlapi.found() and not cc.links('''
1238 #include <brlapi.h>
1239 #include <stddef.h>
1240 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
1241 brlapi = not_found
1242 if get_option('brlapi').enabled()
1243 error('could not link brlapi')
1244 else
1245 warning('could not link brlapi, disabling')
1246 endif
1247 endif
Paolo Bonzini26347332019-07-29 15:40:07 +02001248endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001249
Paolo Bonzini760e4322020-08-26 08:09:48 +02001250sdl = not_found
Akihiko Odaki64d3fec2022-08-19 22:27:56 +09001251if not get_option('sdl').auto() or have_system
Paolo Bonzini063d5112022-07-14 14:56:58 +02001252 sdl = dependency('sdl2', required: get_option('sdl'))
Paolo Bonzini760e4322020-08-26 08:09:48 +02001253 sdl_image = not_found
1254endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001255if sdl.found()
Thomas Huth6da5f222023-06-05 13:45:23 +02001256 # Some versions of SDL have problems with -Wundef
1257 if not cc.compiles('''
1258 #include <SDL.h>
1259 #include <SDL_syswm.h>
1260 int main(int argc, char *argv[]) { return 0; }
1261 ''', dependencies: sdl, args: '-Werror=undef')
1262 sdl = declare_dependency(compile_args: '-Wno-undef',
1263 dependencies: sdl,
1264 version: sdl.version())
1265 endif
Volker Rümelin7161a432020-08-29 12:41:58 +02001266 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001267 method: 'pkg-config')
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001268else
1269 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +01001270 error('sdl-image required, but SDL was @0@'.format(
1271 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001272 endif
1273 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +02001274endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001275
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001276rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001277if not get_option('rbd').auto() or have_block
Paolo Bonzini063d5112022-07-14 14:56:58 +02001278 librados = cc.find_library('rados', required: get_option('rbd'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001279 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001280 required: get_option('rbd'))
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001281 if librados.found() and librbd.found()
1282 if cc.links('''
1283 #include <stdio.h>
1284 #include <rbd/librbd.h>
1285 int main(void) {
1286 rados_t cluster;
1287 rados_create(&cluster, NULL);
Peter Lieven48672ac2021-07-02 19:23:51 +02001288 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
1289 #error
1290 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001291 return 0;
1292 }''', dependencies: [librbd, librados])
1293 rbd = declare_dependency(dependencies: [librbd, librados])
1294 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +02001295 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001296 else
Peter Lieven48672ac2021-07-02 19:23:51 +02001297 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001298 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001299 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001300endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001301
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001302glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001303glusterfs_ftruncate_has_stat = false
1304glusterfs_iocb_has_stat = false
1305if not get_option('glusterfs').auto() or have_block
1306 glusterfs = dependency('glusterfs-api', version: '>=3',
1307 required: get_option('glusterfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001308 method: 'pkg-config')
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001309 if glusterfs.found()
1310 glusterfs_ftruncate_has_stat = cc.links('''
1311 #include <glusterfs/api/glfs.h>
1312
1313 int
1314 main(void)
1315 {
1316 /* new glfs_ftruncate() passes two additional args */
1317 return glfs_ftruncate(NULL, 0, NULL, NULL);
1318 }
1319 ''', dependencies: glusterfs)
1320 glusterfs_iocb_has_stat = cc.links('''
1321 #include <glusterfs/api/glfs.h>
1322
1323 /* new glfs_io_cbk() passes two additional glfs_stat structs */
1324 static void
1325 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
1326 {}
1327
1328 int
1329 main(void)
1330 {
1331 glfs_io_cbk iocb = &glusterfs_iocb;
1332 iocb(NULL, 0 , NULL, NULL, NULL);
1333 return 0;
1334 }
1335 ''', dependencies: glusterfs)
1336 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001337endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001338
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001339libssh = not_found
Thomas Huthe6a52b32021-12-09 15:48:01 +01001340if not get_option('libssh').auto() or have_block
1341 libssh = dependency('libssh', version: '>=0.8.7',
1342 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001343 required: get_option('libssh'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001344endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001345
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001346libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001347if not get_option('bzip2').auto() or have_block
1348 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001349 required: get_option('bzip2'))
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001350 if libbzip2.found() and not cc.links('''
1351 #include <bzlib.h>
1352 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
1353 libbzip2 = not_found
1354 if get_option('bzip2').enabled()
1355 error('could not link libbzip2')
1356 else
1357 warning('could not link libbzip2, disabling')
1358 endif
1359 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001360endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001361
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001362liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +01001363if not get_option('lzfse').auto() or have_block
1364 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001365 required: get_option('lzfse'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001366endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001367if liblzfse.found() and not cc.links('''
1368 #include <lzfse.h>
1369 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
1370 liblzfse = not_found
1371 if get_option('lzfse').enabled()
1372 error('could not link liblzfse')
1373 else
1374 warning('could not link liblzfse, disabling')
1375 endif
1376endif
1377
Paolo Bonzini478e9432020-08-17 12:47:55 +02001378oss = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001379if get_option('oss').allowed() and have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02001380 if not cc.has_header('sys/soundcard.h')
1381 # not found
1382 elif targetos == 'netbsd'
Paolo Bonzini063d5112022-07-14 14:56:58 +02001383 oss = cc.find_library('ossaudio', required: get_option('oss'))
Paolo Bonzini87430d52021-10-07 15:06:09 +02001384 else
1385 oss = declare_dependency()
1386 endif
1387
1388 if not oss.found()
1389 if get_option('oss').enabled()
1390 error('OSS not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001391 endif
1392 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001393endif
1394dsound = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001395if not get_option('dsound').auto() or (targetos == 'windows' and have_system)
1396 if cc.has_header('dsound.h')
1397 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1398 endif
1399
1400 if not dsound.found()
1401 if get_option('dsound').enabled()
1402 error('DirectSound not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001403 endif
1404 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001405endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001406
Paolo Bonzini478e9432020-08-17 12:47:55 +02001407coreaudio = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001408if not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system)
1409 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
1410 required: get_option('coreaudio'))
Paolo Bonzini478e9432020-08-17 12:47:55 +02001411endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001412
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001413opengl = not_found
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001414if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
1415 epoxy = dependency('epoxy', method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001416 required: get_option('opengl'))
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001417 if cc.has_header('epoxy/egl.h', dependencies: epoxy)
1418 opengl = epoxy
1419 elif get_option('opengl').enabled()
1420 error('epoxy/egl.h not found')
1421 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001422endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001423gbm = not_found
1424if (have_system or have_tools) and (virgl.found() or opengl.found())
Paolo Bonzini063d5112022-07-14 14:56:58 +02001425 gbm = dependency('gbm', method: 'pkg-config', required: false)
Thomas Huth8bc51842021-07-13 13:09:02 +02001426endif
Marc-André Lureauf0caba42022-06-28 17:23:15 +04001427have_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001428
Paolo Bonzini57612512021-06-03 11:15:26 +02001429gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001430gnutls_crypto = not_found
Alyssa Rossabc14fd2021-08-06 14:49:47 +00001431if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001432 # For general TLS support our min gnutls matches
1433 # that implied by our platform support matrix
1434 #
1435 # For the crypto backends, we look for a newer
1436 # gnutls:
1437 #
1438 # Version 3.6.8 is needed to get XTS
1439 # Version 3.6.13 is needed to get PBKDF
1440 # Version 3.6.14 is needed to get HW accelerated XTS
1441 #
1442 # If newer enough gnutls isn't available, we can
1443 # still use a different crypto backend to satisfy
1444 # the platform support requirements
1445 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1446 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001447 required: false)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001448 if gnutls_crypto.found()
1449 gnutls = gnutls_crypto
1450 else
1451 # Our min version if all we need is TLS
1452 gnutls = dependency('gnutls', version: '>=3.5.18',
1453 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001454 required: get_option('gnutls'))
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001455 endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001456endif
1457
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001458# We prefer use of gnutls for crypto, unless the options
1459# explicitly asked for nettle or gcrypt.
1460#
1461# If gnutls isn't available for crypto, then we'll prefer
1462# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +02001463gcrypt = not_found
1464nettle = not_found
Lei He4c5e5122022-05-25 17:01:14 +08001465hogweed = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +01001466xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001467
Paolo Bonzini57612512021-06-03 11:15:26 +02001468if get_option('nettle').enabled() and get_option('gcrypt').enabled()
1469 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +02001470endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001471
1472# Explicit nettle/gcrypt request, so ignore gnutls for crypto
1473if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001474 gnutls_crypto = not_found
1475endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001476
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001477if not gnutls_crypto.found()
1478 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
1479 gcrypt = dependency('libgcrypt', version: '>=1.8',
1480 method: 'config-tool',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001481 required: get_option('gcrypt'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001482 # Debian has removed -lgpg-error from libgcrypt-config
1483 # as it "spreads unnecessary dependencies" which in
1484 # turn breaks static builds...
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001485 if gcrypt.found() and get_option('prefer_static')
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001486 gcrypt = declare_dependency(dependencies:
1487 [gcrypt,
1488 cc.find_library('gpg-error', required: true)],
1489 version: gcrypt.version())
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001490 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001491 endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001492 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1493 nettle = dependency('nettle', version: '>=3.4',
1494 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001495 required: get_option('nettle'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001496 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1497 xts = 'private'
1498 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001499 endif
1500endif
1501
Paolo Bonzini063d5112022-07-14 14:56:58 +02001502gmp = dependency('gmp', required: false, method: 'pkg-config')
Lei He4c5e5122022-05-25 17:01:14 +08001503if nettle.found() and gmp.found()
1504 hogweed = dependency('hogweed', version: '>=3.4',
1505 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001506 required: get_option('nettle'))
Lei He4c5e5122022-05-25 17:01:14 +08001507endif
1508
1509
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001510gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +01001511gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001512vte = not_found
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001513have_gtk_clipboard = get_option('gtk_clipboard').enabled()
1514
Akihiko Odaki64d3fec2022-08-19 22:27:56 +09001515if not get_option('gtk').auto() or have_system
Paolo Bonzini1b695472021-01-07 14:02:29 +01001516 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1517 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001518 required: get_option('gtk'))
Paolo Bonzini1b695472021-01-07 14:02:29 +01001519 if gtk.found()
1520 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1521 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001522 required: false)
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001523 gtk = declare_dependency(dependencies: [gtk, gtkx11],
1524 version: gtk.version())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001525
1526 if not get_option('vte').auto() or have_system
1527 vte = dependency('vte-2.91',
1528 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001529 required: get_option('vte'))
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001530 endif
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001531 elif have_gtk_clipboard
1532 error('GTK clipboard requested, but GTK not found')
Paolo Bonzini1b695472021-01-07 14:02:29 +01001533 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001534endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001535
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001536x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +02001537if gtkx11.found()
Paolo Bonzini063d5112022-07-14 14:56:58 +02001538 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001539endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001540png = not_found
Kshitij Suri95f85102022-04-08 07:13:34 +00001541if get_option('png').allowed() and have_system
Thomas Huth1ec8c2c2022-06-23 19:49:41 +02001542 png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001543 method: 'pkg-config')
Kshitij Suri95f85102022-04-08 07:13:34 +00001544endif
1545vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001546jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001547sasl = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001548if get_option('vnc').allowed() and have_system
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001549 vnc = declare_dependency() # dummy dependency
Paolo Bonzini8e242b32020-11-23 13:34:02 -05001550 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001551 method: 'pkg-config')
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001552 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001553 required: get_option('vnc_sasl'))
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001554 if sasl.found()
1555 sasl = declare_dependency(dependencies: sasl,
1556 compile_args: '-DSTRUCT_IOVEC_DEFINED')
1557 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001558endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01001559
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001560pam = not_found
1561if not get_option('auth_pam').auto() or have_system
1562 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001563 required: get_option('auth_pam'))
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001564endif
1565if pam.found() and not cc.links('''
1566 #include <stddef.h>
1567 #include <security/pam_appl.h>
1568 int main(void) {
1569 const char *service_name = "qemu";
1570 const char *user = "frank";
1571 const struct pam_conv pam_conv = { 0 };
1572 pam_handle_t *pamh = NULL;
1573 pam_start(service_name, user, &pam_conv, &pamh);
1574 return 0;
1575 }''', dependencies: pam)
1576 pam = not_found
1577 if get_option('auth_pam').enabled()
1578 error('could not link libpam')
1579 else
1580 warning('could not link libpam, disabling')
1581 endif
1582endif
1583
Marc-André Lureau708eab42019-09-03 16:59:33 +04001584snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +01001585if not get_option('snappy').auto() or have_system
1586 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001587 required: get_option('snappy'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04001588endif
Thomas Huth785abf02023-07-06 08:47:36 +02001589if snappy.found() and not cc.links('''
Paolo Bonzini241611e2020-11-17 13:32:34 +01001590 #include <snappy-c.h>
1591 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
1592 snappy = not_found
1593 if get_option('snappy').enabled()
1594 error('could not link libsnappy')
1595 else
1596 warning('could not link libsnappy, disabling')
1597 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +04001598endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001599
Marc-André Lureau708eab42019-09-03 16:59:33 +04001600lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001601if not get_option('lzo').auto() or have_system
1602 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001603 required: get_option('lzo'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04001604endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001605if lzo.found() and not cc.links('''
1606 #include <lzo/lzo1x.h>
1607 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
1608 lzo = not_found
1609 if get_option('lzo').enabled()
1610 error('could not link liblzo2')
1611 else
1612 warning('could not link liblzo2, disabling')
1613 endif
1614endif
1615
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001616numa = not_found
1617if not get_option('numa').auto() or have_system or have_tools
1618 numa = cc.find_library('numa', has_headers: ['numa.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001619 required: get_option('numa'))
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001620endif
1621if numa.found() and not cc.links('''
1622 #include <numa.h>
1623 int main(void) { return numa_available(); }
1624 ''', dependencies: numa)
1625 numa = not_found
1626 if get_option('numa').enabled()
1627 error('could not link numa')
1628 else
1629 warning('could not link numa, disabling')
1630 endif
1631endif
1632
Marc-André Lureau55166232019-07-24 19:16:22 +04001633rdma = not_found
Paolo Bonzini3730a732022-04-20 17:33:41 +02001634if not get_option('rdma').auto() or have_system
1635 libumad = cc.find_library('ibumad', required: get_option('rdma'))
1636 rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001637 required: get_option('rdma')),
1638 cc.find_library('ibverbs', required: get_option('rdma')),
Paolo Bonzini3730a732022-04-20 17:33:41 +02001639 libumad]
1640 rdma = declare_dependency(dependencies: rdma_libs)
1641 foreach lib: rdma_libs
1642 if not lib.found()
1643 rdma = not_found
1644 endif
1645 endforeach
Marc-André Lureau55166232019-07-24 19:16:22 +04001646endif
Paolo Bonzini3730a732022-04-20 17:33:41 +02001647
Marc-André Lureau582ea952019-08-15 15:15:32 +04001648xen = not_found
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001649if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
1650 xencontrol = dependency('xencontrol', required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001651 method: 'pkg-config')
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001652 if xencontrol.found()
1653 xen_pc = declare_dependency(version: xencontrol.version(),
1654 dependencies: [
1655 xencontrol,
1656 # disabler: true makes xen_pc.found() return false if any is not found
1657 dependency('xenstore', required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001658 method: 'pkg-config',
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001659 disabler: true),
1660 dependency('xenforeignmemory', required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001661 method: 'pkg-config',
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001662 disabler: true),
1663 dependency('xengnttab', required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001664 method: 'pkg-config',
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001665 disabler: true),
1666 dependency('xenevtchn', required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001667 method: 'pkg-config',
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001668 disabler: true),
1669 dependency('xendevicemodel', required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001670 method: 'pkg-config',
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001671 disabler: true),
1672 # optional, no "disabler: true"
1673 dependency('xentoolcore', required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001674 method: 'pkg-config')])
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001675 if xen_pc.found()
1676 xen = xen_pc
1677 endif
1678 endif
1679 if not xen.found()
David Woodhouse2f20b172023-04-12 19:51:00 +01001680 xen_tests = [ '4.11.0', '4.10.0', '4.9.0', '4.8.0', '4.7.1' ]
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001681 xen_libs = {
1682 '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
1683 '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
1684 '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
1685 '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
1686 '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001687 }
1688 xen_deps = {}
1689 foreach ver: xen_tests
1690 # cache the various library tests to avoid polluting the logs
1691 xen_test_deps = []
1692 foreach l: xen_libs[ver]
1693 if l not in xen_deps
1694 xen_deps += { l: cc.find_library(l, required: false) }
1695 endif
1696 xen_test_deps += xen_deps[l]
1697 endforeach
1698
1699 # Use -D to pick just one of the test programs in scripts/xen-detect.c
1700 xen_version = ver.split('.')
1701 xen_ctrl_version = xen_version[0] + \
1702 ('0' + xen_version[1]).substring(-2) + \
1703 ('0' + xen_version[2]).substring(-2)
1704 if cc.links(files('scripts/xen-detect.c'),
1705 args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
1706 dependencies: xen_test_deps)
1707 xen = declare_dependency(version: ver, dependencies: xen_test_deps)
1708 break
1709 endif
1710 endforeach
1711 endif
1712 if xen.found()
1713 accelerators += 'CONFIG_XEN'
1714 elif get_option('xen').enabled()
1715 error('could not compile and link Xen test program')
1716 endif
Marc-André Lureau582ea952019-08-15 15:15:32 +04001717endif
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001718have_xen_pci_passthrough = get_option('xen_pci_passthrough') \
1719 .require(xen.found(),
1720 error_message: 'Xen PCI passthrough requested but Xen not enabled') \
1721 .require(targetos == 'linux',
1722 error_message: 'Xen PCI passthrough not available on this platform') \
Stefano Stabellinia4b4b402023-06-14 17:03:36 -07001723 .require(cpu == 'x86' or cpu == 'x86_64',
1724 error_message: 'Xen PCI passthrough not available on this platform') \
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001725 .allowed()
1726
1727
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001728cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02001729if not get_option('smartcard').auto() or have_system
1730 cacard = dependency('libcacard', required: get_option('smartcard'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001731 version: '>=2.5.1', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001732endif
César Belley0a40bcb2020-08-26 13:42:04 +02001733u2f = not_found
1734if have_system
1735 u2f = dependency('u2f-emu', required: get_option('u2f'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001736 method: 'pkg-config')
César Belley0a40bcb2020-08-26 13:42:04 +02001737endif
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08001738canokey = not_found
1739if have_system
1740 canokey = dependency('canokey-qemu', required: get_option('canokey'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001741 method: 'pkg-config')
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08001742endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001743usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02001744if not get_option('usb_redir').auto() or have_system
1745 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001746 version: '>=0.6', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001747endif
1748libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02001749if not get_option('libusb').auto() or have_system
1750 libusb = dependency('libusb-1.0', required: get_option('libusb'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001751 version: '>=1.0.13', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001752endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02001753
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001754libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02001755if not get_option('libpmem').auto() or have_system
1756 libpmem = dependency('libpmem', required: get_option('libpmem'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001757 method: 'pkg-config')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001758endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001759libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02001760if not get_option('libdaxctl').auto() or have_system
1761 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001762 version: '>=57', method: 'pkg-config')
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001763endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001764tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02001765if gnutls.found()
1766 tasn1 = dependency('libtasn1',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001767 method: 'pkg-config')
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001768endif
Max Fritz0db0fbb2023-05-22 02:12:02 +02001769keyutils = not_found
1770if get_option('keyring').enabled()
1771 keyutils = dependency('libkeyutils', required: false, method: 'pkg-config')
1772endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001773
Marc-André Lureau3909def2020-08-28 15:07:33 +04001774has_gettid = cc.has_function('gettid')
1775
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001776# libselinux
1777selinux = dependency('libselinux',
1778 required: get_option('selinux'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001779 method: 'pkg-config')
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001780
Paolo Bonziniaa087962020-09-01 11:15:30 -04001781# Malloc tests
1782
1783malloc = []
1784if get_option('malloc') == 'system'
1785 has_malloc_trim = \
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001786 get_option('malloc_trim').allowed() and \
Michal Privoznik09a49af2023-05-30 12:31:23 +02001787 cc.has_function('malloc_trim', prefix: '#include <malloc.h>')
Paolo Bonziniaa087962020-09-01 11:15:30 -04001788else
1789 has_malloc_trim = false
1790 malloc = cc.find_library(get_option('malloc'), required: true)
1791endif
1792if not has_malloc_trim and get_option('malloc_trim').enabled()
1793 if get_option('malloc') == 'system'
1794 error('malloc_trim not available on this platform.')
1795 else
1796 error('malloc_trim not available with non-libc memory allocator')
1797 endif
1798endif
1799
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001800gnu_source_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01001801 #ifndef _GNU_SOURCE
1802 #define _GNU_SOURCE
1803 #endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001804'''
Max Reitz84e319a2020-11-02 17:18:55 +01001805
Michal Privoznik09a49af2023-05-30 12:31:23 +02001806# Check whether the glibc provides STATX_BASIC_STATS
1807
1808has_statx = cc.has_header_symbol('sys/stat.h', 'STATX_BASIC_STATS', prefix: gnu_source_prefix)
Max Reitz84e319a2020-11-02 17:18:55 +01001809
Hanna Reitz4ce7a082022-02-23 10:23:40 +01001810# Check whether statx() provides mount ID information
1811
Michal Privoznik09a49af2023-05-30 12:31:23 +02001812has_statx_mnt_id = cc.has_header_symbol('sys/stat.h', 'STATX_MNT_ID', prefix: gnu_source_prefix)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01001813
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001814have_vhost_user_blk_server = get_option('vhost_user_blk_server') \
1815 .require(targetos == 'linux',
1816 error_message: 'vhost_user_blk_server requires linux') \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02001817 .require(have_vhost_user,
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001818 error_message: 'vhost_user_blk_server requires vhost-user support') \
Alex Bennée26ed5012022-05-24 16:40:42 +01001819 .disable_auto_if(not have_tools and not have_system) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001820 .allowed()
Daniele Buono9e62ba42020-12-04 18:06:14 -05001821
Max Reitzdf4ea702020-10-27 20:05:46 +01001822if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1823 error('Cannot enable fuse-lseek while fuse is disabled')
1824endif
1825
Max Reitza484a712020-10-27 20:05:41 +01001826fuse = dependency('fuse3', required: get_option('fuse'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001827 version: '>=3.1', method: 'pkg-config')
Max Reitza484a712020-10-27 20:05:41 +01001828
Max Reitzdf4ea702020-10-27 20:05:46 +01001829fuse_lseek = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001830if get_option('fuse_lseek').allowed()
Max Reitzdf4ea702020-10-27 20:05:46 +01001831 if fuse.version().version_compare('>=3.8')
1832 # Dummy dependency
1833 fuse_lseek = declare_dependency()
1834 elif get_option('fuse_lseek').enabled()
1835 if fuse.found()
1836 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1837 else
1838 error('fuse-lseek requires libfuse, which was not found')
1839 endif
1840 endif
1841endif
1842
Xie Yongjia6caeee2022-05-23 16:46:08 +08001843have_libvduse = (targetos == 'linux')
1844if get_option('libvduse').enabled()
1845 if targetos != 'linux'
1846 error('libvduse requires linux')
1847 endif
1848elif get_option('libvduse').disabled()
1849 have_libvduse = false
1850endif
1851
Xie Yongji2a2359b2022-05-23 16:46:09 +08001852have_vduse_blk_export = (have_libvduse and targetos == 'linux')
1853if get_option('vduse_blk_export').enabled()
1854 if targetos != 'linux'
1855 error('vduse_blk_export requires linux')
1856 elif not have_libvduse
1857 error('vduse_blk_export requires libvduse support')
1858 endif
1859elif get_option('vduse_blk_export').disabled()
1860 have_vduse_blk_export = false
1861endif
1862
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001863# libbpf
1864libbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
1865if libbpf.found() and not cc.links('''
1866 #include <bpf/libbpf.h>
1867 int main(void)
1868 {
1869 bpf_object__destroy_skeleton(NULL);
1870 return 0;
1871 }''', dependencies: libbpf)
1872 libbpf = not_found
1873 if get_option('bpf').enabled()
1874 error('libbpf skeleton test failed')
1875 else
1876 warning('libbpf skeleton test failed, disabling')
1877 endif
1878endif
1879
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01001880# libdw
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01001881libdw = not_found
Ilya Leoshkevich550c6d92023-02-10 01:52:08 +01001882if not get_option('libdw').auto() or \
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001883 (not get_option('prefer_static') and (have_system or have_user))
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01001884 libdw = dependency('libdw',
1885 method: 'pkg-config',
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01001886 required: get_option('libdw'))
1887endif
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01001888
Paolo Bonzini87430d52021-10-07 15:06:09 +02001889#################
1890# config-host.h #
1891#################
1892
1893audio_drivers_selected = []
1894if have_system
1895 audio_drivers_available = {
1896 'alsa': alsa.found(),
1897 'coreaudio': coreaudio.found(),
1898 'dsound': dsound.found(),
1899 'jack': jack.found(),
1900 'oss': oss.found(),
1901 'pa': pulse.found(),
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001902 'pipewire': pipewire.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02001903 'sdl': sdl.found(),
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001904 'sndio': sndio.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02001905 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02001906 foreach k, v: audio_drivers_available
1907 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
1908 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02001909
1910 # Default to native drivers first, OSS second, SDL third
1911 audio_drivers_priority = \
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001912 [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \
Paolo Bonzini87430d52021-10-07 15:06:09 +02001913 (targetos == 'linux' ? [] : [ 'sdl' ])
1914 audio_drivers_default = []
1915 foreach k: audio_drivers_priority
1916 if audio_drivers_available[k]
1917 audio_drivers_default += k
1918 endif
1919 endforeach
1920
1921 foreach k: get_option('audio_drv_list')
1922 if k == 'default'
1923 audio_drivers_selected += audio_drivers_default
1924 elif not audio_drivers_available[k]
1925 error('Audio driver "@0@" not available.'.format(k))
1926 else
1927 audio_drivers_selected += k
1928 endif
1929 endforeach
1930endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001931config_host_data.set('CONFIG_AUDIO_DRIVERS',
1932 '"' + '", "'.join(audio_drivers_selected) + '", ')
1933
Daniele Buono9e62ba42020-12-04 18:06:14 -05001934if get_option('cfi')
1935 cfi_flags=[]
1936 # Check for dependency on LTO
1937 if not get_option('b_lto')
1938 error('Selected Control-Flow Integrity but LTO is disabled')
1939 endif
Paolo Bonzini60027112022-10-20 14:53:10 +02001940 if enable_modules
Daniele Buono9e62ba42020-12-04 18:06:14 -05001941 error('Selected Control-Flow Integrity is not compatible with modules')
1942 endif
1943 # Check for cfi flags. CFI requires LTO so we can't use
1944 # get_supported_arguments, but need a more complex "compiles" which allows
1945 # custom arguments
1946 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1947 args: ['-flto', '-fsanitize=cfi-icall'] )
1948 cfi_flags += '-fsanitize=cfi-icall'
1949 else
1950 error('-fsanitize=cfi-icall is not supported by the compiler')
1951 endif
1952 if cc.compiles('int main () { return 0; }',
1953 name: '-fsanitize-cfi-icall-generalize-pointers',
1954 args: ['-flto', '-fsanitize=cfi-icall',
1955 '-fsanitize-cfi-icall-generalize-pointers'] )
1956 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1957 else
1958 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1959 endif
1960 if get_option('cfi_debug')
1961 if cc.compiles('int main () { return 0; }',
1962 name: '-fno-sanitize-trap=cfi-icall',
1963 args: ['-flto', '-fsanitize=cfi-icall',
1964 '-fno-sanitize-trap=cfi-icall'] )
1965 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1966 else
1967 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1968 endif
1969 endif
Paolo Bonzinie5134022022-10-12 14:15:06 +02001970 add_global_arguments(cfi_flags, native: false, language: all_languages)
1971 add_global_link_arguments(cfi_flags, native: false, language: all_languages)
Daniele Buono9e62ba42020-12-04 18:06:14 -05001972endif
1973
Joelle van Dyne14176c82021-03-15 11:03:38 -07001974have_host_block_device = (targetos != 'darwin' or
1975 cc.has_header('IOKit/storage/IOMedia.h'))
1976
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001977dbus_display = get_option('dbus_display') \
1978 .require(gio.version().version_compare('>=2.64'),
1979 error_message: '-display dbus requires glib>=2.64') \
Paolo Bonzini75440602022-04-20 17:33:44 +02001980 .require(gdbus_codegen.found(),
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02001981 error_message: gdbus_codegen_error.format('-display dbus')) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001982 .allowed()
Marc-André Lureau142ca622021-07-15 11:53:53 +04001983
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001984have_virtfs = get_option('virtfs') \
Keno Fischer0fb1e192022-02-27 17:35:22 -05001985 .require(targetos == 'linux' or targetos == 'darwin',
1986 error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
1987 .require(targetos == 'linux' or cc.has_function('pthread_fchdir_np'),
1988 error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
Peter Foley1a67e072023-05-03 09:07:56 -04001989 .require(targetos == 'darwin' or libattr.found(),
1990 error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001991 .disable_auto_if(not have_tools and not have_system) \
1992 .allowed()
Paolo Bonzini69202b42020-11-17 14:46:21 +01001993
Peter Foley1a67e072023-05-03 09:07:56 -04001994have_virtfs_proxy_helper = get_option('virtfs_proxy_helper') \
1995 .require(targetos != 'darwin', error_message: 'the virtfs proxy helper is incompatible with macOS') \
1996 .require(have_virtfs, error_message: 'the virtfs proxy helper requires that virtfs is enabled') \
1997 .disable_auto_if(not have_tools) \
1998 .require(libcap_ng.found(), error_message: 'the virtfs proxy helper requires libcap-ng') \
1999 .allowed()
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01002000
Paolo Bonzini622d64f2022-04-20 17:33:53 +02002001if get_option('block_drv_ro_whitelist') == ''
2002 config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
2003else
2004 config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
2005 '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
2006endif
2007if get_option('block_drv_rw_whitelist') == ''
2008 config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
2009else
2010 config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
2011 '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
2012endif
2013
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002014foreach k : get_option('trace_backends')
2015 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
2016endforeach
2017config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02002018config_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
Paolo Bonzini40c909f2022-04-20 17:33:49 +02002019if iasl.found()
2020 config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
Paolo Bonzini5dc46182021-10-13 13:19:00 +02002021endif
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002022config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
2023config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
2024config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
2025config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
2026config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09002027
2028qemu_firmwarepath = ''
2029foreach k : get_option('qemu_firmwarepath')
2030 qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
2031endforeach
2032config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
2033
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002034config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
2035config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
2036config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
2037config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
2038config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
2039config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
2040
Paolo Bonzini60027112022-10-20 14:53:10 +02002041if enable_modules
Paolo Bonzinib0b43232022-04-20 17:33:54 +02002042 config_host_data.set('CONFIG_STAMP', run_command(
2043 meson.current_source_dir() / 'scripts/qemu-stamp.py',
2044 meson.project_version(), get_option('pkgversion'), '--',
2045 meson.current_source_dir() / 'configure',
2046 capture: true, check: true).stdout().strip())
2047endif
2048
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002049have_slirp_smbd = get_option('slirp_smbd') \
2050 .require(targetos != 'windows', error_message: 'Host smbd not supported on this platform.') \
2051 .allowed()
2052if have_slirp_smbd
2053 smbd_path = get_option('smbd')
2054 if smbd_path == ''
2055 smbd_path = (targetos == 'solaris' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
2056 endif
2057 config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
2058endif
2059
Paolo Bonzini823eb012021-11-08 14:18:17 +01002060config_host_data.set('HOST_' + host_arch.to_upper(), 1)
2061
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02002062if get_option('module_upgrades') and not enable_modules
2063 error('Cannot enable module-upgrades as modules are not enabled')
2064endif
2065config_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
2066
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002067config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002068config_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002069config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02002070config_host_data.set('CONFIG_BSD', targetos in bsd_oses)
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04002071config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02002072config_host_data.set('CONFIG_DARWIN', targetos == 'darwin')
Paolo Bonzini537b7242021-10-07 15:08:12 +02002073config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02002074config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002075config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02002076config_host_data.set('CONFIG_LINUX', targetos == 'linux')
2077config_host_data.set('CONFIG_POSIX', targetos != 'windows')
2078config_host_data.set('CONFIG_WIN32', targetos == 'windows')
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002079config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002080config_host_data.set('CONFIG_MPATH', mpathpersist.found())
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04002081config_host_data.set('CONFIG_BLKIO', blkio.found())
Stefano Garzarella98b126f2023-05-30 09:19:41 +02002082if blkio.found()
2083 config_host_data.set('CONFIG_BLKIO_VHOST_VDPA_FD',
2084 blkio.version().version_compare('>=1.3.0'))
2085endif
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002086config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08002087config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02002088config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini75440602022-04-20 17:33:44 +02002089config_host_data.set('CONFIG_GIO', gio.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002090config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
2091if glusterfs.found()
2092 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
2093 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
2094 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
2095 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
2096 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
2097 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
2098endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002099config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02002100config_host_data.set('CONFIG_VTE', vte.found())
Claudio Fontana29e0bff2022-11-21 14:55:38 +01002101config_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard)
Taylor Simpson63efb6a2023-04-27 15:59:52 -07002102config_host_data.set('CONFIG_HEXAGON_IDEF_PARSER', get_option('hexagon_idef_parser'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002103config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002104config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002105config_host_data.set('CONFIG_EBPF', libbpf.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002106config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002107config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01002108config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Thomas Huthe6a52b32021-12-09 15:48:01 +01002109config_host_data.set('CONFIG_LIBSSH', libssh.found())
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02002110config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002111config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
2112config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzini60027112022-10-20 14:53:10 +02002113config_host_data.set('CONFIG_MODULES', enable_modules)
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002114config_host_data.set('CONFIG_NUMA', numa.found())
Michal Privoznik6bb613f2022-12-15 10:55:03 +01002115if numa.found()
2116 config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY',
2117 cc.has_function('numa_has_preferred_many',
2118 dependencies: numa))
2119endif
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002120config_host_data.set('CONFIG_OPENGL', opengl.found())
Paolo Bonzini2c13c572023-08-30 12:20:53 +02002121config_host_data.set('CONFIG_PLUGIN', get_option('plugins'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002122config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini3730a732022-04-20 17:33:41 +02002123config_host_data.set('CONFIG_RDMA', rdma.found())
Paolo Bonzini721fa5e2022-10-12 11:59:51 +02002124config_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002125config_host_data.set('CONFIG_SDL', sdl.found())
2126config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01002127config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Michal Privoznik73422d92022-10-26 09:30:24 +02002128if seccomp.found()
2129 config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
2130endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01002131config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzini73258b32021-09-28 16:45:39 +02002132config_host_data.set('CONFIG_SOLARIS', targetos == 'sunos')
Paolo Bonzini875be2872022-02-15 11:37:00 +01002133if get_option('tcg').allowed()
2134 config_host_data.set('CONFIG_TCG', 1)
2135 config_host_data.set('CONFIG_TCG_INTERPRETER', tcg_arch == 'tci')
2136endif
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002137config_host_data.set('CONFIG_TPM', have_tpm)
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002138config_host_data.set('CONFIG_TSAN', get_option('tsan'))
Paolo Bonzini90540f32021-06-03 11:15:26 +02002139config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Paolo Bonzinie1723992021-10-07 15:08:21 +02002140config_host_data.set('CONFIG_VDE', vde.found())
Paolo Bonzini2df89d52022-04-20 17:34:07 +02002141config_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
2142config_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
2143config_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
2144config_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
2145config_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
2146config_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
2147config_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03002148config_host_data.set('CONFIG_VMNET', vmnet.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002149config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Xie Yongji2a2359b2022-05-23 16:46:09 +08002150config_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
Kshitij Suri95f85102022-04-08 07:13:34 +00002151config_host_data.set('CONFIG_PNG', png.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002152config_host_data.set('CONFIG_VNC', vnc.found())
2153config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002154config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01002155config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002156config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002157config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04002158config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04002159config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02002160config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01002161config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Daniel P. Berrangéd47b83b2022-04-26 17:00:43 +01002162config_host_data.set('CONFIG_TASN1', tasn1.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002163config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
2164config_host_data.set('CONFIG_NETTLE', nettle.found())
Lei He4c5e5122022-05-25 17:01:14 +08002165config_host_data.set('CONFIG_HOGWEED', hogweed.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002166config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002167config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01002168config_host_data.set('CONFIG_STATX', has_statx)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002169config_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id)
Paolo Bonzinib1def332020-11-17 13:37:39 +01002170config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01002171config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01002172config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002173config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
Marc-André Lureauddece462021-10-06 14:18:09 +04002174if spice_protocol.found()
2175config_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
2176config_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
2177config_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
2178endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002179config_host_data.set('CONFIG_SPICE', spice.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01002180config_host_data.set('CONFIG_X11', x11.found())
Marc-André Lureau142ca622021-07-15 11:53:53 +04002181config_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
Daniele Buono9e62ba42020-12-04 18:06:14 -05002182config_host_data.set('CONFIG_CFI', get_option('cfi'))
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002183config_host_data.set('CONFIG_SELINUX', selinux.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002184config_host_data.set('CONFIG_XEN_BACKEND', xen.found())
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002185config_host_data.set('CONFIG_LIBDW', libdw.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002186if xen.found()
2187 # protect from xen.version() having less than three components
2188 xen_version = xen.version().split('.') + ['0', '0']
2189 xen_ctrl_version = xen_version[0] + \
2190 ('0' + xen_version[1]).substring(-2) + \
2191 ('0' + xen_version[2]).substring(-2)
2192 config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
2193endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002194config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
2195config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
2196config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
2197config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
2198
Paolo Bonzinia6305082021-10-07 15:08:15 +02002199config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002200config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
2201
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002202have_coroutine_pool = get_option('coroutine_pool')
2203if get_option('debug_stack_usage') and have_coroutine_pool
2204 message('Disabling coroutine pool to measure stack usage')
2205 have_coroutine_pool = false
2206endif
2207config_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool)
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04002208config_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002209config_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002210config_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
Paolo Bonzini1d558c92023-08-28 11:48:30 +02002211config_host_data.set('CONFIG_DEBUG_TCG', get_option('debug_tcg'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002212config_host_data.set('CONFIG_GPROF', get_option('gprof'))
Paolo Bonzini406523f2021-10-13 11:43:54 +02002213config_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002214config_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
Juan Quintelaabad1852022-09-02 18:51:25 +02002215config_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
Paolo Bonzini406523f2021-10-13 11:43:54 +02002216
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002217# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002218config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002219config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
2220config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
Thomas Huth48f670e2020-11-18 18:10:52 +01002221config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01002222config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01002223config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002224config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01002225config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01002226config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Bin Mengd4093732022-08-02 15:51:58 +08002227if targetos == 'windows'
2228 config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
2229endif
Thomas Huthded5d782020-11-14 11:10:11 +01002230
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002231# has_function
Claudio Imbrendac891c242022-08-12 15:34:53 +02002232config_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002233config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002234config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
2235config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
2236config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
2237config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Paolo Bonzini67504852023-06-21 00:47:31 +02002238config_host_data.set('CONFIG_GETCPU', cc.has_function('getcpu', prefix: gnu_source_prefix))
2239config_host_data.set('CONFIG_SCHED_GETCPU', cc.has_function('sched_getcpu', prefix: '#include <sched.h>'))
Peter Maydell86983432022-02-26 18:07:19 +00002240# Note that we need to specify prefix: here to avoid incorrectly
2241# thinking that Windows has posix_memalign()
2242config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
Peter Maydell5c8c7142022-02-26 18:07:20 +00002243config_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
Peter Maydell88454f82022-02-26 18:07:21 +00002244config_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
2245config_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002246config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002247config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Keno Fischer029ed1b2022-02-27 17:35:20 -05002248config_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002249config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
2250config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
2251config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
2252config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
2253config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002254config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Andrew Deason59e35c72022-04-26 14:55:22 -05002255config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02002256config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002257config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002258config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002259config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Stefano Garzarella66dc5f92022-05-17 09:10:12 +02002260if rbd.found()
2261 config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
2262 cc.has_function('rbd_namespace_exists',
2263 dependencies: rbd,
2264 prefix: '#include <rbd/librbd.h>'))
2265endif
Li Zhijian911965a2021-09-10 15:02:55 +08002266if rdma.found()
2267 config_host_data.set('HAVE_IBV_ADVISE_MR',
2268 cc.has_function('ibv_advise_mr',
Paolo Bonzini3730a732022-04-20 17:33:41 +02002269 dependencies: rdma,
Li Zhijian911965a2021-09-10 15:02:55 +08002270 prefix: '#include <infiniband/verbs.h>'))
2271endif
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002272
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002273have_asan_fiber = false
2274if get_option('sanitizers') and \
2275 not cc.has_function('__sanitizer_start_switch_fiber',
2276 args: '-fsanitize=address',
2277 prefix: '#include <sanitizer/asan_interface.h>')
2278 warning('Missing ASAN due to missing fiber annotation interface')
2279 warning('Without code annotation, the report may be inferior.')
2280else
2281 have_asan_fiber = true
2282endif
2283config_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber)
2284
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002285# has_header_symbol
Sam Li6d43eaa2023-05-08 12:55:28 +08002286config_host_data.set('CONFIG_BLKZONED',
2287 cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002288config_host_data.set('CONFIG_EPOLL_CREATE1',
2289 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
2290config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
2291 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
2292 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
2293config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
2294 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
2295config_host_data.set('CONFIG_FIEMAP',
2296 cc.has_header('linux/fiemap.h') and
2297 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002298config_host_data.set('CONFIG_GETRANDOM',
2299 cc.has_function('getrandom') and
2300 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002301config_host_data.set('CONFIG_INOTIFY',
2302 cc.has_header_symbol('sys/inotify.h', 'inotify_init'))
2303config_host_data.set('CONFIG_INOTIFY1',
2304 cc.has_header_symbol('sys/inotify.h', 'inotify_init1'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002305config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
2306 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002307config_host_data.set('CONFIG_RTNETLINK',
2308 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
2309config_host_data.set('CONFIG_SYSMACROS',
2310 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002311config_host_data.set('HAVE_OPTRESET',
2312 cc.has_header_symbol('getopt.h', 'optreset'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04002313config_host_data.set('HAVE_IPPROTO_MPTCP',
2314 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002315
2316# has_member
2317config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
2318 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
2319 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002320config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
2321 cc.has_member('struct stat', 'st_atim',
2322 prefix: '#include <sys/stat.h>'))
Sam Li6d43eaa2023-05-08 12:55:28 +08002323config_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY',
2324 cc.has_member('struct blk_zone', 'capacity',
2325 prefix: '#include <linux/blkzoned.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002326
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002327# has_type
2328config_host_data.set('CONFIG_IOVEC',
2329 cc.has_type('struct iovec',
2330 prefix: '#include <sys/uio.h>'))
2331config_host_data.set('HAVE_UTMPX',
2332 cc.has_type('struct utmpx',
2333 prefix: '#include <utmpx.h>'))
2334
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002335config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002336 #include <sys/eventfd.h>
2337 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002338config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002339 #include <unistd.h>
2340 int main(void) {
2341 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2342 return fdatasync(0);
2343 #else
2344 #error Not supported
2345 #endif
2346 }'''))
Andrew Deason8900c202022-03-15 22:52:25 -05002347
2348has_madvise = cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002349 #include <sys/types.h>
2350 #include <sys/mman.h>
2351 #include <stddef.h>
Andrew Deason8900c202022-03-15 22:52:25 -05002352 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
2353missing_madvise_proto = false
2354if has_madvise
2355 # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
2356 # but forget to prototype it. In this case, has_madvise will be true (the
2357 # test program links despite a compile warning). To detect the
2358 # missing-prototype case, we try again with a definitely-bogus prototype.
2359 # This will only compile if the system headers don't provide the prototype;
2360 # otherwise the conflicting prototypes will cause a compiler error.
2361 missing_madvise_proto = cc.links(gnu_source_prefix + '''
2362 #include <sys/types.h>
2363 #include <sys/mman.h>
2364 #include <stddef.h>
2365 extern int madvise(int);
2366 int main(void) { return madvise(0); }''')
2367endif
2368config_host_data.set('CONFIG_MADVISE', has_madvise)
2369config_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
2370
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002371config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002372 #include <sys/mman.h>
2373 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002374config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002375 #include <fcntl.h>
2376 #if !defined(AT_EMPTY_PATH)
2377 # error missing definition
2378 #else
2379 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2380 #endif'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002381config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002382 #include <sys/mman.h>
2383 #include <stddef.h>
2384 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002385
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002386config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002387 #include <pthread.h>
2388
2389 static void *f(void *p) { return NULL; }
2390 int main(void)
2391 {
2392 pthread_t thread;
2393 pthread_create(&thread, 0, f, 0);
2394 pthread_setname_np(thread, "QEMU");
2395 return 0;
2396 }''', dependencies: threads))
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002397config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002398 #include <pthread.h>
2399
2400 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
2401 int main(void)
2402 {
2403 pthread_t thread;
2404 pthread_create(&thread, 0, f, 0);
2405 return 0;
2406 }''', dependencies: threads))
Brad Smith3ada67a2022-12-18 03:22:04 -05002407config_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + '''
2408 #include <pthread.h>
2409 #include <pthread_np.h>
2410
2411 static void *f(void *p) { return NULL; }
2412 int main(void)
2413 {
2414 pthread_t thread;
2415 pthread_create(&thread, 0, f, 0);
2416 pthread_set_name_np(thread, "QEMU");
2417 return 0;
2418 }''', dependencies: threads))
Longpeng(Mike)657ac982022-02-22 17:05:05 +08002419config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
2420 #include <pthread.h>
2421 #include <time.h>
2422
2423 int main(void)
2424 {
2425 pthread_condattr_t attr
2426 pthread_condattr_init(&attr);
2427 pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2428 return 0;
2429 }''', dependencies: threads))
David Hildenbrand7730f322022-10-14 15:47:15 +02002430config_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + '''
2431 #include <pthread.h>
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002432
David Hildenbrand7730f322022-10-14 15:47:15 +02002433 static void *f(void *p) { return NULL; }
2434 int main(void)
2435 {
2436 int setsize = CPU_ALLOC_SIZE(64);
2437 pthread_t thread;
2438 cpu_set_t *cpuset;
2439 pthread_create(&thread, 0, f, 0);
2440 cpuset = CPU_ALLOC(64);
2441 CPU_ZERO_S(setsize, cpuset);
2442 pthread_setaffinity_np(thread, setsize, cpuset);
2443 pthread_getaffinity_np(thread, setsize, cpuset);
2444 CPU_FREE(cpuset);
2445 return 0;
2446 }''', dependencies: threads))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002447config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02002448 #include <sys/signalfd.h>
2449 #include <stddef.h>
2450 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002451config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002452 #include <unistd.h>
2453 #include <fcntl.h>
2454 #include <limits.h>
2455
2456 int main(void)
2457 {
2458 int len, fd = 0;
2459 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2460 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2461 return 0;
2462 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002463
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002464config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
2465 #include <sys/mman.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002466 int main(void) {
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002467 return mlockall(MCL_FUTURE);
2468 }'''))
2469
Thomas Hutheea94532021-10-28 20:59:08 +02002470have_l2tpv3 = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002471if get_option('l2tpv3').allowed() and have_system
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002472 have_l2tpv3 = cc.has_type('struct mmsghdr',
2473 prefix: gnu_source_prefix + '''
2474 #include <sys/socket.h>
2475 #include <linux/ip.h>''')
Thomas Hutheea94532021-10-28 20:59:08 +02002476endif
2477config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2478
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002479have_netmap = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002480if get_option('netmap').allowed() and have_system
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002481 have_netmap = cc.compiles('''
2482 #include <inttypes.h>
2483 #include <net/if.h>
2484 #include <net/netmap.h>
2485 #include <net/netmap_user.h>
2486 #if (NETMAP_API < 11) || (NETMAP_API > 15)
2487 #error
2488 #endif
2489 int main(void) { return 0; }''')
2490 if not have_netmap and get_option('netmap').enabled()
2491 error('Netmap headers not available')
2492 endif
2493endif
2494config_host_data.set('CONFIG_NETMAP', have_netmap)
2495
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002496# Work around a system header bug with some kernel/XFS header
2497# versions where they both try to define 'struct fsxattr':
2498# xfs headers will not try to redefine structs from linux headers
2499# if this macro is set.
2500config_host_data.set('HAVE_FSXATTR', cc.links('''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002501 #include <linux/fs.h>
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002502 struct fsxattr foo;
2503 int main(void) {
2504 return 0;
2505 }'''))
2506
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002507# Some versions of Mac OS X incorrectly define SIZE_MAX
2508config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2509 #include <stdint.h>
2510 #include <stdio.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002511 int main(void) {
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002512 return printf("%zu", SIZE_MAX);
2513 }''', args: ['-Werror']))
2514
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002515# See if 64-bit atomic operations are supported.
2516# Note that without __atomic builtins, we can only
2517# assume atomic loads/stores max at pointer size.
2518config_host_data.set('CONFIG_ATOMIC64', cc.links('''
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002519 #include <stdint.h>
2520 int main(void)
2521 {
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002522 uint64_t x = 0, y = 0;
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002523 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
2524 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
2525 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2526 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2527 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2528 return 0;
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002529 }'''))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002530
Richard Henderson6479dd72023-05-24 08:14:41 -07002531has_int128_type = cc.compiles('''
2532 __int128_t a;
2533 __uint128_t b;
2534 int main(void) { b = a; }''')
2535config_host_data.set('CONFIG_INT128_TYPE', has_int128_type)
2536
2537has_int128 = has_int128_type and cc.links('''
Marc-André Lureau848126d2022-02-28 15:49:19 +04002538 __int128_t a;
2539 __uint128_t b;
2540 int main (void) {
2541 a = a + b;
2542 b = a * b;
2543 a = a * a;
2544 return 0;
2545 }''')
Marc-André Lureau848126d2022-02-28 15:49:19 +04002546config_host_data.set('CONFIG_INT128', has_int128)
2547
Richard Henderson6479dd72023-05-24 08:14:41 -07002548if has_int128_type
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002549 # "do we have 128-bit atomics which are handled inline and specifically not
2550 # via libatomic". The reason we can't use libatomic is documented in the
2551 # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002552 # We only care about these operations on 16-byte aligned pointers, so
2553 # force 16-byte alignment of the pointer, which may be greater than
2554 # __alignof(unsigned __int128) for the host.
2555 atomic_test_128 = '''
2556 int main(int ac, char **av) {
Richard Henderson6479dd72023-05-24 08:14:41 -07002557 __uint128_t *p = __builtin_assume_aligned(av[ac - 1], 16);
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002558 p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED);
2559 __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED);
2560 __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2561 return 0;
2562 }'''
2563 has_atomic128 = cc.links(atomic_test_128)
Marc-André Lureau848126d2022-02-28 15:49:19 +04002564
2565 config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
2566
2567 if not has_atomic128
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002568 # Even with __builtin_assume_aligned, the above test may have failed
2569 # without optimization enabled. Try again with optimizations locally
2570 # enabled for the function. See
2571 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389
2572 has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128)
2573 config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt)
Marc-André Lureau848126d2022-02-28 15:49:19 +04002574
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002575 if not has_atomic128_opt
2576 config_host_data.set('CONFIG_CMPXCHG128', cc.links('''
2577 int main(void)
2578 {
Richard Henderson6479dd72023-05-24 08:14:41 -07002579 __uint128_t x = 0, y = 0;
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002580 __sync_val_compare_and_swap_16(&x, y, x);
2581 return 0;
2582 }
2583 '''))
2584 endif
Marc-André Lureau848126d2022-02-28 15:49:19 +04002585 endif
2586endif
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002587
2588config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
2589 #include <sys/auxv.h>
2590 int main(void) {
2591 return getauxval(AT_HWCAP) == 0;
2592 }'''))
2593
Paolo Bonzini0dae95d2022-04-20 17:33:43 +02002594config_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
2595 #include <linux/usbdevice_fs.h>
2596
2597 #ifndef USBDEVFS_GET_CAPABILITIES
2598 #error "USBDEVFS_GET_CAPABILITIES undefined"
2599 #endif
2600
2601 #ifndef USBDEVFS_DISCONNECT_CLAIM
2602 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
2603 #endif
2604
2605 int main(void) { return 0; }'''))
2606
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02002607have_keyring = get_option('keyring') \
2608 .require(targetos == 'linux', error_message: 'keyring is only available on Linux') \
2609 .require(cc.compiles('''
2610 #include <errno.h>
2611 #include <asm/unistd.h>
2612 #include <linux/keyctl.h>
2613 #include <sys/syscall.h>
2614 #include <unistd.h>
2615 int main(void) {
2616 return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
2617 }'''), error_message: 'keyctl syscall not available on this system').allowed()
2618config_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
2619
Paolo Bonzini622753d2021-11-08 13:38:58 +01002620have_cpuid_h = cc.links('''
2621 #include <cpuid.h>
2622 int main(void) {
2623 unsigned a, b, c, d;
2624 unsigned max = __get_cpuid_max(0, 0);
2625
2626 if (max >= 1) {
2627 __cpuid(1, a, b, c, d);
2628 }
2629
2630 if (max >= 7) {
2631 __cpuid_count(7, 0, a, b, c, d);
2632 }
2633
2634 return 0;
2635 }''')
2636config_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
2637
2638config_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
2639 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
2640 .require(cc.links('''
Paolo Bonzini622753d2021-11-08 13:38:58 +01002641 #include <cpuid.h>
2642 #include <immintrin.h>
Richard Henderson701ea582022-12-03 19:31:12 -06002643 static int __attribute__((target("avx2"))) bar(void *a) {
Paolo Bonzini622753d2021-11-08 13:38:58 +01002644 __m256i x = *(__m256i *)a;
2645 return _mm256_testz_si256(x, x);
2646 }
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002647 int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
Paolo Bonzini622753d2021-11-08 13:38:58 +01002648 '''), error_message: 'AVX2 not available').allowed())
2649
2650config_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \
2651 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \
2652 .require(cc.links('''
Paolo Bonzini622753d2021-11-08 13:38:58 +01002653 #include <cpuid.h>
2654 #include <immintrin.h>
Richard Henderson701ea582022-12-03 19:31:12 -06002655 static int __attribute__((target("avx512f"))) bar(void *a) {
Paolo Bonzini622753d2021-11-08 13:38:58 +01002656 __m512i x = *(__m512i *)a;
2657 return _mm512_test_epi64_mask(x, x);
2658 }
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002659 int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
Paolo Bonzini622753d2021-11-08 13:38:58 +01002660 '''), error_message: 'AVX512F not available').allowed())
2661
ling xu04ffce12022-11-16 23:29:22 +08002662config_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \
2663 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \
2664 .require(cc.links('''
ling xu04ffce12022-11-16 23:29:22 +08002665 #include <cpuid.h>
2666 #include <immintrin.h>
Richard Hendersondc165fc2023-05-01 22:05:55 +01002667 static int __attribute__((target("avx512bw"))) bar(void *a) {
ling xu04ffce12022-11-16 23:29:22 +08002668 __m512i *x = a;
2669 __m512i res= _mm512_abs_epi8(*x);
2670 return res[1];
2671 }
2672 int main(int argc, char *argv[]) { return bar(argv[0]); }
2673 '''), error_message: 'AVX512BW not available').allowed())
2674
Richard Henderson8d97f282023-06-02 07:43:40 +00002675# For both AArch64 and AArch32, detect if builtins are available.
2676config_host_data.set('CONFIG_ARM_AES_BUILTIN', cc.compiles('''
2677 #include <arm_neon.h>
2678 #ifndef __ARM_FEATURE_AES
2679 __attribute__((target("+crypto")))
2680 #endif
2681 void foo(uint8x16_t *p) { *p = vaesmcq_u8(*p); }
2682 '''))
2683
Paolo Bonzini3730a732022-04-20 17:33:41 +02002684have_pvrdma = get_option('pvrdma') \
2685 .require(rdma.found(), error_message: 'PVRDMA requires OpenFabrics libraries') \
Juan Quintela354d2d92022-05-02 15:11:19 +02002686 .require(cc.compiles(gnu_source_prefix + '''
2687 #include <sys/mman.h>
Paolo Bonzini3730a732022-04-20 17:33:41 +02002688 int main(void)
2689 {
2690 char buf = 0;
2691 void *addr = &buf;
2692 addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
2693
2694 return 0;
2695 }'''), error_message: 'PVRDMA requires mremap').allowed()
2696
2697if have_pvrdma
Juan Quintela354d2d92022-05-02 15:11:19 +02002698 config_host_data.set('LEGACY_RDMA_REG_MR', not cc.links('''
Paolo Bonzini3730a732022-04-20 17:33:41 +02002699 #include <infiniband/verbs.h>
2700 int main(void)
2701 {
2702 struct ibv_mr *mr;
2703 struct ibv_pd *pd = NULL;
2704 size_t length = 10;
2705 uint64_t iova = 0;
2706 int access = 0;
2707 void *addr = NULL;
2708
2709 mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
2710 ibv_dereg_mr(mr);
2711 return 0;
2712 }'''))
2713endif
2714
Paolo Bonzinib87df902021-11-08 13:52:11 +01002715if get_option('membarrier').disabled()
2716 have_membarrier = false
2717elif targetos == 'windows'
2718 have_membarrier = true
2719elif targetos == 'linux'
2720 have_membarrier = cc.compiles('''
2721 #include <linux/membarrier.h>
2722 #include <sys/syscall.h>
2723 #include <unistd.h>
2724 #include <stdlib.h>
2725 int main(void) {
2726 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
2727 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
2728 exit(0);
2729 }''')
2730endif
2731config_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
2732 .require(have_membarrier, error_message: 'membarrier system call not available') \
2733 .allowed())
2734
Paolo Bonzini34b52612021-11-08 14:02:42 +01002735have_afalg = get_option('crypto_afalg') \
2736 .require(cc.compiles(gnu_source_prefix + '''
2737 #include <errno.h>
2738 #include <sys/types.h>
2739 #include <sys/socket.h>
2740 #include <linux/if_alg.h>
2741 int main(void) {
2742 int sock;
2743 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
2744 return sock;
2745 }
2746 '''), error_message: 'AF_ALG requested but could not be detected').allowed()
2747config_host_data.set('CONFIG_AF_ALG', have_afalg)
2748
Marc-André Lureau9d734b82022-04-01 15:50:05 +04002749config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
2750 'linux/vm_sockets.h', 'AF_VSOCK',
2751 prefix: '#include <sys/socket.h>',
2752))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002753
Marc-André Lureau8821a382022-02-01 16:53:43 +04002754have_vss = false
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002755have_vss_sdk = false # old xp/2003 SDK
Thomas Huth785abf02023-07-06 08:47:36 +02002756if targetos == 'windows' and 'cpp' in all_languages
Marc-André Lureau8821a382022-02-01 16:53:43 +04002757 have_vss = cxx.compiles('''
2758 #define __MIDL_user_allocate_free_DEFINED__
Marc-André Lureau32478cb2022-02-22 23:40:01 +04002759 #include <vss.h>
Marc-André Lureau8821a382022-02-01 16:53:43 +04002760 int main(void) { return VSS_CTX_BACKUP; }''')
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002761 have_vss_sdk = cxx.has_header('vscoordint.h')
Marc-André Lureau8821a382022-02-01 16:53:43 +04002762endif
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002763config_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
Marc-André Lureau8821a382022-02-01 16:53:43 +04002764
Richard Henderson6391c772022-04-17 11:30:06 -07002765# Older versions of MinGW do not import _lock_file and _unlock_file properly.
2766# This was fixed for v6.0.0 with commit b48e3ac8969d.
2767if targetos == 'windows'
2768 config_host_data.set('HAVE__LOCK_FILE', cc.links('''
2769 #include <stdio.h>
2770 int main(void) {
2771 _lock_file(NULL);
2772 _unlock_file(NULL);
2773 return 0;
2774 }''', name: '_lock_file and _unlock_file'))
2775endif
2776
Pierrick Bouvierdbd672c2023-02-21 16:30:04 +01002777if targetos == 'windows'
2778 mingw_has_setjmp_longjmp = cc.links('''
2779 #include <setjmp.h>
2780 int main(void) {
2781 /*
2782 * These functions are not available in setjmp header, but may be
2783 * available at link time, from libmingwex.a.
2784 */
2785 extern int __mingw_setjmp(jmp_buf);
2786 extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int);
2787 jmp_buf env;
2788 __mingw_setjmp(env);
2789 __mingw_longjmp(env, 0);
2790 }
2791 ''', name: 'mingw setjmp and longjmp')
2792
2793 if cpu == 'aarch64' and not mingw_has_setjmp_longjmp
2794 error('mingw must provide setjmp/longjmp for windows-arm64')
2795 endif
2796endif
2797
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002798########################
2799# Target configuration #
2800########################
2801
Paolo Bonzini2becc362020-02-03 11:42:03 +01002802minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02002803config_targetos = {
2804 (targetos == 'windows' ? 'CONFIG_WIN32' : 'CONFIG_POSIX'): 'y'
2805}
2806if targetos == 'darwin'
2807 config_targetos += {'CONFIG_DARWIN': 'y'}
2808elif targetos == 'linux'
2809 config_targetos += {'CONFIG_LINUX': 'y'}
2810endif
2811if targetos in bsd_oses
2812 config_targetos += {'CONFIG_BSD': 'y'}
2813endif
2814
Paolo Bonzini05512f52020-09-16 15:31:11 -04002815config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04002816config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002817config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002818config_devices_mak_list = []
2819config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02002820config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002821config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002822
2823disassemblers = {
2824 'alpha' : ['CONFIG_ALPHA_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002825 'avr' : ['CONFIG_AVR_DIS'],
2826 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06002827 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002828 'hppa' : ['CONFIG_HPPA_DIS'],
2829 'i386' : ['CONFIG_I386_DIS'],
2830 'x86_64' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002831 'm68k' : ['CONFIG_M68K_DIS'],
2832 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
2833 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002834 'nios2' : ['CONFIG_NIOS2_DIS'],
2835 'or1k' : ['CONFIG_OPENRISC_DIS'],
2836 'ppc' : ['CONFIG_PPC_DIS'],
2837 'riscv' : ['CONFIG_RISCV_DIS'],
2838 'rx' : ['CONFIG_RX_DIS'],
2839 's390' : ['CONFIG_S390_DIS'],
2840 'sh4' : ['CONFIG_SH4_DIS'],
2841 'sparc' : ['CONFIG_SPARC_DIS'],
2842 'xtensa' : ['CONFIG_XTENSA_DIS'],
Song Gaoaae17462022-06-06 20:43:06 +08002843 'loongarch' : ['CONFIG_LOONGARCH_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002844}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002845
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002846have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01002847host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02002848 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002849 (have_tpm ? ['CONFIG_TPM=y'] : []) + \
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002850 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02002851 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002852 (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01002853 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02002854 (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
2855 (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
2856 (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01002857 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02002858 (targetos == 'linux' ? ['CONFIG_LINUX=y'] : []) + \
Paolo Bonzini3730a732022-04-20 17:33:41 +02002859 (have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \
Jagannathan Raman55116962022-06-13 16:26:24 -04002860 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
2861 (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01002862
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002863ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002864
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002865default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
2866actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002867fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002868foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04002869 config_target = { 'TARGET_NAME': target.split('-')[0] }
2870 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002871 if targetos != 'linux'
2872 if default_targets
2873 continue
2874 endif
2875 error('Target @0@ is only available on a Linux host'.format(target))
2876 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04002877 config_target += { 'CONFIG_LINUX_USER': 'y' }
2878 elif target.endswith('bsd-user')
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02002879 if targetos not in bsd_oses
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002880 if default_targets
2881 continue
2882 endif
2883 error('Target @0@ is only available on a BSD host'.format(target))
2884 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04002885 config_target += { 'CONFIG_BSD_USER': 'y' }
2886 elif target.endswith('softmmu')
Philippe Mathieu-Daudébd0c03b2023-06-13 15:33:45 +02002887 config_target += { 'CONFIG_SYSTEM_ONLY': 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04002888 config_target += { 'CONFIG_SOFTMMU': 'y' }
2889 endif
2890 if target.endswith('-user')
2891 config_target += {
2892 'CONFIG_USER_ONLY': 'y',
2893 'CONFIG_QEMU_INTERP_PREFIX':
Paolo Bonzinice6119d2022-04-20 17:33:55 +02002894 get_option('interp_prefix').replace('%M', config_target['TARGET_NAME'])
Paolo Bonzini765686d2020-09-18 06:37:21 -04002895 }
2896 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002897
Paolo Bonzini0a189112020-11-17 14:58:32 +01002898 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04002899 foreach sym: accelerators
2900 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
2901 config_target += { sym: 'y' }
2902 config_all += { sym: 'y' }
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002903 if target in modular_tcg
2904 config_target += { 'CONFIG_TCG_MODULAR': 'y' }
2905 else
2906 config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
2907 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01002908 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04002909 endif
2910 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01002911 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002912 if default_targets
2913 continue
2914 endif
2915 error('No accelerator available for target @0@'.format(target))
2916 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04002917
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002918 actual_target_dirs += target
Alex Bennée812b31d2021-07-07 14:17:43 +01002919 config_target += keyval.load('configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002920 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04002921
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002922 if 'TARGET_NEED_FDT' in config_target
2923 fdt_required += target
2924 endif
2925
Paolo Bonzinifa731682020-09-21 05:19:07 -04002926 # Add default keys
2927 if 'TARGET_BASE_ARCH' not in config_target
2928 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
2929 endif
2930 if 'TARGET_ABI_DIR' not in config_target
2931 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
2932 endif
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04002933 if 'TARGET_BIG_ENDIAN' not in config_target
2934 config_target += {'TARGET_BIG_ENDIAN': 'n'}
2935 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002936
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002937 foreach k, v: disassemblers
Paolo Bonzini823eb012021-11-08 14:18:17 +01002938 if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002939 foreach sym: v
2940 config_target += { sym: 'y' }
2941 config_all_disas += { sym: 'y' }
2942 endforeach
2943 endif
2944 endforeach
2945
Paolo Bonzini859aef02020-08-04 18:14:26 +02002946 config_target_data = configuration_data()
2947 foreach k, v: config_target
2948 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
2949 # do nothing
2950 elif ignored.contains(k)
2951 # do nothing
2952 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002953 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
2954 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02002955 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04002956 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02002957 config_target_data.set_quoted(k, v)
2958 elif v == 'y'
2959 config_target_data.set(k, 1)
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04002960 elif v == 'n'
2961 config_target_data.set(k, 0)
Paolo Bonzini859aef02020-08-04 18:14:26 +02002962 else
2963 config_target_data.set(k, v)
2964 endif
2965 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01002966 config_target_data.set('QEMU_ARCH',
2967 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02002968 config_target_h += {target: configure_file(output: target + '-config-target.h',
2969 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002970
2971 if target.endswith('-softmmu')
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01002972 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002973 config_devices_mak = target + '-config-devices.mak'
2974 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01002975 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01002976 output: config_devices_mak,
2977 depfile: config_devices_mak + '.d',
2978 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01002979 command: [minikconf,
2980 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01002981 config_devices_mak, '@DEPFILE@', '@INPUT@',
Philippe Mathieu-Daudéf4063f92021-07-07 14:17:40 +01002982 host_kconfig, accel_kconfig,
2983 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'])
Paolo Bonzini859aef02020-08-04 18:14:26 +02002984
2985 config_devices_data = configuration_data()
2986 config_devices = keyval.load(config_devices_mak)
2987 foreach k, v: config_devices
2988 config_devices_data.set(k, 1)
2989 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002990 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02002991 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
2992 configuration: config_devices_data)}
2993 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04002994 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01002995 endif
2996 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002997endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002998target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002999
Paolo Bonzini2becc362020-02-03 11:42:03 +01003000# This configuration is used to build files that are shared by
3001# multiple binaries, and then extracted out of the "common"
3002# static_library target.
3003#
3004# We do not use all_sources()/all_dependencies(), because it would
3005# build literally all source files, including devices only used by
3006# targets that are not built for this compilation. The CONFIG_ALL
3007# pseudo symbol replaces it.
3008
Paolo Bonzini05512f52020-09-16 15:31:11 -04003009config_all += config_all_devices
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003010config_all += config_targetos
Paolo Bonzini2becc362020-02-03 11:42:03 +01003011config_all += config_all_disas
3012config_all += {
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02003013 'CONFIG_XEN': xen.found(),
Philippe Mathieu-Daudéc7b64942023-06-13 15:33:46 +02003014 'CONFIG_SYSTEM_ONLY': have_system,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003015 'CONFIG_USER_ONLY': have_user,
3016 'CONFIG_ALL': true,
3017}
3018
Paolo Bonzinieed56e92021-11-10 11:01:26 +01003019target_configs_h = []
3020foreach target: target_dirs
3021 target_configs_h += config_target_h[target]
3022 target_configs_h += config_devices_h.get(target, [])
3023endforeach
3024genh += custom_target('config-poison.h',
3025 input: [target_configs_h],
3026 output: 'config-poison.h',
3027 capture: true,
3028 command: [find_program('scripts/make-config-poison.sh'),
3029 target_configs_h])
3030
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003031##############
3032# Submodules #
3033##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003034
3035capstone = not_found
Thomas Huth83602082022-05-16 16:58:23 +02003036if not get_option('capstone').auto() or have_system or have_user
Thomas Huth43ecd162022-05-16 16:58:22 +02003037 capstone = dependency('capstone', version: '>=3.0.5',
Paolo Bonzini063d5112022-07-14 14:56:58 +02003038 method: 'pkg-config',
Thomas Huth83602082022-05-16 16:58:23 +02003039 required: get_option('capstone'))
Daniel P. Berrangé8f4aea72021-07-09 15:29:31 +01003040
3041 # Some versions of capstone have broken pkg-config file
3042 # that reports a wrong -I path, causing the #include to
3043 # fail later. If the system has such a broken version
3044 # do not use it.
3045 if capstone.found() and not cc.compiles('#include <capstone.h>',
3046 dependencies: [capstone])
3047 capstone = not_found
Thomas Huth83602082022-05-16 16:58:23 +02003048 if get_option('capstone').enabled()
3049 error('capstone requested, but it does not appear to work')
Daniel P. Berrangé8f4aea72021-07-09 15:29:31 +01003050 endif
3051 endif
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003052endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02003053
Jagannathan Raman55116962022-06-13 16:26:24 -04003054libvfio_user_dep = not_found
3055if have_system and vfio_user_server_allowed
Paolo Bonzini2019cab2023-05-18 16:50:00 +02003056 libvfio_user_proj = subproject('libvfio-user', required: true)
Paolo Bonzini53283532023-03-30 12:47:23 +02003057 libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
Jagannathan Raman55116962022-06-13 16:26:24 -04003058endif
3059
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003060fdt = not_found
Paolo Bonzini577bdbc2023-05-18 17:29:04 +02003061fdt_opt = get_option('fdt')
3062if fdt_required.length() > 0 or fdt_opt == 'enabled'
3063 if fdt_opt == 'disabled'
3064 error('fdt disabled but required by targets ' + ', '.join(fdt_required))
3065 endif
3066
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003067 if fdt_opt in ['enabled', 'auto', 'system']
Paolo Bonzini577bdbc2023-05-18 17:29:04 +02003068 fdt = cc.find_library('fdt', required: fdt_opt == 'system')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003069 if fdt.found() and cc.links('''
3070 #include <libfdt.h>
3071 #include <libfdt_env.h>
Thomas Huthde47b0f2022-01-18 18:05:48 +01003072 int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003073 dependencies: fdt)
3074 fdt_opt = 'system'
Thomas Huth6c228532021-08-27 14:09:00 +02003075 elif fdt_opt == 'system'
3076 error('system libfdt requested, but it is too old (1.5.1 or newer required)')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003077 else
Paolo Bonzini577bdbc2023-05-18 17:29:04 +02003078 fdt_opt = 'internal'
Thomas Huth87daf892021-08-27 14:08:59 +02003079 fdt = not_found
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003080 endif
3081 endif
Paolo Bonzini577bdbc2023-05-18 17:29:04 +02003082 if not fdt.found()
3083 assert(fdt_opt == 'internal')
Paolo Bonzini58e48b22023-05-18 12:07:22 +00003084 libfdt_proj = subproject('dtc', required: true,
3085 default_options: ['tools=false', 'yaml=disabled',
3086 'python=disabled', 'default_library=static'])
3087 fdt = libfdt_proj.get_variable('libfdt_dep')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003088 endif
Philippe Mathieu-Daudéc593d842022-02-08 11:19:46 +01003089else
3090 fdt_opt = 'disabled'
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003091endif
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003092
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003093config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003094config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02003095config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003096
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003097#####################
3098# Generated sources #
3099#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003100
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003101genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003102
Marc-André Lureau3f885652019-07-15 18:06:04 +04003103hxtool = find_program('scripts/hxtool')
Marc-André Lureaue2c40122023-01-24 18:00:57 +00003104shaderinclude = find_program('scripts/shaderinclude.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003105qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003106qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
3107 meson.current_source_dir() / 'scripts/qapi/commands.py',
3108 meson.current_source_dir() / 'scripts/qapi/common.py',
3109 meson.current_source_dir() / 'scripts/qapi/error.py',
3110 meson.current_source_dir() / 'scripts/qapi/events.py',
3111 meson.current_source_dir() / 'scripts/qapi/expr.py',
3112 meson.current_source_dir() / 'scripts/qapi/gen.py',
3113 meson.current_source_dir() / 'scripts/qapi/introspect.py',
Markus Armbruster88d357d2023-04-28 12:54:16 +02003114 meson.current_source_dir() / 'scripts/qapi/main.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003115 meson.current_source_dir() / 'scripts/qapi/parser.py',
3116 meson.current_source_dir() / 'scripts/qapi/schema.py',
3117 meson.current_source_dir() / 'scripts/qapi/source.py',
3118 meson.current_source_dir() / 'scripts/qapi/types.py',
3119 meson.current_source_dir() / 'scripts/qapi/visit.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003120 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003121]
3122
3123tracetool = [
3124 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003125 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003126]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003127tracetool_depends = files(
3128 'scripts/tracetool/backend/log.py',
3129 'scripts/tracetool/backend/__init__.py',
3130 'scripts/tracetool/backend/dtrace.py',
3131 'scripts/tracetool/backend/ftrace.py',
3132 'scripts/tracetool/backend/simple.py',
3133 'scripts/tracetool/backend/syslog.py',
3134 'scripts/tracetool/backend/ust.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003135 'scripts/tracetool/format/ust_events_c.py',
3136 'scripts/tracetool/format/ust_events_h.py',
3137 'scripts/tracetool/format/__init__.py',
3138 'scripts/tracetool/format/d.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003139 'scripts/tracetool/format/simpletrace_stap.py',
3140 'scripts/tracetool/format/c.py',
3141 'scripts/tracetool/format/h.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003142 'scripts/tracetool/format/log_stap.py',
3143 'scripts/tracetool/format/stap.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003144 'scripts/tracetool/__init__.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003145 'scripts/tracetool/vcpu.py'
3146)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003147
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003148qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
3149 meson.current_source_dir(),
Paolo Bonzinib0b43232022-04-20 17:33:54 +02003150 get_option('pkgversion'), meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003151qemu_version = custom_target('qemu-version.h',
3152 output: 'qemu-version.h',
3153 command: qemu_version_cmd,
3154 capture: true,
3155 build_by_default: true,
3156 build_always_stale: true)
3157genh += qemu_version
3158
Marc-André Lureau3f885652019-07-15 18:06:04 +04003159hxdep = []
3160hx_headers = [
3161 ['qemu-options.hx', 'qemu-options.def'],
3162 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
3163]
3164if have_system
3165 hx_headers += [
3166 ['hmp-commands.hx', 'hmp-commands.h'],
3167 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
3168 ]
3169endif
3170foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003171 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04003172 input: files(d[0]),
3173 output: d[1],
3174 capture: true,
3175 build_by_default: true, # to be removed when added to a target
3176 command: [hxtool, '-h', '@INPUT0@'])
3177endforeach
3178genh += hxdep
3179
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003180###################
3181# Collect sources #
3182###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003183
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003184authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02003185blockdev_ss = ss.source_set()
3186block_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003187chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02003188common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003189crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02003190hwcore_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003191io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02003192qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02003193qom_ss = ss.source_set()
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003194system_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02003195specific_fuzz_ss = ss.source_set()
3196specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003197stub_ss = ss.source_set()
3198trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003199user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02003200util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003201
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003202# accel modules
3203qtest_module_ss = ss.source_set()
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02003204tcg_module_ss = ss.source_set()
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003205
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003206modules = {}
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003207target_modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003208hw_arch = {}
3209target_arch = {}
3210target_softmmu_arch = {}
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02003211target_user_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003212
3213###############
3214# Trace files #
3215###############
3216
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003217# TODO: add each directory to the subdirs from its own meson.build, once
3218# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003219trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003220 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003221 'qapi',
3222 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003223 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003224 'util',
Alex Bennée842b42d2022-09-29 12:42:22 +01003225 'gdbstub',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003226]
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003227if have_linux_user
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003228 trace_events_subdirs += [ 'linux-user' ]
3229endif
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003230if have_bsd_user
3231 trace_events_subdirs += [ 'bsd-user' ]
3232endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003233if have_block
3234 trace_events_subdirs += [
3235 'authz',
3236 'block',
3237 'io',
3238 'nbd',
3239 'scsi',
3240 ]
3241endif
3242if have_system
3243 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003244 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003245 'audio',
3246 'backends',
3247 'backends/tpm',
3248 'chardev',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003249 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003250 'hw/9pfs',
3251 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08003252 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003253 'hw/alpha',
3254 'hw/arm',
3255 'hw/audio',
3256 'hw/block',
3257 'hw/block/dataplane',
3258 'hw/char',
3259 'hw/display',
3260 'hw/dma',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003261 'hw/hyperv',
3262 'hw/i2c',
3263 'hw/i386',
3264 'hw/i386/xen',
David Woodhouseaa98ee32023-01-13 19:51:32 +00003265 'hw/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003266 'hw/ide',
3267 'hw/input',
3268 'hw/intc',
3269 'hw/isa',
3270 'hw/mem',
3271 'hw/mips',
3272 'hw/misc',
3273 'hw/misc/macio',
3274 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08003275 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01003276 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02003277 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003278 'hw/nvram',
3279 'hw/pci',
3280 'hw/pci-host',
3281 'hw/ppc',
3282 'hw/rdma',
3283 'hw/rdma/vmw',
3284 'hw/rtc',
3285 'hw/s390x',
3286 'hw/scsi',
3287 'hw/sd',
BALATON Zoltanad52cfc2021-10-29 23:02:09 +02003288 'hw/sh4',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003289 'hw/sparc',
3290 'hw/sparc64',
3291 'hw/ssi',
3292 'hw/timer',
3293 'hw/tpm',
3294 'hw/usb',
3295 'hw/vfio',
3296 'hw/virtio',
3297 'hw/watchdog',
3298 'hw/xen',
3299 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003300 'migration',
3301 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02003302 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003303 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05003304 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003305 ]
3306endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003307if have_system or have_user
3308 trace_events_subdirs += [
3309 'accel/tcg',
3310 'hw/core',
3311 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02003312 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003313 'target/hppa',
3314 'target/i386',
3315 'target/i386/kvm',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02003316 'target/mips/tcg',
Richard Henderson6f83e272022-02-25 21:06:20 -10003317 'target/nios2',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003318 'target/ppc',
3319 'target/riscv',
3320 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08003321 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003322 'target/sparc',
3323 ]
3324endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003325
Marc-André Lureau0df750e2020-11-25 14:06:37 +04003326vhost_user = not_found
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003327if targetos == 'linux' and have_vhost_user
Marc-André Lureau0df750e2020-11-25 14:06:37 +04003328 libvhost_user = subproject('libvhost-user')
3329 vhost_user = libvhost_user.get_variable('vhost_user_dep')
3330endif
3331
Xie Yongjia6caeee2022-05-23 16:46:08 +08003332libvduse = not_found
3333if have_libvduse
3334 libvduse_proj = subproject('libvduse')
3335 libvduse = libvduse_proj.get_variable('libvduse_dep')
3336endif
3337
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +01003338# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
3339# that is filled in by qapi/.
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003340subdir('qapi')
3341subdir('qobject')
3342subdir('stubs')
3343subdir('trace')
3344subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04003345subdir('qom')
3346subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003347subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04003348subdir('ui')
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003349subdir('hw')
Alex Bennée842b42d2022-09-29 12:42:22 +01003350subdir('gdbstub')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003351
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003352if enable_modules
3353 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
3354 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
3355endif
3356
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003357qom_ss = qom_ss.apply(config_targetos, strict: false)
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003358libqom = static_library('qom', qom_ss.sources() + genh,
3359 dependencies: [qom_ss.dependencies()],
3360 name_suffix: 'fa')
3361qom = declare_dependency(link_whole: libqom)
3362
3363event_loop_base = files('event-loop-base.c')
3364event_loop_base = static_library('event-loop-base', sources: event_loop_base + genh,
3365 build_by_default: true)
3366event_loop_base = declare_dependency(link_whole: event_loop_base,
3367 dependencies: [qom])
3368
Paolo Bonzini2becc362020-02-03 11:42:03 +01003369stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003370
3371util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01003372util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003373libqemuutil = static_library('qemuutil',
3374 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +02003375 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003376qemuutil = declare_dependency(link_with: libqemuutil,
Nicolas Saenz Julienne70ac26b2022-04-25 09:57:22 +02003377 sources: genh + version_res,
3378 dependencies: [event_loop_base])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003379
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01003380if have_system or have_user
3381 decodetree = generator(find_program('scripts/decodetree.py'),
3382 output: 'decode-@BASENAME@.c.inc',
3383 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3384 subdir('libdecnumber')
3385 subdir('target')
3386endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003387
Paolo Bonzini478e9432020-08-17 12:47:55 +02003388subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04003389subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04003390subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003391subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04003392subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003393
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003394if have_block
3395 block_ss.add(files(
3396 'block.c',
3397 'blockjob.c',
3398 'job.c',
3399 'qemu-io-cmds.c',
3400 ))
Paolo Bonzini406523f2021-10-13 11:43:54 +02003401 if config_host_data.get('CONFIG_REPLICATION')
3402 block_ss.add(files('replication.c'))
3403 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003404
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003405 subdir('nbd')
3406 subdir('scsi')
3407 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003408
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003409 blockdev_ss.add(files(
3410 'blockdev.c',
3411 'blockdev-nbd.c',
3412 'iothread.c',
3413 'job-qmp.c',
3414 ), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02003415
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003416 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
3417 # os-win32.c does not
3418 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003419 system_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003420endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02003421
3422common_ss.add(files('cpus-common.c'))
Philippe Mathieu-Daudé31ffa2a2022-11-24 16:34:11 +01003423specific_ss.add(files('cpu.c'))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003424
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02003425subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003426
Richard Henderson44b99a62021-03-22 12:24:26 +01003427# Work around a gcc bug/misfeature wherein constant propagation looks
3428# through an alias:
3429# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
3430# to guess that a const variable is always zero. Without lto, this is
3431# impossible, as the alias is restricted to page-vary-common.c. Indeed,
3432# without lto, not even the alias is required -- we simply use different
3433# declarations in different compilation units.
3434pagevary = files('page-vary-common.c')
3435if get_option('b_lto')
3436 pagevary_flags = ['-fno-lto']
3437 if get_option('cfi')
3438 pagevary_flags += '-fno-sanitize=cfi-icall'
3439 endif
Thomas Huth54c9b192022-03-30 13:48:08 +02003440 pagevary = static_library('page-vary-common', sources: pagevary + genh,
Richard Henderson44b99a62021-03-22 12:24:26 +01003441 c_args: pagevary_flags)
3442 pagevary = declare_dependency(link_with: pagevary)
3443endif
3444common_ss.add(pagevary)
Richard Henderson6670d4d2021-03-22 12:24:24 +01003445specific_ss.add(files('page-vary.c'))
3446
Marc-André Lureauab318052019-07-24 19:23:16 +04003447subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04003448subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04003449subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003450subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04003451subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04003452subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00003453subdir('semihosting')
Markus Armbrusteraa09b3d2023-01-24 13:19:36 +01003454subdir('stats')
Richard Henderson104cc2c2021-03-08 12:04:33 -08003455subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08003456subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04003457subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003458subdir('plugins')
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003459subdir('ebpf')
3460
3461common_user_inc = []
3462
3463subdir('common-user')
Marc-André Lureaub309c322019-08-18 19:20:37 +04003464subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04003465subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003466
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003467# needed for fuzzing binaries
3468subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003469subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003470
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003471# accel modules
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02003472tcg_real_module_ss = ss.source_set()
3473tcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
3474specific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
3475target_modules += { 'accel' : { 'qtest': qtest_module_ss,
3476 'tcg': tcg_real_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003477
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003478########################
3479# Library dependencies #
3480########################
3481
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003482modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003483modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003484modinfo_files = []
3485
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003486block_mods = []
3487softmmu_mods = []
3488foreach d, list : modules
Paolo Bonzinief709862023-05-04 10:20:46 +02003489 if not (d == 'block' ? have_block : have_system)
3490 continue
3491 endif
3492
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003493 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003494 if enable_modules
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02003495 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003496 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
3497 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
3498 if d == 'block'
3499 block_mods += sl
3500 else
3501 softmmu_mods += sl
3502 endif
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003503 if module_ss.sources() != []
3504 # FIXME: Should use sl.extract_all_objects(recursive: true) as
3505 # input. Sources can be used multiple times but objects are
3506 # unique when it comes to lookup in compile_commands.json.
3507 # Depnds on a mesion version with
3508 # https://github.com/mesonbuild/meson/pull/8900
3509 modinfo_files += custom_target(d + '-' + m + '.modinfo',
3510 output: d + '-' + m + '.modinfo',
Paolo Bonziniac347112021-07-21 18:51:57 +02003511 input: module_ss.sources() + genh,
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003512 capture: true,
Paolo Bonziniac347112021-07-21 18:51:57 +02003513 command: [modinfo_collect, module_ss.sources()])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003514 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003515 else
3516 if d == 'block'
3517 block_ss.add_all(module_ss)
3518 else
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003519 system_ss.add_all(module_ss)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003520 endif
3521 endif
3522 endforeach
3523endforeach
3524
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003525foreach d, list : target_modules
3526 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003527 if enable_modules
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003528 foreach target : target_dirs
3529 if target.endswith('-softmmu')
3530 config_target = config_target_mak[target]
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003531 config_target += config_targetos
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003532 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3533 c_args = ['-DNEED_CPU_H',
3534 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3535 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3536 target_module_ss = module_ss.apply(config_target, strict: false)
3537 if target_module_ss.sources() != []
3538 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3539 sl = static_library(module_name,
3540 [genh, target_module_ss.sources()],
3541 dependencies: [modulecommon, target_module_ss.dependencies()],
3542 include_directories: target_inc,
3543 c_args: c_args,
3544 pic: true)
3545 softmmu_mods += sl
3546 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
3547 modinfo_files += custom_target(module_name + '.modinfo',
3548 output: module_name + '.modinfo',
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003549 input: target_module_ss.sources() + genh,
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003550 capture: true,
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003551 command: [modinfo_collect, '--target', target, target_module_ss.sources()])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003552 endif
3553 endif
3554 endforeach
3555 else
3556 specific_ss.add_all(module_ss)
3557 endif
3558 endforeach
3559endforeach
3560
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003561if enable_modules
Jose R. Ziviani05d68142022-05-28 00:20:35 +02003562 foreach target : target_dirs
3563 if target.endswith('-softmmu')
3564 config_target = config_target_mak[target]
3565 config_devices_mak = target + '-config-devices.mak'
3566 modinfo_src = custom_target('modinfo-' + target + '.c',
3567 output: 'modinfo-' + target + '.c',
3568 input: modinfo_files,
3569 command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
3570 capture: true)
3571
3572 modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
3573 modinfo_dep = declare_dependency(link_with: modinfo_lib)
3574
3575 arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
3576 hw_arch[arch].add(modinfo_dep)
3577 endif
3578 endforeach
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003579endif
3580
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003581nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08003582undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003583block_syms = custom_target('block.syms', output: 'block.syms',
3584 input: [libqemuutil, block_mods],
3585 capture: true,
3586 command: [undefsym, nm, '@INPUT@'])
3587qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
3588 input: [libqemuutil, softmmu_mods],
3589 capture: true,
3590 command: [undefsym, nm, '@INPUT@'])
3591
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003592authz_ss = authz_ss.apply(config_targetos, strict: false)
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003593libauthz = static_library('authz', authz_ss.sources() + genh,
3594 dependencies: [authz_ss.dependencies()],
3595 name_suffix: 'fa',
3596 build_by_default: false)
3597
3598authz = declare_dependency(link_whole: libauthz,
3599 dependencies: qom)
3600
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003601crypto_ss = crypto_ss.apply(config_targetos, strict: false)
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003602libcrypto = static_library('crypto', crypto_ss.sources() + genh,
3603 dependencies: [crypto_ss.dependencies()],
3604 name_suffix: 'fa',
3605 build_by_default: false)
3606
3607crypto = declare_dependency(link_whole: libcrypto,
3608 dependencies: [authz, qom])
3609
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003610io_ss = io_ss.apply(config_targetos, strict: false)
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003611libio = static_library('io', io_ss.sources() + genh,
3612 dependencies: [io_ss.dependencies()],
3613 link_with: libqemuutil,
3614 name_suffix: 'fa',
3615 build_by_default: false)
3616
3617io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
3618
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003619libmigration = static_library('migration', sources: migration_files + genh,
3620 name_suffix: 'fa',
3621 build_by_default: false)
3622migration = declare_dependency(link_with: libmigration,
3623 dependencies: [zlib, qom, io])
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003624system_ss.add(migration)
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003625
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003626block_ss = block_ss.apply(config_targetos, strict: false)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003627libblock = static_library('block', block_ss.sources() + genh,
3628 dependencies: block_ss.dependencies(),
3629 link_depends: block_syms,
3630 name_suffix: 'fa',
3631 build_by_default: false)
3632
3633block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003634 link_args: '@block.syms',
3635 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003636
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003637blockdev_ss = blockdev_ss.apply(config_targetos, strict: false)
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003638libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
3639 dependencies: blockdev_ss.dependencies(),
3640 name_suffix: 'fa',
3641 build_by_default: false)
3642
3643blockdev = declare_dependency(link_whole: [libblockdev],
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003644 dependencies: [block, event_loop_base])
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003645
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003646qmp_ss = qmp_ss.apply(config_targetos, strict: false)
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003647libqmp = static_library('qmp', qmp_ss.sources() + genh,
3648 dependencies: qmp_ss.dependencies(),
3649 name_suffix: 'fa',
3650 build_by_default: false)
3651
3652qmp = declare_dependency(link_whole: [libqmp])
3653
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003654libchardev = static_library('chardev', chardev_ss.sources() + genh,
3655 name_suffix: 'fa',
Marc-André Lureau22d1f7a2022-03-23 19:57:12 +04003656 dependencies: chardev_ss.dependencies(),
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003657 build_by_default: false)
3658
3659chardev = declare_dependency(link_whole: libchardev)
3660
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003661hwcore_ss = hwcore_ss.apply(config_targetos, strict: false)
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02003662libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02003663 name_suffix: 'fa',
3664 build_by_default: false)
3665hwcore = declare_dependency(link_whole: libhwcore)
3666common_ss.add(hwcore)
3667
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02003668###########
3669# Targets #
3670###########
3671
Paolo Bonzinifb721762022-01-07 13:00:44 +01003672emulator_modules = []
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003673foreach m : block_mods + softmmu_mods
Paolo Bonzinifb721762022-01-07 13:00:44 +01003674 emulator_modules += shared_module(m.name(),
3675 build_by_default: true,
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003676 name_prefix: '',
3677 link_whole: m,
3678 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003679 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003680endforeach
Paolo Bonzinid8f3a602022-05-30 14:24:34 +02003681if emulator_modules.length() > 0
3682 alias_target('modules', emulator_modules)
3683endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003684
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003685system_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003686common_ss.add(qom, qemuutil)
3687
Philippe Mathieu-Daudéde6cd752023-06-13 15:33:47 +02003688common_ss.add_all(when: 'CONFIG_SYSTEM_ONLY', if_true: [system_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01003689common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
3690
3691common_all = common_ss.apply(config_all, strict: false)
3692common_all = static_library('common',
3693 build_by_default: false,
3694 sources: common_all.sources() + genh,
Paolo Bonzini9d24fb72021-12-21 16:09:54 +01003695 include_directories: common_user_inc,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09003696 implicit_include_directories: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003697 dependencies: common_all.dependencies(),
3698 name_suffix: 'fa')
3699
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003700feature_to_c = find_program('scripts/feature_to_c.sh')
3701
Philippe Mathieu-Daudé30cfa502022-02-15 17:25:03 +01003702if targetos == 'darwin'
3703 entitlement = find_program('scripts/entitlement.sh')
3704endif
3705
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04003706emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003707foreach target : target_dirs
3708 config_target = config_target_mak[target]
3709 target_name = config_target['TARGET_NAME']
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003710 target_base_arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02003711 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003712 arch_deps = []
3713 c_args = ['-DNEED_CPU_H',
3714 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3715 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04003716 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01003717
Paolo Bonzini1f2146f2023-08-30 11:39:45 +02003718 config_target += config_targetos
Paolo Bonzini2becc362020-02-03 11:42:03 +01003719 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3720 if targetos == 'linux'
3721 target_inc += include_directories('linux-headers', is_system: true)
3722 endif
3723 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003724 target_type='system'
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003725 t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003726 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003727 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003728
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003729 hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
Marc-André Lureau2c442202019-08-17 13:55:58 +04003730 hw = hw_arch[hw_dir].apply(config_target, strict: false)
3731 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003732 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04003733
Paolo Bonzini2becc362020-02-03 11:42:03 +01003734 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003735 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01003736 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04003737 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01003738 target_type='user'
Paolo Bonzinia3a576b2021-12-21 16:23:55 +01003739 target_inc += common_user_inc
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003740 if target_base_arch in target_user_arch
3741 t = target_user_arch[target_base_arch].apply(config_target, strict: false)
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02003742 arch_srcs += t.sources()
3743 arch_deps += t.dependencies()
3744 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01003745 if 'CONFIG_LINUX_USER' in config_target
3746 base_dir = 'linux-user'
Warner Loshe2a74722021-08-03 17:17:17 -06003747 endif
3748 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01003749 base_dir = 'bsd-user'
Warner Loshe2a74722021-08-03 17:17:17 -06003750 target_inc += include_directories('bsd-user/' / targetos)
Warner Losh85fc1b52022-01-08 17:27:34 -07003751 target_inc += include_directories('bsd-user/host/' / host_arch)
Warner Loshe2a74722021-08-03 17:17:17 -06003752 dir = base_dir / abi
Warner Losh19bf1292021-11-04 16:34:48 -06003753 arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003754 endif
3755 target_inc += include_directories(
3756 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04003757 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003758 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04003759 if 'CONFIG_LINUX_USER' in config_target
3760 dir = base_dir / abi
3761 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
3762 if config_target.has_key('TARGET_SYSTBL_ABI')
3763 arch_srcs += \
3764 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
3765 extra_args : config_target['TARGET_SYSTBL_ABI'])
3766 endif
3767 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01003768 endif
3769
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003770 if 'TARGET_XML_FILES' in config_target
3771 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
3772 output: target + '-gdbstub-xml.c',
3773 input: files(config_target['TARGET_XML_FILES'].split()),
3774 command: [feature_to_c, '@INPUT@'],
3775 capture: true)
3776 arch_srcs += gdbstub_xml
3777 endif
3778
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003779 t = target_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003780 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003781 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003782
Paolo Bonzini2becc362020-02-03 11:42:03 +01003783 target_common = common_ss.apply(config_target, strict: false)
3784 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003785 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003786
Paolo Bonzini2becc362020-02-03 11:42:03 +01003787 target_specific = specific_ss.apply(config_target, strict: false)
3788 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003789 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003790
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003791 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02003792 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02003793 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003794 objects: objects,
3795 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003796 c_args: c_args,
3797 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003798 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003799
3800 if target.endswith('-softmmu')
3801 execs = [{
3802 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003803 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003804 'sources': files('softmmu/main.c'),
3805 'dependencies': []
3806 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01003807 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003808 execs += [{
3809 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003810 'win_subsystem': 'windows',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003811 'sources': files('softmmu/main.c'),
3812 'dependencies': []
3813 }]
3814 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02003815 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003816 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
3817 execs += [{
3818 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003819 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003820 'sources': specific_fuzz.sources(),
3821 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003822 }]
3823 endif
3824 else
3825 execs = [{
3826 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003827 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003828 'sources': [],
3829 'dependencies': []
3830 }]
3831 endif
3832 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01003833 exe_name = exe['name']
John Arbuckle3983a762021-07-05 15:53:28 -04003834 if targetos == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01003835 exe_name += '-unsigned'
3836 endif
3837
3838 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09003839 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003840 c_args: c_args,
3841 dependencies: arch_deps + deps + exe['dependencies'],
3842 objects: lib.extract_all_objects(recursive: true),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003843 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
3844 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003845 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003846
John Arbuckle3983a762021-07-05 15:53:28 -04003847 if targetos == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003848 icon = 'pc-bios/qemu.rsrc'
3849 build_input = [emulator, files(icon)]
3850 install_input = [
3851 get_option('bindir') / exe_name,
3852 meson.current_source_dir() / icon
3853 ]
3854 if 'CONFIG_HVF' in config_target
3855 entitlements = 'accel/hvf/entitlements.plist'
3856 build_input += files(entitlements)
3857 install_input += meson.current_source_dir() / entitlements
3858 endif
3859
Alexander Graf8a74ce62021-01-20 23:44:34 +01003860 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003861 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01003862 output: exe['name'],
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003863 command: [entitlement, '@OUTPUT@', '@INPUT@'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003864 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09003865
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003866 meson.add_install_script(entitlement, '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09003867 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003868 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01003869 else
3870 emulators += {exe['name']: emulator}
3871 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003872
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003873 if stap.found()
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003874 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003875 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
3876 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003877 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
3878 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
3879 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003880 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003881 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003882 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003883 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003884 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003885 command: [
3886 tracetool, '--group=all', '--format=' + stp['fmt'],
3887 '--binary=' + stp['bin'],
3888 '--target-name=' + target_name,
3889 '--target-type=' + target_type,
3890 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01003891 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003892 ],
3893 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003894 endforeach
3895 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003896 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003897endforeach
3898
Paolo Bonzini931049b2020-02-05 09:44:24 +01003899# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003900
Paolo Bonzini2c13c572023-08-30 12:20:53 +02003901if get_option('plugins')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003902 install_headers('include/qemu/qemu-plugin.h')
3903endif
3904
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003905subdir('qga')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02003906
Laurent Vivier9755c942020-08-24 17:24:30 +02003907# Don't build qemu-keymap if xkbcommon is not explicitly enabled
3908# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02003909if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04003910 # used for the update-keymaps target, so include rules even if !have_tools
3911 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
3912 dependencies: [qemuutil, xkbcommon], install: have_tools)
3913endif
3914
Paolo Bonzini931049b2020-02-05 09:44:24 +01003915if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003916 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
3917 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
3918 qemu_io = executable('qemu-io', files('qemu-io.c'),
3919 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01003920 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06003921 dependencies: [blockdev, qemuutil, gnutls, selinux],
3922 install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003923
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02003924 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003925 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04003926 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003927
Marc-André Lureau157e7b12019-07-15 14:50:58 +04003928 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
3929 dependencies: qemuutil,
3930 install: true)
3931
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003932 if have_vhost_user
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02003933 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02003934 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04003935 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02003936 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01003937 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003938
3939 if targetos == 'linux'
3940 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
3941 dependencies: [qemuutil, libcap_ng],
3942 install: true,
3943 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003944
3945 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
3946 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02003947 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003948 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003949 endif
3950
Paolo Bonziniccd250a2021-06-03 12:50:17 +02003951 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04003952 subdir('contrib/ivshmem-client')
3953 subdir('contrib/ivshmem-server')
3954 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01003955endif
3956
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04003957subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01003958subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04003959subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02003960subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08003961subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01003962if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04003963 subdir('po')
3964endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01003965
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003966if host_machine.system() == 'windows'
3967 nsis_cmd = [
3968 find_program('scripts/nsis.py'),
3969 '@OUTPUT@',
3970 get_option('prefix'),
3971 meson.current_source_dir(),
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02003972 glib_pc.get_variable('bindir'),
Stefan Weil24bdcc92020-11-25 20:18:33 +01003973 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003974 '--',
3975 '-DDISPLAYVERSION=' + meson.project_version(),
3976 ]
3977 if build_docs
3978 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
3979 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01003980 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003981 nsis_cmd += '-DCONFIG_GTK=y'
3982 endif
3983
3984 nsis = custom_target('nsis',
3985 output: 'qemu-setup-' + meson.project_version() + '.exe',
3986 input: files('qemu.nsi'),
3987 build_always_stale: true,
3988 command: nsis_cmd + ['@INPUT@'])
3989 alias_target('installer', nsis)
3990endif
3991
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003992#########################
3993# Configuration summary #
3994#########################
3995
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02003996# Build environment
Paolo Bonzinif9332752020-02-03 13:28:38 +01003997summary_info = {}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02003998summary_info += {'Build directory': meson.current_build_dir()}
3999summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonziniac4ccac2023-05-18 16:11:29 +02004000summary_info += {'Download dependencies': get_option('wrap_mode') != 'nodownload'}
4001summary(summary_info, bool_yn: true, section: 'Build environment')
4002
4003# Directories
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004004summary_info += {'Install prefix': get_option('prefix')}
4005summary_info += {'BIOS directory': qemu_datadir}
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09004006pathsep = targetos == 'windows' ? ';' : ':'
4007summary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004008summary_info += {'binary directory': get_option('prefix') / get_option('bindir')}
4009summary_info += {'library directory': get_option('prefix') / get_option('libdir')}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004010summary_info += {'module directory': qemu_moddir}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004011summary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
4012summary_info += {'include directory': get_option('prefix') / get_option('includedir')}
4013summary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004014if targetos != 'windows'
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004015 summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
4016 summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004017else
4018 summary_info += {'local state directory': 'queried at runtime'}
4019endif
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004020summary_info += {'Doc directory': get_option('prefix') / get_option('docdir')}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004021summary(summary_info, bool_yn: true, section: 'Directories')
4022
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004023# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004024summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004025summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004026summary_info += {'sphinx-build': sphinx_build}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004027if config_host.has_key('HAVE_GDB_BIN')
4028 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
4029endif
Paolo Bonzini40c909f2022-04-20 17:33:49 +02004030summary_info += {'iasl': iasl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004031summary_info += {'genisoimage': config_host['GENISOIMAGE']}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004032if targetos == 'windows' and have_ga
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004033 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004034endif
Thomas Huth58902582022-04-08 18:20:47 +02004035if slirp.found() and have_system
Paolo Bonzini35acbb32021-10-13 13:43:36 +02004036 summary_info += {'smbd': have_slirp_smbd ? smbd_path : false}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004037endif
4038summary(summary_info, bool_yn: true, section: 'Host binaries')
4039
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004040# Configurable features
4041summary_info = {}
4042summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004043summary_info += {'system-mode emulation': have_system}
4044summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004045summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004046summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini60027112022-10-20 14:53:10 +02004047summary_info += {'module support': enable_modules}
4048if enable_modules
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02004049 summary_info += {'alternative module path': get_option('module_upgrades')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004050endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004051summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004052if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02004053 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004054endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02004055summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
4056if 'simple' in get_option('trace_backends')
4057 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004058endif
Marc-André Lureau142ca622021-07-15 11:53:53 +04004059summary_info += {'D-Bus display': dbus_display}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004060summary_info += {'QOM debugging': get_option('qom_cast_debug')}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004061summary_info += {'vhost-kernel support': have_vhost_kernel}
4062summary_info += {'vhost-net support': have_vhost_net}
4063summary_info += {'vhost-user support': have_vhost_user}
4064summary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004065summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004066summary_info += {'vhost-vdpa support': have_vhost_vdpa}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004067summary_info += {'build guest agent': have_ga}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004068summary(summary_info, bool_yn: true, section: 'Configurable features')
4069
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004070# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004071summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004072summary_info += {'host CPU': cpu}
4073summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01004074summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
4075summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Thomas Huth785abf02023-07-06 08:47:36 +02004076if 'cpp' in all_languages
Alex Bennée63de9352021-05-27 17:03:15 +01004077 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004078else
4079 summary_info += {'C++ compiler': false}
4080endif
4081if targetos == 'darwin'
Alex Bennée63de9352021-05-27 17:03:15 +01004082 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004083endif
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004084option_cflags = (get_option('debug') ? ['-g'] : [])
4085if get_option('optimization') != 'plain'
4086 option_cflags += ['-O' + get_option('optimization')]
4087endif
4088summary_info += {'CFLAGS': ' '.join(get_option('c_args') + option_cflags)}
Thomas Huth785abf02023-07-06 08:47:36 +02004089if 'cpp' in all_languages
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004090 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args') + option_cflags)}
Paolo Bonzini47b30832020-09-23 05:26:17 -04004091endif
Philippe Mathieu-Daudée910c7d2022-01-08 22:38:55 +01004092if targetos == 'darwin'
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004093 summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args') + option_cflags)}
Philippe Mathieu-Daudée910c7d2022-01-08 22:38:55 +01004094endif
Thomas Huth785abf02023-07-06 08:47:36 +02004095link_args = get_option('c_link_args')
Paolo Bonzini47b30832020-09-23 05:26:17 -04004096if link_args.length() > 0
4097 summary_info += {'LDFLAGS': ' '.join(link_args)}
4098endif
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004099summary_info += {'QEMU_CFLAGS': ' '.join(qemu_common_flags + qemu_cflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004100if 'cpp' in all_languages
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004101 summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_common_flags + qemu_cxxflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004102endif
4103if 'objc' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +01004104 summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_common_flags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004105endif
Paolo Bonzinid0651772022-04-20 17:33:34 +02004106summary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)}
Daniele Buonocdad7812020-12-04 18:06:11 -05004107summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004108summary_info += {'PIE': get_option('b_pie')}
Paolo Bonzinie58e55d2023-06-07 10:00:21 +02004109summary_info += {'static build': get_option('prefer_static')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004110summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinib87df902021-11-08 13:52:11 +01004111summary_info += {'membarrier': have_membarrier}
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04004112summary_info += {'debug graph lock': get_option('debug_graph_lock')}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004113summary_info += {'debug stack usage': get_option('debug_stack_usage')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004114summary_info += {'mutex debugging': get_option('debug_mutex')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004115summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01004116summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
ling xu04ffce12022-11-16 23:29:22 +08004117summary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01004118summary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')}
Alex Bennéebb9ecae2023-01-31 09:42:23 +00004119if get_option('gprof')
4120 gprof_info = 'YES (deprecated)'
4121else
4122 gprof_info = get_option('gprof')
4123endif
4124summary_info += {'gprof': gprof_info}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004125summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzini34f983d2023-01-09 15:31:51 +01004126summary_info += {'thread sanitizer': get_option('tsan')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004127summary_info += {'CFI support': get_option('cfi')}
4128if get_option('cfi')
4129 summary_info += {'CFI debug support': get_option('cfi_debug')}
4130endif
4131summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004132summary_info += {'sparse': sparse}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004133summary_info += {'mingw32 support': targetos == 'windows'}
Paolo Bonzini12640f02022-06-06 11:48:47 +02004134summary(summary_info, bool_yn: true, section: 'Compilation')
Alex Bennée49e85652021-02-22 10:14:50 +00004135
4136# snarf the cross-compilation information for tests
Paolo Bonzini12640f02022-06-06 11:48:47 +02004137summary_info = {}
4138have_cross = false
Alex Bennée49e85652021-02-22 10:14:50 +00004139foreach target: target_dirs
Paolo Bonzinic7022a72022-09-29 12:42:07 +01004140 tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak'
Alex Bennée49e85652021-02-22 10:14:50 +00004141 if fs.exists(tcg_mak)
4142 config_cross_tcg = keyval.load(tcg_mak)
Alex Bennée85b141e2022-05-27 16:35:34 +01004143 if 'CC' in config_cross_tcg
Paolo Bonzini12640f02022-06-06 11:48:47 +02004144 summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
4145 have_cross = true
Alex Bennée49e85652021-02-22 10:14:50 +00004146 endif
Paolo Bonzini12640f02022-06-06 11:48:47 +02004147 endif
Alex Bennée49e85652021-02-22 10:14:50 +00004148endforeach
Paolo Bonzini12640f02022-06-06 11:48:47 +02004149if have_cross
4150 summary(summary_info, bool_yn: true, section: 'Cross compilers')
4151endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004152
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004153# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004154summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004155if have_system
4156 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
4157 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
4158 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
4159 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
Reinoud Zandijk74a414a2021-04-02 22:25:32 +02004160 summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')}
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02004161 summary_info += {'Xen support': xen.found()}
4162 if xen.found()
4163 summary_info += {'xen ctrl version': xen.version()}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004164 endif
David Woodhouse820c1ab2022-12-06 09:03:48 +00004165 summary_info += {'Xen emulation': config_all.has_key('CONFIG_XEN_EMU')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004166endif
4167summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
4168if config_all.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004169 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +01004170 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004171 else
4172 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
4173 endif
Paolo Bonzini2c13c572023-08-30 12:20:53 +02004174 summary_info += {'TCG plugins': get_option('plugins')}
Paolo Bonzini1d558c92023-08-28 11:48:30 +02004175 summary_info += {'TCG debug enabled': get_option('debug_tcg')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004176endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004177summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004178if have_system
4179 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01004180 summary_info += {'out of process emulation': multiprocess_allowed}
Jagannathan Raman55116962022-06-13 16:26:24 -04004181 summary_info += {'vfio-user server': vfio_user_server_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004182endif
4183summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
4184
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004185# Block layer
4186summary_info = {}
Paolo Bonzini67398252022-10-12 13:19:35 +02004187summary_info += {'coroutine backend': coroutine_backend}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004188summary_info += {'coroutine pool': have_coroutine_pool}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004189if have_block
Paolo Bonzini622d64f2022-04-20 17:33:53 +02004190 summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
4191 summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004192 summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
Christian Schoenebeck38877022023-05-11 16:12:34 +02004193 summary_info += {'VirtFS (9P) support': have_virtfs}
Christian Schoenebeck71d72ec2023-06-26 13:49:06 +02004194 summary_info += {'VirtFS (9P) Proxy Helper support (deprecated)': have_virtfs_proxy_helper}
Paolo Bonzini406523f2021-10-13 11:43:54 +02004195 summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')}
4196 summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004197 summary_info += {'bochs support': get_option('bochs').allowed()}
4198 summary_info += {'cloop support': get_option('cloop').allowed()}
4199 summary_info += {'dmg support': get_option('dmg').allowed()}
4200 summary_info += {'qcow v1 support': get_option('qcow1').allowed()}
4201 summary_info += {'vdi support': get_option('vdi').allowed()}
Vladimir Sementsov-Ogievskiy11cea422023-04-21 12:27:58 +03004202 summary_info += {'vhdx support': get_option('vhdx').allowed()}
4203 summary_info += {'vmdk support': get_option('vmdk').allowed()}
4204 summary_info += {'vpc support': get_option('vpc').allowed()}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004205 summary_info += {'vvfat support': get_option('vvfat').allowed()}
4206 summary_info += {'qed support': get_option('qed').allowed()}
4207 summary_info += {'parallels support': get_option('parallels').allowed()}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004208 summary_info += {'FUSE exports': fuse}
Xie Yongji2a2359b2022-05-23 16:46:09 +08004209 summary_info += {'VDUSE block exports': have_vduse_blk_export}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004210endif
4211summary(summary_info, bool_yn: true, section: 'Block layer support')
4212
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004213# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004214summary_info = {}
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02004215summary_info += {'TLS priority': get_option('tls_priority')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004216summary_info += {'GNUTLS support': gnutls}
4217if gnutls.found()
4218 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
4219endif
4220summary_info += {'libgcrypt': gcrypt}
4221summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02004222if nettle.found()
4223 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004224endif
Paolo Bonzini34b52612021-11-08 14:02:42 +01004225summary_info += {'AF_ALG support': have_afalg}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004226summary_info += {'rng-none': get_option('rng_none')}
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02004227summary_info += {'Linux keyring': have_keyring}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004228summary(summary_info, bool_yn: true, section: 'Crypto')
4229
Thomas Huth9e48afa2023-06-02 19:18:30 +02004230# UI
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004231summary_info = {}
4232if targetos == 'darwin'
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03004233 summary_info += {'Cocoa support': cocoa}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004234endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004235summary_info += {'SDL support': sdl}
4236summary_info += {'SDL image support': sdl_image}
4237summary_info += {'GTK support': gtk}
4238summary_info += {'pixman': pixman}
4239summary_info += {'VTE support': vte}
Kshitij Suri95f85102022-04-08 07:13:34 +00004240summary_info += {'PNG support': png}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004241summary_info += {'VNC support': vnc}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01004242if vnc.found()
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004243 summary_info += {'VNC SASL support': sasl}
4244 summary_info += {'VNC JPEG support': jpeg}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004245endif
Thomas Huth9e48afa2023-06-02 19:18:30 +02004246summary_info += {'spice protocol support': spice_protocol}
4247if spice_protocol.found()
4248 summary_info += {' spice server support': spice}
4249endif
4250summary_info += {'curses support': curses}
4251summary_info += {'brlapi support': brlapi}
4252summary(summary_info, bool_yn: true, section: 'User interface')
4253
Thomas Huthaece7232023-06-02 19:18:32 +02004254# Audio backends
4255summary_info = {}
Paolo Bonzini87430d52021-10-07 15:06:09 +02004256if targetos not in ['darwin', 'haiku', 'windows']
4257 summary_info += {'OSS support': oss}
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02004258 summary_info += {'sndio support': sndio}
Paolo Bonzini87430d52021-10-07 15:06:09 +02004259elif targetos == 'darwin'
4260 summary_info += {'CoreAudio support': coreaudio}
4261elif targetos == 'windows'
4262 summary_info += {'DirectSound support': dsound}
4263endif
4264if targetos == 'linux'
4265 summary_info += {'ALSA support': alsa}
4266 summary_info += {'PulseAudio support': pulse}
4267endif
Marc-André Lureau20c51242023-05-06 20:37:26 +04004268summary_info += {'PipeWire support': pipewire}
Paolo Bonzini87430d52021-10-07 15:06:09 +02004269summary_info += {'JACK support': jack}
Thomas Huthaece7232023-06-02 19:18:32 +02004270summary(summary_info, bool_yn: true, section: 'Audio backends')
4271
Thomas Huthc3527c52023-06-02 19:18:31 +02004272# Network backends
Thomas Huth9e48afa2023-06-02 19:18:30 +02004273summary_info = {}
4274if targetos == 'darwin'
4275 summary_info += {'vmnet.framework support': vmnet}
4276endif
4277summary_info += {'slirp support': slirp}
Paolo Bonzinie1723992021-10-07 15:08:21 +02004278summary_info += {'vde support': vde}
Paolo Bonzini837b84b2021-10-07 15:08:22 +02004279summary_info += {'netmap support': have_netmap}
Thomas Hutheea94532021-10-28 20:59:08 +02004280summary_info += {'l2tpv3 support': have_l2tpv3}
Thomas Huthc3527c52023-06-02 19:18:31 +02004281summary(summary_info, bool_yn: true, section: 'Network backends')
4282
4283# Libraries
4284summary_info = {}
Thomas Huth9e48afa2023-06-02 19:18:30 +02004285summary_info += {'libtasn1': tasn1}
4286summary_info += {'PAM': pam}
4287summary_info += {'iconv support': iconv}
4288summary_info += {'virgl support': virgl}
4289summary_info += {'blkio support': blkio}
4290summary_info += {'curl support': curl}
4291summary_info += {'Multipath support': mpathpersist}
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02004292summary_info += {'Linux AIO support': libaio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004293summary_info += {'Linux io_uring support': linux_io_uring}
4294summary_info += {'ATTR/XATTR support': libattr}
Paolo Bonzini3730a732022-04-20 17:33:41 +02004295summary_info += {'RDMA support': rdma}
4296summary_info += {'PVRDMA support': have_pvrdma}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02004297summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004298summary_info += {'libcap-ng support': libcap_ng}
4299summary_info += {'bpf support': libbpf}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004300summary_info += {'rbd support': rbd}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004301summary_info += {'smartcard support': cacard}
4302summary_info += {'U2F support': u2f}
4303summary_info += {'libusb': libusb}
4304summary_info += {'usb net redir': usbredir}
Paolo Bonzini88b6e612022-04-20 17:33:40 +02004305summary_info += {'OpenGL support (epoxy)': opengl}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004306summary_info += {'GBM': gbm}
4307summary_info += {'libiscsi support': libiscsi}
4308summary_info += {'libnfs support': libnfs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004309if targetos == 'windows'
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004310 if have_ga
Marc-André Lureau8821a382022-02-01 16:53:43 +04004311 summary_info += {'QGA VSS support': have_qga_vss}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01004312 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01004313endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004314summary_info += {'seccomp support': seccomp}
4315summary_info += {'GlusterFS support': glusterfs}
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01004316summary_info += {'TPM support': have_tpm}
Thomas Huthe6a52b32021-12-09 15:48:01 +01004317summary_info += {'libssh support': libssh}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004318summary_info += {'lzo support': lzo}
4319summary_info += {'snappy support': snappy}
4320summary_info += {'bzip2 support': libbzip2}
4321summary_info += {'lzfse support': liblzfse}
4322summary_info += {'zstd support': zstd}
Paolo Bonzini488a8c72021-12-21 12:38:27 +01004323summary_info += {'NUMA host support': numa}
Thomas Huth83602082022-05-16 16:58:23 +02004324summary_info += {'capstone': capstone}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004325summary_info += {'libpmem support': libpmem}
4326summary_info += {'libdaxctl support': libdaxctl}
4327summary_info += {'libudev': libudev}
4328# Dummy dependency, keep .found()
Max Reitzdf4ea702020-10-27 20:05:46 +01004329summary_info += {'FUSE lseek': fuse_lseek.found()}
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06004330summary_info += {'selinux': selinux}
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01004331summary_info += {'libdw': libdw}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01004332summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004333
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004334if host_arch == 'unknown'
Paolo Bonzinif9332752020-02-03 13:28:38 +01004335 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004336 warning('UNSUPPORTED HOST CPU')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004337 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004338 message('Support for CPU host architecture ' + cpu + ' is not currently')
4339 message('maintained. The QEMU project does not guarantee that QEMU will')
4340 message('compile or work on this host CPU. You can help by volunteering')
4341 message('to maintain it and providing a build host for our continuous')
4342 message('integration setup.')
4343 if get_option('tcg').allowed() and target_dirs.length() > 0
4344 message()
4345 message('configure has succeeded and you can continue to build, but')
4346 message('QEMU will use a slow interpreter to emulate the target CPU.')
4347 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01004348endif
4349
4350if not supported_oses.contains(targetos)
4351 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004352 warning('UNSUPPORTED HOST OS')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004353 message()
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004354 message('Support for host OS ' + targetos + 'is not currently maintained.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004355 message('configure has succeeded and you can continue to build, but')
Paolo Bonzinia24f15d2023-08-04 11:29:05 +02004356 message('the QEMU project does not guarantee that QEMU will compile or')
4357 message('work on this operating system. You can help by volunteering')
4358 message('to maintain it and providing a build host for our continuous')
4359 message('integration setup. This will ensure that future versions of QEMU')
4360 message('will keep working on ' + targetos + '.')
4361endif
4362
4363if host_arch == 'unknown' or not supported_oses.contains(targetos)
4364 message()
4365 message('If you want to help supporting QEMU on this platform, please')
4366 message('contact the developers at qemu-devel@nongnu.org.')
Paolo Bonzinif9332752020-02-03 13:28:38 +01004367endif