blob: c516b911d9a8840f96003bdfed54f1354bc704f8 [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']
23if add_languages('cpp', required: false, native: false)
24 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']
Richard Hendersonba0e7332021-09-17 11:08:09 -070058supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv', '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
63# Unify riscv* to a single family.
64if cpu in ['riscv32', 'riscv64']
65 cpu = 'riscv'
66endif
67
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020068target_dirs = config_host['TARGET_DIRS'].split()
69have_linux_user = false
70have_bsd_user = false
71have_system = false
72foreach target : target_dirs
73 have_linux_user = have_linux_user or target.endswith('linux-user')
74 have_bsd_user = have_bsd_user or target.endswith('bsd-user')
75 have_system = have_system or target.endswith('-softmmu')
76endforeach
77have_user = have_linux_user or have_bsd_user
78have_tools = get_option('tools') \
79 .disable_auto_if(not have_system) \
80 .allowed()
81have_ga = get_option('guest_agent') \
82 .disable_auto_if(not have_system and not have_tools) \
Brad Smith28236ad2022-11-12 06:40:43 -050083 .require(targetos in ['sunos', 'linux', 'windows', 'freebsd', 'netbsd', 'openbsd'],
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020084 error_message: 'unsupported OS for QEMU guest agent') \
85 .allowed()
Paolo Bonzini60027112022-10-20 14:53:10 +020086enable_modules = get_option('modules') \
87 .require(targetos != 'windows',
88 error_message: 'Modules are not available for Windows') \
89 .require(not get_option('prefer_static'),
90 error_message: 'Modules are incompatible with static linking') \
91 .allowed()
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020092have_block = have_system or have_tools
93
94python = import('python').find_installation()
95
Paolo Bonzini823eb012021-11-08 14:18:17 +010096if cpu not in supported_cpus
97 host_arch = 'unknown'
98elif cpu == 'x86'
99 host_arch = 'i386'
Richard Henderson0e3ed772021-12-31 05:25:11 +0000100elif cpu == 'mips64'
101 host_arch = 'mips'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100102else
103 host_arch = cpu
104endif
105
Paolo Bonzini8a199802020-09-18 05:37:01 -0400106if cpu in ['x86', 'x86_64']
107 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
108elif cpu == 'aarch64'
109 kvm_targets = ['aarch64-softmmu']
110elif cpu == 's390x'
111 kvm_targets = ['s390x-softmmu']
112elif cpu in ['ppc', 'ppc64']
113 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Huacai Chenfbc58842020-10-07 16:39:28 +0800114elif cpu in ['mips', 'mips64']
115 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Yifei Jiangfbf43c72022-01-12 16:13:29 +0800116elif cpu in ['riscv']
117 kvm_targets = ['riscv32-softmmu', 'riscv64-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400118else
119 kvm_targets = []
120endif
121
Igor Mammedov44d3d892021-10-27 11:10:12 -0400122kvm_targets_c = '""'
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100123if get_option('kvm').allowed() and targetos == 'linux'
Igor Mammedove741aff2021-09-02 07:35:38 -0400124 kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
125endif
126config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
127
Paolo Bonzini8a199802020-09-18 05:37:01 -0400128accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alexander Graf844a06b2021-09-16 17:54:02 +0200129
130if cpu in ['aarch64']
131 accelerator_targets += {
132 'CONFIG_HVF': ['aarch64-softmmu']
133 }
134endif
135
Alex Bennée0c3e41d2020-11-10 19:23:09 +0000136if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
Marc-André Lureau2a2d51b2021-09-14 16:30:45 +0400137 # i386 emulator provides xenpv machine type for multiple architectures
Alex Bennée0c3e41d2020-11-10 19:23:09 +0000138 accelerator_targets += {
139 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
140 }
141endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400142if cpu in ['x86', 'x86_64']
143 accelerator_targets += {
144 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400145 'CONFIG_HVF': ['x86_64-softmmu'],
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200146 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400147 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
148 }
149endif
150
Paolo Bonzinia1b176f2021-07-12 14:22:08 +0200151modular_tcg = []
152# Darwin does not support references to thread-local variables in modules
153if targetos != 'darwin'
154 modular_tcg = ['i386-softmmu', 'x86_64-softmmu']
155endif
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +0200156
Philippe Mathieu-Daudéeae9a1d2021-01-14 18:45:08 +0100157edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
Paolo Bonzinie49c0ef2021-09-23 06:55:28 -0400158unpack_edk2_blobs = false
159foreach target : edk2_targets
160 if target in target_dirs
161 bzip2 = find_program('bzip2', required: get_option('install_blobs'))
162 unpack_edk2_blobs = bzip2.found()
163 break
164 endif
165endforeach
Philippe Mathieu-Daudé45b545d2021-01-14 18:45:09 +0100166
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200167dtrace = not_found
168stap = not_found
169if 'dtrace' in get_option('trace_backends')
170 dtrace = find_program('dtrace', required: true)
171 stap = find_program('stap', required: false)
172 if stap.found()
173 # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
174 # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
175 # instead. QEMU --enable-modules depends on this because the SystemTap
176 # semaphores are linked into the main binary and not the module's shared
177 # object.
178 add_global_arguments('-DSTAP_SDT_V2',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200179 native: false, language: all_languages)
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200180 endif
181endif
182
Paolo Bonzini40c909f2022-04-20 17:33:49 +0200183if get_option('iasl') == ''
184 iasl = find_program('iasl', required: false)
185else
186 iasl = find_program(get_option('iasl'), required: true)
187endif
188
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400189##################
190# Compiler flags #
191##################
192
Paolo Bonzini13f60de2022-10-20 14:34:27 +0200193foreach lang : all_languages
194 compiler = meson.get_compiler(lang)
195 if compiler.get_id() == 'gcc' and compiler.version().version_compare('>=7.4')
196 # ok
197 elif compiler.get_id() == 'clang' and compiler.compiles('''
198 #ifdef __apple_build_version__
199 # if __clang_major__ < 12 || (__clang_major__ == 12 && __clang_minor__ < 0)
200 # error You need at least XCode Clang v12.0 to compile QEMU
201 # endif
202 #else
203 # if __clang_major__ < 10 || (__clang_major__ == 10 && __clang_minor__ < 0)
204 # error You need at least Clang v10.0 to compile QEMU
205 # endif
206 #endif''')
207 # ok
208 else
209 error('You either need GCC v7.4 or Clang v10.0 (or XCode Clang v12.0) to compile QEMU')
210 endif
211endforeach
212
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200213# default flags for all hosts
214# We use -fwrapv to tell the compiler that we require a C dialect where
215# left shift of signed integers is well defined and has the expected
216# 2s-complement style results. (Both clang and gcc agree that it
217# provides these semantics.)
218
219qemu_common_flags = [
220 '-D_GNU_SOURCE', '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE_SOURCE',
221 '-fno-strict-aliasing', '-fno-common', '-fwrapv' ]
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200222qemu_cflags = []
Paolo Bonzini911d4ca2022-10-12 12:46:23 +0200223qemu_ldflags = []
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100224
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200225if targetos == 'darwin'
226 # Disable attempts to use ObjectiveC features in os/object.h since they
227 # won't work when we're compiling with gcc as a C compiler.
228 qemu_common_flags += '-DOS_OBJECT_USE_OBJC=0'
229elif targetos == 'solaris'
230 # needed for CMSG_ macros in sys/socket.h
231 qemu_common_flags += '-D_XOPEN_SOURCE=600'
232 # needed for TIOCWIN* defines in termios.h
233 qemu_common_flags += '-D__EXTENSIONS__'
234elif targetos == 'haiku'
235 qemu_common_flags += ['-DB_USE_POSITIVE_POSIX_ERRORS', '-D_BSD_SOURCE', '-fPIC']
236endif
237
238# __sync_fetch_and_and requires at least -march=i486. Many toolchains
239# use i686 as default anyway, but for those that don't, an explicit
240# specification is necessary
241if host_arch == 'i386' and not cc.links('''
242 static int sfaa(int *ptr)
243 {
244 return __sync_fetch_and_and(ptr, 0);
245 }
246
247 int main(void)
248 {
249 int val = 42;
250 val = __sync_val_compare_and_swap(&val, 0, 1);
251 sfaa(&val);
252 return val;
253 }''')
254 qemu_common_flags = ['-march=i486'] + qemu_common_flags
255endif
256
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200257if get_option('gprof')
258 qemu_common_flags += ['-p']
259 qemu_ldflags += ['-p']
260endif
261
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +0200262if get_option('prefer_static')
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100263 qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
264endif
265
Paolo Bonzinia988b4c2022-10-20 14:20:30 +0200266# Meson currently only handles pie as a boolean for now, so if the user
267# has explicitly disabled PIE we need to extend our cflags.
268if not get_option('b_pie')
269 qemu_common_flags += cc.get_supported_arguments('-fno-pie')
270 if not get_option('prefer_static')
271 # No PIE is implied by -static which we added above.
272 qemu_ldflags += cc.get_supported_link_arguments('-no-pie')
273 endif
274endif
275
Paolo Bonzini911d4ca2022-10-12 12:46:23 +0200276if not get_option('stack_protector').disabled()
277 stack_protector_probe = '''
278 int main(int argc, char *argv[])
279 {
280 char arr[64], *p = arr, *c = argv[argc - 1];
281 while (*c) {
282 *p++ = *c++;
283 }
284 return 0;
285 }'''
286 have_stack_protector = false
287 foreach arg : ['-fstack-protector-strong', '-fstack-protector-all']
288 # We need to check both a compile and a link, since some compiler
289 # setups fail only on a .c->.o compile and some only at link time
290 if cc.compiles(stack_protector_probe, args: ['-Werror', arg]) and \
291 cc.links(stack_protector_probe, args: ['-Werror', arg])
292 have_stack_protector = true
293 qemu_cflags += arg
294 qemu_ldflags += arg
295 break
296 endif
297 endforeach
298 get_option('stack_protector') \
299 .require(have_stack_protector, error_message: 'Stack protector not supported')
300endif
301
Paolo Bonzini67398252022-10-12 13:19:35 +0200302coroutine_backend = get_option('coroutine_backend')
303ucontext_probe = '''
304 #include <ucontext.h>
305 #ifdef __stub_makecontext
306 #error Ignoring glibc stub makecontext which will always fail
307 #endif
308 int main(void) { makecontext(0, 0, 0); return 0; }'''
309
310# On Windows the only valid backend is the Windows specific one.
311# For POSIX prefer ucontext, but it's not always possible. The fallback
312# is sigcontext.
313supported_backends = []
314if targetos == 'windows'
315 supported_backends += ['windows']
316else
317 if targetos != 'darwin' and cc.links(ucontext_probe)
318 supported_backends += ['ucontext']
319 endif
320 supported_backends += ['sigaltstack']
321endif
322
323if coroutine_backend == 'auto'
324 coroutine_backend = supported_backends[0]
325elif coroutine_backend not in supported_backends
326 error('"@0@" backend requested but not available. Available backends: @1@' \
327 .format(coroutine_backend, ', '.join(supported_backends)))
328endif
329
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200330# Compiles if SafeStack *not* enabled
331safe_stack_probe = '''
332 int main(void)
333 {
334 #if defined(__has_feature)
335 #if __has_feature(safe_stack)
336 #error SafeStack Enabled
337 #endif
338 #endif
339 return 0;
340 }'''
341if get_option('safe_stack') != not cc.compiles(safe_stack_probe)
342 safe_stack_arg = get_option('safe_stack') ? '-fsanitize=safe-stack' : '-fno-sanitize=safe-stack'
343 if get_option('safe_stack') != not cc.compiles(safe_stack_probe, args: safe_stack_arg)
344 error(get_option('safe_stack') \
345 ? 'SafeStack not supported by your compiler' \
346 : 'Cannot disable SafeStack')
347 endif
348 qemu_cflags += safe_stack_arg
349 qemu_ldflags += safe_stack_arg
350endif
Paolo Bonzini67398252022-10-12 13:19:35 +0200351if get_option('safe_stack') and coroutine_backend != 'ucontext'
Paolo Bonzini721fa5e2022-10-12 11:59:51 +0200352 error('SafeStack is only supported with the ucontext coroutine backend')
353endif
354
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100355if get_option('sanitizers')
356 if cc.has_argument('-fsanitize=address')
357 qemu_cflags = ['-fsanitize=address'] + qemu_cflags
358 qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags
359 endif
360
361 # Detect static linking issue with ubsan - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285
362 if cc.links('int main(int argc, char **argv) { return argc + 1; }',
363 args: [qemu_ldflags, '-fsanitize=undefined'])
364 qemu_cflags = ['-fsanitize=undefined'] + qemu_cflags
365 qemu_ldflags = ['-fsanitize=undefined'] + qemu_ldflags
366 endif
367endif
368
369# Thread sanitizer is, for now, much noisier than the other sanitizers;
370# keep it separate until that is not the case.
371if get_option('tsan')
372 if get_option('sanitizers')
373 error('TSAN is not supported with other sanitizers')
374 endif
375 if not cc.has_function('__tsan_create_fiber',
376 args: '-fsanitize=thread',
377 prefix: '#include <sanitizer/tsan_interface.h>')
378 error('Cannot enable TSAN due to missing fiber annotation interface')
379 endif
380 qemu_cflags = ['-fsanitize=thread'] + qemu_cflags
381 qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags
382endif
383
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100384# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
385# The combination is known as "full relro", because .got.plt is read-only too.
386qemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
387
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200388if targetos == 'windows'
389 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat')
Paolo Bonzini2d73fa72022-11-02 13:03:51 +0100390 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va')
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200391endif
392
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200393# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100394if targetos != 'sunos' and not get_option('tsan')
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200395 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--warn-common')
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +0200396endif
397
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400398# Specify linker-script with add_project_link_arguments so that it is not placed
399# within a linker --start-group/--end-group pair
Paolo Bonzini537b7242021-10-07 15:08:12 +0200400if get_option('fuzzing')
Paolo Bonzini537b7242021-10-07 15:08:12 +0200401 # Specify a filter to only instrument code that is directly related to
402 # virtual-devices.
403 configure_file(output: 'instrumentation-filter',
404 input: 'scripts/oss-fuzz/instrumentation-filter-template',
405 copy: true)
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400406
407 if cc.compiles('int main () { return 0; }',
408 name: '-fsanitize-coverage-allowlist=/dev/null',
Alexander Bulekove56d0972022-06-21 16:45:07 -0400409 args: ['-fsanitize-coverage-allowlist=/dev/null',
410 '-fsanitize-coverage=trace-pc'] )
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200411 qemu_common_flags += ['-fsanitize-coverage-allowlist=instrumentation-filter']
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400412 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +0200413
414 if get_option('fuzzing_engine') == ''
415 # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
416 # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link
417 # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
418 # unable to bind the fuzzer-related callbacks added by instrumentation.
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200419 qemu_common_flags += ['-fsanitize=fuzzer-no-link']
420 qemu_ldflags += ['-fsanitize=fuzzer-no-link']
Paolo Bonzini537b7242021-10-07 15:08:12 +0200421 # For the actual fuzzer binaries, we need to link against the libfuzzer
422 # library. They need to be configurable, to support OSS-Fuzz
423 fuzz_exe_ldflags = ['-fsanitize=fuzzer']
424 else
425 # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
426 # the needed CFLAGS have already been provided
427 fuzz_exe_ldflags = get_option('fuzzing_engine').split()
428 endif
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400429endif
430
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200431add_global_arguments(qemu_common_flags, native: false, language: all_languages)
432add_global_link_arguments(qemu_ldflags, native: false, language: all_languages)
433
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100434# Collect warnings that we want to enable
435
436warn_flags = [
437 '-Wundef',
438 '-Wwrite-strings',
439 '-Wmissing-prototypes',
440 '-Wstrict-prototypes',
441 '-Wredundant-decls',
442 '-Wold-style-declaration',
443 '-Wold-style-definition',
444 '-Wtype-limits',
445 '-Wformat-security',
446 '-Wformat-y2k',
447 '-Winit-self',
448 '-Wignored-qualifiers',
449 '-Wempty-body',
450 '-Wnested-externs',
451 '-Wendif-labels',
452 '-Wexpansion-to-defined',
453 '-Wimplicit-fallthrough=2',
454 '-Wmissing-format-attribute',
455 '-Wno-initializer-overrides',
456 '-Wno-missing-include-dirs',
457 '-Wno-shift-negative-value',
458 '-Wno-string-plus-int',
459 '-Wno-typedef-redefinition',
460 '-Wno-tautological-type-limit-compare',
461 '-Wno-psabi',
462 '-Wno-gnu-variable-sized-type-not-at-end',
463]
464
465if targetos != 'darwin'
466 warn_flags += ['-Wthread-safety']
467endif
468
Paolo Bonzinib4854582021-11-08 12:31:52 +0100469# Check that the C++ compiler exists and works with the C compiler.
470link_language = 'c'
471linker = cc
472qemu_cxxflags = []
Paolo Bonzinie5134022022-10-12 14:15:06 +0200473if 'cpp' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100474 qemu_cxxflags = ['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'] + qemu_cflags
Paolo Bonzinib4854582021-11-08 12:31:52 +0100475 if cxx.links(files('scripts/main.c'), args: qemu_cflags)
476 link_language = 'cpp'
477 linker = cxx
478 else
479 message('C++ compiler does not work with C compiler')
480 message('Disabling C++-specific optional code')
481 endif
482endif
483
Paolo Bonzini34f983d2023-01-09 15:31:51 +0100484# clang does not support glibc + FORTIFY_SOURCE (is it still true?)
485if get_option('optimization') != '0' and targetos == 'linux'
486 if cc.get_id() == 'gcc'
487 qemu_cflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2']
488 endif
489 if 'cpp' in all_languages and cxx.get_id() == 'gcc'
490 qemu_cxxflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2']
491 endif
492endif
493
Paolo Bonzinid67212d2022-10-12 17:13:23 +0200494add_project_arguments(qemu_cflags, native: false, language: 'c')
Paolo Bonzini95caf1f2022-12-22 09:28:56 +0100495add_project_arguments(cc.get_supported_arguments(warn_flags), native: false, language: 'c')
496if 'cpp' in all_languages
497 add_project_arguments(qemu_cxxflags, native: false, language: 'cpp')
498 add_project_arguments(cxx.get_supported_arguments(warn_flags), native: false, language: 'cpp')
499endif
500if 'objc' in all_languages
501 # Note sanitizer flags are not applied to Objective-C sources!
502 add_project_arguments(objc.get_supported_arguments(warn_flags), native: false, language: 'objc')
503endif
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400504if targetos == 'linux'
505 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
506 '-isystem', 'linux-headers',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200507 language: all_languages)
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400508endif
509
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100510add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400511 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400512 '-iquote', meson.current_source_dir() / 'include',
Paolo Bonzinie5134022022-10-12 14:15:06 +0200513 language: all_languages)
Paolo Bonzinia5665052019-06-10 12:05:14 +0200514
Richard Henderson44fc7162023-05-17 17:48:34 -0700515# If a host-specific include directory exists, list that first...
516host_include = meson.current_source_dir() / 'host/include/'
517if fs.is_dir(host_include / host_arch)
518 add_project_arguments('-iquote', host_include / host_arch,
519 language: all_languages)
520endif
521# ... followed by the generic fallback.
522add_project_arguments('-iquote', host_include / 'generic',
523 language: all_languages)
524
Paolo Bonzinideb62372020-09-01 07:51:16 -0400525sparse = find_program('cgcc', required: get_option('sparse'))
526if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100527 run_target('sparse',
528 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400529 'compile_commands.json', sparse.full_path(), '-Wbitwise',
530 '-Wno-transparent-union', '-Wno-old-initializer',
531 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100532endif
533
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200534###########################################
535# Target-specific checks and dependencies #
536###########################################
537
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100538# Fuzzing
Paolo Bonzini537b7242021-10-07 15:08:12 +0200539if get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
540 not cc.links('''
541 #include <stdint.h>
542 #include <sys/types.h>
543 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
544 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
545 ''',
546 args: ['-Werror', '-fsanitize=fuzzer'])
547 error('Your compiler does not support -fsanitize=fuzzer')
548endif
549
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100550# Tracing backends
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200551if 'ftrace' in get_option('trace_backends') and targetos != 'linux'
552 error('ftrace is supported only on Linux')
553endif
554if 'syslog' in get_option('trace_backends') and not cc.compiles('''
555 #include <syslog.h>
556 int main(void) {
557 openlog("qemu", LOG_PID, LOG_DAEMON);
558 syslog(LOG_INFO, "configure");
559 return 0;
560 }''')
561 error('syslog is not supported on this system')
562endif
563
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100564# Miscellaneous Linux-only features
Paolo Bonzinia436d6d2021-12-18 16:39:43 +0100565get_option('mpath') \
566 .require(targetos == 'linux', error_message: 'Multipath is supported only on Linux')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200567
Paolo Bonzinia436d6d2021-12-18 16:39:43 +0100568multiprocess_allowed = get_option('multiprocess') \
569 .require(targetos == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \
570 .allowed()
Paolo Bonzini106ad1f2021-02-17 16:24:25 +0100571
Jagannathan Raman55116962022-06-13 16:26:24 -0400572vfio_user_server_allowed = get_option('vfio_user_server') \
573 .require(targetos == 'linux', error_message: 'vfio-user server is supported only on Linux') \
574 .allowed()
575
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +0100576have_tpm = get_option('tpm') \
577 .require(targetos != 'windows', error_message: 'TPM emulation only available on POSIX systems') \
578 .allowed()
579
Paolo Bonzini2a3129a2022-04-20 17:34:05 +0200580# vhost
Paolo Bonzini2df89d52022-04-20 17:34:07 +0200581have_vhost_user = get_option('vhost_user') \
582 .disable_auto_if(targetos != 'linux') \
583 .require(targetos != 'windows',
584 error_message: 'vhost-user is not available on Windows').allowed()
585have_vhost_vdpa = get_option('vhost_vdpa') \
586 .require(targetos == 'linux',
587 error_message: 'vhost-vdpa is only available on Linux').allowed()
588have_vhost_kernel = get_option('vhost_kernel') \
589 .require(targetos == 'linux',
590 error_message: 'vhost-kernel is only available on Linux').allowed()
591have_vhost_user_crypto = get_option('vhost_crypto') \
592 .require(have_vhost_user,
593 error_message: 'vhost-crypto requires vhost-user to be enabled').allowed()
594
Paolo Bonzini43b6d7e2022-04-20 17:34:06 +0200595have_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel
Paolo Bonzini2df89d52022-04-20 17:34:07 +0200596
597have_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed()
598have_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed()
599have_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed()
600have_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa
Paolo Bonzini2a3129a2022-04-20 17:34:05 +0200601
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100602# Target-specific libraries and flags
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200603libm = cc.find_library('m', required: false)
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +0200604threads = dependency('threads')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400605util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200606winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400607socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400608version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400609coref = []
610iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400611emulator_link_args = []
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200612nvmm =not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400613hvf = not_found
Marc-André Lureau23011f42022-02-01 12:55:21 +0400614midl = not_found
615widl = not_found
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900616pathcch = not_found
Paolo Bonzinia6305082021-10-07 15:08:15 +0200617host_dsosuf = '.so'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400618if targetos == 'windows'
Marc-André Lureau23011f42022-02-01 12:55:21 +0400619 midl = find_program('midl', required: false)
620 widl = find_program('widl', required: false)
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900621 pathcch = cc.find_library('pathcch')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400622 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200623 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400624
625 win = import('windows')
626 version_res = win.compile_resources('version.rc',
627 depend_files: files('pc-bios/qemu-nsis.ico'),
628 include_directories: include_directories('.'))
Paolo Bonzinia6305082021-10-07 15:08:15 +0200629 host_dsosuf = '.dll'
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400630elif targetos == 'darwin'
631 coref = dependency('appleframeworks', modules: 'CoreFoundation')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700632 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
Paolo Bonzinia6305082021-10-07 15:08:15 +0200633 host_dsosuf = '.dylib'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200634elif targetos == 'sunos'
635 socket = [cc.find_library('socket'),
636 cc.find_library('nsl'),
637 cc.find_library('resolv')]
638elif targetos == 'haiku'
639 socket = [cc.find_library('posix_error_mapper'),
640 cc.find_library('network'),
641 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400642elif targetos == 'openbsd'
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100643 if get_option('tcg').allowed() and target_dirs.length() > 0
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400644 # Disable OpenBSD W^X if available
645 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
646 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400647endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200648
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100649# Target-specific configuration of accelerators
Paolo Bonzini8a199802020-09-18 05:37:01 -0400650accelerators = []
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100651if get_option('kvm').allowed() and targetos == 'linux'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400652 accelerators += 'CONFIG_KVM'
653endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100654if get_option('whpx').allowed() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000655 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400656 error('WHPX requires 64-bit host')
657 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
658 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
659 accelerators += 'CONFIG_WHPX'
660 endif
661endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100662if get_option('hvf').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400663 hvf = dependency('appleframeworks', modules: 'Hypervisor',
664 required: get_option('hvf'))
665 if hvf.found()
666 accelerators += 'CONFIG_HVF'
667 endif
668endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100669if get_option('hax').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400670 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
671 accelerators += 'CONFIG_HAX'
672 endif
673endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200674if targetos == 'netbsd'
nia0cc49652021-10-13 13:54:17 +0000675 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200676 if nvmm.found()
677 accelerators += 'CONFIG_NVMM'
678 endif
679endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100680
Paolo Bonzini823eb012021-11-08 14:18:17 +0100681tcg_arch = host_arch
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100682if get_option('tcg').allowed()
Paolo Bonzini823eb012021-11-08 14:18:17 +0100683 if host_arch == 'unknown'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100684 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +0100685 warning('Unsupported CPU @0@, will use TCG with TCI (slow)'.format(cpu))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400686 else
687 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
688 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100689 elif get_option('tcg_interpreter')
Philippe Mathieu-Daudé1c282da2021-05-21 12:34:23 +0200690 warning('Use of the TCG interpreter is not recommended on this host')
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100691 warning('architecture. There is a native TCG execution backend available')
692 warning('which provides substantially better performance and reliability.')
693 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
694 warning('configuration option on this architecture to use the native')
695 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400696 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100697 if get_option('tcg_interpreter')
698 tcg_arch = 'tci'
Richard Hendersoned145142022-10-17 16:11:53 +1000699 config_host += { 'CONFIG_TCG_INTERPRETER': 'y' }
Paolo Bonzini823eb012021-11-08 14:18:17 +0100700 elif host_arch == 'x86_64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100701 tcg_arch = 'i386'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100702 elif host_arch == 'ppc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100703 tcg_arch = 'ppc'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100704 endif
705 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzinie5134022022-10-12 14:15:06 +0200706 language: all_languages)
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100707
Paolo Bonzini8a199802020-09-18 05:37:01 -0400708 accelerators += 'CONFIG_TCG'
709 config_host += { 'CONFIG_TCG': 'y' }
710endif
711
712if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
713 error('KVM not available on this platform')
714endif
715if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
716 error('HVF not available on this platform')
717endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200718if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
719 error('NVMM not available on this platform')
720endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400721if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
722 error('WHPX not available on this platform')
723endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400724
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200725################
726# Dependencies #
727################
728
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200729# When bumping glib minimum version, please check also whether to increase
730# the _WIN32_WINNT setting in osdep.h according to the value from glib
731glib_req_ver = '>=2.56.0'
732glib_pc = dependency('glib-2.0', version: glib_req_ver, required: true,
733 method: 'pkg-config')
734glib_cflags = []
Paolo Bonzini60027112022-10-20 14:53:10 +0200735if enable_modules
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200736 gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true,
737 method: 'pkg-config')
738elif config_host.has_key('CONFIG_PLUGIN')
739 gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true,
740 method: 'pkg-config')
741else
742 gmodule = not_found
Emilio Cotae3feb2c2023-02-05 11:37:57 -0500743endif
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400744
Paolo Bonzinifc9a8092022-10-12 11:31:32 +0200745# This workaround is required due to a bug in pkg-config file for glib as it
746# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static
747if targetos == 'windows' and get_option('prefer_static')
748 glib_cflags += ['-DGLIB_STATIC_COMPILATION']
749endif
750
751# Sanity check that the current size_t matches the
752# size that glib thinks it should be. This catches
753# problems on multi-arch where people try to build
754# 32-bit QEMU while pointing at 64-bit glib headers
755
756if not cc.compiles('''
757 #include <glib.h>
758 #include <unistd.h>
759
760 #define QEMU_BUILD_BUG_ON(x) \
761 typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused));
762
763 int main(void) {
764 QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T);
765 return 0;
766 }''', dependencies: glib_pc, args: glib_cflags)
767 error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T.
768 You probably need to set PKG_CONFIG_LIBDIR" to point
769 to the right pkg-config files for your build target.''')
770endif
771
772# Silence clang warnings triggered by glib < 2.57.2
773if not cc.compiles('''
774 #include <glib.h>
775 typedef struct Foo {
776 int i;
777 } Foo;
778 static void foo_free(Foo *f)
779 {
780 g_free(f);
781 }
782 G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free)
783 int main(void) { return 0; }''', dependencies: glib_pc, args: ['-Werror'])
784 glib_cflags += cc.get_supported_arguments('-Wno-unused-function')
785endif
786glib = declare_dependency(dependencies: [glib_pc, gmodule],
787 compile_args: glib_cflags,
788 version: glib_pc.version())
789
790# Check whether glib has gslice, which we have to avoid for correctness.
791# TODO: remove this check and the corresponding workaround (qtree) when
792# the minimum supported glib is >= 2.75.3
793glib_has_gslice = glib.version().version_compare('<2.75.3')
794
795# override glib dep to include the above refinements
796meson.override_dependency('glib-2.0', glib)
797
798# The path to glib.h is added to all compilation commands.
799add_project_dependencies(glib.partial_dependency(compile_args: true, includes: true),
800 native: false, language: all_languages)
801
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400802gio = not_found
Paolo Bonzini75440602022-04-20 17:33:44 +0200803gdbus_codegen = not_found
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +0200804gdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
Paolo Bonzini75440602022-04-20 17:33:44 +0200805if not get_option('gio').auto() or have_system
806 gio = dependency('gio-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200807 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +0200808 if gio.found() and not cc.links('''
809 #include <gio/gio.h>
810 int main(void)
811 {
812 g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
813 return 0;
814 }''', dependencies: [glib, gio])
815 if get_option('gio').enabled()
816 error('The installed libgio is broken for static linking')
817 endif
818 gio = not_found
819 endif
820 if gio.found()
821 gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'),
822 required: get_option('gio'))
823 gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200824 method: 'pkg-config')
Paolo Bonzini75440602022-04-20 17:33:44 +0200825 gio = declare_dependency(dependencies: [gio, gio_unix],
826 version: gio.version())
827 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400828endif
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +0200829if gdbus_codegen.found() and get_option('cfi')
830 gdbus_codegen = not_found
831 gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity'
832endif
Paolo Bonzini75440602022-04-20 17:33:44 +0200833
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400834lttng = not_found
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200835if 'ust' in get_option('trace_backends')
Marc-André Lureaue32aaa52022-03-28 12:47:13 +0400836 lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
Paolo Bonzini063d5112022-07-14 14:56:58 +0200837 method: 'pkg-config')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400838endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200839pixman = not_found
840if have_system or have_tools
841 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzini063d5112022-07-14 14:56:58 +0200842 method: 'pkg-config')
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200843endif
Paolo Bonzini063d5112022-07-14 14:56:58 +0200844zlib = dependency('zlib', required: true)
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200845
Paolo Bonziniff66f3e2021-10-07 15:08:20 +0200846libaio = not_found
847if not get_option('linux_aio').auto() or have_block
848 libaio = cc.find_library('aio', has_headers: ['libaio.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +0200849 required: get_option('linux_aio'))
Paolo Bonziniff66f3e2021-10-07 15:08:20 +0200850endif
Leonardo Bras354081d2022-05-13 03:28:30 -0300851
852linux_io_uring_test = '''
853 #include <liburing.h>
854 #include <linux/errqueue.h>
855
856 int main(void) { return 0; }'''
857
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400858linux_io_uring = not_found
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200859if not get_option('linux_io_uring').auto() or have_block
Daniel P. Berrangéa41b4fd2022-01-05 13:49:38 +0000860 linux_io_uring = dependency('liburing', version: '>=0.3',
861 required: get_option('linux_io_uring'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200862 method: 'pkg-config')
Leonardo Bras354081d2022-05-13 03:28:30 -0300863 if not cc.links(linux_io_uring_test)
864 linux_io_uring = not_found
865 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400866endif
Leonardo Bras354081d2022-05-13 03:28:30 -0300867
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400868libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +0100869if not get_option('libnfs').auto() or have_block
870 libnfs = dependency('libnfs', version: '>=1.9.3',
871 required: get_option('libnfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200872 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400873endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100874
875libattr_test = '''
876 #include <stddef.h>
877 #include <sys/types.h>
878 #ifdef CONFIG_LIBATTR
879 #include <attr/xattr.h>
880 #else
881 #include <sys/xattr.h>
882 #endif
883 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
884
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400885libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100886have_old_libattr = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100887if get_option('attr').allowed()
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100888 if cc.links(libattr_test)
889 libattr = declare_dependency()
890 else
891 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +0200892 required: get_option('attr'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100893 if libattr.found() and not \
894 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
895 libattr = not_found
896 if get_option('attr').enabled()
897 error('could not link libattr')
898 else
899 warning('could not link libattr, disabling')
900 endif
901 else
902 have_old_libattr = libattr.found()
903 endif
904 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400905endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100906
Akihiko Odaki52eaefd2022-07-02 23:25:19 +0900907cocoa = dependency('appleframeworks', modules: ['Cocoa', 'CoreVideo'],
908 required: get_option('cocoa'))
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100909
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +0300910vmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet'))
911if vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h',
912 'VMNET_BRIDGED_MODE',
913 dependencies: vmnet)
914 vmnet = not_found
915 if get_option('vmnet').enabled()
916 error('vmnet.framework API is outdated')
917 else
918 warning('vmnet.framework API is outdated, disabling')
919 endif
920endif
921
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100922seccomp = not_found
Michal Privoznik73422d92022-10-26 09:30:24 +0200923seccomp_has_sysrawrc = false
Paolo Bonzini90835c22020-11-17 14:22:24 +0100924if not get_option('seccomp').auto() or have_system or have_tools
925 seccomp = dependency('libseccomp', version: '>=2.3.0',
926 required: get_option('seccomp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200927 method: 'pkg-config')
Michal Privoznik73422d92022-10-26 09:30:24 +0200928 if seccomp.found()
929 seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h',
930 'SCMP_FLTATR_API_SYSRAWRC',
931 dependencies: seccomp)
932 endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100933endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100934
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100935libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100936if not get_option('cap_ng').auto() or have_system or have_tools
937 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +0200938 required: get_option('cap_ng'))
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100939endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100940if libcap_ng.found() and not cc.links('''
941 #include <cap-ng.h>
942 int main(void)
943 {
944 capng_capability_to_name(CAPNG_EFFECTIVE);
945 return 0;
946 }''', dependencies: libcap_ng)
947 libcap_ng = not_found
948 if get_option('cap_ng').enabled()
949 error('could not link libcap-ng')
950 else
951 warning('could not link libcap-ng, disabling')
952 endif
953endif
954
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400955if get_option('xkbcommon').auto() and not have_system and not have_tools
956 xkbcommon = not_found
957else
958 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200959 method: 'pkg-config')
Marc-André Lureauade60d42019-07-15 14:48:31 +0400960endif
Paolo Bonzinie1723992021-10-07 15:08:21 +0200961
Thomas Huth58902582022-04-08 18:20:47 +0200962slirp = not_found
963if not get_option('slirp').auto() or have_system
964 slirp = dependency('slirp', required: get_option('slirp'),
Paolo Bonzini063d5112022-07-14 14:56:58 +0200965 method: 'pkg-config')
Thomas Huth58902582022-04-08 18:20:47 +0200966 # slirp < 4.7 is incompatible with CFI support in QEMU. This is because
967 # it passes function pointers within libslirp as callbacks for timers.
968 # When using a system-wide shared libslirp, the type information for the
969 # callback is missing and the timer call produces a false positive with CFI.
970 # Do not use the "version" keyword argument to produce a better error.
971 # with control-flow integrity.
972 if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7')
973 if get_option('slirp').enabled()
974 error('Control-Flow Integrity requires libslirp 4.7.')
975 else
976 warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.')
977 slirp = not_found
978 endif
979 endif
980endif
981
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400982vde = not_found
Paolo Bonzinie1723992021-10-07 15:08:21 +0200983if not get_option('vde').auto() or have_system or have_tools
984 vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +0200985 required: get_option('vde'))
Paolo Bonzinie1723992021-10-07 15:08:21 +0200986endif
987if vde.found() and not cc.links('''
988 #include <libvdeplug.h>
989 int main(void)
990 {
991 struct vde_open_args a = {0, 0, 0};
992 char s[] = "";
993 vde_open(s, s, &a);
994 return 0;
995 }''', dependencies: vde)
996 vde = not_found
997 if get_option('cap_ng').enabled()
998 error('could not link libvdeplug')
999 else
1000 warning('could not link libvdeplug, disabling')
1001 endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001002endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001003
Paolo Bonzini478e9432020-08-17 12:47:55 +02001004pulse = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001005if not get_option('pa').auto() or (targetos == 'linux' and have_system)
1006 pulse = dependency('libpulse', required: get_option('pa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001007 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001008endif
1009alsa = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001010if not get_option('alsa').auto() or (targetos == 'linux' and have_system)
1011 alsa = dependency('alsa', required: get_option('alsa'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001012 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001013endif
1014jack = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001015if not get_option('jack').auto() or have_system
1016 jack = dependency('jack', required: get_option('jack'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001017 method: 'pkg-config')
Paolo Bonzini478e9432020-08-17 12:47:55 +02001018endif
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001019pipewire = not_found
1020if not get_option('pipewire').auto() or (targetos == 'linux' and have_system)
1021 pipewire = dependency('libpipewire-0.3', version: '>=0.3.60',
1022 required: get_option('pipewire'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001023 method: 'pkg-config')
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001024endif
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001025sndio = not_found
1026if not get_option('sndio').auto() or have_system
1027 sndio = dependency('sndio', required: get_option('sndio'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001028 method: 'pkg-config')
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001029endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001030
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001031spice_protocol = not_found
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001032if not get_option('spice_protocol').auto() or have_system
Markus Armbruster5c167b52023-01-09 20:03:07 +01001033 spice_protocol = dependency('spice-protocol', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001034 required: get_option('spice_protocol'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001035 method: 'pkg-config')
Paolo Bonzini26347332019-07-29 15:40:07 +02001036endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001037spice = not_found
1038if not get_option('spice').auto() or have_system
Markus Armbruster34d55722023-01-09 20:03:09 +01001039 spice = dependency('spice-server', version: '>=0.14.0',
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001040 required: get_option('spice'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001041 method: 'pkg-config')
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +02001042endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001043spice_headers = spice.partial_dependency(compile_args: true, includes: true)
1044
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04001045rt = cc.find_library('rt', required: false)
Paolo Bonzinia399f912021-11-15 14:29:13 +00001046
Paolo Bonzini99650b62019-06-10 12:21:14 +02001047libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001048if not get_option('libiscsi').auto() or have_block
1049 libiscsi = dependency('libiscsi', version: '>=1.9.0',
1050 required: get_option('libiscsi'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001051 method: 'pkg-config')
Paolo Bonzini99650b62019-06-10 12:21:14 +02001052endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001053zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +01001054if not get_option('zstd').auto() or have_block
1055 zstd = dependency('libzstd', version: '>=1.4.0',
1056 required: get_option('zstd'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001057 method: 'pkg-config')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001058endif
Marc-André Lureauea458962019-07-12 22:23:46 +04001059virgl = not_found
Paolo Bonzini0265fe92021-12-17 12:36:26 +01001060
1061have_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found()
1062if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
Paolo Bonzini587d59d2021-06-03 11:31:35 +02001063 virgl = dependency('virglrenderer',
1064 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001065 required: get_option('virglrenderer'))
Marc-André Lureauea458962019-07-12 22:23:46 +04001066endif
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001067blkio = not_found
1068if not get_option('blkio').auto() or have_block
1069 blkio = dependency('blkio',
1070 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001071 required: get_option('blkio'))
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001072endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001073curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001074if not get_option('curl').auto() or have_block
1075 curl = dependency('libcurl', version: '>=7.29.0',
1076 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001077 required: get_option('curl'))
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001078endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001079libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001080if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001081 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +01001082 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001083 required: get_option('libudev'))
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001084endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001085
Paolo Bonzini5c530152020-10-15 06:09:27 -04001086mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001087mpathpersist = not_found
1088mpathpersist_new_api = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001089if targetos == 'linux' and have_tools and get_option('mpath').allowed()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001090 mpath_test_source_new = '''
1091 #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 }'''
1107 mpath_test_source_old = '''
1108 #include <libudev.h>
1109 #include <mpath_persist.h>
1110 unsigned mpath_mx_alloc_len = 1024;
1111 int logsink;
1112 int main(void) {
1113 struct udev *udev = udev_new();
1114 mpath_lib_init(udev);
1115 return 0;
1116 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -04001117 libmpathpersist = cc.find_library('mpathpersist',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001118 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001119 if libmpathpersist.found()
1120 mpathlibs += libmpathpersist
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001121 if get_option('prefer_static')
Paolo Bonzini5c530152020-10-15 06:09:27 -04001122 mpathlibs += cc.find_library('devmapper',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001123 required: get_option('mpath'))
Paolo Bonzini43b43a42020-09-17 12:25:09 +02001124 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -04001125 mpathlibs += cc.find_library('multipath',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001126 required: get_option('mpath'))
Paolo Bonzini5c530152020-10-15 06:09:27 -04001127 foreach lib: mpathlibs
1128 if not lib.found()
1129 mpathlibs = []
1130 break
1131 endif
1132 endforeach
1133 if mpathlibs.length() == 0
1134 msg = 'Dependencies missing for libmpathpersist'
1135 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001136 mpathpersist = declare_dependency(dependencies: mpathlibs)
1137 mpathpersist_new_api = true
1138 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
1139 mpathpersist = declare_dependency(dependencies: mpathlibs)
1140 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001141 msg = 'Cannot detect libmpathpersist API'
1142 endif
1143 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001144 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -04001145 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001146 else
Paolo Bonzini5c530152020-10-15 06:09:27 -04001147 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001148 endif
1149 endif
1150 endif
1151endif
1152
Yonggang Luo5285e592020-10-13 07:43:48 +08001153iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001154curses = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001155if have_system and get_option('curses').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001156 curses_test = '''
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001157 #if defined(__APPLE__) || defined(__OpenBSD__)
1158 #define _XOPEN_SOURCE_EXTENDED 1
1159 #endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001160 #include <locale.h>
1161 #include <curses.h>
1162 #include <wchar.h>
1163 int main(void) {
1164 wchar_t wch = L'w';
1165 setlocale(LC_ALL, "");
1166 resize_term(0, 0);
1167 addwstr(L"wide chars\n");
1168 addnwstr(&wch, 1);
1169 add_wch(WACS_DEGREE);
1170 return 0;
1171 }'''
1172
Yonggang Luoca31e302020-11-17 05:31:06 +08001173 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
Paolo Bonzini6d322632022-03-27 16:05:58 +02001174 curses = dependency(curses_dep_list,
1175 required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001176 method: 'pkg-config')
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001177 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Stefan Weilfbab8cc2021-11-17 21:53:55 +01001178 curses_compile_args = ['-DNCURSES_WIDECHAR=1']
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001179 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -05001180 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001181 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses],
1182 version: curses.version())
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001183 else
1184 msg = 'curses package not usable'
1185 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +08001186 endif
1187 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001188 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001189 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
1190 if targetos != 'windows' and not has_curses_h
1191 message('Trying with /usr/include/ncursesw')
1192 curses_compile_args += ['-I/usr/include/ncursesw']
1193 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
1194 endif
1195 if has_curses_h
1196 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
1197 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +08001198 libcurses = cc.find_library(curses_libname,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001199 required: false)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001200 if libcurses.found()
1201 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
1202 curses = declare_dependency(compile_args: curses_compile_args,
1203 dependencies: [libcurses])
1204 break
1205 else
1206 msg = 'curses library not usable'
1207 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001208 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001209 endforeach
1210 endif
1211 endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001212 if get_option('iconv').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001213 foreach link_args : [ ['-liconv'], [] ]
1214 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
1215 # We need to use libiconv if available because mixing libiconv's headers with
1216 # the system libc does not work.
1217 # However, without adding glib to the dependencies -L/usr/local/lib will not be
1218 # included in the command line and libiconv will not be found.
1219 if cc.links('''
1220 #include <iconv.h>
1221 int main(void) {
1222 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
1223 return conv != (iconv_t) -1;
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02001224 }''', args: link_args, dependencies: glib)
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001225 iconv = declare_dependency(link_args: link_args, dependencies: glib)
1226 break
Yonggang Luo5285e592020-10-13 07:43:48 +08001227 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001228 endforeach
1229 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001230 if curses.found() and not iconv.found()
1231 if get_option('iconv').enabled()
1232 error('iconv not available')
1233 endif
1234 msg = 'iconv required for curses UI but not available'
1235 curses = not_found
1236 endif
1237 if not curses.found() and msg != ''
1238 if get_option('curses').enabled()
1239 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001240 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -04001241 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -04001242 endif
Yonggang Luo5285e592020-10-13 07:43:48 +08001243 endif
1244endif
1245
Paolo Bonzini26347332019-07-29 15:40:07 +02001246brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001247if not get_option('brlapi').auto() or have_system
1248 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001249 required: get_option('brlapi'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001250 if brlapi.found() and not cc.links('''
1251 #include <brlapi.h>
1252 #include <stddef.h>
1253 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
1254 brlapi = not_found
1255 if get_option('brlapi').enabled()
1256 error('could not link brlapi')
1257 else
1258 warning('could not link brlapi, disabling')
1259 endif
1260 endif
Paolo Bonzini26347332019-07-29 15:40:07 +02001261endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001262
Paolo Bonzini760e4322020-08-26 08:09:48 +02001263sdl = not_found
Akihiko Odaki64d3fec2022-08-19 22:27:56 +09001264if not get_option('sdl').auto() or have_system
Paolo Bonzini063d5112022-07-14 14:56:58 +02001265 sdl = dependency('sdl2', required: get_option('sdl'))
Paolo Bonzini760e4322020-08-26 08:09:48 +02001266 sdl_image = not_found
1267endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001268if sdl.found()
1269 # work around 2.0.8 bug
1270 sdl = declare_dependency(compile_args: '-Wno-undef',
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001271 dependencies: sdl,
1272 version: sdl.version())
Volker Rümelin7161a432020-08-29 12:41:58 +02001273 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001274 method: 'pkg-config')
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001275else
1276 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +01001277 error('sdl-image required, but SDL was @0@'.format(
1278 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001279 endif
1280 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +02001281endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001282
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001283rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001284if not get_option('rbd').auto() or have_block
Paolo Bonzini063d5112022-07-14 14:56:58 +02001285 librados = cc.find_library('rados', required: get_option('rbd'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001286 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001287 required: get_option('rbd'))
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001288 if librados.found() and librbd.found()
1289 if cc.links('''
1290 #include <stdio.h>
1291 #include <rbd/librbd.h>
1292 int main(void) {
1293 rados_t cluster;
1294 rados_create(&cluster, NULL);
Peter Lieven48672ac2021-07-02 19:23:51 +02001295 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
1296 #error
1297 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001298 return 0;
1299 }''', dependencies: [librbd, librados])
1300 rbd = declare_dependency(dependencies: [librbd, librados])
1301 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +02001302 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001303 else
Peter Lieven48672ac2021-07-02 19:23:51 +02001304 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001305 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001306 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001307endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001308
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001309glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001310glusterfs_ftruncate_has_stat = false
1311glusterfs_iocb_has_stat = false
1312if not get_option('glusterfs').auto() or have_block
1313 glusterfs = dependency('glusterfs-api', version: '>=3',
1314 required: get_option('glusterfs'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001315 method: 'pkg-config')
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001316 if glusterfs.found()
1317 glusterfs_ftruncate_has_stat = cc.links('''
1318 #include <glusterfs/api/glfs.h>
1319
1320 int
1321 main(void)
1322 {
1323 /* new glfs_ftruncate() passes two additional args */
1324 return glfs_ftruncate(NULL, 0, NULL, NULL);
1325 }
1326 ''', dependencies: glusterfs)
1327 glusterfs_iocb_has_stat = cc.links('''
1328 #include <glusterfs/api/glfs.h>
1329
1330 /* new glfs_io_cbk() passes two additional glfs_stat structs */
1331 static void
1332 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
1333 {}
1334
1335 int
1336 main(void)
1337 {
1338 glfs_io_cbk iocb = &glusterfs_iocb;
1339 iocb(NULL, 0 , NULL, NULL, NULL);
1340 return 0;
1341 }
1342 ''', dependencies: glusterfs)
1343 endif
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 +04001346libssh = not_found
Thomas Huthe6a52b32021-12-09 15:48:01 +01001347if not get_option('libssh').auto() or have_block
1348 libssh = dependency('libssh', version: '>=0.8.7',
1349 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001350 required: get_option('libssh'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001351endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001352
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001353libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001354if not get_option('bzip2').auto() or have_block
1355 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001356 required: get_option('bzip2'))
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001357 if libbzip2.found() and not cc.links('''
1358 #include <bzlib.h>
1359 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
1360 libbzip2 = not_found
1361 if get_option('bzip2').enabled()
1362 error('could not link libbzip2')
1363 else
1364 warning('could not link libbzip2, disabling')
1365 endif
1366 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001367endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001368
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001369liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +01001370if not get_option('lzfse').auto() or have_block
1371 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001372 required: get_option('lzfse'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001373endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001374if liblzfse.found() and not cc.links('''
1375 #include <lzfse.h>
1376 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
1377 liblzfse = not_found
1378 if get_option('lzfse').enabled()
1379 error('could not link liblzfse')
1380 else
1381 warning('could not link liblzfse, disabling')
1382 endif
1383endif
1384
Paolo Bonzini478e9432020-08-17 12:47:55 +02001385oss = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001386if get_option('oss').allowed() and have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02001387 if not cc.has_header('sys/soundcard.h')
1388 # not found
1389 elif targetos == 'netbsd'
Paolo Bonzini063d5112022-07-14 14:56:58 +02001390 oss = cc.find_library('ossaudio', required: get_option('oss'))
Paolo Bonzini87430d52021-10-07 15:06:09 +02001391 else
1392 oss = declare_dependency()
1393 endif
1394
1395 if not oss.found()
1396 if get_option('oss').enabled()
1397 error('OSS not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001398 endif
1399 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001400endif
1401dsound = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001402if not get_option('dsound').auto() or (targetos == 'windows' and have_system)
1403 if cc.has_header('dsound.h')
1404 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1405 endif
1406
1407 if not dsound.found()
1408 if get_option('dsound').enabled()
1409 error('DirectSound not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001410 endif
1411 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001412endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001413
Paolo Bonzini478e9432020-08-17 12:47:55 +02001414coreaudio = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001415if not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system)
1416 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
1417 required: get_option('coreaudio'))
Paolo Bonzini478e9432020-08-17 12:47:55 +02001418endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001419
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001420opengl = not_found
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001421if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
1422 epoxy = dependency('epoxy', method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001423 required: get_option('opengl'))
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001424 if cc.has_header('epoxy/egl.h', dependencies: epoxy)
1425 opengl = epoxy
1426 elif get_option('opengl').enabled()
1427 error('epoxy/egl.h not found')
1428 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001429endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001430gbm = not_found
1431if (have_system or have_tools) and (virgl.found() or opengl.found())
Paolo Bonzini063d5112022-07-14 14:56:58 +02001432 gbm = dependency('gbm', method: 'pkg-config', required: false)
Thomas Huth8bc51842021-07-13 13:09:02 +02001433endif
Marc-André Lureauf0caba42022-06-28 17:23:15 +04001434have_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001435
Paolo Bonzini57612512021-06-03 11:15:26 +02001436gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001437gnutls_crypto = not_found
Alyssa Rossabc14fd2021-08-06 14:49:47 +00001438if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001439 # For general TLS support our min gnutls matches
1440 # that implied by our platform support matrix
1441 #
1442 # For the crypto backends, we look for a newer
1443 # gnutls:
1444 #
1445 # Version 3.6.8 is needed to get XTS
1446 # Version 3.6.13 is needed to get PBKDF
1447 # Version 3.6.14 is needed to get HW accelerated XTS
1448 #
1449 # If newer enough gnutls isn't available, we can
1450 # still use a different crypto backend to satisfy
1451 # the platform support requirements
1452 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1453 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001454 required: false)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001455 if gnutls_crypto.found()
1456 gnutls = gnutls_crypto
1457 else
1458 # Our min version if all we need is TLS
1459 gnutls = dependency('gnutls', version: '>=3.5.18',
1460 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001461 required: get_option('gnutls'))
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001462 endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001463endif
1464
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001465# We prefer use of gnutls for crypto, unless the options
1466# explicitly asked for nettle or gcrypt.
1467#
1468# If gnutls isn't available for crypto, then we'll prefer
1469# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +02001470gcrypt = not_found
1471nettle = not_found
Lei He4c5e5122022-05-25 17:01:14 +08001472hogweed = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +01001473xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001474
Paolo Bonzini57612512021-06-03 11:15:26 +02001475if get_option('nettle').enabled() and get_option('gcrypt').enabled()
1476 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +02001477endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001478
1479# Explicit nettle/gcrypt request, so ignore gnutls for crypto
1480if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001481 gnutls_crypto = not_found
1482endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001483
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001484if not gnutls_crypto.found()
1485 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
1486 gcrypt = dependency('libgcrypt', version: '>=1.8',
1487 method: 'config-tool',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001488 required: get_option('gcrypt'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001489 # Debian has removed -lgpg-error from libgcrypt-config
1490 # as it "spreads unnecessary dependencies" which in
1491 # turn breaks static builds...
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001492 if gcrypt.found() and get_option('prefer_static')
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001493 gcrypt = declare_dependency(dependencies:
1494 [gcrypt,
1495 cc.find_library('gpg-error', required: true)],
1496 version: gcrypt.version())
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001497 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001498 endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001499 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1500 nettle = dependency('nettle', version: '>=3.4',
1501 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001502 required: get_option('nettle'))
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001503 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1504 xts = 'private'
1505 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001506 endif
1507endif
1508
Paolo Bonzini063d5112022-07-14 14:56:58 +02001509gmp = dependency('gmp', required: false, method: 'pkg-config')
Lei He4c5e5122022-05-25 17:01:14 +08001510if nettle.found() and gmp.found()
1511 hogweed = dependency('hogweed', version: '>=3.4',
1512 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001513 required: get_option('nettle'))
Lei He4c5e5122022-05-25 17:01:14 +08001514endif
1515
1516
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001517gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +01001518gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001519vte = not_found
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001520have_gtk_clipboard = get_option('gtk_clipboard').enabled()
1521
Akihiko Odaki64d3fec2022-08-19 22:27:56 +09001522if not get_option('gtk').auto() or have_system
Paolo Bonzini1b695472021-01-07 14:02:29 +01001523 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1524 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001525 required: get_option('gtk'))
Paolo Bonzini1b695472021-01-07 14:02:29 +01001526 if gtk.found()
1527 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1528 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001529 required: false)
Paolo Bonzinibd3615d2023-03-30 12:45:58 +02001530 gtk = declare_dependency(dependencies: [gtk, gtkx11],
1531 version: gtk.version())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001532
1533 if not get_option('vte').auto() or have_system
1534 vte = dependency('vte-2.91',
1535 method: 'pkg-config',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001536 required: get_option('vte'))
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001537 endif
Claudio Fontana29e0bff2022-11-21 14:55:38 +01001538 elif have_gtk_clipboard
1539 error('GTK clipboard requested, but GTK not found')
Paolo Bonzini1b695472021-01-07 14:02:29 +01001540 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001541endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001542
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001543x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +02001544if gtkx11.found()
Paolo Bonzini063d5112022-07-14 14:56:58 +02001545 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001546endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001547png = not_found
Kshitij Suri95f85102022-04-08 07:13:34 +00001548if get_option('png').allowed() and have_system
Thomas Huth1ec8c2c2022-06-23 19:49:41 +02001549 png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001550 method: 'pkg-config')
Kshitij Suri95f85102022-04-08 07:13:34 +00001551endif
1552vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001553jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001554sasl = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001555if get_option('vnc').allowed() and have_system
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001556 vnc = declare_dependency() # dummy dependency
Paolo Bonzini8e242b32020-11-23 13:34:02 -05001557 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001558 method: 'pkg-config')
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001559 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001560 required: get_option('vnc_sasl'))
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001561 if sasl.found()
1562 sasl = declare_dependency(dependencies: sasl,
1563 compile_args: '-DSTRUCT_IOVEC_DEFINED')
1564 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001565endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01001566
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001567pam = not_found
1568if not get_option('auth_pam').auto() or have_system
1569 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001570 required: get_option('auth_pam'))
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001571endif
1572if pam.found() and not cc.links('''
1573 #include <stddef.h>
1574 #include <security/pam_appl.h>
1575 int main(void) {
1576 const char *service_name = "qemu";
1577 const char *user = "frank";
1578 const struct pam_conv pam_conv = { 0 };
1579 pam_handle_t *pamh = NULL;
1580 pam_start(service_name, user, &pam_conv, &pamh);
1581 return 0;
1582 }''', dependencies: pam)
1583 pam = not_found
1584 if get_option('auth_pam').enabled()
1585 error('could not link libpam')
1586 else
1587 warning('could not link libpam, disabling')
1588 endif
1589endif
1590
Marc-André Lureau708eab42019-09-03 16:59:33 +04001591snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +01001592if not get_option('snappy').auto() or have_system
1593 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001594 required: get_option('snappy'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04001595endif
Paolo Bonzini565174d2021-11-04 14:35:14 +01001596if snappy.found() and not linker.links('''
Paolo Bonzini241611e2020-11-17 13:32:34 +01001597 #include <snappy-c.h>
1598 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
1599 snappy = not_found
1600 if get_option('snappy').enabled()
1601 error('could not link libsnappy')
1602 else
1603 warning('could not link libsnappy, disabling')
1604 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +04001605endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001606
Marc-André Lureau708eab42019-09-03 16:59:33 +04001607lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001608if not get_option('lzo').auto() or have_system
1609 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001610 required: get_option('lzo'))
Marc-André Lureau708eab42019-09-03 16:59:33 +04001611endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001612if lzo.found() and not cc.links('''
1613 #include <lzo/lzo1x.h>
1614 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
1615 lzo = not_found
1616 if get_option('lzo').enabled()
1617 error('could not link liblzo2')
1618 else
1619 warning('could not link liblzo2, disabling')
1620 endif
1621endif
1622
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001623numa = not_found
1624if not get_option('numa').auto() or have_system or have_tools
1625 numa = cc.find_library('numa', has_headers: ['numa.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001626 required: get_option('numa'))
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001627endif
1628if numa.found() and not cc.links('''
1629 #include <numa.h>
1630 int main(void) { return numa_available(); }
1631 ''', dependencies: numa)
1632 numa = not_found
1633 if get_option('numa').enabled()
1634 error('could not link numa')
1635 else
1636 warning('could not link numa, disabling')
1637 endif
1638endif
1639
Marc-André Lureau55166232019-07-24 19:16:22 +04001640rdma = not_found
Paolo Bonzini3730a732022-04-20 17:33:41 +02001641if not get_option('rdma').auto() or have_system
1642 libumad = cc.find_library('ibumad', required: get_option('rdma'))
1643 rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
Paolo Bonzini063d5112022-07-14 14:56:58 +02001644 required: get_option('rdma')),
1645 cc.find_library('ibverbs', required: get_option('rdma')),
Paolo Bonzini3730a732022-04-20 17:33:41 +02001646 libumad]
1647 rdma = declare_dependency(dependencies: rdma_libs)
1648 foreach lib: rdma_libs
1649 if not lib.found()
1650 rdma = not_found
1651 endif
1652 endforeach
Marc-André Lureau55166232019-07-24 19:16:22 +04001653endif
Paolo Bonzini3730a732022-04-20 17:33:41 +02001654
Marc-André Lureau582ea952019-08-15 15:15:32 +04001655xen = not_found
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001656if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
1657 xencontrol = dependency('xencontrol', required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001658 method: 'pkg-config')
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001659 if xencontrol.found()
1660 xen_pc = declare_dependency(version: xencontrol.version(),
1661 dependencies: [
1662 xencontrol,
1663 # disabler: true makes xen_pc.found() return false if any is not found
1664 dependency('xenstore', required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001665 method: 'pkg-config',
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001666 disabler: true),
1667 dependency('xenforeignmemory', required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001668 method: 'pkg-config',
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001669 disabler: true),
1670 dependency('xengnttab', required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001671 method: 'pkg-config',
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001672 disabler: true),
1673 dependency('xenevtchn', required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001674 method: 'pkg-config',
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001675 disabler: true),
1676 dependency('xendevicemodel', required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001677 method: 'pkg-config',
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001678 disabler: true),
1679 # optional, no "disabler: true"
1680 dependency('xentoolcore', required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001681 method: 'pkg-config')])
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001682 if xen_pc.found()
1683 xen = xen_pc
1684 endif
1685 endif
1686 if not xen.found()
1687 xen_tests = [ '4.11.0', '4.10.0', '4.9.0', '4.8.0', '4.7.1', '4.6.0', '4.5.0', '4.2.0' ]
1688 xen_libs = {
1689 '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
1690 '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
1691 '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
1692 '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
1693 '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
1694 '4.6.0': [ 'xenstore', 'xenctrl' ],
1695 '4.5.0': [ 'xenstore', 'xenctrl' ],
1696 '4.2.0': [ 'xenstore', 'xenctrl' ],
1697 }
1698 xen_deps = {}
1699 foreach ver: xen_tests
1700 # cache the various library tests to avoid polluting the logs
1701 xen_test_deps = []
1702 foreach l: xen_libs[ver]
1703 if l not in xen_deps
1704 xen_deps += { l: cc.find_library(l, required: false) }
1705 endif
1706 xen_test_deps += xen_deps[l]
1707 endforeach
1708
1709 # Use -D to pick just one of the test programs in scripts/xen-detect.c
1710 xen_version = ver.split('.')
1711 xen_ctrl_version = xen_version[0] + \
1712 ('0' + xen_version[1]).substring(-2) + \
1713 ('0' + xen_version[2]).substring(-2)
1714 if cc.links(files('scripts/xen-detect.c'),
1715 args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
1716 dependencies: xen_test_deps)
1717 xen = declare_dependency(version: ver, dependencies: xen_test_deps)
1718 break
1719 endif
1720 endforeach
1721 endif
1722 if xen.found()
1723 accelerators += 'CONFIG_XEN'
1724 elif get_option('xen').enabled()
1725 error('could not compile and link Xen test program')
1726 endif
Marc-André Lureau582ea952019-08-15 15:15:32 +04001727endif
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001728have_xen_pci_passthrough = get_option('xen_pci_passthrough') \
1729 .require(xen.found(),
1730 error_message: 'Xen PCI passthrough requested but Xen not enabled') \
1731 .require(targetos == 'linux',
1732 error_message: 'Xen PCI passthrough not available on this platform') \
1733 .allowed()
1734
1735
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001736cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02001737if not get_option('smartcard').auto() or have_system
1738 cacard = dependency('libcacard', required: get_option('smartcard'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001739 version: '>=2.5.1', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001740endif
César Belley0a40bcb2020-08-26 13:42:04 +02001741u2f = not_found
1742if have_system
1743 u2f = dependency('u2f-emu', required: get_option('u2f'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001744 method: 'pkg-config')
César Belley0a40bcb2020-08-26 13:42:04 +02001745endif
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08001746canokey = not_found
1747if have_system
1748 canokey = dependency('canokey-qemu', required: get_option('canokey'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001749 method: 'pkg-config')
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08001750endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001751usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02001752if not get_option('usb_redir').auto() or have_system
1753 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001754 version: '>=0.6', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001755endif
1756libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02001757if not get_option('libusb').auto() or have_system
1758 libusb = dependency('libusb-1.0', required: get_option('libusb'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001759 version: '>=1.0.13', method: 'pkg-config')
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001760endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02001761
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001762libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02001763if not get_option('libpmem').auto() or have_system
1764 libpmem = dependency('libpmem', required: get_option('libpmem'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001765 method: 'pkg-config')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001766endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001767libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02001768if not get_option('libdaxctl').auto() or have_system
1769 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001770 version: '>=57', method: 'pkg-config')
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001771endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001772tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02001773if gnutls.found()
1774 tasn1 = dependency('libtasn1',
Paolo Bonzini063d5112022-07-14 14:56:58 +02001775 method: 'pkg-config')
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001776endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001777keyutils = dependency('libkeyutils', required: false,
Paolo Bonzini063d5112022-07-14 14:56:58 +02001778 method: 'pkg-config')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001779
Marc-André Lureau3909def2020-08-28 15:07:33 +04001780has_gettid = cc.has_function('gettid')
1781
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001782# libselinux
1783selinux = dependency('libselinux',
1784 required: get_option('selinux'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001785 method: 'pkg-config')
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001786
Paolo Bonziniaa087962020-09-01 11:15:30 -04001787# Malloc tests
1788
1789malloc = []
1790if get_option('malloc') == 'system'
1791 has_malloc_trim = \
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001792 get_option('malloc_trim').allowed() and \
Paolo Bonziniaa087962020-09-01 11:15:30 -04001793 cc.links('''#include <malloc.h>
1794 int main(void) { malloc_trim(0); return 0; }''')
1795else
1796 has_malloc_trim = false
1797 malloc = cc.find_library(get_option('malloc'), required: true)
1798endif
1799if not has_malloc_trim and get_option('malloc_trim').enabled()
1800 if get_option('malloc') == 'system'
1801 error('malloc_trim not available on this platform.')
1802 else
1803 error('malloc_trim not available with non-libc memory allocator')
1804 endif
1805endif
1806
Max Reitz84e319a2020-11-02 17:18:55 +01001807# Check whether the glibc provides statx()
1808
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001809gnu_source_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01001810 #ifndef _GNU_SOURCE
1811 #define _GNU_SOURCE
1812 #endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001813'''
1814statx_test = gnu_source_prefix + '''
Max Reitz84e319a2020-11-02 17:18:55 +01001815 #include <sys/stat.h>
1816 int main(void) {
1817 struct statx statxbuf;
1818 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
1819 return 0;
1820 }'''
1821
1822has_statx = cc.links(statx_test)
1823
Hanna Reitz4ce7a082022-02-23 10:23:40 +01001824# Check whether statx() provides mount ID information
1825
1826statx_mnt_id_test = gnu_source_prefix + '''
1827 #include <sys/stat.h>
1828 int main(void) {
1829 struct statx statxbuf;
1830 statx(0, "", 0, STATX_BASIC_STATS | STATX_MNT_ID, &statxbuf);
1831 return statxbuf.stx_mnt_id;
1832 }'''
1833
1834has_statx_mnt_id = cc.links(statx_mnt_id_test)
1835
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001836have_vhost_user_blk_server = get_option('vhost_user_blk_server') \
1837 .require(targetos == 'linux',
1838 error_message: 'vhost_user_blk_server requires linux') \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02001839 .require(have_vhost_user,
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001840 error_message: 'vhost_user_blk_server requires vhost-user support') \
Alex Bennée26ed5012022-05-24 16:40:42 +01001841 .disable_auto_if(not have_tools and not have_system) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001842 .allowed()
Daniele Buono9e62ba42020-12-04 18:06:14 -05001843
Max Reitzdf4ea702020-10-27 20:05:46 +01001844if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1845 error('Cannot enable fuse-lseek while fuse is disabled')
1846endif
1847
Max Reitza484a712020-10-27 20:05:41 +01001848fuse = dependency('fuse3', required: get_option('fuse'),
Paolo Bonzini063d5112022-07-14 14:56:58 +02001849 version: '>=3.1', method: 'pkg-config')
Max Reitza484a712020-10-27 20:05:41 +01001850
Max Reitzdf4ea702020-10-27 20:05:46 +01001851fuse_lseek = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001852if get_option('fuse_lseek').allowed()
Max Reitzdf4ea702020-10-27 20:05:46 +01001853 if fuse.version().version_compare('>=3.8')
1854 # Dummy dependency
1855 fuse_lseek = declare_dependency()
1856 elif get_option('fuse_lseek').enabled()
1857 if fuse.found()
1858 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1859 else
1860 error('fuse-lseek requires libfuse, which was not found')
1861 endif
1862 endif
1863endif
1864
Xie Yongjia6caeee2022-05-23 16:46:08 +08001865have_libvduse = (targetos == 'linux')
1866if get_option('libvduse').enabled()
1867 if targetos != 'linux'
1868 error('libvduse requires linux')
1869 endif
1870elif get_option('libvduse').disabled()
1871 have_libvduse = false
1872endif
1873
Xie Yongji2a2359b2022-05-23 16:46:09 +08001874have_vduse_blk_export = (have_libvduse and targetos == 'linux')
1875if get_option('vduse_blk_export').enabled()
1876 if targetos != 'linux'
1877 error('vduse_blk_export requires linux')
1878 elif not have_libvduse
1879 error('vduse_blk_export requires libvduse support')
1880 endif
1881elif get_option('vduse_blk_export').disabled()
1882 have_vduse_blk_export = false
1883endif
1884
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001885# libbpf
1886libbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
1887if libbpf.found() and not cc.links('''
1888 #include <bpf/libbpf.h>
1889 int main(void)
1890 {
1891 bpf_object__destroy_skeleton(NULL);
1892 return 0;
1893 }''', dependencies: libbpf)
1894 libbpf = not_found
1895 if get_option('bpf').enabled()
1896 error('libbpf skeleton test failed')
1897 else
1898 warning('libbpf skeleton test failed, disabling')
1899 endif
1900endif
1901
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01001902# libdw
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01001903libdw = not_found
Ilya Leoshkevich550c6d92023-02-10 01:52:08 +01001904if not get_option('libdw').auto() or \
Paolo Bonzinia0cbd2e2022-07-14 14:33:49 +02001905 (not get_option('prefer_static') and (have_system or have_user))
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01001906 libdw = dependency('libdw',
1907 method: 'pkg-config',
Ilya Leoshkevichbc71d582023-02-10 01:52:07 +01001908 required: get_option('libdw'))
1909endif
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01001910
Paolo Bonzini87430d52021-10-07 15:06:09 +02001911#################
1912# config-host.h #
1913#################
1914
1915audio_drivers_selected = []
1916if have_system
1917 audio_drivers_available = {
1918 'alsa': alsa.found(),
1919 'coreaudio': coreaudio.found(),
1920 'dsound': dsound.found(),
1921 'jack': jack.found(),
1922 'oss': oss.found(),
1923 'pa': pulse.found(),
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02001924 'pipewire': pipewire.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02001925 'sdl': sdl.found(),
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001926 'sndio': sndio.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02001927 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02001928 foreach k, v: audio_drivers_available
1929 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
1930 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02001931
1932 # Default to native drivers first, OSS second, SDL third
1933 audio_drivers_priority = \
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001934 [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \
Paolo Bonzini87430d52021-10-07 15:06:09 +02001935 (targetos == 'linux' ? [] : [ 'sdl' ])
1936 audio_drivers_default = []
1937 foreach k: audio_drivers_priority
1938 if audio_drivers_available[k]
1939 audio_drivers_default += k
1940 endif
1941 endforeach
1942
1943 foreach k: get_option('audio_drv_list')
1944 if k == 'default'
1945 audio_drivers_selected += audio_drivers_default
1946 elif not audio_drivers_available[k]
1947 error('Audio driver "@0@" not available.'.format(k))
1948 else
1949 audio_drivers_selected += k
1950 endif
1951 endforeach
1952endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001953config_host_data.set('CONFIG_AUDIO_DRIVERS',
1954 '"' + '", "'.join(audio_drivers_selected) + '", ')
1955
Daniele Buono9e62ba42020-12-04 18:06:14 -05001956if get_option('cfi')
1957 cfi_flags=[]
1958 # Check for dependency on LTO
1959 if not get_option('b_lto')
1960 error('Selected Control-Flow Integrity but LTO is disabled')
1961 endif
Paolo Bonzini60027112022-10-20 14:53:10 +02001962 if enable_modules
Daniele Buono9e62ba42020-12-04 18:06:14 -05001963 error('Selected Control-Flow Integrity is not compatible with modules')
1964 endif
1965 # Check for cfi flags. CFI requires LTO so we can't use
1966 # get_supported_arguments, but need a more complex "compiles" which allows
1967 # custom arguments
1968 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1969 args: ['-flto', '-fsanitize=cfi-icall'] )
1970 cfi_flags += '-fsanitize=cfi-icall'
1971 else
1972 error('-fsanitize=cfi-icall is not supported by the compiler')
1973 endif
1974 if cc.compiles('int main () { return 0; }',
1975 name: '-fsanitize-cfi-icall-generalize-pointers',
1976 args: ['-flto', '-fsanitize=cfi-icall',
1977 '-fsanitize-cfi-icall-generalize-pointers'] )
1978 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1979 else
1980 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1981 endif
1982 if get_option('cfi_debug')
1983 if cc.compiles('int main () { return 0; }',
1984 name: '-fno-sanitize-trap=cfi-icall',
1985 args: ['-flto', '-fsanitize=cfi-icall',
1986 '-fno-sanitize-trap=cfi-icall'] )
1987 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1988 else
1989 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1990 endif
1991 endif
Paolo Bonzinie5134022022-10-12 14:15:06 +02001992 add_global_arguments(cfi_flags, native: false, language: all_languages)
1993 add_global_link_arguments(cfi_flags, native: false, language: all_languages)
Daniele Buono9e62ba42020-12-04 18:06:14 -05001994endif
1995
Joelle van Dyne14176c82021-03-15 11:03:38 -07001996have_host_block_device = (targetos != 'darwin' or
1997 cc.has_header('IOKit/storage/IOMedia.h'))
1998
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001999dbus_display = get_option('dbus_display') \
2000 .require(gio.version().version_compare('>=2.64'),
2001 error_message: '-display dbus requires glib>=2.64') \
Paolo Bonzini75440602022-04-20 17:33:44 +02002002 .require(gdbus_codegen.found(),
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02002003 error_message: gdbus_codegen_error.format('-display dbus')) \
Marc-André Lureau84a0a2e2022-08-11 18:25:16 +04002004 .require(targetos != 'windows',
2005 error_message: '-display dbus is not available on Windows') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002006 .allowed()
Marc-André Lureau142ca622021-07-15 11:53:53 +04002007
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002008have_virtfs = get_option('virtfs') \
Keno Fischer0fb1e192022-02-27 17:35:22 -05002009 .require(targetos == 'linux' or targetos == 'darwin',
2010 error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
2011 .require(targetos == 'linux' or cc.has_function('pthread_fchdir_np'),
2012 error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
Peter Foley1a67e072023-05-03 09:07:56 -04002013 .require(targetos == 'darwin' or libattr.found(),
2014 error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01002015 .disable_auto_if(not have_tools and not have_system) \
2016 .allowed()
Paolo Bonzini69202b42020-11-17 14:46:21 +01002017
Peter Foley1a67e072023-05-03 09:07:56 -04002018have_virtfs_proxy_helper = get_option('virtfs_proxy_helper') \
2019 .require(targetos != 'darwin', error_message: 'the virtfs proxy helper is incompatible with macOS') \
2020 .require(have_virtfs, error_message: 'the virtfs proxy helper requires that virtfs is enabled') \
2021 .disable_auto_if(not have_tools) \
2022 .require(libcap_ng.found(), error_message: 'the virtfs proxy helper requires libcap-ng') \
2023 .allowed()
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01002024
Paolo Bonzini622d64f2022-04-20 17:33:53 +02002025if get_option('block_drv_ro_whitelist') == ''
2026 config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
2027else
2028 config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
2029 '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
2030endif
2031if get_option('block_drv_rw_whitelist') == ''
2032 config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
2033else
2034 config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
2035 '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
2036endif
2037
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002038foreach k : get_option('trace_backends')
2039 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
2040endforeach
2041config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02002042config_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
Paolo Bonzini40c909f2022-04-20 17:33:49 +02002043if iasl.found()
2044 config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
Paolo Bonzini5dc46182021-10-13 13:19:00 +02002045endif
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002046config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
2047config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
2048config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
2049config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
2050config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09002051
2052qemu_firmwarepath = ''
2053foreach k : get_option('qemu_firmwarepath')
2054 qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
2055endforeach
2056config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
2057
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002058config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
2059config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
2060config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
2061config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
2062config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
2063config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
2064
Paolo Bonzini60027112022-10-20 14:53:10 +02002065if enable_modules
Paolo Bonzinib0b43232022-04-20 17:33:54 +02002066 config_host_data.set('CONFIG_STAMP', run_command(
2067 meson.current_source_dir() / 'scripts/qemu-stamp.py',
2068 meson.project_version(), get_option('pkgversion'), '--',
2069 meson.current_source_dir() / 'configure',
2070 capture: true, check: true).stdout().strip())
2071endif
2072
Paolo Bonzini35acbb32021-10-13 13:43:36 +02002073have_slirp_smbd = get_option('slirp_smbd') \
2074 .require(targetos != 'windows', error_message: 'Host smbd not supported on this platform.') \
2075 .allowed()
2076if have_slirp_smbd
2077 smbd_path = get_option('smbd')
2078 if smbd_path == ''
2079 smbd_path = (targetos == 'solaris' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
2080 endif
2081 config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
2082endif
2083
Paolo Bonzini823eb012021-11-08 14:18:17 +01002084config_host_data.set('HOST_' + host_arch.to_upper(), 1)
2085
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02002086if get_option('module_upgrades') and not enable_modules
2087 error('Cannot enable module-upgrades as modules are not enabled')
2088endif
2089config_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
2090
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002091config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002092config_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002093config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04002094config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzini537b7242021-10-07 15:08:12 +02002095config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02002096config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002097config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002098config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002099config_host_data.set('CONFIG_MPATH', mpathpersist.found())
2100config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04002101config_host_data.set('CONFIG_BLKIO', blkio.found())
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002102config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08002103config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02002104config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini75440602022-04-20 17:33:44 +02002105config_host_data.set('CONFIG_GIO', gio.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002106config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
2107if glusterfs.found()
2108 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
2109 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
2110 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
2111 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
2112 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
2113 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
2114endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002115config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02002116config_host_data.set('CONFIG_VTE', vte.found())
Claudio Fontana29e0bff2022-11-21 14:55:38 +01002117config_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard)
Taylor Simpson63efb6a2023-04-27 15:59:52 -07002118config_host_data.set('CONFIG_HEXAGON_IDEF_PARSER', get_option('hexagon_idef_parser'))
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002119config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002120config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002121config_host_data.set('CONFIG_EBPF', libbpf.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002122config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002123config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01002124config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Thomas Huthe6a52b32021-12-09 15:48:01 +01002125config_host_data.set('CONFIG_LIBSSH', libssh.found())
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02002126config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002127config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
2128config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzini60027112022-10-20 14:53:10 +02002129config_host_data.set('CONFIG_MODULES', enable_modules)
Paolo Bonzini488a8c72021-12-21 12:38:27 +01002130config_host_data.set('CONFIG_NUMA', numa.found())
Michal Privoznik6bb613f2022-12-15 10:55:03 +01002131if numa.found()
2132 config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY',
2133 cc.has_function('numa_has_preferred_many',
2134 dependencies: numa))
2135endif
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002136config_host_data.set('CONFIG_OPENGL', opengl.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002137config_host_data.set('CONFIG_PROFILER', get_option('profiler'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002138config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini3730a732022-04-20 17:33:41 +02002139config_host_data.set('CONFIG_RDMA', rdma.found())
Paolo Bonzini721fa5e2022-10-12 11:59:51 +02002140config_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002141config_host_data.set('CONFIG_SDL', sdl.found())
2142config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01002143config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Michal Privoznik73422d92022-10-26 09:30:24 +02002144if seccomp.found()
2145 config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
2146endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01002147config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002148config_host_data.set('CONFIG_TPM', have_tpm)
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002149config_host_data.set('CONFIG_TSAN', get_option('tsan'))
Paolo Bonzini90540f32021-06-03 11:15:26 +02002150config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Paolo Bonzinie1723992021-10-07 15:08:21 +02002151config_host_data.set('CONFIG_VDE', vde.found())
Paolo Bonzini2df89d52022-04-20 17:34:07 +02002152config_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
2153config_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
2154config_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
2155config_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
2156config_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
2157config_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
2158config_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03002159config_host_data.set('CONFIG_VMNET', vmnet.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002160config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Xie Yongji2a2359b2022-05-23 16:46:09 +08002161config_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
Kshitij Suri95f85102022-04-08 07:13:34 +00002162config_host_data.set('CONFIG_PNG', png.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002163config_host_data.set('CONFIG_VNC', vnc.found())
2164config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002165config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01002166config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02002167config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002168config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04002169config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04002170config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02002171config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01002172config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Daniel P. Berrangéd47b83b2022-04-26 17:00:43 +01002173config_host_data.set('CONFIG_TASN1', tasn1.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002174config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
2175config_host_data.set('CONFIG_NETTLE', nettle.found())
Lei He4c5e5122022-05-25 17:01:14 +08002176config_host_data.set('CONFIG_HOGWEED', hogweed.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02002177config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04002178config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01002179config_host_data.set('CONFIG_STATX', has_statx)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01002180config_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id)
Paolo Bonzinib1def332020-11-17 13:37:39 +01002181config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01002182config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01002183config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002184config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
Marc-André Lureauddece462021-10-06 14:18:09 +04002185if spice_protocol.found()
2186config_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
2187config_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
2188config_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
2189endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002190config_host_data.set('CONFIG_SPICE', spice.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01002191config_host_data.set('CONFIG_X11', x11.found())
Marc-André Lureau142ca622021-07-15 11:53:53 +04002192config_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
Daniele Buono9e62ba42020-12-04 18:06:14 -05002193config_host_data.set('CONFIG_CFI', get_option('cfi'))
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06002194config_host_data.set('CONFIG_SELINUX', selinux.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002195config_host_data.set('CONFIG_XEN_BACKEND', xen.found())
Ilya Leoshkevich7c10cb32023-01-12 16:20:12 +01002196config_host_data.set('CONFIG_LIBDW', libdw.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002197if xen.found()
2198 # protect from xen.version() having less than three components
2199 xen_version = xen.version().split('.') + ['0', '0']
2200 xen_ctrl_version = xen_version[0] + \
2201 ('0' + xen_version[1]).substring(-2) + \
2202 ('0' + xen_version[2]).substring(-2)
2203 config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
2204endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002205config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
2206config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
2207config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
2208config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
2209
Paolo Bonzinia6305082021-10-07 15:08:15 +02002210config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002211config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
2212
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002213have_coroutine_pool = get_option('coroutine_pool')
2214if get_option('debug_stack_usage') and have_coroutine_pool
2215 message('Disabling coroutine pool to measure stack usage')
2216 have_coroutine_pool = false
2217endif
2218config_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool)
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04002219config_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002220config_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
Paolo Bonzini728c0a22021-10-13 11:52:03 +02002221config_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002222config_host_data.set('CONFIG_GPROF', get_option('gprof'))
Paolo Bonzini406523f2021-10-13 11:43:54 +02002223config_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02002224config_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
Juan Quintelaabad1852022-09-02 18:51:25 +02002225config_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
Paolo Bonzini406523f2021-10-13 11:43:54 +02002226
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002227# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002228config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002229config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
2230config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
Thomas Huth48f670e2020-11-18 18:10:52 +01002231config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01002232config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01002233config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002234config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01002235config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01002236config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Bin Mengd4093732022-08-02 15:51:58 +08002237if targetos == 'windows'
2238 config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
2239endif
Thomas Huthded5d782020-11-14 11:10:11 +01002240
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002241# has_function
Claudio Imbrendac891c242022-08-12 15:34:53 +02002242config_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002243config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002244config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
2245config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
2246config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
2247config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Peter Maydell86983432022-02-26 18:07:19 +00002248# Note that we need to specify prefix: here to avoid incorrectly
2249# thinking that Windows has posix_memalign()
2250config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
Peter Maydell5c8c7142022-02-26 18:07:20 +00002251config_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
Peter Maydell88454f82022-02-26 18:07:21 +00002252config_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
2253config_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002254config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002255config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Keno Fischer029ed1b2022-02-27 17:35:20 -05002256config_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002257config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
2258config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
2259config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
2260config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
2261config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002262config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Andrew Deason59e35c72022-04-26 14:55:22 -05002263config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02002264config_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice)
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002265config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002266config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02002267config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Stefano Garzarella66dc5f92022-05-17 09:10:12 +02002268if rbd.found()
2269 config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
2270 cc.has_function('rbd_namespace_exists',
2271 dependencies: rbd,
2272 prefix: '#include <rbd/librbd.h>'))
2273endif
Li Zhijian911965a2021-09-10 15:02:55 +08002274if rdma.found()
2275 config_host_data.set('HAVE_IBV_ADVISE_MR',
2276 cc.has_function('ibv_advise_mr',
Paolo Bonzini3730a732022-04-20 17:33:41 +02002277 dependencies: rdma,
Li Zhijian911965a2021-09-10 15:02:55 +08002278 prefix: '#include <infiniband/verbs.h>'))
2279endif
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002280
Paolo Bonzini34f983d2023-01-09 15:31:51 +01002281have_asan_fiber = false
2282if get_option('sanitizers') and \
2283 not cc.has_function('__sanitizer_start_switch_fiber',
2284 args: '-fsanitize=address',
2285 prefix: '#include <sanitizer/asan_interface.h>')
2286 warning('Missing ASAN due to missing fiber annotation interface')
2287 warning('Without code annotation, the report may be inferior.')
2288else
2289 have_asan_fiber = true
2290endif
2291config_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber)
2292
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002293# has_header_symbol
Sam Li6d43eaa2023-05-08 12:55:28 +08002294config_host_data.set('CONFIG_BLKZONED',
2295 cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002296config_host_data.set('CONFIG_EPOLL_CREATE1',
2297 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
2298config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
2299 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
2300 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
2301config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
2302 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
2303config_host_data.set('CONFIG_FIEMAP',
2304 cc.has_header('linux/fiemap.h') and
2305 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002306config_host_data.set('CONFIG_GETRANDOM',
2307 cc.has_function('getrandom') and
2308 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002309config_host_data.set('CONFIG_INOTIFY',
2310 cc.has_header_symbol('sys/inotify.h', 'inotify_init'))
2311config_host_data.set('CONFIG_INOTIFY1',
2312 cc.has_header_symbol('sys/inotify.h', 'inotify_init1'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002313config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
2314 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002315config_host_data.set('CONFIG_RTNETLINK',
2316 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
2317config_host_data.set('CONFIG_SYSMACROS',
2318 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002319config_host_data.set('HAVE_OPTRESET',
2320 cc.has_header_symbol('getopt.h', 'optreset'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04002321config_host_data.set('HAVE_IPPROTO_MPTCP',
2322 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002323
2324# has_member
2325config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
2326 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
2327 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002328config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
2329 cc.has_member('struct stat', 'st_atim',
2330 prefix: '#include <sys/stat.h>'))
Sam Li6d43eaa2023-05-08 12:55:28 +08002331config_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY',
2332 cc.has_member('struct blk_zone', 'capacity',
2333 prefix: '#include <linux/blkzoned.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002334
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002335# has_type
2336config_host_data.set('CONFIG_IOVEC',
2337 cc.has_type('struct iovec',
2338 prefix: '#include <sys/uio.h>'))
2339config_host_data.set('HAVE_UTMPX',
2340 cc.has_type('struct utmpx',
2341 prefix: '#include <utmpx.h>'))
2342
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002343config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002344 #include <sys/eventfd.h>
2345 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002346config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002347 #include <unistd.h>
2348 int main(void) {
2349 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2350 return fdatasync(0);
2351 #else
2352 #error Not supported
2353 #endif
2354 }'''))
Andrew Deason8900c202022-03-15 22:52:25 -05002355
2356has_madvise = cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002357 #include <sys/types.h>
2358 #include <sys/mman.h>
2359 #include <stddef.h>
Andrew Deason8900c202022-03-15 22:52:25 -05002360 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
2361missing_madvise_proto = false
2362if has_madvise
2363 # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
2364 # but forget to prototype it. In this case, has_madvise will be true (the
2365 # test program links despite a compile warning). To detect the
2366 # missing-prototype case, we try again with a definitely-bogus prototype.
2367 # This will only compile if the system headers don't provide the prototype;
2368 # otherwise the conflicting prototypes will cause a compiler error.
2369 missing_madvise_proto = cc.links(gnu_source_prefix + '''
2370 #include <sys/types.h>
2371 #include <sys/mman.h>
2372 #include <stddef.h>
2373 extern int madvise(int);
2374 int main(void) { return madvise(0); }''')
2375endif
2376config_host_data.set('CONFIG_MADVISE', has_madvise)
2377config_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
2378
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002379config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002380 #include <sys/mman.h>
2381 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002382config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002383 #include <fcntl.h>
2384 #if !defined(AT_EMPTY_PATH)
2385 # error missing definition
2386 #else
2387 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2388 #endif'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002389config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002390 #include <sys/mman.h>
2391 #include <stddef.h>
2392 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002393
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002394config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002395 #include <pthread.h>
2396
2397 static void *f(void *p) { return NULL; }
2398 int main(void)
2399 {
2400 pthread_t thread;
2401 pthread_create(&thread, 0, f, 0);
2402 pthread_setname_np(thread, "QEMU");
2403 return 0;
2404 }''', dependencies: threads))
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002405config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002406 #include <pthread.h>
2407
2408 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
2409 int main(void)
2410 {
2411 pthread_t thread;
2412 pthread_create(&thread, 0, f, 0);
2413 return 0;
2414 }''', dependencies: threads))
Brad Smith3ada67a2022-12-18 03:22:04 -05002415config_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + '''
2416 #include <pthread.h>
2417 #include <pthread_np.h>
2418
2419 static void *f(void *p) { return NULL; }
2420 int main(void)
2421 {
2422 pthread_t thread;
2423 pthread_create(&thread, 0, f, 0);
2424 pthread_set_name_np(thread, "QEMU");
2425 return 0;
2426 }''', dependencies: threads))
Longpeng(Mike)657ac982022-02-22 17:05:05 +08002427config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
2428 #include <pthread.h>
2429 #include <time.h>
2430
2431 int main(void)
2432 {
2433 pthread_condattr_t attr
2434 pthread_condattr_init(&attr);
2435 pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2436 return 0;
2437 }''', dependencies: threads))
David Hildenbrand7730f322022-10-14 15:47:15 +02002438config_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + '''
2439 #include <pthread.h>
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002440
David Hildenbrand7730f322022-10-14 15:47:15 +02002441 static void *f(void *p) { return NULL; }
2442 int main(void)
2443 {
2444 int setsize = CPU_ALLOC_SIZE(64);
2445 pthread_t thread;
2446 cpu_set_t *cpuset;
2447 pthread_create(&thread, 0, f, 0);
2448 cpuset = CPU_ALLOC(64);
2449 CPU_ZERO_S(setsize, cpuset);
2450 pthread_setaffinity_np(thread, setsize, cpuset);
2451 pthread_getaffinity_np(thread, setsize, cpuset);
2452 CPU_FREE(cpuset);
2453 return 0;
2454 }''', dependencies: threads))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002455config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02002456 #include <sys/signalfd.h>
2457 #include <stddef.h>
2458 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002459config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002460 #include <unistd.h>
2461 #include <fcntl.h>
2462 #include <limits.h>
2463
2464 int main(void)
2465 {
2466 int len, fd = 0;
2467 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2468 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2469 return 0;
2470 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002471
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002472config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
2473 #include <sys/mman.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002474 int main(void) {
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002475 return mlockall(MCL_FUTURE);
2476 }'''))
2477
Thomas Hutheea94532021-10-28 20:59:08 +02002478have_l2tpv3 = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002479if get_option('l2tpv3').allowed() and have_system
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002480 have_l2tpv3 = cc.has_type('struct mmsghdr',
2481 prefix: gnu_source_prefix + '''
2482 #include <sys/socket.h>
2483 #include <linux/ip.h>''')
Thomas Hutheea94532021-10-28 20:59:08 +02002484endif
2485config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2486
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002487have_netmap = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002488if get_option('netmap').allowed() and have_system
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002489 have_netmap = cc.compiles('''
2490 #include <inttypes.h>
2491 #include <net/if.h>
2492 #include <net/netmap.h>
2493 #include <net/netmap_user.h>
2494 #if (NETMAP_API < 11) || (NETMAP_API > 15)
2495 #error
2496 #endif
2497 int main(void) { return 0; }''')
2498 if not have_netmap and get_option('netmap').enabled()
2499 error('Netmap headers not available')
2500 endif
2501endif
2502config_host_data.set('CONFIG_NETMAP', have_netmap)
2503
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002504# Work around a system header bug with some kernel/XFS header
2505# versions where they both try to define 'struct fsxattr':
2506# xfs headers will not try to redefine structs from linux headers
2507# if this macro is set.
2508config_host_data.set('HAVE_FSXATTR', cc.links('''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002509 #include <linux/fs.h>
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002510 struct fsxattr foo;
2511 int main(void) {
2512 return 0;
2513 }'''))
2514
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002515# Some versions of Mac OS X incorrectly define SIZE_MAX
2516config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2517 #include <stdint.h>
2518 #include <stdio.h>
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002519 int main(void) {
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002520 return printf("%zu", SIZE_MAX);
2521 }''', args: ['-Werror']))
2522
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002523# See if 64-bit atomic operations are supported.
2524# Note that without __atomic builtins, we can only
2525# assume atomic loads/stores max at pointer size.
2526config_host_data.set('CONFIG_ATOMIC64', cc.links('''
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002527 #include <stdint.h>
2528 int main(void)
2529 {
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002530 uint64_t x = 0, y = 0;
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002531 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
2532 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
2533 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2534 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2535 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2536 return 0;
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002537 }'''))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002538
Marc-André Lureau848126d2022-02-28 15:49:19 +04002539has_int128 = cc.links('''
2540 __int128_t a;
2541 __uint128_t b;
2542 int main (void) {
2543 a = a + b;
2544 b = a * b;
2545 a = a * a;
2546 return 0;
2547 }''')
2548
2549config_host_data.set('CONFIG_INT128', has_int128)
2550
2551if has_int128
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002552 # "do we have 128-bit atomics which are handled inline and specifically not
2553 # via libatomic". The reason we can't use libatomic is documented in the
2554 # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002555 # We only care about these operations on 16-byte aligned pointers, so
2556 # force 16-byte alignment of the pointer, which may be greater than
2557 # __alignof(unsigned __int128) for the host.
2558 atomic_test_128 = '''
2559 int main(int ac, char **av) {
2560 unsigned __int128 *p = __builtin_assume_aligned(av[ac - 1], sizeof(16));
2561 p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED);
2562 __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED);
2563 __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2564 return 0;
2565 }'''
2566 has_atomic128 = cc.links(atomic_test_128)
Marc-André Lureau848126d2022-02-28 15:49:19 +04002567
2568 config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
2569
2570 if not has_atomic128
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002571 # Even with __builtin_assume_aligned, the above test may have failed
2572 # without optimization enabled. Try again with optimizations locally
2573 # enabled for the function. See
2574 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389
2575 has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128)
2576 config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt)
Marc-André Lureau848126d2022-02-28 15:49:19 +04002577
Richard Hendersone61f1ef2022-11-05 11:34:58 +00002578 if not has_atomic128_opt
2579 config_host_data.set('CONFIG_CMPXCHG128', cc.links('''
2580 int main(void)
2581 {
2582 unsigned __int128 x = 0, y = 0;
2583 __sync_val_compare_and_swap_16(&x, y, x);
2584 return 0;
2585 }
2586 '''))
2587 endif
Marc-André Lureau848126d2022-02-28 15:49:19 +04002588 endif
2589endif
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002590
2591config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
2592 #include <sys/auxv.h>
2593 int main(void) {
2594 return getauxval(AT_HWCAP) == 0;
2595 }'''))
2596
Paolo Bonzini0dae95d2022-04-20 17:33:43 +02002597config_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
2598 #include <linux/usbdevice_fs.h>
2599
2600 #ifndef USBDEVFS_GET_CAPABILITIES
2601 #error "USBDEVFS_GET_CAPABILITIES undefined"
2602 #endif
2603
2604 #ifndef USBDEVFS_DISCONNECT_CLAIM
2605 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
2606 #endif
2607
2608 int main(void) { return 0; }'''))
2609
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02002610have_keyring = get_option('keyring') \
2611 .require(targetos == 'linux', error_message: 'keyring is only available on Linux') \
2612 .require(cc.compiles('''
2613 #include <errno.h>
2614 #include <asm/unistd.h>
2615 #include <linux/keyctl.h>
2616 #include <sys/syscall.h>
2617 #include <unistd.h>
2618 int main(void) {
2619 return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
2620 }'''), error_message: 'keyctl syscall not available on this system').allowed()
2621config_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
2622
Paolo Bonzini622753d2021-11-08 13:38:58 +01002623have_cpuid_h = cc.links('''
2624 #include <cpuid.h>
2625 int main(void) {
2626 unsigned a, b, c, d;
2627 unsigned max = __get_cpuid_max(0, 0);
2628
2629 if (max >= 1) {
2630 __cpuid(1, a, b, c, d);
2631 }
2632
2633 if (max >= 7) {
2634 __cpuid_count(7, 0, a, b, c, d);
2635 }
2636
2637 return 0;
2638 }''')
2639config_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
2640
2641config_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
2642 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
2643 .require(cc.links('''
Paolo Bonzini622753d2021-11-08 13:38:58 +01002644 #include <cpuid.h>
2645 #include <immintrin.h>
Richard Henderson701ea582022-12-03 19:31:12 -06002646 static int __attribute__((target("avx2"))) bar(void *a) {
Paolo Bonzini622753d2021-11-08 13:38:58 +01002647 __m256i x = *(__m256i *)a;
2648 return _mm256_testz_si256(x, x);
2649 }
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002650 int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
Paolo Bonzini622753d2021-11-08 13:38:58 +01002651 '''), error_message: 'AVX2 not available').allowed())
2652
2653config_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \
2654 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \
2655 .require(cc.links('''
Paolo Bonzini622753d2021-11-08 13:38:58 +01002656 #include <cpuid.h>
2657 #include <immintrin.h>
Richard Henderson701ea582022-12-03 19:31:12 -06002658 static int __attribute__((target("avx512f"))) bar(void *a) {
Paolo Bonzini622753d2021-11-08 13:38:58 +01002659 __m512i x = *(__m512i *)a;
2660 return _mm512_test_epi64_mask(x, x);
2661 }
Paolo Bonzinib5d3dac2022-11-03 18:19:18 +01002662 int main(int argc, char *argv[]) { return bar(argv[argc - 1]); }
Paolo Bonzini622753d2021-11-08 13:38:58 +01002663 '''), error_message: 'AVX512F not available').allowed())
2664
ling xu04ffce12022-11-16 23:29:22 +08002665config_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \
2666 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \
2667 .require(cc.links('''
ling xu04ffce12022-11-16 23:29:22 +08002668 #include <cpuid.h>
2669 #include <immintrin.h>
Richard Hendersondc165fc2023-05-01 22:05:55 +01002670 static int __attribute__((target("avx512bw"))) bar(void *a) {
ling xu04ffce12022-11-16 23:29:22 +08002671 __m512i *x = a;
2672 __m512i res= _mm512_abs_epi8(*x);
2673 return res[1];
2674 }
2675 int main(int argc, char *argv[]) { return bar(argv[0]); }
2676 '''), error_message: 'AVX512BW not available').allowed())
2677
Paolo Bonzini3730a732022-04-20 17:33:41 +02002678have_pvrdma = get_option('pvrdma') \
2679 .require(rdma.found(), error_message: 'PVRDMA requires OpenFabrics libraries') \
Juan Quintela354d2d92022-05-02 15:11:19 +02002680 .require(cc.compiles(gnu_source_prefix + '''
2681 #include <sys/mman.h>
Paolo Bonzini3730a732022-04-20 17:33:41 +02002682 int main(void)
2683 {
2684 char buf = 0;
2685 void *addr = &buf;
2686 addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
2687
2688 return 0;
2689 }'''), error_message: 'PVRDMA requires mremap').allowed()
2690
2691if have_pvrdma
Juan Quintela354d2d92022-05-02 15:11:19 +02002692 config_host_data.set('LEGACY_RDMA_REG_MR', not cc.links('''
Paolo Bonzini3730a732022-04-20 17:33:41 +02002693 #include <infiniband/verbs.h>
2694 int main(void)
2695 {
2696 struct ibv_mr *mr;
2697 struct ibv_pd *pd = NULL;
2698 size_t length = 10;
2699 uint64_t iova = 0;
2700 int access = 0;
2701 void *addr = NULL;
2702
2703 mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
2704 ibv_dereg_mr(mr);
2705 return 0;
2706 }'''))
2707endif
2708
Paolo Bonzinib87df902021-11-08 13:52:11 +01002709if get_option('membarrier').disabled()
2710 have_membarrier = false
2711elif targetos == 'windows'
2712 have_membarrier = true
2713elif targetos == 'linux'
2714 have_membarrier = cc.compiles('''
2715 #include <linux/membarrier.h>
2716 #include <sys/syscall.h>
2717 #include <unistd.h>
2718 #include <stdlib.h>
2719 int main(void) {
2720 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
2721 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
2722 exit(0);
2723 }''')
2724endif
2725config_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
2726 .require(have_membarrier, error_message: 'membarrier system call not available') \
2727 .allowed())
2728
Paolo Bonzini34b52612021-11-08 14:02:42 +01002729have_afalg = get_option('crypto_afalg') \
2730 .require(cc.compiles(gnu_source_prefix + '''
2731 #include <errno.h>
2732 #include <sys/types.h>
2733 #include <sys/socket.h>
2734 #include <linux/if_alg.h>
2735 int main(void) {
2736 int sock;
2737 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
2738 return sock;
2739 }
2740 '''), error_message: 'AF_ALG requested but could not be detected').allowed()
2741config_host_data.set('CONFIG_AF_ALG', have_afalg)
2742
Marc-André Lureau9d734b82022-04-01 15:50:05 +04002743config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
2744 'linux/vm_sockets.h', 'AF_VSOCK',
2745 prefix: '#include <sys/socket.h>',
2746))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002747
Marc-André Lureau8821a382022-02-01 16:53:43 +04002748have_vss = false
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002749have_vss_sdk = false # old xp/2003 SDK
Marc-André Lureau8821a382022-02-01 16:53:43 +04002750if targetos == 'windows' and link_language == 'cpp'
2751 have_vss = cxx.compiles('''
2752 #define __MIDL_user_allocate_free_DEFINED__
Marc-André Lureau32478cb2022-02-22 23:40:01 +04002753 #include <vss.h>
Marc-André Lureau8821a382022-02-01 16:53:43 +04002754 int main(void) { return VSS_CTX_BACKUP; }''')
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002755 have_vss_sdk = cxx.has_header('vscoordint.h')
Marc-André Lureau8821a382022-02-01 16:53:43 +04002756endif
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002757config_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
Marc-André Lureau8821a382022-02-01 16:53:43 +04002758
Paolo Bonzini859aef02020-08-04 18:14:26 +02002759foreach k, v: config_host
Paolo Bonzinice6119d2022-04-20 17:33:55 +02002760 if k.startswith('CONFIG_')
Paolo Bonzini859aef02020-08-04 18:14:26 +02002761 config_host_data.set(k, v == 'y' ? 1 : v)
2762 endif
2763endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02002764
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 Bonzini05512f52020-09-16 15:31:11 -04002803config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04002804config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002805config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002806config_devices_mak_list = []
2807config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02002808config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002809config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002810
2811disassemblers = {
2812 'alpha' : ['CONFIG_ALPHA_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002813 'avr' : ['CONFIG_AVR_DIS'],
2814 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06002815 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002816 'hppa' : ['CONFIG_HPPA_DIS'],
2817 'i386' : ['CONFIG_I386_DIS'],
2818 'x86_64' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002819 'm68k' : ['CONFIG_M68K_DIS'],
2820 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
2821 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002822 'nios2' : ['CONFIG_NIOS2_DIS'],
2823 'or1k' : ['CONFIG_OPENRISC_DIS'],
2824 'ppc' : ['CONFIG_PPC_DIS'],
2825 'riscv' : ['CONFIG_RISCV_DIS'],
2826 'rx' : ['CONFIG_RX_DIS'],
2827 's390' : ['CONFIG_S390_DIS'],
2828 'sh4' : ['CONFIG_SH4_DIS'],
2829 'sparc' : ['CONFIG_SPARC_DIS'],
2830 'xtensa' : ['CONFIG_XTENSA_DIS'],
Song Gaoaae17462022-06-06 20:43:06 +08002831 'loongarch' : ['CONFIG_LOONGARCH_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002832}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002833
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002834have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01002835host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02002836 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002837 (have_tpm ? ['CONFIG_TPM=y'] : []) + \
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002838 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02002839 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002840 (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01002841 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02002842 (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
2843 (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
2844 (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01002845 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01002846 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
Paolo Bonzini3730a732022-04-20 17:33:41 +02002847 (have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \
Jagannathan Raman55116962022-06-13 16:26:24 -04002848 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
2849 (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01002850
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002851ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002852
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002853default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
2854actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002855fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002856foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04002857 config_target = { 'TARGET_NAME': target.split('-')[0] }
2858 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002859 if targetos != 'linux'
2860 if default_targets
2861 continue
2862 endif
2863 error('Target @0@ is only available on a Linux host'.format(target))
2864 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04002865 config_target += { 'CONFIG_LINUX_USER': 'y' }
2866 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002867 if 'CONFIG_BSD' not in config_host
2868 if default_targets
2869 continue
2870 endif
2871 error('Target @0@ is only available on a BSD host'.format(target))
2872 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04002873 config_target += { 'CONFIG_BSD_USER': 'y' }
2874 elif target.endswith('softmmu')
2875 config_target += { 'CONFIG_SOFTMMU': 'y' }
2876 endif
2877 if target.endswith('-user')
2878 config_target += {
2879 'CONFIG_USER_ONLY': 'y',
2880 'CONFIG_QEMU_INTERP_PREFIX':
Paolo Bonzinice6119d2022-04-20 17:33:55 +02002881 get_option('interp_prefix').replace('%M', config_target['TARGET_NAME'])
Paolo Bonzini765686d2020-09-18 06:37:21 -04002882 }
2883 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002884
Paolo Bonzini0a189112020-11-17 14:58:32 +01002885 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04002886 foreach sym: accelerators
2887 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
2888 config_target += { sym: 'y' }
2889 config_all += { sym: 'y' }
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002890 if target in modular_tcg
2891 config_target += { 'CONFIG_TCG_MODULAR': 'y' }
2892 else
2893 config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
2894 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01002895 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04002896 endif
2897 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01002898 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002899 if default_targets
2900 continue
2901 endif
2902 error('No accelerator available for target @0@'.format(target))
2903 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04002904
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002905 actual_target_dirs += target
Alex Bennée812b31d2021-07-07 14:17:43 +01002906 config_target += keyval.load('configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002907 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04002908
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002909 if 'TARGET_NEED_FDT' in config_target
2910 fdt_required += target
2911 endif
2912
Paolo Bonzinifa731682020-09-21 05:19:07 -04002913 # Add default keys
2914 if 'TARGET_BASE_ARCH' not in config_target
2915 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
2916 endif
2917 if 'TARGET_ABI_DIR' not in config_target
2918 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
2919 endif
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04002920 if 'TARGET_BIG_ENDIAN' not in config_target
2921 config_target += {'TARGET_BIG_ENDIAN': 'n'}
2922 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002923
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002924 foreach k, v: disassemblers
Paolo Bonzini823eb012021-11-08 14:18:17 +01002925 if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002926 foreach sym: v
2927 config_target += { sym: 'y' }
2928 config_all_disas += { sym: 'y' }
2929 endforeach
2930 endif
2931 endforeach
2932
Paolo Bonzini859aef02020-08-04 18:14:26 +02002933 config_target_data = configuration_data()
2934 foreach k, v: config_target
2935 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
2936 # do nothing
2937 elif ignored.contains(k)
2938 # do nothing
2939 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002940 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
2941 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02002942 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04002943 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02002944 config_target_data.set_quoted(k, v)
2945 elif v == 'y'
2946 config_target_data.set(k, 1)
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04002947 elif v == 'n'
2948 config_target_data.set(k, 0)
Paolo Bonzini859aef02020-08-04 18:14:26 +02002949 else
2950 config_target_data.set(k, v)
2951 endif
2952 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01002953 config_target_data.set('QEMU_ARCH',
2954 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02002955 config_target_h += {target: configure_file(output: target + '-config-target.h',
2956 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002957
2958 if target.endswith('-softmmu')
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01002959 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002960 config_devices_mak = target + '-config-devices.mak'
2961 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01002962 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01002963 output: config_devices_mak,
2964 depfile: config_devices_mak + '.d',
2965 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01002966 command: [minikconf,
2967 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01002968 config_devices_mak, '@DEPFILE@', '@INPUT@',
Philippe Mathieu-Daudéf4063f92021-07-07 14:17:40 +01002969 host_kconfig, accel_kconfig,
2970 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'])
Paolo Bonzini859aef02020-08-04 18:14:26 +02002971
2972 config_devices_data = configuration_data()
2973 config_devices = keyval.load(config_devices_mak)
2974 foreach k, v: config_devices
2975 config_devices_data.set(k, 1)
2976 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002977 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02002978 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
2979 configuration: config_devices_data)}
2980 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04002981 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01002982 endif
2983 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002984endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002985target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002986
Paolo Bonzini2becc362020-02-03 11:42:03 +01002987# This configuration is used to build files that are shared by
2988# multiple binaries, and then extracted out of the "common"
2989# static_library target.
2990#
2991# We do not use all_sources()/all_dependencies(), because it would
2992# build literally all source files, including devices only used by
2993# targets that are not built for this compilation. The CONFIG_ALL
2994# pseudo symbol replaces it.
2995
Paolo Bonzini05512f52020-09-16 15:31:11 -04002996config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01002997config_all += config_host
2998config_all += config_all_disas
2999config_all += {
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02003000 'CONFIG_XEN': xen.found(),
Paolo Bonzini2becc362020-02-03 11:42:03 +01003001 'CONFIG_SOFTMMU': have_system,
3002 'CONFIG_USER_ONLY': have_user,
3003 'CONFIG_ALL': true,
3004}
3005
Paolo Bonzinieed56e92021-11-10 11:01:26 +01003006target_configs_h = []
3007foreach target: target_dirs
3008 target_configs_h += config_target_h[target]
3009 target_configs_h += config_devices_h.get(target, [])
3010endforeach
3011genh += custom_target('config-poison.h',
3012 input: [target_configs_h],
3013 output: 'config-poison.h',
3014 capture: true,
3015 command: [find_program('scripts/make-config-poison.sh'),
3016 target_configs_h])
3017
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003018##############
3019# Submodules #
3020##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003021
3022capstone = not_found
Thomas Huth83602082022-05-16 16:58:23 +02003023if not get_option('capstone').auto() or have_system or have_user
Thomas Huth43ecd162022-05-16 16:58:22 +02003024 capstone = dependency('capstone', version: '>=3.0.5',
Paolo Bonzini063d5112022-07-14 14:56:58 +02003025 method: 'pkg-config',
Thomas Huth83602082022-05-16 16:58:23 +02003026 required: get_option('capstone'))
Daniel P. Berrangé8f4aea72021-07-09 15:29:31 +01003027
3028 # Some versions of capstone have broken pkg-config file
3029 # that reports a wrong -I path, causing the #include to
3030 # fail later. If the system has such a broken version
3031 # do not use it.
3032 if capstone.found() and not cc.compiles('#include <capstone.h>',
3033 dependencies: [capstone])
3034 capstone = not_found
Thomas Huth83602082022-05-16 16:58:23 +02003035 if get_option('capstone').enabled()
3036 error('capstone requested, but it does not appear to work')
Daniel P. Berrangé8f4aea72021-07-09 15:29:31 +01003037 endif
3038 endif
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003039endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02003040
Jagannathan Raman55116962022-06-13 16:26:24 -04003041libvfio_user_dep = not_found
3042if have_system and vfio_user_server_allowed
3043 have_internal = fs.exists(meson.current_source_dir() / 'subprojects/libvfio-user/meson.build')
3044
3045 if not have_internal
3046 error('libvfio-user source not found - please pull git submodule')
3047 endif
3048
3049 libvfio_user_proj = subproject('libvfio-user')
3050
Paolo Bonzini53283532023-03-30 12:47:23 +02003051 libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
Jagannathan Raman55116962022-06-13 16:26:24 -04003052endif
3053
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003054fdt = not_found
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003055if have_system
Philippe Mathieu-Daudéc593d842022-02-08 11:19:46 +01003056 fdt_opt = get_option('fdt')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003057 if fdt_opt in ['enabled', 'auto', 'system']
3058 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
Paolo Bonzini063d5112022-07-14 14:56:58 +02003059 fdt = cc.find_library('fdt',
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003060 required: fdt_opt == 'system' or
3061 fdt_opt == 'enabled' and not have_internal)
3062 if fdt.found() and cc.links('''
3063 #include <libfdt.h>
3064 #include <libfdt_env.h>
Thomas Huthde47b0f2022-01-18 18:05:48 +01003065 int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003066 dependencies: fdt)
3067 fdt_opt = 'system'
Thomas Huth6c228532021-08-27 14:09:00 +02003068 elif fdt_opt == 'system'
3069 error('system libfdt requested, but it is too old (1.5.1 or newer required)')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003070 elif have_internal
3071 fdt_opt = 'internal'
3072 else
3073 fdt_opt = 'disabled'
Thomas Huth87daf892021-08-27 14:08:59 +02003074 fdt = not_found
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003075 endif
3076 endif
3077 if fdt_opt == 'internal'
3078 fdt_files = files(
3079 'dtc/libfdt/fdt.c',
3080 'dtc/libfdt/fdt_ro.c',
3081 'dtc/libfdt/fdt_wip.c',
3082 'dtc/libfdt/fdt_sw.c',
3083 'dtc/libfdt/fdt_rw.c',
3084 'dtc/libfdt/fdt_strerror.c',
3085 'dtc/libfdt/fdt_empty_tree.c',
3086 'dtc/libfdt/fdt_addresses.c',
3087 'dtc/libfdt/fdt_overlay.c',
3088 'dtc/libfdt/fdt_check.c',
3089 )
3090
3091 fdt_inc = include_directories('dtc/libfdt')
3092 libfdt = static_library('fdt',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01003093 build_by_default: false,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003094 sources: fdt_files,
3095 include_directories: fdt_inc)
3096 fdt = declare_dependency(link_with: libfdt,
3097 include_directories: fdt_inc)
3098 endif
Philippe Mathieu-Daudéc593d842022-02-08 11:19:46 +01003099else
3100 fdt_opt = 'disabled'
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003101endif
3102if not fdt.found() and fdt_required.length() > 0
3103 error('fdt not available but required by targets ' + ', '.join(fdt_required))
3104endif
3105
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003106config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003107config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02003108config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003109
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003110#####################
3111# Generated sources #
3112#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003113
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003114genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003115
Marc-André Lureau3f885652019-07-15 18:06:04 +04003116hxtool = find_program('scripts/hxtool')
Marc-André Lureaue2c40122023-01-24 18:00:57 +00003117shaderinclude = find_program('scripts/shaderinclude.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003118qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003119qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
3120 meson.current_source_dir() / 'scripts/qapi/commands.py',
3121 meson.current_source_dir() / 'scripts/qapi/common.py',
3122 meson.current_source_dir() / 'scripts/qapi/error.py',
3123 meson.current_source_dir() / 'scripts/qapi/events.py',
3124 meson.current_source_dir() / 'scripts/qapi/expr.py',
3125 meson.current_source_dir() / 'scripts/qapi/gen.py',
3126 meson.current_source_dir() / 'scripts/qapi/introspect.py',
Markus Armbruster88d357d2023-04-28 12:54:16 +02003127 meson.current_source_dir() / 'scripts/qapi/main.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003128 meson.current_source_dir() / 'scripts/qapi/parser.py',
3129 meson.current_source_dir() / 'scripts/qapi/schema.py',
3130 meson.current_source_dir() / 'scripts/qapi/source.py',
3131 meson.current_source_dir() / 'scripts/qapi/types.py',
3132 meson.current_source_dir() / 'scripts/qapi/visit.py',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003133 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003134]
3135
3136tracetool = [
3137 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003138 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003139]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003140tracetool_depends = files(
3141 'scripts/tracetool/backend/log.py',
3142 'scripts/tracetool/backend/__init__.py',
3143 'scripts/tracetool/backend/dtrace.py',
3144 'scripts/tracetool/backend/ftrace.py',
3145 'scripts/tracetool/backend/simple.py',
3146 'scripts/tracetool/backend/syslog.py',
3147 'scripts/tracetool/backend/ust.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003148 'scripts/tracetool/format/ust_events_c.py',
3149 'scripts/tracetool/format/ust_events_h.py',
3150 'scripts/tracetool/format/__init__.py',
3151 'scripts/tracetool/format/d.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003152 'scripts/tracetool/format/simpletrace_stap.py',
3153 'scripts/tracetool/format/c.py',
3154 'scripts/tracetool/format/h.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003155 'scripts/tracetool/format/log_stap.py',
3156 'scripts/tracetool/format/stap.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003157 'scripts/tracetool/__init__.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003158 'scripts/tracetool/vcpu.py'
3159)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003160
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003161qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
3162 meson.current_source_dir(),
Paolo Bonzinib0b43232022-04-20 17:33:54 +02003163 get_option('pkgversion'), meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04003164qemu_version = custom_target('qemu-version.h',
3165 output: 'qemu-version.h',
3166 command: qemu_version_cmd,
3167 capture: true,
3168 build_by_default: true,
3169 build_always_stale: true)
3170genh += qemu_version
3171
Marc-André Lureau3f885652019-07-15 18:06:04 +04003172hxdep = []
3173hx_headers = [
3174 ['qemu-options.hx', 'qemu-options.def'],
3175 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
3176]
3177if have_system
3178 hx_headers += [
3179 ['hmp-commands.hx', 'hmp-commands.h'],
3180 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
3181 ]
3182endif
3183foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003184 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04003185 input: files(d[0]),
3186 output: d[1],
3187 capture: true,
3188 build_by_default: true, # to be removed when added to a target
3189 command: [hxtool, '-h', '@INPUT0@'])
3190endforeach
3191genh += hxdep
3192
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003193###################
3194# Collect sources #
3195###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003196
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003197authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02003198blockdev_ss = ss.source_set()
3199block_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003200chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02003201common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003202crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02003203hwcore_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003204io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02003205qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02003206qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02003207softmmu_ss = ss.source_set()
3208specific_fuzz_ss = ss.source_set()
3209specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003210stub_ss = ss.source_set()
3211trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003212user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02003213util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003214
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003215# accel modules
3216qtest_module_ss = ss.source_set()
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02003217tcg_module_ss = ss.source_set()
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003218
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003219modules = {}
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003220target_modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003221hw_arch = {}
3222target_arch = {}
3223target_softmmu_arch = {}
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02003224target_user_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003225
3226###############
3227# Trace files #
3228###############
3229
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003230# TODO: add each directory to the subdirs from its own meson.build, once
3231# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003232trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003233 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003234 'qapi',
3235 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003236 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01003237 'util',
Alex Bennée842b42d2022-09-29 12:42:22 +01003238 'gdbstub',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003239]
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003240if have_linux_user
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003241 trace_events_subdirs += [ 'linux-user' ]
3242endif
Warner Losh6ddc1ab2022-01-08 17:37:23 -07003243if have_bsd_user
3244 trace_events_subdirs += [ 'bsd-user' ]
3245endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003246if have_block
3247 trace_events_subdirs += [
3248 'authz',
3249 'block',
3250 'io',
3251 'nbd',
3252 'scsi',
3253 ]
3254endif
3255if have_system
3256 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003257 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003258 'audio',
3259 'backends',
3260 'backends/tpm',
3261 'chardev',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003262 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003263 'hw/9pfs',
3264 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08003265 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003266 'hw/alpha',
3267 'hw/arm',
3268 'hw/audio',
3269 'hw/block',
3270 'hw/block/dataplane',
3271 'hw/char',
3272 'hw/display',
3273 'hw/dma',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003274 'hw/hyperv',
3275 'hw/i2c',
3276 'hw/i386',
3277 'hw/i386/xen',
David Woodhouseaa98ee32023-01-13 19:51:32 +00003278 'hw/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003279 'hw/ide',
3280 'hw/input',
3281 'hw/intc',
3282 'hw/isa',
3283 'hw/mem',
3284 'hw/mips',
3285 'hw/misc',
3286 'hw/misc/macio',
3287 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08003288 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01003289 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02003290 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003291 'hw/nvram',
3292 'hw/pci',
3293 'hw/pci-host',
3294 'hw/ppc',
3295 'hw/rdma',
3296 'hw/rdma/vmw',
3297 'hw/rtc',
3298 'hw/s390x',
3299 'hw/scsi',
3300 'hw/sd',
BALATON Zoltanad52cfc2021-10-29 23:02:09 +02003301 'hw/sh4',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003302 'hw/sparc',
3303 'hw/sparc64',
3304 'hw/ssi',
3305 'hw/timer',
3306 'hw/tpm',
3307 'hw/usb',
3308 'hw/vfio',
3309 'hw/virtio',
3310 'hw/watchdog',
3311 'hw/xen',
3312 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003313 'migration',
3314 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02003315 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003316 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05003317 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003318 ]
3319endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003320if have_system or have_user
3321 trace_events_subdirs += [
3322 'accel/tcg',
3323 'hw/core',
3324 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02003325 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003326 'target/hppa',
3327 'target/i386',
3328 'target/i386/kvm',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02003329 'target/mips/tcg',
Richard Henderson6f83e272022-02-25 21:06:20 -10003330 'target/nios2',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003331 'target/ppc',
3332 'target/riscv',
3333 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08003334 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01003335 'target/sparc',
3336 ]
3337endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003338
Marc-André Lureau0df750e2020-11-25 14:06:37 +04003339vhost_user = not_found
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003340if targetos == 'linux' and have_vhost_user
Marc-André Lureau0df750e2020-11-25 14:06:37 +04003341 libvhost_user = subproject('libvhost-user')
3342 vhost_user = libvhost_user.get_variable('vhost_user_dep')
3343endif
3344
Xie Yongjia6caeee2022-05-23 16:46:08 +08003345libvduse = not_found
3346if have_libvduse
3347 libvduse_proj = subproject('libvduse')
3348 libvduse = libvduse_proj.get_variable('libvduse_dep')
3349endif
3350
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +01003351# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
3352# that is filled in by qapi/.
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003353subdir('qapi')
3354subdir('qobject')
3355subdir('stubs')
3356subdir('trace')
3357subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04003358subdir('qom')
3359subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003360subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04003361subdir('ui')
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003362subdir('hw')
Alex Bennée842b42d2022-09-29 12:42:22 +01003363subdir('gdbstub')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003364
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003365if enable_modules
3366 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
3367 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
3368endif
3369
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003370qom_ss = qom_ss.apply(config_host, strict: false)
3371libqom = static_library('qom', qom_ss.sources() + genh,
3372 dependencies: [qom_ss.dependencies()],
3373 name_suffix: 'fa')
3374qom = declare_dependency(link_whole: libqom)
3375
3376event_loop_base = files('event-loop-base.c')
3377event_loop_base = static_library('event-loop-base', sources: event_loop_base + genh,
3378 build_by_default: true)
3379event_loop_base = declare_dependency(link_whole: event_loop_base,
3380 dependencies: [qom])
3381
Paolo Bonzini2becc362020-02-03 11:42:03 +01003382stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003383
3384util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01003385util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003386libqemuutil = static_library('qemuutil',
3387 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +02003388 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003389qemuutil = declare_dependency(link_with: libqemuutil,
Nicolas Saenz Julienne70ac26b2022-04-25 09:57:22 +02003390 sources: genh + version_res,
3391 dependencies: [event_loop_base])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003392
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01003393if have_system or have_user
3394 decodetree = generator(find_program('scripts/decodetree.py'),
3395 output: 'decode-@BASENAME@.c.inc',
3396 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3397 subdir('libdecnumber')
3398 subdir('target')
3399endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003400
Paolo Bonzini478e9432020-08-17 12:47:55 +02003401subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04003402subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04003403subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003404subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04003405subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003406
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003407if have_block
3408 block_ss.add(files(
3409 'block.c',
3410 'blockjob.c',
3411 'job.c',
3412 'qemu-io-cmds.c',
3413 ))
Paolo Bonzini406523f2021-10-13 11:43:54 +02003414 if config_host_data.get('CONFIG_REPLICATION')
3415 block_ss.add(files('replication.c'))
3416 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003417
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003418 subdir('nbd')
3419 subdir('scsi')
3420 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003421
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003422 blockdev_ss.add(files(
3423 'blockdev.c',
3424 'blockdev-nbd.c',
3425 'iothread.c',
3426 'job-qmp.c',
3427 ), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02003428
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003429 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
3430 # os-win32.c does not
3431 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
3432 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
3433endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02003434
3435common_ss.add(files('cpus-common.c'))
Philippe Mathieu-Daudé31ffa2a2022-11-24 16:34:11 +01003436specific_ss.add(files('cpu.c'))
Paolo Bonzini4a963372020-08-03 16:22:28 +02003437
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02003438subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003439
Richard Henderson44b99a62021-03-22 12:24:26 +01003440# Work around a gcc bug/misfeature wherein constant propagation looks
3441# through an alias:
3442# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
3443# to guess that a const variable is always zero. Without lto, this is
3444# impossible, as the alias is restricted to page-vary-common.c. Indeed,
3445# without lto, not even the alias is required -- we simply use different
3446# declarations in different compilation units.
3447pagevary = files('page-vary-common.c')
3448if get_option('b_lto')
3449 pagevary_flags = ['-fno-lto']
3450 if get_option('cfi')
3451 pagevary_flags += '-fno-sanitize=cfi-icall'
3452 endif
Thomas Huth54c9b192022-03-30 13:48:08 +02003453 pagevary = static_library('page-vary-common', sources: pagevary + genh,
Richard Henderson44b99a62021-03-22 12:24:26 +01003454 c_args: pagevary_flags)
3455 pagevary = declare_dependency(link_with: pagevary)
3456endif
3457common_ss.add(pagevary)
Richard Henderson6670d4d2021-03-22 12:24:24 +01003458specific_ss.add(files('page-vary.c'))
3459
Marc-André Lureauab318052019-07-24 19:23:16 +04003460subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04003461subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04003462subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003463subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04003464subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04003465subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00003466subdir('semihosting')
Markus Armbrusteraa09b3d2023-01-24 13:19:36 +01003467subdir('stats')
Richard Henderson104cc2c2021-03-08 12:04:33 -08003468subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08003469subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04003470subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003471subdir('plugins')
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003472subdir('ebpf')
3473
3474common_user_inc = []
3475
3476subdir('common-user')
Marc-André Lureaub309c322019-08-18 19:20:37 +04003477subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04003478subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003479
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003480# needed for fuzzing binaries
3481subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003482subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003483
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003484# accel modules
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02003485tcg_real_module_ss = ss.source_set()
3486tcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
3487specific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
3488target_modules += { 'accel' : { 'qtest': qtest_module_ss,
3489 'tcg': tcg_real_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003490
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003491########################
3492# Library dependencies #
3493########################
3494
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003495modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003496modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003497modinfo_files = []
3498
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003499block_mods = []
3500softmmu_mods = []
3501foreach d, list : modules
Paolo Bonzinief709862023-05-04 10:20:46 +02003502 if not (d == 'block' ? have_block : have_system)
3503 continue
3504 endif
3505
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003506 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003507 if enable_modules
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02003508 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003509 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
3510 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
3511 if d == 'block'
3512 block_mods += sl
3513 else
3514 softmmu_mods += sl
3515 endif
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003516 if module_ss.sources() != []
3517 # FIXME: Should use sl.extract_all_objects(recursive: true) as
3518 # input. Sources can be used multiple times but objects are
3519 # unique when it comes to lookup in compile_commands.json.
3520 # Depnds on a mesion version with
3521 # https://github.com/mesonbuild/meson/pull/8900
3522 modinfo_files += custom_target(d + '-' + m + '.modinfo',
3523 output: d + '-' + m + '.modinfo',
Paolo Bonziniac347112021-07-21 18:51:57 +02003524 input: module_ss.sources() + genh,
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003525 capture: true,
Paolo Bonziniac347112021-07-21 18:51:57 +02003526 command: [modinfo_collect, module_ss.sources()])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003527 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003528 else
3529 if d == 'block'
3530 block_ss.add_all(module_ss)
3531 else
3532 softmmu_ss.add_all(module_ss)
3533 endif
3534 endif
3535 endforeach
3536endforeach
3537
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003538foreach d, list : target_modules
3539 foreach m, module_ss : list
Paolo Bonzini60027112022-10-20 14:53:10 +02003540 if enable_modules
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003541 foreach target : target_dirs
3542 if target.endswith('-softmmu')
3543 config_target = config_target_mak[target]
3544 config_target += config_host
3545 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3546 c_args = ['-DNEED_CPU_H',
3547 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3548 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3549 target_module_ss = module_ss.apply(config_target, strict: false)
3550 if target_module_ss.sources() != []
3551 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3552 sl = static_library(module_name,
3553 [genh, target_module_ss.sources()],
3554 dependencies: [modulecommon, target_module_ss.dependencies()],
3555 include_directories: target_inc,
3556 c_args: c_args,
3557 pic: true)
3558 softmmu_mods += sl
3559 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
3560 modinfo_files += custom_target(module_name + '.modinfo',
3561 output: module_name + '.modinfo',
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003562 input: target_module_ss.sources() + genh,
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003563 capture: true,
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003564 command: [modinfo_collect, '--target', target, target_module_ss.sources()])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003565 endif
3566 endif
3567 endforeach
3568 else
3569 specific_ss.add_all(module_ss)
3570 endif
3571 endforeach
3572endforeach
3573
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003574if enable_modules
Jose R. Ziviani05d68142022-05-28 00:20:35 +02003575 foreach target : target_dirs
3576 if target.endswith('-softmmu')
3577 config_target = config_target_mak[target]
3578 config_devices_mak = target + '-config-devices.mak'
3579 modinfo_src = custom_target('modinfo-' + target + '.c',
3580 output: 'modinfo-' + target + '.c',
3581 input: modinfo_files,
3582 command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
3583 capture: true)
3584
3585 modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
3586 modinfo_dep = declare_dependency(link_with: modinfo_lib)
3587
3588 arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
3589 hw_arch[arch].add(modinfo_dep)
3590 endif
3591 endforeach
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003592endif
3593
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003594nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08003595undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003596block_syms = custom_target('block.syms', output: 'block.syms',
3597 input: [libqemuutil, block_mods],
3598 capture: true,
3599 command: [undefsym, nm, '@INPUT@'])
3600qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
3601 input: [libqemuutil, softmmu_mods],
3602 capture: true,
3603 command: [undefsym, nm, '@INPUT@'])
3604
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003605authz_ss = authz_ss.apply(config_host, strict: false)
3606libauthz = static_library('authz', authz_ss.sources() + genh,
3607 dependencies: [authz_ss.dependencies()],
3608 name_suffix: 'fa',
3609 build_by_default: false)
3610
3611authz = declare_dependency(link_whole: libauthz,
3612 dependencies: qom)
3613
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003614crypto_ss = crypto_ss.apply(config_host, strict: false)
3615libcrypto = static_library('crypto', crypto_ss.sources() + genh,
3616 dependencies: [crypto_ss.dependencies()],
3617 name_suffix: 'fa',
3618 build_by_default: false)
3619
3620crypto = declare_dependency(link_whole: libcrypto,
3621 dependencies: [authz, qom])
3622
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003623io_ss = io_ss.apply(config_host, strict: false)
3624libio = static_library('io', io_ss.sources() + genh,
3625 dependencies: [io_ss.dependencies()],
3626 link_with: libqemuutil,
3627 name_suffix: 'fa',
3628 build_by_default: false)
3629
3630io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
3631
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003632libmigration = static_library('migration', sources: migration_files + genh,
3633 name_suffix: 'fa',
3634 build_by_default: false)
3635migration = declare_dependency(link_with: libmigration,
3636 dependencies: [zlib, qom, io])
3637softmmu_ss.add(migration)
3638
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003639block_ss = block_ss.apply(config_host, strict: false)
3640libblock = static_library('block', block_ss.sources() + genh,
3641 dependencies: block_ss.dependencies(),
3642 link_depends: block_syms,
3643 name_suffix: 'fa',
3644 build_by_default: false)
3645
3646block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003647 link_args: '@block.syms',
3648 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003649
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003650blockdev_ss = blockdev_ss.apply(config_host, strict: false)
3651libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
3652 dependencies: blockdev_ss.dependencies(),
3653 name_suffix: 'fa',
3654 build_by_default: false)
3655
3656blockdev = declare_dependency(link_whole: [libblockdev],
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003657 dependencies: [block, event_loop_base])
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003658
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003659qmp_ss = qmp_ss.apply(config_host, strict: false)
3660libqmp = static_library('qmp', qmp_ss.sources() + genh,
3661 dependencies: qmp_ss.dependencies(),
3662 name_suffix: 'fa',
3663 build_by_default: false)
3664
3665qmp = declare_dependency(link_whole: [libqmp])
3666
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003667libchardev = static_library('chardev', chardev_ss.sources() + genh,
3668 name_suffix: 'fa',
Marc-André Lureau22d1f7a2022-03-23 19:57:12 +04003669 dependencies: chardev_ss.dependencies(),
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003670 build_by_default: false)
3671
3672chardev = declare_dependency(link_whole: libchardev)
3673
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02003674hwcore_ss = hwcore_ss.apply(config_host, strict: false)
3675libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02003676 name_suffix: 'fa',
3677 build_by_default: false)
3678hwcore = declare_dependency(link_whole: libhwcore)
3679common_ss.add(hwcore)
3680
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02003681###########
3682# Targets #
3683###########
3684
Paolo Bonzinifb721762022-01-07 13:00:44 +01003685emulator_modules = []
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003686foreach m : block_mods + softmmu_mods
Paolo Bonzinifb721762022-01-07 13:00:44 +01003687 emulator_modules += shared_module(m.name(),
3688 build_by_default: true,
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003689 name_prefix: '',
3690 link_whole: m,
3691 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003692 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003693endforeach
Paolo Bonzinid8f3a602022-05-30 14:24:34 +02003694if emulator_modules.length() > 0
3695 alias_target('modules', emulator_modules)
3696endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003697
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003698softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003699common_ss.add(qom, qemuutil)
3700
3701common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01003702common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
3703
3704common_all = common_ss.apply(config_all, strict: false)
3705common_all = static_library('common',
3706 build_by_default: false,
3707 sources: common_all.sources() + genh,
Paolo Bonzini9d24fb72021-12-21 16:09:54 +01003708 include_directories: common_user_inc,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09003709 implicit_include_directories: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003710 dependencies: common_all.dependencies(),
3711 name_suffix: 'fa')
3712
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003713feature_to_c = find_program('scripts/feature_to_c.sh')
3714
Philippe Mathieu-Daudé30cfa502022-02-15 17:25:03 +01003715if targetos == 'darwin'
3716 entitlement = find_program('scripts/entitlement.sh')
3717endif
3718
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04003719emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003720foreach target : target_dirs
3721 config_target = config_target_mak[target]
3722 target_name = config_target['TARGET_NAME']
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003723 target_base_arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02003724 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003725 arch_deps = []
3726 c_args = ['-DNEED_CPU_H',
3727 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3728 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04003729 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01003730
Paolo Bonzini859aef02020-08-04 18:14:26 +02003731 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01003732 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3733 if targetos == 'linux'
3734 target_inc += include_directories('linux-headers', is_system: true)
3735 endif
3736 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003737 target_type='system'
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003738 t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003739 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003740 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003741
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003742 hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
Marc-André Lureau2c442202019-08-17 13:55:58 +04003743 hw = hw_arch[hw_dir].apply(config_target, strict: false)
3744 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003745 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04003746
Paolo Bonzini2becc362020-02-03 11:42:03 +01003747 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003748 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01003749 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04003750 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01003751 target_type='user'
Paolo Bonzinia3a576b2021-12-21 16:23:55 +01003752 target_inc += common_user_inc
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003753 if target_base_arch in target_user_arch
3754 t = target_user_arch[target_base_arch].apply(config_target, strict: false)
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02003755 arch_srcs += t.sources()
3756 arch_deps += t.dependencies()
3757 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01003758 if 'CONFIG_LINUX_USER' in config_target
3759 base_dir = 'linux-user'
Warner Loshe2a74722021-08-03 17:17:17 -06003760 endif
3761 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01003762 base_dir = 'bsd-user'
Warner Loshe2a74722021-08-03 17:17:17 -06003763 target_inc += include_directories('bsd-user/' / targetos)
Warner Losh85fc1b52022-01-08 17:27:34 -07003764 target_inc += include_directories('bsd-user/host/' / host_arch)
Warner Loshe2a74722021-08-03 17:17:17 -06003765 dir = base_dir / abi
Warner Losh19bf1292021-11-04 16:34:48 -06003766 arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003767 endif
3768 target_inc += include_directories(
3769 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04003770 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003771 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04003772 if 'CONFIG_LINUX_USER' in config_target
3773 dir = base_dir / abi
3774 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
3775 if config_target.has_key('TARGET_SYSTBL_ABI')
3776 arch_srcs += \
3777 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
3778 extra_args : config_target['TARGET_SYSTBL_ABI'])
3779 endif
3780 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01003781 endif
3782
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003783 if 'TARGET_XML_FILES' in config_target
3784 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
3785 output: target + '-gdbstub-xml.c',
3786 input: files(config_target['TARGET_XML_FILES'].split()),
3787 command: [feature_to_c, '@INPUT@'],
3788 capture: true)
3789 arch_srcs += gdbstub_xml
3790 endif
3791
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003792 t = target_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003793 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003794 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003795
Paolo Bonzini2becc362020-02-03 11:42:03 +01003796 target_common = common_ss.apply(config_target, strict: false)
3797 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003798 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003799
Paolo Bonzini2becc362020-02-03 11:42:03 +01003800 target_specific = specific_ss.apply(config_target, strict: false)
3801 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003802 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003803
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003804 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02003805 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02003806 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003807 objects: objects,
3808 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003809 c_args: c_args,
3810 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003811 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003812
3813 if target.endswith('-softmmu')
3814 execs = [{
3815 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003816 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003817 'sources': files('softmmu/main.c'),
3818 'dependencies': []
3819 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01003820 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003821 execs += [{
3822 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003823 'win_subsystem': 'windows',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003824 'sources': files('softmmu/main.c'),
3825 'dependencies': []
3826 }]
3827 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02003828 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003829 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
3830 execs += [{
3831 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003832 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003833 'sources': specific_fuzz.sources(),
3834 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003835 }]
3836 endif
3837 else
3838 execs = [{
3839 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003840 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003841 'sources': [],
3842 'dependencies': []
3843 }]
3844 endif
3845 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01003846 exe_name = exe['name']
John Arbuckle3983a762021-07-05 15:53:28 -04003847 if targetos == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01003848 exe_name += '-unsigned'
3849 endif
3850
3851 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09003852 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003853 c_args: c_args,
3854 dependencies: arch_deps + deps + exe['dependencies'],
3855 objects: lib.extract_all_objects(recursive: true),
3856 link_language: link_language,
3857 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
3858 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003859 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003860
John Arbuckle3983a762021-07-05 15:53:28 -04003861 if targetos == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003862 icon = 'pc-bios/qemu.rsrc'
3863 build_input = [emulator, files(icon)]
3864 install_input = [
3865 get_option('bindir') / exe_name,
3866 meson.current_source_dir() / icon
3867 ]
3868 if 'CONFIG_HVF' in config_target
3869 entitlements = 'accel/hvf/entitlements.plist'
3870 build_input += files(entitlements)
3871 install_input += meson.current_source_dir() / entitlements
3872 endif
3873
Alexander Graf8a74ce62021-01-20 23:44:34 +01003874 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003875 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01003876 output: exe['name'],
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003877 command: [entitlement, '@OUTPUT@', '@INPUT@'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003878 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09003879
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003880 meson.add_install_script(entitlement, '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09003881 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003882 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01003883 else
3884 emulators += {exe['name']: emulator}
3885 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003886
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003887 if stap.found()
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003888 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003889 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
3890 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003891 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
3892 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
3893 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003894 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003895 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003896 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003897 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003898 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003899 command: [
3900 tracetool, '--group=all', '--format=' + stp['fmt'],
3901 '--binary=' + stp['bin'],
3902 '--target-name=' + target_name,
3903 '--target-type=' + target_type,
3904 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01003905 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003906 ],
3907 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003908 endforeach
3909 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003910 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003911endforeach
3912
Paolo Bonzini931049b2020-02-05 09:44:24 +01003913# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003914
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003915if 'CONFIG_PLUGIN' in config_host
3916 install_headers('include/qemu/qemu-plugin.h')
3917endif
3918
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003919subdir('qga')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02003920
Laurent Vivier9755c942020-08-24 17:24:30 +02003921# Don't build qemu-keymap if xkbcommon is not explicitly enabled
3922# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02003923if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04003924 # used for the update-keymaps target, so include rules even if !have_tools
3925 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
3926 dependencies: [qemuutil, xkbcommon], install: have_tools)
3927endif
3928
Paolo Bonzini931049b2020-02-05 09:44:24 +01003929if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003930 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
3931 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
3932 qemu_io = executable('qemu-io', files('qemu-io.c'),
3933 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01003934 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06003935 dependencies: [blockdev, qemuutil, gnutls, selinux],
3936 install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003937
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02003938 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003939 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04003940 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003941
Marc-André Lureau157e7b12019-07-15 14:50:58 +04003942 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
3943 dependencies: qemuutil,
3944 install: true)
3945
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003946 if have_vhost_user
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02003947 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02003948 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04003949 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02003950 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01003951 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003952
3953 if targetos == 'linux'
3954 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
3955 dependencies: [qemuutil, libcap_ng],
3956 install: true,
3957 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003958
3959 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
3960 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02003961 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003962 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003963 endif
3964
Paolo Bonziniccd250a2021-06-03 12:50:17 +02003965 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04003966 subdir('contrib/ivshmem-client')
3967 subdir('contrib/ivshmem-server')
3968 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01003969endif
3970
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04003971subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01003972subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04003973subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02003974subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08003975subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01003976if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04003977 subdir('po')
3978endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01003979
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003980if host_machine.system() == 'windows'
3981 nsis_cmd = [
3982 find_program('scripts/nsis.py'),
3983 '@OUTPUT@',
3984 get_option('prefix'),
3985 meson.current_source_dir(),
Paolo Bonzinifc9a8092022-10-12 11:31:32 +02003986 glib_pc.get_variable('bindir'),
Stefan Weil24bdcc92020-11-25 20:18:33 +01003987 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003988 '--',
3989 '-DDISPLAYVERSION=' + meson.project_version(),
3990 ]
3991 if build_docs
3992 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
3993 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01003994 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003995 nsis_cmd += '-DCONFIG_GTK=y'
3996 endif
3997
3998 nsis = custom_target('nsis',
3999 output: 'qemu-setup-' + meson.project_version() + '.exe',
4000 input: files('qemu.nsi'),
4001 build_always_stale: true,
4002 command: nsis_cmd + ['@INPUT@'])
4003 alias_target('installer', nsis)
4004endif
4005
Paolo Bonzinia0c91622020-10-07 11:01:51 -04004006#########################
4007# Configuration summary #
4008#########################
4009
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004010# Directories
Paolo Bonzinif9332752020-02-03 13:28:38 +01004011summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004012summary_info += {'Install prefix': get_option('prefix')}
4013summary_info += {'BIOS directory': qemu_datadir}
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09004014pathsep = targetos == 'windows' ? ';' : ':'
4015summary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004016summary_info += {'binary directory': get_option('prefix') / get_option('bindir')}
4017summary_info += {'library directory': get_option('prefix') / get_option('libdir')}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04004018summary_info += {'module directory': qemu_moddir}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004019summary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
4020summary_info += {'include directory': get_option('prefix') / get_option('includedir')}
4021summary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004022if targetos != 'windows'
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004023 summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
4024 summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004025else
4026 summary_info += {'local state directory': 'queried at runtime'}
4027endif
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02004028summary_info += {'Doc directory': get_option('prefix') / get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004029summary_info += {'Build directory': meson.current_build_dir()}
4030summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004031summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004032summary(summary_info, bool_yn: true, section: 'Directories')
4033
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004034# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01004035summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004036summary_info += {'git': config_host['GIT']}
4037summary_info += {'make': config_host['MAKE']}
4038summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004039summary_info += {'sphinx-build': sphinx_build}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004040if config_host.has_key('HAVE_GDB_BIN')
4041 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
4042endif
Paolo Bonzini40c909f2022-04-20 17:33:49 +02004043summary_info += {'iasl': iasl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004044summary_info += {'genisoimage': config_host['GENISOIMAGE']}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004045if targetos == 'windows' and have_ga
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004046 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004047endif
Thomas Huth58902582022-04-08 18:20:47 +02004048if slirp.found() and have_system
Paolo Bonzini35acbb32021-10-13 13:43:36 +02004049 summary_info += {'smbd': have_slirp_smbd ? smbd_path : false}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004050endif
4051summary(summary_info, bool_yn: true, section: 'Host binaries')
4052
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004053# Configurable features
4054summary_info = {}
4055summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004056summary_info += {'system-mode emulation': have_system}
4057summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004058summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004059summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini60027112022-10-20 14:53:10 +02004060summary_info += {'module support': enable_modules}
4061if enable_modules
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02004062 summary_info += {'alternative module path': get_option('module_upgrades')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004063endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02004064summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004065if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02004066 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004067endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02004068summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
4069if 'simple' in get_option('trace_backends')
4070 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004071endif
Marc-André Lureau142ca622021-07-15 11:53:53 +04004072summary_info += {'D-Bus display': dbus_display}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004073summary_info += {'QOM debugging': get_option('qom_cast_debug')}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004074summary_info += {'vhost-kernel support': have_vhost_kernel}
4075summary_info += {'vhost-net support': have_vhost_net}
4076summary_info += {'vhost-user support': have_vhost_user}
4077summary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004078summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02004079summary_info += {'vhost-vdpa support': have_vhost_vdpa}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02004080summary_info += {'build guest agent': have_ga}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01004081summary(summary_info, bool_yn: true, section: 'Configurable features')
4082
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004083# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01004084summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004085summary_info += {'host CPU': cpu}
4086summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01004087summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
4088summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004089if link_language == 'cpp'
Alex Bennée63de9352021-05-27 17:03:15 +01004090 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004091else
4092 summary_info += {'C++ compiler': false}
4093endif
4094if targetos == 'darwin'
Alex Bennée63de9352021-05-27 17:03:15 +01004095 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004096endif
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004097option_cflags = (get_option('debug') ? ['-g'] : [])
4098if get_option('optimization') != 'plain'
4099 option_cflags += ['-O' + get_option('optimization')]
4100endif
4101summary_info += {'CFLAGS': ' '.join(get_option('c_args') + option_cflags)}
Paolo Bonzini47b30832020-09-23 05:26:17 -04004102if link_language == 'cpp'
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004103 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args') + option_cflags)}
Paolo Bonzini47b30832020-09-23 05:26:17 -04004104endif
Philippe Mathieu-Daudée910c7d2022-01-08 22:38:55 +01004105if targetos == 'darwin'
Paolo Bonzini6a97f392022-11-02 13:07:23 +01004106 summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args') + option_cflags)}
Philippe Mathieu-Daudée910c7d2022-01-08 22:38:55 +01004107endif
Paolo Bonzini47b30832020-09-23 05:26:17 -04004108link_args = get_option(link_language + '_link_args')
4109if link_args.length() > 0
4110 summary_info += {'LDFLAGS': ' '.join(link_args)}
4111endif
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004112summary_info += {'QEMU_CFLAGS': ' '.join(qemu_common_flags + qemu_cflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004113if 'cpp' in all_languages
Paolo Bonzinid67212d2022-10-12 17:13:23 +02004114 summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_common_flags + qemu_cxxflags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004115endif
4116if 'objc' in all_languages
Paolo Bonzini95caf1f2022-12-22 09:28:56 +01004117 summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_common_flags)}
Paolo Bonzinie5134022022-10-12 14:15:06 +02004118endif
Paolo Bonzinid0651772022-04-20 17:33:34 +02004119summary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004120summary_info += {'profiler': get_option('profiler')}
Daniele Buonocdad7812020-12-04 18:06:11 -05004121summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004122summary_info += {'PIE': get_option('b_pie')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02004123summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004124summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinib87df902021-11-08 13:52:11 +01004125summary_info += {'membarrier': have_membarrier}
Stefan Hajnoczi58a2e3f2023-05-01 13:34:43 -04004126summary_info += {'debug graph lock': get_option('debug_graph_lock')}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004127summary_info += {'debug stack usage': get_option('debug_stack_usage')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004128summary_info += {'mutex debugging': get_option('debug_mutex')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004129summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01004130summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
ling xu04ffce12022-11-16 23:29:22 +08004131summary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01004132summary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')}
Alex Bennéebb9ecae2023-01-31 09:42:23 +00004133if get_option('gprof')
4134 gprof_info = 'YES (deprecated)'
4135else
4136 gprof_info = get_option('gprof')
4137endif
4138summary_info += {'gprof': gprof_info}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004139summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzini34f983d2023-01-09 15:31:51 +01004140summary_info += {'thread sanitizer': get_option('tsan')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004141summary_info += {'CFI support': get_option('cfi')}
4142if get_option('cfi')
4143 summary_info += {'CFI debug support': get_option('cfi_debug')}
4144endif
4145summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004146summary_info += {'sparse': sparse}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004147summary_info += {'mingw32 support': targetos == 'windows'}
Paolo Bonzini12640f02022-06-06 11:48:47 +02004148summary(summary_info, bool_yn: true, section: 'Compilation')
Alex Bennée49e85652021-02-22 10:14:50 +00004149
4150# snarf the cross-compilation information for tests
Paolo Bonzini12640f02022-06-06 11:48:47 +02004151summary_info = {}
4152have_cross = false
Alex Bennée49e85652021-02-22 10:14:50 +00004153foreach target: target_dirs
Paolo Bonzinic7022a72022-09-29 12:42:07 +01004154 tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak'
Alex Bennée49e85652021-02-22 10:14:50 +00004155 if fs.exists(tcg_mak)
4156 config_cross_tcg = keyval.load(tcg_mak)
Alex Bennée85b141e2022-05-27 16:35:34 +01004157 if 'CC' in config_cross_tcg
Paolo Bonzini12640f02022-06-06 11:48:47 +02004158 summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
4159 have_cross = true
Alex Bennée49e85652021-02-22 10:14:50 +00004160 endif
Paolo Bonzini12640f02022-06-06 11:48:47 +02004161 endif
Alex Bennée49e85652021-02-22 10:14:50 +00004162endforeach
Paolo Bonzini12640f02022-06-06 11:48:47 +02004163if have_cross
4164 summary(summary_info, bool_yn: true, section: 'Cross compilers')
4165endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004166
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004167# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004168summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004169if have_system
4170 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
4171 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
4172 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
4173 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
Reinoud Zandijk74a414a2021-04-02 22:25:32 +02004174 summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')}
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02004175 summary_info += {'Xen support': xen.found()}
4176 if xen.found()
4177 summary_info += {'xen ctrl version': xen.version()}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004178 endif
David Woodhouse820c1ab2022-12-06 09:03:48 +00004179 summary_info += {'Xen emulation': config_all.has_key('CONFIG_XEN_EMU')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004180endif
4181summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
4182if config_all.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004183 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +01004184 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01004185 else
4186 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
4187 endif
Alex Bennée029aa682021-07-09 15:29:53 +01004188 summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004189 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004190endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01004191summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004192if have_system
4193 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01004194 summary_info += {'out of process emulation': multiprocess_allowed}
Jagannathan Raman55116962022-06-13 16:26:24 -04004195 summary_info += {'vfio-user server': vfio_user_server_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004196endif
4197summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
4198
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004199# Block layer
4200summary_info = {}
Paolo Bonzini67398252022-10-12 13:19:35 +02004201summary_info += {'coroutine backend': coroutine_backend}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02004202summary_info += {'coroutine pool': have_coroutine_pool}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004203if have_block
Paolo Bonzini622d64f2022-04-20 17:33:53 +02004204 summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
4205 summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004206 summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
Christian Schoenebeck38877022023-05-11 16:12:34 +02004207 summary_info += {'VirtFS (9P) support': have_virtfs}
4208 summary_info += {'VirtFS (9P) Proxy Helper support': have_virtfs_proxy_helper}
Paolo Bonzini406523f2021-10-13 11:43:54 +02004209 summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')}
4210 summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004211 summary_info += {'bochs support': get_option('bochs').allowed()}
4212 summary_info += {'cloop support': get_option('cloop').allowed()}
4213 summary_info += {'dmg support': get_option('dmg').allowed()}
4214 summary_info += {'qcow v1 support': get_option('qcow1').allowed()}
4215 summary_info += {'vdi support': get_option('vdi').allowed()}
Vladimir Sementsov-Ogievskiy11cea422023-04-21 12:27:58 +03004216 summary_info += {'vhdx support': get_option('vhdx').allowed()}
4217 summary_info += {'vmdk support': get_option('vmdk').allowed()}
4218 summary_info += {'vpc support': get_option('vpc').allowed()}
Paolo Bonzinied793c22021-10-13 11:42:25 +02004219 summary_info += {'vvfat support': get_option('vvfat').allowed()}
4220 summary_info += {'qed support': get_option('qed').allowed()}
4221 summary_info += {'parallels support': get_option('parallels').allowed()}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004222 summary_info += {'FUSE exports': fuse}
Xie Yongji2a2359b2022-05-23 16:46:09 +08004223 summary_info += {'VDUSE block exports': have_vduse_blk_export}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01004224endif
4225summary(summary_info, bool_yn: true, section: 'Block layer support')
4226
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004227# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01004228summary_info = {}
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02004229summary_info += {'TLS priority': get_option('tls_priority')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004230summary_info += {'GNUTLS support': gnutls}
4231if gnutls.found()
4232 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
4233endif
4234summary_info += {'libgcrypt': gcrypt}
4235summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02004236if nettle.found()
4237 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004238endif
Paolo Bonzini34b52612021-11-08 14:02:42 +01004239summary_info += {'AF_ALG support': have_afalg}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02004240summary_info += {'rng-none': get_option('rng_none')}
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02004241summary_info += {'Linux keyring': have_keyring}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004242summary(summary_info, bool_yn: true, section: 'Crypto')
4243
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01004244# Libraries
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004245summary_info = {}
4246if targetos == 'darwin'
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03004247 summary_info += {'Cocoa support': cocoa}
4248 summary_info += {'vmnet.framework support': vmnet}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01004249endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004250summary_info += {'SDL support': sdl}
4251summary_info += {'SDL image support': sdl_image}
4252summary_info += {'GTK support': gtk}
4253summary_info += {'pixman': pixman}
4254summary_info += {'VTE support': vte}
Thomas Huth58902582022-04-08 18:20:47 +02004255summary_info += {'slirp support': slirp}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004256summary_info += {'libtasn1': tasn1}
4257summary_info += {'PAM': pam}
4258summary_info += {'iconv support': iconv}
4259summary_info += {'curses support': curses}
4260summary_info += {'virgl support': virgl}
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04004261summary_info += {'blkio support': blkio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004262summary_info += {'curl support': curl}
4263summary_info += {'Multipath support': mpathpersist}
Kshitij Suri95f85102022-04-08 07:13:34 +00004264summary_info += {'PNG support': png}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004265summary_info += {'VNC support': vnc}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01004266if vnc.found()
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004267 summary_info += {'VNC SASL support': sasl}
4268 summary_info += {'VNC JPEG support': jpeg}
Paolo Bonzinif9332752020-02-03 13:28:38 +01004269endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02004270if targetos not in ['darwin', 'haiku', 'windows']
4271 summary_info += {'OSS support': oss}
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02004272 summary_info += {'sndio support': sndio}
Paolo Bonzini87430d52021-10-07 15:06:09 +02004273elif targetos == 'darwin'
4274 summary_info += {'CoreAudio support': coreaudio}
4275elif targetos == 'windows'
4276 summary_info += {'DirectSound support': dsound}
4277endif
4278if targetos == 'linux'
4279 summary_info += {'ALSA support': alsa}
4280 summary_info += {'PulseAudio support': pulse}
4281endif
Dorinda Basseyc2d3d1c2023-04-17 12:56:54 +02004282summary_info += {'Pipewire support': pipewire}
Paolo Bonzini87430d52021-10-07 15:06:09 +02004283summary_info += {'JACK support': jack}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004284summary_info += {'brlapi support': brlapi}
Paolo Bonzinie1723992021-10-07 15:08:21 +02004285summary_info += {'vde support': vde}
Paolo Bonzini837b84b2021-10-07 15:08:22 +02004286summary_info += {'netmap support': have_netmap}
Thomas Hutheea94532021-10-28 20:59:08 +02004287summary_info += {'l2tpv3 support': have_l2tpv3}
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02004288summary_info += {'Linux AIO support': libaio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004289summary_info += {'Linux io_uring support': linux_io_uring}
4290summary_info += {'ATTR/XATTR support': libattr}
Paolo Bonzini3730a732022-04-20 17:33:41 +02004291summary_info += {'RDMA support': rdma}
4292summary_info += {'PVRDMA support': have_pvrdma}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02004293summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02004294summary_info += {'libcap-ng support': libcap_ng}
4295summary_info += {'bpf support': libbpf}
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02004296summary_info += {'spice protocol support': spice_protocol}
4297if spice_protocol.found()
4298 summary_info += {' spice server support': spice}
4299endif
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
4334if not supported_cpus.contains(cpu)
4335 message()
4336 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
4337 message()
4338 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
4339 message('The QEMU project intends to remove support for this host CPU in')
4340 message('a future release if nobody volunteers to maintain it and to')
4341 message('provide a build host for our continuous integration setup.')
4342 message('configure has succeeded and you can continue to build, but')
4343 message('if you care about QEMU on this platform you should contact')
4344 message('us upstream at qemu-devel@nongnu.org.')
4345endif
4346
4347if not supported_oses.contains(targetos)
4348 message()
4349 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
4350 message()
4351 message('Host OS ' + targetos + 'support is not currently maintained.')
4352 message('The QEMU project intends to remove support for this host OS in')
4353 message('a future release if nobody volunteers to maintain it and to')
4354 message('provide a build host for our continuous integration setup.')
4355 message('configure has succeeded and you can continue to build, but')
4356 message('if you care about QEMU on this platform you should contact')
4357 message('us upstream at qemu-devel@nongnu.org.')
4358endif