blob: 326996f5828f551dc5dcf87efbb9c44fdc183a97 [file] [log] [blame]
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001project('qemu', ['c'], meson_version: '>=0.59.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()
183qemu_cxxflags = config_host['QEMU_CXXFLAGS'].split()
Philippe Mathieu-Daudé4cb37d12022-02-15 16:15:13 +0100184qemu_objcflags = config_host['QEMU_OBJCFLAGS'].split()
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100185qemu_ldflags = config_host['QEMU_LDFLAGS'].split()
186
Paolo Bonzinid2147e02022-04-20 17:33:50 +0200187if targetos == 'windows'
188 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat')
189 # Disable ASLR for debug builds to allow debugging with gdb
190 if get_option('optimization') == '0'
191 qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase')
192 endif
193endif
194
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +0200195if get_option('gprof')
196 qemu_cflags += ['-p']
197 qemu_cxxflags += ['-p']
Philippe Mathieu-Daudé4cb37d12022-02-15 16:15:13 +0100198 qemu_objcflags += ['-p']
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +0200199 qemu_ldflags += ['-p']
200endif
201
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400202# Specify linker-script with add_project_link_arguments so that it is not placed
203# within a linker --start-group/--end-group pair
Paolo Bonzini537b7242021-10-07 15:08:12 +0200204if get_option('fuzzing')
205 add_project_link_arguments(['-Wl,-T,',
206 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
207 native: false, language: ['c', 'cpp', 'objc'])
208
209 # Specify a filter to only instrument code that is directly related to
210 # virtual-devices.
211 configure_file(output: 'instrumentation-filter',
212 input: 'scripts/oss-fuzz/instrumentation-filter-template',
213 copy: true)
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400214
215 if cc.compiles('int main () { return 0; }',
216 name: '-fsanitize-coverage-allowlist=/dev/null',
Alexander Bulekove56d0972022-06-21 16:45:07 -0400217 args: ['-fsanitize-coverage-allowlist=/dev/null',
218 '-fsanitize-coverage=trace-pc'] )
Alexander Bulekovaa4f3a32022-06-14 11:54:15 -0400219 add_global_arguments('-fsanitize-coverage-allowlist=instrumentation-filter',
220 native: false, language: ['c', 'cpp', 'objc'])
221 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +0200222
223 if get_option('fuzzing_engine') == ''
224 # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
225 # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link
226 # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
227 # unable to bind the fuzzer-related callbacks added by instrumentation.
228 add_global_arguments('-fsanitize=fuzzer-no-link',
229 native: false, language: ['c', 'cpp', 'objc'])
230 add_global_link_arguments('-fsanitize=fuzzer-no-link',
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400231 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzini537b7242021-10-07 15:08:12 +0200232 # For the actual fuzzer binaries, we need to link against the libfuzzer
233 # library. They need to be configurable, to support OSS-Fuzz
234 fuzz_exe_ldflags = ['-fsanitize=fuzzer']
235 else
236 # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
237 # the needed CFLAGS have already been provided
238 fuzz_exe_ldflags = get_option('fuzzing_engine').split()
239 endif
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400240endif
241
Philippe Mathieu-Daudé4cb37d12022-02-15 16:15:13 +0100242add_global_arguments(qemu_cflags, native: false, language: ['c'])
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100243add_global_arguments(qemu_cxxflags, native: false, language: ['cpp'])
Philippe Mathieu-Daudé4cb37d12022-02-15 16:15:13 +0100244add_global_arguments(qemu_objcflags, native: false, language: ['objc'])
Paolo Bonzini8cc2d232021-11-08 12:36:29 +0100245add_global_link_arguments(qemu_ldflags, native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzinia5665052019-06-10 12:05:14 +0200246
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400247if targetos == 'linux'
248 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
249 '-isystem', 'linux-headers',
250 language: ['c', 'cpp'])
251endif
252
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100253add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400254 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400255 '-iquote', meson.current_source_dir() / 'include',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400256 language: ['c', 'cpp', 'objc'])
Alexander Bulekovc46f76d2020-09-02 13:36:50 -0400257
Marc-André Lureaufc929892019-07-13 01:47:54 +0400258link_language = meson.get_external_property('link_language', 'cpp')
259if link_language == 'cpp'
260 add_languages('cpp', required: true, native: false)
Paolo Bonzini565174d2021-11-04 14:35:14 +0100261 cxx = meson.get_compiler('cpp')
262 linker = cxx
263else
264 linker = cc
Marc-André Lureaufc929892019-07-13 01:47:54 +0400265endif
Paolo Bonzinia5665052019-06-10 12:05:14 +0200266if host_machine.system() == 'darwin'
267 add_languages('objc', required: false, native: false)
268endif
269
Paolo Bonzinideb62372020-09-01 07:51:16 -0400270sparse = find_program('cgcc', required: get_option('sparse'))
271if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100272 run_target('sparse',
273 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400274 'compile_commands.json', sparse.full_path(), '-Wbitwise',
275 '-Wno-transparent-union', '-Wno-old-initializer',
276 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100277endif
278
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200279###########################################
280# Target-specific checks and dependencies #
281###########################################
282
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100283# Fuzzing
Paolo Bonzini537b7242021-10-07 15:08:12 +0200284if get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
285 not cc.links('''
286 #include <stdint.h>
287 #include <sys/types.h>
288 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
289 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
290 ''',
291 args: ['-Werror', '-fsanitize=fuzzer'])
292 error('Your compiler does not support -fsanitize=fuzzer')
293endif
294
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100295# Tracing backends
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200296if 'ftrace' in get_option('trace_backends') and targetos != 'linux'
297 error('ftrace is supported only on Linux')
298endif
299if 'syslog' in get_option('trace_backends') and not cc.compiles('''
300 #include <syslog.h>
301 int main(void) {
302 openlog("qemu", LOG_PID, LOG_DAEMON);
303 syslog(LOG_INFO, "configure");
304 return 0;
305 }''')
306 error('syslog is not supported on this system')
307endif
308
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100309# Miscellaneous Linux-only features
Paolo Bonzinia436d6d2021-12-18 16:39:43 +0100310get_option('mpath') \
311 .require(targetos == 'linux', error_message: 'Multipath is supported only on Linux')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200312
Paolo Bonzinia436d6d2021-12-18 16:39:43 +0100313multiprocess_allowed = get_option('multiprocess') \
314 .require(targetos == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \
315 .allowed()
Paolo Bonzini106ad1f2021-02-17 16:24:25 +0100316
Jagannathan Raman55116962022-06-13 16:26:24 -0400317vfio_user_server_allowed = get_option('vfio_user_server') \
318 .require(targetos == 'linux', error_message: 'vfio-user server is supported only on Linux') \
319 .allowed()
320
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +0100321have_tpm = get_option('tpm') \
322 .require(targetos != 'windows', error_message: 'TPM emulation only available on POSIX systems') \
323 .allowed()
324
Paolo Bonzini2a3129a2022-04-20 17:34:05 +0200325# vhost
Paolo Bonzini2df89d52022-04-20 17:34:07 +0200326have_vhost_user = get_option('vhost_user') \
327 .disable_auto_if(targetos != 'linux') \
328 .require(targetos != 'windows',
329 error_message: 'vhost-user is not available on Windows').allowed()
330have_vhost_vdpa = get_option('vhost_vdpa') \
331 .require(targetos == 'linux',
332 error_message: 'vhost-vdpa is only available on Linux').allowed()
333have_vhost_kernel = get_option('vhost_kernel') \
334 .require(targetos == 'linux',
335 error_message: 'vhost-kernel is only available on Linux').allowed()
336have_vhost_user_crypto = get_option('vhost_crypto') \
337 .require(have_vhost_user,
338 error_message: 'vhost-crypto requires vhost-user to be enabled').allowed()
339
Paolo Bonzini43b6d7e2022-04-20 17:34:06 +0200340have_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel
Paolo Bonzini2df89d52022-04-20 17:34:07 +0200341
342have_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed()
343have_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed()
344have_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed()
345have_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa
Paolo Bonzini2a3129a2022-04-20 17:34:05 +0200346
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100347# Target-specific libraries and flags
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200348libm = cc.find_library('m', required: false)
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +0200349threads = dependency('threads')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400350util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200351winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400352socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400353version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400354coref = []
355iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400356emulator_link_args = []
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200357nvmm =not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400358hvf = not_found
Marc-André Lureau23011f42022-02-01 12:55:21 +0400359midl = not_found
360widl = not_found
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900361pathcch = not_found
Paolo Bonzinia6305082021-10-07 15:08:15 +0200362host_dsosuf = '.so'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400363if targetos == 'windows'
Marc-André Lureau23011f42022-02-01 12:55:21 +0400364 midl = find_program('midl', required: false)
365 widl = find_program('widl', required: false)
Akihiko Odakicf60ccc2022-06-24 23:50:37 +0900366 pathcch = cc.find_library('pathcch')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400367 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200368 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400369
370 win = import('windows')
371 version_res = win.compile_resources('version.rc',
372 depend_files: files('pc-bios/qemu-nsis.ico'),
373 include_directories: include_directories('.'))
Paolo Bonzinia6305082021-10-07 15:08:15 +0200374 host_dsosuf = '.dll'
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400375elif targetos == 'darwin'
376 coref = dependency('appleframeworks', modules: 'CoreFoundation')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700377 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
Paolo Bonzinia6305082021-10-07 15:08:15 +0200378 host_dsosuf = '.dylib'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200379elif targetos == 'sunos'
380 socket = [cc.find_library('socket'),
381 cc.find_library('nsl'),
382 cc.find_library('resolv')]
383elif targetos == 'haiku'
384 socket = [cc.find_library('posix_error_mapper'),
385 cc.find_library('network'),
386 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400387elif targetos == 'openbsd'
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100388 if get_option('tcg').allowed() and target_dirs.length() > 0
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400389 # Disable OpenBSD W^X if available
390 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
391 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400392endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200393
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100394# Target-specific configuration of accelerators
Paolo Bonzini8a199802020-09-18 05:37:01 -0400395accelerators = []
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100396if get_option('kvm').allowed() and targetos == 'linux'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400397 accelerators += 'CONFIG_KVM'
398endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100399if get_option('whpx').allowed() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000400 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400401 error('WHPX requires 64-bit host')
402 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
403 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
404 accelerators += 'CONFIG_WHPX'
405 endif
406endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100407if get_option('hvf').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400408 hvf = dependency('appleframeworks', modules: 'Hypervisor',
409 required: get_option('hvf'))
410 if hvf.found()
411 accelerators += 'CONFIG_HVF'
412 endif
413endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100414if get_option('hax').allowed()
Paolo Bonzini8a199802020-09-18 05:37:01 -0400415 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
416 accelerators += 'CONFIG_HAX'
417 endif
418endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200419if targetos == 'netbsd'
nia0cc49652021-10-13 13:54:17 +0000420 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200421 if nvmm.found()
422 accelerators += 'CONFIG_NVMM'
423 endif
424endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100425
Paolo Bonzini823eb012021-11-08 14:18:17 +0100426tcg_arch = host_arch
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100427if get_option('tcg').allowed()
Paolo Bonzini823eb012021-11-08 14:18:17 +0100428 if host_arch == 'unknown'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100429 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +0100430 warning('Unsupported CPU @0@, will use TCG with TCI (slow)'.format(cpu))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400431 else
432 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
433 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100434 elif get_option('tcg_interpreter')
Philippe Mathieu-Daudé1c282da2021-05-21 12:34:23 +0200435 warning('Use of the TCG interpreter is not recommended on this host')
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100436 warning('architecture. There is a native TCG execution backend available')
437 warning('which provides substantially better performance and reliability.')
438 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
439 warning('configuration option on this architecture to use the native')
440 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400441 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100442 if get_option('tcg_interpreter')
443 tcg_arch = 'tci'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100444 elif host_arch == 'sparc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100445 tcg_arch = 'sparc'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100446 elif host_arch == 'x86_64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100447 tcg_arch = 'i386'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100448 elif host_arch == 'ppc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100449 tcg_arch = 'ppc'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100450 endif
451 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100452 language: ['c', 'cpp', 'objc'])
453
Paolo Bonzini8a199802020-09-18 05:37:01 -0400454 accelerators += 'CONFIG_TCG'
455 config_host += { 'CONFIG_TCG': 'y' }
456endif
457
458if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
459 error('KVM not available on this platform')
460endif
461if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
462 error('HVF not available on this platform')
463endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200464if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
465 error('NVMM not available on this platform')
466endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400467if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
468 error('WHPX not available on this platform')
469endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400470
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200471################
472# Dependencies #
473################
474
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400475# The path to glib.h is added to all compilation commands. This was
476# grandfathered in from the QEMU Makefiles.
477add_project_arguments(config_host['GLIB_CFLAGS'].split(),
478 native: false, language: ['c', 'cpp', 'objc'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400479glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
Marc-André Lureaud83acfd2021-10-09 17:37:40 +0400480 link_args: config_host['GLIB_LIBS'].split(),
Marc-André Lureau5b9e7d02022-05-25 16:41:39 +0200481 version: config_host['GLIB_VERSION'],
482 variables: {
483 'bindir': config_host['GLIB_BINDIR'],
484 })
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400485# override glib dep with the configure results (for subprojects)
486meson.override_dependency('glib-2.0', glib)
487
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400488gio = not_found
Paolo Bonzini75440602022-04-20 17:33:44 +0200489gdbus_codegen = not_found
490if not get_option('gio').auto() or have_system
491 gio = dependency('gio-2.0', required: get_option('gio'),
492 method: 'pkg-config', kwargs: static_kwargs)
493 if gio.found() and not cc.links('''
494 #include <gio/gio.h>
495 int main(void)
496 {
497 g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0);
498 return 0;
499 }''', dependencies: [glib, gio])
500 if get_option('gio').enabled()
501 error('The installed libgio is broken for static linking')
502 endif
503 gio = not_found
504 endif
505 if gio.found()
506 gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'),
507 required: get_option('gio'))
508 gio_unix = dependency('gio-unix-2.0', required: get_option('gio'),
509 method: 'pkg-config', kwargs: static_kwargs)
510 gio = declare_dependency(dependencies: [gio, gio_unix],
511 version: gio.version())
512 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400513endif
Paolo Bonzini75440602022-04-20 17:33:44 +0200514
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400515lttng = not_found
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200516if 'ust' in get_option('trace_backends')
Marc-André Lureaue32aaa52022-03-28 12:47:13 +0400517 lttng = dependency('lttng-ust', required: true, version: '>= 2.1',
518 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400519endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200520pixman = not_found
521if have_system or have_tools
522 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100523 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200524endif
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100525zlib = dependency('zlib', required: true, kwargs: static_kwargs)
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200526
Paolo Bonziniff66f3e2021-10-07 15:08:20 +0200527libaio = not_found
528if not get_option('linux_aio').auto() or have_block
529 libaio = cc.find_library('aio', has_headers: ['libaio.h'],
530 required: get_option('linux_aio'),
531 kwargs: static_kwargs)
532endif
Leonardo Bras354081d2022-05-13 03:28:30 -0300533
534linux_io_uring_test = '''
535 #include <liburing.h>
536 #include <linux/errqueue.h>
537
538 int main(void) { return 0; }'''
539
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400540linux_io_uring = not_found
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200541if not get_option('linux_io_uring').auto() or have_block
Daniel P. Berrangéa41b4fd2022-01-05 13:49:38 +0000542 linux_io_uring = dependency('liburing', version: '>=0.3',
543 required: get_option('linux_io_uring'),
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200544 method: 'pkg-config', kwargs: static_kwargs)
Leonardo Bras354081d2022-05-13 03:28:30 -0300545 if not cc.links(linux_io_uring_test)
546 linux_io_uring = not_found
547 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400548endif
Leonardo Bras354081d2022-05-13 03:28:30 -0300549
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400550libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +0100551if not get_option('libnfs').auto() or have_block
552 libnfs = dependency('libnfs', version: '>=1.9.3',
553 required: get_option('libnfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100554 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400555endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100556
557libattr_test = '''
558 #include <stddef.h>
559 #include <sys/types.h>
560 #ifdef CONFIG_LIBATTR
561 #include <attr/xattr.h>
562 #else
563 #include <sys/xattr.h>
564 #endif
565 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
566
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400567libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100568have_old_libattr = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100569if get_option('attr').allowed()
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100570 if cc.links(libattr_test)
571 libattr = declare_dependency()
572 else
573 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
574 required: get_option('attr'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100575 kwargs: static_kwargs)
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100576 if libattr.found() and not \
577 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
578 libattr = not_found
579 if get_option('attr').enabled()
580 error('could not link libattr')
581 else
582 warning('could not link libattr, disabling')
583 endif
584 else
585 have_old_libattr = libattr.found()
586 endif
587 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400588endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100589
Akihiko Odaki52eaefd2022-07-02 23:25:19 +0900590cocoa = dependency('appleframeworks', modules: ['Cocoa', 'CoreVideo'],
591 required: get_option('cocoa'))
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100592if cocoa.found() and get_option('sdl').enabled()
593 error('Cocoa and SDL cannot be enabled at the same time')
594endif
595if cocoa.found() and get_option('gtk').enabled()
596 error('Cocoa and GTK+ cannot be enabled at the same time')
597endif
598
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +0300599vmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet'))
600if vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h',
601 'VMNET_BRIDGED_MODE',
602 dependencies: vmnet)
603 vmnet = not_found
604 if get_option('vmnet').enabled()
605 error('vmnet.framework API is outdated')
606 else
607 warning('vmnet.framework API is outdated, disabling')
608 endif
609endif
610
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100611seccomp = not_found
Paolo Bonzini90835c22020-11-17 14:22:24 +0100612if not get_option('seccomp').auto() or have_system or have_tools
613 seccomp = dependency('libseccomp', version: '>=2.3.0',
614 required: get_option('seccomp'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100615 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100616endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100617
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100618libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100619if not get_option('cap_ng').auto() or have_system or have_tools
620 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
621 required: get_option('cap_ng'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100622 kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100623endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100624if libcap_ng.found() and not cc.links('''
625 #include <cap-ng.h>
626 int main(void)
627 {
628 capng_capability_to_name(CAPNG_EFFECTIVE);
629 return 0;
630 }''', dependencies: libcap_ng)
631 libcap_ng = not_found
632 if get_option('cap_ng').enabled()
633 error('could not link libcap-ng')
634 else
635 warning('could not link libcap-ng, disabling')
636 endif
637endif
638
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400639if get_option('xkbcommon').auto() and not have_system and not have_tools
640 xkbcommon = not_found
641else
642 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100643 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400644endif
Paolo Bonzinie1723992021-10-07 15:08:21 +0200645
Thomas Huth58902582022-04-08 18:20:47 +0200646slirp = not_found
647if not get_option('slirp').auto() or have_system
648 slirp = dependency('slirp', required: get_option('slirp'),
649 method: 'pkg-config', kwargs: static_kwargs)
650 # slirp < 4.7 is incompatible with CFI support in QEMU. This is because
651 # it passes function pointers within libslirp as callbacks for timers.
652 # When using a system-wide shared libslirp, the type information for the
653 # callback is missing and the timer call produces a false positive with CFI.
654 # Do not use the "version" keyword argument to produce a better error.
655 # with control-flow integrity.
656 if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7')
657 if get_option('slirp').enabled()
658 error('Control-Flow Integrity requires libslirp 4.7.')
659 else
660 warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.')
661 slirp = not_found
662 endif
663 endif
664endif
665
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400666vde = not_found
Paolo Bonzinie1723992021-10-07 15:08:21 +0200667if not get_option('vde').auto() or have_system or have_tools
668 vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
669 required: get_option('vde'),
670 kwargs: static_kwargs)
671endif
672if vde.found() and not cc.links('''
673 #include <libvdeplug.h>
674 int main(void)
675 {
676 struct vde_open_args a = {0, 0, 0};
677 char s[] = "";
678 vde_open(s, s, &a);
679 return 0;
680 }''', dependencies: vde)
681 vde = not_found
682 if get_option('cap_ng').enabled()
683 error('could not link libvdeplug')
684 else
685 warning('could not link libvdeplug, disabling')
686 endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400687endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200688
Paolo Bonzini478e9432020-08-17 12:47:55 +0200689pulse = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200690if not get_option('pa').auto() or (targetos == 'linux' and have_system)
691 pulse = dependency('libpulse', required: get_option('pa'),
692 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200693endif
694alsa = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200695if not get_option('alsa').auto() or (targetos == 'linux' and have_system)
696 alsa = dependency('alsa', required: get_option('alsa'),
697 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200698endif
699jack = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200700if not get_option('jack').auto() or have_system
701 jack = dependency('jack', required: get_option('jack'),
702 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200703endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200704
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200705spice_protocol = not_found
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200706if not get_option('spice_protocol').auto() or have_system
707 spice_protocol = dependency('spice-protocol', version: '>=0.12.3',
708 required: get_option('spice_protocol'),
709 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini26347332019-07-29 15:40:07 +0200710endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200711spice = not_found
712if not get_option('spice').auto() or have_system
713 spice = dependency('spice-server', version: '>=0.12.5',
714 required: get_option('spice'),
715 method: 'pkg-config', kwargs: static_kwargs)
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200716endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200717spice_headers = spice.partial_dependency(compile_args: true, includes: true)
718
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400719rt = cc.find_library('rt', required: false)
Paolo Bonzinia399f912021-11-15 14:29:13 +0000720
Paolo Bonzini99650b62019-06-10 12:21:14 +0200721libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100722if not get_option('libiscsi').auto() or have_block
723 libiscsi = dependency('libiscsi', version: '>=1.9.0',
724 required: get_option('libiscsi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100725 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini99650b62019-06-10 12:21:14 +0200726endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400727zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +0100728if not get_option('zstd').auto() or have_block
729 zstd = dependency('libzstd', version: '>=1.4.0',
730 required: get_option('zstd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100731 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400732endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400733virgl = not_found
Paolo Bonzini0265fe92021-12-17 12:36:26 +0100734
735have_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found()
736if not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu
Paolo Bonzini587d59d2021-06-03 11:31:35 +0200737 virgl = dependency('virglrenderer',
738 method: 'pkg-config',
739 required: get_option('virglrenderer'),
740 kwargs: static_kwargs)
Marc-André Lureauea458962019-07-12 22:23:46 +0400741endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400742curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100743if not get_option('curl').auto() or have_block
744 curl = dependency('libcurl', version: '>=7.29.0',
745 method: 'pkg-config',
746 required: get_option('curl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100747 kwargs: static_kwargs)
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400748endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200749libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200750if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200751 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +0100752 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400753 required: get_option('libudev'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100754 kwargs: static_kwargs)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200755endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200756
Paolo Bonzini5c530152020-10-15 06:09:27 -0400757mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200758mpathpersist = not_found
759mpathpersist_new_api = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100760if targetos == 'linux' and have_tools and get_option('mpath').allowed()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200761 mpath_test_source_new = '''
762 #include <libudev.h>
763 #include <mpath_persist.h>
764 unsigned mpath_mx_alloc_len = 1024;
765 int logsink;
766 static struct config *multipath_conf;
767 extern struct udev *udev;
768 extern struct config *get_multipath_config(void);
769 extern void put_multipath_config(struct config *conf);
770 struct udev *udev;
771 struct config *get_multipath_config(void) { return multipath_conf; }
772 void put_multipath_config(struct config *conf) { }
773 int main(void) {
774 udev = udev_new();
775 multipath_conf = mpath_lib_init();
776 return 0;
777 }'''
778 mpath_test_source_old = '''
779 #include <libudev.h>
780 #include <mpath_persist.h>
781 unsigned mpath_mx_alloc_len = 1024;
782 int logsink;
783 int main(void) {
784 struct udev *udev = udev_new();
785 mpath_lib_init(udev);
786 return 0;
787 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400788 libmpathpersist = cc.find_library('mpathpersist',
789 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100790 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400791 if libmpathpersist.found()
792 mpathlibs += libmpathpersist
793 if enable_static
794 mpathlibs += cc.find_library('devmapper',
795 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100796 kwargs: static_kwargs)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200797 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400798 mpathlibs += cc.find_library('multipath',
799 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100800 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400801 foreach lib: mpathlibs
802 if not lib.found()
803 mpathlibs = []
804 break
805 endif
806 endforeach
807 if mpathlibs.length() == 0
808 msg = 'Dependencies missing for libmpathpersist'
809 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200810 mpathpersist = declare_dependency(dependencies: mpathlibs)
811 mpathpersist_new_api = true
812 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
813 mpathpersist = declare_dependency(dependencies: mpathlibs)
814 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400815 msg = 'Cannot detect libmpathpersist API'
816 endif
817 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200818 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400819 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200820 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400821 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200822 endif
823 endif
824 endif
825endif
826
Yonggang Luo5285e592020-10-13 07:43:48 +0800827iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800828curses = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100829if have_system and get_option('curses').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400830 curses_test = '''
Stefan Weilfbab8cc2021-11-17 21:53:55 +0100831 #if defined(__APPLE__) || defined(__OpenBSD__)
832 #define _XOPEN_SOURCE_EXTENDED 1
833 #endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400834 #include <locale.h>
835 #include <curses.h>
836 #include <wchar.h>
837 int main(void) {
838 wchar_t wch = L'w';
839 setlocale(LC_ALL, "");
840 resize_term(0, 0);
841 addwstr(L"wide chars\n");
842 addnwstr(&wch, 1);
843 add_wch(WACS_DEGREE);
844 return 0;
845 }'''
846
Yonggang Luoca31e302020-11-17 05:31:06 +0800847 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
848 foreach curses_dep : curses_dep_list
849 if not curses.found()
850 curses = dependency(curses_dep,
851 required: false,
852 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100853 kwargs: static_kwargs)
Yonggang Luoca31e302020-11-17 05:31:06 +0800854 endif
855 endforeach
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400856 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Stefan Weilfbab8cc2021-11-17 21:53:55 +0100857 curses_compile_args = ['-DNCURSES_WIDECHAR=1']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400858 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500859 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
860 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400861 else
862 msg = 'curses package not usable'
863 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800864 endif
865 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400866 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400867 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
868 if targetos != 'windows' and not has_curses_h
869 message('Trying with /usr/include/ncursesw')
870 curses_compile_args += ['-I/usr/include/ncursesw']
871 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
872 endif
873 if has_curses_h
874 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
875 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800876 libcurses = cc.find_library(curses_libname,
877 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100878 kwargs: static_kwargs)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400879 if libcurses.found()
880 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
881 curses = declare_dependency(compile_args: curses_compile_args,
882 dependencies: [libcurses])
883 break
884 else
885 msg = 'curses library not usable'
886 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800887 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400888 endforeach
889 endif
890 endif
Paolo Bonzini43a363a2021-12-18 16:39:43 +0100891 if get_option('iconv').allowed()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400892 foreach link_args : [ ['-liconv'], [] ]
893 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
894 # We need to use libiconv if available because mixing libiconv's headers with
895 # the system libc does not work.
896 # However, without adding glib to the dependencies -L/usr/local/lib will not be
897 # included in the command line and libiconv will not be found.
898 if cc.links('''
899 #include <iconv.h>
900 int main(void) {
901 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
902 return conv != (iconv_t) -1;
903 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
904 iconv = declare_dependency(link_args: link_args, dependencies: glib)
905 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800906 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400907 endforeach
908 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400909 if curses.found() and not iconv.found()
910 if get_option('iconv').enabled()
911 error('iconv not available')
912 endif
913 msg = 'iconv required for curses UI but not available'
914 curses = not_found
915 endif
916 if not curses.found() and msg != ''
917 if get_option('curses').enabled()
918 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400919 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400920 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400921 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800922 endif
923endif
924
Paolo Bonzini26347332019-07-29 15:40:07 +0200925brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100926if not get_option('brlapi').auto() or have_system
927 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
928 required: get_option('brlapi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100929 kwargs: static_kwargs)
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100930 if brlapi.found() and not cc.links('''
931 #include <brlapi.h>
932 #include <stddef.h>
933 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
934 brlapi = not_found
935 if get_option('brlapi').enabled()
936 error('could not link brlapi')
937 else
938 warning('could not link brlapi, disabling')
939 endif
940 endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200941endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100942
Paolo Bonzini760e4322020-08-26 08:09:48 +0200943sdl = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100944if not get_option('sdl').auto() or (have_system and not cocoa.found())
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100945 sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200946 sdl_image = not_found
947endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100948if sdl.found()
949 # work around 2.0.8 bug
950 sdl = declare_dependency(compile_args: '-Wno-undef',
951 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200952 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100953 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100954else
955 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100956 error('sdl-image required, but SDL was @0@'.format(
957 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100958 endif
959 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200960endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100961
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400962rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100963if not get_option('rbd').auto() or have_block
964 librados = cc.find_library('rados', required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100965 kwargs: static_kwargs)
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100966 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
967 required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100968 kwargs: static_kwargs)
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100969 if librados.found() and librbd.found()
970 if cc.links('''
971 #include <stdio.h>
972 #include <rbd/librbd.h>
973 int main(void) {
974 rados_t cluster;
975 rados_create(&cluster, NULL);
Peter Lieven48672ac2021-07-02 19:23:51 +0200976 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
977 #error
978 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100979 return 0;
980 }''', dependencies: [librbd, librados])
981 rbd = declare_dependency(dependencies: [librbd, librados])
982 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +0200983 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100984 else
Peter Lieven48672ac2021-07-02 19:23:51 +0200985 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100986 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100987 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400988endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100989
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400990glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100991glusterfs_ftruncate_has_stat = false
992glusterfs_iocb_has_stat = false
993if not get_option('glusterfs').auto() or have_block
994 glusterfs = dependency('glusterfs-api', version: '>=3',
995 required: get_option('glusterfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100996 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100997 if glusterfs.found()
998 glusterfs_ftruncate_has_stat = cc.links('''
999 #include <glusterfs/api/glfs.h>
1000
1001 int
1002 main(void)
1003 {
1004 /* new glfs_ftruncate() passes two additional args */
1005 return glfs_ftruncate(NULL, 0, NULL, NULL);
1006 }
1007 ''', dependencies: glusterfs)
1008 glusterfs_iocb_has_stat = cc.links('''
1009 #include <glusterfs/api/glfs.h>
1010
1011 /* new glfs_io_cbk() passes two additional glfs_stat structs */
1012 static void
1013 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
1014 {}
1015
1016 int
1017 main(void)
1018 {
1019 glfs_io_cbk iocb = &glusterfs_iocb;
1020 iocb(NULL, 0 , NULL, NULL, NULL);
1021 return 0;
1022 }
1023 ''', dependencies: glusterfs)
1024 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001025endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001026
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001027libssh = not_found
Thomas Huthe6a52b32021-12-09 15:48:01 +01001028if not get_option('libssh').auto() or have_block
1029 libssh = dependency('libssh', version: '>=0.8.7',
1030 method: 'pkg-config',
1031 required: get_option('libssh'),
1032 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001033endif
Thomas Huthe6a52b32021-12-09 15:48:01 +01001034
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001035libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001036if not get_option('bzip2').auto() or have_block
1037 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
1038 required: get_option('bzip2'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001039 kwargs: static_kwargs)
Paolo Bonzini29ba6112020-11-17 13:07:52 +01001040 if libbzip2.found() and not cc.links('''
1041 #include <bzlib.h>
1042 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
1043 libbzip2 = not_found
1044 if get_option('bzip2').enabled()
1045 error('could not link libbzip2')
1046 else
1047 warning('could not link libbzip2, disabling')
1048 endif
1049 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001050endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001051
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001052liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +01001053if not get_option('lzfse').auto() or have_block
1054 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
1055 required: get_option('lzfse'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001056 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001057endif
Paolo Bonziniecea3692020-11-17 13:35:28 +01001058if liblzfse.found() and not cc.links('''
1059 #include <lzfse.h>
1060 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
1061 liblzfse = not_found
1062 if get_option('lzfse').enabled()
1063 error('could not link liblzfse')
1064 else
1065 warning('could not link liblzfse, disabling')
1066 endif
1067endif
1068
Paolo Bonzini478e9432020-08-17 12:47:55 +02001069oss = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001070if get_option('oss').allowed() and have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02001071 if not cc.has_header('sys/soundcard.h')
1072 # not found
1073 elif targetos == 'netbsd'
1074 oss = cc.find_library('ossaudio', required: get_option('oss'),
1075 kwargs: static_kwargs)
1076 else
1077 oss = declare_dependency()
1078 endif
1079
1080 if not oss.found()
1081 if get_option('oss').enabled()
1082 error('OSS not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001083 endif
1084 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001085endif
1086dsound = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001087if not get_option('dsound').auto() or (targetos == 'windows' and have_system)
1088 if cc.has_header('dsound.h')
1089 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
1090 endif
1091
1092 if not dsound.found()
1093 if get_option('dsound').enabled()
1094 error('DirectSound not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +02001095 endif
1096 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +02001097endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001098
Paolo Bonzini478e9432020-08-17 12:47:55 +02001099coreaudio = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +02001100if not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system)
1101 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
1102 required: get_option('coreaudio'))
Paolo Bonzini478e9432020-08-17 12:47:55 +02001103endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001104
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001105opengl = not_found
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001106if not get_option('opengl').auto() or have_system or have_vhost_user_gpu
1107 epoxy = dependency('epoxy', method: 'pkg-config',
1108 required: get_option('opengl'), kwargs: static_kwargs)
1109 if cc.has_header('epoxy/egl.h', dependencies: epoxy)
1110 opengl = epoxy
1111 elif get_option('opengl').enabled()
1112 error('epoxy/egl.h not found')
1113 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001114endif
Thomas Huth8bc51842021-07-13 13:09:02 +02001115gbm = not_found
1116if (have_system or have_tools) and (virgl.found() or opengl.found())
1117 gbm = dependency('gbm', method: 'pkg-config', required: false,
1118 kwargs: static_kwargs)
1119endif
Marc-André Lureauf0caba42022-06-28 17:23:15 +04001120have_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001121
Paolo Bonzini57612512021-06-03 11:15:26 +02001122gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001123gnutls_crypto = not_found
Alyssa Rossabc14fd2021-08-06 14:49:47 +00001124if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001125 # For general TLS support our min gnutls matches
1126 # that implied by our platform support matrix
1127 #
1128 # For the crypto backends, we look for a newer
1129 # gnutls:
1130 #
1131 # Version 3.6.8 is needed to get XTS
1132 # Version 3.6.13 is needed to get PBKDF
1133 # Version 3.6.14 is needed to get HW accelerated XTS
1134 #
1135 # If newer enough gnutls isn't available, we can
1136 # still use a different crypto backend to satisfy
1137 # the platform support requirements
1138 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1139 method: 'pkg-config',
1140 required: false,
1141 kwargs: static_kwargs)
1142 if gnutls_crypto.found()
1143 gnutls = gnutls_crypto
1144 else
1145 # Our min version if all we need is TLS
1146 gnutls = dependency('gnutls', version: '>=3.5.18',
1147 method: 'pkg-config',
1148 required: get_option('gnutls'),
1149 kwargs: static_kwargs)
1150 endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001151endif
1152
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001153# We prefer use of gnutls for crypto, unless the options
1154# explicitly asked for nettle or gcrypt.
1155#
1156# If gnutls isn't available for crypto, then we'll prefer
1157# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +02001158gcrypt = not_found
1159nettle = not_found
Lei He4c5e5122022-05-25 17:01:14 +08001160hogweed = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +01001161xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001162
Paolo Bonzini57612512021-06-03 11:15:26 +02001163if get_option('nettle').enabled() and get_option('gcrypt').enabled()
1164 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +02001165endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001166
1167# Explicit nettle/gcrypt request, so ignore gnutls for crypto
1168if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001169 gnutls_crypto = not_found
1170endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001171
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001172if not gnutls_crypto.found()
1173 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
1174 gcrypt = dependency('libgcrypt', version: '>=1.8',
1175 method: 'config-tool',
1176 required: get_option('gcrypt'),
1177 kwargs: static_kwargs)
1178 # Debian has removed -lgpg-error from libgcrypt-config
1179 # as it "spreads unnecessary dependencies" which in
1180 # turn breaks static builds...
1181 if gcrypt.found() and enable_static
1182 gcrypt = declare_dependency(dependencies: [
1183 gcrypt,
1184 cc.find_library('gpg-error', required: true, kwargs: static_kwargs)])
1185 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001186 endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001187 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1188 nettle = dependency('nettle', version: '>=3.4',
1189 method: 'pkg-config',
1190 required: get_option('nettle'),
1191 kwargs: static_kwargs)
1192 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1193 xts = 'private'
1194 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001195 endif
1196endif
1197
Lei He4c5e5122022-05-25 17:01:14 +08001198gmp = dependency('gmp', required: false, method: 'pkg-config', kwargs: static_kwargs)
1199if nettle.found() and gmp.found()
1200 hogweed = dependency('hogweed', version: '>=3.4',
1201 method: 'pkg-config',
1202 required: get_option('nettle'),
1203 kwargs: static_kwargs)
1204endif
1205
1206
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001207gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +01001208gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001209vte = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +01001210if not get_option('gtk').auto() or (have_system and not cocoa.found())
Paolo Bonzini1b695472021-01-07 14:02:29 +01001211 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1212 method: 'pkg-config',
1213 required: get_option('gtk'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001214 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +01001215 if gtk.found()
1216 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1217 method: 'pkg-config',
1218 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001219 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +01001220 gtk = declare_dependency(dependencies: [gtk, gtkx11])
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001221
1222 if not get_option('vte').auto() or have_system
1223 vte = dependency('vte-2.91',
1224 method: 'pkg-config',
1225 required: get_option('vte'),
1226 kwargs: static_kwargs)
1227 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001228 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001229endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001230
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001231x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +02001232if gtkx11.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001233 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001234 kwargs: static_kwargs)
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001235endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001236png = not_found
Kshitij Suri95f85102022-04-08 07:13:34 +00001237if get_option('png').allowed() and have_system
Thomas Huth1ec8c2c2022-06-23 19:49:41 +02001238 png = dependency('libpng', version: '>=1.6.34', required: get_option('png'),
Kshitij Suri95f85102022-04-08 07:13:34 +00001239 method: 'pkg-config', kwargs: static_kwargs)
1240endif
1241vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001242jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001243sasl = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001244if get_option('vnc').allowed() and have_system
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001245 vnc = declare_dependency() # dummy dependency
Paolo Bonzini8e242b32020-11-23 13:34:02 -05001246 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001247 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001248 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
1249 required: get_option('vnc_sasl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001250 kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001251 if sasl.found()
1252 sasl = declare_dependency(dependencies: sasl,
1253 compile_args: '-DSTRUCT_IOVEC_DEFINED')
1254 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001255endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01001256
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001257pam = not_found
1258if not get_option('auth_pam').auto() or have_system
1259 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
1260 required: get_option('auth_pam'),
1261 kwargs: static_kwargs)
1262endif
1263if pam.found() and not cc.links('''
1264 #include <stddef.h>
1265 #include <security/pam_appl.h>
1266 int main(void) {
1267 const char *service_name = "qemu";
1268 const char *user = "frank";
1269 const struct pam_conv pam_conv = { 0 };
1270 pam_handle_t *pamh = NULL;
1271 pam_start(service_name, user, &pam_conv, &pamh);
1272 return 0;
1273 }''', dependencies: pam)
1274 pam = not_found
1275 if get_option('auth_pam').enabled()
1276 error('could not link libpam')
1277 else
1278 warning('could not link libpam, disabling')
1279 endif
1280endif
1281
Marc-André Lureau708eab42019-09-03 16:59:33 +04001282snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +01001283if not get_option('snappy').auto() or have_system
1284 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
1285 required: get_option('snappy'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001286 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +04001287endif
Paolo Bonzini565174d2021-11-04 14:35:14 +01001288if snappy.found() and not linker.links('''
Paolo Bonzini241611e2020-11-17 13:32:34 +01001289 #include <snappy-c.h>
1290 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
1291 snappy = not_found
1292 if get_option('snappy').enabled()
1293 error('could not link libsnappy')
1294 else
1295 warning('could not link libsnappy, disabling')
1296 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +04001297endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001298
Marc-André Lureau708eab42019-09-03 16:59:33 +04001299lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001300if not get_option('lzo').auto() or have_system
1301 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
1302 required: get_option('lzo'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001303 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +04001304endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001305if lzo.found() and not cc.links('''
1306 #include <lzo/lzo1x.h>
1307 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
1308 lzo = not_found
1309 if get_option('lzo').enabled()
1310 error('could not link liblzo2')
1311 else
1312 warning('could not link liblzo2, disabling')
1313 endif
1314endif
1315
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001316numa = not_found
1317if not get_option('numa').auto() or have_system or have_tools
1318 numa = cc.find_library('numa', has_headers: ['numa.h'],
1319 required: get_option('numa'),
1320 kwargs: static_kwargs)
1321endif
1322if numa.found() and not cc.links('''
1323 #include <numa.h>
1324 int main(void) { return numa_available(); }
1325 ''', dependencies: numa)
1326 numa = not_found
1327 if get_option('numa').enabled()
1328 error('could not link numa')
1329 else
1330 warning('could not link numa, disabling')
1331 endif
1332endif
1333
Marc-André Lureau55166232019-07-24 19:16:22 +04001334rdma = not_found
Paolo Bonzini3730a732022-04-20 17:33:41 +02001335if not get_option('rdma').auto() or have_system
1336 libumad = cc.find_library('ibumad', required: get_option('rdma'))
1337 rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'],
1338 required: get_option('rdma'),
1339 kwargs: static_kwargs),
1340 cc.find_library('ibverbs', required: get_option('rdma'),
1341 kwargs: static_kwargs),
1342 libumad]
1343 rdma = declare_dependency(dependencies: rdma_libs)
1344 foreach lib: rdma_libs
1345 if not lib.found()
1346 rdma = not_found
1347 endif
1348 endforeach
Marc-André Lureau55166232019-07-24 19:16:22 +04001349endif
Paolo Bonzini3730a732022-04-20 17:33:41 +02001350
Marc-André Lureau582ea952019-08-15 15:15:32 +04001351xen = not_found
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001352if get_option('xen').enabled() or (get_option('xen').auto() and have_system)
1353 xencontrol = dependency('xencontrol', required: false,
1354 method: 'pkg-config', kwargs: static_kwargs)
1355 if xencontrol.found()
1356 xen_pc = declare_dependency(version: xencontrol.version(),
1357 dependencies: [
1358 xencontrol,
1359 # disabler: true makes xen_pc.found() return false if any is not found
1360 dependency('xenstore', required: false,
1361 method: 'pkg-config', kwargs: static_kwargs,
1362 disabler: true),
1363 dependency('xenforeignmemory', required: false,
1364 method: 'pkg-config', kwargs: static_kwargs,
1365 disabler: true),
1366 dependency('xengnttab', required: false,
1367 method: 'pkg-config', kwargs: static_kwargs,
1368 disabler: true),
1369 dependency('xenevtchn', required: false,
1370 method: 'pkg-config', kwargs: static_kwargs,
1371 disabler: true),
1372 dependency('xendevicemodel', required: false,
1373 method: 'pkg-config', kwargs: static_kwargs,
1374 disabler: true),
1375 # optional, no "disabler: true"
1376 dependency('xentoolcore', required: false,
1377 method: 'pkg-config', kwargs: static_kwargs)])
1378 if xen_pc.found()
1379 xen = xen_pc
1380 endif
1381 endif
1382 if not xen.found()
1383 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' ]
1384 xen_libs = {
1385 '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
1386 '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ],
1387 '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
1388 '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
1389 '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ],
1390 '4.6.0': [ 'xenstore', 'xenctrl' ],
1391 '4.5.0': [ 'xenstore', 'xenctrl' ],
1392 '4.2.0': [ 'xenstore', 'xenctrl' ],
1393 }
1394 xen_deps = {}
1395 foreach ver: xen_tests
1396 # cache the various library tests to avoid polluting the logs
1397 xen_test_deps = []
1398 foreach l: xen_libs[ver]
1399 if l not in xen_deps
1400 xen_deps += { l: cc.find_library(l, required: false) }
1401 endif
1402 xen_test_deps += xen_deps[l]
1403 endforeach
1404
1405 # Use -D to pick just one of the test programs in scripts/xen-detect.c
1406 xen_version = ver.split('.')
1407 xen_ctrl_version = xen_version[0] + \
1408 ('0' + xen_version[1]).substring(-2) + \
1409 ('0' + xen_version[2]).substring(-2)
1410 if cc.links(files('scripts/xen-detect.c'),
1411 args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version,
1412 dependencies: xen_test_deps)
1413 xen = declare_dependency(version: ver, dependencies: xen_test_deps)
1414 break
1415 endif
1416 endforeach
1417 endif
1418 if xen.found()
1419 accelerators += 'CONFIG_XEN'
1420 elif get_option('xen').enabled()
1421 error('could not compile and link Xen test program')
1422 endif
Marc-André Lureau582ea952019-08-15 15:15:32 +04001423endif
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001424have_xen_pci_passthrough = get_option('xen_pci_passthrough') \
1425 .require(xen.found(),
1426 error_message: 'Xen PCI passthrough requested but Xen not enabled') \
1427 .require(targetos == 'linux',
1428 error_message: 'Xen PCI passthrough not available on this platform') \
1429 .allowed()
1430
1431
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001432cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02001433if not get_option('smartcard').auto() or have_system
1434 cacard = dependency('libcacard', required: get_option('smartcard'),
1435 version: '>=2.5.1', method: 'pkg-config',
1436 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001437endif
César Belley0a40bcb2020-08-26 13:42:04 +02001438u2f = not_found
1439if have_system
1440 u2f = dependency('u2f-emu', required: get_option('u2f'),
1441 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001442 kwargs: static_kwargs)
César Belley0a40bcb2020-08-26 13:42:04 +02001443endif
Hongren (Zenithal) Zheng8caef852022-05-19 20:38:57 +08001444canokey = not_found
1445if have_system
1446 canokey = dependency('canokey-qemu', required: get_option('canokey'),
1447 method: 'pkg-config',
1448 kwargs: static_kwargs)
1449endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001450usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02001451if not get_option('usb_redir').auto() or have_system
1452 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
1453 version: '>=0.6', method: 'pkg-config',
1454 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001455endif
1456libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02001457if not get_option('libusb').auto() or have_system
1458 libusb = dependency('libusb-1.0', required: get_option('libusb'),
1459 version: '>=1.0.13', method: 'pkg-config',
1460 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001461endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02001462
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001463libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02001464if not get_option('libpmem').auto() or have_system
1465 libpmem = dependency('libpmem', required: get_option('libpmem'),
1466 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001467endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001468libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02001469if not get_option('libdaxctl').auto() or have_system
1470 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
1471 version: '>=57', method: 'pkg-config',
1472 kwargs: static_kwargs)
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001473endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001474tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02001475if gnutls.found()
1476 tasn1 = dependency('libtasn1',
1477 method: 'pkg-config',
1478 kwargs: static_kwargs)
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001479endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001480keyutils = dependency('libkeyutils', required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001481 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001482
Marc-André Lureau3909def2020-08-28 15:07:33 +04001483has_gettid = cc.has_function('gettid')
1484
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001485# libselinux
1486selinux = dependency('libselinux',
1487 required: get_option('selinux'),
1488 method: 'pkg-config', kwargs: static_kwargs)
1489
Paolo Bonziniaa087962020-09-01 11:15:30 -04001490# Malloc tests
1491
1492malloc = []
1493if get_option('malloc') == 'system'
1494 has_malloc_trim = \
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001495 get_option('malloc_trim').allowed() and \
Paolo Bonziniaa087962020-09-01 11:15:30 -04001496 cc.links('''#include <malloc.h>
1497 int main(void) { malloc_trim(0); return 0; }''')
1498else
1499 has_malloc_trim = false
1500 malloc = cc.find_library(get_option('malloc'), required: true)
1501endif
1502if not has_malloc_trim and get_option('malloc_trim').enabled()
1503 if get_option('malloc') == 'system'
1504 error('malloc_trim not available on this platform.')
1505 else
1506 error('malloc_trim not available with non-libc memory allocator')
1507 endif
1508endif
1509
Max Reitz84e319a2020-11-02 17:18:55 +01001510# Check whether the glibc provides statx()
1511
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001512gnu_source_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01001513 #ifndef _GNU_SOURCE
1514 #define _GNU_SOURCE
1515 #endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001516'''
1517statx_test = gnu_source_prefix + '''
Max Reitz84e319a2020-11-02 17:18:55 +01001518 #include <sys/stat.h>
1519 int main(void) {
1520 struct statx statxbuf;
1521 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
1522 return 0;
1523 }'''
1524
1525has_statx = cc.links(statx_test)
1526
Hanna Reitz4ce7a082022-02-23 10:23:40 +01001527# Check whether statx() provides mount ID information
1528
1529statx_mnt_id_test = gnu_source_prefix + '''
1530 #include <sys/stat.h>
1531 int main(void) {
1532 struct statx statxbuf;
1533 statx(0, "", 0, STATX_BASIC_STATS | STATX_MNT_ID, &statxbuf);
1534 return statxbuf.stx_mnt_id;
1535 }'''
1536
1537has_statx_mnt_id = cc.links(statx_mnt_id_test)
1538
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001539have_vhost_user_blk_server = get_option('vhost_user_blk_server') \
1540 .require(targetos == 'linux',
1541 error_message: 'vhost_user_blk_server requires linux') \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02001542 .require(have_vhost_user,
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001543 error_message: 'vhost_user_blk_server requires vhost-user support') \
Alex Bennée26ed5012022-05-24 16:40:42 +01001544 .disable_auto_if(not have_tools and not have_system) \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001545 .allowed()
Daniele Buono9e62ba42020-12-04 18:06:14 -05001546
Max Reitzdf4ea702020-10-27 20:05:46 +01001547if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1548 error('Cannot enable fuse-lseek while fuse is disabled')
1549endif
1550
Max Reitza484a712020-10-27 20:05:41 +01001551fuse = dependency('fuse3', required: get_option('fuse'),
1552 version: '>=3.1', method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001553 kwargs: static_kwargs)
Max Reitza484a712020-10-27 20:05:41 +01001554
Max Reitzdf4ea702020-10-27 20:05:46 +01001555fuse_lseek = not_found
Paolo Bonzini43a363a2021-12-18 16:39:43 +01001556if get_option('fuse_lseek').allowed()
Max Reitzdf4ea702020-10-27 20:05:46 +01001557 if fuse.version().version_compare('>=3.8')
1558 # Dummy dependency
1559 fuse_lseek = declare_dependency()
1560 elif get_option('fuse_lseek').enabled()
1561 if fuse.found()
1562 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1563 else
1564 error('fuse-lseek requires libfuse, which was not found')
1565 endif
1566 endif
1567endif
1568
Xie Yongjia6caeee2022-05-23 16:46:08 +08001569have_libvduse = (targetos == 'linux')
1570if get_option('libvduse').enabled()
1571 if targetos != 'linux'
1572 error('libvduse requires linux')
1573 endif
1574elif get_option('libvduse').disabled()
1575 have_libvduse = false
1576endif
1577
Xie Yongji2a2359b2022-05-23 16:46:09 +08001578have_vduse_blk_export = (have_libvduse and targetos == 'linux')
1579if get_option('vduse_blk_export').enabled()
1580 if targetos != 'linux'
1581 error('vduse_blk_export requires linux')
1582 elif not have_libvduse
1583 error('vduse_blk_export requires libvduse support')
1584 endif
1585elif get_option('vduse_blk_export').disabled()
1586 have_vduse_blk_export = false
1587endif
1588
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001589# libbpf
1590libbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
1591if libbpf.found() and not cc.links('''
1592 #include <bpf/libbpf.h>
1593 int main(void)
1594 {
1595 bpf_object__destroy_skeleton(NULL);
1596 return 0;
1597 }''', dependencies: libbpf)
1598 libbpf = not_found
1599 if get_option('bpf').enabled()
1600 error('libbpf skeleton test failed')
1601 else
1602 warning('libbpf skeleton test failed, disabling')
1603 endif
1604endif
1605
Paolo Bonzini87430d52021-10-07 15:06:09 +02001606#################
1607# config-host.h #
1608#################
1609
1610audio_drivers_selected = []
1611if have_system
1612 audio_drivers_available = {
1613 'alsa': alsa.found(),
1614 'coreaudio': coreaudio.found(),
1615 'dsound': dsound.found(),
1616 'jack': jack.found(),
1617 'oss': oss.found(),
1618 'pa': pulse.found(),
1619 'sdl': sdl.found(),
1620 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02001621 foreach k, v: audio_drivers_available
1622 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
1623 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02001624
1625 # Default to native drivers first, OSS second, SDL third
1626 audio_drivers_priority = \
1627 [ 'pa', 'coreaudio', 'dsound', 'oss' ] + \
1628 (targetos == 'linux' ? [] : [ 'sdl' ])
1629 audio_drivers_default = []
1630 foreach k: audio_drivers_priority
1631 if audio_drivers_available[k]
1632 audio_drivers_default += k
1633 endif
1634 endforeach
1635
1636 foreach k: get_option('audio_drv_list')
1637 if k == 'default'
1638 audio_drivers_selected += audio_drivers_default
1639 elif not audio_drivers_available[k]
1640 error('Audio driver "@0@" not available.'.format(k))
1641 else
1642 audio_drivers_selected += k
1643 endif
1644 endforeach
1645endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001646config_host_data.set('CONFIG_AUDIO_DRIVERS',
1647 '"' + '", "'.join(audio_drivers_selected) + '", ')
1648
Daniele Buono9e62ba42020-12-04 18:06:14 -05001649if get_option('cfi')
1650 cfi_flags=[]
1651 # Check for dependency on LTO
1652 if not get_option('b_lto')
1653 error('Selected Control-Flow Integrity but LTO is disabled')
1654 endif
1655 if config_host.has_key('CONFIG_MODULES')
1656 error('Selected Control-Flow Integrity is not compatible with modules')
1657 endif
1658 # Check for cfi flags. CFI requires LTO so we can't use
1659 # get_supported_arguments, but need a more complex "compiles" which allows
1660 # custom arguments
1661 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1662 args: ['-flto', '-fsanitize=cfi-icall'] )
1663 cfi_flags += '-fsanitize=cfi-icall'
1664 else
1665 error('-fsanitize=cfi-icall is not supported by the compiler')
1666 endif
1667 if cc.compiles('int main () { return 0; }',
1668 name: '-fsanitize-cfi-icall-generalize-pointers',
1669 args: ['-flto', '-fsanitize=cfi-icall',
1670 '-fsanitize-cfi-icall-generalize-pointers'] )
1671 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1672 else
1673 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1674 endif
1675 if get_option('cfi_debug')
1676 if cc.compiles('int main () { return 0; }',
1677 name: '-fno-sanitize-trap=cfi-icall',
1678 args: ['-flto', '-fsanitize=cfi-icall',
1679 '-fno-sanitize-trap=cfi-icall'] )
1680 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1681 else
1682 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1683 endif
1684 endif
Marc-André Lureau5fc06172021-01-14 16:56:02 +04001685 add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1686 add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
Daniele Buono9e62ba42020-12-04 18:06:14 -05001687endif
1688
Joelle van Dyne14176c82021-03-15 11:03:38 -07001689have_host_block_device = (targetos != 'darwin' or
1690 cc.has_header('IOKit/storage/IOMedia.h'))
1691
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001692# FIXME enable_modules shouldn't be necessary, but: https://github.com/mesonbuild/meson/issues/8333
1693dbus_display = get_option('dbus_display') \
1694 .require(gio.version().version_compare('>=2.64'),
1695 error_message: '-display dbus requires glib>=2.64') \
1696 .require(enable_modules,
1697 error_message: '-display dbus requires --enable-modules') \
Paolo Bonzini75440602022-04-20 17:33:44 +02001698 .require(gdbus_codegen.found(),
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001699 error_message: '-display dbus requires gdbus-codegen') \
Paolo Bonzinid82b11f2022-07-28 08:41:28 +02001700 .require(opengl.found() and gbm.found(),
1701 error_message: '-display dbus requires epoxy/egl and gbm') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001702 .allowed()
Marc-André Lureau142ca622021-07-15 11:53:53 +04001703
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001704have_virtfs = get_option('virtfs') \
Keno Fischer0fb1e192022-02-27 17:35:22 -05001705 .require(targetos == 'linux' or targetos == 'darwin',
1706 error_message: 'virtio-9p (virtfs) requires Linux or macOS') \
1707 .require(targetos == 'linux' or cc.has_function('pthread_fchdir_np'),
1708 error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \
1709 .require(targetos == 'darwin' or (libattr.found() and libcap_ng.found()),
1710 error_message: 'virtio-9p (virtfs) on Linux requires libcap-ng-devel and libattr-devel') \
Paolo Bonzinia436d6d2021-12-18 16:39:43 +01001711 .disable_auto_if(not have_tools and not have_system) \
1712 .allowed()
Paolo Bonzini69202b42020-11-17 14:46:21 +01001713
Keno Fischer0fb1e192022-02-27 17:35:22 -05001714have_virtfs_proxy_helper = targetos != 'darwin' and have_virtfs and have_tools
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01001715
Paolo Bonzini622d64f2022-04-20 17:33:53 +02001716if get_option('block_drv_ro_whitelist') == ''
1717 config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '')
1718else
1719 config_host_data.set('CONFIG_BDRV_RO_WHITELIST',
1720 '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ')
1721endif
1722if get_option('block_drv_rw_whitelist') == ''
1723 config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '')
1724else
1725 config_host_data.set('CONFIG_BDRV_RW_WHITELIST',
1726 '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ')
1727endif
1728
Paolo Bonzini9c29b742021-10-07 15:08:14 +02001729foreach k : get_option('trace_backends')
1730 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
1731endforeach
1732config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02001733config_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority'))
Paolo Bonzini40c909f2022-04-20 17:33:49 +02001734if iasl.found()
1735 config_host_data.set_quoted('CONFIG_IASL', iasl.full_path())
Paolo Bonzini5dc46182021-10-13 13:19:00 +02001736endif
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001737config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1738config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1739config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1740config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1741config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09001742
1743qemu_firmwarepath = ''
1744foreach k : get_option('qemu_firmwarepath')
1745 qemu_firmwarepath += '"' + get_option('prefix') / k + '", '
1746endforeach
1747config_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath)
1748
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001749config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1750config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1751config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1752config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1753config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1754config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1755
Paolo Bonzinib0b43232022-04-20 17:33:54 +02001756if config_host.has_key('CONFIG_MODULES')
1757 config_host_data.set('CONFIG_STAMP', run_command(
1758 meson.current_source_dir() / 'scripts/qemu-stamp.py',
1759 meson.project_version(), get_option('pkgversion'), '--',
1760 meson.current_source_dir() / 'configure',
1761 capture: true, check: true).stdout().strip())
1762endif
1763
Paolo Bonzini35acbb32021-10-13 13:43:36 +02001764have_slirp_smbd = get_option('slirp_smbd') \
1765 .require(targetos != 'windows', error_message: 'Host smbd not supported on this platform.') \
1766 .allowed()
1767if have_slirp_smbd
1768 smbd_path = get_option('smbd')
1769 if smbd_path == ''
1770 smbd_path = (targetos == 'solaris' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd')
1771 endif
1772 config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path)
1773endif
1774
Paolo Bonzini823eb012021-11-08 14:18:17 +01001775config_host_data.set('HOST_' + host_arch.to_upper(), 1)
1776
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02001777if get_option('module_upgrades') and not enable_modules
1778 error('Cannot enable module-upgrades as modules are not enabled')
1779endif
1780config_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
1781
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001782config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001783config_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001784config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04001785config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzini537b7242021-10-07 15:08:12 +02001786config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02001787config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001788config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001789config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001790config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1791config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001792config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08001793config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02001794config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini75440602022-04-20 17:33:44 +02001795config_host_data.set('CONFIG_GIO', gio.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001796config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1797if glusterfs.found()
1798 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1799 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1800 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1801 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1802 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1803 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1804endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001805config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001806config_host_data.set('CONFIG_VTE', vte.found())
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001807config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001808config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001809config_host_data.set('CONFIG_EBPF', libbpf.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001810config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001811config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01001812config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Thomas Huthe6a52b32021-12-09 15:48:01 +01001813config_host_data.set('CONFIG_LIBSSH', libssh.found())
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001814config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001815config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
Sam Lie2848bc2022-05-31 18:50:11 +08001816config_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 +02001817config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzini488a8c72021-12-21 12:38:27 +01001818config_host_data.set('CONFIG_NUMA', numa.found())
Paolo Bonzini88b6e612022-04-20 17:33:40 +02001819config_host_data.set('CONFIG_OPENGL', opengl.found())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001820config_host_data.set('CONFIG_PROFILER', get_option('profiler'))
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001821config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini3730a732022-04-20 17:33:41 +02001822config_host_data.set('CONFIG_RDMA', rdma.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001823config_host_data.set('CONFIG_SDL', sdl.found())
1824config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01001825config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01001826config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01001827config_host_data.set('CONFIG_TPM', have_tpm)
Paolo Bonzini90540f32021-06-03 11:15:26 +02001828config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Paolo Bonzinie1723992021-10-07 15:08:21 +02001829config_host_data.set('CONFIG_VDE', vde.found())
Paolo Bonzini2df89d52022-04-20 17:34:07 +02001830config_host_data.set('CONFIG_VHOST_NET', have_vhost_net)
1831config_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user)
1832config_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa)
1833config_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel)
1834config_host_data.set('CONFIG_VHOST_USER', have_vhost_user)
1835config_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto)
1836config_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa)
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03001837config_host_data.set('CONFIG_VMNET', vmnet.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001838config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Xie Yongji2a2359b2022-05-23 16:46:09 +08001839config_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export)
Kshitij Suri95f85102022-04-08 07:13:34 +00001840config_host_data.set('CONFIG_PNG', png.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001841config_host_data.set('CONFIG_VNC', vnc.found())
1842config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001843config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01001844config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001845config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001846config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001847config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04001848config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02001849config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001850config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Daniel P. Berrangéd47b83b2022-04-26 17:00:43 +01001851config_host_data.set('CONFIG_TASN1', tasn1.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02001852config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
1853config_host_data.set('CONFIG_NETTLE', nettle.found())
Lei He4c5e5122022-05-25 17:01:14 +08001854config_host_data.set('CONFIG_HOGWEED', hogweed.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02001855config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04001856config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01001857config_host_data.set('CONFIG_STATX', has_statx)
Hanna Reitz4ce7a082022-02-23 10:23:40 +01001858config_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id)
Paolo Bonzinib1def332020-11-17 13:37:39 +01001859config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01001860config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01001861config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001862config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
Marc-André Lureauddece462021-10-06 14:18:09 +04001863if spice_protocol.found()
1864config_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
1865config_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
1866config_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
1867endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001868config_host_data.set('CONFIG_SPICE', spice.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01001869config_host_data.set('CONFIG_X11', x11.found())
Marc-André Lureau142ca622021-07-15 11:53:53 +04001870config_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
Daniele Buono9e62ba42020-12-04 18:06:14 -05001871config_host_data.set('CONFIG_CFI', get_option('cfi'))
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001872config_host_data.set('CONFIG_SELINUX', selinux.found())
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02001873config_host_data.set('CONFIG_XEN_BACKEND', xen.found())
1874if xen.found()
1875 # protect from xen.version() having less than three components
1876 xen_version = xen.version().split('.') + ['0', '0']
1877 xen_ctrl_version = xen_version[0] + \
1878 ('0' + xen_version[1]).substring(-2) + \
1879 ('0' + xen_version[2]).substring(-2)
1880 config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version)
1881endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001882config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1883config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1884config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1885config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1886
Paolo Bonzinia6305082021-10-07 15:08:15 +02001887config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001888config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
1889
Paolo Bonzini728c0a22021-10-13 11:52:03 +02001890have_coroutine_pool = get_option('coroutine_pool')
1891if get_option('debug_stack_usage') and have_coroutine_pool
1892 message('Disabling coroutine pool to measure stack usage')
1893 have_coroutine_pool = false
1894endif
1895config_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool)
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001896config_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
Paolo Bonzini728c0a22021-10-13 11:52:03 +02001897config_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001898config_host_data.set('CONFIG_GPROF', get_option('gprof'))
Paolo Bonzini406523f2021-10-13 11:43:54 +02001899config_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed())
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02001900config_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
Juan Quintelaabad1852022-09-02 18:51:25 +02001901config_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed())
Paolo Bonzini406523f2021-10-13 11:43:54 +02001902
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001903# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001904config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02001905config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
1906config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
Thomas Huth48f670e2020-11-18 18:10:52 +01001907config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001908config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001909config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001910config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001911config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001912config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Bin Mengd4093732022-08-02 15:51:58 +08001913if targetos == 'windows'
1914 config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h'))
1915endif
Thomas Huthded5d782020-11-14 11:10:11 +01001916
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001917# has_function
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001918config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001919config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
1920config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
1921config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
1922config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Peter Maydell86983432022-02-26 18:07:19 +00001923# Note that we need to specify prefix: here to avoid incorrectly
1924# thinking that Windows has posix_memalign()
1925config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>'))
Peter Maydell5c8c7142022-02-26 18:07:20 +00001926config_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc'))
Peter Maydell88454f82022-02-26 18:07:21 +00001927config_host_data.set('CONFIG_VALLOC', cc.has_function('valloc'))
1928config_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001929config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001930config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Keno Fischer029ed1b2022-02-27 17:35:20 -05001931config_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001932config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
1933config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
1934config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
1935config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
1936config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001937config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Andrew Deason59e35c72022-04-26 14:55:22 -05001938config_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001939config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001940config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001941config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Stefano Garzarella66dc5f92022-05-17 09:10:12 +02001942if rbd.found()
1943 config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS',
1944 cc.has_function('rbd_namespace_exists',
1945 dependencies: rbd,
1946 prefix: '#include <rbd/librbd.h>'))
1947endif
Li Zhijian911965a2021-09-10 15:02:55 +08001948if rdma.found()
1949 config_host_data.set('HAVE_IBV_ADVISE_MR',
1950 cc.has_function('ibv_advise_mr',
Paolo Bonzini3730a732022-04-20 17:33:41 +02001951 dependencies: rdma,
Li Zhijian911965a2021-09-10 15:02:55 +08001952 prefix: '#include <infiniband/verbs.h>'))
1953endif
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001954
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001955# has_header_symbol
1956config_host_data.set('CONFIG_BYTESWAP_H',
1957 cc.has_header_symbol('byteswap.h', 'bswap_32'))
1958config_host_data.set('CONFIG_EPOLL_CREATE1',
1959 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
1960config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
1961 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
1962 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
1963config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
1964 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
1965config_host_data.set('CONFIG_FIEMAP',
1966 cc.has_header('linux/fiemap.h') and
1967 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001968config_host_data.set('CONFIG_GETRANDOM',
1969 cc.has_function('getrandom') and
1970 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001971config_host_data.set('CONFIG_INOTIFY',
1972 cc.has_header_symbol('sys/inotify.h', 'inotify_init'))
1973config_host_data.set('CONFIG_INOTIFY1',
1974 cc.has_header_symbol('sys/inotify.h', 'inotify_init1'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001975config_host_data.set('CONFIG_MACHINE_BSWAP_H',
1976 cc.has_header_symbol('machine/bswap.h', 'bswap32',
1977 prefix: '''#include <sys/endian.h>
1978 #include <sys/types.h>'''))
1979config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
1980 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001981config_host_data.set('CONFIG_RTNETLINK',
1982 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
1983config_host_data.set('CONFIG_SYSMACROS',
1984 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001985config_host_data.set('HAVE_OPTRESET',
1986 cc.has_header_symbol('getopt.h', 'optreset'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04001987config_host_data.set('HAVE_IPPROTO_MPTCP',
1988 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Daniel P. Berrangé3cd3df22022-08-02 12:41:34 -04001989config_host_data.set('HAVE_SYS_MOUNT_FSCONFIG',
1990 cc.has_header_symbol('sys/mount.h', 'FSCONFIG_SET_FLAG'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001991
1992# has_member
1993config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
1994 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
1995 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001996config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
1997 cc.has_member('struct stat', 'st_atim',
1998 prefix: '#include <sys/stat.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001999
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002000# has_type
2001config_host_data.set('CONFIG_IOVEC',
2002 cc.has_type('struct iovec',
2003 prefix: '#include <sys/uio.h>'))
2004config_host_data.set('HAVE_UTMPX',
2005 cc.has_type('struct utmpx',
2006 prefix: '#include <utmpx.h>'))
2007
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002008config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002009 #include <sys/eventfd.h>
2010 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002011config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002012 #include <unistd.h>
2013 int main(void) {
2014 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
2015 return fdatasync(0);
2016 #else
2017 #error Not supported
2018 #endif
2019 }'''))
Andrew Deason8900c202022-03-15 22:52:25 -05002020
2021has_madvise = cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002022 #include <sys/types.h>
2023 #include <sys/mman.h>
2024 #include <stddef.h>
Andrew Deason8900c202022-03-15 22:52:25 -05002025 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''')
2026missing_madvise_proto = false
2027if has_madvise
2028 # Some platforms (illumos and Solaris before Solaris 11) provide madvise()
2029 # but forget to prototype it. In this case, has_madvise will be true (the
2030 # test program links despite a compile warning). To detect the
2031 # missing-prototype case, we try again with a definitely-bogus prototype.
2032 # This will only compile if the system headers don't provide the prototype;
2033 # otherwise the conflicting prototypes will cause a compiler error.
2034 missing_madvise_proto = cc.links(gnu_source_prefix + '''
2035 #include <sys/types.h>
2036 #include <sys/mman.h>
2037 #include <stddef.h>
2038 extern int madvise(int);
2039 int main(void) { return madvise(0); }''')
2040endif
2041config_host_data.set('CONFIG_MADVISE', has_madvise)
2042config_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto)
2043
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002044config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002045 #include <sys/mman.h>
2046 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002047config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02002048 #include <fcntl.h>
2049 #if !defined(AT_EMPTY_PATH)
2050 # error missing definition
2051 #else
2052 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
2053 #endif'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002054config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002055 #include <sys/mman.h>
2056 #include <stddef.h>
2057 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002058
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002059config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002060 #include <pthread.h>
2061
2062 static void *f(void *p) { return NULL; }
2063 int main(void)
2064 {
2065 pthread_t thread;
2066 pthread_create(&thread, 0, f, 0);
2067 pthread_setname_np(thread, "QEMU");
2068 return 0;
2069 }''', dependencies: threads))
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002070config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002071 #include <pthread.h>
2072
2073 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
2074 int main(void)
2075 {
2076 pthread_t thread;
2077 pthread_create(&thread, 0, f, 0);
2078 return 0;
2079 }''', dependencies: threads))
Longpeng(Mike)657ac982022-02-22 17:05:05 +08002080config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + '''
2081 #include <pthread.h>
2082 #include <time.h>
2083
2084 int main(void)
2085 {
2086 pthread_condattr_t attr
2087 pthread_condattr_init(&attr);
2088 pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
2089 return 0;
2090 }''', dependencies: threads))
Paolo Bonzini10f6b232021-10-07 15:08:19 +02002091
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002092config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02002093 #include <sys/signalfd.h>
2094 #include <stddef.h>
2095 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02002096config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02002097 #include <unistd.h>
2098 #include <fcntl.h>
2099 #include <limits.h>
2100
2101 int main(void)
2102 {
2103 int len, fd = 0;
2104 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
2105 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
2106 return 0;
2107 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002108
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002109config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
2110 #include <sys/mman.h>
2111 int main(int argc, char *argv[]) {
2112 return mlockall(MCL_FUTURE);
2113 }'''))
2114
Thomas Hutheea94532021-10-28 20:59:08 +02002115have_l2tpv3 = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002116if get_option('l2tpv3').allowed() and have_system
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002117 have_l2tpv3 = cc.has_type('struct mmsghdr',
2118 prefix: gnu_source_prefix + '''
2119 #include <sys/socket.h>
2120 #include <linux/ip.h>''')
Thomas Hutheea94532021-10-28 20:59:08 +02002121endif
2122config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
2123
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002124have_netmap = false
Paolo Bonzini43a363a2021-12-18 16:39:43 +01002125if get_option('netmap').allowed() and have_system
Paolo Bonzini837b84b2021-10-07 15:08:22 +02002126 have_netmap = cc.compiles('''
2127 #include <inttypes.h>
2128 #include <net/if.h>
2129 #include <net/netmap.h>
2130 #include <net/netmap_user.h>
2131 #if (NETMAP_API < 11) || (NETMAP_API > 15)
2132 #error
2133 #endif
2134 int main(void) { return 0; }''')
2135 if not have_netmap and get_option('netmap').enabled()
2136 error('Netmap headers not available')
2137 endif
2138endif
2139config_host_data.set('CONFIG_NETMAP', have_netmap)
2140
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002141# Work around a system header bug with some kernel/XFS header
2142# versions where they both try to define 'struct fsxattr':
2143# xfs headers will not try to redefine structs from linux headers
2144# if this macro is set.
2145config_host_data.set('HAVE_FSXATTR', cc.links('''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01002146 #include <linux/fs.h>
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02002147 struct fsxattr foo;
2148 int main(void) {
2149 return 0;
2150 }'''))
2151
Paolo Bonzinie46bd552021-06-03 11:57:04 +02002152# Some versions of Mac OS X incorrectly define SIZE_MAX
2153config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
2154 #include <stdint.h>
2155 #include <stdio.h>
2156 int main(int argc, char *argv[]) {
2157 return printf("%zu", SIZE_MAX);
2158 }''', args: ['-Werror']))
2159
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002160atomic_test = '''
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002161 #include <stdint.h>
2162 int main(void)
2163 {
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002164 @0@ x = 0, y = 0;
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002165 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
2166 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
2167 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
2168 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
2169 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
2170 return 0;
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002171 }'''
2172
2173# See if 64-bit atomic operations are supported.
2174# Note that without __atomic builtins, we can only
2175# assume atomic loads/stores max at pointer size.
2176config_host_data.set('CONFIG_ATOMIC64', cc.links(atomic_test.format('uint64_t')))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002177
Marc-André Lureau848126d2022-02-28 15:49:19 +04002178has_int128 = cc.links('''
2179 __int128_t a;
2180 __uint128_t b;
2181 int main (void) {
2182 a = a + b;
2183 b = a * b;
2184 a = a * a;
2185 return 0;
2186 }''')
2187
2188config_host_data.set('CONFIG_INT128', has_int128)
2189
2190if has_int128
Marc-André Lureaud2958fb2022-02-28 16:03:09 +04002191 # "do we have 128-bit atomics which are handled inline and specifically not
2192 # via libatomic". The reason we can't use libatomic is documented in the
2193 # comment starting "GCC is a house divided" in include/qemu/atomic128.h.
2194 has_atomic128 = cc.links(atomic_test.format('unsigned __int128'))
Marc-André Lureau848126d2022-02-28 15:49:19 +04002195
2196 config_host_data.set('CONFIG_ATOMIC128', has_atomic128)
2197
2198 if not has_atomic128
2199 has_cmpxchg128 = cc.links('''
2200 int main(void)
2201 {
2202 unsigned __int128 x = 0, y = 0;
2203 __sync_val_compare_and_swap_16(&x, y, x);
2204 return 0;
2205 }
2206 ''')
2207
2208 config_host_data.set('CONFIG_CMPXCHG128', has_cmpxchg128)
2209 endif
2210endif
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002211
2212config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
2213 #include <sys/auxv.h>
2214 int main(void) {
2215 return getauxval(AT_HWCAP) == 0;
2216 }'''))
2217
Paolo Bonzini0dae95d2022-04-20 17:33:43 +02002218config_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles('''
2219 #include <linux/usbdevice_fs.h>
2220
2221 #ifndef USBDEVFS_GET_CAPABILITIES
2222 #error "USBDEVFS_GET_CAPABILITIES undefined"
2223 #endif
2224
2225 #ifndef USBDEVFS_DISCONNECT_CLAIM
2226 #error "USBDEVFS_DISCONNECT_CLAIM undefined"
2227 #endif
2228
2229 int main(void) { return 0; }'''))
2230
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02002231have_keyring = get_option('keyring') \
2232 .require(targetos == 'linux', error_message: 'keyring is only available on Linux') \
2233 .require(cc.compiles('''
2234 #include <errno.h>
2235 #include <asm/unistd.h>
2236 #include <linux/keyctl.h>
2237 #include <sys/syscall.h>
2238 #include <unistd.h>
2239 int main(void) {
2240 return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0);
2241 }'''), error_message: 'keyctl syscall not available on this system').allowed()
2242config_host_data.set('CONFIG_SECRET_KEYRING', have_keyring)
2243
Paolo Bonzini622753d2021-11-08 13:38:58 +01002244have_cpuid_h = cc.links('''
2245 #include <cpuid.h>
2246 int main(void) {
2247 unsigned a, b, c, d;
2248 unsigned max = __get_cpuid_max(0, 0);
2249
2250 if (max >= 1) {
2251 __cpuid(1, a, b, c, d);
2252 }
2253
2254 if (max >= 7) {
2255 __cpuid_count(7, 0, a, b, c, d);
2256 }
2257
2258 return 0;
2259 }''')
2260config_host_data.set('CONFIG_CPUID_H', have_cpuid_h)
2261
2262config_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \
2263 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \
2264 .require(cc.links('''
2265 #pragma GCC push_options
2266 #pragma GCC target("avx2")
2267 #include <cpuid.h>
2268 #include <immintrin.h>
2269 static int bar(void *a) {
2270 __m256i x = *(__m256i *)a;
2271 return _mm256_testz_si256(x, x);
2272 }
2273 int main(int argc, char *argv[]) { return bar(argv[0]); }
2274 '''), error_message: 'AVX2 not available').allowed())
2275
2276config_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \
2277 .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \
2278 .require(cc.links('''
2279 #pragma GCC push_options
2280 #pragma GCC target("avx512f")
2281 #include <cpuid.h>
2282 #include <immintrin.h>
2283 static int bar(void *a) {
2284 __m512i x = *(__m512i *)a;
2285 return _mm512_test_epi64_mask(x, x);
2286 }
2287 int main(int argc, char *argv[]) { return bar(argv[0]); }
2288 '''), error_message: 'AVX512F not available').allowed())
2289
Paolo Bonzini3730a732022-04-20 17:33:41 +02002290have_pvrdma = get_option('pvrdma') \
2291 .require(rdma.found(), error_message: 'PVRDMA requires OpenFabrics libraries') \
Juan Quintela354d2d92022-05-02 15:11:19 +02002292 .require(cc.compiles(gnu_source_prefix + '''
2293 #include <sys/mman.h>
Paolo Bonzini3730a732022-04-20 17:33:41 +02002294 int main(void)
2295 {
2296 char buf = 0;
2297 void *addr = &buf;
2298 addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED);
2299
2300 return 0;
2301 }'''), error_message: 'PVRDMA requires mremap').allowed()
2302
2303if have_pvrdma
Juan Quintela354d2d92022-05-02 15:11:19 +02002304 config_host_data.set('LEGACY_RDMA_REG_MR', not cc.links('''
Paolo Bonzini3730a732022-04-20 17:33:41 +02002305 #include <infiniband/verbs.h>
2306 int main(void)
2307 {
2308 struct ibv_mr *mr;
2309 struct ibv_pd *pd = NULL;
2310 size_t length = 10;
2311 uint64_t iova = 0;
2312 int access = 0;
2313 void *addr = NULL;
2314
2315 mr = ibv_reg_mr_iova(pd, addr, length, iova, access);
2316 ibv_dereg_mr(mr);
2317 return 0;
2318 }'''))
2319endif
2320
Paolo Bonzinib87df902021-11-08 13:52:11 +01002321if get_option('membarrier').disabled()
2322 have_membarrier = false
2323elif targetos == 'windows'
2324 have_membarrier = true
2325elif targetos == 'linux'
2326 have_membarrier = cc.compiles('''
2327 #include <linux/membarrier.h>
2328 #include <sys/syscall.h>
2329 #include <unistd.h>
2330 #include <stdlib.h>
2331 int main(void) {
2332 syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
2333 syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
2334 exit(0);
2335 }''')
2336endif
2337config_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \
2338 .require(have_membarrier, error_message: 'membarrier system call not available') \
2339 .allowed())
2340
Paolo Bonzini34b52612021-11-08 14:02:42 +01002341have_afalg = get_option('crypto_afalg') \
2342 .require(cc.compiles(gnu_source_prefix + '''
2343 #include <errno.h>
2344 #include <sys/types.h>
2345 #include <sys/socket.h>
2346 #include <linux/if_alg.h>
2347 int main(void) {
2348 int sock;
2349 sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
2350 return sock;
2351 }
2352 '''), error_message: 'AF_ALG requested but could not be detected').allowed()
2353config_host_data.set('CONFIG_AF_ALG', have_afalg)
2354
Marc-André Lureau9d734b82022-04-01 15:50:05 +04002355config_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol(
2356 'linux/vm_sockets.h', 'AF_VSOCK',
2357 prefix: '#include <sys/socket.h>',
2358))
Paolo Bonzinibd87a362021-10-07 15:08:25 +02002359
Marc-André Lureau8821a382022-02-01 16:53:43 +04002360have_vss = false
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002361have_vss_sdk = false # old xp/2003 SDK
Marc-André Lureau8821a382022-02-01 16:53:43 +04002362if targetos == 'windows' and link_language == 'cpp'
2363 have_vss = cxx.compiles('''
2364 #define __MIDL_user_allocate_free_DEFINED__
Marc-André Lureau32478cb2022-02-22 23:40:01 +04002365 #include <vss.h>
Marc-André Lureau8821a382022-02-01 16:53:43 +04002366 int main(void) { return VSS_CTX_BACKUP; }''')
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002367 have_vss_sdk = cxx.has_header('vscoordint.h')
Marc-André Lureau8821a382022-02-01 16:53:43 +04002368endif
Marc-André Lureau872b69e2022-02-22 23:40:02 +04002369config_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
Marc-André Lureau8821a382022-02-01 16:53:43 +04002370
Paolo Bonzini859aef02020-08-04 18:14:26 +02002371foreach k, v: config_host
Paolo Bonzinice6119d2022-04-20 17:33:55 +02002372 if k.startswith('CONFIG_')
Paolo Bonzini859aef02020-08-04 18:14:26 +02002373 config_host_data.set(k, v == 'y' ? 1 : v)
2374 endif
2375endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02002376
Richard Henderson6391c772022-04-17 11:30:06 -07002377# Older versions of MinGW do not import _lock_file and _unlock_file properly.
2378# This was fixed for v6.0.0 with commit b48e3ac8969d.
2379if targetos == 'windows'
2380 config_host_data.set('HAVE__LOCK_FILE', cc.links('''
2381 #include <stdio.h>
2382 int main(void) {
2383 _lock_file(NULL);
2384 _unlock_file(NULL);
2385 return 0;
2386 }''', name: '_lock_file and _unlock_file'))
2387endif
2388
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002389########################
2390# Target configuration #
2391########################
2392
Paolo Bonzini2becc362020-02-03 11:42:03 +01002393minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04002394config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04002395config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002396config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002397config_devices_mak_list = []
2398config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02002399config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002400config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002401
2402disassemblers = {
2403 'alpha' : ['CONFIG_ALPHA_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002404 'avr' : ['CONFIG_AVR_DIS'],
2405 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06002406 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002407 'hppa' : ['CONFIG_HPPA_DIS'],
2408 'i386' : ['CONFIG_I386_DIS'],
2409 'x86_64' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002410 'm68k' : ['CONFIG_M68K_DIS'],
2411 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
2412 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002413 'nios2' : ['CONFIG_NIOS2_DIS'],
2414 'or1k' : ['CONFIG_OPENRISC_DIS'],
2415 'ppc' : ['CONFIG_PPC_DIS'],
2416 'riscv' : ['CONFIG_RISCV_DIS'],
2417 'rx' : ['CONFIG_RX_DIS'],
2418 's390' : ['CONFIG_S390_DIS'],
2419 'sh4' : ['CONFIG_SH4_DIS'],
2420 'sparc' : ['CONFIG_SPARC_DIS'],
2421 'xtensa' : ['CONFIG_XTENSA_DIS'],
Song Gaoaae17462022-06-06 20:43:06 +08002422 'loongarch' : ['CONFIG_LOONGARCH_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002423}
2424if link_language == 'cpp'
2425 disassemblers += {
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002426 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
2427 }
2428endif
2429
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02002430have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01002431host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02002432 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01002433 (have_tpm ? ['CONFIG_TPM=y'] : []) + \
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02002434 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02002435 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini88b6e612022-04-20 17:33:40 +02002436 (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01002437 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02002438 (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
2439 (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
2440 (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01002441 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01002442 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
Paolo Bonzini3730a732022-04-20 17:33:41 +02002443 (have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \
Jagannathan Raman55116962022-06-13 16:26:24 -04002444 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
2445 (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01002446
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002447ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002448
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002449default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
2450actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002451fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002452foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04002453 config_target = { 'TARGET_NAME': target.split('-')[0] }
2454 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002455 if targetos != 'linux'
2456 if default_targets
2457 continue
2458 endif
2459 error('Target @0@ is only available on a Linux host'.format(target))
2460 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04002461 config_target += { 'CONFIG_LINUX_USER': 'y' }
2462 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002463 if 'CONFIG_BSD' not in config_host
2464 if default_targets
2465 continue
2466 endif
2467 error('Target @0@ is only available on a BSD host'.format(target))
2468 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04002469 config_target += { 'CONFIG_BSD_USER': 'y' }
2470 elif target.endswith('softmmu')
2471 config_target += { 'CONFIG_SOFTMMU': 'y' }
2472 endif
2473 if target.endswith('-user')
2474 config_target += {
2475 'CONFIG_USER_ONLY': 'y',
2476 'CONFIG_QEMU_INTERP_PREFIX':
Paolo Bonzinice6119d2022-04-20 17:33:55 +02002477 get_option('interp_prefix').replace('%M', config_target['TARGET_NAME'])
Paolo Bonzini765686d2020-09-18 06:37:21 -04002478 }
2479 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002480
Paolo Bonzini0a189112020-11-17 14:58:32 +01002481 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04002482 foreach sym: accelerators
2483 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
2484 config_target += { sym: 'y' }
2485 config_all += { sym: 'y' }
Paolo Bonzini23a77b22020-12-14 12:01:45 +01002486 if sym == 'CONFIG_TCG' and tcg_arch == 'tci'
2487 config_target += { 'CONFIG_TCG_INTERPRETER': 'y' }
Paolo Bonzini8a199802020-09-18 05:37:01 -04002488 endif
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002489 if target in modular_tcg
2490 config_target += { 'CONFIG_TCG_MODULAR': 'y' }
2491 else
2492 config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
2493 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01002494 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04002495 endif
2496 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01002497 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002498 if default_targets
2499 continue
2500 endif
2501 error('No accelerator available for target @0@'.format(target))
2502 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04002503
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002504 actual_target_dirs += target
Alex Bennée812b31d2021-07-07 14:17:43 +01002505 config_target += keyval.load('configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002506 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04002507
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002508 if 'TARGET_NEED_FDT' in config_target
2509 fdt_required += target
2510 endif
2511
Paolo Bonzinifa731682020-09-21 05:19:07 -04002512 # Add default keys
2513 if 'TARGET_BASE_ARCH' not in config_target
2514 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
2515 endif
2516 if 'TARGET_ABI_DIR' not in config_target
2517 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
2518 endif
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04002519 if 'TARGET_BIG_ENDIAN' not in config_target
2520 config_target += {'TARGET_BIG_ENDIAN': 'n'}
2521 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02002522
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002523 foreach k, v: disassemblers
Paolo Bonzini823eb012021-11-08 14:18:17 +01002524 if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
Paolo Bonzinica0fc782020-09-01 06:04:28 -04002525 foreach sym: v
2526 config_target += { sym: 'y' }
2527 config_all_disas += { sym: 'y' }
2528 endforeach
2529 endif
2530 endforeach
2531
Paolo Bonzini859aef02020-08-04 18:14:26 +02002532 config_target_data = configuration_data()
2533 foreach k, v: config_target
2534 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
2535 # do nothing
2536 elif ignored.contains(k)
2537 # do nothing
2538 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04002539 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
2540 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02002541 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04002542 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02002543 config_target_data.set_quoted(k, v)
2544 elif v == 'y'
2545 config_target_data.set(k, 1)
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04002546 elif v == 'n'
2547 config_target_data.set(k, 0)
Paolo Bonzini859aef02020-08-04 18:14:26 +02002548 else
2549 config_target_data.set(k, v)
2550 endif
2551 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01002552 config_target_data.set('QEMU_ARCH',
2553 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02002554 config_target_h += {target: configure_file(output: target + '-config-target.h',
2555 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002556
2557 if target.endswith('-softmmu')
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01002558 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002559 config_devices_mak = target + '-config-devices.mak'
2560 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01002561 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01002562 output: config_devices_mak,
2563 depfile: config_devices_mak + '.d',
2564 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01002565 command: [minikconf,
2566 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01002567 config_devices_mak, '@DEPFILE@', '@INPUT@',
Philippe Mathieu-Daudéf4063f92021-07-07 14:17:40 +01002568 host_kconfig, accel_kconfig,
2569 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'])
Paolo Bonzini859aef02020-08-04 18:14:26 +02002570
2571 config_devices_data = configuration_data()
2572 config_devices = keyval.load(config_devices_mak)
2573 foreach k, v: config_devices
2574 config_devices_data.set(k, 1)
2575 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002576 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02002577 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
2578 configuration: config_devices_data)}
2579 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04002580 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01002581 endif
2582 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002583endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002584target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002585
Paolo Bonzini2becc362020-02-03 11:42:03 +01002586# This configuration is used to build files that are shared by
2587# multiple binaries, and then extracted out of the "common"
2588# static_library target.
2589#
2590# We do not use all_sources()/all_dependencies(), because it would
2591# build literally all source files, including devices only used by
2592# targets that are not built for this compilation. The CONFIG_ALL
2593# pseudo symbol replaces it.
2594
Paolo Bonzini05512f52020-09-16 15:31:11 -04002595config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01002596config_all += config_host
2597config_all += config_all_disas
2598config_all += {
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02002599 'CONFIG_XEN': xen.found(),
Paolo Bonzini2becc362020-02-03 11:42:03 +01002600 'CONFIG_SOFTMMU': have_system,
2601 'CONFIG_USER_ONLY': have_user,
2602 'CONFIG_ALL': true,
2603}
2604
Paolo Bonzinieed56e92021-11-10 11:01:26 +01002605target_configs_h = []
2606foreach target: target_dirs
2607 target_configs_h += config_target_h[target]
2608 target_configs_h += config_devices_h.get(target, [])
2609endforeach
2610genh += custom_target('config-poison.h',
2611 input: [target_configs_h],
2612 output: 'config-poison.h',
2613 capture: true,
2614 command: [find_program('scripts/make-config-poison.sh'),
2615 target_configs_h])
2616
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002617##############
2618# Submodules #
2619##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002620
2621capstone = not_found
Thomas Huth83602082022-05-16 16:58:23 +02002622if not get_option('capstone').auto() or have_system or have_user
Thomas Huth43ecd162022-05-16 16:58:22 +02002623 capstone = dependency('capstone', version: '>=3.0.5',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01002624 kwargs: static_kwargs, method: 'pkg-config',
Thomas Huth83602082022-05-16 16:58:23 +02002625 required: get_option('capstone'))
Daniel P. Berrangé8f4aea72021-07-09 15:29:31 +01002626
2627 # Some versions of capstone have broken pkg-config file
2628 # that reports a wrong -I path, causing the #include to
2629 # fail later. If the system has such a broken version
2630 # do not use it.
2631 if capstone.found() and not cc.compiles('#include <capstone.h>',
2632 dependencies: [capstone])
2633 capstone = not_found
Thomas Huth83602082022-05-16 16:58:23 +02002634 if get_option('capstone').enabled()
2635 error('capstone requested, but it does not appear to work')
Daniel P. Berrangé8f4aea72021-07-09 15:29:31 +01002636 endif
2637 endif
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002638endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002639
Jagannathan Raman55116962022-06-13 16:26:24 -04002640libvfio_user_dep = not_found
2641if have_system and vfio_user_server_allowed
2642 have_internal = fs.exists(meson.current_source_dir() / 'subprojects/libvfio-user/meson.build')
2643
2644 if not have_internal
2645 error('libvfio-user source not found - please pull git submodule')
2646 endif
2647
2648 libvfio_user_proj = subproject('libvfio-user')
2649
2650 libvfio_user_lib = libvfio_user_proj.get_variable('libvfio_user_dep')
2651
2652 libvfio_user_dep = declare_dependency(dependencies: [libvfio_user_lib])
2653endif
2654
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002655fdt = not_found
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002656if have_system
Philippe Mathieu-Daudéc593d842022-02-08 11:19:46 +01002657 fdt_opt = get_option('fdt')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002658 if fdt_opt in ['enabled', 'auto', 'system']
2659 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01002660 fdt = cc.find_library('fdt', kwargs: static_kwargs,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002661 required: fdt_opt == 'system' or
2662 fdt_opt == 'enabled' and not have_internal)
2663 if fdt.found() and cc.links('''
2664 #include <libfdt.h>
2665 #include <libfdt_env.h>
Thomas Huthde47b0f2022-01-18 18:05:48 +01002666 int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002667 dependencies: fdt)
2668 fdt_opt = 'system'
Thomas Huth6c228532021-08-27 14:09:00 +02002669 elif fdt_opt == 'system'
2670 error('system libfdt requested, but it is too old (1.5.1 or newer required)')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002671 elif have_internal
2672 fdt_opt = 'internal'
2673 else
2674 fdt_opt = 'disabled'
Thomas Huth87daf892021-08-27 14:08:59 +02002675 fdt = not_found
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002676 endif
2677 endif
2678 if fdt_opt == 'internal'
2679 fdt_files = files(
2680 'dtc/libfdt/fdt.c',
2681 'dtc/libfdt/fdt_ro.c',
2682 'dtc/libfdt/fdt_wip.c',
2683 'dtc/libfdt/fdt_sw.c',
2684 'dtc/libfdt/fdt_rw.c',
2685 'dtc/libfdt/fdt_strerror.c',
2686 'dtc/libfdt/fdt_empty_tree.c',
2687 'dtc/libfdt/fdt_addresses.c',
2688 'dtc/libfdt/fdt_overlay.c',
2689 'dtc/libfdt/fdt_check.c',
2690 )
2691
2692 fdt_inc = include_directories('dtc/libfdt')
2693 libfdt = static_library('fdt',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01002694 build_by_default: false,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002695 sources: fdt_files,
2696 include_directories: fdt_inc)
2697 fdt = declare_dependency(link_with: libfdt,
2698 include_directories: fdt_inc)
2699 endif
Philippe Mathieu-Daudéc593d842022-02-08 11:19:46 +01002700else
2701 fdt_opt = 'disabled'
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002702endif
2703if not fdt.found() and fdt_required.length() > 0
2704 error('fdt not available but required by targets ' + ', '.join(fdt_required))
2705endif
2706
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002707config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002708config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002709config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002710
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002711#####################
2712# Generated sources #
2713#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002714
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002715genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002716
Marc-André Lureau3f885652019-07-15 18:06:04 +04002717hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04002718shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002719qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002720qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
2721 meson.current_source_dir() / 'scripts/qapi/commands.py',
2722 meson.current_source_dir() / 'scripts/qapi/common.py',
2723 meson.current_source_dir() / 'scripts/qapi/error.py',
2724 meson.current_source_dir() / 'scripts/qapi/events.py',
2725 meson.current_source_dir() / 'scripts/qapi/expr.py',
2726 meson.current_source_dir() / 'scripts/qapi/gen.py',
2727 meson.current_source_dir() / 'scripts/qapi/introspect.py',
2728 meson.current_source_dir() / 'scripts/qapi/parser.py',
2729 meson.current_source_dir() / 'scripts/qapi/schema.py',
2730 meson.current_source_dir() / 'scripts/qapi/source.py',
2731 meson.current_source_dir() / 'scripts/qapi/types.py',
2732 meson.current_source_dir() / 'scripts/qapi/visit.py',
2733 meson.current_source_dir() / 'scripts/qapi/common.py',
2734 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002735]
2736
2737tracetool = [
2738 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002739 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002740]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002741tracetool_depends = files(
2742 'scripts/tracetool/backend/log.py',
2743 'scripts/tracetool/backend/__init__.py',
2744 'scripts/tracetool/backend/dtrace.py',
2745 'scripts/tracetool/backend/ftrace.py',
2746 'scripts/tracetool/backend/simple.py',
2747 'scripts/tracetool/backend/syslog.py',
2748 'scripts/tracetool/backend/ust.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002749 'scripts/tracetool/format/ust_events_c.py',
2750 'scripts/tracetool/format/ust_events_h.py',
2751 'scripts/tracetool/format/__init__.py',
2752 'scripts/tracetool/format/d.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002753 'scripts/tracetool/format/simpletrace_stap.py',
2754 'scripts/tracetool/format/c.py',
2755 'scripts/tracetool/format/h.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002756 'scripts/tracetool/format/log_stap.py',
2757 'scripts/tracetool/format/stap.py',
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002758 'scripts/tracetool/__init__.py',
2759 'scripts/tracetool/transform.py',
2760 'scripts/tracetool/vcpu.py'
2761)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002762
Marc-André Lureau2c273f32019-07-15 17:10:19 +04002763qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
2764 meson.current_source_dir(),
Paolo Bonzinib0b43232022-04-20 17:33:54 +02002765 get_option('pkgversion'), meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04002766qemu_version = custom_target('qemu-version.h',
2767 output: 'qemu-version.h',
2768 command: qemu_version_cmd,
2769 capture: true,
2770 build_by_default: true,
2771 build_always_stale: true)
2772genh += qemu_version
2773
Marc-André Lureau3f885652019-07-15 18:06:04 +04002774hxdep = []
2775hx_headers = [
2776 ['qemu-options.hx', 'qemu-options.def'],
2777 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
2778]
2779if have_system
2780 hx_headers += [
2781 ['hmp-commands.hx', 'hmp-commands.h'],
2782 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
2783 ]
2784endif
2785foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002786 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04002787 input: files(d[0]),
2788 output: d[1],
2789 capture: true,
2790 build_by_default: true, # to be removed when added to a target
2791 command: [hxtool, '-h', '@INPUT0@'])
2792endforeach
2793genh += hxdep
2794
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002795###################
2796# Collect sources #
2797###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002798
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02002799authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002800blockdev_ss = ss.source_set()
2801block_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002802chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002803common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002804crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02002805hwcore_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002806io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002807qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02002808qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002809softmmu_ss = ss.source_set()
2810specific_fuzz_ss = ss.source_set()
2811specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002812stub_ss = ss.source_set()
2813trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002814user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002815util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002816
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002817# accel modules
2818qtest_module_ss = ss.source_set()
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002819tcg_module_ss = ss.source_set()
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002820
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002821modules = {}
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002822target_modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002823hw_arch = {}
2824target_arch = {}
2825target_softmmu_arch = {}
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02002826target_user_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002827
2828###############
2829# Trace files #
2830###############
2831
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002832# TODO: add each directory to the subdirs from its own meson.build, once
2833# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002834trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002835 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01002836 'qapi',
2837 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002838 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01002839 'util',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002840]
Warner Losh6ddc1ab2022-01-08 17:37:23 -07002841if have_linux_user
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002842 trace_events_subdirs += [ 'linux-user' ]
2843endif
Warner Losh6ddc1ab2022-01-08 17:37:23 -07002844if have_bsd_user
2845 trace_events_subdirs += [ 'bsd-user' ]
2846endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002847if have_block
2848 trace_events_subdirs += [
2849 'authz',
2850 'block',
2851 'io',
2852 'nbd',
2853 'scsi',
2854 ]
2855endif
2856if have_system
2857 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002858 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002859 'audio',
2860 'backends',
2861 'backends/tpm',
2862 'chardev',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002863 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002864 'hw/9pfs',
2865 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08002866 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002867 'hw/alpha',
2868 'hw/arm',
2869 'hw/audio',
2870 'hw/block',
2871 'hw/block/dataplane',
2872 'hw/char',
2873 'hw/display',
2874 'hw/dma',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002875 'hw/hyperv',
2876 'hw/i2c',
2877 'hw/i386',
2878 'hw/i386/xen',
2879 'hw/ide',
2880 'hw/input',
2881 'hw/intc',
2882 'hw/isa',
2883 'hw/mem',
2884 'hw/mips',
2885 'hw/misc',
2886 'hw/misc/macio',
2887 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08002888 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01002889 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02002890 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002891 'hw/nvram',
2892 'hw/pci',
2893 'hw/pci-host',
2894 'hw/ppc',
2895 'hw/rdma',
2896 'hw/rdma/vmw',
2897 'hw/rtc',
2898 'hw/s390x',
2899 'hw/scsi',
2900 'hw/sd',
BALATON Zoltanad52cfc2021-10-29 23:02:09 +02002901 'hw/sh4',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002902 'hw/sparc',
2903 'hw/sparc64',
2904 'hw/ssi',
2905 'hw/timer',
2906 'hw/tpm',
2907 'hw/usb',
2908 'hw/vfio',
2909 'hw/virtio',
2910 'hw/watchdog',
2911 'hw/xen',
2912 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002913 'migration',
2914 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02002915 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002916 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05002917 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002918 ]
2919endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002920if have_system or have_user
2921 trace_events_subdirs += [
2922 'accel/tcg',
2923 'hw/core',
2924 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02002925 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002926 'target/hppa',
2927 'target/i386',
2928 'target/i386/kvm',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02002929 'target/mips/tcg',
Richard Henderson6f83e272022-02-25 21:06:20 -10002930 'target/nios2',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002931 'target/ppc',
2932 'target/riscv',
2933 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08002934 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002935 'target/sparc',
2936 ]
2937endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002938
Marc-André Lureau0df750e2020-11-25 14:06:37 +04002939vhost_user = not_found
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02002940if targetos == 'linux' and have_vhost_user
Marc-André Lureau0df750e2020-11-25 14:06:37 +04002941 libvhost_user = subproject('libvhost-user')
2942 vhost_user = libvhost_user.get_variable('vhost_user_dep')
2943endif
2944
Xie Yongjia6caeee2022-05-23 16:46:08 +08002945libvduse = not_found
2946if have_libvduse
2947 libvduse_proj = subproject('libvduse')
2948 libvduse = libvduse_proj.get_variable('libvduse_dep')
2949endif
2950
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +01002951# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
2952# that is filled in by qapi/.
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002953subdir('qapi')
2954subdir('qobject')
2955subdir('stubs')
2956subdir('trace')
2957subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04002958subdir('qom')
2959subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002960subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04002961subdir('ui')
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02002962subdir('hw')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002963
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002964
2965if enable_modules
2966 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
2967 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
2968endif
2969
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02002970qom_ss = qom_ss.apply(config_host, strict: false)
2971libqom = static_library('qom', qom_ss.sources() + genh,
2972 dependencies: [qom_ss.dependencies()],
2973 name_suffix: 'fa')
2974qom = declare_dependency(link_whole: libqom)
2975
2976event_loop_base = files('event-loop-base.c')
2977event_loop_base = static_library('event-loop-base', sources: event_loop_base + genh,
2978 build_by_default: true)
2979event_loop_base = declare_dependency(link_whole: event_loop_base,
2980 dependencies: [qom])
2981
Paolo Bonzini2becc362020-02-03 11:42:03 +01002982stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002983
2984util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01002985util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002986libqemuutil = static_library('qemuutil',
2987 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +02002988 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002989qemuutil = declare_dependency(link_with: libqemuutil,
Nicolas Saenz Julienne70ac26b2022-04-25 09:57:22 +02002990 sources: genh + version_res,
2991 dependencies: [event_loop_base])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002992
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01002993if have_system or have_user
2994 decodetree = generator(find_program('scripts/decodetree.py'),
2995 output: 'decode-@BASENAME@.c.inc',
2996 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
2997 subdir('libdecnumber')
2998 subdir('target')
2999endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003000
Paolo Bonzini478e9432020-08-17 12:47:55 +02003001subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04003002subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04003003subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003004subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04003005subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04003006
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003007if have_block
3008 block_ss.add(files(
3009 'block.c',
3010 'blockjob.c',
3011 'job.c',
3012 'qemu-io-cmds.c',
3013 ))
Paolo Bonzini406523f2021-10-13 11:43:54 +02003014 if config_host_data.get('CONFIG_REPLICATION')
3015 block_ss.add(files('replication.c'))
3016 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003017
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003018 subdir('nbd')
3019 subdir('scsi')
3020 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003021
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003022 blockdev_ss.add(files(
3023 'blockdev.c',
3024 'blockdev-nbd.c',
3025 'iothread.c',
3026 'job-qmp.c',
3027 ), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02003028
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01003029 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
3030 # os-win32.c does not
3031 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
3032 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
3033endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02003034
3035common_ss.add(files('cpus-common.c'))
3036
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02003037subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003038
Richard Hendersonf3433462020-09-12 10:47:33 -07003039common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02003040specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003041
Richard Henderson44b99a62021-03-22 12:24:26 +01003042# Work around a gcc bug/misfeature wherein constant propagation looks
3043# through an alias:
3044# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
3045# to guess that a const variable is always zero. Without lto, this is
3046# impossible, as the alias is restricted to page-vary-common.c. Indeed,
3047# without lto, not even the alias is required -- we simply use different
3048# declarations in different compilation units.
3049pagevary = files('page-vary-common.c')
3050if get_option('b_lto')
3051 pagevary_flags = ['-fno-lto']
3052 if get_option('cfi')
3053 pagevary_flags += '-fno-sanitize=cfi-icall'
3054 endif
Thomas Huth54c9b192022-03-30 13:48:08 +02003055 pagevary = static_library('page-vary-common', sources: pagevary + genh,
Richard Henderson44b99a62021-03-22 12:24:26 +01003056 c_args: pagevary_flags)
3057 pagevary = declare_dependency(link_with: pagevary)
3058endif
3059common_ss.add(pagevary)
Richard Henderson6670d4d2021-03-22 12:24:24 +01003060specific_ss.add(files('page-vary.c'))
3061
Marc-André Lureauab318052019-07-24 19:23:16 +04003062subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04003063subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04003064subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003065subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04003066subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04003067subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00003068subdir('semihosting')
Richard Henderson104cc2c2021-03-08 12:04:33 -08003069subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08003070subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04003071subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003072subdir('plugins')
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01003073subdir('ebpf')
3074
3075common_user_inc = []
3076
3077subdir('common-user')
Marc-André Lureaub309c322019-08-18 19:20:37 +04003078subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04003079subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003080
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003081# needed for fuzzing binaries
3082subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003083subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02003084
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003085# accel modules
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02003086tcg_real_module_ss = ss.source_set()
3087tcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
3088specific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
3089target_modules += { 'accel' : { 'qtest': qtest_module_ss,
3090 'tcg': tcg_real_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02003091
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003092########################
3093# Library dependencies #
3094########################
3095
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003096modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003097modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003098modinfo_files = []
3099
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003100block_mods = []
3101softmmu_mods = []
3102foreach d, list : modules
3103 foreach m, module_ss : list
3104 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02003105 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003106 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
3107 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
3108 if d == 'block'
3109 block_mods += sl
3110 else
3111 softmmu_mods += sl
3112 endif
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003113 if module_ss.sources() != []
3114 # FIXME: Should use sl.extract_all_objects(recursive: true) as
3115 # input. Sources can be used multiple times but objects are
3116 # unique when it comes to lookup in compile_commands.json.
3117 # Depnds on a mesion version with
3118 # https://github.com/mesonbuild/meson/pull/8900
3119 modinfo_files += custom_target(d + '-' + m + '.modinfo',
3120 output: d + '-' + m + '.modinfo',
Paolo Bonziniac347112021-07-21 18:51:57 +02003121 input: module_ss.sources() + genh,
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003122 capture: true,
Paolo Bonziniac347112021-07-21 18:51:57 +02003123 command: [modinfo_collect, module_ss.sources()])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02003124 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003125 else
3126 if d == 'block'
3127 block_ss.add_all(module_ss)
3128 else
3129 softmmu_ss.add_all(module_ss)
3130 endif
3131 endif
3132 endforeach
3133endforeach
3134
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003135foreach d, list : target_modules
3136 foreach m, module_ss : list
3137 if enable_modules and targetos != 'windows'
3138 foreach target : target_dirs
3139 if target.endswith('-softmmu')
3140 config_target = config_target_mak[target]
3141 config_target += config_host
3142 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3143 c_args = ['-DNEED_CPU_H',
3144 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3145 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
3146 target_module_ss = module_ss.apply(config_target, strict: false)
3147 if target_module_ss.sources() != []
3148 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
3149 sl = static_library(module_name,
3150 [genh, target_module_ss.sources()],
3151 dependencies: [modulecommon, target_module_ss.dependencies()],
3152 include_directories: target_inc,
3153 c_args: c_args,
3154 pic: true)
3155 softmmu_mods += sl
3156 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
3157 modinfo_files += custom_target(module_name + '.modinfo',
3158 output: module_name + '.modinfo',
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003159 input: target_module_ss.sources() + genh,
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003160 capture: true,
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02003161 command: [modinfo_collect, '--target', target, target_module_ss.sources()])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02003162 endif
3163 endif
3164 endforeach
3165 else
3166 specific_ss.add_all(module_ss)
3167 endif
3168 endforeach
3169endforeach
3170
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003171if enable_modules
Jose R. Ziviani05d68142022-05-28 00:20:35 +02003172 foreach target : target_dirs
3173 if target.endswith('-softmmu')
3174 config_target = config_target_mak[target]
3175 config_devices_mak = target + '-config-devices.mak'
3176 modinfo_src = custom_target('modinfo-' + target + '.c',
3177 output: 'modinfo-' + target + '.c',
3178 input: modinfo_files,
3179 command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'],
3180 capture: true)
3181
3182 modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src)
3183 modinfo_dep = declare_dependency(link_with: modinfo_lib)
3184
3185 arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH']
3186 hw_arch[arch].add(modinfo_dep)
3187 endif
3188 endforeach
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02003189endif
3190
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003191nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08003192undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003193block_syms = custom_target('block.syms', output: 'block.syms',
3194 input: [libqemuutil, block_mods],
3195 capture: true,
3196 command: [undefsym, nm, '@INPUT@'])
3197qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
3198 input: [libqemuutil, softmmu_mods],
3199 capture: true,
3200 command: [undefsym, nm, '@INPUT@'])
3201
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02003202authz_ss = authz_ss.apply(config_host, strict: false)
3203libauthz = static_library('authz', authz_ss.sources() + genh,
3204 dependencies: [authz_ss.dependencies()],
3205 name_suffix: 'fa',
3206 build_by_default: false)
3207
3208authz = declare_dependency(link_whole: libauthz,
3209 dependencies: qom)
3210
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02003211crypto_ss = crypto_ss.apply(config_host, strict: false)
3212libcrypto = static_library('crypto', crypto_ss.sources() + genh,
3213 dependencies: [crypto_ss.dependencies()],
3214 name_suffix: 'fa',
3215 build_by_default: false)
3216
3217crypto = declare_dependency(link_whole: libcrypto,
3218 dependencies: [authz, qom])
3219
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02003220io_ss = io_ss.apply(config_host, strict: false)
3221libio = static_library('io', io_ss.sources() + genh,
3222 dependencies: [io_ss.dependencies()],
3223 link_with: libqemuutil,
3224 name_suffix: 'fa',
3225 build_by_default: false)
3226
3227io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
3228
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02003229libmigration = static_library('migration', sources: migration_files + genh,
3230 name_suffix: 'fa',
3231 build_by_default: false)
3232migration = declare_dependency(link_with: libmigration,
3233 dependencies: [zlib, qom, io])
3234softmmu_ss.add(migration)
3235
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003236block_ss = block_ss.apply(config_host, strict: false)
3237libblock = static_library('block', block_ss.sources() + genh,
3238 dependencies: block_ss.dependencies(),
3239 link_depends: block_syms,
3240 name_suffix: 'fa',
3241 build_by_default: false)
3242
3243block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003244 link_args: '@block.syms',
3245 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04003246
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003247blockdev_ss = blockdev_ss.apply(config_host, strict: false)
3248libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
3249 dependencies: blockdev_ss.dependencies(),
3250 name_suffix: 'fa',
3251 build_by_default: false)
3252
3253blockdev = declare_dependency(link_whole: [libblockdev],
Nicolas Saenz Julienne7d5983e2022-04-25 09:57:21 +02003254 dependencies: [block, event_loop_base])
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003255
Paolo Bonziniff219dc2020-08-04 21:14:26 +02003256qmp_ss = qmp_ss.apply(config_host, strict: false)
3257libqmp = static_library('qmp', qmp_ss.sources() + genh,
3258 dependencies: qmp_ss.dependencies(),
3259 name_suffix: 'fa',
3260 build_by_default: false)
3261
3262qmp = declare_dependency(link_whole: [libqmp])
3263
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003264libchardev = static_library('chardev', chardev_ss.sources() + genh,
3265 name_suffix: 'fa',
Marc-André Lureau22d1f7a2022-03-23 19:57:12 +04003266 dependencies: chardev_ss.dependencies(),
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02003267 build_by_default: false)
3268
3269chardev = declare_dependency(link_whole: libchardev)
3270
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02003271hwcore_ss = hwcore_ss.apply(config_host, strict: false)
3272libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02003273 name_suffix: 'fa',
3274 build_by_default: false)
3275hwcore = declare_dependency(link_whole: libhwcore)
3276common_ss.add(hwcore)
3277
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02003278###########
3279# Targets #
3280###########
3281
Paolo Bonzinifb721762022-01-07 13:00:44 +01003282emulator_modules = []
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003283foreach m : block_mods + softmmu_mods
Paolo Bonzinifb721762022-01-07 13:00:44 +01003284 emulator_modules += shared_module(m.name(),
3285 build_by_default: true,
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003286 name_prefix: '',
3287 link_whole: m,
3288 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003289 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003290endforeach
Paolo Bonzinid8f3a602022-05-30 14:24:34 +02003291if emulator_modules.length() > 0
3292 alias_target('modules', emulator_modules)
3293endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04003294
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01003295softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003296common_ss.add(qom, qemuutil)
3297
3298common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01003299common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
3300
3301common_all = common_ss.apply(config_all, strict: false)
3302common_all = static_library('common',
3303 build_by_default: false,
3304 sources: common_all.sources() + genh,
Paolo Bonzini9d24fb72021-12-21 16:09:54 +01003305 include_directories: common_user_inc,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09003306 implicit_include_directories: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003307 dependencies: common_all.dependencies(),
3308 name_suffix: 'fa')
3309
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003310feature_to_c = find_program('scripts/feature_to_c.sh')
3311
Philippe Mathieu-Daudé30cfa502022-02-15 17:25:03 +01003312if targetos == 'darwin'
3313 entitlement = find_program('scripts/entitlement.sh')
3314endif
3315
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04003316emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01003317foreach target : target_dirs
3318 config_target = config_target_mak[target]
3319 target_name = config_target['TARGET_NAME']
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003320 target_base_arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02003321 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003322 arch_deps = []
3323 c_args = ['-DNEED_CPU_H',
3324 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
3325 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04003326 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01003327
Paolo Bonzini859aef02020-08-04 18:14:26 +02003328 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01003329 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
3330 if targetos == 'linux'
3331 target_inc += include_directories('linux-headers', is_system: true)
3332 endif
3333 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003334 target_type='system'
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003335 t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003336 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003337 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003338
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003339 hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
Marc-André Lureau2c442202019-08-17 13:55:58 +04003340 hw = hw_arch[hw_dir].apply(config_target, strict: false)
3341 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003342 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04003343
Paolo Bonzini2becc362020-02-03 11:42:03 +01003344 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003345 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01003346 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04003347 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01003348 target_type='user'
Paolo Bonzinia3a576b2021-12-21 16:23:55 +01003349 target_inc += common_user_inc
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003350 if target_base_arch in target_user_arch
3351 t = target_user_arch[target_base_arch].apply(config_target, strict: false)
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02003352 arch_srcs += t.sources()
3353 arch_deps += t.dependencies()
3354 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01003355 if 'CONFIG_LINUX_USER' in config_target
3356 base_dir = 'linux-user'
Warner Loshe2a74722021-08-03 17:17:17 -06003357 endif
3358 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01003359 base_dir = 'bsd-user'
Warner Loshe2a74722021-08-03 17:17:17 -06003360 target_inc += include_directories('bsd-user/' / targetos)
Warner Losh85fc1b52022-01-08 17:27:34 -07003361 target_inc += include_directories('bsd-user/host/' / host_arch)
Warner Loshe2a74722021-08-03 17:17:17 -06003362 dir = base_dir / abi
Warner Losh19bf1292021-11-04 16:34:48 -06003363 arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01003364 endif
3365 target_inc += include_directories(
3366 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04003367 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003368 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04003369 if 'CONFIG_LINUX_USER' in config_target
3370 dir = base_dir / abi
3371 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
3372 if config_target.has_key('TARGET_SYSTBL_ABI')
3373 arch_srcs += \
3374 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
3375 extra_args : config_target['TARGET_SYSTBL_ABI'])
3376 endif
3377 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01003378 endif
3379
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04003380 if 'TARGET_XML_FILES' in config_target
3381 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
3382 output: target + '-gdbstub-xml.c',
3383 input: files(config_target['TARGET_XML_FILES'].split()),
3384 command: [feature_to_c, '@INPUT@'],
3385 capture: true)
3386 arch_srcs += gdbstub_xml
3387 endif
3388
Paolo Bonziniffb91f62021-11-08 15:44:39 +01003389 t = target_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003390 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003391 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02003392
Paolo Bonzini2becc362020-02-03 11:42:03 +01003393 target_common = common_ss.apply(config_target, strict: false)
3394 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003395 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003396
Paolo Bonzini2becc362020-02-03 11:42:03 +01003397 target_specific = specific_ss.apply(config_target, strict: false)
3398 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003399 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01003400
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003401 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02003402 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02003403 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003404 objects: objects,
3405 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003406 c_args: c_args,
3407 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003408 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003409
3410 if target.endswith('-softmmu')
3411 execs = [{
3412 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003413 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003414 'sources': files('softmmu/main.c'),
3415 'dependencies': []
3416 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01003417 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003418 execs += [{
3419 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003420 'win_subsystem': 'windows',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003421 'sources': files('softmmu/main.c'),
3422 'dependencies': []
3423 }]
3424 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02003425 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003426 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
3427 execs += [{
3428 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003429 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003430 'sources': specific_fuzz.sources(),
3431 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003432 }]
3433 endif
3434 else
3435 execs = [{
3436 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003437 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003438 'sources': [],
3439 'dependencies': []
3440 }]
3441 endif
3442 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01003443 exe_name = exe['name']
John Arbuckle3983a762021-07-05 15:53:28 -04003444 if targetos == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01003445 exe_name += '-unsigned'
3446 endif
3447
3448 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09003449 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003450 c_args: c_args,
3451 dependencies: arch_deps + deps + exe['dependencies'],
3452 objects: lib.extract_all_objects(recursive: true),
3453 link_language: link_language,
3454 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
3455 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003456 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003457
John Arbuckle3983a762021-07-05 15:53:28 -04003458 if targetos == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003459 icon = 'pc-bios/qemu.rsrc'
3460 build_input = [emulator, files(icon)]
3461 install_input = [
3462 get_option('bindir') / exe_name,
3463 meson.current_source_dir() / icon
3464 ]
3465 if 'CONFIG_HVF' in config_target
3466 entitlements = 'accel/hvf/entitlements.plist'
3467 build_input += files(entitlements)
3468 install_input += meson.current_source_dir() / entitlements
3469 endif
3470
Alexander Graf8a74ce62021-01-20 23:44:34 +01003471 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003472 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01003473 output: exe['name'],
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003474 command: [entitlement, '@OUTPUT@', '@INPUT@'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003475 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09003476
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003477 meson.add_install_script(entitlement, '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09003478 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003479 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01003480 else
3481 emulators += {exe['name']: emulator}
3482 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003483
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003484 if stap.found()
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003485 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003486 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
3487 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003488 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
3489 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
3490 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003491 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003492 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003493 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003494 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003495 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003496 command: [
3497 tracetool, '--group=all', '--format=' + stp['fmt'],
3498 '--binary=' + stp['bin'],
3499 '--target-name=' + target_name,
3500 '--target-type=' + target_type,
3501 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01003502 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003503 ],
3504 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003505 endforeach
3506 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003507 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003508endforeach
3509
Paolo Bonzini931049b2020-02-05 09:44:24 +01003510# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003511
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003512if 'CONFIG_PLUGIN' in config_host
3513 install_headers('include/qemu/qemu-plugin.h')
3514endif
3515
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003516subdir('qga')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02003517
Laurent Vivier9755c942020-08-24 17:24:30 +02003518# Don't build qemu-keymap if xkbcommon is not explicitly enabled
3519# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02003520if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04003521 # used for the update-keymaps target, so include rules even if !have_tools
3522 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
3523 dependencies: [qemuutil, xkbcommon], install: have_tools)
3524endif
3525
Paolo Bonzini931049b2020-02-05 09:44:24 +01003526if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003527 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
3528 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
3529 qemu_io = executable('qemu-io', files('qemu-io.c'),
3530 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01003531 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06003532 dependencies: [blockdev, qemuutil, gnutls, selinux],
3533 install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003534
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02003535 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003536 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04003537 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003538
Marc-André Lureau157e7b12019-07-15 14:50:58 +04003539 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
3540 dependencies: qemuutil,
3541 install: true)
3542
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003543 if have_vhost_user
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02003544 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02003545 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04003546 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02003547 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01003548 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003549
3550 if targetos == 'linux'
3551 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
3552 dependencies: [qemuutil, libcap_ng],
3553 install: true,
3554 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003555
3556 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
3557 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02003558 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003559 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003560 endif
3561
Paolo Bonziniccd250a2021-06-03 12:50:17 +02003562 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04003563 subdir('contrib/ivshmem-client')
3564 subdir('contrib/ivshmem-server')
3565 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01003566endif
3567
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04003568subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01003569subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04003570subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02003571subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08003572subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01003573if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04003574 subdir('po')
3575endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01003576
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003577if host_machine.system() == 'windows'
3578 nsis_cmd = [
3579 find_program('scripts/nsis.py'),
3580 '@OUTPUT@',
3581 get_option('prefix'),
3582 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01003583 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003584 '--',
3585 '-DDISPLAYVERSION=' + meson.project_version(),
3586 ]
3587 if build_docs
3588 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
3589 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01003590 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003591 nsis_cmd += '-DCONFIG_GTK=y'
3592 endif
3593
3594 nsis = custom_target('nsis',
3595 output: 'qemu-setup-' + meson.project_version() + '.exe',
3596 input: files('qemu.nsi'),
3597 build_always_stale: true,
3598 command: nsis_cmd + ['@INPUT@'])
3599 alias_target('installer', nsis)
3600endif
3601
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003602#########################
3603# Configuration summary #
3604#########################
3605
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003606# Directories
Paolo Bonzinif9332752020-02-03 13:28:38 +01003607summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003608summary_info += {'Install prefix': get_option('prefix')}
3609summary_info += {'BIOS directory': qemu_datadir}
Akihiko Odaki8154f5e2022-06-25 00:40:42 +09003610pathsep = targetos == 'windows' ? ';' : ':'
3611summary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02003612summary_info += {'binary directory': get_option('prefix') / get_option('bindir')}
3613summary_info += {'library directory': get_option('prefix') / get_option('libdir')}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003614summary_info += {'module directory': qemu_moddir}
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02003615summary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')}
3616summary_info += {'include directory': get_option('prefix') / get_option('includedir')}
3617summary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003618if targetos != 'windows'
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02003619 summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')}
3620 summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003621else
3622 summary_info += {'local state directory': 'queried at runtime'}
3623endif
Paolo Bonzinif7fb6c62022-04-20 17:33:56 +02003624summary_info += {'Doc directory': get_option('prefix') / get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003625summary_info += {'Build directory': meson.current_build_dir()}
3626summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003627summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003628summary(summary_info, bool_yn: true, section: 'Directories')
3629
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003630# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003631summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003632summary_info += {'git': config_host['GIT']}
3633summary_info += {'make': config_host['MAKE']}
3634summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003635summary_info += {'sphinx-build': sphinx_build}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003636if config_host.has_key('HAVE_GDB_BIN')
3637 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
3638endif
Paolo Bonzini40c909f2022-04-20 17:33:49 +02003639summary_info += {'iasl': iasl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003640summary_info += {'genisoimage': config_host['GENISOIMAGE']}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003641if targetos == 'windows' and have_ga
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003642 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003643endif
Thomas Huth58902582022-04-08 18:20:47 +02003644if slirp.found() and have_system
Paolo Bonzini35acbb32021-10-13 13:43:36 +02003645 summary_info += {'smbd': have_slirp_smbd ? smbd_path : false}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003646endif
3647summary(summary_info, bool_yn: true, section: 'Host binaries')
3648
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003649# Configurable features
3650summary_info = {}
3651summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003652summary_info += {'system-mode emulation': have_system}
3653summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003654summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003655summary_info += {'Install blobs': get_option('install_blobs')}
3656summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
3657if config_host.has_key('CONFIG_MODULES')
Paolo Bonzini2cb2f582022-04-20 17:33:46 +02003658 summary_info += {'alternative module path': get_option('module_upgrades')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003659endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02003660summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003661if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02003662 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003663endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003664summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
3665if 'simple' in get_option('trace_backends')
3666 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003667endif
Marc-André Lureau142ca622021-07-15 11:53:53 +04003668summary_info += {'D-Bus display': dbus_display}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003669summary_info += {'QOM debugging': get_option('qom_cast_debug')}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003670summary_info += {'vhost-kernel support': have_vhost_kernel}
3671summary_info += {'vhost-net support': have_vhost_net}
3672summary_info += {'vhost-user support': have_vhost_user}
3673summary_info += {'vhost-user-crypto support': have_vhost_user_crypto}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003674summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzini2a3129a2022-04-20 17:34:05 +02003675summary_info += {'vhost-vdpa support': have_vhost_vdpa}
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003676summary_info += {'build guest agent': have_ga}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003677summary(summary_info, bool_yn: true, section: 'Configurable features')
3678
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003679# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003680summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003681summary_info += {'host CPU': cpu}
3682summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01003683summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
3684summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003685if link_language == 'cpp'
Alex Bennée63de9352021-05-27 17:03:15 +01003686 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003687else
3688 summary_info += {'C++ compiler': false}
3689endif
3690if targetos == 'darwin'
Alex Bennée63de9352021-05-27 17:03:15 +01003691 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003692endif
Paolo Bonzini47b30832020-09-23 05:26:17 -04003693summary_info += {'CFLAGS': ' '.join(get_option('c_args')
3694 + ['-O' + get_option('optimization')]
3695 + (get_option('debug') ? ['-g'] : []))}
3696if link_language == 'cpp'
3697 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
3698 + ['-O' + get_option('optimization')]
3699 + (get_option('debug') ? ['-g'] : []))}
3700endif
Philippe Mathieu-Daudée910c7d2022-01-08 22:38:55 +01003701if targetos == 'darwin'
3702 summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args')
3703 + ['-O' + get_option('optimization')]
3704 + (get_option('debug') ? ['-g'] : []))}
3705endif
Paolo Bonzini47b30832020-09-23 05:26:17 -04003706link_args = get_option(link_language + '_link_args')
3707if link_args.length() > 0
3708 summary_info += {'LDFLAGS': ' '.join(link_args)}
3709endif
Paolo Bonzinid0651772022-04-20 17:33:34 +02003710summary_info += {'QEMU_CFLAGS': ' '.join(qemu_cflags)}
3711summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_cxxflags)}
3712summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_objcflags)}
3713summary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003714summary_info += {'profiler': get_option('profiler')}
Daniele Buonocdad7812020-12-04 18:06:11 -05003715summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003716summary_info += {'PIE': get_option('b_pie')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02003717summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003718summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinib87df902021-11-08 13:52:11 +01003719summary_info += {'membarrier': have_membarrier}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02003720summary_info += {'debug stack usage': get_option('debug_stack_usage')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003721summary_info += {'mutex debugging': get_option('debug_mutex')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003722summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzini622753d2021-11-08 13:38:58 +01003723summary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')}
3724summary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003725summary_info += {'gprof enabled': get_option('gprof')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003726summary_info += {'gcov': get_option('b_coverage')}
3727summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
3728summary_info += {'CFI support': get_option('cfi')}
3729if get_option('cfi')
3730 summary_info += {'CFI debug support': get_option('cfi_debug')}
3731endif
3732summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003733summary_info += {'sparse': sparse}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003734summary_info += {'mingw32 support': targetos == 'windows'}
Paolo Bonzini12640f02022-06-06 11:48:47 +02003735summary(summary_info, bool_yn: true, section: 'Compilation')
Alex Bennée49e85652021-02-22 10:14:50 +00003736
3737# snarf the cross-compilation information for tests
Paolo Bonzini12640f02022-06-06 11:48:47 +02003738summary_info = {}
3739have_cross = false
Alex Bennée49e85652021-02-22 10:14:50 +00003740foreach target: target_dirs
3741 tcg_mak = meson.current_build_dir() / 'tests/tcg' / 'config-' + target + '.mak'
3742 if fs.exists(tcg_mak)
3743 config_cross_tcg = keyval.load(tcg_mak)
Alex Bennée85b141e2022-05-27 16:35:34 +01003744 if 'CC' in config_cross_tcg
Paolo Bonzini12640f02022-06-06 11:48:47 +02003745 summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']}
3746 have_cross = true
Alex Bennée49e85652021-02-22 10:14:50 +00003747 endif
Paolo Bonzini12640f02022-06-06 11:48:47 +02003748 endif
Alex Bennée49e85652021-02-22 10:14:50 +00003749endforeach
Paolo Bonzini12640f02022-06-06 11:48:47 +02003750if have_cross
3751 summary(summary_info, bool_yn: true, section: 'Cross compilers')
3752endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003753
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003754# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003755summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003756if have_system
3757 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
3758 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
3759 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
3760 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
Reinoud Zandijk74a414a2021-04-02 22:25:32 +02003761 summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')}
Paolo Bonzini14efd8d2022-04-20 17:33:47 +02003762 summary_info += {'Xen support': xen.found()}
3763 if xen.found()
3764 summary_info += {'xen ctrl version': xen.version()}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003765 endif
3766endif
3767summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
3768if config_all.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01003769 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +01003770 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01003771 else
3772 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
3773 endif
Alex Bennée029aa682021-07-09 15:29:53 +01003774 summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003775 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003776endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003777summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003778if have_system
3779 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01003780 summary_info += {'out of process emulation': multiprocess_allowed}
Jagannathan Raman55116962022-06-13 16:26:24 -04003781 summary_info += {'vfio-user server': vfio_user_server_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003782endif
3783summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
3784
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003785# Block layer
3786summary_info = {}
3787summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
Paolo Bonzini728c0a22021-10-13 11:52:03 +02003788summary_info += {'coroutine pool': have_coroutine_pool}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003789if have_block
Paolo Bonzini622d64f2022-04-20 17:33:53 +02003790 summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')}
3791 summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003792 summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003793 summary_info += {'VirtFS support': have_virtfs}
3794 summary_info += {'build virtiofs daemon': have_virtiofsd}
Paolo Bonzini406523f2021-10-13 11:43:54 +02003795 summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')}
3796 summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')}
Paolo Bonzinied793c22021-10-13 11:42:25 +02003797 summary_info += {'bochs support': get_option('bochs').allowed()}
3798 summary_info += {'cloop support': get_option('cloop').allowed()}
3799 summary_info += {'dmg support': get_option('dmg').allowed()}
3800 summary_info += {'qcow v1 support': get_option('qcow1').allowed()}
3801 summary_info += {'vdi support': get_option('vdi').allowed()}
3802 summary_info += {'vvfat support': get_option('vvfat').allowed()}
3803 summary_info += {'qed support': get_option('qed').allowed()}
3804 summary_info += {'parallels support': get_option('parallels').allowed()}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003805 summary_info += {'FUSE exports': fuse}
Xie Yongji2a2359b2022-05-23 16:46:09 +08003806 summary_info += {'VDUSE block exports': have_vduse_blk_export}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003807endif
3808summary(summary_info, bool_yn: true, section: 'Block layer support')
3809
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003810# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003811summary_info = {}
Paolo Bonzini41f2ae22022-04-20 17:33:52 +02003812summary_info += {'TLS priority': get_option('tls_priority')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003813summary_info += {'GNUTLS support': gnutls}
3814if gnutls.found()
3815 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
3816endif
3817summary_info += {'libgcrypt': gcrypt}
3818summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02003819if nettle.found()
3820 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003821endif
Paolo Bonzini34b52612021-11-08 14:02:42 +01003822summary_info += {'AF_ALG support': have_afalg}
Paolo Bonzinic55cf6a2021-10-13 11:46:09 +02003823summary_info += {'rng-none': get_option('rng_none')}
Paolo Bonzini2edd2c02022-04-20 17:33:42 +02003824summary_info += {'Linux keyring': have_keyring}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003825summary(summary_info, bool_yn: true, section: 'Crypto')
3826
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01003827# Libraries
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003828summary_info = {}
3829if targetos == 'darwin'
Vladislav Yaroshchuke2c1d782022-03-17 20:28:33 +03003830 summary_info += {'Cocoa support': cocoa}
3831 summary_info += {'vmnet.framework support': vmnet}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003832endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003833summary_info += {'SDL support': sdl}
3834summary_info += {'SDL image support': sdl_image}
3835summary_info += {'GTK support': gtk}
3836summary_info += {'pixman': pixman}
3837summary_info += {'VTE support': vte}
Thomas Huth58902582022-04-08 18:20:47 +02003838summary_info += {'slirp support': slirp}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003839summary_info += {'libtasn1': tasn1}
3840summary_info += {'PAM': pam}
3841summary_info += {'iconv support': iconv}
3842summary_info += {'curses support': curses}
3843summary_info += {'virgl support': virgl}
3844summary_info += {'curl support': curl}
3845summary_info += {'Multipath support': mpathpersist}
Kshitij Suri95f85102022-04-08 07:13:34 +00003846summary_info += {'PNG support': png}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003847summary_info += {'VNC support': vnc}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01003848if vnc.found()
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003849 summary_info += {'VNC SASL support': sasl}
3850 summary_info += {'VNC JPEG support': jpeg}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003851endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02003852if targetos not in ['darwin', 'haiku', 'windows']
3853 summary_info += {'OSS support': oss}
3854elif targetos == 'darwin'
3855 summary_info += {'CoreAudio support': coreaudio}
3856elif targetos == 'windows'
3857 summary_info += {'DirectSound support': dsound}
3858endif
3859if targetos == 'linux'
3860 summary_info += {'ALSA support': alsa}
3861 summary_info += {'PulseAudio support': pulse}
3862endif
3863summary_info += {'JACK support': jack}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003864summary_info += {'brlapi support': brlapi}
Paolo Bonzinie1723992021-10-07 15:08:21 +02003865summary_info += {'vde support': vde}
Paolo Bonzini837b84b2021-10-07 15:08:22 +02003866summary_info += {'netmap support': have_netmap}
Thomas Hutheea94532021-10-28 20:59:08 +02003867summary_info += {'l2tpv3 support': have_l2tpv3}
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02003868summary_info += {'Linux AIO support': libaio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003869summary_info += {'Linux io_uring support': linux_io_uring}
3870summary_info += {'ATTR/XATTR support': libattr}
Paolo Bonzini3730a732022-04-20 17:33:41 +02003871summary_info += {'RDMA support': rdma}
3872summary_info += {'PVRDMA support': have_pvrdma}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003873summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003874summary_info += {'libcap-ng support': libcap_ng}
3875summary_info += {'bpf support': libbpf}
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02003876summary_info += {'spice protocol support': spice_protocol}
3877if spice_protocol.found()
3878 summary_info += {' spice server support': spice}
3879endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003880summary_info += {'rbd support': rbd}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003881summary_info += {'smartcard support': cacard}
3882summary_info += {'U2F support': u2f}
3883summary_info += {'libusb': libusb}
3884summary_info += {'usb net redir': usbredir}
Paolo Bonzini88b6e612022-04-20 17:33:40 +02003885summary_info += {'OpenGL support (epoxy)': opengl}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003886summary_info += {'GBM': gbm}
3887summary_info += {'libiscsi support': libiscsi}
3888summary_info += {'libnfs support': libnfs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003889if targetos == 'windows'
Paolo Bonzini20cf5cb2021-10-15 16:47:43 +02003890 if have_ga
Marc-André Lureau8821a382022-02-01 16:53:43 +04003891 summary_info += {'QGA VSS support': have_qga_vss}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01003892 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01003893endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003894summary_info += {'seccomp support': seccomp}
3895summary_info += {'GlusterFS support': glusterfs}
Paolo Bonzini0d04c4c2021-12-21 12:38:27 +01003896summary_info += {'TPM support': have_tpm}
Thomas Huthe6a52b32021-12-09 15:48:01 +01003897summary_info += {'libssh support': libssh}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003898summary_info += {'lzo support': lzo}
3899summary_info += {'snappy support': snappy}
3900summary_info += {'bzip2 support': libbzip2}
3901summary_info += {'lzfse support': liblzfse}
3902summary_info += {'zstd support': zstd}
Paolo Bonzini488a8c72021-12-21 12:38:27 +01003903summary_info += {'NUMA host support': numa}
Thomas Huth83602082022-05-16 16:58:23 +02003904summary_info += {'capstone': capstone}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003905summary_info += {'libpmem support': libpmem}
3906summary_info += {'libdaxctl support': libdaxctl}
3907summary_info += {'libudev': libudev}
3908# Dummy dependency, keep .found()
Max Reitzdf4ea702020-10-27 20:05:46 +01003909summary_info += {'FUSE lseek': fuse_lseek.found()}
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06003910summary_info += {'selinux': selinux}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01003911summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01003912
3913if not supported_cpus.contains(cpu)
3914 message()
3915 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
3916 message()
3917 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
3918 message('The QEMU project intends to remove support for this host CPU in')
3919 message('a future release if nobody volunteers to maintain it and to')
3920 message('provide a build host for our continuous integration setup.')
3921 message('configure has succeeded and you can continue to build, but')
3922 message('if you care about QEMU on this platform you should contact')
3923 message('us upstream at qemu-devel@nongnu.org.')
3924endif
3925
3926if not supported_oses.contains(targetos)
3927 message()
3928 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
3929 message()
3930 message('Host OS ' + targetos + 'support is not currently maintained.')
3931 message('The QEMU project intends to remove support for this host OS in')
3932 message('a future release if nobody volunteers to maintain it and to')
3933 message('provide a build host for our continuous integration setup.')
3934 message('configure has succeeded and you can continue to build, but')
3935 message('if you care about QEMU on this platform you should contact')
3936 message('us upstream at qemu-devel@nongnu.org.')
3937endif