blob: 5f114c89d9223725c8ffcaf89ec14034d88a2643 [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
Michal Privoznik73422d92022-10-26 09:30:24 +0200639seccomp_has_sysrawrc = false
Paolo Bonzini90835c22020-11-17 14:22:24 +0100640if not get_option('seccomp').auto() or have_system or have_tools
641 seccomp = dependency('libseccomp', version: '>=2.3.0',
642 required: get_option('seccomp'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100643 method: 'pkg-config', kwargs: static_kwargs)
Michal Privoznik73422d92022-10-26 09:30:24 +0200644 if seccomp.found()
645 seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h',
646 'SCMP_FLTATR_API_SYSRAWRC',
647 dependencies: seccomp)
648 endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100649endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100650
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100651libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100652if not get_option('cap_ng').auto() or have_system or have_tools
653 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
654 required: get_option('cap_ng'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100655 kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100656endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100657if libcap_ng.found() and not cc.links('''
658 #include <cap-ng.h>
659 int main(void)
660 {
661 capng_capability_to_name(CAPNG_EFFECTIVE);
662 return 0;
663 }''', dependencies: libcap_ng)
664 libcap_ng = not_found
665 if get_option('cap_ng').enabled()
666 error('could not link libcap-ng')
667 else
668 warning('could not link libcap-ng, disabling')
669 endif
670endif
671
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400672if get_option('xkbcommon').auto() and not have_system and not have_tools
673 xkbcommon = not_found
674else
675 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100676 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400677endif
Paolo Bonzinie1723992021-10-07 15:08:21 +0200678
Thomas Huth58902582022-04-08 18:20:47 +0200679slirp = not_found
680if not get_option('slirp').auto() or have_system
681 slirp = dependency('slirp', required: get_option('slirp'),
682 method: 'pkg-config', kwargs: static_kwargs)
683 # slirp < 4.7 is incompatible with CFI support in QEMU. This is because
684 # it passes function pointers within libslirp as callbacks for timers.
685 # When using a system-wide shared libslirp, the type information for the
686 # callback is missing and the timer call produces a false positive with CFI.
687 # Do not use the "version" keyword argument to produce a better error.
688 # with control-flow integrity.
689 if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7')
690 if get_option('slirp').enabled()
691 error('Control-Flow Integrity requires libslirp 4.7.')
692 else
693 warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.')
694 slirp = not_found
695 endif
696 endif
697endif
698
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400699vde = not_found
Paolo Bonzinie1723992021-10-07 15:08:21 +0200700if not get_option('vde').auto() or have_system or have_tools
701 vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
702 required: get_option('vde'),
703 kwargs: static_kwargs)
704endif
705if vde.found() and not cc.links('''
706 #include <libvdeplug.h>
707 int main(void)
708 {
709 struct vde_open_args a = {0, 0, 0};
710 char s[] = "";
711 vde_open(s, s, &a);
712 return 0;
713 }''', dependencies: vde)
714 vde = not_found
715 if get_option('cap_ng').enabled()
716 error('could not link libvdeplug')
717 else
718 warning('could not link libvdeplug, disabling')
719 endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400720endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200721
Paolo Bonzini478e9432020-08-17 12:47:55 +0200722pulse = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200723if not get_option('pa').auto() or (targetos == 'linux' and have_system)
724 pulse = dependency('libpulse', required: get_option('pa'),
725 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200726endif
727alsa = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200728if not get_option('alsa').auto() or (targetos == 'linux' and have_system)
729 alsa = dependency('alsa', required: get_option('alsa'),
730 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200731endif
732jack = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200733if not get_option('jack').auto() or have_system
734 jack = dependency('jack', required: get_option('jack'),
735 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200736endif
Alexandre Ratchov663df1c2022-09-07 15:23:42 +0200737sndio = not_found
738if not get_option('sndio').auto() or have_system
739 sndio = dependency('sndio', required: get_option('sndio'),
740 method: 'pkg-config', kwargs: static_kwargs)
741endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200742
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200743spice_protocol = not_found
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200744if not get_option('spice_protocol').auto() or have_system
745 spice_protocol = dependency('spice-protocol', version: '>=0.12.3',
746 required: get_option('spice_protocol'),
747 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini26347332019-07-29 15:40:07 +0200748endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200749spice = not_found
750if not get_option('spice').auto() or have_system
751 spice = dependency('spice-server', version: '>=0.12.5',
752 required: get_option('spice'),
753 method: 'pkg-config', kwargs: static_kwargs)
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200754endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200755spice_headers = spice.partial_dependency(compile_args: true, includes: true)
756
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400757rt = cc.find_library('rt', required: false)
Paolo Bonzinia399f912021-11-15 14:29:13 +0000758
Paolo Bonzini99650b62019-06-10 12:21:14 +0200759libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100760if not get_option('libiscsi').auto() or have_block
761 libiscsi = dependency('libiscsi', version: '>=1.9.0',
762 required: get_option('libiscsi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100763 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini99650b62019-06-10 12:21:14 +0200764endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400765zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +0100766if not get_option('zstd').auto() or have_block
767 zstd = dependency('libzstd', version: '>=1.4.0',
768 required: get_option('zstd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100769 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400770endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400771virgl = not_found
Paolo Bonzini0265fe92021-12-17 12:36:26 +0100772
773have_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found()
774if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
Paolo Bonzini587d59d2021-06-03 11:31:35 +0200775 virgl = dependency('virglrenderer',
776 method: 'pkg-config',
777 required: get_option('virglrenderer'),
778 kwargs: static_kwargs)
Marc-André Lureauea458962019-07-12 22:23:46 +0400779endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400780curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100781if not get_option('curl').auto() or have_block
782 curl = dependency('libcurl', version: '>=7.29.0',
783 method: 'pkg-config',
784 required: get_option('curl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100785 kwargs: static_kwargs)
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400786endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200787libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200788if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200789 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +0100790 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400791 required: get_option('libudev'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100792 kwargs: static_kwargs)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200793endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200794
Paolo Bonzini5c530152020-10-15 06:09:27 -0400795mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200796mpathpersist = not_found
797mpathpersist_new_api = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100798if targetos == 'linux' and have_tools and get_option('mpath').allowed()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200799 mpath_test_source_new = '''
800 #include <libudev.h>
801 #include <mpath_persist.h>
802 unsigned mpath_mx_alloc_len = 1024;
803 int logsink;
804 static struct config *multipath_conf;
805 extern struct udev *udev;
806 extern struct config *get_multipath_config(void);
807 extern void put_multipath_config(struct config *conf);
808 struct udev *udev;
809 struct config *get_multipath_config(void) { return multipath_conf; }
810 void put_multipath_config(struct config *conf) { }
811 int main(void) {
812 udev = udev_new();
813 multipath_conf = mpath_lib_init();
814 return 0;
815 }'''
816 mpath_test_source_old = '''
817 #include <libudev.h>
818 #include <mpath_persist.h>
819 unsigned mpath_mx_alloc_len = 1024;
820 int logsink;
821 int main(void) {
822 struct udev *udev = udev_new();
823 mpath_lib_init(udev);
824 return 0;
825 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400826 libmpathpersist = cc.find_library('mpathpersist',
827 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100828 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400829 if libmpathpersist.found()
830 mpathlibs += libmpathpersist
831 if enable_static
832 mpathlibs += cc.find_library('devmapper',
833 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100834 kwargs: static_kwargs)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200835 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400836 mpathlibs += cc.find_library('multipath',
837 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100838 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400839 foreach lib: mpathlibs
840 if not lib.found()
841 mpathlibs = []
842 break
843 endif
844 endforeach
845 if mpathlibs.length() == 0
846 msg = 'Dependencies missing for libmpathpersist'
847 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200848 mpathpersist = declare_dependency(dependencies: mpathlibs)
849 mpathpersist_new_api = true
850 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
851 mpathpersist = declare_dependency(dependencies: mpathlibs)
852 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400853 msg = 'Cannot detect libmpathpersist API'
854 endif
855 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200856 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400857 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200858 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400859 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200860 endif
861 endif
862 endif
863endif
864
Yonggang Luo5285e592020-10-13 07:43:48 +0800865iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800866curses = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100867if have_system and get_option('curses').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400868 curses_test = '''
Stefan Weilfbab8cc2021-11-17 21:53:55 +0100869 #if defined(__APPLE__) || defined(__OpenBSD__)
870 #define _XOPEN_SOURCE_EXTENDED 1
871 #endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400872 #include <locale.h>
873 #include <curses.h>
874 #include <wchar.h>
875 int main(void) {
876 wchar_t wch = L'w';
877 setlocale(LC_ALL, "");
878 resize_term(0, 0);
879 addwstr(L"wide chars\n");
880 addnwstr(&wch, 1);
881 add_wch(WACS_DEGREE);
882 return 0;
883 }'''
884
Yonggang Luoca31e302020-11-17 05:31:06 +0800885 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
Paolo Bonzini6d322632022-03-27 16:05:58 +0200886 curses = dependency(curses_dep_list,
887 required: false,
888 method: 'pkg-config',
889 kwargs: static_kwargs)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400890 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Stefan Weilfbab8cc2021-11-17 21:53:55 +0100891 curses_compile_args = ['-DNCURSES_WIDECHAR=1']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400892 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500893 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
894 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400895 else
896 msg = 'curses package not usable'
897 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800898 endif
899 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400900 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400901 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
902 if targetos != 'windows' and not has_curses_h
903 message('Trying with /usr/include/ncursesw')
904 curses_compile_args += ['-I/usr/include/ncursesw']
905 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
906 endif
907 if has_curses_h
908 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
909 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800910 libcurses = cc.find_library(curses_libname,
911 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100912 kwargs: static_kwargs)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400913 if libcurses.found()
914 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
915 curses = declare_dependency(compile_args: curses_compile_args,
916 dependencies: [libcurses])
917 break
918 else
919 msg = 'curses library not usable'
920 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800921 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400922 endforeach
923 endif
924 endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100925 if get_option('iconv').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400926 foreach link_args : [ ['-liconv'], [] ]
927 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
928 # We need to use libiconv if available because mixing libiconv's headers with
929 # the system libc does not work.
930 # However, without adding glib to the dependencies -L/usr/local/lib will not be
931 # included in the command line and libiconv will not be found.
932 if cc.links('''
933 #include <iconv.h>
934 int main(void) {
935 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
936 return conv != (iconv_t) -1;
937 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
938 iconv = declare_dependency(link_args: link_args, dependencies: glib)
939 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800940 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400941 endforeach
942 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400943 if curses.found() and not iconv.found()
944 if get_option('iconv').enabled()
945 error('iconv not available')
946 endif
947 msg = 'iconv required for curses UI but not available'
948 curses = not_found
949 endif
950 if not curses.found() and msg != ''
951 if get_option('curses').enabled()
952 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400953 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400954 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400955 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800956 endif
957endif
958
Paolo Bonzini26347332019-07-29 15:40:07 +0200959brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100960if not get_option('brlapi').auto() or have_system
961 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
962 required: get_option('brlapi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100963 kwargs: static_kwargs)
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100964 if brlapi.found() and not cc.links('''
965 #include <brlapi.h>
966 #include <stddef.h>
967 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
968 brlapi = not_found
969 if get_option('brlapi').enabled()
970 error('could not link brlapi')
971 else
972 warning('could not link brlapi, disabling')
973 endif
974 endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200975endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100976
Paolo Bonzini760e4322020-08-26 08:09:48 +0200977sdl = not_found
Akihiko Odaki64d3fec2022-08-19 22:27:56 +0900978if not get_option('sdl').auto() or have_system
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100979 sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200980 sdl_image = not_found
981endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100982if sdl.found()
983 # work around 2.0.8 bug
984 sdl = declare_dependency(compile_args: '-Wno-undef',
985 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200986 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100987 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100988else
989 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100990 error('sdl-image required, but SDL was @0@'.format(
991 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100992 endif
993 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200994endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100995
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400996rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100997if not get_option('rbd').auto() or have_block
998 librados = cc.find_library('rados', required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100999 kwargs: static_kwargs)
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001000 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
1001 required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001002 kwargs: static_kwargs)
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001003 if librados.found() and librbd.found()
1004 if cc.links('''
1005 #include <stdio.h>
1006 #include <rbd/librbd.h>
1007 int main(void) {
1008 rados_t cluster;
1009 rados_create(&cluster, NULL);
Peter Lieven48672ac2021-07-02 19:23:51 +02001010 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
1011 #error
1012 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001013 return 0;
1014 }''', dependencies: [librbd, librados])
1015 rbd = declare_dependency(dependencies: [librbd, librados])
1016 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +02001017 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001018 else
Peter Lieven48672ac2021-07-02 19:23:51 +02001019 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +01001020 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001021 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001022endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001023
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001024glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001025glusterfs_ftruncate_has_stat = false
1026glusterfs_iocb_has_stat = false
1027if not get_option('glusterfs').auto() or have_block
1028 glusterfs = dependency('glusterfs-api', version: '>=3',
1029 required: get_option('glusterfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001030 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001031 if glusterfs.found()
1032 glusterfs_ftruncate_has_stat = cc.links('''
1033 #include <glusterfs/api/glfs.h>
1034
1035 int
1036 main(void)
1037 {
1038 /* new glfs_ftruncate() passes two additional args */
1039 return glfs_ftruncate(NULL, 0, NULL, NULL);
1040 }
1041 ''', dependencies: glusterfs)
1042 glusterfs_iocb_has_stat = cc.links('''
1043 #include <glusterfs/api/glfs.h>
1044
1045 /* new glfs_io_cbk() passes two additional glfs_stat structs */
1046 static void
1047 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
1048 {}
1049
1050 int
1051 main(void)
1052 {
1053 glfs_io_cbk iocb = &glusterfs_iocb;
1054 iocb(NULL, 0 , NULL, NULL, NULL);
1055 return 0;
1056 }
1057 ''', dependencies: glusterfs)
1058 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001059endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001060
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001061libssh = not_found
Thomas Huthe6a52b32021-12-09 15:48:01 +01001062if not get_option('libssh').auto() or have_block
1063 libssh = dependency('libssh', version: '>=0.8.7',
1064 method: 'pkg-config',
1065 required: get_option('libssh'),
1066 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001067endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001068
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001069libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001070if not get_option('bzip2').auto() or have_block
1071 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
1072 required: get_option('bzip2'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001073 kwargs: static_kwargs)
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001074 if libbzip2.found() and not cc.links('''
1075 #include <bzlib.h>
1076 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
1077 libbzip2 = not_found
1078 if get_option('bzip2').enabled()
1079 error('could not link libbzip2')
1080 else
1081 warning('could not link libbzip2, disabling')
1082 endif
1083 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001084endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001085
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001086liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +01001087if not get_option('lzfse').auto() or have_block
1088 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
1089 required: get_option('lzfse'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001090 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001091endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001092if liblzfse.found() and not cc.links('''
1093 #include <lzfse.h>
1094 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
1095 liblzfse = not_found
1096 if get_option('lzfse').enabled()
1097 error('could not link liblzfse')
1098 else
1099 warning('could not link liblzfse, disabling')
1100 endif
1101endif
1102
Paolo Bonzini478e9432020-08-17 12:47:55 +02001103oss = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001104if get_option('oss').allowed() and have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02001105 if not cc.has_header('sys/soundcard.h')
1106 # not found
1107 elif targetos == 'netbsd'
1108 oss = cc.find_library('ossaudio', required: get_option('oss'),
1109 kwargs: static_kwargs)
1110 else
1111 oss = declare_dependency()
1112 endif
1113
1114 if not oss.found()
1115 if get_option('oss').enabled()
1116 error('OSS not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001117 endif
1118 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001119endif
1120dsound = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001121if not get_option('dsound').auto() or (targetos == 'windows' and have_system)
1122 if cc.has_header('dsound.h')
1123 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1124 endif
1125
1126 if not dsound.found()
1127 if get_option('dsound').enabled()
1128 error('DirectSound not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001129 endif
1130 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001131endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001132
Paolo Bonzini478e9432020-08-17 12:47:55 +02001133coreaudio = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001134if not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system)
1135 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
1136 required: get_option('coreaudio'))
Paolo Bonzini478e9432020-08-17 12:47:55 +02001137endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001138
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001139opengl = not_found
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001140if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
1141 epoxy = dependency('epoxy', method: 'pkg-config',
1142 required: get_option('opengl'), kwargs: static_kwargs)
1143 if cc.has_header('epoxy/egl.h', dependencies: epoxy)
1144 opengl = epoxy
1145 elif get_option('opengl').enabled()
1146 error('epoxy/egl.h not found')
1147 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001148endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001149gbm = not_found
1150if (have_system or have_tools) and (virgl.found() or opengl.found())
1151 gbm = dependency('gbm', method: 'pkg-config', required: false,
1152 kwargs: static_kwargs)
1153endif
Marc-André Lureauf0caba42022-06-28 17:23:15 +04001154have_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001155
Paolo Bonzini57612512021-06-03 11:15:26 +02001156gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001157gnutls_crypto = not_found
Alyssa Rossabc14fd2021-08-06 14:49:47 +00001158if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001159 # For general TLS support our min gnutls matches
1160 # that implied by our platform support matrix
1161 #
1162 # For the crypto backends, we look for a newer
1163 # gnutls:
1164 #
1165 # Version 3.6.8 is needed to get XTS
1166 # Version 3.6.13 is needed to get PBKDF
1167 # Version 3.6.14 is needed to get HW accelerated XTS
1168 #
1169 # If newer enough gnutls isn't available, we can
1170 # still use a different crypto backend to satisfy
1171 # the platform support requirements
1172 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1173 method: 'pkg-config',
1174 required: false,
1175 kwargs: static_kwargs)
1176 if gnutls_crypto.found()
1177 gnutls = gnutls_crypto
1178 else
1179 # Our min version if all we need is TLS
1180 gnutls = dependency('gnutls', version: '>=3.5.18',
1181 method: 'pkg-config',
1182 required: get_option('gnutls'),
1183 kwargs: static_kwargs)
1184 endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001185endif
1186
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001187# We prefer use of gnutls for crypto, unless the options
1188# explicitly asked for nettle or gcrypt.
1189#
1190# If gnutls isn't available for crypto, then we'll prefer
1191# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +02001192gcrypt = not_found
1193nettle = not_found
Lei He4c5e5122022-05-25 17:01:14 +08001194hogweed = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +01001195xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001196
Paolo Bonzini57612512021-06-03 11:15:26 +02001197if get_option('nettle').enabled() and get_option('gcrypt').enabled()
1198 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +02001199endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001200
1201# Explicit nettle/gcrypt request, so ignore gnutls for crypto
1202if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001203 gnutls_crypto = not_found
1204endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001205
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001206if not gnutls_crypto.found()
1207 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
1208 gcrypt = dependency('libgcrypt', version: '>=1.8',
1209 method: 'config-tool',
1210 required: get_option('gcrypt'),
1211 kwargs: static_kwargs)
1212 # Debian has removed -lgpg-error from libgcrypt-config
1213 # as it "spreads unnecessary dependencies" which in
1214 # turn breaks static builds...
1215 if gcrypt.found() and enable_static
1216 gcrypt = declare_dependency(dependencies: [
1217 gcrypt,
1218 cc.find_library('gpg-error', required: true, kwargs: static_kwargs)])
1219 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001220 endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001221 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1222 nettle = dependency('nettle', version: '>=3.4',
1223 method: 'pkg-config',
1224 required: get_option('nettle'),
1225 kwargs: static_kwargs)
1226 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1227 xts = 'private'
1228 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001229 endif
1230endif
1231
Lei He4c5e5122022-05-25 17:01:14 +08001232gmp = dependency('gmp', required: false, method: 'pkg-config', kwargs: static_kwargs)
1233if nettle.found() and gmp.found()
1234 hogweed = dependency('hogweed', version: '>=3.4',
1235 method: 'pkg-config',
1236 required: get_option('nettle'),
1237 kwargs: static_kwargs)
1238endif
1239
1240
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001241gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +01001242gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001243vte = not_found
Akihiko Odaki64d3fec2022-08-19 22:27:56 +09001244if not get_option('gtk').auto() or have_system
Paolo Bonzini1b695472021-01-07 14:02:29 +01001245 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1246 method: 'pkg-config',
1247 required: get_option('gtk'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001248 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +01001249 if gtk.found()
1250 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1251 method: 'pkg-config',
1252 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001253 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +01001254 gtk = declare_dependency(dependencies: [gtk, gtkx11])
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001255
1256 if not get_option('vte').auto() or have_system
1257 vte = dependency('vte-2.91',
1258 method: 'pkg-config',
1259 required: get_option('vte'),
1260 kwargs: static_kwargs)
1261 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001262 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001263endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001264
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001265x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +02001266if gtkx11.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001267 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001268 kwargs: static_kwargs)
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001269endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001270png = not_found
Kshitij Suri95f85102022-04-08 07:13:34 +00001271if get_option('png').allowed() and have_system
Thomas Huth1ec8c2c2022-06-23 19:49:41 +02001272 png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
Kshitij Suri95f85102022-04-08 07:13:34 +00001273 method: 'pkg-config', kwargs: static_kwargs)
1274endif
1275vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001276jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001277sasl = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001278if get_option('vnc').allowed() and have_system
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001279 vnc = declare_dependency() # dummy dependency
Paolo Bonzini8e242b32020-11-23 13:34:02 -05001280 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001281 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001282 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
1283 required: get_option('vnc_sasl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001284 kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001285 if sasl.found()
1286 sasl = declare_dependency(dependencies: sasl,
1287 compile_args: '-DSTRUCT_IOVEC_DEFINED')
1288 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001289endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01001290
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001291pam = not_found
1292if not get_option('auth_pam').auto() or have_system
1293 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
1294 required: get_option('auth_pam'),
1295 kwargs: static_kwargs)
1296endif
1297if pam.found() and not cc.links('''
1298 #include <stddef.h>
1299 #include <security/pam_appl.h>
1300 int main(void) {
1301 const char *service_name = "qemu";
1302 const char *user = "frank";
1303 const struct pam_conv pam_conv = { 0 };
1304 pam_handle_t *pamh = NULL;
1305 pam_start(service_name, user, &pam_conv, &pamh);
1306 return 0;
1307 }''', dependencies: pam)
1308 pam = not_found
1309 if get_option('auth_pam').enabled()
1310 error('could not link libpam')
1311 else
1312 warning('could not link libpam, disabling')
1313 endif
1314endif
1315
Marc-André Lureau708eab42019-09-03 16:59:33 +04001316snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +01001317if not get_option('snappy').auto() or have_system
1318 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
1319 required: get_option('snappy'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001320 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +04001321endif
Paolo Bonzini565174d2021-11-04 14:35:14 +01001322if snappy.found() and not linker.links('''
Paolo Bonzini241611e2020-11-17 13:32:34 +01001323 #include <snappy-c.h>
1324 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
1325 snappy = not_found
1326 if get_option('snappy').enabled()
1327 error('could not link libsnappy')
1328 else
1329 warning('could not link libsnappy, disabling')
1330 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +04001331endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001332
Marc-André Lureau708eab42019-09-03 16:59:33 +04001333lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001334if not get_option('lzo').auto() or have_system
1335 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
1336 required: get_option('lzo'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001337 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +04001338endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001339if lzo.found() and not cc.links('''
1340 #include <lzo/lzo1x.h>
1341 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
1342 lzo = not_found
1343 if get_option('lzo').enabled()
1344 error('could not link liblzo2')
1345 else
1346 warning('could not link liblzo2, disabling')
1347 endif
1348endif
1349
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001350numa = not_found
1351if not get_option('numa').auto() or have_system or have_tools
1352 numa = cc.find_library('numa', has_headers: ['numa.h'],
1353 required: get_option('numa'),
1354 kwargs: static_kwargs)
1355endif
1356if numa.found() and not cc.links('''
1357 #include <numa.h>
1358 int main(void) { return numa_available(); }
1359 ''', dependencies: numa)
1360 numa = not_found
1361 if get_option('numa').enabled()
1362 error('could not link numa')
1363 else
1364 warning('could not link numa, disabling')
1365 endif
1366endif
1367
Marc-André Lureau55166232019-07-24 19:16:22 +04001368rdma = not_found
Paolo Bonzini3730a732022-04-20 17:33:41 +02001369if not get_option('rdma').auto() or have_system
1370 libumad = cc.find_library('ibumad', required: get_option('rdma'))
1371 rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
1372 required: get_option('rdma'),
1373 kwargs: static_kwargs),
1374 cc.find_library('ibverbs', required: get_option('rdma'),
1375 kwargs: static_kwargs),
1376 libumad]
1377 rdma = declare_dependency(dependencies: rdma_libs)
1378 foreach lib: rdma_libs
1379 if not lib.found()
1380 rdma = not_found
1381 endif
1382 endforeach
Marc-André Lureau55166232019-07-24 19:16:22 +04001383endif
Paolo Bonzini3730a732022-04-20 17:33:41 +02001384
Marc-André Lureau582ea952019-08-15 15:15:32 +04001385xen = not_found
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001386if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
1387 xencontrol = dependency('xencontrol', required: false,
1388 method: 'pkg-config', kwargs: static_kwargs)
1389 if xencontrol.found()
1390 xen_pc = declare_dependency(version: xencontrol.version(),
1391 dependencies: [
1392 xencontrol,
1393 # disabler: true makes xen_pc.found() return false if any is not found
1394 dependency('xenstore', required: false,
1395 method: 'pkg-config', kwargs: static_kwargs,
1396 disabler: true),
1397 dependency('xenforeignmemory', required: false,
1398 method: 'pkg-config', kwargs: static_kwargs,
1399 disabler: true),
1400 dependency('xengnttab', required: false,
1401 method: 'pkg-config', kwargs: static_kwargs,
1402 disabler: true),
1403 dependency('xenevtchn', required: false,
1404 method: 'pkg-config', kwargs: static_kwargs,
1405 disabler: true),
1406 dependency('xendevicemodel', required: false,
1407 method: 'pkg-config', kwargs: static_kwargs,
1408 disabler: true),
1409 # optional, no "disabler: true"
1410 dependency('xentoolcore', required: false,
1411 method: 'pkg-config', kwargs: static_kwargs)])
1412 if xen_pc.found()
1413 xen = xen_pc
1414 endif
1415 endif
1416 if not xen.found()
1417 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' ]
1418 xen_libs = {
1419 '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
1420 '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
1421 '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
1422 '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
1423 '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
1424 '4.6.0': [ 'xenstore', 'xenctrl' ],
1425 '4.5.0': [ 'xenstore', 'xenctrl' ],
1426 '4.2.0': [ 'xenstore', 'xenctrl' ],
1427 }
1428 xen_deps = {}
1429 foreach ver: xen_tests
1430 # cache the various library tests to avoid polluting the logs
1431 xen_test_deps = []
1432 foreach l: xen_libs[ver]
1433 if l not in xen_deps
1434 xen_deps += { l: cc.find_library(l, required: false) }
1435 endif
1436 xen_test_deps += xen_deps[l]
1437 endforeach
1438
1439 # Use -D to pick just one of the test programs in scripts/xen-detect.c
1440 xen_version = ver.split('.')
1441 xen_ctrl_version = xen_version[0] + \
1442 ('0' + xen_version[1]).substring(-2) + \
1443 ('0' + xen_version[2]).substring(-2)
1444 if cc.links(files('scripts/xen-detect.c'),
1445 args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
1446 dependencies: xen_test_deps)
1447 xen = declare_dependency(version: ver, dependencies: xen_test_deps)
1448 break
1449 endif
1450 endforeach
1451 endif
1452 if xen.found()
1453 accelerators += 'CONFIG_XEN'
1454 elif get_option('xen').enabled()
1455 error('could not compile and link Xen test program')
1456 endif
Marc-André Lureau582ea952019-08-15 15:15:32 +04001457endif
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001458have_xen_pci_passthrough = get_option('xen_pci_passthrough') \
1459 .require(xen.found(),
1460 error_message: 'Xen PCI passthrough requested but Xen not enabled') \
1461 .require(targetos == 'linux',
1462 error_message: 'Xen PCI passthrough not available on this platform') \
1463 .allowed()
1464
1465
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001466cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02001467if not get_option('smartcard').auto() or have_system
1468 cacard = dependency('libcacard', required: get_option('smartcard'),
1469 version: '>=2.5.1', method: 'pkg-config',
1470 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001471endif
César Belley0a40bcb2020-08-26 13:42:04 +02001472u2f = not_found
1473if have_system
1474 u2f = dependency('u2f-emu', required: get_option('u2f'),
1475 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001476 kwargs: static_kwargs)
César Belley0a40bcb2020-08-26 13:42:04 +02001477endif
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08001478canokey = not_found
1479if have_system
1480 canokey = dependency('canokey-qemu', required: get_option('canokey'),
1481 method: 'pkg-config',
1482 kwargs: static_kwargs)
1483endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001484usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02001485if not get_option('usb_redir').auto() or have_system
1486 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
1487 version: '>=0.6', method: 'pkg-config',
1488 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001489endif
1490libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02001491if not get_option('libusb').auto() or have_system
1492 libusb = dependency('libusb-1.0', required: get_option('libusb'),
1493 version: '>=1.0.13', method: 'pkg-config',
1494 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001495endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02001496
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001497libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02001498if not get_option('libpmem').auto() or have_system
1499 libpmem = dependency('libpmem', required: get_option('libpmem'),
1500 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001501endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001502libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02001503if not get_option('libdaxctl').auto() or have_system
1504 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
1505 version: '>=57', method: 'pkg-config',
1506 kwargs: static_kwargs)
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001507endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001508tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02001509if gnutls.found()
1510 tasn1 = dependency('libtasn1',
1511 method: 'pkg-config',
1512 kwargs: static_kwargs)
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001513endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001514keyutils = dependency('libkeyutils', required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001515 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001516
Marc-André Lureau3909def2020-08-28 15:07:33 +04001517has_gettid = cc.has_function('gettid')
1518
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001519# libselinux
1520selinux = dependency('libselinux',
1521 required: get_option('selinux'),
1522 method: 'pkg-config', kwargs: static_kwargs)
1523
Paolo Bonziniaa087962020-09-01 11:15:30 -04001524# Malloc tests
1525
1526malloc = []
1527if get_option('malloc') == 'system'
1528 has_malloc_trim = \
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001529 get_option('malloc_trim').allowed() and \
Paolo Bonziniaa087962020-09-01 11:15:30 -04001530 cc.links('''#include <malloc.h>
1531 int main(void) { malloc_trim(0); return 0; }''')
1532else
1533 has_malloc_trim = false
1534 malloc = cc.find_library(get_option('malloc'), required: true)
1535endif
1536if not has_malloc_trim and get_option('malloc_trim').enabled()
1537 if get_option('malloc') == 'system'
1538 error('malloc_trim not available on this platform.')
1539 else
1540 error('malloc_trim not available with non-libc memory allocator')
1541 endif
1542endif
1543
Max Reitz84e319a2020-11-02 17:18:55 +01001544# Check whether the glibc provides statx()
1545
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001546gnu_source_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01001547 #ifndef _GNU_SOURCE
1548 #define _GNU_SOURCE
1549 #endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001550'''
1551statx_test = gnu_source_prefix + '''
Max Reitz84e319a2020-11-02 17:18:55 +01001552 #include <sys/stat.h>
1553 int main(void) {
1554 struct statx statxbuf;
1555 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
1556 return 0;
1557 }'''
1558
1559has_statx = cc.links(statx_test)
1560
Hanna Reitz4ce7a082022-02-23 10:23:40 +01001561# Check whether statx() provides mount ID information
1562
1563statx_mnt_id_test = gnu_source_prefix + '''
1564 #include <sys/stat.h>
1565 int main(void) {
1566 struct statx statxbuf;
1567 statx(0, "", 0, STATX_BASIC_STATS | STATX_MNT_ID, &statxbuf);
1568 return statxbuf.stx_mnt_id;
1569 }'''
1570
1571has_statx_mnt_id = cc.links(statx_mnt_id_test)
1572
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001573have_vhost_user_blk_server = get_option('vhost_user_blk_server') \
1574 .require(targetos == 'linux',
1575 error_message: 'vhost_user_blk_server requires linux') \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02001576 .require(have_vhost_user,
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001577 error_message: 'vhost_user_blk_server requires vhost-user support') \
Alex Bennée26ed5012022-05-24 16:40:42 +01001578 .disable_auto_if(not have_tools and not have_system) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001579 .allowed()
Daniele Buono9e62ba42020-12-04 18:06:14 -05001580
Max Reitzdf4ea702020-10-27 20:05:46 +01001581if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1582 error('Cannot enable fuse-lseek while fuse is disabled')
1583endif
1584
Max Reitza484a712020-10-27 20:05:41 +01001585fuse = dependency('fuse3', required: get_option('fuse'),
1586 version: '>=3.1', method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001587 kwargs: static_kwargs)
Max Reitza484a712020-10-27 20:05:41 +01001588
Max Reitzdf4ea702020-10-27 20:05:46 +01001589fuse_lseek = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001590if get_option('fuse_lseek').allowed()
Max Reitzdf4ea702020-10-27 20:05:46 +01001591 if fuse.version().version_compare('>=3.8')
1592 # Dummy dependency
1593 fuse_lseek = declare_dependency()
1594 elif get_option('fuse_lseek').enabled()
1595 if fuse.found()
1596 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1597 else
1598 error('fuse-lseek requires libfuse, which was not found')
1599 endif
1600 endif
1601endif
1602
Xie Yongjia6caeee2022-05-23 16:46:08 +08001603have_libvduse = (targetos == 'linux')
1604if get_option('libvduse').enabled()
1605 if targetos != 'linux'
1606 error('libvduse requires linux')
1607 endif
1608elif get_option('libvduse').disabled()
1609 have_libvduse = false
1610endif
1611
Xie Yongji2a2359b2022-05-23 16:46:09 +08001612have_vduse_blk_export = (have_libvduse and targetos == 'linux')
1613if get_option('vduse_blk_export').enabled()
1614 if targetos != 'linux'
1615 error('vduse_blk_export requires linux')
1616 elif not have_libvduse
1617 error('vduse_blk_export requires libvduse support')
1618 endif
1619elif get_option('vduse_blk_export').disabled()
1620 have_vduse_blk_export = false
1621endif
1622
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001623# libbpf
1624libbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
1625if libbpf.found() and not cc.links('''
1626 #include <bpf/libbpf.h>
1627 int main(void)
1628 {
1629 bpf_object__destroy_skeleton(NULL);
1630 return 0;
1631 }''', dependencies: libbpf)
1632 libbpf = not_found
1633 if get_option('bpf').enabled()
1634 error('libbpf skeleton test failed')
1635 else
1636 warning('libbpf skeleton test failed, disabling')
1637 endif
1638endif
1639
Paolo Bonzini87430d52021-10-07 15:06:09 +02001640#################
1641# config-host.h #
1642#################
1643
1644audio_drivers_selected = []
1645if have_system
1646 audio_drivers_available = {
1647 'alsa': alsa.found(),
1648 'coreaudio': coreaudio.found(),
1649 'dsound': dsound.found(),
1650 'jack': jack.found(),
1651 'oss': oss.found(),
1652 'pa': pulse.found(),
1653 'sdl': sdl.found(),
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001654 'sndio': sndio.found(),
Paolo Bonzini87430d52021-10-07 15:06:09 +02001655 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02001656 foreach k, v: audio_drivers_available
1657 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
1658 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02001659
1660 # Default to native drivers first, OSS second, SDL third
1661 audio_drivers_priority = \
Alexandre Ratchov663df1c2022-09-07 15:23:42 +02001662 [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \
Paolo Bonzini87430d52021-10-07 15:06:09 +02001663 (targetos == 'linux' ? [] : [ 'sdl' ])
1664 audio_drivers_default = []
1665 foreach k: audio_drivers_priority
1666 if audio_drivers_available[k]
1667 audio_drivers_default += k
1668 endif
1669 endforeach
1670
1671 foreach k: get_option('audio_drv_list')
1672 if k == 'default'
1673 audio_drivers_selected += audio_drivers_default
1674 elif not audio_drivers_available[k]
1675 error('Audio driver "@0@" not available.'.format(k))
1676 else
1677 audio_drivers_selected += k
1678 endif
1679 endforeach
1680endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001681config_host_data.set('CONFIG_AUDIO_DRIVERS',
1682 '"' + '", "'.join(audio_drivers_selected) + '", ')
1683
Daniele Buono9e62ba42020-12-04 18:06:14 -05001684if get_option('cfi')
1685 cfi_flags=[]
1686 # Check for dependency on LTO
1687 if not get_option('b_lto')
1688 error('Selected Control-Flow Integrity but LTO is disabled')
1689 endif
1690 if config_host.has_key('CONFIG_MODULES')
1691 error('Selected Control-Flow Integrity is not compatible with modules')
1692 endif
1693 # Check for cfi flags. CFI requires LTO so we can't use
1694 # get_supported_arguments, but need a more complex "compiles" which allows
1695 # custom arguments
1696 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1697 args: ['-flto', '-fsanitize=cfi-icall'] )
1698 cfi_flags += '-fsanitize=cfi-icall'
1699 else
1700 error('-fsanitize=cfi-icall is not supported by the compiler')
1701 endif
1702 if cc.compiles('int main () { return 0; }',
1703 name: '-fsanitize-cfi-icall-generalize-pointers',
1704 args: ['-flto', '-fsanitize=cfi-icall',
1705 '-fsanitize-cfi-icall-generalize-pointers'] )
1706 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1707 else
1708 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1709 endif
1710 if get_option('cfi_debug')
1711 if cc.compiles('int main () { return 0; }',
1712 name: '-fno-sanitize-trap=cfi-icall',
1713 args: ['-flto', '-fsanitize=cfi-icall',
1714 '-fno-sanitize-trap=cfi-icall'] )
1715 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1716 else
1717 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1718 endif
1719 endif
Marc-André Lureau5fc06172021-01-14 16:56:02 +04001720 add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1721 add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
Daniele Buono9e62ba42020-12-04 18:06:14 -05001722endif
1723
Joelle van Dyne14176c82021-03-15 11:03:38 -07001724have_host_block_device = (targetos != 'darwin' or
1725 cc.has_header('IOKit/storage/IOMedia.h'))
1726
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001727dbus_display = get_option('dbus_display') \
1728 .require(gio.version().version_compare('>=2.64'),
1729 error_message: '-display dbus requires glib>=2.64') \
Paolo Bonzini75440602022-04-20 17:33:44 +02001730 .require(gdbus_codegen.found(),
Paolo Bonzinibb2dc4b2022-09-30 09:53:02 +02001731 error_message: gdbus_codegen_error.format('-display dbus')) \
Paolo Bonzinid82b11f2022-07-28 08:41:28 +02001732 .require(opengl.found() and gbm.found(),
1733 error_message: '-display dbus requires epoxy/egl and gbm') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001734 .allowed()
Marc-André Lureau142ca622021-07-15 11:53:53 +04001735
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001736have_virtfs = get_option('virtfs') \
Keno Fischer0fb1e192022-02-27 17:35:22 -05001737 .require(targetos == 'linux' or targetos == 'darwin',
1738 error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
1739 .require(targetos == 'linux' or cc.has_function('pthread_fchdir_np'),
1740 error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
1741 .require(targetos == 'darwin' or (libattr.found() and libcap_ng.found()),
1742 error_message: 'virtio-9p (virtfs) on Linux requires libcap-ng-devel and libattr-devel') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001743 .disable_auto_if(not have_tools and not have_system) \
1744 .allowed()
Paolo Bonzini69202b42020-11-17 14:46:21 +01001745
Keno Fischer0fb1e192022-02-27 17:35:22 -05001746have_virtfs_proxy_helper = targetos != 'darwin' and have_virtfs and have_tools
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01001747
Paolo Bonzini622d64f2022-04-20 17:33:53 +02001748if get_option('block_drv_ro_whitelist') == ''
1749 config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
1750else
1751 config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
1752 '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
1753endif
1754if get_option('block_drv_rw_whitelist') == ''
1755 config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
1756else
1757 config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
1758 '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
1759endif
1760
Paolo Bonzini9c29b742021-10-07 15:08:14 +02001761foreach k : get_option('trace_backends')
1762 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
1763endforeach
1764config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02001765config_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
Paolo Bonzini40c909f2022-04-20 17:33:49 +02001766if iasl.found()
1767 config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
Paolo Bonzini5dc46182021-10-13 13:19:00 +02001768endif
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001769config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1770config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1771config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1772config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1773config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09001774
1775qemu_firmwarepath = ''
1776foreach k : get_option('qemu_firmwarepath')
1777 qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
1778endforeach
1779config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
1780
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001781config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1782config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1783config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1784config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1785config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1786config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1787
Paolo Bonzinib0b43232022-04-20 17:33:54 +02001788if config_host.has_key('CONFIG_MODULES')
1789 config_host_data.set('CONFIG_STAMP', run_command(
1790 meson.current_source_dir() / 'scripts/qemu-stamp.py',
1791 meson.project_version(), get_option('pkgversion'), '--',
1792 meson.current_source_dir() / 'configure',
1793 capture: true, check: true).stdout().strip())
1794endif
1795
Paolo Bonzini35acbb32021-10-13 13:43:36 +02001796have_slirp_smbd = get_option('slirp_smbd') \
1797 .require(targetos != 'windows', error_message: 'Host smbd not supported on this platform.') \
1798 .allowed()
1799if have_slirp_smbd
1800 smbd_path = get_option('smbd')
1801 if smbd_path == ''
1802 smbd_path = (targetos == 'solaris' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
1803 endif
1804 config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
1805endif
1806
Paolo Bonzini823eb012021-11-08 14:18:17 +01001807config_host_data.set('HOST_' + host_arch.to_upper(), 1)
1808
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02001809if get_option('module_upgrades') and not enable_modules
1810 error('Cannot enable module-upgrades as modules are not enabled')
1811endif
1812config_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
1813
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001814config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001815config_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001816config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04001817config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzini537b7242021-10-07 15:08:12 +02001818config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02001819config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001820config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001821config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001822config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1823config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001824config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08001825config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02001826config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini75440602022-04-20 17:33:44 +02001827config_host_data.set('CONFIG_GIO', gio.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001828config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1829if glusterfs.found()
1830 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1831 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1832 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1833 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1834 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1835 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1836endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001837config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001838config_host_data.set('CONFIG_VTE', vte.found())
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001839config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001840config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001841config_host_data.set('CONFIG_EBPF', libbpf.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001842config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001843config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01001844config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Thomas Huthe6a52b32021-12-09 15:48:01 +01001845config_host_data.set('CONFIG_LIBSSH', libssh.found())
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001846config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001847config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
Sam Lie2848bc2022-05-31 18:50:11 +08001848config_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 +02001849config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001850config_host_data.set('CONFIG_NUMA', numa.found())
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001851config_host_data.set('CONFIG_OPENGL', opengl.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001852config_host_data.set('CONFIG_PROFILER', get_option('profiler'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001853config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini3730a732022-04-20 17:33:41 +02001854config_host_data.set('CONFIG_RDMA', rdma.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001855config_host_data.set('CONFIG_SDL', sdl.found())
1856config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01001857config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Michal Privoznik73422d92022-10-26 09:30:24 +02001858if seccomp.found()
1859 config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
1860endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01001861config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01001862config_host_data.set('CONFIG_TPM', have_tpm)
Paolo Bonzini90540f32021-06-03 11:15:26 +02001863config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Paolo Bonzinie1723992021-10-07 15:08:21 +02001864config_host_data.set('CONFIG_VDE', vde.found())
Paolo Bonzini2df89d52022-04-20 17:34:07 +02001865config_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
1866config_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
1867config_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
1868config_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
1869config_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
1870config_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
1871config_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03001872config_host_data.set('CONFIG_VMNET', vmnet.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001873config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Xie Yongji2a2359b2022-05-23 16:46:09 +08001874config_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
Kshitij Suri95f85102022-04-08 07:13:34 +00001875config_host_data.set('CONFIG_PNG', png.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001876config_host_data.set('CONFIG_VNC', vnc.found())
1877config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001878config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01001879config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001880config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001881config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001882config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04001883config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02001884config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001885config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Daniel P. Berrangéd47b83b2022-04-26 17:00:43 +01001886config_host_data.set('CONFIG_TASN1', tasn1.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02001887config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
1888config_host_data.set('CONFIG_NETTLE', nettle.found())
Lei He4c5e5122022-05-25 17:01:14 +08001889config_host_data.set('CONFIG_HOGWEED', hogweed.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02001890config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04001891config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01001892config_host_data.set('CONFIG_STATX', has_statx)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01001893config_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id)
Paolo Bonzinib1def332020-11-17 13:37:39 +01001894config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01001895config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01001896config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001897config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
Marc-André Lureauddece462021-10-06 14:18:09 +04001898if spice_protocol.found()
1899config_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
1900config_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
1901config_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
1902endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001903config_host_data.set('CONFIG_SPICE', spice.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01001904config_host_data.set('CONFIG_X11', x11.found())
Marc-André Lureau142ca622021-07-15 11:53:53 +04001905config_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
Daniele Buono9e62ba42020-12-04 18:06:14 -05001906config_host_data.set('CONFIG_CFI', get_option('cfi'))
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001907config_host_data.set('CONFIG_SELINUX', selinux.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001908config_host_data.set('CONFIG_XEN_BACKEND', xen.found())
1909if xen.found()
1910 # protect from xen.version() having less than three components
1911 xen_version = xen.version().split('.') + ['0', '0']
1912 xen_ctrl_version = xen_version[0] + \
1913 ('0' + xen_version[1]).substring(-2) + \
1914 ('0' + xen_version[2]).substring(-2)
1915 config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
1916endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001917config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1918config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1919config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1920config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1921
Paolo Bonzinia6305082021-10-07 15:08:15 +02001922config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001923config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
1924
Paolo Bonzini728c0a22021-10-13 11:52:03 +02001925have_coroutine_pool = get_option('coroutine_pool')
1926if get_option('debug_stack_usage') and have_coroutine_pool
1927 message('Disabling coroutine pool to measure stack usage')
1928 have_coroutine_pool = false
1929endif
1930config_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool)
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001931config_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
Paolo Bonzini728c0a22021-10-13 11:52:03 +02001932config_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001933config_host_data.set('CONFIG_GPROF', get_option('gprof'))
Paolo Bonzini406523f2021-10-13 11:43:54 +02001934config_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001935config_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
Juan Quintelaabad1852022-09-02 18:51:25 +02001936config_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
Paolo Bonzini406523f2021-10-13 11:43:54 +02001937
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001938# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001939config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02001940config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
1941config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
Thomas Huth48f670e2020-11-18 18:10:52 +01001942config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001943config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001944config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001945config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001946config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001947config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Bin Mengd4093732022-08-02 15:51:58 +08001948if targetos == 'windows'
1949 config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
1950endif
Thomas Huthded5d782020-11-14 11:10:11 +01001951
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001952# has_function
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001953config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001954config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
1955config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
1956config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
1957config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Peter Maydell86983432022-02-26 18:07:19 +00001958# Note that we need to specify prefix: here to avoid incorrectly
1959# thinking that Windows has posix_memalign()
1960config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
Peter Maydell5c8c7142022-02-26 18:07:20 +00001961config_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
Peter Maydell88454f82022-02-26 18:07:21 +00001962config_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
1963config_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001964config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001965config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Keno Fischer029ed1b2022-02-27 17:35:20 -05001966config_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001967config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
1968config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
1969config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
1970config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
1971config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001972config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Andrew Deason59e35c72022-04-26 14:55:22 -05001973config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001974config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001975config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001976config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Stefano Garzarella66dc5f92022-05-17 09:10:12 +02001977if rbd.found()
1978 config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
1979 cc.has_function('rbd_namespace_exists',
1980 dependencies: rbd,
1981 prefix: '#include <rbd/librbd.h>'))
1982endif
Li Zhijian911965a2021-09-10 15:02:55 +08001983if rdma.found()
1984 config_host_data.set('HAVE_IBV_ADVISE_MR',
1985 cc.has_function('ibv_advise_mr',
Paolo Bonzini3730a732022-04-20 17:33:41 +02001986 dependencies: rdma,
Li Zhijian911965a2021-09-10 15:02:55 +08001987 prefix: '#include <infiniband/verbs.h>'))
1988endif
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001989
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001990# has_header_symbol
1991config_host_data.set('CONFIG_BYTESWAP_H',
1992 cc.has_header_symbol('byteswap.h', 'bswap_32'))
1993config_host_data.set('CONFIG_EPOLL_CREATE1',
1994 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
1995config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
1996 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
1997 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
1998config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
1999 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
2000config_host_data.set('CONFIG_FIEMAP',
2001 cc.has_header('linux/fiemap.h') and
2002 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002003config_host_data.set('CONFIG_GETRANDOM',
2004 cc.has_function('getrandom') and
2005 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002006config_host_data.set('CONFIG_INOTIFY',
2007 cc.has_header_symbol('sys/inotify.h', 'inotify_init'))
2008config_host_data.set('CONFIG_INOTIFY1',
2009 cc.has_header_symbol('sys/inotify.h', 'inotify_init1'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002010config_host_data.set('CONFIG_MACHINE_BSWAP_H',
2011 cc.has_header_symbol('machine/bswap.h', 'bswap32',
2012 prefix: '''#include <sys/endian.h>
2013 #include <sys/types.h>'''))
2014config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
2015 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02002016config_host_data.set('CONFIG_RTNETLINK',
2017 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
2018config_host_data.set('CONFIG_SYSMACROS',
2019 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002020config_host_data.set('HAVE_OPTRESET',
2021 cc.has_header_symbol('getopt.h', 'optreset'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04002022config_host_data.set('HAVE_IPPROTO_MPTCP',
2023 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Daniel P. Berrangé3cd3df22022-08-02 12:41:34 -04002024config_host_data.set('HAVE_SYS_MOUNT_FSCONFIG',
2025 cc.has_header_symbol('sys/mount.h', 'FSCONFIG_SET_FLAG'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002026
2027# has_member
2028config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
2029 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
2030 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02002031config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
2032 cc.has_member('struct stat', 'st_atim',
2033 prefix: '#include <sys/stat.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02002034
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002035# has_type
2036config_host_data.set('CONFIG_IOVEC',
2037 cc.has_type('struct iovec',
2038 prefix: '#include <sys/uio.h>'))
2039config_host_data.set('HAVE_UTMPX',
2040 cc.has_type('struct utmpx',
2041 prefix: '#include <utmpx.h>'))
2042
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002043config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002044 #include <sys/eventfd.h>
2045 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002046config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002047 #include <unistd.h>
2048 int main(void) {
2049 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2050 return fdatasync(0);
2051 #else
2052 #error Not supported
2053 #endif
2054 }'''))
Andrew Deason8900c202022-03-15 22:52:25 -05002055
2056has_madvise = cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002057 #include <sys/types.h>
2058 #include <sys/mman.h>
2059 #include <stddef.h>
Andrew Deason8900c202022-03-15 22:52:25 -05002060 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
2061missing_madvise_proto = false
2062if has_madvise
2063 # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
2064 # but forget to prototype it. In this case, has_madvise will be true (the
2065 # test program links despite a compile warning). To detect the
2066 # missing-prototype case, we try again with a definitely-bogus prototype.
2067 # This will only compile if the system headers don't provide the prototype;
2068 # otherwise the conflicting prototypes will cause a compiler error.
2069 missing_madvise_proto = cc.links(gnu_source_prefix + '''
2070 #include <sys/types.h>
2071 #include <sys/mman.h>
2072 #include <stddef.h>
2073 extern int madvise(int);
2074 int main(void) { return madvise(0); }''')
2075endif
2076config_host_data.set('CONFIG_MADVISE', has_madvise)
2077config_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
2078
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002079config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002080 #include <sys/mman.h>
2081 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002082config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002083 #include <fcntl.h>
2084 #if !defined(AT_EMPTY_PATH)
2085 # error missing definition
2086 #else
2087 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2088 #endif'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002089config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002090 #include <sys/mman.h>
2091 #include <stddef.h>
2092 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002093
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002094config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002095 #include <pthread.h>
2096
2097 static void *f(void *p) { return NULL; }
2098 int main(void)
2099 {
2100 pthread_t thread;
2101 pthread_create(&thread, 0, f, 0);
2102 pthread_setname_np(thread, "QEMU");
2103 return 0;
2104 }''', dependencies: threads))
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002105config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002106 #include <pthread.h>
2107
2108 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
2109 int main(void)
2110 {
2111 pthread_t thread;
2112 pthread_create(&thread, 0, f, 0);
2113 return 0;
2114 }''', dependencies: threads))
Longpeng(Mike)657ac982022-02-22 17:05:05 +08002115config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
2116 #include <pthread.h>
2117 #include <time.h>
2118
2119 int main(void)
2120 {
2121 pthread_condattr_t attr
2122 pthread_condattr_init(&attr);
2123 pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2124 return 0;
2125 }''', dependencies: threads))
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002126
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002127config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02002128 #include <sys/signalfd.h>
2129 #include <stddef.h>
2130 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002131config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002132 #include <unistd.h>
2133 #include <fcntl.h>
2134 #include <limits.h>
2135
2136 int main(void)
2137 {
2138 int len, fd = 0;
2139 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2140 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2141 return 0;
2142 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002143
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002144config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
2145 #include <sys/mman.h>
2146 int main(int argc, char *argv[]) {
2147 return mlockall(MCL_FUTURE);
2148 }'''))
2149
Thomas Hutheea94532021-10-28 20:59:08 +02002150have_l2tpv3 = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002151if get_option('l2tpv3').allowed() and have_system
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002152 have_l2tpv3 = cc.has_type('struct mmsghdr',
2153 prefix: gnu_source_prefix + '''
2154 #include <sys/socket.h>
2155 #include <linux/ip.h>''')
Thomas Hutheea94532021-10-28 20:59:08 +02002156endif
2157config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2158
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002159have_netmap = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002160if get_option('netmap').allowed() and have_system
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002161 have_netmap = cc.compiles('''
2162 #include <inttypes.h>
2163 #include <net/if.h>
2164 #include <net/netmap.h>
2165 #include <net/netmap_user.h>
2166 #if (NETMAP_API < 11) || (NETMAP_API > 15)
2167 #error
2168 #endif
2169 int main(void) { return 0; }''')
2170 if not have_netmap and get_option('netmap').enabled()
2171 error('Netmap headers not available')
2172 endif
2173endif
2174config_host_data.set('CONFIG_NETMAP', have_netmap)
2175
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002176# Work around a system header bug with some kernel/XFS header
2177# versions where they both try to define 'struct fsxattr':
2178# xfs headers will not try to redefine structs from linux headers
2179# if this macro is set.
2180config_host_data.set('HAVE_FSXATTR', cc.links('''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002181 #include <linux/fs.h>
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002182 struct fsxattr foo;
2183 int main(void) {
2184 return 0;
2185 }'''))
2186
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002187# Some versions of Mac OS X incorrectly define SIZE_MAX
2188config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2189 #include <stdint.h>
2190 #include <stdio.h>
2191 int main(int argc, char *argv[]) {
2192 return printf("%zu", SIZE_MAX);
2193 }''', args: ['-Werror']))
2194
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002195atomic_test = '''
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002196 #include <stdint.h>
2197 int main(void)
2198 {
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002199 @0@ x = 0, y = 0;
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002200 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
2201 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
2202 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2203 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2204 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2205 return 0;
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002206 }'''
2207
2208# See if 64-bit atomic operations are supported.
2209# Note that without __atomic builtins, we can only
2210# assume atomic loads/stores max at pointer size.
2211config_host_data.set('CONFIG_ATOMIC64', cc.links(atomic_test.format('uint64_t')))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002212
Marc-André Lureau848126d2022-02-28 15:49:19 +04002213has_int128 = cc.links('''
2214 __int128_t a;
2215 __uint128_t b;
2216 int main (void) {
2217 a = a + b;
2218 b = a * b;
2219 a = a * a;
2220 return 0;
2221 }''')
2222
2223config_host_data.set('CONFIG_INT128', has_int128)
2224
2225if has_int128
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002226 # "do we have 128-bit atomics which are handled inline and specifically not
2227 # via libatomic". The reason we can't use libatomic is documented in the
2228 # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
2229 has_atomic128 = cc.links(atomic_test.format('unsigned __int128'))
Marc-André Lureau848126d2022-02-28 15:49:19 +04002230
2231 config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
2232
2233 if not has_atomic128
2234 has_cmpxchg128 = cc.links('''
2235 int main(void)
2236 {
2237 unsigned __int128 x = 0, y = 0;
2238 __sync_val_compare_and_swap_16(&x, y, x);
2239 return 0;
2240 }
2241 ''')
2242
2243 config_host_data.set('CONFIG_CMPXCHG128', has_cmpxchg128)
2244 endif
2245endif
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002246
2247config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
2248 #include <sys/auxv.h>
2249 int main(void) {
2250 return getauxval(AT_HWCAP) == 0;
2251 }'''))
2252
Paolo Bonzini0dae95d2022-04-20 17:33:43 +02002253config_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
2254 #include <linux/usbdevice_fs.h>
2255
2256 #ifndef USBDEVFS_GET_CAPABILITIES
2257 #error "USBDEVFS_GET_CAPABILITIES undefined"
2258 #endif
2259
2260 #ifndef USBDEVFS_DISCONNECT_CLAIM
2261 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
2262 #endif
2263
2264 int main(void) { return 0; }'''))
2265
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02002266have_keyring = get_option('keyring') \
2267 .require(targetos == 'linux', error_message: 'keyring is only available on Linux') \
2268 .require(cc.compiles('''
2269 #include <errno.h>
2270 #include <asm/unistd.h>
2271 #include <linux/keyctl.h>
2272 #include <sys/syscall.h>
2273 #include <unistd.h>
2274 int main(void) {
2275 return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
2276 }'''), error_message: 'keyctl syscall not available on this system').allowed()
2277config_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
2278
Paolo Bonzini622753d2021-11-08 13:38:58 +01002279have_cpuid_h = cc.links('''
2280 #include <cpuid.h>
2281 int main(void) {
2282 unsigned a, b, c, d;
2283 unsigned max = __get_cpuid_max(0, 0);
2284
2285 if (max >= 1) {
2286 __cpuid(1, a, b, c, d);
2287 }
2288
2289 if (max >= 7) {
2290 __cpuid_count(7, 0, a, b, c, d);
2291 }
2292
2293 return 0;
2294 }''')
2295config_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
2296
2297config_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
2298 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
2299 .require(cc.links('''
2300 #pragma GCC push_options
2301 #pragma GCC target("avx2")
2302 #include <cpuid.h>
2303 #include <immintrin.h>
2304 static int bar(void *a) {
2305 __m256i x = *(__m256i *)a;
2306 return _mm256_testz_si256(x, x);
2307 }
2308 int main(int argc, char *argv[]) { return bar(argv[0]); }
2309 '''), error_message: 'AVX2 not available').allowed())
2310
2311config_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \
2312 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \
2313 .require(cc.links('''
2314 #pragma GCC push_options
2315 #pragma GCC target("avx512f")
2316 #include <cpuid.h>
2317 #include <immintrin.h>
2318 static int bar(void *a) {
2319 __m512i x = *(__m512i *)a;
2320 return _mm512_test_epi64_mask(x, x);
2321 }
2322 int main(int argc, char *argv[]) { return bar(argv[0]); }
2323 '''), error_message: 'AVX512F not available').allowed())
2324
Paolo Bonzini3730a732022-04-20 17:33:41 +02002325have_pvrdma = get_option('pvrdma') \
2326 .require(rdma.found(), error_message: 'PVRDMA requires OpenFabrics libraries') \
Juan Quintela354d2d92022-05-02 15:11:19 +02002327 .require(cc.compiles(gnu_source_prefix + '''
2328 #include <sys/mman.h>
Paolo Bonzini3730a732022-04-20 17:33:41 +02002329 int main(void)
2330 {
2331 char buf = 0;
2332 void *addr = &buf;
2333 addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
2334
2335 return 0;
2336 }'''), error_message: 'PVRDMA requires mremap').allowed()
2337
2338if have_pvrdma
Juan Quintela354d2d92022-05-02 15:11:19 +02002339 config_host_data.set('LEGACY_RDMA_REG_MR', not cc.links('''
Paolo Bonzini3730a732022-04-20 17:33:41 +02002340 #include <infiniband/verbs.h>
2341 int main(void)
2342 {
2343 struct ibv_mr *mr;
2344 struct ibv_pd *pd = NULL;
2345 size_t length = 10;
2346 uint64_t iova = 0;
2347 int access = 0;
2348 void *addr = NULL;
2349
2350 mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
2351 ibv_dereg_mr(mr);
2352 return 0;
2353 }'''))
2354endif
2355
Paolo Bonzinib87df902021-11-08 13:52:11 +01002356if get_option('membarrier').disabled()
2357 have_membarrier = false
2358elif targetos == 'windows'
2359 have_membarrier = true
2360elif targetos == 'linux'
2361 have_membarrier = cc.compiles('''
2362 #include <linux/membarrier.h>
2363 #include <sys/syscall.h>
2364 #include <unistd.h>
2365 #include <stdlib.h>
2366 int main(void) {
2367 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
2368 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
2369 exit(0);
2370 }''')
2371endif
2372config_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
2373 .require(have_membarrier, error_message: 'membarrier system call not available') \
2374 .allowed())
2375
Paolo Bonzini34b52612021-11-08 14:02:42 +01002376have_afalg = get_option('crypto_afalg') \
2377 .require(cc.compiles(gnu_source_prefix + '''
2378 #include <errno.h>
2379 #include <sys/types.h>
2380 #include <sys/socket.h>
2381 #include <linux/if_alg.h>
2382 int main(void) {
2383 int sock;
2384 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
2385 return sock;
2386 }
2387 '''), error_message: 'AF_ALG requested but could not be detected').allowed()
2388config_host_data.set('CONFIG_AF_ALG', have_afalg)
2389
Marc-André Lureau9d734b82022-04-01 15:50:05 +04002390config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
2391 'linux/vm_sockets.h', 'AF_VSOCK',
2392 prefix: '#include <sys/socket.h>',
2393))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002394
Marc-André Lureau8821a382022-02-01 16:53:43 +04002395have_vss = false
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002396have_vss_sdk = false # old xp/2003 SDK
Marc-André Lureau8821a382022-02-01 16:53:43 +04002397if targetos == 'windows' and link_language == 'cpp'
2398 have_vss = cxx.compiles('''
2399 #define __MIDL_user_allocate_free_DEFINED__
Marc-André Lureau32478cb2022-02-22 23:40:01 +04002400 #include <vss.h>
Marc-André Lureau8821a382022-02-01 16:53:43 +04002401 int main(void) { return VSS_CTX_BACKUP; }''')
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002402 have_vss_sdk = cxx.has_header('vscoordint.h')
Marc-André Lureau8821a382022-02-01 16:53:43 +04002403endif
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002404config_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
Marc-André Lureau8821a382022-02-01 16:53:43 +04002405
Paolo Bonzini859aef02020-08-04 18:14:26 +02002406foreach k, v: config_host
Paolo Bonzinice6119d2022-04-20 17:33:55 +02002407 if k.startswith('CONFIG_')
Paolo Bonzini859aef02020-08-04 18:14:26 +02002408 config_host_data.set(k, v == 'y' ? 1 : v)
2409 endif
2410endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02002411
Richard Henderson6391c772022-04-17 11:30:06 -07002412# Older versions of MinGW do not import _lock_file and _unlock_file properly.
2413# This was fixed for v6.0.0 with commit b48e3ac8969d.
2414if targetos == 'windows'
2415 config_host_data.set('HAVE__LOCK_FILE', cc.links('''
2416 #include <stdio.h>
2417 int main(void) {
2418 _lock_file(NULL);
2419 _unlock_file(NULL);
2420 return 0;
2421 }''', name: '_lock_file and _unlock_file'))
2422endif
2423
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002424########################
2425# Target configuration #
2426########################
2427
Paolo Bonzini2becc362020-02-03 11:42:03 +01002428minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04002429config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04002430config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002431config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002432config_devices_mak_list = []
2433config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02002434config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002435config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002436
2437disassemblers = {
2438 'alpha' : ['CONFIG_ALPHA_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002439 'avr' : ['CONFIG_AVR_DIS'],
2440 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06002441 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002442 'hppa' : ['CONFIG_HPPA_DIS'],
2443 'i386' : ['CONFIG_I386_DIS'],
2444 'x86_64' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002445 'm68k' : ['CONFIG_M68K_DIS'],
2446 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
2447 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002448 'nios2' : ['CONFIG_NIOS2_DIS'],
2449 'or1k' : ['CONFIG_OPENRISC_DIS'],
2450 'ppc' : ['CONFIG_PPC_DIS'],
2451 'riscv' : ['CONFIG_RISCV_DIS'],
2452 'rx' : ['CONFIG_RX_DIS'],
2453 's390' : ['CONFIG_S390_DIS'],
2454 'sh4' : ['CONFIG_SH4_DIS'],
2455 'sparc' : ['CONFIG_SPARC_DIS'],
2456 'xtensa' : ['CONFIG_XTENSA_DIS'],
Song Gaoaae17462022-06-06 20:43:06 +08002457 'loongarch' : ['CONFIG_LOONGARCH_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002458}
2459if link_language == 'cpp'
2460 disassemblers += {
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002461 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
2462 }
2463endif
2464
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002465have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01002466host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02002467 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002468 (have_tpm ? ['CONFIG_TPM=y'] : []) + \
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002469 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02002470 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002471 (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01002472 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02002473 (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
2474 (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
2475 (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01002476 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01002477 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
Paolo Bonzini3730a732022-04-20 17:33:41 +02002478 (have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \
Jagannathan Raman55116962022-06-13 16:26:24 -04002479 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
2480 (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01002481
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002482ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002483
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002484default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
2485actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002486fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002487foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04002488 config_target = { 'TARGET_NAME': target.split('-')[0] }
2489 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002490 if targetos != 'linux'
2491 if default_targets
2492 continue
2493 endif
2494 error('Target @0@ is only available on a Linux host'.format(target))
2495 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04002496 config_target += { 'CONFIG_LINUX_USER': 'y' }
2497 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002498 if 'CONFIG_BSD' not in config_host
2499 if default_targets
2500 continue
2501 endif
2502 error('Target @0@ is only available on a BSD host'.format(target))
2503 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04002504 config_target += { 'CONFIG_BSD_USER': 'y' }
2505 elif target.endswith('softmmu')
2506 config_target += { 'CONFIG_SOFTMMU': 'y' }
2507 endif
2508 if target.endswith('-user')
2509 config_target += {
2510 'CONFIG_USER_ONLY': 'y',
2511 'CONFIG_QEMU_INTERP_PREFIX':
Paolo Bonzinice6119d2022-04-20 17:33:55 +02002512 get_option('interp_prefix').replace('%M', config_target['TARGET_NAME'])
Paolo Bonzini765686d2020-09-18 06:37:21 -04002513 }
2514 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002515
Paolo Bonzini0a189112020-11-17 14:58:32 +01002516 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04002517 foreach sym: accelerators
2518 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
2519 config_target += { sym: 'y' }
2520 config_all += { sym: 'y' }
Paolo Bonzini23a77b22020-12-14 12:01:45 +01002521 if sym == 'CONFIG_TCG' and tcg_arch == 'tci'
2522 config_target += { 'CONFIG_TCG_INTERPRETER': 'y' }
Paolo Bonzini8a199802020-09-18 05:37:01 -04002523 endif
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002524 if target in modular_tcg
2525 config_target += { 'CONFIG_TCG_MODULAR': 'y' }
2526 else
2527 config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
2528 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01002529 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04002530 endif
2531 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01002532 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002533 if default_targets
2534 continue
2535 endif
2536 error('No accelerator available for target @0@'.format(target))
2537 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04002538
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002539 actual_target_dirs += target
Alex Bennée812b31d2021-07-07 14:17:43 +01002540 config_target += keyval.load('configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002541 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04002542
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002543 if 'TARGET_NEED_FDT' in config_target
2544 fdt_required += target
2545 endif
2546
Paolo Bonzinifa731682020-09-21 05:19:07 -04002547 # Add default keys
2548 if 'TARGET_BASE_ARCH' not in config_target
2549 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
2550 endif
2551 if 'TARGET_ABI_DIR' not in config_target
2552 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
2553 endif
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04002554 if 'TARGET_BIG_ENDIAN' not in config_target
2555 config_target += {'TARGET_BIG_ENDIAN': 'n'}
2556 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002557
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002558 foreach k, v: disassemblers
Paolo Bonzini823eb012021-11-08 14:18:17 +01002559 if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002560 foreach sym: v
2561 config_target += { sym: 'y' }
2562 config_all_disas += { sym: 'y' }
2563 endforeach
2564 endif
2565 endforeach
2566
Paolo Bonzini859aef02020-08-04 18:14:26 +02002567 config_target_data = configuration_data()
2568 foreach k, v: config_target
2569 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
2570 # do nothing
2571 elif ignored.contains(k)
2572 # do nothing
2573 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002574 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
2575 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02002576 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04002577 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02002578 config_target_data.set_quoted(k, v)
2579 elif v == 'y'
2580 config_target_data.set(k, 1)
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04002581 elif v == 'n'
2582 config_target_data.set(k, 0)
Paolo Bonzini859aef02020-08-04 18:14:26 +02002583 else
2584 config_target_data.set(k, v)
2585 endif
2586 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01002587 config_target_data.set('QEMU_ARCH',
2588 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02002589 config_target_h += {target: configure_file(output: target + '-config-target.h',
2590 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002591
2592 if target.endswith('-softmmu')
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01002593 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002594 config_devices_mak = target + '-config-devices.mak'
2595 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01002596 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01002597 output: config_devices_mak,
2598 depfile: config_devices_mak + '.d',
2599 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01002600 command: [minikconf,
2601 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01002602 config_devices_mak, '@DEPFILE@', '@INPUT@',
Philippe Mathieu-Daudéf4063f92021-07-07 14:17:40 +01002603 host_kconfig, accel_kconfig,
2604 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'])
Paolo Bonzini859aef02020-08-04 18:14:26 +02002605
2606 config_devices_data = configuration_data()
2607 config_devices = keyval.load(config_devices_mak)
2608 foreach k, v: config_devices
2609 config_devices_data.set(k, 1)
2610 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002611 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02002612 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
2613 configuration: config_devices_data)}
2614 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04002615 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01002616 endif
2617 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002618endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002619target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002620
Paolo Bonzini2becc362020-02-03 11:42:03 +01002621# This configuration is used to build files that are shared by
2622# multiple binaries, and then extracted out of the "common"
2623# static_library target.
2624#
2625# We do not use all_sources()/all_dependencies(), because it would
2626# build literally all source files, including devices only used by
2627# targets that are not built for this compilation. The CONFIG_ALL
2628# pseudo symbol replaces it.
2629
Paolo Bonzini05512f52020-09-16 15:31:11 -04002630config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01002631config_all += config_host
2632config_all += config_all_disas
2633config_all += {
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002634 'CONFIG_XEN': xen.found(),
Paolo Bonzini2becc362020-02-03 11:42:03 +01002635 'CONFIG_SOFTMMU': have_system,
2636 'CONFIG_USER_ONLY': have_user,
2637 'CONFIG_ALL': true,
2638}
2639
Paolo Bonzinieed56e92021-11-10 11:01:26 +01002640target_configs_h = []
2641foreach target: target_dirs
2642 target_configs_h += config_target_h[target]
2643 target_configs_h += config_devices_h.get(target, [])
2644endforeach
2645genh += custom_target('config-poison.h',
2646 input: [target_configs_h],
2647 output: 'config-poison.h',
2648 capture: true,
2649 command: [find_program('scripts/make-config-poison.sh'),
2650 target_configs_h])
2651
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002652##############
2653# Submodules #
2654##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002655
2656capstone = not_found
Thomas Huth83602082022-05-16 16:58:23 +02002657if not get_option('capstone').auto() or have_system or have_user
Thomas Huth43ecd162022-05-16 16:58:22 +02002658 capstone = dependency('capstone', version: '>=3.0.5',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01002659 kwargs: static_kwargs, method: 'pkg-config',
Thomas Huth83602082022-05-16 16:58:23 +02002660 required: get_option('capstone'))
Daniel P. Berrangé8f4aea72021-07-09 15:29:31 +01002661
2662 # Some versions of capstone have broken pkg-config file
2663 # that reports a wrong -I path, causing the #include to
2664 # fail later. If the system has such a broken version
2665 # do not use it.
2666 if capstone.found() and not cc.compiles('#include <capstone.h>',
2667 dependencies: [capstone])
2668 capstone = not_found
Thomas Huth83602082022-05-16 16:58:23 +02002669 if get_option('capstone').enabled()
2670 error('capstone requested, but it does not appear to work')
Daniel P. Berrangé8f4aea72021-07-09 15:29:31 +01002671 endif
2672 endif
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002673endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002674
Jagannathan Raman55116962022-06-13 16:26:24 -04002675libvfio_user_dep = not_found
2676if have_system and vfio_user_server_allowed
2677 have_internal = fs.exists(meson.current_source_dir() / 'subprojects/libvfio-user/meson.build')
2678
2679 if not have_internal
2680 error('libvfio-user source not found - please pull git submodule')
2681 endif
2682
2683 libvfio_user_proj = subproject('libvfio-user')
2684
2685 libvfio_user_lib = libvfio_user_proj.get_variable('libvfio_user_dep')
2686
2687 libvfio_user_dep = declare_dependency(dependencies: [libvfio_user_lib])
2688endif
2689
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002690fdt = not_found
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002691if have_system
Philippe Mathieu-Daudéc593d842022-02-08 11:19:46 +01002692 fdt_opt = get_option('fdt')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002693 if fdt_opt in ['enabled', 'auto', 'system']
2694 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01002695 fdt = cc.find_library('fdt', kwargs: static_kwargs,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002696 required: fdt_opt == 'system' or
2697 fdt_opt == 'enabled' and not have_internal)
2698 if fdt.found() and cc.links('''
2699 #include <libfdt.h>
2700 #include <libfdt_env.h>
Thomas Huthde47b0f2022-01-18 18:05:48 +01002701 int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002702 dependencies: fdt)
2703 fdt_opt = 'system'
Thomas Huth6c228532021-08-27 14:09:00 +02002704 elif fdt_opt == 'system'
2705 error('system libfdt requested, but it is too old (1.5.1 or newer required)')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002706 elif have_internal
2707 fdt_opt = 'internal'
2708 else
2709 fdt_opt = 'disabled'
Thomas Huth87daf892021-08-27 14:08:59 +02002710 fdt = not_found
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002711 endif
2712 endif
2713 if fdt_opt == 'internal'
2714 fdt_files = files(
2715 'dtc/libfdt/fdt.c',
2716 'dtc/libfdt/fdt_ro.c',
2717 'dtc/libfdt/fdt_wip.c',
2718 'dtc/libfdt/fdt_sw.c',
2719 'dtc/libfdt/fdt_rw.c',
2720 'dtc/libfdt/fdt_strerror.c',
2721 'dtc/libfdt/fdt_empty_tree.c',
2722 'dtc/libfdt/fdt_addresses.c',
2723 'dtc/libfdt/fdt_overlay.c',
2724 'dtc/libfdt/fdt_check.c',
2725 )
2726
2727 fdt_inc = include_directories('dtc/libfdt')
2728 libfdt = static_library('fdt',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01002729 build_by_default: false,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002730 sources: fdt_files,
2731 include_directories: fdt_inc)
2732 fdt = declare_dependency(link_with: libfdt,
2733 include_directories: fdt_inc)
2734 endif
Philippe Mathieu-Daudéc593d842022-02-08 11:19:46 +01002735else
2736 fdt_opt = 'disabled'
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002737endif
2738if not fdt.found() and fdt_required.length() > 0
2739 error('fdt not available but required by targets ' + ', '.join(fdt_required))
2740endif
2741
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002742config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002743config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002744config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002745
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002746#####################
2747# Generated sources #
2748#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002749
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002750genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002751
Marc-André Lureau3f885652019-07-15 18:06:04 +04002752hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04002753shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002754qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002755qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
2756 meson.current_source_dir() / 'scripts/qapi/commands.py',
2757 meson.current_source_dir() / 'scripts/qapi/common.py',
2758 meson.current_source_dir() / 'scripts/qapi/error.py',
2759 meson.current_source_dir() / 'scripts/qapi/events.py',
2760 meson.current_source_dir() / 'scripts/qapi/expr.py',
2761 meson.current_source_dir() / 'scripts/qapi/gen.py',
2762 meson.current_source_dir() / 'scripts/qapi/introspect.py',
2763 meson.current_source_dir() / 'scripts/qapi/parser.py',
2764 meson.current_source_dir() / 'scripts/qapi/schema.py',
2765 meson.current_source_dir() / 'scripts/qapi/source.py',
2766 meson.current_source_dir() / 'scripts/qapi/types.py',
2767 meson.current_source_dir() / 'scripts/qapi/visit.py',
2768 meson.current_source_dir() / 'scripts/qapi/common.py',
2769 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002770]
2771
2772tracetool = [
2773 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002774 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002775]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002776tracetool_depends = files(
2777 'scripts/tracetool/backend/log.py',
2778 'scripts/tracetool/backend/__init__.py',
2779 'scripts/tracetool/backend/dtrace.py',
2780 'scripts/tracetool/backend/ftrace.py',
2781 'scripts/tracetool/backend/simple.py',
2782 'scripts/tracetool/backend/syslog.py',
2783 'scripts/tracetool/backend/ust.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002784 'scripts/tracetool/format/ust_events_c.py',
2785 'scripts/tracetool/format/ust_events_h.py',
2786 'scripts/tracetool/format/__init__.py',
2787 'scripts/tracetool/format/d.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002788 'scripts/tracetool/format/simpletrace_stap.py',
2789 'scripts/tracetool/format/c.py',
2790 'scripts/tracetool/format/h.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002791 'scripts/tracetool/format/log_stap.py',
2792 'scripts/tracetool/format/stap.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002793 'scripts/tracetool/__init__.py',
2794 'scripts/tracetool/transform.py',
2795 'scripts/tracetool/vcpu.py'
2796)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002797
Marc-André Lureau2c273f32019-07-15 17:10:19 +04002798qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
2799 meson.current_source_dir(),
Paolo Bonzinib0b43232022-04-20 17:33:54 +02002800 get_option('pkgversion'), meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04002801qemu_version = custom_target('qemu-version.h',
2802 output: 'qemu-version.h',
2803 command: qemu_version_cmd,
2804 capture: true,
2805 build_by_default: true,
2806 build_always_stale: true)
2807genh += qemu_version
2808
Marc-André Lureau3f885652019-07-15 18:06:04 +04002809hxdep = []
2810hx_headers = [
2811 ['qemu-options.hx', 'qemu-options.def'],
2812 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
2813]
2814if have_system
2815 hx_headers += [
2816 ['hmp-commands.hx', 'hmp-commands.h'],
2817 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
2818 ]
2819endif
2820foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002821 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04002822 input: files(d[0]),
2823 output: d[1],
2824 capture: true,
2825 build_by_default: true, # to be removed when added to a target
2826 command: [hxtool, '-h', '@INPUT0@'])
2827endforeach
2828genh += hxdep
2829
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002830###################
2831# Collect sources #
2832###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002833
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02002834authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002835blockdev_ss = ss.source_set()
2836block_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002837chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002838common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002839crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02002840hwcore_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002841io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002842qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02002843qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002844softmmu_ss = ss.source_set()
2845specific_fuzz_ss = ss.source_set()
2846specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002847stub_ss = ss.source_set()
2848trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002849user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002850util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002851
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002852# accel modules
2853qtest_module_ss = ss.source_set()
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002854tcg_module_ss = ss.source_set()
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002855
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002856modules = {}
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002857target_modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002858hw_arch = {}
2859target_arch = {}
2860target_softmmu_arch = {}
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02002861target_user_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002862
2863###############
2864# Trace files #
2865###############
2866
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002867# TODO: add each directory to the subdirs from its own meson.build, once
2868# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002869trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002870 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01002871 'qapi',
2872 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002873 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01002874 'util',
Alex Bennée842b42d2022-09-29 12:42:22 +01002875 'gdbstub',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002876]
Warner Losh6ddc1ab2022-01-08 17:37:23 -07002877if have_linux_user
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002878 trace_events_subdirs += [ 'linux-user' ]
2879endif
Warner Losh6ddc1ab2022-01-08 17:37:23 -07002880if have_bsd_user
2881 trace_events_subdirs += [ 'bsd-user' ]
2882endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002883if have_block
2884 trace_events_subdirs += [
2885 'authz',
2886 'block',
2887 'io',
2888 'nbd',
2889 'scsi',
2890 ]
2891endif
2892if have_system
2893 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002894 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002895 'audio',
2896 'backends',
2897 'backends/tpm',
2898 'chardev',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002899 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002900 'hw/9pfs',
2901 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08002902 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002903 'hw/alpha',
2904 'hw/arm',
2905 'hw/audio',
2906 'hw/block',
2907 'hw/block/dataplane',
2908 'hw/char',
2909 'hw/display',
2910 'hw/dma',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002911 'hw/hyperv',
2912 'hw/i2c',
2913 'hw/i386',
2914 'hw/i386/xen',
2915 'hw/ide',
2916 'hw/input',
2917 'hw/intc',
2918 'hw/isa',
2919 'hw/mem',
2920 'hw/mips',
2921 'hw/misc',
2922 'hw/misc/macio',
2923 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08002924 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01002925 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02002926 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002927 'hw/nvram',
2928 'hw/pci',
2929 'hw/pci-host',
2930 'hw/ppc',
2931 'hw/rdma',
2932 'hw/rdma/vmw',
2933 'hw/rtc',
2934 'hw/s390x',
2935 'hw/scsi',
2936 'hw/sd',
BALATON Zoltanad52cfc2021-10-29 23:02:09 +02002937 'hw/sh4',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002938 'hw/sparc',
2939 'hw/sparc64',
2940 'hw/ssi',
2941 'hw/timer',
2942 'hw/tpm',
2943 'hw/usb',
2944 'hw/vfio',
2945 'hw/virtio',
2946 'hw/watchdog',
2947 'hw/xen',
2948 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002949 'migration',
2950 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02002951 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002952 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05002953 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002954 ]
2955endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002956if have_system or have_user
2957 trace_events_subdirs += [
2958 'accel/tcg',
2959 'hw/core',
2960 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02002961 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002962 'target/hppa',
2963 'target/i386',
2964 'target/i386/kvm',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02002965 'target/mips/tcg',
Richard Henderson6f83e272022-02-25 21:06:20 -10002966 'target/nios2',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002967 'target/ppc',
2968 'target/riscv',
2969 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08002970 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002971 'target/sparc',
2972 ]
2973endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002974
Marc-André Lureau0df750e2020-11-25 14:06:37 +04002975vhost_user = not_found
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02002976if targetos == 'linux' and have_vhost_user
Marc-André Lureau0df750e2020-11-25 14:06:37 +04002977 libvhost_user = subproject('libvhost-user')
2978 vhost_user = libvhost_user.get_variable('vhost_user_dep')
2979endif
2980
Xie Yongjia6caeee2022-05-23 16:46:08 +08002981libvduse = not_found
2982if have_libvduse
2983 libvduse_proj = subproject('libvduse')
2984 libvduse = libvduse_proj.get_variable('libvduse_dep')
2985endif
2986
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +01002987# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
2988# that is filled in by qapi/.
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002989subdir('qapi')
2990subdir('qobject')
2991subdir('stubs')
2992subdir('trace')
2993subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04002994subdir('qom')
2995subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002996subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04002997subdir('ui')
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02002998subdir('hw')
Alex Bennée842b42d2022-09-29 12:42:22 +01002999subdir('gdbstub')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003000
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003001
3002if enable_modules
3003 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
3004 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
3005endif
3006
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003007qom_ss = qom_ss.apply(config_host, strict: false)
3008libqom = static_library('qom', qom_ss.sources() + genh,
3009 dependencies: [qom_ss.dependencies()],
3010 name_suffix: 'fa')
3011qom = declare_dependency(link_whole: libqom)
3012
3013event_loop_base = files('event-loop-base.c')
3014event_loop_base = static_library('event-loop-base', sources: event_loop_base + genh,
3015 build_by_default: true)
3016event_loop_base = declare_dependency(link_whole: event_loop_base,
3017 dependencies: [qom])
3018
Paolo Bonzini2becc362020-02-03 11:42:03 +01003019stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003020
3021util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01003022util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003023libqemuutil = static_library('qemuutil',
3024 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +02003025 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003026qemuutil = declare_dependency(link_with: libqemuutil,
Nicolas Saenz Julienne70ac26b2022-04-25 09:57:22 +02003027 sources: genh + version_res,
3028 dependencies: [event_loop_base])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04003029
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01003030if have_system or have_user
3031 decodetree = generator(find_program('scripts/decodetree.py'),
3032 output: 'decode-@BASENAME@.c.inc',
3033 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
3034 subdir('libdecnumber')
3035 subdir('target')
3036endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003037
Paolo Bonzini478e9432020-08-17 12:47:55 +02003038subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04003039subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04003040subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003041subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04003042subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003043
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003044if have_block
3045 block_ss.add(files(
3046 'block.c',
3047 'blockjob.c',
3048 'job.c',
3049 'qemu-io-cmds.c',
3050 ))
Paolo Bonzini406523f2021-10-13 11:43:54 +02003051 if config_host_data.get('CONFIG_REPLICATION')
3052 block_ss.add(files('replication.c'))
3053 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003054
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003055 subdir('nbd')
3056 subdir('scsi')
3057 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003058
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003059 blockdev_ss.add(files(
3060 'blockdev.c',
3061 'blockdev-nbd.c',
3062 'iothread.c',
3063 'job-qmp.c',
3064 ), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02003065
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003066 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
3067 # os-win32.c does not
3068 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
3069 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
3070endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02003071
3072common_ss.add(files('cpus-common.c'))
3073
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02003074subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003075
Richard Hendersonf3433462020-09-12 10:47:33 -07003076common_ss.add(capstone)
Alex Bennée842b42d2022-09-29 12:42:22 +01003077specific_ss.add(files('cpu.c', 'disas.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003078
Richard Henderson44b99a62021-03-22 12:24:26 +01003079# Work around a gcc bug/misfeature wherein constant propagation looks
3080# through an alias:
3081# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
3082# to guess that a const variable is always zero. Without lto, this is
3083# impossible, as the alias is restricted to page-vary-common.c. Indeed,
3084# without lto, not even the alias is required -- we simply use different
3085# declarations in different compilation units.
3086pagevary = files('page-vary-common.c')
3087if get_option('b_lto')
3088 pagevary_flags = ['-fno-lto']
3089 if get_option('cfi')
3090 pagevary_flags += '-fno-sanitize=cfi-icall'
3091 endif
Thomas Huth54c9b192022-03-30 13:48:08 +02003092 pagevary = static_library('page-vary-common', sources: pagevary + genh,
Richard Henderson44b99a62021-03-22 12:24:26 +01003093 c_args: pagevary_flags)
3094 pagevary = declare_dependency(link_with: pagevary)
3095endif
3096common_ss.add(pagevary)
Richard Henderson6670d4d2021-03-22 12:24:24 +01003097specific_ss.add(files('page-vary.c'))
3098
Marc-André Lureauab318052019-07-24 19:23:16 +04003099subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04003100subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04003101subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003102subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04003103subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04003104subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00003105subdir('semihosting')
Richard Henderson104cc2c2021-03-08 12:04:33 -08003106subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08003107subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04003108subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003109subdir('plugins')
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003110subdir('ebpf')
3111
3112common_user_inc = []
3113
3114subdir('common-user')
Marc-André Lureaub309c322019-08-18 19:20:37 +04003115subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04003116subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003117
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003118# needed for fuzzing binaries
3119subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003120subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003121
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003122# accel modules
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02003123tcg_real_module_ss = ss.source_set()
3124tcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
3125specific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
3126target_modules += { 'accel' : { 'qtest': qtest_module_ss,
3127 'tcg': tcg_real_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003128
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003129########################
3130# Library dependencies #
3131########################
3132
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003133modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003134modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003135modinfo_files = []
3136
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003137block_mods = []
3138softmmu_mods = []
3139foreach d, list : modules
3140 foreach m, module_ss : list
3141 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02003142 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003143 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
3144 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
3145 if d == 'block'
3146 block_mods += sl
3147 else
3148 softmmu_mods += sl
3149 endif
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003150 if module_ss.sources() != []
3151 # FIXME: Should use sl.extract_all_objects(recursive: true) as
3152 # input. Sources can be used multiple times but objects are
3153 # unique when it comes to lookup in compile_commands.json.
3154 # Depnds on a mesion version with
3155 # https://github.com/mesonbuild/meson/pull/8900
3156 modinfo_files += custom_target(d + '-' + m + '.modinfo',
3157 output: d + '-' + m + '.modinfo',
Paolo Bonziniac347112021-07-21 18:51:57 +02003158 input: module_ss.sources() + genh,
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003159 capture: true,
Paolo Bonziniac347112021-07-21 18:51:57 +02003160 command: [modinfo_collect, module_ss.sources()])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003161 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003162 else
3163 if d == 'block'
3164 block_ss.add_all(module_ss)
3165 else
3166 softmmu_ss.add_all(module_ss)
3167 endif
3168 endif
3169 endforeach
3170endforeach
3171
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003172foreach d, list : target_modules
3173 foreach m, module_ss : list
3174 if enable_modules and targetos != 'windows'
3175 foreach target : target_dirs
3176 if target.endswith('-softmmu')
3177 config_target = config_target_mak[target]
3178 config_target += config_host
3179 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3180 c_args = ['-DNEED_CPU_H',
3181 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3182 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3183 target_module_ss = module_ss.apply(config_target, strict: false)
3184 if target_module_ss.sources() != []
3185 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3186 sl = static_library(module_name,
3187 [genh, target_module_ss.sources()],
3188 dependencies: [modulecommon, target_module_ss.dependencies()],
3189 include_directories: target_inc,
3190 c_args: c_args,
3191 pic: true)
3192 softmmu_mods += sl
3193 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
3194 modinfo_files += custom_target(module_name + '.modinfo',
3195 output: module_name + '.modinfo',
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003196 input: target_module_ss.sources() + genh,
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003197 capture: true,
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003198 command: [modinfo_collect, '--target', target, target_module_ss.sources()])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003199 endif
3200 endif
3201 endforeach
3202 else
3203 specific_ss.add_all(module_ss)
3204 endif
3205 endforeach
3206endforeach
3207
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003208if enable_modules
Jose R. Ziviani05d68142022-05-28 00:20:35 +02003209 foreach target : target_dirs
3210 if target.endswith('-softmmu')
3211 config_target = config_target_mak[target]
3212 config_devices_mak = target + '-config-devices.mak'
3213 modinfo_src = custom_target('modinfo-' + target + '.c',
3214 output: 'modinfo-' + target + '.c',
3215 input: modinfo_files,
3216 command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
3217 capture: true)
3218
3219 modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
3220 modinfo_dep = declare_dependency(link_with: modinfo_lib)
3221
3222 arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
3223 hw_arch[arch].add(modinfo_dep)
3224 endif
3225 endforeach
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003226endif
3227
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003228nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08003229undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003230block_syms = custom_target('block.syms', output: 'block.syms',
3231 input: [libqemuutil, block_mods],
3232 capture: true,
3233 command: [undefsym, nm, '@INPUT@'])
3234qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
3235 input: [libqemuutil, softmmu_mods],
3236 capture: true,
3237 command: [undefsym, nm, '@INPUT@'])
3238
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003239authz_ss = authz_ss.apply(config_host, strict: false)
3240libauthz = static_library('authz', authz_ss.sources() + genh,
3241 dependencies: [authz_ss.dependencies()],
3242 name_suffix: 'fa',
3243 build_by_default: false)
3244
3245authz = declare_dependency(link_whole: libauthz,
3246 dependencies: qom)
3247
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003248crypto_ss = crypto_ss.apply(config_host, strict: false)
3249libcrypto = static_library('crypto', crypto_ss.sources() + genh,
3250 dependencies: [crypto_ss.dependencies()],
3251 name_suffix: 'fa',
3252 build_by_default: false)
3253
3254crypto = declare_dependency(link_whole: libcrypto,
3255 dependencies: [authz, qom])
3256
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003257io_ss = io_ss.apply(config_host, strict: false)
3258libio = static_library('io', io_ss.sources() + genh,
3259 dependencies: [io_ss.dependencies()],
3260 link_with: libqemuutil,
3261 name_suffix: 'fa',
3262 build_by_default: false)
3263
3264io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
3265
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003266libmigration = static_library('migration', sources: migration_files + genh,
3267 name_suffix: 'fa',
3268 build_by_default: false)
3269migration = declare_dependency(link_with: libmigration,
3270 dependencies: [zlib, qom, io])
3271softmmu_ss.add(migration)
3272
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003273block_ss = block_ss.apply(config_host, strict: false)
3274libblock = static_library('block', block_ss.sources() + genh,
3275 dependencies: block_ss.dependencies(),
3276 link_depends: block_syms,
3277 name_suffix: 'fa',
3278 build_by_default: false)
3279
3280block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003281 link_args: '@block.syms',
3282 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003283
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003284blockdev_ss = blockdev_ss.apply(config_host, strict: false)
3285libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
3286 dependencies: blockdev_ss.dependencies(),
3287 name_suffix: 'fa',
3288 build_by_default: false)
3289
3290blockdev = declare_dependency(link_whole: [libblockdev],
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003291 dependencies: [block, event_loop_base])
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003292
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003293qmp_ss = qmp_ss.apply(config_host, strict: false)
3294libqmp = static_library('qmp', qmp_ss.sources() + genh,
3295 dependencies: qmp_ss.dependencies(),
3296 name_suffix: 'fa',
3297 build_by_default: false)
3298
3299qmp = declare_dependency(link_whole: [libqmp])
3300
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003301libchardev = static_library('chardev', chardev_ss.sources() + genh,
3302 name_suffix: 'fa',
Marc-André Lureau22d1f7a2022-03-23 19:57:12 +04003303 dependencies: chardev_ss.dependencies(),
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003304 build_by_default: false)
3305
3306chardev = declare_dependency(link_whole: libchardev)
3307
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02003308hwcore_ss = hwcore_ss.apply(config_host, strict: false)
3309libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02003310 name_suffix: 'fa',
3311 build_by_default: false)
3312hwcore = declare_dependency(link_whole: libhwcore)
3313common_ss.add(hwcore)
3314
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02003315###########
3316# Targets #
3317###########
3318
Paolo Bonzinifb721762022-01-07 13:00:44 +01003319emulator_modules = []
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003320foreach m : block_mods + softmmu_mods
Paolo Bonzinifb721762022-01-07 13:00:44 +01003321 emulator_modules += shared_module(m.name(),
3322 build_by_default: true,
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003323 name_prefix: '',
3324 link_whole: m,
3325 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003326 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003327endforeach
Paolo Bonzinid8f3a602022-05-30 14:24:34 +02003328if emulator_modules.length() > 0
3329 alias_target('modules', emulator_modules)
3330endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003331
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003332softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003333common_ss.add(qom, qemuutil)
3334
3335common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01003336common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
3337
3338common_all = common_ss.apply(config_all, strict: false)
3339common_all = static_library('common',
3340 build_by_default: false,
3341 sources: common_all.sources() + genh,
Paolo Bonzini9d24fb72021-12-21 16:09:54 +01003342 include_directories: common_user_inc,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09003343 implicit_include_directories: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003344 dependencies: common_all.dependencies(),
3345 name_suffix: 'fa')
3346
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003347feature_to_c = find_program('scripts/feature_to_c.sh')
3348
Philippe Mathieu-Daudé30cfa502022-02-15 17:25:03 +01003349if targetos == 'darwin'
3350 entitlement = find_program('scripts/entitlement.sh')
3351endif
3352
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04003353emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003354foreach target : target_dirs
3355 config_target = config_target_mak[target]
3356 target_name = config_target['TARGET_NAME']
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003357 target_base_arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02003358 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003359 arch_deps = []
3360 c_args = ['-DNEED_CPU_H',
3361 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3362 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04003363 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01003364
Paolo Bonzini859aef02020-08-04 18:14:26 +02003365 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01003366 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3367 if targetos == 'linux'
3368 target_inc += include_directories('linux-headers', is_system: true)
3369 endif
3370 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003371 target_type='system'
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003372 t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003373 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003374 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003375
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003376 hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
Marc-André Lureau2c442202019-08-17 13:55:58 +04003377 hw = hw_arch[hw_dir].apply(config_target, strict: false)
3378 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003379 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04003380
Paolo Bonzini2becc362020-02-03 11:42:03 +01003381 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003382 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01003383 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04003384 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01003385 target_type='user'
Paolo Bonzinia3a576b2021-12-21 16:23:55 +01003386 target_inc += common_user_inc
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003387 if target_base_arch in target_user_arch
3388 t = target_user_arch[target_base_arch].apply(config_target, strict: false)
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02003389 arch_srcs += t.sources()
3390 arch_deps += t.dependencies()
3391 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01003392 if 'CONFIG_LINUX_USER' in config_target
3393 base_dir = 'linux-user'
Warner Loshe2a74722021-08-03 17:17:17 -06003394 endif
3395 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01003396 base_dir = 'bsd-user'
Warner Loshe2a74722021-08-03 17:17:17 -06003397 target_inc += include_directories('bsd-user/' / targetos)
Warner Losh85fc1b52022-01-08 17:27:34 -07003398 target_inc += include_directories('bsd-user/host/' / host_arch)
Warner Loshe2a74722021-08-03 17:17:17 -06003399 dir = base_dir / abi
Warner Losh19bf1292021-11-04 16:34:48 -06003400 arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003401 endif
3402 target_inc += include_directories(
3403 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04003404 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003405 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04003406 if 'CONFIG_LINUX_USER' in config_target
3407 dir = base_dir / abi
3408 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
3409 if config_target.has_key('TARGET_SYSTBL_ABI')
3410 arch_srcs += \
3411 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
3412 extra_args : config_target['TARGET_SYSTBL_ABI'])
3413 endif
3414 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01003415 endif
3416
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003417 if 'TARGET_XML_FILES' in config_target
3418 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
3419 output: target + '-gdbstub-xml.c',
3420 input: files(config_target['TARGET_XML_FILES'].split()),
3421 command: [feature_to_c, '@INPUT@'],
3422 capture: true)
3423 arch_srcs += gdbstub_xml
3424 endif
3425
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003426 t = target_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003427 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003428 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003429
Paolo Bonzini2becc362020-02-03 11:42:03 +01003430 target_common = common_ss.apply(config_target, strict: false)
3431 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003432 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003433
Paolo Bonzini2becc362020-02-03 11:42:03 +01003434 target_specific = specific_ss.apply(config_target, strict: false)
3435 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003436 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003437
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003438 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02003439 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02003440 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003441 objects: objects,
3442 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003443 c_args: c_args,
3444 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003445 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003446
3447 if target.endswith('-softmmu')
3448 execs = [{
3449 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003450 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003451 'sources': files('softmmu/main.c'),
3452 'dependencies': []
3453 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01003454 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003455 execs += [{
3456 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003457 'win_subsystem': 'windows',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003458 'sources': files('softmmu/main.c'),
3459 'dependencies': []
3460 }]
3461 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02003462 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003463 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
3464 execs += [{
3465 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003466 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003467 'sources': specific_fuzz.sources(),
3468 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003469 }]
3470 endif
3471 else
3472 execs = [{
3473 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003474 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003475 'sources': [],
3476 'dependencies': []
3477 }]
3478 endif
3479 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01003480 exe_name = exe['name']
John Arbuckle3983a762021-07-05 15:53:28 -04003481 if targetos == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01003482 exe_name += '-unsigned'
3483 endif
3484
3485 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09003486 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003487 c_args: c_args,
3488 dependencies: arch_deps + deps + exe['dependencies'],
3489 objects: lib.extract_all_objects(recursive: true),
3490 link_language: link_language,
3491 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
3492 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003493 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003494
John Arbuckle3983a762021-07-05 15:53:28 -04003495 if targetos == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003496 icon = 'pc-bios/qemu.rsrc'
3497 build_input = [emulator, files(icon)]
3498 install_input = [
3499 get_option('bindir') / exe_name,
3500 meson.current_source_dir() / icon
3501 ]
3502 if 'CONFIG_HVF' in config_target
3503 entitlements = 'accel/hvf/entitlements.plist'
3504 build_input += files(entitlements)
3505 install_input += meson.current_source_dir() / entitlements
3506 endif
3507
Alexander Graf8a74ce62021-01-20 23:44:34 +01003508 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003509 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01003510 output: exe['name'],
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003511 command: [entitlement, '@OUTPUT@', '@INPUT@'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003512 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09003513
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003514 meson.add_install_script(entitlement, '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09003515 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003516 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01003517 else
3518 emulators += {exe['name']: emulator}
3519 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003520
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003521 if stap.found()
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003522 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003523 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
3524 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003525 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
3526 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
3527 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003528 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003529 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003530 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003531 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003532 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003533 command: [
3534 tracetool, '--group=all', '--format=' + stp['fmt'],
3535 '--binary=' + stp['bin'],
3536 '--target-name=' + target_name,
3537 '--target-type=' + target_type,
3538 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01003539 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003540 ],
3541 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003542 endforeach
3543 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003544 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003545endforeach
3546
Paolo Bonzini931049b2020-02-05 09:44:24 +01003547# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003548
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003549if 'CONFIG_PLUGIN' in config_host
3550 install_headers('include/qemu/qemu-plugin.h')
3551endif
3552
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003553subdir('qga')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02003554
Laurent Vivier9755c942020-08-24 17:24:30 +02003555# Don't build qemu-keymap if xkbcommon is not explicitly enabled
3556# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02003557if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04003558 # used for the update-keymaps target, so include rules even if !have_tools
3559 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
3560 dependencies: [qemuutil, xkbcommon], install: have_tools)
3561endif
3562
Paolo Bonzini931049b2020-02-05 09:44:24 +01003563if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003564 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
3565 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
3566 qemu_io = executable('qemu-io', files('qemu-io.c'),
3567 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01003568 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06003569 dependencies: [blockdev, qemuutil, gnutls, selinux],
3570 install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003571
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02003572 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003573 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04003574 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003575
Marc-André Lureau157e7b12019-07-15 14:50:58 +04003576 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
3577 dependencies: qemuutil,
3578 install: true)
3579
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003580 if have_vhost_user
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02003581 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02003582 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04003583 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02003584 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01003585 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003586
3587 if targetos == 'linux'
3588 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
3589 dependencies: [qemuutil, libcap_ng],
3590 install: true,
3591 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003592
3593 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
3594 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02003595 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003596 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003597 endif
3598
Paolo Bonziniccd250a2021-06-03 12:50:17 +02003599 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04003600 subdir('contrib/ivshmem-client')
3601 subdir('contrib/ivshmem-server')
3602 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01003603endif
3604
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04003605subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01003606subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04003607subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02003608subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08003609subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01003610if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04003611 subdir('po')
3612endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01003613
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003614if host_machine.system() == 'windows'
3615 nsis_cmd = [
3616 find_program('scripts/nsis.py'),
3617 '@OUTPUT@',
3618 get_option('prefix'),
3619 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01003620 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003621 '--',
3622 '-DDISPLAYVERSION=' + meson.project_version(),
3623 ]
3624 if build_docs
3625 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
3626 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01003627 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003628 nsis_cmd += '-DCONFIG_GTK=y'
3629 endif
3630
3631 nsis = custom_target('nsis',
3632 output: 'qemu-setup-' + meson.project_version() + '.exe',
3633 input: files('qemu.nsi'),
3634 build_always_stale: true,
3635 command: nsis_cmd + ['@INPUT@'])
3636 alias_target('installer', nsis)
3637endif
3638
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003639#########################
3640# Configuration summary #
3641#########################
3642
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003643# Directories
Paolo Bonzinif9332752020-02-03 13:28:38 +01003644summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003645summary_info += {'Install prefix': get_option('prefix')}
3646summary_info += {'BIOS directory': qemu_datadir}
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09003647pathsep = targetos == 'windows' ? ';' : ':'
3648summary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02003649summary_info += {'binary directory': get_option('prefix') / get_option('bindir')}
3650summary_info += {'library directory': get_option('prefix') / get_option('libdir')}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003651summary_info += {'module directory': qemu_moddir}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02003652summary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
3653summary_info += {'include directory': get_option('prefix') / get_option('includedir')}
3654summary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003655if targetos != 'windows'
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02003656 summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
3657 summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003658else
3659 summary_info += {'local state directory': 'queried at runtime'}
3660endif
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02003661summary_info += {'Doc directory': get_option('prefix') / get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003662summary_info += {'Build directory': meson.current_build_dir()}
3663summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003664summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003665summary(summary_info, bool_yn: true, section: 'Directories')
3666
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003667# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003668summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003669summary_info += {'git': config_host['GIT']}
3670summary_info += {'make': config_host['MAKE']}
3671summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003672summary_info += {'sphinx-build': sphinx_build}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003673if config_host.has_key('HAVE_GDB_BIN')
3674 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
3675endif
Paolo Bonzini40c909f2022-04-20 17:33:49 +02003676summary_info += {'iasl': iasl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003677summary_info += {'genisoimage': config_host['GENISOIMAGE']}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003678if targetos == 'windows' and have_ga
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003679 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003680endif
Thomas Huth58902582022-04-08 18:20:47 +02003681if slirp.found() and have_system
Paolo Bonzini35acbb32021-10-13 13:43:36 +02003682 summary_info += {'smbd': have_slirp_smbd ? smbd_path : false}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003683endif
3684summary(summary_info, bool_yn: true, section: 'Host binaries')
3685
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003686# Configurable features
3687summary_info = {}
3688summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003689summary_info += {'system-mode emulation': have_system}
3690summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003691summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003692summary_info += {'Install blobs': get_option('install_blobs')}
3693summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
3694if config_host.has_key('CONFIG_MODULES')
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02003695 summary_info += {'alternative module path': get_option('module_upgrades')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003696endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02003697summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003698if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02003699 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003700endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003701summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
3702if 'simple' in get_option('trace_backends')
3703 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003704endif
Marc-André Lureau142ca622021-07-15 11:53:53 +04003705summary_info += {'D-Bus display': dbus_display}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003706summary_info += {'QOM debugging': get_option('qom_cast_debug')}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003707summary_info += {'vhost-kernel support': have_vhost_kernel}
3708summary_info += {'vhost-net support': have_vhost_net}
3709summary_info += {'vhost-user support': have_vhost_user}
3710summary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003711summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003712summary_info += {'vhost-vdpa support': have_vhost_vdpa}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003713summary_info += {'build guest agent': have_ga}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003714summary(summary_info, bool_yn: true, section: 'Configurable features')
3715
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003716# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003717summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003718summary_info += {'host CPU': cpu}
3719summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01003720summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
3721summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003722if link_language == 'cpp'
Alex Bennée63de9352021-05-27 17:03:15 +01003723 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003724else
3725 summary_info += {'C++ compiler': false}
3726endif
3727if targetos == 'darwin'
Alex Bennée63de9352021-05-27 17:03:15 +01003728 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003729endif
Paolo Bonzini47b30832020-09-23 05:26:17 -04003730summary_info += {'CFLAGS': ' '.join(get_option('c_args')
3731 + ['-O' + get_option('optimization')]
3732 + (get_option('debug') ? ['-g'] : []))}
3733if link_language == 'cpp'
3734 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
3735 + ['-O' + get_option('optimization')]
3736 + (get_option('debug') ? ['-g'] : []))}
3737endif
Philippe Mathieu-Daudée910c7d2022-01-08 22:38:55 +01003738if targetos == 'darwin'
3739 summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args')
3740 + ['-O' + get_option('optimization')]
3741 + (get_option('debug') ? ['-g'] : []))}
3742endif
Paolo Bonzini47b30832020-09-23 05:26:17 -04003743link_args = get_option(link_language + '_link_args')
3744if link_args.length() > 0
3745 summary_info += {'LDFLAGS': ' '.join(link_args)}
3746endif
Paolo Bonzinid0651772022-04-20 17:33:34 +02003747summary_info += {'QEMU_CFLAGS': ' '.join(qemu_cflags)}
3748summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_cxxflags)}
3749summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_objcflags)}
3750summary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003751summary_info += {'profiler': get_option('profiler')}
Daniele Buonocdad7812020-12-04 18:06:11 -05003752summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003753summary_info += {'PIE': get_option('b_pie')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02003754summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003755summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinib87df902021-11-08 13:52:11 +01003756summary_info += {'membarrier': have_membarrier}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02003757summary_info += {'debug stack usage': get_option('debug_stack_usage')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003758summary_info += {'mutex debugging': get_option('debug_mutex')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003759summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01003760summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
3761summary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003762summary_info += {'gprof enabled': get_option('gprof')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003763summary_info += {'gcov': get_option('b_coverage')}
3764summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
3765summary_info += {'CFI support': get_option('cfi')}
3766if get_option('cfi')
3767 summary_info += {'CFI debug support': get_option('cfi_debug')}
3768endif
3769summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003770summary_info += {'sparse': sparse}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003771summary_info += {'mingw32 support': targetos == 'windows'}
Paolo Bonzini12640f02022-06-06 11:48:47 +02003772summary(summary_info, bool_yn: true, section: 'Compilation')
Alex Bennée49e85652021-02-22 10:14:50 +00003773
3774# snarf the cross-compilation information for tests
Paolo Bonzini12640f02022-06-06 11:48:47 +02003775summary_info = {}
3776have_cross = false
Alex Bennée49e85652021-02-22 10:14:50 +00003777foreach target: target_dirs
Paolo Bonzinic7022a72022-09-29 12:42:07 +01003778 tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak'
Alex Bennée49e85652021-02-22 10:14:50 +00003779 if fs.exists(tcg_mak)
3780 config_cross_tcg = keyval.load(tcg_mak)
Alex Bennée85b141e2022-05-27 16:35:34 +01003781 if 'CC' in config_cross_tcg
Paolo Bonzini12640f02022-06-06 11:48:47 +02003782 summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
3783 have_cross = true
Alex Bennée49e85652021-02-22 10:14:50 +00003784 endif
Paolo Bonzini12640f02022-06-06 11:48:47 +02003785 endif
Alex Bennée49e85652021-02-22 10:14:50 +00003786endforeach
Paolo Bonzini12640f02022-06-06 11:48:47 +02003787if have_cross
3788 summary(summary_info, bool_yn: true, section: 'Cross compilers')
3789endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003790
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003791# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003792summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003793if have_system
3794 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
3795 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
3796 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
3797 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
Reinoud Zandijk74a414a2021-04-02 22:25:32 +02003798 summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')}
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02003799 summary_info += {'Xen support': xen.found()}
3800 if xen.found()
3801 summary_info += {'xen ctrl version': xen.version()}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003802 endif
3803endif
3804summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
3805if config_all.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01003806 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +01003807 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01003808 else
3809 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
3810 endif
Alex Bennée029aa682021-07-09 15:29:53 +01003811 summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003812 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003813endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003814summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003815if have_system
3816 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01003817 summary_info += {'out of process emulation': multiprocess_allowed}
Jagannathan Raman55116962022-06-13 16:26:24 -04003818 summary_info += {'vfio-user server': vfio_user_server_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003819endif
3820summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
3821
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003822# Block layer
3823summary_info = {}
3824summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02003825summary_info += {'coroutine pool': have_coroutine_pool}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003826if have_block
Paolo Bonzini622d64f2022-04-20 17:33:53 +02003827 summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
3828 summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003829 summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003830 summary_info += {'VirtFS support': have_virtfs}
3831 summary_info += {'build virtiofs daemon': have_virtiofsd}
Paolo Bonzini406523f2021-10-13 11:43:54 +02003832 summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')}
3833 summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
Paolo Bonzinied793c22021-10-13 11:42:25 +02003834 summary_info += {'bochs support': get_option('bochs').allowed()}
3835 summary_info += {'cloop support': get_option('cloop').allowed()}
3836 summary_info += {'dmg support': get_option('dmg').allowed()}
3837 summary_info += {'qcow v1 support': get_option('qcow1').allowed()}
3838 summary_info += {'vdi support': get_option('vdi').allowed()}
3839 summary_info += {'vvfat support': get_option('vvfat').allowed()}
3840 summary_info += {'qed support': get_option('qed').allowed()}
3841 summary_info += {'parallels support': get_option('parallels').allowed()}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003842 summary_info += {'FUSE exports': fuse}
Xie Yongji2a2359b2022-05-23 16:46:09 +08003843 summary_info += {'VDUSE block exports': have_vduse_blk_export}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003844endif
3845summary(summary_info, bool_yn: true, section: 'Block layer support')
3846
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003847# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003848summary_info = {}
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02003849summary_info += {'TLS priority': get_option('tls_priority')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003850summary_info += {'GNUTLS support': gnutls}
3851if gnutls.found()
3852 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
3853endif
3854summary_info += {'libgcrypt': gcrypt}
3855summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02003856if nettle.found()
3857 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003858endif
Paolo Bonzini34b52612021-11-08 14:02:42 +01003859summary_info += {'AF_ALG support': have_afalg}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003860summary_info += {'rng-none': get_option('rng_none')}
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02003861summary_info += {'Linux keyring': have_keyring}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003862summary(summary_info, bool_yn: true, section: 'Crypto')
3863
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01003864# Libraries
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003865summary_info = {}
3866if targetos == 'darwin'
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03003867 summary_info += {'Cocoa support': cocoa}
3868 summary_info += {'vmnet.framework support': vmnet}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003869endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003870summary_info += {'SDL support': sdl}
3871summary_info += {'SDL image support': sdl_image}
3872summary_info += {'GTK support': gtk}
3873summary_info += {'pixman': pixman}
3874summary_info += {'VTE support': vte}
Thomas Huth58902582022-04-08 18:20:47 +02003875summary_info += {'slirp support': slirp}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003876summary_info += {'libtasn1': tasn1}
3877summary_info += {'PAM': pam}
3878summary_info += {'iconv support': iconv}
3879summary_info += {'curses support': curses}
3880summary_info += {'virgl support': virgl}
3881summary_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