blob: 1e9068adf6cf8ade6b158ba16db625d74835c149 [file] [log] [blame]
Paolo Bonzini8a29c202021-12-23 15:29:56 +01001project('qemu', ['c'], meson_version: '>=0.61.3',
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 Bonzinice1c1e72020-01-28 16:41:44 +010017sh = find_program('sh')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040018cc = meson.get_compiler('c')
Paolo Bonzinia5665052019-06-10 12:05:14 +020019config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Marc-André Lureau3154fee2019-08-29 22:07:01 +040020enable_modules = 'CONFIG_MODULES' in config_host
Paolo Bonzini35be72b2020-02-06 14:17:15 +010021enable_static = 'CONFIG_STATIC' in config_host
Yonggang Luoe3667662020-10-16 06:06:25 +080022
Paolo Bonzinid7dedf42021-01-26 11:15:33 +010023# Allow both shared and static libraries unless --enable-static
24static_kwargs = enable_static ? {'static': true} : {}
25
Yonggang Luoe3667662020-10-16 06:06:25 +080026# Temporary directory used for files created while
27# configure runs. Since it is in the build directory
28# we can safely blow away any previous version of it
29# (and we need not jump through hoops to try to delete
30# it when configure exits.)
31tmpdir = meson.current_build_dir() / 'meson-private/temp'
Marc-André Lureau8fe11232020-09-11 14:42:48 +020032
33if get_option('qemu_suffix').startswith('/')
34 error('qemu_suffix cannot start with a /')
35endif
36
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040037qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
Marc-André Lureauab4c0992020-08-26 15:04:16 +040038qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040039qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040040qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
41
42qemu_desktopdir = get_option('datadir') / 'applications'
43qemu_icondir = get_option('datadir') / 'icons'
44
Paolo Bonzini859aef02020-08-04 18:14:26 +020045config_host_data = configuration_data()
46genh = []
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +010047qapi_trace_events = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020048
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020049bsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin']
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040050supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Richard Hendersonba0e7332021-09-17 11:08:09 -070051supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv', 'x86', 'x86_64',
WANG Xueruidfcf9002021-12-21 13:41:04 +080052 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc', 'sparc64']
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040053
54cpu = host_machine.cpu_family()
Richard Hendersonc94c2392021-11-16 10:50:42 +010055
56# Unify riscv* to a single family.
57if cpu in ['riscv32', 'riscv64']
58 cpu = 'riscv'
59endif
60
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040061targetos = host_machine.system()
62
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +020063target_dirs = config_host['TARGET_DIRS'].split()
64have_linux_user = false
65have_bsd_user = false
66have_system = false
67foreach target : target_dirs
68 have_linux_user = have_linux_user or target.endswith('linux-user')
69 have_bsd_user = have_bsd_user or target.endswith('bsd-user')
70 have_system = have_system or target.endswith('-softmmu')
71endforeach
72have_user = have_linux_user or have_bsd_user
73have_tools = get_option('tools') \
74 .disable_auto_if(not have_system) \
75 .allowed()
76have_ga = get_option('guest_agent') \
77 .disable_auto_if(not have_system and not have_tools) \
78 .require(targetos in ['sunos', 'linux', 'windows'],
79 error_message: 'unsupported OS for QEMU guest agent') \
80 .allowed()
81have_block = have_system or have_tools
82
83python = import('python').find_installation()
84
Paolo Bonzini823eb012021-11-08 14:18:17 +010085if cpu not in supported_cpus
86 host_arch = 'unknown'
87elif cpu == 'x86'
88 host_arch = 'i386'
Richard Henderson0e3ed772021-12-31 05:25:11 +000089elif cpu == 'mips64'
90 host_arch = 'mips'
Paolo Bonzini823eb012021-11-08 14:18:17 +010091else
92 host_arch = cpu
93endif
94
Paolo Bonzini8a199802020-09-18 05:37:01 -040095if cpu in ['x86', 'x86_64']
96 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
97elif cpu == 'aarch64'
98 kvm_targets = ['aarch64-softmmu']
99elif cpu == 's390x'
100 kvm_targets = ['s390x-softmmu']
101elif cpu in ['ppc', 'ppc64']
102 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Huacai Chenfbc58842020-10-07 16:39:28 +0800103elif cpu in ['mips', 'mips64']
104 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Yifei Jiangfbf43c72022-01-12 16:13:29 +0800105elif cpu in ['riscv']
106 kvm_targets = ['riscv32-softmmu', 'riscv64-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400107else
108 kvm_targets = []
109endif
110
Igor Mammedov44d3d892021-10-27 11:10:12 -0400111kvm_targets_c = '""'
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100112if get_option('kvm').allowed() and targetos == 'linux'
Igor Mammedove741aff2021-09-02 07:35:38 -0400113 kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
114endif
115config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
116
Paolo Bonzini8a199802020-09-18 05:37:01 -0400117accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alexander Graf844a06b2021-09-16 17:54:02 +0200118
119if cpu in ['aarch64']
120 accelerator_targets += {
121 'CONFIG_HVF': ['aarch64-softmmu']
122 }
123endif
124
Alex Bennée0c3e41d2020-11-10 19:23:09 +0000125if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
Marc-André Lureau2a2d51b2021-09-14 16:30:45 +0400126 # i386 emulator provides xenpv machine type for multiple architectures
Alex Bennée0c3e41d2020-11-10 19:23:09 +0000127 accelerator_targets += {
128 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
129 }
130endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400131if cpu in ['x86', 'x86_64']
132 accelerator_targets += {
133 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400134 'CONFIG_HVF': ['x86_64-softmmu'],
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200135 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400136 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
137 }
138endif
139
Paolo Bonzinia1b176f2021-07-12 14:22:08 +0200140modular_tcg = []
141# Darwin does not support references to thread-local variables in modules
142if targetos != 'darwin'
143 modular_tcg = ['i386-softmmu', 'x86_64-softmmu']
144endif
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +0200145
Philippe Mathieu-Daudéeae9a1d2021-01-14 18:45:08 +0100146edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
Paolo Bonzinie49c0ef2021-09-23 06:55:28 -0400147unpack_edk2_blobs = false
148foreach target : edk2_targets
149 if target in target_dirs
150 bzip2 = find_program('bzip2', required: get_option('install_blobs'))
151 unpack_edk2_blobs = bzip2.found()
152 break
153 endif
154endforeach
Philippe Mathieu-Daudé45b545d2021-01-14 18:45:09 +0100155
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200156dtrace = not_found
157stap = not_found
158if 'dtrace' in get_option('trace_backends')
159 dtrace = find_program('dtrace', required: true)
160 stap = find_program('stap', required: false)
161 if stap.found()
162 # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
163 # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
164 # instead. QEMU --enable-modules depends on this because the SystemTap
165 # semaphores are linked into the main binary and not the module's shared
166 # object.
167 add_global_arguments('-DSTAP_SDT_V2',
168 native: false, language: ['c', 'cpp', 'objc'])
169 endif
170endif
171
Paolo Bonzini40c909f2022-04-20 17:33:49 +0200172if get_option('iasl') == ''
173 iasl = find_program('iasl', required: false)
174else
175 iasl = find_program(get_option('iasl'), required: true)
176endif
177
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400178##################
179# Compiler flags #
180##################
181
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100182qemu_cflags = config_host['QEMU_CFLAGS'].split()
Philippe Mathieu-Daudé4cb37d12022-02-15 16:15:13 +0100183qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100184qemu_ldflags = config_host['QEMU_LDFLAGS'].split()
185
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100186if enable_static
187 qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static'
188endif
189
190# Detect support for PT_GNU_RELRO + DT_BIND_NOW.
191# The combination is known as "full relro", because .got.plt is read-only too.
192qemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now')
193
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200194if targetos == 'windows'
195 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat')
196 # Disable ASLR for debug builds to allow debugging with gdb
197 if get_option('optimization') == '0'
198 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase')
199 endif
200endif
201
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +0200202if get_option('gprof')
203 qemu_cflags += ['-p']
Philippe Mathieu-Daudé4cb37d12022-02-15 16:15:13 +0100204 qemu_objcflags += ['-p']
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +0200205 qemu_ldflags += ['-p']
206endif
207
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400208# Specify linker-script with add_project_link_arguments so that it is not placed
209# within a linker --start-group/--end-group pair
Paolo Bonzini537b7242021-10-07 15:08:12 +0200210if get_option('fuzzing')
211 add_project_link_arguments(['-Wl,-T,',
212 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
213 native: false, language: ['c', 'cpp', 'objc'])
214
215 # Specify a filter to only instrument code that is directly related to
216 # virtual-devices.
217 configure_file(output: 'instrumentation-filter',
218 input: 'scripts/oss-fuzz/instrumentation-filter-template',
219 copy: true)
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400220
221 if cc.compiles('int main () { return 0; }',
222 name: '-fsanitize-coverage-allowlist=/dev/null',
Alexander Bulekove56d0972022-06-21 16:45:07 -0400223 args: ['-fsanitize-coverage-allowlist=/dev/null',
224 '-fsanitize-coverage=trace-pc'] )
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400225 add_global_arguments('-fsanitize-coverage-allowlist=instrumentation-filter',
226 native: false, language: ['c', 'cpp', 'objc'])
227 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +0200228
229 if get_option('fuzzing_engine') == ''
230 # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
231 # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link
232 # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
233 # unable to bind the fuzzer-related callbacks added by instrumentation.
234 add_global_arguments('-fsanitize=fuzzer-no-link',
235 native: false, language: ['c', 'cpp', 'objc'])
236 add_global_link_arguments('-fsanitize=fuzzer-no-link',
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400237 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzini537b7242021-10-07 15:08:12 +0200238 # For the actual fuzzer binaries, we need to link against the libfuzzer
239 # library. They need to be configurable, to support OSS-Fuzz
240 fuzz_exe_ldflags = ['-fsanitize=fuzzer']
241 else
242 # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
243 # the needed CFLAGS have already been provided
244 fuzz_exe_ldflags = get_option('fuzzing_engine').split()
245 endif
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400246endif
247
Philippe Mathieu-Daudé4cb37d12022-02-15 16:15:13 +0100248add_global_arguments(qemu_cflags, native: false, language: ['c'])
Philippe Mathieu-Daudé4cb37d12022-02-15 16:15:13 +0100249add_global_arguments(qemu_objcflags, native: false, language: ['objc'])
Paolo Bonzinib4854582021-11-08 12:31:52 +0100250
251# Check that the C++ compiler exists and works with the C compiler.
252link_language = 'c'
253linker = cc
254qemu_cxxflags = []
255if add_languages('cpp', required: false, native: false)
256 cxx = meson.get_compiler('cpp')
257 add_global_arguments(['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'],
258 native: false, language: 'cpp')
259 foreach k: qemu_cflags
260 if k not in ['-Wstrict-prototypes', '-Wmissing-prototypes', '-Wnested-externs',
261 '-Wold-style-declaration', '-Wold-style-definition', '-Wredundant-decls']
262 qemu_cxxflags += [k]
263 endif
264 endforeach
265 add_global_arguments(qemu_cxxflags, native: false, language: 'cpp')
266
267 if cxx.links(files('scripts/main.c'), args: qemu_cflags)
268 link_language = 'cpp'
269 linker = cxx
270 else
271 message('C++ compiler does not work with C compiler')
272 message('Disabling C++-specific optional code')
273 endif
274endif
275
Paolo Bonzinie4333d12022-03-15 15:57:15 +0100276# Exclude --warn-common with TSan to suppress warnings from the TSan libraries.
277if targetos != 'sunos' and not config_host.has_key('CONFIG_TSAN')
278 qemu_ldflags += linker.get_supported_link_arguments('-Wl,--warn-common')
279endif
280
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100281add_global_link_arguments(qemu_ldflags, native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzinia5665052019-06-10 12:05:14 +0200282
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400283if targetos == 'linux'
284 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
285 '-isystem', 'linux-headers',
286 language: ['c', 'cpp'])
287endif
288
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100289add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400290 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400291 '-iquote', meson.current_source_dir() / 'include',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400292 language: ['c', 'cpp', 'objc'])
Alexander Bulekovc46f76d2020-09-02 13:36:50 -0400293
Paolo Bonzinia5665052019-06-10 12:05:14 +0200294if host_machine.system() == 'darwin'
295 add_languages('objc', required: false, native: false)
296endif
297
Paolo Bonzinideb62372020-09-01 07:51:16 -0400298sparse = find_program('cgcc', required: get_option('sparse'))
299if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100300 run_target('sparse',
301 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400302 'compile_commands.json', sparse.full_path(), '-Wbitwise',
303 '-Wno-transparent-union', '-Wno-old-initializer',
304 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100305endif
306
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200307###########################################
308# Target-specific checks and dependencies #
309###########################################
310
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100311# Fuzzing
Paolo Bonzini537b7242021-10-07 15:08:12 +0200312if get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
313 not cc.links('''
314 #include <stdint.h>
315 #include <sys/types.h>
316 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
317 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
318 ''',
319 args: ['-Werror', '-fsanitize=fuzzer'])
320 error('Your compiler does not support -fsanitize=fuzzer')
321endif
322
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100323# Tracing backends
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200324if 'ftrace' in get_option('trace_backends') and targetos != 'linux'
325 error('ftrace is supported only on Linux')
326endif
327if 'syslog' in get_option('trace_backends') and not cc.compiles('''
328 #include <syslog.h>
329 int main(void) {
330 openlog("qemu", LOG_PID, LOG_DAEMON);
331 syslog(LOG_INFO, "configure");
332 return 0;
333 }''')
334 error('syslog is not supported on this system')
335endif
336
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100337# Miscellaneous Linux-only features
Paolo Bonzinia436d6d2021-12-18 16:39:43 +0100338get_option('mpath') \
339 .require(targetos == 'linux', error_message: 'Multipath is supported only on Linux')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200340
Paolo Bonzinia436d6d2021-12-18 16:39:43 +0100341multiprocess_allowed = get_option('multiprocess') \
342 .require(targetos == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \
343 .allowed()
Paolo Bonzini106ad1f2021-02-17 16:24:25 +0100344
Jagannathan Raman55116962022-06-13 16:26:24 -0400345vfio_user_server_allowed = get_option('vfio_user_server') \
346 .require(targetos == 'linux', error_message: 'vfio-user server is supported only on Linux') \
347 .allowed()
348
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +0100349have_tpm = get_option('tpm') \
350 .require(targetos != 'windows', error_message: 'TPM emulation only available on POSIX systems') \
351 .allowed()
352
Paolo Bonzini2a3129a2022-04-20 17:34:05 +0200353# vhost
Paolo Bonzini2df89d52022-04-20 17:34:07 +0200354have_vhost_user = get_option('vhost_user') \
355 .disable_auto_if(targetos != 'linux') \
356 .require(targetos != 'windows',
357 error_message: 'vhost-user is not available on Windows').allowed()
358have_vhost_vdpa = get_option('vhost_vdpa') \
359 .require(targetos == 'linux',
360 error_message: 'vhost-vdpa is only available on Linux').allowed()
361have_vhost_kernel = get_option('vhost_kernel') \
362 .require(targetos == 'linux',
363 error_message: 'vhost-kernel is only available on Linux').allowed()
364have_vhost_user_crypto = get_option('vhost_crypto') \
365 .require(have_vhost_user,
366 error_message: 'vhost-crypto requires vhost-user to be enabled').allowed()
367
Paolo Bonzini43b6d7e2022-04-20 17:34:06 +0200368have_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel
Paolo Bonzini2df89d52022-04-20 17:34:07 +0200369
370have_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed()
371have_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed()
372have_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed()
373have_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa
Paolo Bonzini2a3129a2022-04-20 17:34:05 +0200374
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100375# Target-specific libraries and flags
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200376libm = cc.find_library('m', required: false)
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +0200377threads = dependency('threads')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400378util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200379winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400380socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400381version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400382coref = []
383iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400384emulator_link_args = []
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200385nvmm =not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400386hvf = not_found
Marc-André Lureau23011f42022-02-01 12:55:21 +0400387midl = not_found
388widl = not_found
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900389pathcch = not_found
Paolo Bonzinia6305082021-10-07 15:08:15 +0200390host_dsosuf = '.so'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400391if targetos == 'windows'
Marc-André Lureau23011f42022-02-01 12:55:21 +0400392 midl = find_program('midl', required: false)
393 widl = find_program('widl', required: false)
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900394 pathcch = cc.find_library('pathcch')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400395 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200396 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400397
398 win = import('windows')
399 version_res = win.compile_resources('version.rc',
400 depend_files: files('pc-bios/qemu-nsis.ico'),
401 include_directories: include_directories('.'))
Paolo Bonzinia6305082021-10-07 15:08:15 +0200402 host_dsosuf = '.dll'
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400403elif targetos == 'darwin'
404 coref = dependency('appleframeworks', modules: 'CoreFoundation')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700405 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
Paolo Bonzinia6305082021-10-07 15:08:15 +0200406 host_dsosuf = '.dylib'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200407elif targetos == 'sunos'
408 socket = [cc.find_library('socket'),
409 cc.find_library('nsl'),
410 cc.find_library('resolv')]
411elif targetos == 'haiku'
412 socket = [cc.find_library('posix_error_mapper'),
413 cc.find_library('network'),
414 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400415elif targetos == 'openbsd'
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100416 if get_option('tcg').allowed() and target_dirs.length() > 0
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400417 # Disable OpenBSD W^X if available
418 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
419 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400420endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200421
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100422# Target-specific configuration of accelerators
Paolo Bonzini8a199802020-09-18 05:37:01 -0400423accelerators = []
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100424if get_option('kvm').allowed() and targetos == 'linux'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400425 accelerators += 'CONFIG_KVM'
426endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100427if get_option('whpx').allowed() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000428 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400429 error('WHPX requires 64-bit host')
430 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
431 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
432 accelerators += 'CONFIG_WHPX'
433 endif
434endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100435if get_option('hvf').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400436 hvf = dependency('appleframeworks', modules: 'Hypervisor',
437 required: get_option('hvf'))
438 if hvf.found()
439 accelerators += 'CONFIG_HVF'
440 endif
441endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100442if get_option('hax').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400443 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
444 accelerators += 'CONFIG_HAX'
445 endif
446endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200447if targetos == 'netbsd'
nia0cc49652021-10-13 13:54:17 +0000448 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200449 if nvmm.found()
450 accelerators += 'CONFIG_NVMM'
451 endif
452endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100453
Paolo Bonzini823eb012021-11-08 14:18:17 +0100454tcg_arch = host_arch
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100455if get_option('tcg').allowed()
Paolo Bonzini823eb012021-11-08 14:18:17 +0100456 if host_arch == 'unknown'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100457 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +0100458 warning('Unsupported CPU @0@, will use TCG with TCI (slow)'.format(cpu))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400459 else
460 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
461 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100462 elif get_option('tcg_interpreter')
Philippe Mathieu-Daudé1c282da2021-05-21 12:34:23 +0200463 warning('Use of the TCG interpreter is not recommended on this host')
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100464 warning('architecture. There is a native TCG execution backend available')
465 warning('which provides substantially better performance and reliability.')
466 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
467 warning('configuration option on this architecture to use the native')
468 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400469 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100470 if get_option('tcg_interpreter')
471 tcg_arch = 'tci'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100472 elif host_arch == 'sparc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100473 tcg_arch = 'sparc'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100474 elif host_arch == 'x86_64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100475 tcg_arch = 'i386'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100476 elif host_arch == 'ppc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100477 tcg_arch = 'ppc'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100478 endif
479 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100480 language: ['c', 'cpp', 'objc'])
481
Paolo Bonzini8a199802020-09-18 05:37:01 -0400482 accelerators += 'CONFIG_TCG'
483 config_host += { 'CONFIG_TCG': 'y' }
484endif
485
486if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
487 error('KVM not available on this platform')
488endif
489if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
490 error('HVF not available on this platform')
491endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200492if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
493 error('NVMM not available on this platform')
494endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400495if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
496 error('WHPX not available on this platform')
497endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400498
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200499################
500# Dependencies #
501################
502
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400503# The path to glib.h is added to all compilation commands. This was
504# grandfathered in from the QEMU Makefiles.
505add_project_arguments(config_host['GLIB_CFLAGS'].split(),
506 native: false, language: ['c', 'cpp', 'objc'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400507glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
Marc-André Lureaud83acfd2021-10-09 17:37:40 +0400508 link_args: config_host['GLIB_LIBS'].split(),
Marc-André Lureau5b9e7d02022-05-25 16:41:39 +0200509 version: config_host['GLIB_VERSION'],
510 variables: {
511 'bindir': config_host['GLIB_BINDIR'],
512 })
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400513# override glib dep with the configure results (for subprojects)
514meson.override_dependency('glib-2.0', glib)
515
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400516gio = not_found
Paolo Bonzini75440602022-04-20 17:33:44 +0200517gdbus_codegen = not_found
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +0200518gdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio'
Paolo Bonzini75440602022-04-20 17:33:44 +0200519if not get_option('gio').auto() or have_system
520 gio = dependency('gio-2.0', required: get_option('gio'),
521 method: 'pkg-config', kwargs: static_kwargs)
522 if gio.found() and not cc.links('''
523 #include <gio/gio.h>
524 int main(void)
525 {
526 g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
527 return 0;
528 }''', dependencies: [glib, gio])
529 if get_option('gio').enabled()
530 error('The installed libgio is broken for static linking')
531 endif
532 gio = not_found
533 endif
534 if gio.found()
535 gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'),
536 required: get_option('gio'))
537 gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
538 method: 'pkg-config', kwargs: static_kwargs)
539 gio = declare_dependency(dependencies: [gio, gio_unix],
540 version: gio.version())
541 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400542endif
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +0200543if gdbus_codegen.found() and get_option('cfi')
544 gdbus_codegen = not_found
545 gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity'
546endif
Paolo Bonzini75440602022-04-20 17:33:44 +0200547
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400548lttng = not_found
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200549if 'ust' in get_option('trace_backends')
Marc-André Lureaue32aaa52022-03-28 12:47:13 +0400550 lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
551 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400552endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200553pixman = not_found
554if have_system or have_tools
555 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100556 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200557endif
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100558zlib = dependency('zlib', required: true, kwargs: static_kwargs)
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200559
Paolo Bonziniff66f3e2021-10-07 15:08:20 +0200560libaio = not_found
561if not get_option('linux_aio').auto() or have_block
562 libaio = cc.find_library('aio', has_headers: ['libaio.h'],
563 required: get_option('linux_aio'),
564 kwargs: static_kwargs)
565endif
Leonardo Bras354081d2022-05-13 03:28:30 -0300566
567linux_io_uring_test = '''
568 #include <liburing.h>
569 #include <linux/errqueue.h>
570
571 int main(void) { return 0; }'''
572
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400573linux_io_uring = not_found
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200574if not get_option('linux_io_uring').auto() or have_block
Daniel P. Berrangéa41b4fd2022-01-05 13:49:38 +0000575 linux_io_uring = dependency('liburing', version: '>=0.3',
576 required: get_option('linux_io_uring'),
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200577 method: 'pkg-config', kwargs: static_kwargs)
Leonardo Bras354081d2022-05-13 03:28:30 -0300578 if not cc.links(linux_io_uring_test)
579 linux_io_uring = not_found
580 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400581endif
Leonardo Bras354081d2022-05-13 03:28:30 -0300582
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400583libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +0100584if not get_option('libnfs').auto() or have_block
585 libnfs = dependency('libnfs', version: '>=1.9.3',
586 required: get_option('libnfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100587 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400588endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100589
590libattr_test = '''
591 #include <stddef.h>
592 #include <sys/types.h>
593 #ifdef CONFIG_LIBATTR
594 #include <attr/xattr.h>
595 #else
596 #include <sys/xattr.h>
597 #endif
598 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
599
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400600libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100601have_old_libattr = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100602if get_option('attr').allowed()
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100603 if cc.links(libattr_test)
604 libattr = declare_dependency()
605 else
606 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
607 required: get_option('attr'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100608 kwargs: static_kwargs)
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100609 if libattr.found() and not \
610 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
611 libattr = not_found
612 if get_option('attr').enabled()
613 error('could not link libattr')
614 else
615 warning('could not link libattr, disabling')
616 endif
617 else
618 have_old_libattr = libattr.found()
619 endif
620 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400621endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100622
Akihiko Odaki52eaefd2022-07-02 23:25:19 +0900623cocoa = dependency('appleframeworks', modules: ['Cocoa', 'CoreVideo'],
624 required: get_option('cocoa'))
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100625
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +0300626vmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet'))
627if vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h',
628 'VMNET_BRIDGED_MODE',
629 dependencies: vmnet)
630 vmnet = not_found
631 if get_option('vmnet').enabled()
632 error('vmnet.framework API is outdated')
633 else
634 warning('vmnet.framework API is outdated, disabling')
635 endif
636endif
637
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100638seccomp = not_found
Paolo Bonzini90835c22020-11-17 14:22:24 +0100639if not get_option('seccomp').auto() or have_system or have_tools
640 seccomp = dependency('libseccomp', version: '>=2.3.0',
641 required: get_option('seccomp'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100642 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100643endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100644
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100645libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100646if not get_option('cap_ng').auto() or have_system or have_tools
647 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
648 required: get_option('cap_ng'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100649 kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100650endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100651if libcap_ng.found() and not cc.links('''
652 #include <cap-ng.h>
653 int main(void)
654 {
655 capng_capability_to_name(CAPNG_EFFECTIVE);
656 return 0;
657 }''', dependencies: libcap_ng)
658 libcap_ng = not_found
659 if get_option('cap_ng').enabled()
660 error('could not link libcap-ng')
661 else
662 warning('could not link libcap-ng, disabling')
663 endif
664endif
665
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400666if get_option('xkbcommon').auto() and not have_system and not have_tools
667 xkbcommon = not_found
668else
669 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100670 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400671endif
Paolo Bonzinie1723992021-10-07 15:08:21 +0200672
Thomas Huth58902582022-04-08 18:20:47 +0200673slirp = not_found
674if not get_option('slirp').auto() or have_system
675 slirp = dependency('slirp', required: get_option('slirp'),
676 method: 'pkg-config', kwargs: static_kwargs)
677 # slirp < 4.7 is incompatible with CFI support in QEMU. This is because
678 # it passes function pointers within libslirp as callbacks for timers.
679 # When using a system-wide shared libslirp, the type information for the
680 # callback is missing and the timer call produces a false positive with CFI.
681 # Do not use the "version" keyword argument to produce a better error.
682 # with control-flow integrity.
683 if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7')
684 if get_option('slirp').enabled()
685 error('Control-Flow Integrity requires libslirp 4.7.')
686 else
687 warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.')
688 slirp = not_found
689 endif
690 endif
691endif
692
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400693vde = not_found
Paolo Bonzinie1723992021-10-07 15:08:21 +0200694if not get_option('vde').auto() or have_system or have_tools
695 vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
696 required: get_option('vde'),
697 kwargs: static_kwargs)
698endif
699if vde.found() and not cc.links('''
700 #include <libvdeplug.h>
701 int main(void)
702 {
703 struct vde_open_args a = {0, 0, 0};
704 char s[] = "";
705 vde_open(s, s, &a);
706 return 0;
707 }''', dependencies: vde)
708 vde = not_found
709 if get_option('cap_ng').enabled()
710 error('could not link libvdeplug')
711 else
712 warning('could not link libvdeplug, disabling')
713 endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400714endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200715
Paolo Bonzini478e9432020-08-17 12:47:55 +0200716pulse = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200717if not get_option('pa').auto() or (targetos == 'linux' and have_system)
718 pulse = dependency('libpulse', required: get_option('pa'),
719 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200720endif
721alsa = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200722if not get_option('alsa').auto() or (targetos == 'linux' and have_system)
723 alsa = dependency('alsa', required: get_option('alsa'),
724 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200725endif
726jack = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200727if not get_option('jack').auto() or have_system
728 jack = dependency('jack', required: get_option('jack'),
729 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200730endif
Alexandre Ratchov663df1c2022-09-07 15:23:42 +0200731sndio = not_found
732if not get_option('sndio').auto() or have_system
733 sndio = dependency('sndio', required: get_option('sndio'),
734 method: 'pkg-config', kwargs: static_kwargs)
735endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200736
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200737spice_protocol = not_found
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200738if not get_option('spice_protocol').auto() or have_system
739 spice_protocol = dependency('spice-protocol', version: '>=0.12.3',
740 required: get_option('spice_protocol'),
741 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini26347332019-07-29 15:40:07 +0200742endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200743spice = not_found
744if not get_option('spice').auto() or have_system
745 spice = dependency('spice-server', version: '>=0.12.5',
746 required: get_option('spice'),
747 method: 'pkg-config', kwargs: static_kwargs)
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200748endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200749spice_headers = spice.partial_dependency(compile_args: true, includes: true)
750
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400751rt = cc.find_library('rt', required: false)
Paolo Bonzinia399f912021-11-15 14:29:13 +0000752
Paolo Bonzini99650b62019-06-10 12:21:14 +0200753libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100754if not get_option('libiscsi').auto() or have_block
755 libiscsi = dependency('libiscsi', version: '>=1.9.0',
756 required: get_option('libiscsi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100757 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini99650b62019-06-10 12:21:14 +0200758endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400759zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +0100760if not get_option('zstd').auto() or have_block
761 zstd = dependency('libzstd', version: '>=1.4.0',
762 required: get_option('zstd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100763 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400764endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400765virgl = not_found
Paolo Bonzini0265fe92021-12-17 12:36:26 +0100766
767have_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found()
768if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
Paolo Bonzini587d59d2021-06-03 11:31:35 +0200769 virgl = dependency('virglrenderer',
770 method: 'pkg-config',
771 required: get_option('virglrenderer'),
772 kwargs: static_kwargs)
Marc-André Lureauea458962019-07-12 22:23:46 +0400773endif
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -0400774blkio = not_found
775if not get_option('blkio').auto() or have_block
776 blkio = dependency('blkio',
777 method: 'pkg-config',
778 required: get_option('blkio'),
779 kwargs: static_kwargs)
780endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400781curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100782if not get_option('curl').auto() or have_block
783 curl = dependency('libcurl', version: '>=7.29.0',
784 method: 'pkg-config',
785 required: get_option('curl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100786 kwargs: static_kwargs)
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400787endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200788libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200789if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200790 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +0100791 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400792 required: get_option('libudev'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100793 kwargs: static_kwargs)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200794endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200795
Paolo Bonzini5c530152020-10-15 06:09:27 -0400796mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200797mpathpersist = not_found
798mpathpersist_new_api = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100799if targetos == 'linux' and have_tools and get_option('mpath').allowed()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200800 mpath_test_source_new = '''
801 #include <libudev.h>
802 #include <mpath_persist.h>
803 unsigned mpath_mx_alloc_len = 1024;
804 int logsink;
805 static struct config *multipath_conf;
806 extern struct udev *udev;
807 extern struct config *get_multipath_config(void);
808 extern void put_multipath_config(struct config *conf);
809 struct udev *udev;
810 struct config *get_multipath_config(void) { return multipath_conf; }
811 void put_multipath_config(struct config *conf) { }
812 int main(void) {
813 udev = udev_new();
814 multipath_conf = mpath_lib_init();
815 return 0;
816 }'''
817 mpath_test_source_old = '''
818 #include <libudev.h>
819 #include <mpath_persist.h>
820 unsigned mpath_mx_alloc_len = 1024;
821 int logsink;
822 int main(void) {
823 struct udev *udev = udev_new();
824 mpath_lib_init(udev);
825 return 0;
826 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400827 libmpathpersist = cc.find_library('mpathpersist',
828 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100829 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400830 if libmpathpersist.found()
831 mpathlibs += libmpathpersist
832 if enable_static
833 mpathlibs += cc.find_library('devmapper',
834 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100835 kwargs: static_kwargs)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200836 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400837 mpathlibs += cc.find_library('multipath',
838 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100839 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400840 foreach lib: mpathlibs
841 if not lib.found()
842 mpathlibs = []
843 break
844 endif
845 endforeach
846 if mpathlibs.length() == 0
847 msg = 'Dependencies missing for libmpathpersist'
848 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200849 mpathpersist = declare_dependency(dependencies: mpathlibs)
850 mpathpersist_new_api = true
851 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
852 mpathpersist = declare_dependency(dependencies: mpathlibs)
853 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400854 msg = 'Cannot detect libmpathpersist API'
855 endif
856 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200857 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400858 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200859 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400860 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200861 endif
862 endif
863 endif
864endif
865
Yonggang Luo5285e592020-10-13 07:43:48 +0800866iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800867curses = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100868if have_system and get_option('curses').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400869 curses_test = '''
Stefan Weilfbab8cc2021-11-17 21:53:55 +0100870 #if defined(__APPLE__) || defined(__OpenBSD__)
871 #define _XOPEN_SOURCE_EXTENDED 1
872 #endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400873 #include <locale.h>
874 #include <curses.h>
875 #include <wchar.h>
876 int main(void) {
877 wchar_t wch = L'w';
878 setlocale(LC_ALL, "");
879 resize_term(0, 0);
880 addwstr(L"wide chars\n");
881 addnwstr(&wch, 1);
882 add_wch(WACS_DEGREE);
883 return 0;
884 }'''
885
Yonggang Luoca31e302020-11-17 05:31:06 +0800886 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
Paolo Bonzini6d322632022-03-27 16:05:58 +0200887 curses = dependency(curses_dep_list,
888 required: false,
889 method: 'pkg-config',
890 kwargs: static_kwargs)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400891 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Stefan Weilfbab8cc2021-11-17 21:53:55 +0100892 curses_compile_args = ['-DNCURSES_WIDECHAR=1']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400893 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500894 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
895 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400896 else
897 msg = 'curses package not usable'
898 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800899 endif
900 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400901 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400902 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
903 if targetos != 'windows' and not has_curses_h
904 message('Trying with /usr/include/ncursesw')
905 curses_compile_args += ['-I/usr/include/ncursesw']
906 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
907 endif
908 if has_curses_h
909 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
910 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800911 libcurses = cc.find_library(curses_libname,
912 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100913 kwargs: static_kwargs)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400914 if libcurses.found()
915 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
916 curses = declare_dependency(compile_args: curses_compile_args,
917 dependencies: [libcurses])
918 break
919 else
920 msg = 'curses library not usable'
921 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800922 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400923 endforeach
924 endif
925 endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100926 if get_option('iconv').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400927 foreach link_args : [ ['-liconv'], [] ]
928 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
929 # We need to use libiconv if available because mixing libiconv's headers with
930 # the system libc does not work.
931 # However, without adding glib to the dependencies -L/usr/local/lib will not be
932 # included in the command line and libiconv will not be found.
933 if cc.links('''
934 #include <iconv.h>
935 int main(void) {
936 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
937 return conv != (iconv_t) -1;
938 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
939 iconv = declare_dependency(link_args: link_args, dependencies: glib)
940 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800941 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400942 endforeach
943 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400944 if curses.found() and not iconv.found()
945 if get_option('iconv').enabled()
946 error('iconv not available')
947 endif
948 msg = 'iconv required for curses UI but not available'
949 curses = not_found
950 endif
951 if not curses.found() and msg != ''
952 if get_option('curses').enabled()
953 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400954 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400955 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400956 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800957 endif
958endif
959
Paolo Bonzini26347332019-07-29 15:40:07 +0200960brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100961if not get_option('brlapi').auto() or have_system
962 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
963 required: get_option('brlapi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100964 kwargs: static_kwargs)
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100965 if brlapi.found() and not cc.links('''
966 #include <brlapi.h>
967 #include <stddef.h>
968 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
969 brlapi = not_found
970 if get_option('brlapi').enabled()
971 error('could not link brlapi')
972 else
973 warning('could not link brlapi, disabling')
974 endif
975 endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200976endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100977
Paolo Bonzini760e4322020-08-26 08:09:48 +0200978sdl = not_found
Akihiko Odaki64d3fec2022-08-19 22:27:56 +0900979if not get_option('sdl').auto() or have_system
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100980 sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200981 sdl_image = not_found
982endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100983if sdl.found()
984 # work around 2.0.8 bug
985 sdl = declare_dependency(compile_args: '-Wno-undef',
986 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200987 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100988 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100989else
990 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100991 error('sdl-image required, but SDL was @0@'.format(
992 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100993 endif
994 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200995endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100996
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400997rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100998if not get_option('rbd').auto() or have_block
999 librados = cc.find_library('rados', required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001000 kwargs: static_kwargs)
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001001 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
1002 required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001003 kwargs: static_kwargs)
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001004 if librados.found() and librbd.found()
1005 if cc.links('''
1006 #include <stdio.h>
1007 #include <rbd/librbd.h>
1008 int main(void) {
1009 rados_t cluster;
1010 rados_create(&cluster, NULL);
Peter Lieven48672ac2021-07-02 19:23:51 +02001011 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
1012 #error
1013 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001014 return 0;
1015 }''', dependencies: [librbd, librados])
1016 rbd = declare_dependency(dependencies: [librbd, librados])
1017 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +02001018 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001019 else
Peter Lieven48672ac2021-07-02 19:23:51 +02001020 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001021 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001022 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001023endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001024
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001025glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001026glusterfs_ftruncate_has_stat = false
1027glusterfs_iocb_has_stat = false
1028if not get_option('glusterfs').auto() or have_block
1029 glusterfs = dependency('glusterfs-api', version: '>=3',
1030 required: get_option('glusterfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001031 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001032 if glusterfs.found()
1033 glusterfs_ftruncate_has_stat = cc.links('''
1034 #include <glusterfs/api/glfs.h>
1035
1036 int
1037 main(void)
1038 {
1039 /* new glfs_ftruncate() passes two additional args */
1040 return glfs_ftruncate(NULL, 0, NULL, NULL);
1041 }
1042 ''', dependencies: glusterfs)
1043 glusterfs_iocb_has_stat = cc.links('''
1044 #include <glusterfs/api/glfs.h>
1045
1046 /* new glfs_io_cbk() passes two additional glfs_stat structs */
1047 static void
1048 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
1049 {}
1050
1051 int
1052 main(void)
1053 {
1054 glfs_io_cbk iocb = &glusterfs_iocb;
1055 iocb(NULL, 0 , NULL, NULL, NULL);
1056 return 0;
1057 }
1058 ''', dependencies: glusterfs)
1059 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001060endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001061
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001062libssh = not_found
Thomas Huthe6a52b32021-12-09 15:48:01 +01001063if not get_option('libssh').auto() or have_block
1064 libssh = dependency('libssh', version: '>=0.8.7',
1065 method: 'pkg-config',
1066 required: get_option('libssh'),
1067 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001068endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001069
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001070libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001071if not get_option('bzip2').auto() or have_block
1072 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
1073 required: get_option('bzip2'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001074 kwargs: static_kwargs)
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001075 if libbzip2.found() and not cc.links('''
1076 #include <bzlib.h>
1077 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
1078 libbzip2 = not_found
1079 if get_option('bzip2').enabled()
1080 error('could not link libbzip2')
1081 else
1082 warning('could not link libbzip2, disabling')
1083 endif
1084 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001085endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001086
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001087liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +01001088if not get_option('lzfse').auto() or have_block
1089 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
1090 required: get_option('lzfse'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001091 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001092endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001093if liblzfse.found() and not cc.links('''
1094 #include <lzfse.h>
1095 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
1096 liblzfse = not_found
1097 if get_option('lzfse').enabled()
1098 error('could not link liblzfse')
1099 else
1100 warning('could not link liblzfse, disabling')
1101 endif
1102endif
1103
Paolo Bonzini478e9432020-08-17 12:47:55 +02001104oss = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001105if get_option('oss').allowed() and have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02001106 if not cc.has_header('sys/soundcard.h')
1107 # not found
1108 elif targetos == 'netbsd'
1109 oss = cc.find_library('ossaudio', required: get_option('oss'),
1110 kwargs: static_kwargs)
1111 else
1112 oss = declare_dependency()
1113 endif
1114
1115 if not oss.found()
1116 if get_option('oss').enabled()
1117 error('OSS not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001118 endif
1119 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001120endif
1121dsound = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001122if not get_option('dsound').auto() or (targetos == 'windows' and have_system)
1123 if cc.has_header('dsound.h')
1124 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1125 endif
1126
1127 if not dsound.found()
1128 if get_option('dsound').enabled()
1129 error('DirectSound not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001130 endif
1131 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001132endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001133
Paolo Bonzini478e9432020-08-17 12:47:55 +02001134coreaudio = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001135if not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system)
1136 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
1137 required: get_option('coreaudio'))
Paolo Bonzini478e9432020-08-17 12:47:55 +02001138endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001139
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001140opengl = not_found
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001141if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
1142 epoxy = dependency('epoxy', method: 'pkg-config',
1143 required: get_option('opengl'), kwargs: static_kwargs)
1144 if cc.has_header('epoxy/egl.h', dependencies: epoxy)
1145 opengl = epoxy
1146 elif get_option('opengl').enabled()
1147 error('epoxy/egl.h not found')
1148 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001149endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001150gbm = not_found
1151if (have_system or have_tools) and (virgl.found() or opengl.found())
1152 gbm = dependency('gbm', method: 'pkg-config', required: false,
1153 kwargs: static_kwargs)
1154endif
Marc-André Lureauf0caba42022-06-28 17:23:15 +04001155have_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001156
Paolo Bonzini57612512021-06-03 11:15:26 +02001157gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001158gnutls_crypto = not_found
Alyssa Rossabc14fd2021-08-06 14:49:47 +00001159if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001160 # For general TLS support our min gnutls matches
1161 # that implied by our platform support matrix
1162 #
1163 # For the crypto backends, we look for a newer
1164 # gnutls:
1165 #
1166 # Version 3.6.8 is needed to get XTS
1167 # Version 3.6.13 is needed to get PBKDF
1168 # Version 3.6.14 is needed to get HW accelerated XTS
1169 #
1170 # If newer enough gnutls isn't available, we can
1171 # still use a different crypto backend to satisfy
1172 # the platform support requirements
1173 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1174 method: 'pkg-config',
1175 required: false,
1176 kwargs: static_kwargs)
1177 if gnutls_crypto.found()
1178 gnutls = gnutls_crypto
1179 else
1180 # Our min version if all we need is TLS
1181 gnutls = dependency('gnutls', version: '>=3.5.18',
1182 method: 'pkg-config',
1183 required: get_option('gnutls'),
1184 kwargs: static_kwargs)
1185 endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001186endif
1187
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001188# We prefer use of gnutls for crypto, unless the options
1189# explicitly asked for nettle or gcrypt.
1190#
1191# If gnutls isn't available for crypto, then we'll prefer
1192# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +02001193gcrypt = not_found
1194nettle = not_found
Lei He4c5e5122022-05-25 17:01:14 +08001195hogweed = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +01001196xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001197
Paolo Bonzini57612512021-06-03 11:15:26 +02001198if get_option('nettle').enabled() and get_option('gcrypt').enabled()
1199 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +02001200endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001201
1202# Explicit nettle/gcrypt request, so ignore gnutls for crypto
1203if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001204 gnutls_crypto = not_found
1205endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001206
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001207if not gnutls_crypto.found()
1208 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
1209 gcrypt = dependency('libgcrypt', version: '>=1.8',
1210 method: 'config-tool',
1211 required: get_option('gcrypt'),
1212 kwargs: static_kwargs)
1213 # Debian has removed -lgpg-error from libgcrypt-config
1214 # as it "spreads unnecessary dependencies" which in
1215 # turn breaks static builds...
1216 if gcrypt.found() and enable_static
1217 gcrypt = declare_dependency(dependencies: [
1218 gcrypt,
1219 cc.find_library('gpg-error', required: true, kwargs: static_kwargs)])
1220 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001221 endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001222 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1223 nettle = dependency('nettle', version: '>=3.4',
1224 method: 'pkg-config',
1225 required: get_option('nettle'),
1226 kwargs: static_kwargs)
1227 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1228 xts = 'private'
1229 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001230 endif
1231endif
1232
Lei He4c5e5122022-05-25 17:01:14 +08001233gmp = dependency('gmp', required: false, method: 'pkg-config', kwargs: static_kwargs)
1234if nettle.found() and gmp.found()
1235 hogweed = dependency('hogweed', version: '>=3.4',
1236 method: 'pkg-config',
1237 required: get_option('nettle'),
1238 kwargs: static_kwargs)
1239endif
1240
1241
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001242gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +01001243gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001244vte = not_found
Akihiko Odaki64d3fec2022-08-19 22:27:56 +09001245if not get_option('gtk').auto() or have_system
Paolo Bonzini1b695472021-01-07 14:02:29 +01001246 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1247 method: 'pkg-config',
1248 required: get_option('gtk'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001249 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +01001250 if gtk.found()
1251 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1252 method: 'pkg-config',
1253 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001254 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +01001255 gtk = declare_dependency(dependencies: [gtk, gtkx11])
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001256
1257 if not get_option('vte').auto() or have_system
1258 vte = dependency('vte-2.91',
1259 method: 'pkg-config',
1260 required: get_option('vte'),
1261 kwargs: static_kwargs)
1262 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001263 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001264endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001265
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001266x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +02001267if gtkx11.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001268 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001269 kwargs: static_kwargs)
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001270endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001271png = not_found
Kshitij Suri95f85102022-04-08 07:13:34 +00001272if get_option('png').allowed() and have_system
Thomas Huth1ec8c2c2022-06-23 19:49:41 +02001273 png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
Kshitij Suri95f85102022-04-08 07:13:34 +00001274 method: 'pkg-config', kwargs: static_kwargs)
1275endif
1276vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001277jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001278sasl = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001279if get_option('vnc').allowed() and have_system
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001280 vnc = declare_dependency() # dummy dependency
Paolo Bonzini8e242b32020-11-23 13:34:02 -05001281 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001282 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001283 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
1284 required: get_option('vnc_sasl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001285 kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001286 if sasl.found()
1287 sasl = declare_dependency(dependencies: sasl,
1288 compile_args: '-DSTRUCT_IOVEC_DEFINED')
1289 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001290endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01001291
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001292pam = not_found
1293if not get_option('auth_pam').auto() or have_system
1294 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
1295 required: get_option('auth_pam'),
1296 kwargs: static_kwargs)
1297endif
1298if pam.found() and not cc.links('''
1299 #include <stddef.h>
1300 #include <security/pam_appl.h>
1301 int main(void) {
1302 const char *service_name = "qemu";
1303 const char *user = "frank";
1304 const struct pam_conv pam_conv = { 0 };
1305 pam_handle_t *pamh = NULL;
1306 pam_start(service_name, user, &pam_conv, &pamh);
1307 return 0;
1308 }''', dependencies: pam)
1309 pam = not_found
1310 if get_option('auth_pam').enabled()
1311 error('could not link libpam')
1312 else
1313 warning('could not link libpam, disabling')
1314 endif
1315endif
1316
Marc-André Lureau708eab42019-09-03 16:59:33 +04001317snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +01001318if not get_option('snappy').auto() or have_system
1319 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
1320 required: get_option('snappy'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001321 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +04001322endif
Paolo Bonzini565174d2021-11-04 14:35:14 +01001323if snappy.found() and not linker.links('''
Paolo Bonzini241611e2020-11-17 13:32:34 +01001324 #include <snappy-c.h>
1325 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
1326 snappy = not_found
1327 if get_option('snappy').enabled()
1328 error('could not link libsnappy')
1329 else
1330 warning('could not link libsnappy, disabling')
1331 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +04001332endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001333
Marc-André Lureau708eab42019-09-03 16:59:33 +04001334lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001335if not get_option('lzo').auto() or have_system
1336 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
1337 required: get_option('lzo'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001338 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +04001339endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001340if lzo.found() and not cc.links('''
1341 #include <lzo/lzo1x.h>
1342 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
1343 lzo = not_found
1344 if get_option('lzo').enabled()
1345 error('could not link liblzo2')
1346 else
1347 warning('could not link liblzo2, disabling')
1348 endif
1349endif
1350
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001351numa = not_found
1352if not get_option('numa').auto() or have_system or have_tools
1353 numa = cc.find_library('numa', has_headers: ['numa.h'],
1354 required: get_option('numa'),
1355 kwargs: static_kwargs)
1356endif
1357if numa.found() and not cc.links('''
1358 #include <numa.h>
1359 int main(void) { return numa_available(); }
1360 ''', dependencies: numa)
1361 numa = not_found
1362 if get_option('numa').enabled()
1363 error('could not link numa')
1364 else
1365 warning('could not link numa, disabling')
1366 endif
1367endif
1368
Marc-André Lureau55166232019-07-24 19:16:22 +04001369rdma = not_found
Paolo Bonzini3730a732022-04-20 17:33:41 +02001370if not get_option('rdma').auto() or have_system
1371 libumad = cc.find_library('ibumad', required: get_option('rdma'))
1372 rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
1373 required: get_option('rdma'),
1374 kwargs: static_kwargs),
1375 cc.find_library('ibverbs', required: get_option('rdma'),
1376 kwargs: static_kwargs),
1377 libumad]
1378 rdma = declare_dependency(dependencies: rdma_libs)
1379 foreach lib: rdma_libs
1380 if not lib.found()
1381 rdma = not_found
1382 endif
1383 endforeach
Marc-André Lureau55166232019-07-24 19:16:22 +04001384endif
Paolo Bonzini3730a732022-04-20 17:33:41 +02001385
Marc-André Lureau582ea952019-08-15 15:15:32 +04001386xen = not_found
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001387if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
1388 xencontrol = dependency('xencontrol', required: false,
1389 method: 'pkg-config', kwargs: static_kwargs)
1390 if xencontrol.found()
1391 xen_pc = declare_dependency(version: xencontrol.version(),
1392 dependencies: [
1393 xencontrol,
1394 # disabler: true makes xen_pc.found() return false if any is not found
1395 dependency('xenstore', required: false,
1396 method: 'pkg-config', kwargs: static_kwargs,
1397 disabler: true),
1398 dependency('xenforeignmemory', required: false,
1399 method: 'pkg-config', kwargs: static_kwargs,
1400 disabler: true),
1401 dependency('xengnttab', required: false,
1402 method: 'pkg-config', kwargs: static_kwargs,
1403 disabler: true),
1404 dependency('xenevtchn', required: false,
1405 method: 'pkg-config', kwargs: static_kwargs,
1406 disabler: true),
1407 dependency('xendevicemodel', required: false,
1408 method: 'pkg-config', kwargs: static_kwargs,
1409 disabler: true),
1410 # optional, no "disabler: true"
1411 dependency('xentoolcore', required: false,
1412 method: 'pkg-config', kwargs: static_kwargs)])
1413 if xen_pc.found()
1414 xen = xen_pc
1415 endif
1416 endif
1417 if not xen.found()
1418 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' ]
1419 xen_libs = {
1420 '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
1421 '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
1422 '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
1423 '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
1424 '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
1425 '4.6.0': [ 'xenstore', 'xenctrl' ],
1426 '4.5.0': [ 'xenstore', 'xenctrl' ],
1427 '4.2.0': [ 'xenstore', 'xenctrl' ],
1428 }
1429 xen_deps = {}
1430 foreach ver: xen_tests
1431 # cache the various library tests to avoid polluting the logs
1432 xen_test_deps = []
1433 foreach l: xen_libs[ver]
1434 if l not in xen_deps
1435 xen_deps += { l: cc.find_library(l, required: false) }
1436 endif
1437 xen_test_deps += xen_deps[l]
1438 endforeach
1439
1440 # Use -D to pick just one of the test programs in scripts/xen-detect.c
1441 xen_version = ver.split('.')
1442 xen_ctrl_version = xen_version[0] + \
1443 ('0' + xen_version[1]).substring(-2) + \
1444 ('0' + xen_version[2]).substring(-2)
1445 if cc.links(files('scripts/xen-detect.c'),
1446 args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
1447 dependencies: xen_test_deps)
1448 xen = declare_dependency(version: ver, dependencies: xen_test_deps)
1449 break
1450 endif
1451 endforeach
1452 endif
1453 if xen.found()
1454 accelerators += 'CONFIG_XEN'
1455 elif get_option('xen').enabled()
1456 error('could not compile and link Xen test program')
1457 endif
Marc-André Lureau582ea952019-08-15 15:15:32 +04001458endif
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001459have_xen_pci_passthrough = get_option('xen_pci_passthrough') \
1460 .require(xen.found(),
1461 error_message: 'Xen PCI passthrough requested but Xen not enabled') \
1462 .require(targetos == 'linux',
1463 error_message: 'Xen PCI passthrough not available on this platform') \
1464 .allowed()
1465
1466
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001467cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02001468if not get_option('smartcard').auto() or have_system
1469 cacard = dependency('libcacard', required: get_option('smartcard'),
1470 version: '>=2.5.1', method: 'pkg-config',
1471 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001472endif
César Belley0a40bcb2020-08-26 13:42:04 +02001473u2f = not_found
1474if have_system
1475 u2f = dependency('u2f-emu', required: get_option('u2f'),
1476 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001477 kwargs: static_kwargs)
César Belley0a40bcb2020-08-26 13:42:04 +02001478endif
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08001479canokey = not_found
1480if have_system
1481 canokey = dependency('canokey-qemu', required: get_option('canokey'),
1482 method: 'pkg-config',
1483 kwargs: static_kwargs)
1484endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001485usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02001486if not get_option('usb_redir').auto() or have_system
1487 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
1488 version: '>=0.6', method: 'pkg-config',
1489 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001490endif
1491libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02001492if not get_option('libusb').auto() or have_system
1493 libusb = dependency('libusb-1.0', required: get_option('libusb'),
1494 version: '>=1.0.13', method: 'pkg-config',
1495 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001496endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02001497
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001498libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02001499if not get_option('libpmem').auto() or have_system
1500 libpmem = dependency('libpmem', required: get_option('libpmem'),
1501 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001502endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001503libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02001504if not get_option('libdaxctl').auto() or have_system
1505 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
1506 version: '>=57', method: 'pkg-config',
1507 kwargs: static_kwargs)
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001508endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001509tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02001510if gnutls.found()
1511 tasn1 = dependency('libtasn1',
1512 method: 'pkg-config',
1513 kwargs: static_kwargs)
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001514endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001515keyutils = dependency('libkeyutils', required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001516 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001517
Marc-André Lureau3909def2020-08-28 15:07:33 +04001518has_gettid = cc.has_function('gettid')
1519
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001520# libselinux
1521selinux = dependency('libselinux',
1522 required: get_option('selinux'),
1523 method: 'pkg-config', kwargs: static_kwargs)
1524
Paolo Bonziniaa087962020-09-01 11:15:30 -04001525# Malloc tests
1526
1527malloc = []
1528if get_option('malloc') == 'system'
1529 has_malloc_trim = \
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001530 get_option('malloc_trim').allowed() and \
Paolo Bonziniaa087962020-09-01 11:15:30 -04001531 cc.links('''#include <malloc.h>
1532 int main(void) { malloc_trim(0); return 0; }''')
1533else
1534 has_malloc_trim = false
1535 malloc = cc.find_library(get_option('malloc'), required: true)
1536endif
1537if not has_malloc_trim and get_option('malloc_trim').enabled()
1538 if get_option('malloc') == 'system'
1539 error('malloc_trim not available on this platform.')
1540 else
1541 error('malloc_trim not available with non-libc memory allocator')
1542 endif
1543endif
1544
Max Reitz84e319a2020-11-02 17:18:55 +01001545# Check whether the glibc provides statx()
1546
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001547gnu_source_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01001548 #ifndef _GNU_SOURCE
1549 #define _GNU_SOURCE
1550 #endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001551'''
1552statx_test = gnu_source_prefix + '''
Max Reitz84e319a2020-11-02 17:18:55 +01001553 #include <sys/stat.h>
1554 int main(void) {
1555 struct statx statxbuf;
1556 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
1557 return 0;
1558 }'''
1559
1560has_statx = cc.links(statx_test)
1561
Hanna Reitz4ce7a082022-02-23 10:23:40 +01001562# Check whether statx() provides mount ID information
1563
1564statx_mnt_id_test = gnu_source_prefix + '''
1565 #include <sys/stat.h>
1566 int main(void) {
1567 struct statx statxbuf;
1568 statx(0, "", 0, STATX_BASIC_STATS | STATX_MNT_ID, &statxbuf);
1569 return statxbuf.stx_mnt_id;
1570 }'''
1571
1572has_statx_mnt_id = cc.links(statx_mnt_id_test)
1573
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001574have_vhost_user_blk_server = get_option('vhost_user_blk_server') \
1575 .require(targetos == 'linux',
1576 error_message: 'vhost_user_blk_server requires linux') \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02001577 .require(have_vhost_user,
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001578 error_message: 'vhost_user_blk_server requires vhost-user support') \
Alex Bennée26ed5012022-05-24 16:40:42 +01001579 .disable_auto_if(not have_tools and not have_system) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001580 .allowed()
Daniele Buono9e62ba42020-12-04 18:06:14 -05001581
Max Reitzdf4ea702020-10-27 20:05:46 +01001582if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1583 error('Cannot enable fuse-lseek while fuse is disabled')
1584endif
1585
Max Reitza484a712020-10-27 20:05:41 +01001586fuse = dependency('fuse3', required: get_option('fuse'),
1587 version: '>=3.1', method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001588 kwargs: static_kwargs)
Max Reitza484a712020-10-27 20:05:41 +01001589
Max Reitzdf4ea702020-10-27 20:05:46 +01001590fuse_lseek = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001591if get_option('fuse_lseek').allowed()
Max Reitzdf4ea702020-10-27 20:05:46 +01001592 if fuse.version().version_compare('>=3.8')
1593 # Dummy dependency
1594 fuse_lseek = declare_dependency()
1595 elif get_option('fuse_lseek').enabled()
1596 if fuse.found()
1597 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1598 else
1599 error('fuse-lseek requires libfuse, which was not found')
1600 endif
1601 endif
1602endif
1603
Xie Yongjia6caeee2022-05-23 16:46:08 +08001604have_libvduse = (targetos == 'linux')
1605if get_option('libvduse').enabled()
1606 if targetos != 'linux'
1607 error('libvduse requires linux')
1608 endif
1609elif get_option('libvduse').disabled()
1610 have_libvduse = false
1611endif
1612
Xie Yongji2a2359b2022-05-23 16:46:09 +08001613have_vduse_blk_export = (have_libvduse and targetos == 'linux')
1614if get_option('vduse_blk_export').enabled()
1615 if targetos != 'linux'
1616 error('vduse_blk_export requires linux')
1617 elif not have_libvduse
1618 error('vduse_blk_export requires libvduse support')
1619 endif
1620elif get_option('vduse_blk_export').disabled()
1621 have_vduse_blk_export = false
1622endif
1623
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001624# libbpf
1625libbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
1626if libbpf.found() and not cc.links('''
1627 #include <bpf/libbpf.h>
1628 int main(void)
1629 {
1630 bpf_object__destroy_skeleton(NULL);
1631 return 0;
1632 }''', dependencies: libbpf)
1633 libbpf = not_found
1634 if get_option('bpf').enabled()
1635 error('libbpf skeleton test failed')
1636 else
1637 warning('libbpf skeleton test failed, disabling')
1638 endif
1639endif
1640
Paolo Bonzini87430d52021-10-07 15:06:09 +02001641#################
1642# config-host.h #
1643#################
1644
1645audio_drivers_selected = []
1646if have_system
1647 audio_drivers_available = {
1648 'alsa': alsa.found(),
1649 'coreaudio': coreaudio.found(),
1650 'dsound': dsound.found(),
1651 'jack': jack.found(),
1652 'oss': oss.found(),
1653 'pa': pulse.found(),
1654 'sdl': sdl.found(),
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001655 'sndio': sndio.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02001656 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02001657 foreach k, v: audio_drivers_available
1658 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
1659 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02001660
1661 # Default to native drivers first, OSS second, SDL third
1662 audio_drivers_priority = \
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001663 [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \
Paolo Bonzini87430d52021-10-07 15:06:09 +02001664 (targetos == 'linux' ? [] : [ 'sdl' ])
1665 audio_drivers_default = []
1666 foreach k: audio_drivers_priority
1667 if audio_drivers_available[k]
1668 audio_drivers_default += k
1669 endif
1670 endforeach
1671
1672 foreach k: get_option('audio_drv_list')
1673 if k == 'default'
1674 audio_drivers_selected += audio_drivers_default
1675 elif not audio_drivers_available[k]
1676 error('Audio driver "@0@" not available.'.format(k))
1677 else
1678 audio_drivers_selected += k
1679 endif
1680 endforeach
1681endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001682config_host_data.set('CONFIG_AUDIO_DRIVERS',
1683 '"' + '", "'.join(audio_drivers_selected) + '", ')
1684
Daniele Buono9e62ba42020-12-04 18:06:14 -05001685if get_option('cfi')
1686 cfi_flags=[]
1687 # Check for dependency on LTO
1688 if not get_option('b_lto')
1689 error('Selected Control-Flow Integrity but LTO is disabled')
1690 endif
1691 if config_host.has_key('CONFIG_MODULES')
1692 error('Selected Control-Flow Integrity is not compatible with modules')
1693 endif
1694 # Check for cfi flags. CFI requires LTO so we can't use
1695 # get_supported_arguments, but need a more complex "compiles" which allows
1696 # custom arguments
1697 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1698 args: ['-flto', '-fsanitize=cfi-icall'] )
1699 cfi_flags += '-fsanitize=cfi-icall'
1700 else
1701 error('-fsanitize=cfi-icall is not supported by the compiler')
1702 endif
1703 if cc.compiles('int main () { return 0; }',
1704 name: '-fsanitize-cfi-icall-generalize-pointers',
1705 args: ['-flto', '-fsanitize=cfi-icall',
1706 '-fsanitize-cfi-icall-generalize-pointers'] )
1707 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1708 else
1709 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1710 endif
1711 if get_option('cfi_debug')
1712 if cc.compiles('int main () { return 0; }',
1713 name: '-fno-sanitize-trap=cfi-icall',
1714 args: ['-flto', '-fsanitize=cfi-icall',
1715 '-fno-sanitize-trap=cfi-icall'] )
1716 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1717 else
1718 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1719 endif
1720 endif
Marc-André Lureau5fc06172021-01-14 16:56:02 +04001721 add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1722 add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
Daniele Buono9e62ba42020-12-04 18:06:14 -05001723endif
1724
Joelle van Dyne14176c82021-03-15 11:03:38 -07001725have_host_block_device = (targetos != 'darwin' or
1726 cc.has_header('IOKit/storage/IOMedia.h'))
1727
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001728dbus_display = get_option('dbus_display') \
1729 .require(gio.version().version_compare('>=2.64'),
1730 error_message: '-display dbus requires glib>=2.64') \
Paolo Bonzini75440602022-04-20 17:33:44 +02001731 .require(gdbus_codegen.found(),
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02001732 error_message: gdbus_codegen_error.format('-display dbus')) \
Paolo Bonzinid82b11f2022-07-28 08:41:28 +02001733 .require(opengl.found() and gbm.found(),
1734 error_message: '-display dbus requires epoxy/egl and gbm') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001735 .allowed()
Marc-André Lureau142ca622021-07-15 11:53:53 +04001736
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001737have_virtfs = get_option('virtfs') \
Keno Fischer0fb1e192022-02-27 17:35:22 -05001738 .require(targetos == 'linux' or targetos == 'darwin',
1739 error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
1740 .require(targetos == 'linux' or cc.has_function('pthread_fchdir_np'),
1741 error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
1742 .require(targetos == 'darwin' or (libattr.found() and libcap_ng.found()),
1743 error_message: 'virtio-9p (virtfs) on Linux requires libcap-ng-devel and libattr-devel') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001744 .disable_auto_if(not have_tools and not have_system) \
1745 .allowed()
Paolo Bonzini69202b42020-11-17 14:46:21 +01001746
Keno Fischer0fb1e192022-02-27 17:35:22 -05001747have_virtfs_proxy_helper = targetos != 'darwin' and have_virtfs and have_tools
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01001748
Paolo Bonzini622d64f2022-04-20 17:33:53 +02001749if get_option('block_drv_ro_whitelist') == ''
1750 config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
1751else
1752 config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
1753 '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
1754endif
1755if get_option('block_drv_rw_whitelist') == ''
1756 config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
1757else
1758 config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
1759 '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
1760endif
1761
Paolo Bonzini9c29b742021-10-07 15:08:14 +02001762foreach k : get_option('trace_backends')
1763 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
1764endforeach
1765config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02001766config_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
Paolo Bonzini40c909f2022-04-20 17:33:49 +02001767if iasl.found()
1768 config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
Paolo Bonzini5dc46182021-10-13 13:19:00 +02001769endif
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001770config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1771config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1772config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1773config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1774config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09001775
1776qemu_firmwarepath = ''
1777foreach k : get_option('qemu_firmwarepath')
1778 qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
1779endforeach
1780config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
1781
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001782config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1783config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1784config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1785config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1786config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1787config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1788
Paolo Bonzinib0b43232022-04-20 17:33:54 +02001789if config_host.has_key('CONFIG_MODULES')
1790 config_host_data.set('CONFIG_STAMP', run_command(
1791 meson.current_source_dir() / 'scripts/qemu-stamp.py',
1792 meson.project_version(), get_option('pkgversion'), '--',
1793 meson.current_source_dir() / 'configure',
1794 capture: true, check: true).stdout().strip())
1795endif
1796
Paolo Bonzini35acbb32021-10-13 13:43:36 +02001797have_slirp_smbd = get_option('slirp_smbd') \
1798 .require(targetos != 'windows', error_message: 'Host smbd not supported on this platform.') \
1799 .allowed()
1800if have_slirp_smbd
1801 smbd_path = get_option('smbd')
1802 if smbd_path == ''
1803 smbd_path = (targetos == 'solaris' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
1804 endif
1805 config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
1806endif
1807
Paolo Bonzini823eb012021-11-08 14:18:17 +01001808config_host_data.set('HOST_' + host_arch.to_upper(), 1)
1809
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02001810if get_option('module_upgrades') and not enable_modules
1811 error('Cannot enable module-upgrades as modules are not enabled')
1812endif
1813config_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
1814
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001815config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001816config_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001817config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04001818config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzini537b7242021-10-07 15:08:12 +02001819config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02001820config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001821config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001822config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001823config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1824config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04001825config_host_data.set('CONFIG_BLKIO', blkio.found())
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001826config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08001827config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02001828config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini75440602022-04-20 17:33:44 +02001829config_host_data.set('CONFIG_GIO', gio.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001830config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1831if glusterfs.found()
1832 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1833 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1834 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1835 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1836 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1837 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1838endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001839config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001840config_host_data.set('CONFIG_VTE', vte.found())
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001841config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001842config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001843config_host_data.set('CONFIG_EBPF', libbpf.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001844config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001845config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01001846config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Thomas Huthe6a52b32021-12-09 15:48:01 +01001847config_host_data.set('CONFIG_LIBSSH', libssh.found())
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001848config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001849config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
Sam Lie2848bc2022-05-31 18:50:11 +08001850config_host_data.set('CONFIG_LIBURING_REGISTER_RING_FD', cc.has_function('io_uring_register_ring_fd', prefix: '#include <liburing.h>', dependencies:linux_io_uring))
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001851config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001852config_host_data.set('CONFIG_NUMA', numa.found())
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001853config_host_data.set('CONFIG_OPENGL', opengl.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001854config_host_data.set('CONFIG_PROFILER', get_option('profiler'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001855config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini3730a732022-04-20 17:33:41 +02001856config_host_data.set('CONFIG_RDMA', rdma.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001857config_host_data.set('CONFIG_SDL', sdl.found())
1858config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01001859config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01001860config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01001861config_host_data.set('CONFIG_TPM', have_tpm)
Paolo Bonzini90540f32021-06-03 11:15:26 +02001862config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Paolo Bonzinie1723992021-10-07 15:08:21 +02001863config_host_data.set('CONFIG_VDE', vde.found())
Paolo Bonzini2df89d52022-04-20 17:34:07 +02001864config_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
1865config_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
1866config_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
1867config_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
1868config_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
1869config_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
1870config_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03001871config_host_data.set('CONFIG_VMNET', vmnet.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001872config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Xie Yongji2a2359b2022-05-23 16:46:09 +08001873config_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
Kshitij Suri95f85102022-04-08 07:13:34 +00001874config_host_data.set('CONFIG_PNG', png.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001875config_host_data.set('CONFIG_VNC', vnc.found())
1876config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001877config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01001878config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001879config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001880config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001881config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04001882config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02001883config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001884config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Daniel P. Berrangéd47b83b2022-04-26 17:00:43 +01001885config_host_data.set('CONFIG_TASN1', tasn1.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02001886config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
1887config_host_data.set('CONFIG_NETTLE', nettle.found())
Lei He4c5e5122022-05-25 17:01:14 +08001888config_host_data.set('CONFIG_HOGWEED', hogweed.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02001889config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04001890config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01001891config_host_data.set('CONFIG_STATX', has_statx)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01001892config_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id)
Paolo Bonzinib1def332020-11-17 13:37:39 +01001893config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01001894config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01001895config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001896config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
Marc-André Lureauddece462021-10-06 14:18:09 +04001897if spice_protocol.found()
1898config_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
1899config_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
1900config_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
1901endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001902config_host_data.set('CONFIG_SPICE', spice.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01001903config_host_data.set('CONFIG_X11', x11.found())
Marc-André Lureau142ca622021-07-15 11:53:53 +04001904config_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
Daniele Buono9e62ba42020-12-04 18:06:14 -05001905config_host_data.set('CONFIG_CFI', get_option('cfi'))
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001906config_host_data.set('CONFIG_SELINUX', selinux.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001907config_host_data.set('CONFIG_XEN_BACKEND', xen.found())
1908if xen.found()
1909 # protect from xen.version() having less than three components
1910 xen_version = xen.version().split('.') + ['0', '0']
1911 xen_ctrl_version = xen_version[0] + \
1912 ('0' + xen_version[1]).substring(-2) + \
1913 ('0' + xen_version[2]).substring(-2)
1914 config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
1915endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001916config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1917config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1918config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1919config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1920
Paolo Bonzinia6305082021-10-07 15:08:15 +02001921config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001922config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
1923
Paolo Bonzini728c0a22021-10-13 11:52:03 +02001924have_coroutine_pool = get_option('coroutine_pool')
1925if get_option('debug_stack_usage') and have_coroutine_pool
1926 message('Disabling coroutine pool to measure stack usage')
1927 have_coroutine_pool = false
1928endif
1929config_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool)
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001930config_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
Paolo Bonzini728c0a22021-10-13 11:52:03 +02001931config_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001932config_host_data.set('CONFIG_GPROF', get_option('gprof'))
Paolo Bonzini406523f2021-10-13 11:43:54 +02001933config_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001934config_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
Juan Quintelaabad1852022-09-02 18:51:25 +02001935config_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
Paolo Bonzini406523f2021-10-13 11:43:54 +02001936
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001937# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001938config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02001939config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
1940config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
Thomas Huth48f670e2020-11-18 18:10:52 +01001941config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001942config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001943config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001944config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001945config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001946config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Bin Mengd4093732022-08-02 15:51:58 +08001947if targetos == 'windows'
1948 config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
1949endif
Thomas Huthded5d782020-11-14 11:10:11 +01001950
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001951# has_function
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001952config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001953config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
1954config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
1955config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
1956config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Peter Maydell86983432022-02-26 18:07:19 +00001957# Note that we need to specify prefix: here to avoid incorrectly
1958# thinking that Windows has posix_memalign()
1959config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
Peter Maydell5c8c7142022-02-26 18:07:20 +00001960config_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
Peter Maydell88454f82022-02-26 18:07:21 +00001961config_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
1962config_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001963config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001964config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Keno Fischer029ed1b2022-02-27 17:35:20 -05001965config_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001966config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
1967config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
1968config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
1969config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
1970config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001971config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Andrew Deason59e35c72022-04-26 14:55:22 -05001972config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001973config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001974config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001975config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Stefano Garzarella66dc5f92022-05-17 09:10:12 +02001976if rbd.found()
1977 config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
1978 cc.has_function('rbd_namespace_exists',
1979 dependencies: rbd,
1980 prefix: '#include <rbd/librbd.h>'))
1981endif
Li Zhijian911965a2021-09-10 15:02:55 +08001982if rdma.found()
1983 config_host_data.set('HAVE_IBV_ADVISE_MR',
1984 cc.has_function('ibv_advise_mr',
Paolo Bonzini3730a732022-04-20 17:33:41 +02001985 dependencies: rdma,
Li Zhijian911965a2021-09-10 15:02:55 +08001986 prefix: '#include <infiniband/verbs.h>'))
1987endif
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001988
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001989# has_header_symbol
1990config_host_data.set('CONFIG_BYTESWAP_H',
1991 cc.has_header_symbol('byteswap.h', 'bswap_32'))
1992config_host_data.set('CONFIG_EPOLL_CREATE1',
1993 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
1994config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
1995 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
1996 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
1997config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
1998 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
1999config_host_data.set('CONFIG_FIEMAP',
2000 cc.has_header('linux/fiemap.h') and
2001 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002002config_host_data.set('CONFIG_GETRANDOM',
2003 cc.has_function('getrandom') and
2004 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002005config_host_data.set('CONFIG_INOTIFY',
2006 cc.has_header_symbol('sys/inotify.h', 'inotify_init'))
2007config_host_data.set('CONFIG_INOTIFY1',
2008 cc.has_header_symbol('sys/inotify.h', 'inotify_init1'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002009config_host_data.set('CONFIG_MACHINE_BSWAP_H',
2010 cc.has_header_symbol('machine/bswap.h', 'bswap32',
2011 prefix: '''#include <sys/endian.h>
2012 #include <sys/types.h>'''))
2013config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
2014 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002015config_host_data.set('CONFIG_RTNETLINK',
2016 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
2017config_host_data.set('CONFIG_SYSMACROS',
2018 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002019config_host_data.set('HAVE_OPTRESET',
2020 cc.has_header_symbol('getopt.h', 'optreset'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04002021config_host_data.set('HAVE_IPPROTO_MPTCP',
2022 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Daniel P. Berrangé3cd3df22022-08-02 12:41:34 -04002023config_host_data.set('HAVE_SYS_MOUNT_FSCONFIG',
2024 cc.has_header_symbol('sys/mount.h', 'FSCONFIG_SET_FLAG'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002025
2026# has_member
2027config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
2028 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
2029 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002030config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
2031 cc.has_member('struct stat', 'st_atim',
2032 prefix: '#include <sys/stat.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002033
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002034# has_type
2035config_host_data.set('CONFIG_IOVEC',
2036 cc.has_type('struct iovec',
2037 prefix: '#include <sys/uio.h>'))
2038config_host_data.set('HAVE_UTMPX',
2039 cc.has_type('struct utmpx',
2040 prefix: '#include <utmpx.h>'))
2041
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002042config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002043 #include <sys/eventfd.h>
2044 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002045config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002046 #include <unistd.h>
2047 int main(void) {
2048 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2049 return fdatasync(0);
2050 #else
2051 #error Not supported
2052 #endif
2053 }'''))
Andrew Deason8900c202022-03-15 22:52:25 -05002054
2055has_madvise = cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002056 #include <sys/types.h>
2057 #include <sys/mman.h>
2058 #include <stddef.h>
Andrew Deason8900c202022-03-15 22:52:25 -05002059 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
2060missing_madvise_proto = false
2061if has_madvise
2062 # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
2063 # but forget to prototype it. In this case, has_madvise will be true (the
2064 # test program links despite a compile warning). To detect the
2065 # missing-prototype case, we try again with a definitely-bogus prototype.
2066 # This will only compile if the system headers don't provide the prototype;
2067 # otherwise the conflicting prototypes will cause a compiler error.
2068 missing_madvise_proto = cc.links(gnu_source_prefix + '''
2069 #include <sys/types.h>
2070 #include <sys/mman.h>
2071 #include <stddef.h>
2072 extern int madvise(int);
2073 int main(void) { return madvise(0); }''')
2074endif
2075config_host_data.set('CONFIG_MADVISE', has_madvise)
2076config_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
2077
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002078config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002079 #include <sys/mman.h>
2080 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002081config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002082 #include <fcntl.h>
2083 #if !defined(AT_EMPTY_PATH)
2084 # error missing definition
2085 #else
2086 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2087 #endif'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002088config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002089 #include <sys/mman.h>
2090 #include <stddef.h>
2091 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002092
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002093config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002094 #include <pthread.h>
2095
2096 static void *f(void *p) { return NULL; }
2097 int main(void)
2098 {
2099 pthread_t thread;
2100 pthread_create(&thread, 0, f, 0);
2101 pthread_setname_np(thread, "QEMU");
2102 return 0;
2103 }''', dependencies: threads))
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002104config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002105 #include <pthread.h>
2106
2107 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
2108 int main(void)
2109 {
2110 pthread_t thread;
2111 pthread_create(&thread, 0, f, 0);
2112 return 0;
2113 }''', dependencies: threads))
Longpeng(Mike)657ac982022-02-22 17:05:05 +08002114config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
2115 #include <pthread.h>
2116 #include <time.h>
2117
2118 int main(void)
2119 {
2120 pthread_condattr_t attr
2121 pthread_condattr_init(&attr);
2122 pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2123 return 0;
2124 }''', dependencies: threads))
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002125
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002126config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02002127 #include <sys/signalfd.h>
2128 #include <stddef.h>
2129 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002130config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002131 #include <unistd.h>
2132 #include <fcntl.h>
2133 #include <limits.h>
2134
2135 int main(void)
2136 {
2137 int len, fd = 0;
2138 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2139 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2140 return 0;
2141 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002142
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002143config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
2144 #include <sys/mman.h>
2145 int main(int argc, char *argv[]) {
2146 return mlockall(MCL_FUTURE);
2147 }'''))
2148
Thomas Hutheea94532021-10-28 20:59:08 +02002149have_l2tpv3 = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002150if get_option('l2tpv3').allowed() and have_system
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002151 have_l2tpv3 = cc.has_type('struct mmsghdr',
2152 prefix: gnu_source_prefix + '''
2153 #include <sys/socket.h>
2154 #include <linux/ip.h>''')
Thomas Hutheea94532021-10-28 20:59:08 +02002155endif
2156config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2157
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002158have_netmap = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002159if get_option('netmap').allowed() and have_system
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002160 have_netmap = cc.compiles('''
2161 #include <inttypes.h>
2162 #include <net/if.h>
2163 #include <net/netmap.h>
2164 #include <net/netmap_user.h>
2165 #if (NETMAP_API < 11) || (NETMAP_API > 15)
2166 #error
2167 #endif
2168 int main(void) { return 0; }''')
2169 if not have_netmap and get_option('netmap').enabled()
2170 error('Netmap headers not available')
2171 endif
2172endif
2173config_host_data.set('CONFIG_NETMAP', have_netmap)
2174
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002175# Work around a system header bug with some kernel/XFS header
2176# versions where they both try to define 'struct fsxattr':
2177# xfs headers will not try to redefine structs from linux headers
2178# if this macro is set.
2179config_host_data.set('HAVE_FSXATTR', cc.links('''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002180 #include <linux/fs.h>
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002181 struct fsxattr foo;
2182 int main(void) {
2183 return 0;
2184 }'''))
2185
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002186# Some versions of Mac OS X incorrectly define SIZE_MAX
2187config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2188 #include <stdint.h>
2189 #include <stdio.h>
2190 int main(int argc, char *argv[]) {
2191 return printf("%zu", SIZE_MAX);
2192 }''', args: ['-Werror']))
2193
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002194atomic_test = '''
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002195 #include <stdint.h>
2196 int main(void)
2197 {
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002198 @0@ x = 0, y = 0;
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002199 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
2200 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
2201 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2202 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2203 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2204 return 0;
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002205 }'''
2206
2207# See if 64-bit atomic operations are supported.
2208# Note that without __atomic builtins, we can only
2209# assume atomic loads/stores max at pointer size.
2210config_host_data.set('CONFIG_ATOMIC64', cc.links(atomic_test.format('uint64_t')))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002211
Marc-André Lureau848126d2022-02-28 15:49:19 +04002212has_int128 = cc.links('''
2213 __int128_t a;
2214 __uint128_t b;
2215 int main (void) {
2216 a = a + b;
2217 b = a * b;
2218 a = a * a;
2219 return 0;
2220 }''')
2221
2222config_host_data.set('CONFIG_INT128', has_int128)
2223
2224if has_int128
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002225 # "do we have 128-bit atomics which are handled inline and specifically not
2226 # via libatomic". The reason we can't use libatomic is documented in the
2227 # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
2228 has_atomic128 = cc.links(atomic_test.format('unsigned __int128'))
Marc-André Lureau848126d2022-02-28 15:49:19 +04002229
2230 config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
2231
2232 if not has_atomic128
2233 has_cmpxchg128 = cc.links('''
2234 int main(void)
2235 {
2236 unsigned __int128 x = 0, y = 0;
2237 __sync_val_compare_and_swap_16(&x, y, x);
2238 return 0;
2239 }
2240 ''')
2241
2242 config_host_data.set('CONFIG_CMPXCHG128', has_cmpxchg128)
2243 endif
2244endif
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002245
2246config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
2247 #include <sys/auxv.h>
2248 int main(void) {
2249 return getauxval(AT_HWCAP) == 0;
2250 }'''))
2251
Paolo Bonzini0dae95d2022-04-20 17:33:43 +02002252config_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
2253 #include <linux/usbdevice_fs.h>
2254
2255 #ifndef USBDEVFS_GET_CAPABILITIES
2256 #error "USBDEVFS_GET_CAPABILITIES undefined"
2257 #endif
2258
2259 #ifndef USBDEVFS_DISCONNECT_CLAIM
2260 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
2261 #endif
2262
2263 int main(void) { return 0; }'''))
2264
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02002265have_keyring = get_option('keyring') \
2266 .require(targetos == 'linux', error_message: 'keyring is only available on Linux') \
2267 .require(cc.compiles('''
2268 #include <errno.h>
2269 #include <asm/unistd.h>
2270 #include <linux/keyctl.h>
2271 #include <sys/syscall.h>
2272 #include <unistd.h>
2273 int main(void) {
2274 return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
2275 }'''), error_message: 'keyctl syscall not available on this system').allowed()
2276config_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
2277
Paolo Bonzini622753d2021-11-08 13:38:58 +01002278have_cpuid_h = cc.links('''
2279 #include <cpuid.h>
2280 int main(void) {
2281 unsigned a, b, c, d;
2282 unsigned max = __get_cpuid_max(0, 0);
2283
2284 if (max >= 1) {
2285 __cpuid(1, a, b, c, d);
2286 }
2287
2288 if (max >= 7) {
2289 __cpuid_count(7, 0, a, b, c, d);
2290 }
2291
2292 return 0;
2293 }''')
2294config_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
2295
2296config_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
2297 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
2298 .require(cc.links('''
2299 #pragma GCC push_options
2300 #pragma GCC target("avx2")
2301 #include <cpuid.h>
2302 #include <immintrin.h>
2303 static int bar(void *a) {
2304 __m256i x = *(__m256i *)a;
2305 return _mm256_testz_si256(x, x);
2306 }
2307 int main(int argc, char *argv[]) { return bar(argv[0]); }
2308 '''), error_message: 'AVX2 not available').allowed())
2309
2310config_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \
2311 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \
2312 .require(cc.links('''
2313 #pragma GCC push_options
2314 #pragma GCC target("avx512f")
2315 #include <cpuid.h>
2316 #include <immintrin.h>
2317 static int bar(void *a) {
2318 __m512i x = *(__m512i *)a;
2319 return _mm512_test_epi64_mask(x, x);
2320 }
2321 int main(int argc, char *argv[]) { return bar(argv[0]); }
2322 '''), error_message: 'AVX512F not available').allowed())
2323
Paolo Bonzini3730a732022-04-20 17:33:41 +02002324have_pvrdma = get_option('pvrdma') \
2325 .require(rdma.found(), error_message: 'PVRDMA requires OpenFabrics libraries') \
Juan Quintela354d2d92022-05-02 15:11:19 +02002326 .require(cc.compiles(gnu_source_prefix + '''
2327 #include <sys/mman.h>
Paolo Bonzini3730a732022-04-20 17:33:41 +02002328 int main(void)
2329 {
2330 char buf = 0;
2331 void *addr = &buf;
2332 addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
2333
2334 return 0;
2335 }'''), error_message: 'PVRDMA requires mremap').allowed()
2336
2337if have_pvrdma
Juan Quintela354d2d92022-05-02 15:11:19 +02002338 config_host_data.set('LEGACY_RDMA_REG_MR', not cc.links('''
Paolo Bonzini3730a732022-04-20 17:33:41 +02002339 #include <infiniband/verbs.h>
2340 int main(void)
2341 {
2342 struct ibv_mr *mr;
2343 struct ibv_pd *pd = NULL;
2344 size_t length = 10;
2345 uint64_t iova = 0;
2346 int access = 0;
2347 void *addr = NULL;
2348
2349 mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
2350 ibv_dereg_mr(mr);
2351 return 0;
2352 }'''))
2353endif
2354
Paolo Bonzinib87df902021-11-08 13:52:11 +01002355if get_option('membarrier').disabled()
2356 have_membarrier = false
2357elif targetos == 'windows'
2358 have_membarrier = true
2359elif targetos == 'linux'
2360 have_membarrier = cc.compiles('''
2361 #include <linux/membarrier.h>
2362 #include <sys/syscall.h>
2363 #include <unistd.h>
2364 #include <stdlib.h>
2365 int main(void) {
2366 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
2367 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
2368 exit(0);
2369 }''')
2370endif
2371config_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
2372 .require(have_membarrier, error_message: 'membarrier system call not available') \
2373 .allowed())
2374
Paolo Bonzini34b52612021-11-08 14:02:42 +01002375have_afalg = get_option('crypto_afalg') \
2376 .require(cc.compiles(gnu_source_prefix + '''
2377 #include <errno.h>
2378 #include <sys/types.h>
2379 #include <sys/socket.h>
2380 #include <linux/if_alg.h>
2381 int main(void) {
2382 int sock;
2383 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
2384 return sock;
2385 }
2386 '''), error_message: 'AF_ALG requested but could not be detected').allowed()
2387config_host_data.set('CONFIG_AF_ALG', have_afalg)
2388
Marc-André Lureau9d734b82022-04-01 15:50:05 +04002389config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
2390 'linux/vm_sockets.h', 'AF_VSOCK',
2391 prefix: '#include <sys/socket.h>',
2392))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002393
Marc-André Lureau8821a382022-02-01 16:53:43 +04002394have_vss = false
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002395have_vss_sdk = false # old xp/2003 SDK
Marc-André Lureau8821a382022-02-01 16:53:43 +04002396if targetos == 'windows' and link_language == 'cpp'
2397 have_vss = cxx.compiles('''
2398 #define __MIDL_user_allocate_free_DEFINED__
Marc-André Lureau32478cb2022-02-22 23:40:01 +04002399 #include <vss.h>
Marc-André Lureau8821a382022-02-01 16:53:43 +04002400 int main(void) { return VSS_CTX_BACKUP; }''')
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002401 have_vss_sdk = cxx.has_header('vscoordint.h')
Marc-André Lureau8821a382022-02-01 16:53:43 +04002402endif
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002403config_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
Marc-André Lureau8821a382022-02-01 16:53:43 +04002404
Paolo Bonzini859aef02020-08-04 18:14:26 +02002405foreach k, v: config_host
Paolo Bonzinice6119d2022-04-20 17:33:55 +02002406 if k.startswith('CONFIG_')
Paolo Bonzini859aef02020-08-04 18:14:26 +02002407 config_host_data.set(k, v == 'y' ? 1 : v)
2408 endif
2409endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02002410
Richard Henderson6391c772022-04-17 11:30:06 -07002411# Older versions of MinGW do not import _lock_file and _unlock_file properly.
2412# This was fixed for v6.0.0 with commit b48e3ac8969d.
2413if targetos == 'windows'
2414 config_host_data.set('HAVE__LOCK_FILE', cc.links('''
2415 #include <stdio.h>
2416 int main(void) {
2417 _lock_file(NULL);
2418 _unlock_file(NULL);
2419 return 0;
2420 }''', name: '_lock_file and _unlock_file'))
2421endif
2422
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002423########################
2424# Target configuration #
2425########################
2426
Paolo Bonzini2becc362020-02-03 11:42:03 +01002427minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04002428config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04002429config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002430config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002431config_devices_mak_list = []
2432config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02002433config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002434config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002435
2436disassemblers = {
2437 'alpha' : ['CONFIG_ALPHA_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002438 'avr' : ['CONFIG_AVR_DIS'],
2439 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06002440 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002441 'hppa' : ['CONFIG_HPPA_DIS'],
2442 'i386' : ['CONFIG_I386_DIS'],
2443 'x86_64' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002444 'm68k' : ['CONFIG_M68K_DIS'],
2445 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
2446 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002447 'nios2' : ['CONFIG_NIOS2_DIS'],
2448 'or1k' : ['CONFIG_OPENRISC_DIS'],
2449 'ppc' : ['CONFIG_PPC_DIS'],
2450 'riscv' : ['CONFIG_RISCV_DIS'],
2451 'rx' : ['CONFIG_RX_DIS'],
2452 's390' : ['CONFIG_S390_DIS'],
2453 'sh4' : ['CONFIG_SH4_DIS'],
2454 'sparc' : ['CONFIG_SPARC_DIS'],
2455 'xtensa' : ['CONFIG_XTENSA_DIS'],
Song Gaoaae17462022-06-06 20:43:06 +08002456 'loongarch' : ['CONFIG_LOONGARCH_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002457}
2458if link_language == 'cpp'
2459 disassemblers += {
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002460 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
2461 }
2462endif
2463
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002464have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01002465host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02002466 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002467 (have_tpm ? ['CONFIG_TPM=y'] : []) + \
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002468 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02002469 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002470 (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01002471 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02002472 (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
2473 (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
2474 (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01002475 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01002476 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
Paolo Bonzini3730a732022-04-20 17:33:41 +02002477 (have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \
Jagannathan Raman55116962022-06-13 16:26:24 -04002478 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
2479 (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01002480
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002481ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002482
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002483default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
2484actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002485fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002486foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04002487 config_target = { 'TARGET_NAME': target.split('-')[0] }
2488 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002489 if targetos != 'linux'
2490 if default_targets
2491 continue
2492 endif
2493 error('Target @0@ is only available on a Linux host'.format(target))
2494 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04002495 config_target += { 'CONFIG_LINUX_USER': 'y' }
2496 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002497 if 'CONFIG_BSD' not in config_host
2498 if default_targets
2499 continue
2500 endif
2501 error('Target @0@ is only available on a BSD host'.format(target))
2502 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04002503 config_target += { 'CONFIG_BSD_USER': 'y' }
2504 elif target.endswith('softmmu')
2505 config_target += { 'CONFIG_SOFTMMU': 'y' }
2506 endif
2507 if target.endswith('-user')
2508 config_target += {
2509 'CONFIG_USER_ONLY': 'y',
2510 'CONFIG_QEMU_INTERP_PREFIX':
Paolo Bonzinice6119d2022-04-20 17:33:55 +02002511 get_option('interp_prefix').replace('%M', config_target['TARGET_NAME'])
Paolo Bonzini765686d2020-09-18 06:37:21 -04002512 }
2513 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002514
Paolo Bonzini0a189112020-11-17 14:58:32 +01002515 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04002516 foreach sym: accelerators
2517 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
2518 config_target += { sym: 'y' }
2519 config_all += { sym: 'y' }
Paolo Bonzini23a77b22020-12-14 12:01:45 +01002520 if sym == 'CONFIG_TCG' and tcg_arch == 'tci'
2521 config_target += { 'CONFIG_TCG_INTERPRETER': 'y' }
Paolo Bonzini8a199802020-09-18 05:37:01 -04002522 endif
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002523 if target in modular_tcg
2524 config_target += { 'CONFIG_TCG_MODULAR': 'y' }
2525 else
2526 config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
2527 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01002528 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04002529 endif
2530 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01002531 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002532 if default_targets
2533 continue
2534 endif
2535 error('No accelerator available for target @0@'.format(target))
2536 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04002537
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002538 actual_target_dirs += target
Alex Bennée812b31d2021-07-07 14:17:43 +01002539 config_target += keyval.load('configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002540 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04002541
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002542 if 'TARGET_NEED_FDT' in config_target
2543 fdt_required += target
2544 endif
2545
Paolo Bonzinifa731682020-09-21 05:19:07 -04002546 # Add default keys
2547 if 'TARGET_BASE_ARCH' not in config_target
2548 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
2549 endif
2550 if 'TARGET_ABI_DIR' not in config_target
2551 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
2552 endif
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04002553 if 'TARGET_BIG_ENDIAN' not in config_target
2554 config_target += {'TARGET_BIG_ENDIAN': 'n'}
2555 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002556
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002557 foreach k, v: disassemblers
Paolo Bonzini823eb012021-11-08 14:18:17 +01002558 if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002559 foreach sym: v
2560 config_target += { sym: 'y' }
2561 config_all_disas += { sym: 'y' }
2562 endforeach
2563 endif
2564 endforeach
2565
Paolo Bonzini859aef02020-08-04 18:14:26 +02002566 config_target_data = configuration_data()
2567 foreach k, v: config_target
2568 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
2569 # do nothing
2570 elif ignored.contains(k)
2571 # do nothing
2572 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002573 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
2574 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02002575 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04002576 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02002577 config_target_data.set_quoted(k, v)
2578 elif v == 'y'
2579 config_target_data.set(k, 1)
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04002580 elif v == 'n'
2581 config_target_data.set(k, 0)
Paolo Bonzini859aef02020-08-04 18:14:26 +02002582 else
2583 config_target_data.set(k, v)
2584 endif
2585 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01002586 config_target_data.set('QEMU_ARCH',
2587 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02002588 config_target_h += {target: configure_file(output: target + '-config-target.h',
2589 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002590
2591 if target.endswith('-softmmu')
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01002592 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002593 config_devices_mak = target + '-config-devices.mak'
2594 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01002595 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01002596 output: config_devices_mak,
2597 depfile: config_devices_mak + '.d',
2598 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01002599 command: [minikconf,
2600 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01002601 config_devices_mak, '@DEPFILE@', '@INPUT@',
Philippe Mathieu-Daudéf4063f92021-07-07 14:17:40 +01002602 host_kconfig, accel_kconfig,
2603 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'])
Paolo Bonzini859aef02020-08-04 18:14:26 +02002604
2605 config_devices_data = configuration_data()
2606 config_devices = keyval.load(config_devices_mak)
2607 foreach k, v: config_devices
2608 config_devices_data.set(k, 1)
2609 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002610 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02002611 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
2612 configuration: config_devices_data)}
2613 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04002614 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01002615 endif
2616 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002617endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002618target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002619
Paolo Bonzini2becc362020-02-03 11:42:03 +01002620# This configuration is used to build files that are shared by
2621# multiple binaries, and then extracted out of the "common"
2622# static_library target.
2623#
2624# We do not use all_sources()/all_dependencies(), because it would
2625# build literally all source files, including devices only used by
2626# targets that are not built for this compilation. The CONFIG_ALL
2627# pseudo symbol replaces it.
2628
Paolo Bonzini05512f52020-09-16 15:31:11 -04002629config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01002630config_all += config_host
2631config_all += config_all_disas
2632config_all += {
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002633 'CONFIG_XEN': xen.found(),
Paolo Bonzini2becc362020-02-03 11:42:03 +01002634 'CONFIG_SOFTMMU': have_system,
2635 'CONFIG_USER_ONLY': have_user,
2636 'CONFIG_ALL': true,
2637}
2638
Paolo Bonzinieed56e92021-11-10 11:01:26 +01002639target_configs_h = []
2640foreach target: target_dirs
2641 target_configs_h += config_target_h[target]
2642 target_configs_h += config_devices_h.get(target, [])
2643endforeach
2644genh += custom_target('config-poison.h',
2645 input: [target_configs_h],
2646 output: 'config-poison.h',
2647 capture: true,
2648 command: [find_program('scripts/make-config-poison.sh'),
2649 target_configs_h])
2650
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002651##############
2652# Submodules #
2653##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002654
2655capstone = not_found
Thomas Huth83602082022-05-16 16:58:23 +02002656if not get_option('capstone').auto() or have_system or have_user
Thomas Huth43ecd162022-05-16 16:58:22 +02002657 capstone = dependency('capstone', version: '>=3.0.5',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01002658 kwargs: static_kwargs, method: 'pkg-config',
Thomas Huth83602082022-05-16 16:58:23 +02002659 required: get_option('capstone'))
Daniel P. Berrangé8f4aea72021-07-09 15:29:31 +01002660
2661 # Some versions of capstone have broken pkg-config file
2662 # that reports a wrong -I path, causing the #include to
2663 # fail later. If the system has such a broken version
2664 # do not use it.
2665 if capstone.found() and not cc.compiles('#include <capstone.h>',
2666 dependencies: [capstone])
2667 capstone = not_found
Thomas Huth83602082022-05-16 16:58:23 +02002668 if get_option('capstone').enabled()
2669 error('capstone requested, but it does not appear to work')
Daniel P. Berrangé8f4aea72021-07-09 15:29:31 +01002670 endif
2671 endif
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002672endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002673
Jagannathan Raman55116962022-06-13 16:26:24 -04002674libvfio_user_dep = not_found
2675if have_system and vfio_user_server_allowed
2676 have_internal = fs.exists(meson.current_source_dir() / 'subprojects/libvfio-user/meson.build')
2677
2678 if not have_internal
2679 error('libvfio-user source not found - please pull git submodule')
2680 endif
2681
2682 libvfio_user_proj = subproject('libvfio-user')
2683
2684 libvfio_user_lib = libvfio_user_proj.get_variable('libvfio_user_dep')
2685
2686 libvfio_user_dep = declare_dependency(dependencies: [libvfio_user_lib])
2687endif
2688
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002689fdt = not_found
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002690if have_system
Philippe Mathieu-Daudéc593d842022-02-08 11:19:46 +01002691 fdt_opt = get_option('fdt')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002692 if fdt_opt in ['enabled', 'auto', 'system']
2693 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01002694 fdt = cc.find_library('fdt', kwargs: static_kwargs,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002695 required: fdt_opt == 'system' or
2696 fdt_opt == 'enabled' and not have_internal)
2697 if fdt.found() and cc.links('''
2698 #include <libfdt.h>
2699 #include <libfdt_env.h>
Thomas Huthde47b0f2022-01-18 18:05:48 +01002700 int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002701 dependencies: fdt)
2702 fdt_opt = 'system'
Thomas Huth6c228532021-08-27 14:09:00 +02002703 elif fdt_opt == 'system'
2704 error('system libfdt requested, but it is too old (1.5.1 or newer required)')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002705 elif have_internal
2706 fdt_opt = 'internal'
2707 else
2708 fdt_opt = 'disabled'
Thomas Huth87daf892021-08-27 14:08:59 +02002709 fdt = not_found
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002710 endif
2711 endif
2712 if fdt_opt == 'internal'
2713 fdt_files = files(
2714 'dtc/libfdt/fdt.c',
2715 'dtc/libfdt/fdt_ro.c',
2716 'dtc/libfdt/fdt_wip.c',
2717 'dtc/libfdt/fdt_sw.c',
2718 'dtc/libfdt/fdt_rw.c',
2719 'dtc/libfdt/fdt_strerror.c',
2720 'dtc/libfdt/fdt_empty_tree.c',
2721 'dtc/libfdt/fdt_addresses.c',
2722 'dtc/libfdt/fdt_overlay.c',
2723 'dtc/libfdt/fdt_check.c',
2724 )
2725
2726 fdt_inc = include_directories('dtc/libfdt')
2727 libfdt = static_library('fdt',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01002728 build_by_default: false,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002729 sources: fdt_files,
2730 include_directories: fdt_inc)
2731 fdt = declare_dependency(link_with: libfdt,
2732 include_directories: fdt_inc)
2733 endif
Philippe Mathieu-Daudéc593d842022-02-08 11:19:46 +01002734else
2735 fdt_opt = 'disabled'
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002736endif
2737if not fdt.found() and fdt_required.length() > 0
2738 error('fdt not available but required by targets ' + ', '.join(fdt_required))
2739endif
2740
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002741config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002742config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002743config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002744
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002745#####################
2746# Generated sources #
2747#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002748
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002749genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002750
Marc-André Lureau3f885652019-07-15 18:06:04 +04002751hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04002752shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002753qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002754qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
2755 meson.current_source_dir() / 'scripts/qapi/commands.py',
2756 meson.current_source_dir() / 'scripts/qapi/common.py',
2757 meson.current_source_dir() / 'scripts/qapi/error.py',
2758 meson.current_source_dir() / 'scripts/qapi/events.py',
2759 meson.current_source_dir() / 'scripts/qapi/expr.py',
2760 meson.current_source_dir() / 'scripts/qapi/gen.py',
2761 meson.current_source_dir() / 'scripts/qapi/introspect.py',
2762 meson.current_source_dir() / 'scripts/qapi/parser.py',
2763 meson.current_source_dir() / 'scripts/qapi/schema.py',
2764 meson.current_source_dir() / 'scripts/qapi/source.py',
2765 meson.current_source_dir() / 'scripts/qapi/types.py',
2766 meson.current_source_dir() / 'scripts/qapi/visit.py',
2767 meson.current_source_dir() / 'scripts/qapi/common.py',
2768 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002769]
2770
2771tracetool = [
2772 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002773 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002774]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002775tracetool_depends = files(
2776 'scripts/tracetool/backend/log.py',
2777 'scripts/tracetool/backend/__init__.py',
2778 'scripts/tracetool/backend/dtrace.py',
2779 'scripts/tracetool/backend/ftrace.py',
2780 'scripts/tracetool/backend/simple.py',
2781 'scripts/tracetool/backend/syslog.py',
2782 'scripts/tracetool/backend/ust.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002783 'scripts/tracetool/format/ust_events_c.py',
2784 'scripts/tracetool/format/ust_events_h.py',
2785 'scripts/tracetool/format/__init__.py',
2786 'scripts/tracetool/format/d.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002787 'scripts/tracetool/format/simpletrace_stap.py',
2788 'scripts/tracetool/format/c.py',
2789 'scripts/tracetool/format/h.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002790 'scripts/tracetool/format/log_stap.py',
2791 'scripts/tracetool/format/stap.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002792 'scripts/tracetool/__init__.py',
2793 'scripts/tracetool/transform.py',
2794 'scripts/tracetool/vcpu.py'
2795)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002796
Marc-André Lureau2c273f32019-07-15 17:10:19 +04002797qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
2798 meson.current_source_dir(),
Paolo Bonzinib0b43232022-04-20 17:33:54 +02002799 get_option('pkgversion'), meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04002800qemu_version = custom_target('qemu-version.h',
2801 output: 'qemu-version.h',
2802 command: qemu_version_cmd,
2803 capture: true,
2804 build_by_default: true,
2805 build_always_stale: true)
2806genh += qemu_version
2807
Marc-André Lureau3f885652019-07-15 18:06:04 +04002808hxdep = []
2809hx_headers = [
2810 ['qemu-options.hx', 'qemu-options.def'],
2811 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
2812]
2813if have_system
2814 hx_headers += [
2815 ['hmp-commands.hx', 'hmp-commands.h'],
2816 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
2817 ]
2818endif
2819foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002820 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04002821 input: files(d[0]),
2822 output: d[1],
2823 capture: true,
2824 build_by_default: true, # to be removed when added to a target
2825 command: [hxtool, '-h', '@INPUT0@'])
2826endforeach
2827genh += hxdep
2828
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002829###################
2830# Collect sources #
2831###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002832
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02002833authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002834blockdev_ss = ss.source_set()
2835block_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002836chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002837common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002838crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02002839hwcore_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002840io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002841qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02002842qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002843softmmu_ss = ss.source_set()
2844specific_fuzz_ss = ss.source_set()
2845specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002846stub_ss = ss.source_set()
2847trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002848user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002849util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002850
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002851# accel modules
2852qtest_module_ss = ss.source_set()
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002853tcg_module_ss = ss.source_set()
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002854
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002855modules = {}
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002856target_modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002857hw_arch = {}
2858target_arch = {}
2859target_softmmu_arch = {}
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02002860target_user_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002861
2862###############
2863# Trace files #
2864###############
2865
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002866# TODO: add each directory to the subdirs from its own meson.build, once
2867# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002868trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002869 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01002870 'qapi',
2871 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002872 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01002873 'util',
Alex Bennée842b42d2022-09-29 12:42:22 +01002874 'gdbstub',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002875]
Warner Losh6ddc1ab2022-01-08 17:37:23 -07002876if have_linux_user
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002877 trace_events_subdirs += [ 'linux-user' ]
2878endif
Warner Losh6ddc1ab2022-01-08 17:37:23 -07002879if have_bsd_user
2880 trace_events_subdirs += [ 'bsd-user' ]
2881endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002882if have_block
2883 trace_events_subdirs += [
2884 'authz',
2885 'block',
2886 'io',
2887 'nbd',
2888 'scsi',
2889 ]
2890endif
2891if have_system
2892 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002893 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002894 'audio',
2895 'backends',
2896 'backends/tpm',
2897 'chardev',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002898 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002899 'hw/9pfs',
2900 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08002901 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002902 'hw/alpha',
2903 'hw/arm',
2904 'hw/audio',
2905 'hw/block',
2906 'hw/block/dataplane',
2907 'hw/char',
2908 'hw/display',
2909 'hw/dma',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002910 'hw/hyperv',
2911 'hw/i2c',
2912 'hw/i386',
2913 'hw/i386/xen',
2914 'hw/ide',
2915 'hw/input',
2916 'hw/intc',
2917 'hw/isa',
2918 'hw/mem',
2919 'hw/mips',
2920 'hw/misc',
2921 'hw/misc/macio',
2922 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08002923 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01002924 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02002925 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002926 'hw/nvram',
2927 'hw/pci',
2928 'hw/pci-host',
2929 'hw/ppc',
2930 'hw/rdma',
2931 'hw/rdma/vmw',
2932 'hw/rtc',
2933 'hw/s390x',
2934 'hw/scsi',
2935 'hw/sd',
BALATON Zoltanad52cfc2021-10-29 23:02:09 +02002936 'hw/sh4',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002937 'hw/sparc',
2938 'hw/sparc64',
2939 'hw/ssi',
2940 'hw/timer',
2941 'hw/tpm',
2942 'hw/usb',
2943 'hw/vfio',
2944 'hw/virtio',
2945 'hw/watchdog',
2946 'hw/xen',
2947 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002948 'migration',
2949 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02002950 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002951 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05002952 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002953 ]
2954endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002955if have_system or have_user
2956 trace_events_subdirs += [
2957 'accel/tcg',
2958 'hw/core',
2959 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02002960 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002961 'target/hppa',
2962 'target/i386',
2963 'target/i386/kvm',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02002964 'target/mips/tcg',
Richard Henderson6f83e272022-02-25 21:06:20 -10002965 'target/nios2',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002966 'target/ppc',
2967 'target/riscv',
2968 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08002969 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002970 'target/sparc',
2971 ]
2972endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002973
Marc-André Lureau0df750e2020-11-25 14:06:37 +04002974vhost_user = not_found
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02002975if targetos == 'linux' and have_vhost_user
Marc-André Lureau0df750e2020-11-25 14:06:37 +04002976 libvhost_user = subproject('libvhost-user')
2977 vhost_user = libvhost_user.get_variable('vhost_user_dep')
2978endif
2979
Xie Yongjia6caeee2022-05-23 16:46:08 +08002980libvduse = not_found
2981if have_libvduse
2982 libvduse_proj = subproject('libvduse')
2983 libvduse = libvduse_proj.get_variable('libvduse_dep')
2984endif
2985
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +01002986# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
2987# that is filled in by qapi/.
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002988subdir('qapi')
2989subdir('qobject')
2990subdir('stubs')
2991subdir('trace')
2992subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04002993subdir('qom')
2994subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002995subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04002996subdir('ui')
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02002997subdir('hw')
Alex Bennée842b42d2022-09-29 12:42:22 +01002998subdir('gdbstub')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002999
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003000
3001if enable_modules
3002 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
3003 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
3004endif
3005
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003006qom_ss = qom_ss.apply(config_host, strict: false)
3007libqom = static_library('qom', qom_ss.sources() + genh,
3008 dependencies: [qom_ss.dependencies()],
3009 name_suffix: 'fa')
3010qom = declare_dependency(link_whole: libqom)
3011
3012event_loop_base = files('event-loop-base.c')
3013event_loop_base = static_library('event-loop-base', sources: event_loop_base + genh,
3014 build_by_default: true)
3015event_loop_base = declare_dependency(link_whole: event_loop_base,
3016 dependencies: [qom])
3017
Paolo Bonzini2becc362020-02-03 11:42:03 +01003018stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003019
3020util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01003021util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003022libqemuutil = static_library('qemuutil',
3023 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +02003024 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003025qemuutil = declare_dependency(link_with: libqemuutil,
Nicolas Saenz Julienne70ac26b2022-04-25 09:57:22 +02003026 sources: genh + version_res,
3027 dependencies: [event_loop_base])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003028
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01003029if have_system or have_user
3030 decodetree = generator(find_program('scripts/decodetree.py'),
3031 output: 'decode-@BASENAME@.c.inc',
3032 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3033 subdir('libdecnumber')
3034 subdir('target')
3035endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003036
Paolo Bonzini478e9432020-08-17 12:47:55 +02003037subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04003038subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04003039subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003040subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04003041subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003042
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003043if have_block
3044 block_ss.add(files(
3045 'block.c',
3046 'blockjob.c',
3047 'job.c',
3048 'qemu-io-cmds.c',
3049 ))
Paolo Bonzini406523f2021-10-13 11:43:54 +02003050 if config_host_data.get('CONFIG_REPLICATION')
3051 block_ss.add(files('replication.c'))
3052 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003053
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003054 subdir('nbd')
3055 subdir('scsi')
3056 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003057
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003058 blockdev_ss.add(files(
3059 'blockdev.c',
3060 'blockdev-nbd.c',
3061 'iothread.c',
3062 'job-qmp.c',
3063 ), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02003064
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003065 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
3066 # os-win32.c does not
3067 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
3068 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
3069endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02003070
3071common_ss.add(files('cpus-common.c'))
3072
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02003073subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003074
Richard Hendersonf3433462020-09-12 10:47:33 -07003075common_ss.add(capstone)
Alex Bennée842b42d2022-09-29 12:42:22 +01003076specific_ss.add(files('cpu.c', 'disas.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003077
Richard Henderson44b99a62021-03-22 12:24:26 +01003078# Work around a gcc bug/misfeature wherein constant propagation looks
3079# through an alias:
3080# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
3081# to guess that a const variable is always zero. Without lto, this is
3082# impossible, as the alias is restricted to page-vary-common.c. Indeed,
3083# without lto, not even the alias is required -- we simply use different
3084# declarations in different compilation units.
3085pagevary = files('page-vary-common.c')
3086if get_option('b_lto')
3087 pagevary_flags = ['-fno-lto']
3088 if get_option('cfi')
3089 pagevary_flags += '-fno-sanitize=cfi-icall'
3090 endif
Thomas Huth54c9b192022-03-30 13:48:08 +02003091 pagevary = static_library('page-vary-common', sources: pagevary + genh,
Richard Henderson44b99a62021-03-22 12:24:26 +01003092 c_args: pagevary_flags)
3093 pagevary = declare_dependency(link_with: pagevary)
3094endif
3095common_ss.add(pagevary)
Richard Henderson6670d4d2021-03-22 12:24:24 +01003096specific_ss.add(files('page-vary.c'))
3097
Marc-André Lureauab318052019-07-24 19:23:16 +04003098subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04003099subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04003100subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003101subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04003102subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04003103subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00003104subdir('semihosting')
Richard Henderson104cc2c2021-03-08 12:04:33 -08003105subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08003106subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04003107subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003108subdir('plugins')
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003109subdir('ebpf')
3110
3111common_user_inc = []
3112
3113subdir('common-user')
Marc-André Lureaub309c322019-08-18 19:20:37 +04003114subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04003115subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003116
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003117# needed for fuzzing binaries
3118subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003119subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003120
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003121# accel modules
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02003122tcg_real_module_ss = ss.source_set()
3123tcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
3124specific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
3125target_modules += { 'accel' : { 'qtest': qtest_module_ss,
3126 'tcg': tcg_real_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003127
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003128########################
3129# Library dependencies #
3130########################
3131
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003132modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003133modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003134modinfo_files = []
3135
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003136block_mods = []
3137softmmu_mods = []
3138foreach d, list : modules
3139 foreach m, module_ss : list
3140 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02003141 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003142 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
3143 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
3144 if d == 'block'
3145 block_mods += sl
3146 else
3147 softmmu_mods += sl
3148 endif
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003149 if module_ss.sources() != []
3150 # FIXME: Should use sl.extract_all_objects(recursive: true) as
3151 # input. Sources can be used multiple times but objects are
3152 # unique when it comes to lookup in compile_commands.json.
3153 # Depnds on a mesion version with
3154 # https://github.com/mesonbuild/meson/pull/8900
3155 modinfo_files += custom_target(d + '-' + m + '.modinfo',
3156 output: d + '-' + m + '.modinfo',
Paolo Bonziniac347112021-07-21 18:51:57 +02003157 input: module_ss.sources() + genh,
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003158 capture: true,
Paolo Bonziniac347112021-07-21 18:51:57 +02003159 command: [modinfo_collect, module_ss.sources()])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003160 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003161 else
3162 if d == 'block'
3163 block_ss.add_all(module_ss)
3164 else
3165 softmmu_ss.add_all(module_ss)
3166 endif
3167 endif
3168 endforeach
3169endforeach
3170
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003171foreach d, list : target_modules
3172 foreach m, module_ss : list
3173 if enable_modules and targetos != 'windows'
3174 foreach target : target_dirs
3175 if target.endswith('-softmmu')
3176 config_target = config_target_mak[target]
3177 config_target += config_host
3178 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3179 c_args = ['-DNEED_CPU_H',
3180 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3181 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3182 target_module_ss = module_ss.apply(config_target, strict: false)
3183 if target_module_ss.sources() != []
3184 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3185 sl = static_library(module_name,
3186 [genh, target_module_ss.sources()],
3187 dependencies: [modulecommon, target_module_ss.dependencies()],
3188 include_directories: target_inc,
3189 c_args: c_args,
3190 pic: true)
3191 softmmu_mods += sl
3192 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
3193 modinfo_files += custom_target(module_name + '.modinfo',
3194 output: module_name + '.modinfo',
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003195 input: target_module_ss.sources() + genh,
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003196 capture: true,
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003197 command: [modinfo_collect, '--target', target, target_module_ss.sources()])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003198 endif
3199 endif
3200 endforeach
3201 else
3202 specific_ss.add_all(module_ss)
3203 endif
3204 endforeach
3205endforeach
3206
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003207if enable_modules
Jose R. Ziviani05d68142022-05-28 00:20:35 +02003208 foreach target : target_dirs
3209 if target.endswith('-softmmu')
3210 config_target = config_target_mak[target]
3211 config_devices_mak = target + '-config-devices.mak'
3212 modinfo_src = custom_target('modinfo-' + target + '.c',
3213 output: 'modinfo-' + target + '.c',
3214 input: modinfo_files,
3215 command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
3216 capture: true)
3217
3218 modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
3219 modinfo_dep = declare_dependency(link_with: modinfo_lib)
3220
3221 arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
3222 hw_arch[arch].add(modinfo_dep)
3223 endif
3224 endforeach
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003225endif
3226
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003227nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08003228undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003229block_syms = custom_target('block.syms', output: 'block.syms',
3230 input: [libqemuutil, block_mods],
3231 capture: true,
3232 command: [undefsym, nm, '@INPUT@'])
3233qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
3234 input: [libqemuutil, softmmu_mods],
3235 capture: true,
3236 command: [undefsym, nm, '@INPUT@'])
3237
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003238authz_ss = authz_ss.apply(config_host, strict: false)
3239libauthz = static_library('authz', authz_ss.sources() + genh,
3240 dependencies: [authz_ss.dependencies()],
3241 name_suffix: 'fa',
3242 build_by_default: false)
3243
3244authz = declare_dependency(link_whole: libauthz,
3245 dependencies: qom)
3246
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003247crypto_ss = crypto_ss.apply(config_host, strict: false)
3248libcrypto = static_library('crypto', crypto_ss.sources() + genh,
3249 dependencies: [crypto_ss.dependencies()],
3250 name_suffix: 'fa',
3251 build_by_default: false)
3252
3253crypto = declare_dependency(link_whole: libcrypto,
3254 dependencies: [authz, qom])
3255
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003256io_ss = io_ss.apply(config_host, strict: false)
3257libio = static_library('io', io_ss.sources() + genh,
3258 dependencies: [io_ss.dependencies()],
3259 link_with: libqemuutil,
3260 name_suffix: 'fa',
3261 build_by_default: false)
3262
3263io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
3264
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003265libmigration = static_library('migration', sources: migration_files + genh,
3266 name_suffix: 'fa',
3267 build_by_default: false)
3268migration = declare_dependency(link_with: libmigration,
3269 dependencies: [zlib, qom, io])
3270softmmu_ss.add(migration)
3271
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003272block_ss = block_ss.apply(config_host, strict: false)
3273libblock = static_library('block', block_ss.sources() + genh,
3274 dependencies: block_ss.dependencies(),
3275 link_depends: block_syms,
3276 name_suffix: 'fa',
3277 build_by_default: false)
3278
3279block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003280 link_args: '@block.syms',
3281 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003282
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003283blockdev_ss = blockdev_ss.apply(config_host, strict: false)
3284libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
3285 dependencies: blockdev_ss.dependencies(),
3286 name_suffix: 'fa',
3287 build_by_default: false)
3288
3289blockdev = declare_dependency(link_whole: [libblockdev],
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003290 dependencies: [block, event_loop_base])
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003291
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003292qmp_ss = qmp_ss.apply(config_host, strict: false)
3293libqmp = static_library('qmp', qmp_ss.sources() + genh,
3294 dependencies: qmp_ss.dependencies(),
3295 name_suffix: 'fa',
3296 build_by_default: false)
3297
3298qmp = declare_dependency(link_whole: [libqmp])
3299
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003300libchardev = static_library('chardev', chardev_ss.sources() + genh,
3301 name_suffix: 'fa',
Marc-André Lureau22d1f7a2022-03-23 19:57:12 +04003302 dependencies: chardev_ss.dependencies(),
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003303 build_by_default: false)
3304
3305chardev = declare_dependency(link_whole: libchardev)
3306
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02003307hwcore_ss = hwcore_ss.apply(config_host, strict: false)
3308libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02003309 name_suffix: 'fa',
3310 build_by_default: false)
3311hwcore = declare_dependency(link_whole: libhwcore)
3312common_ss.add(hwcore)
3313
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02003314###########
3315# Targets #
3316###########
3317
Paolo Bonzinifb721762022-01-07 13:00:44 +01003318emulator_modules = []
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003319foreach m : block_mods + softmmu_mods
Paolo Bonzinifb721762022-01-07 13:00:44 +01003320 emulator_modules += shared_module(m.name(),
3321 build_by_default: true,
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003322 name_prefix: '',
3323 link_whole: m,
3324 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003325 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003326endforeach
Paolo Bonzinid8f3a602022-05-30 14:24:34 +02003327if emulator_modules.length() > 0
3328 alias_target('modules', emulator_modules)
3329endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003330
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003331softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003332common_ss.add(qom, qemuutil)
3333
3334common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01003335common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
3336
3337common_all = common_ss.apply(config_all, strict: false)
3338common_all = static_library('common',
3339 build_by_default: false,
3340 sources: common_all.sources() + genh,
Paolo Bonzini9d24fb72021-12-21 16:09:54 +01003341 include_directories: common_user_inc,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09003342 implicit_include_directories: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003343 dependencies: common_all.dependencies(),
3344 name_suffix: 'fa')
3345
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003346feature_to_c = find_program('scripts/feature_to_c.sh')
3347
Philippe Mathieu-Daudé30cfa502022-02-15 17:25:03 +01003348if targetos == 'darwin'
3349 entitlement = find_program('scripts/entitlement.sh')
3350endif
3351
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04003352emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003353foreach target : target_dirs
3354 config_target = config_target_mak[target]
3355 target_name = config_target['TARGET_NAME']
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003356 target_base_arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02003357 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003358 arch_deps = []
3359 c_args = ['-DNEED_CPU_H',
3360 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3361 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04003362 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01003363
Paolo Bonzini859aef02020-08-04 18:14:26 +02003364 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01003365 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3366 if targetos == 'linux'
3367 target_inc += include_directories('linux-headers', is_system: true)
3368 endif
3369 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003370 target_type='system'
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003371 t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003372 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003373 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003374
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003375 hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
Marc-André Lureau2c442202019-08-17 13:55:58 +04003376 hw = hw_arch[hw_dir].apply(config_target, strict: false)
3377 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003378 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04003379
Paolo Bonzini2becc362020-02-03 11:42:03 +01003380 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003381 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01003382 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04003383 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01003384 target_type='user'
Paolo Bonzinia3a576b2021-12-21 16:23:55 +01003385 target_inc += common_user_inc
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003386 if target_base_arch in target_user_arch
3387 t = target_user_arch[target_base_arch].apply(config_target, strict: false)
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02003388 arch_srcs += t.sources()
3389 arch_deps += t.dependencies()
3390 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01003391 if 'CONFIG_LINUX_USER' in config_target
3392 base_dir = 'linux-user'
Warner Loshe2a74722021-08-03 17:17:17 -06003393 endif
3394 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01003395 base_dir = 'bsd-user'
Warner Loshe2a74722021-08-03 17:17:17 -06003396 target_inc += include_directories('bsd-user/' / targetos)
Warner Losh85fc1b52022-01-08 17:27:34 -07003397 target_inc += include_directories('bsd-user/host/' / host_arch)
Warner Loshe2a74722021-08-03 17:17:17 -06003398 dir = base_dir / abi
Warner Losh19bf1292021-11-04 16:34:48 -06003399 arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003400 endif
3401 target_inc += include_directories(
3402 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04003403 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003404 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04003405 if 'CONFIG_LINUX_USER' in config_target
3406 dir = base_dir / abi
3407 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
3408 if config_target.has_key('TARGET_SYSTBL_ABI')
3409 arch_srcs += \
3410 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
3411 extra_args : config_target['TARGET_SYSTBL_ABI'])
3412 endif
3413 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01003414 endif
3415
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003416 if 'TARGET_XML_FILES' in config_target
3417 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
3418 output: target + '-gdbstub-xml.c',
3419 input: files(config_target['TARGET_XML_FILES'].split()),
3420 command: [feature_to_c, '@INPUT@'],
3421 capture: true)
3422 arch_srcs += gdbstub_xml
3423 endif
3424
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003425 t = target_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003426 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003427 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003428
Paolo Bonzini2becc362020-02-03 11:42:03 +01003429 target_common = common_ss.apply(config_target, strict: false)
3430 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003431 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003432
Paolo Bonzini2becc362020-02-03 11:42:03 +01003433 target_specific = specific_ss.apply(config_target, strict: false)
3434 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003435 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003436
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003437 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02003438 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02003439 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003440 objects: objects,
3441 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003442 c_args: c_args,
3443 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003444 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003445
3446 if target.endswith('-softmmu')
3447 execs = [{
3448 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003449 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003450 'sources': files('softmmu/main.c'),
3451 'dependencies': []
3452 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01003453 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003454 execs += [{
3455 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003456 'win_subsystem': 'windows',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003457 'sources': files('softmmu/main.c'),
3458 'dependencies': []
3459 }]
3460 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02003461 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003462 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
3463 execs += [{
3464 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003465 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003466 'sources': specific_fuzz.sources(),
3467 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003468 }]
3469 endif
3470 else
3471 execs = [{
3472 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003473 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003474 'sources': [],
3475 'dependencies': []
3476 }]
3477 endif
3478 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01003479 exe_name = exe['name']
John Arbuckle3983a762021-07-05 15:53:28 -04003480 if targetos == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01003481 exe_name += '-unsigned'
3482 endif
3483
3484 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09003485 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003486 c_args: c_args,
3487 dependencies: arch_deps + deps + exe['dependencies'],
3488 objects: lib.extract_all_objects(recursive: true),
3489 link_language: link_language,
3490 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
3491 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003492 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003493
John Arbuckle3983a762021-07-05 15:53:28 -04003494 if targetos == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003495 icon = 'pc-bios/qemu.rsrc'
3496 build_input = [emulator, files(icon)]
3497 install_input = [
3498 get_option('bindir') / exe_name,
3499 meson.current_source_dir() / icon
3500 ]
3501 if 'CONFIG_HVF' in config_target
3502 entitlements = 'accel/hvf/entitlements.plist'
3503 build_input += files(entitlements)
3504 install_input += meson.current_source_dir() / entitlements
3505 endif
3506
Alexander Graf8a74ce62021-01-20 23:44:34 +01003507 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003508 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01003509 output: exe['name'],
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003510 command: [entitlement, '@OUTPUT@', '@INPUT@'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003511 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09003512
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003513 meson.add_install_script(entitlement, '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09003514 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003515 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01003516 else
3517 emulators += {exe['name']: emulator}
3518 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003519
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003520 if stap.found()
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003521 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003522 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
3523 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003524 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
3525 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
3526 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003527 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003528 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003529 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003530 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003531 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003532 command: [
3533 tracetool, '--group=all', '--format=' + stp['fmt'],
3534 '--binary=' + stp['bin'],
3535 '--target-name=' + target_name,
3536 '--target-type=' + target_type,
3537 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01003538 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003539 ],
3540 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003541 endforeach
3542 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003543 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003544endforeach
3545
Paolo Bonzini931049b2020-02-05 09:44:24 +01003546# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003547
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003548if 'CONFIG_PLUGIN' in config_host
3549 install_headers('include/qemu/qemu-plugin.h')
3550endif
3551
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003552subdir('qga')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02003553
Laurent Vivier9755c942020-08-24 17:24:30 +02003554# Don't build qemu-keymap if xkbcommon is not explicitly enabled
3555# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02003556if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04003557 # used for the update-keymaps target, so include rules even if !have_tools
3558 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
3559 dependencies: [qemuutil, xkbcommon], install: have_tools)
3560endif
3561
Paolo Bonzini931049b2020-02-05 09:44:24 +01003562if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003563 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
3564 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
3565 qemu_io = executable('qemu-io', files('qemu-io.c'),
3566 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01003567 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06003568 dependencies: [blockdev, qemuutil, gnutls, selinux],
3569 install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003570
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02003571 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003572 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04003573 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003574
Marc-André Lureau157e7b12019-07-15 14:50:58 +04003575 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
3576 dependencies: qemuutil,
3577 install: true)
3578
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003579 if have_vhost_user
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02003580 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02003581 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04003582 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02003583 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01003584 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003585
3586 if targetos == 'linux'
3587 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
3588 dependencies: [qemuutil, libcap_ng],
3589 install: true,
3590 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003591
3592 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
3593 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02003594 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003595 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003596 endif
3597
Paolo Bonziniccd250a2021-06-03 12:50:17 +02003598 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04003599 subdir('contrib/ivshmem-client')
3600 subdir('contrib/ivshmem-server')
3601 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01003602endif
3603
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04003604subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01003605subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04003606subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02003607subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08003608subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01003609if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04003610 subdir('po')
3611endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01003612
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003613if host_machine.system() == 'windows'
3614 nsis_cmd = [
3615 find_program('scripts/nsis.py'),
3616 '@OUTPUT@',
3617 get_option('prefix'),
3618 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01003619 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003620 '--',
3621 '-DDISPLAYVERSION=' + meson.project_version(),
3622 ]
3623 if build_docs
3624 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
3625 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01003626 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003627 nsis_cmd += '-DCONFIG_GTK=y'
3628 endif
3629
3630 nsis = custom_target('nsis',
3631 output: 'qemu-setup-' + meson.project_version() + '.exe',
3632 input: files('qemu.nsi'),
3633 build_always_stale: true,
3634 command: nsis_cmd + ['@INPUT@'])
3635 alias_target('installer', nsis)
3636endif
3637
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003638#########################
3639# Configuration summary #
3640#########################
3641
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003642# Directories
Paolo Bonzinif9332752020-02-03 13:28:38 +01003643summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003644summary_info += {'Install prefix': get_option('prefix')}
3645summary_info += {'BIOS directory': qemu_datadir}
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09003646pathsep = targetos == 'windows' ? ';' : ':'
3647summary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02003648summary_info += {'binary directory': get_option('prefix') / get_option('bindir')}
3649summary_info += {'library directory': get_option('prefix') / get_option('libdir')}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003650summary_info += {'module directory': qemu_moddir}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02003651summary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
3652summary_info += {'include directory': get_option('prefix') / get_option('includedir')}
3653summary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003654if targetos != 'windows'
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02003655 summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
3656 summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003657else
3658 summary_info += {'local state directory': 'queried at runtime'}
3659endif
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02003660summary_info += {'Doc directory': get_option('prefix') / get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003661summary_info += {'Build directory': meson.current_build_dir()}
3662summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003663summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003664summary(summary_info, bool_yn: true, section: 'Directories')
3665
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003666# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003667summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003668summary_info += {'git': config_host['GIT']}
3669summary_info += {'make': config_host['MAKE']}
3670summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003671summary_info += {'sphinx-build': sphinx_build}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003672if config_host.has_key('HAVE_GDB_BIN')
3673 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
3674endif
Paolo Bonzini40c909f2022-04-20 17:33:49 +02003675summary_info += {'iasl': iasl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003676summary_info += {'genisoimage': config_host['GENISOIMAGE']}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003677if targetos == 'windows' and have_ga
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003678 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003679endif
Thomas Huth58902582022-04-08 18:20:47 +02003680if slirp.found() and have_system
Paolo Bonzini35acbb32021-10-13 13:43:36 +02003681 summary_info += {'smbd': have_slirp_smbd ? smbd_path : false}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003682endif
3683summary(summary_info, bool_yn: true, section: 'Host binaries')
3684
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003685# Configurable features
3686summary_info = {}
3687summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003688summary_info += {'system-mode emulation': have_system}
3689summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003690summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003691summary_info += {'Install blobs': get_option('install_blobs')}
3692summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
3693if config_host.has_key('CONFIG_MODULES')
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02003694 summary_info += {'alternative module path': get_option('module_upgrades')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003695endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02003696summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003697if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02003698 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003699endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003700summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
3701if 'simple' in get_option('trace_backends')
3702 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003703endif
Marc-André Lureau142ca622021-07-15 11:53:53 +04003704summary_info += {'D-Bus display': dbus_display}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003705summary_info += {'QOM debugging': get_option('qom_cast_debug')}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003706summary_info += {'vhost-kernel support': have_vhost_kernel}
3707summary_info += {'vhost-net support': have_vhost_net}
3708summary_info += {'vhost-user support': have_vhost_user}
3709summary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003710summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003711summary_info += {'vhost-vdpa support': have_vhost_vdpa}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003712summary_info += {'build guest agent': have_ga}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003713summary(summary_info, bool_yn: true, section: 'Configurable features')
3714
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003715# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003716summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003717summary_info += {'host CPU': cpu}
3718summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01003719summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
3720summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003721if link_language == 'cpp'
Alex Bennée63de9352021-05-27 17:03:15 +01003722 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003723else
3724 summary_info += {'C++ compiler': false}
3725endif
3726if targetos == 'darwin'
Alex Bennée63de9352021-05-27 17:03:15 +01003727 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003728endif
Paolo Bonzini47b30832020-09-23 05:26:17 -04003729summary_info += {'CFLAGS': ' '.join(get_option('c_args')
3730 + ['-O' + get_option('optimization')]
3731 + (get_option('debug') ? ['-g'] : []))}
3732if link_language == 'cpp'
3733 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
3734 + ['-O' + get_option('optimization')]
3735 + (get_option('debug') ? ['-g'] : []))}
3736endif
Philippe Mathieu-Daudée910c7d2022-01-08 22:38:55 +01003737if targetos == 'darwin'
3738 summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args')
3739 + ['-O' + get_option('optimization')]
3740 + (get_option('debug') ? ['-g'] : []))}
3741endif
Paolo Bonzini47b30832020-09-23 05:26:17 -04003742link_args = get_option(link_language + '_link_args')
3743if link_args.length() > 0
3744 summary_info += {'LDFLAGS': ' '.join(link_args)}
3745endif
Paolo Bonzinid0651772022-04-20 17:33:34 +02003746summary_info += {'QEMU_CFLAGS': ' '.join(qemu_cflags)}
3747summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_cxxflags)}
3748summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_objcflags)}
3749summary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003750summary_info += {'profiler': get_option('profiler')}
Daniele Buonocdad7812020-12-04 18:06:11 -05003751summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003752summary_info += {'PIE': get_option('b_pie')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02003753summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003754summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinib87df902021-11-08 13:52:11 +01003755summary_info += {'membarrier': have_membarrier}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02003756summary_info += {'debug stack usage': get_option('debug_stack_usage')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003757summary_info += {'mutex debugging': get_option('debug_mutex')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003758summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01003759summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
3760summary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003761summary_info += {'gprof enabled': get_option('gprof')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003762summary_info += {'gcov': get_option('b_coverage')}
3763summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
3764summary_info += {'CFI support': get_option('cfi')}
3765if get_option('cfi')
3766 summary_info += {'CFI debug support': get_option('cfi_debug')}
3767endif
3768summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003769summary_info += {'sparse': sparse}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003770summary_info += {'mingw32 support': targetos == 'windows'}
Paolo Bonzini12640f02022-06-06 11:48:47 +02003771summary(summary_info, bool_yn: true, section: 'Compilation')
Alex Bennée49e85652021-02-22 10:14:50 +00003772
3773# snarf the cross-compilation information for tests
Paolo Bonzini12640f02022-06-06 11:48:47 +02003774summary_info = {}
3775have_cross = false
Alex Bennée49e85652021-02-22 10:14:50 +00003776foreach target: target_dirs
Paolo Bonzinic7022a72022-09-29 12:42:07 +01003777 tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak'
Alex Bennée49e85652021-02-22 10:14:50 +00003778 if fs.exists(tcg_mak)
3779 config_cross_tcg = keyval.load(tcg_mak)
Alex Bennée85b141e2022-05-27 16:35:34 +01003780 if 'CC' in config_cross_tcg
Paolo Bonzini12640f02022-06-06 11:48:47 +02003781 summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
3782 have_cross = true
Alex Bennée49e85652021-02-22 10:14:50 +00003783 endif
Paolo Bonzini12640f02022-06-06 11:48:47 +02003784 endif
Alex Bennée49e85652021-02-22 10:14:50 +00003785endforeach
Paolo Bonzini12640f02022-06-06 11:48:47 +02003786if have_cross
3787 summary(summary_info, bool_yn: true, section: 'Cross compilers')
3788endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003789
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003790# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003791summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003792if have_system
3793 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
3794 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
3795 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
3796 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
Reinoud Zandijk74a414a2021-04-02 22:25:32 +02003797 summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')}
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02003798 summary_info += {'Xen support': xen.found()}
3799 if xen.found()
3800 summary_info += {'xen ctrl version': xen.version()}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003801 endif
3802endif
3803summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
3804if config_all.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01003805 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +01003806 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01003807 else
3808 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
3809 endif
Alex Bennée029aa682021-07-09 15:29:53 +01003810 summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003811 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003812endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003813summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003814if have_system
3815 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01003816 summary_info += {'out of process emulation': multiprocess_allowed}
Jagannathan Raman55116962022-06-13 16:26:24 -04003817 summary_info += {'vfio-user server': vfio_user_server_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003818endif
3819summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
3820
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003821# Block layer
3822summary_info = {}
3823summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02003824summary_info += {'coroutine pool': have_coroutine_pool}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003825if have_block
Paolo Bonzini622d64f2022-04-20 17:33:53 +02003826 summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
3827 summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003828 summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003829 summary_info += {'VirtFS support': have_virtfs}
3830 summary_info += {'build virtiofs daemon': have_virtiofsd}
Paolo Bonzini406523f2021-10-13 11:43:54 +02003831 summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')}
3832 summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
Paolo Bonzinied793c22021-10-13 11:42:25 +02003833 summary_info += {'bochs support': get_option('bochs').allowed()}
3834 summary_info += {'cloop support': get_option('cloop').allowed()}
3835 summary_info += {'dmg support': get_option('dmg').allowed()}
3836 summary_info += {'qcow v1 support': get_option('qcow1').allowed()}
3837 summary_info += {'vdi support': get_option('vdi').allowed()}
3838 summary_info += {'vvfat support': get_option('vvfat').allowed()}
3839 summary_info += {'qed support': get_option('qed').allowed()}
3840 summary_info += {'parallels support': get_option('parallels').allowed()}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003841 summary_info += {'FUSE exports': fuse}
Xie Yongji2a2359b2022-05-23 16:46:09 +08003842 summary_info += {'VDUSE block exports': have_vduse_blk_export}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003843endif
3844summary(summary_info, bool_yn: true, section: 'Block layer support')
3845
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003846# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003847summary_info = {}
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02003848summary_info += {'TLS priority': get_option('tls_priority')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003849summary_info += {'GNUTLS support': gnutls}
3850if gnutls.found()
3851 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
3852endif
3853summary_info += {'libgcrypt': gcrypt}
3854summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02003855if nettle.found()
3856 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003857endif
Paolo Bonzini34b52612021-11-08 14:02:42 +01003858summary_info += {'AF_ALG support': have_afalg}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003859summary_info += {'rng-none': get_option('rng_none')}
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02003860summary_info += {'Linux keyring': have_keyring}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003861summary(summary_info, bool_yn: true, section: 'Crypto')
3862
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01003863# Libraries
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003864summary_info = {}
3865if targetos == 'darwin'
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03003866 summary_info += {'Cocoa support': cocoa}
3867 summary_info += {'vmnet.framework support': vmnet}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003868endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003869summary_info += {'SDL support': sdl}
3870summary_info += {'SDL image support': sdl_image}
3871summary_info += {'GTK support': gtk}
3872summary_info += {'pixman': pixman}
3873summary_info += {'VTE support': vte}
Thomas Huth58902582022-04-08 18:20:47 +02003874summary_info += {'slirp support': slirp}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003875summary_info += {'libtasn1': tasn1}
3876summary_info += {'PAM': pam}
3877summary_info += {'iconv support': iconv}
3878summary_info += {'curses support': curses}
3879summary_info += {'virgl support': virgl}
Stefan Hajnoczifd66dbd2022-10-13 14:58:57 -04003880summary_info += {'blkio support': blkio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003881summary_info += {'curl support': curl}
3882summary_info += {'Multipath support': mpathpersist}
Kshitij Suri95f85102022-04-08 07:13:34 +00003883summary_info += {'PNG support': png}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003884summary_info += {'VNC support': vnc}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01003885if vnc.found()
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003886 summary_info += {'VNC SASL support': sasl}
3887 summary_info += {'VNC JPEG support': jpeg}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003888endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02003889if targetos not in ['darwin', 'haiku', 'windows']
3890 summary_info += {'OSS support': oss}
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02003891 summary_info += {'sndio support': sndio}
Paolo Bonzini87430d52021-10-07 15:06:09 +02003892elif targetos == 'darwin'
3893 summary_info += {'CoreAudio support': coreaudio}
3894elif targetos == 'windows'
3895 summary_info += {'DirectSound support': dsound}
3896endif
3897if targetos == 'linux'
3898 summary_info += {'ALSA support': alsa}
3899 summary_info += {'PulseAudio support': pulse}
3900endif
3901summary_info += {'JACK support': jack}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003902summary_info += {'brlapi support': brlapi}
Paolo Bonzinie1723992021-10-07 15:08:21 +02003903summary_info += {'vde support': vde}
Paolo Bonzini837b84b2021-10-07 15:08:22 +02003904summary_info += {'netmap support': have_netmap}
Thomas Hutheea94532021-10-28 20:59:08 +02003905summary_info += {'l2tpv3 support': have_l2tpv3}
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02003906summary_info += {'Linux AIO support': libaio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003907summary_info += {'Linux io_uring support': linux_io_uring}
3908summary_info += {'ATTR/XATTR support': libattr}
Paolo Bonzini3730a732022-04-20 17:33:41 +02003909summary_info += {'RDMA support': rdma}
3910summary_info += {'PVRDMA support': have_pvrdma}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003911summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003912summary_info += {'libcap-ng support': libcap_ng}
3913summary_info += {'bpf support': libbpf}
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02003914summary_info += {'spice protocol support': spice_protocol}
3915if spice_protocol.found()
3916 summary_info += {' spice server support': spice}
3917endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003918summary_info += {'rbd support': rbd}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003919summary_info += {'smartcard support': cacard}
3920summary_info += {'U2F support': u2f}
3921summary_info += {'libusb': libusb}
3922summary_info += {'usb net redir': usbredir}
Paolo Bonzini88b6e612022-04-20 17:33:40 +02003923summary_info += {'OpenGL support (epoxy)': opengl}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003924summary_info += {'GBM': gbm}
3925summary_info += {'libiscsi support': libiscsi}
3926summary_info += {'libnfs support': libnfs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003927if targetos == 'windows'
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003928 if have_ga
Marc-André Lureau8821a382022-02-01 16:53:43 +04003929 summary_info += {'QGA VSS support': have_qga_vss}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01003930 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01003931endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003932summary_info += {'seccomp support': seccomp}
3933summary_info += {'GlusterFS support': glusterfs}
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01003934summary_info += {'TPM support': have_tpm}
Thomas Huthe6a52b32021-12-09 15:48:01 +01003935summary_info += {'libssh support': libssh}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003936summary_info += {'lzo support': lzo}
3937summary_info += {'snappy support': snappy}
3938summary_info += {'bzip2 support': libbzip2}
3939summary_info += {'lzfse support': liblzfse}
3940summary_info += {'zstd support': zstd}
Paolo Bonzini488a8c72021-12-21 12:38:27 +01003941summary_info += {'NUMA host support': numa}
Thomas Huth83602082022-05-16 16:58:23 +02003942summary_info += {'capstone': capstone}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003943summary_info += {'libpmem support': libpmem}
3944summary_info += {'libdaxctl support': libdaxctl}
3945summary_info += {'libudev': libudev}
3946# Dummy dependency, keep .found()
Max Reitzdf4ea702020-10-27 20:05:46 +01003947summary_info += {'FUSE lseek': fuse_lseek.found()}
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06003948summary_info += {'selinux': selinux}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01003949summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01003950
3951if not supported_cpus.contains(cpu)
3952 message()
3953 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
3954 message()
3955 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
3956 message('The QEMU project intends to remove support for this host CPU in')
3957 message('a future release if nobody volunteers to maintain it and to')
3958 message('provide a build host for our continuous integration setup.')
3959 message('configure has succeeded and you can continue to build, but')
3960 message('if you care about QEMU on this platform you should contact')
3961 message('us upstream at qemu-devel@nongnu.org.')
3962endif
3963
3964if not supported_oses.contains(targetos)
3965 message()
3966 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
3967 message()
3968 message('Host OS ' + targetos + 'support is not currently maintained.')
3969 message('The QEMU project intends to remove support for this host OS in')
3970 message('a future release if nobody volunteers to maintain it and to')
3971 message('provide a build host for our continuous integration setup.')
3972 message('configure has succeeded and you can continue to build, but')
3973 message('if you care about QEMU on this platform you should contact')
3974 message('us upstream at qemu-devel@nongnu.org.')
3975endif