blob: 26fc4e5792942ffef02622fce866c5aefea73148 [file] [log] [blame]
Paolo Bonzini654d6b02021-02-09 14:59:26 +01001project('qemu', ['c'], meson_version: '>=0.58.2',
2 default_options: ['warning_level=1', 'c_std=gnu11', 'cpp_std=gnu++11', 'b_colorout=auto',
3 'b_staticpic=false'],
4 version: files('VERSION'))
Paolo Bonzinia5665052019-06-10 12:05:14 +02005
6not_found = dependency('', required: false)
Paolo Bonzini654d6b02021-02-09 14:59:26 +01007keyval = import('keyval')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04008ss = import('sourceset')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07009fs = import('fs')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040010
Paolo Bonzinice1c1e72020-01-28 16:41:44 +010011sh = find_program('sh')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040012cc = meson.get_compiler('c')
Paolo Bonzinia5665052019-06-10 12:05:14 +020013config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Marc-André Lureau3154fee2019-08-29 22:07:01 +040014enable_modules = 'CONFIG_MODULES' in config_host
Paolo Bonzini35be72b2020-02-06 14:17:15 +010015enable_static = 'CONFIG_STATIC' in config_host
Yonggang Luoe3667662020-10-16 06:06:25 +080016
Paolo Bonzinid7dedf42021-01-26 11:15:33 +010017# Allow both shared and static libraries unless --enable-static
18static_kwargs = enable_static ? {'static': true} : {}
19
Yonggang Luoe3667662020-10-16 06:06:25 +080020# Temporary directory used for files created while
21# configure runs. Since it is in the build directory
22# we can safely blow away any previous version of it
23# (and we need not jump through hoops to try to delete
24# it when configure exits.)
25tmpdir = meson.current_build_dir() / 'meson-private/temp'
Marc-André Lureau8fe11232020-09-11 14:42:48 +020026
27if get_option('qemu_suffix').startswith('/')
28 error('qemu_suffix cannot start with a /')
29endif
30
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040031qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
Marc-André Lureauab4c0992020-08-26 15:04:16 +040032qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040033qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040034qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
35
36qemu_desktopdir = get_option('datadir') / 'applications'
37qemu_icondir = get_option('datadir') / 'icons'
38
Paolo Bonzini859aef02020-08-04 18:14:26 +020039config_host_data = configuration_data()
40genh = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020041
Paolo Bonzini760e4322020-08-26 08:09:48 +020042target_dirs = config_host['TARGET_DIRS'].split()
43have_user = false
44have_system = false
45foreach target : target_dirs
46 have_user = have_user or target.endswith('-user')
47 have_system = have_system or target.endswith('-softmmu')
48endforeach
49have_tools = 'CONFIG_TOOLS' in config_host
50have_block = have_system or have_tools
51
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040052python = import('python').find_installation()
53
54supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Sergei Trofimovich61256732020-10-12 18:57:19 +010055supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040056 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
57
58cpu = host_machine.cpu_family()
59targetos = host_machine.system()
60
Paolo Bonzini8a199802020-09-18 05:37:01 -040061if cpu in ['x86', 'x86_64']
62 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
63elif cpu == 'aarch64'
64 kvm_targets = ['aarch64-softmmu']
65elif cpu == 's390x'
66 kvm_targets = ['s390x-softmmu']
67elif cpu in ['ppc', 'ppc64']
68 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Huacai Chenfbc58842020-10-07 16:39:28 +080069elif cpu in ['mips', 'mips64']
70 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -040071else
72 kvm_targets = []
73endif
74
75accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alexander Graf844a06b2021-09-16 17:54:02 +020076
77if cpu in ['aarch64']
78 accelerator_targets += {
79 'CONFIG_HVF': ['aarch64-softmmu']
80 }
81endif
82
Alex Bennée0c3e41d2020-11-10 19:23:09 +000083if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
Marc-André Lureau2a2d51b2021-09-14 16:30:45 +040084 # i386 emulator provides xenpv machine type for multiple architectures
Alex Bennée0c3e41d2020-11-10 19:23:09 +000085 accelerator_targets += {
86 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
87 }
88endif
Paolo Bonzini8a199802020-09-18 05:37:01 -040089if cpu in ['x86', 'x86_64']
90 accelerator_targets += {
91 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -040092 'CONFIG_HVF': ['x86_64-softmmu'],
Reinoud Zandijk74a414a2021-04-02 22:25:32 +020093 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -040094 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
95 }
96endif
97
Paolo Bonzinia1b176f2021-07-12 14:22:08 +020098modular_tcg = []
99# Darwin does not support references to thread-local variables in modules
100if targetos != 'darwin'
101 modular_tcg = ['i386-softmmu', 'x86_64-softmmu']
102endif
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +0200103
Philippe Mathieu-Daudéeae9a1d2021-01-14 18:45:08 +0100104edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
Paolo Bonzinie49c0ef2021-09-23 06:55:28 -0400105unpack_edk2_blobs = false
106foreach target : edk2_targets
107 if target in target_dirs
108 bzip2 = find_program('bzip2', required: get_option('install_blobs'))
109 unpack_edk2_blobs = bzip2.found()
110 break
111 endif
112endforeach
Philippe Mathieu-Daudé45b545d2021-01-14 18:45:09 +0100113
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200114dtrace = not_found
115stap = not_found
116if 'dtrace' in get_option('trace_backends')
117 dtrace = find_program('dtrace', required: true)
118 stap = find_program('stap', required: false)
119 if stap.found()
120 # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
121 # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
122 # instead. QEMU --enable-modules depends on this because the SystemTap
123 # semaphores are linked into the main binary and not the module's shared
124 # object.
125 add_global_arguments('-DSTAP_SDT_V2',
126 native: false, language: ['c', 'cpp', 'objc'])
127 endif
128endif
129
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400130##################
131# Compiler flags #
132##################
133
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400134# Specify linker-script with add_project_link_arguments so that it is not placed
135# within a linker --start-group/--end-group pair
Paolo Bonzini537b7242021-10-07 15:08:12 +0200136if get_option('fuzzing')
137 add_project_link_arguments(['-Wl,-T,',
138 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
139 native: false, language: ['c', 'cpp', 'objc'])
140
141 # Specify a filter to only instrument code that is directly related to
142 # virtual-devices.
143 configure_file(output: 'instrumentation-filter',
144 input: 'scripts/oss-fuzz/instrumentation-filter-template',
145 copy: true)
146 add_global_arguments(
147 cc.get_supported_arguments('-fsanitize-coverage-allowlist=instrumentation-filter'),
148 native: false, language: ['c', 'cpp', 'objc'])
149
150 if get_option('fuzzing_engine') == ''
151 # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
152 # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link
153 # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
154 # unable to bind the fuzzer-related callbacks added by instrumentation.
155 add_global_arguments('-fsanitize=fuzzer-no-link',
156 native: false, language: ['c', 'cpp', 'objc'])
157 add_global_link_arguments('-fsanitize=fuzzer-no-link',
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400158 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzini537b7242021-10-07 15:08:12 +0200159 # For the actual fuzzer binaries, we need to link against the libfuzzer
160 # library. They need to be configurable, to support OSS-Fuzz
161 fuzz_exe_ldflags = ['-fsanitize=fuzzer']
162 else
163 # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
164 # the needed CFLAGS have already been provided
165 fuzz_exe_ldflags = get_option('fuzzing_engine').split()
166 endif
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400167endif
168
Marc-André Lureau5fc06172021-01-14 16:56:02 +0400169add_global_arguments(config_host['QEMU_CFLAGS'].split(),
170 native: false, language: ['c', 'objc'])
171add_global_arguments(config_host['QEMU_CXXFLAGS'].split(),
172 native: false, language: 'cpp')
173add_global_link_arguments(config_host['QEMU_LDFLAGS'].split(),
174 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzinia5665052019-06-10 12:05:14 +0200175
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400176if targetos == 'linux'
177 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
178 '-isystem', 'linux-headers',
179 language: ['c', 'cpp'])
180endif
181
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100182add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400183 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400184 '-iquote', meson.current_source_dir() / 'include',
185 '-iquote', meson.current_source_dir() / 'disas/libvixl',
186 language: ['c', 'cpp', 'objc'])
Alexander Bulekovc46f76d2020-09-02 13:36:50 -0400187
Marc-André Lureaufc929892019-07-13 01:47:54 +0400188link_language = meson.get_external_property('link_language', 'cpp')
189if link_language == 'cpp'
190 add_languages('cpp', required: true, native: false)
191endif
Paolo Bonzinia5665052019-06-10 12:05:14 +0200192if host_machine.system() == 'darwin'
193 add_languages('objc', required: false, native: false)
194endif
195
Paolo Bonzinideb62372020-09-01 07:51:16 -0400196sparse = find_program('cgcc', required: get_option('sparse'))
197if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100198 run_target('sparse',
199 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400200 'compile_commands.json', sparse.full_path(), '-Wbitwise',
201 '-Wno-transparent-union', '-Wno-old-initializer',
202 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100203endif
204
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200205###########################################
206# Target-specific checks and dependencies #
207###########################################
208
Paolo Bonzini537b7242021-10-07 15:08:12 +0200209if get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
210 not cc.links('''
211 #include <stdint.h>
212 #include <sys/types.h>
213 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
214 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
215 ''',
216 args: ['-Werror', '-fsanitize=fuzzer'])
217 error('Your compiler does not support -fsanitize=fuzzer')
218endif
219
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200220if 'ftrace' in get_option('trace_backends') and targetos != 'linux'
221 error('ftrace is supported only on Linux')
222endif
223if 'syslog' in get_option('trace_backends') and not cc.compiles('''
224 #include <syslog.h>
225 int main(void) {
226 openlog("qemu", LOG_PID, LOG_DAEMON);
227 syslog(LOG_INFO, "configure");
228 return 0;
229 }''')
230 error('syslog is not supported on this system')
231endif
232
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200233if targetos != 'linux' and get_option('mpath').enabled()
234 error('Multipath is supported only on Linux')
235endif
236
Paolo Bonzini106ad1f2021-02-17 16:24:25 +0100237if targetos != 'linux' and get_option('multiprocess').enabled()
238 error('Multiprocess QEMU is supported only on Linux')
239endif
240multiprocess_allowed = targetos == 'linux' and not get_option('multiprocess').disabled()
241
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200242libm = cc.find_library('m', required: false)
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +0200243threads = dependency('threads')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400244util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200245winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400246socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400247version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400248coref = []
249iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400250emulator_link_args = []
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200251nvmm =not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400252hvf = not_found
Paolo Bonzinia6305082021-10-07 15:08:15 +0200253host_dsosuf = '.so'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400254if targetos == 'windows'
255 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200256 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400257
258 win = import('windows')
259 version_res = win.compile_resources('version.rc',
260 depend_files: files('pc-bios/qemu-nsis.ico'),
261 include_directories: include_directories('.'))
Paolo Bonzinia6305082021-10-07 15:08:15 +0200262 host_dsosuf = '.dll'
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400263elif targetos == 'darwin'
264 coref = dependency('appleframeworks', modules: 'CoreFoundation')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700265 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
Paolo Bonzinia6305082021-10-07 15:08:15 +0200266 host_dsosuf = '.dylib'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200267elif targetos == 'sunos'
268 socket = [cc.find_library('socket'),
269 cc.find_library('nsl'),
270 cc.find_library('resolv')]
271elif targetos == 'haiku'
272 socket = [cc.find_library('posix_error_mapper'),
273 cc.find_library('network'),
274 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400275elif targetos == 'openbsd'
276 if not get_option('tcg').disabled() and target_dirs.length() > 0
277 # Disable OpenBSD W^X if available
278 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
279 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400280endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200281
Paolo Bonzini8a199802020-09-18 05:37:01 -0400282accelerators = []
283if not get_option('kvm').disabled() and targetos == 'linux'
284 accelerators += 'CONFIG_KVM'
285endif
286if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
287 accelerators += 'CONFIG_XEN'
288 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
289else
290 have_xen_pci_passthrough = false
291endif
292if not get_option('whpx').disabled() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000293 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400294 error('WHPX requires 64-bit host')
295 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
296 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
297 accelerators += 'CONFIG_WHPX'
298 endif
299endif
300if not get_option('hvf').disabled()
301 hvf = dependency('appleframeworks', modules: 'Hypervisor',
302 required: get_option('hvf'))
303 if hvf.found()
304 accelerators += 'CONFIG_HVF'
305 endif
306endif
307if not get_option('hax').disabled()
308 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
309 accelerators += 'CONFIG_HAX'
310 endif
311endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200312if targetos == 'netbsd'
313 if cc.has_header_symbol('nvmm.h', 'nvmm_cpu_stop', required: get_option('nvmm'))
314 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
315 endif
316 if nvmm.found()
317 accelerators += 'CONFIG_NVMM'
318 endif
319endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100320
321tcg_arch = config_host['ARCH']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400322if not get_option('tcg').disabled()
323 if cpu not in supported_cpus
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100324 if get_option('tcg_interpreter')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +0100325 warning('Unsupported CPU @0@, will use TCG with TCI (experimental and slow)'.format(cpu))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400326 else
327 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
328 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100329 elif get_option('tcg_interpreter')
330 warning('Use of the TCG interpretor is not recommended on this host')
331 warning('architecture. There is a native TCG execution backend available')
332 warning('which provides substantially better performance and reliability.')
333 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
334 warning('configuration option on this architecture to use the native')
335 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400336 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100337 if get_option('tcg_interpreter')
338 tcg_arch = 'tci'
339 elif config_host['ARCH'] == 'sparc64'
340 tcg_arch = 'sparc'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100341 elif config_host['ARCH'] in ['x86_64', 'x32']
342 tcg_arch = 'i386'
343 elif config_host['ARCH'] == 'ppc64'
344 tcg_arch = 'ppc'
345 elif config_host['ARCH'] in ['riscv32', 'riscv64']
346 tcg_arch = 'riscv'
347 endif
348 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100349 language: ['c', 'cpp', 'objc'])
350
Paolo Bonzini8a199802020-09-18 05:37:01 -0400351 accelerators += 'CONFIG_TCG'
352 config_host += { 'CONFIG_TCG': 'y' }
353endif
354
355if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
356 error('KVM not available on this platform')
357endif
358if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
359 error('HVF not available on this platform')
360endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200361if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
362 error('NVMM not available on this platform')
363endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400364if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
365 error('WHPX not available on this platform')
366endif
367if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
368 if 'CONFIG_XEN' in accelerators
369 error('Xen PCI passthrough not available on this platform')
370 else
371 error('Xen PCI passthrough requested but Xen not enabled')
372 endif
373endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400374
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200375################
376# Dependencies #
377################
378
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400379# The path to glib.h is added to all compilation commands. This was
380# grandfathered in from the QEMU Makefiles.
381add_project_arguments(config_host['GLIB_CFLAGS'].split(),
382 native: false, language: ['c', 'cpp', 'objc'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400383glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
384 link_args: config_host['GLIB_LIBS'].split())
385# override glib dep with the configure results (for subprojects)
386meson.override_dependency('glib-2.0', glib)
387
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400388gio = not_found
389if 'CONFIG_GIO' in config_host
390 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
391 link_args: config_host['GIO_LIBS'].split())
392endif
393lttng = not_found
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200394if 'ust' in get_option('trace_backends')
395 lttng = dependency('lttng-ust', required: true, method: 'pkg-config',
396 kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400397endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200398pixman = not_found
399if have_system or have_tools
400 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100401 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200402endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400403libaio = cc.find_library('aio', required: false)
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100404zlib = dependency('zlib', required: true, kwargs: static_kwargs)
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200405
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400406linux_io_uring = not_found
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200407if not get_option('linux_io_uring').auto() or have_block
408 linux_io_uring = dependency('liburing', required: get_option('linux_io_uring'),
409 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400410endif
411libxml2 = not_found
Paolo Bonzinic5b36c22021-06-03 11:31:35 +0200412if not get_option('libxml2').auto() or have_block
413 libxml2 = dependency('libxml-2.0', required: get_option('libxml2'),
414 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400415endif
416libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +0100417if not get_option('libnfs').auto() or have_block
418 libnfs = dependency('libnfs', version: '>=1.9.3',
419 required: get_option('libnfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100420 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400421endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100422
423libattr_test = '''
424 #include <stddef.h>
425 #include <sys/types.h>
426 #ifdef CONFIG_LIBATTR
427 #include <attr/xattr.h>
428 #else
429 #include <sys/xattr.h>
430 #endif
431 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
432
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400433libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100434have_old_libattr = false
435if not get_option('attr').disabled()
436 if cc.links(libattr_test)
437 libattr = declare_dependency()
438 else
439 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
440 required: get_option('attr'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100441 kwargs: static_kwargs)
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100442 if libattr.found() and not \
443 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
444 libattr = not_found
445 if get_option('attr').enabled()
446 error('could not link libattr')
447 else
448 warning('could not link libattr, disabling')
449 endif
450 else
451 have_old_libattr = libattr.found()
452 endif
453 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400454endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100455
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100456cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
457if cocoa.found() and get_option('sdl').enabled()
458 error('Cocoa and SDL cannot be enabled at the same time')
459endif
460if cocoa.found() and get_option('gtk').enabled()
461 error('Cocoa and GTK+ cannot be enabled at the same time')
462endif
463
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100464seccomp = not_found
Paolo Bonzini90835c22020-11-17 14:22:24 +0100465if not get_option('seccomp').auto() or have_system or have_tools
466 seccomp = dependency('libseccomp', version: '>=2.3.0',
467 required: get_option('seccomp'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100468 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100469endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100470
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100471libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100472if not get_option('cap_ng').auto() or have_system or have_tools
473 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
474 required: get_option('cap_ng'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100475 kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100476endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100477if libcap_ng.found() and not cc.links('''
478 #include <cap-ng.h>
479 int main(void)
480 {
481 capng_capability_to_name(CAPNG_EFFECTIVE);
482 return 0;
483 }''', dependencies: libcap_ng)
484 libcap_ng = not_found
485 if get_option('cap_ng').enabled()
486 error('could not link libcap-ng')
487 else
488 warning('could not link libcap-ng, disabling')
489 endif
490endif
491
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400492if get_option('xkbcommon').auto() and not have_system and not have_tools
493 xkbcommon = not_found
494else
495 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100496 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400497endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400498vde = not_found
499if config_host.has_key('CONFIG_VDE')
500 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
501endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200502
Paolo Bonzini478e9432020-08-17 12:47:55 +0200503pulse = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200504if not get_option('pa').auto() or (targetos == 'linux' and have_system)
505 pulse = dependency('libpulse', required: get_option('pa'),
506 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200507endif
508alsa = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200509if not get_option('alsa').auto() or (targetos == 'linux' and have_system)
510 alsa = dependency('alsa', required: get_option('alsa'),
511 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200512endif
513jack = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200514if not get_option('jack').auto() or have_system
515 jack = dependency('jack', required: get_option('jack'),
516 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200517endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200518
Paolo Bonzini26347332019-07-29 15:40:07 +0200519spice = not_found
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200520spice_headers = not_found
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200521spice_protocol = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200522if 'CONFIG_SPICE' in config_host
523 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
524 link_args: config_host['SPICE_LIBS'].split())
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200525 spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
Paolo Bonzini26347332019-07-29 15:40:07 +0200526endif
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200527if 'CONFIG_SPICE_PROTOCOL' in config_host
528 spice_protocol = declare_dependency(compile_args: config_host['SPICE_PROTOCOL_CFLAGS'].split())
529endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400530rt = cc.find_library('rt', required: false)
Paolo Bonziniccf7afa2020-09-01 06:44:23 -0400531libdl = not_found
532if 'CONFIG_PLUGIN' in config_host
Alex Bennéee8575f22021-07-14 11:15:36 +0100533 libdl = cc.find_library('dl', required: false)
534 if not cc.has_function('dlopen', dependencies: libdl)
535 error('dlopen not found')
536 endif
Paolo Bonziniccf7afa2020-09-01 06:44:23 -0400537endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200538libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100539if not get_option('libiscsi').auto() or have_block
540 libiscsi = dependency('libiscsi', version: '>=1.9.0',
541 required: get_option('libiscsi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100542 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini99650b62019-06-10 12:21:14 +0200543endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400544zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +0100545if not get_option('zstd').auto() or have_block
546 zstd = dependency('libzstd', version: '>=1.4.0',
547 required: get_option('zstd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100548 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400549endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400550virgl = not_found
Paolo Bonzini587d59d2021-06-03 11:31:35 +0200551if not get_option('virglrenderer').auto() or have_system
552 virgl = dependency('virglrenderer',
553 method: 'pkg-config',
554 required: get_option('virglrenderer'),
555 kwargs: static_kwargs)
Marc-André Lureauea458962019-07-12 22:23:46 +0400556endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400557curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100558if not get_option('curl').auto() or have_block
559 curl = dependency('libcurl', version: '>=7.29.0',
560 method: 'pkg-config',
561 required: get_option('curl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100562 kwargs: static_kwargs)
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400563endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200564libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200565if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200566 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +0100567 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400568 required: get_option('libudev'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100569 kwargs: static_kwargs)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200570endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200571
Paolo Bonzini5c530152020-10-15 06:09:27 -0400572mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200573mpathpersist = not_found
574mpathpersist_new_api = false
575if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
576 mpath_test_source_new = '''
577 #include <libudev.h>
578 #include <mpath_persist.h>
579 unsigned mpath_mx_alloc_len = 1024;
580 int logsink;
581 static struct config *multipath_conf;
582 extern struct udev *udev;
583 extern struct config *get_multipath_config(void);
584 extern void put_multipath_config(struct config *conf);
585 struct udev *udev;
586 struct config *get_multipath_config(void) { return multipath_conf; }
587 void put_multipath_config(struct config *conf) { }
588 int main(void) {
589 udev = udev_new();
590 multipath_conf = mpath_lib_init();
591 return 0;
592 }'''
593 mpath_test_source_old = '''
594 #include <libudev.h>
595 #include <mpath_persist.h>
596 unsigned mpath_mx_alloc_len = 1024;
597 int logsink;
598 int main(void) {
599 struct udev *udev = udev_new();
600 mpath_lib_init(udev);
601 return 0;
602 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400603 libmpathpersist = cc.find_library('mpathpersist',
604 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100605 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400606 if libmpathpersist.found()
607 mpathlibs += libmpathpersist
608 if enable_static
609 mpathlibs += cc.find_library('devmapper',
610 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100611 kwargs: static_kwargs)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200612 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400613 mpathlibs += cc.find_library('multipath',
614 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100615 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400616 foreach lib: mpathlibs
617 if not lib.found()
618 mpathlibs = []
619 break
620 endif
621 endforeach
622 if mpathlibs.length() == 0
623 msg = 'Dependencies missing for libmpathpersist'
624 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200625 mpathpersist = declare_dependency(dependencies: mpathlibs)
626 mpathpersist_new_api = true
627 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
628 mpathpersist = declare_dependency(dependencies: mpathlibs)
629 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400630 msg = 'Cannot detect libmpathpersist API'
631 endif
632 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200633 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400634 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200635 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400636 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200637 endif
638 endif
639 endif
640endif
641
Yonggang Luo5285e592020-10-13 07:43:48 +0800642iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800643curses = not_found
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400644if have_system and not get_option('curses').disabled()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400645 curses_test = '''
646 #include <locale.h>
647 #include <curses.h>
648 #include <wchar.h>
649 int main(void) {
650 wchar_t wch = L'w';
651 setlocale(LC_ALL, "");
652 resize_term(0, 0);
653 addwstr(L"wide chars\n");
654 addnwstr(&wch, 1);
655 add_wch(WACS_DEGREE);
656 return 0;
657 }'''
658
Yonggang Luoca31e302020-11-17 05:31:06 +0800659 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
660 foreach curses_dep : curses_dep_list
661 if not curses.found()
662 curses = dependency(curses_dep,
663 required: false,
664 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100665 kwargs: static_kwargs)
Yonggang Luoca31e302020-11-17 05:31:06 +0800666 endif
667 endforeach
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400668 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500669 curses_compile_args = ['-DNCURSES_WIDECHAR']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400670 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500671 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
672 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400673 else
674 msg = 'curses package not usable'
675 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800676 endif
677 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400678 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400679 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
680 if targetos != 'windows' and not has_curses_h
681 message('Trying with /usr/include/ncursesw')
682 curses_compile_args += ['-I/usr/include/ncursesw']
683 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
684 endif
685 if has_curses_h
686 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
687 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800688 libcurses = cc.find_library(curses_libname,
689 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100690 kwargs: static_kwargs)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400691 if libcurses.found()
692 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
693 curses = declare_dependency(compile_args: curses_compile_args,
694 dependencies: [libcurses])
695 break
696 else
697 msg = 'curses library not usable'
698 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800699 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400700 endforeach
701 endif
702 endif
703 if not get_option('iconv').disabled()
704 foreach link_args : [ ['-liconv'], [] ]
705 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
706 # We need to use libiconv if available because mixing libiconv's headers with
707 # the system libc does not work.
708 # However, without adding glib to the dependencies -L/usr/local/lib will not be
709 # included in the command line and libiconv will not be found.
710 if cc.links('''
711 #include <iconv.h>
712 int main(void) {
713 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
714 return conv != (iconv_t) -1;
715 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
716 iconv = declare_dependency(link_args: link_args, dependencies: glib)
717 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800718 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400719 endforeach
720 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400721 if curses.found() and not iconv.found()
722 if get_option('iconv').enabled()
723 error('iconv not available')
724 endif
725 msg = 'iconv required for curses UI but not available'
726 curses = not_found
727 endif
728 if not curses.found() and msg != ''
729 if get_option('curses').enabled()
730 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400731 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400732 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400733 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800734 endif
735endif
736
Paolo Bonzini26347332019-07-29 15:40:07 +0200737brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100738if not get_option('brlapi').auto() or have_system
739 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
740 required: get_option('brlapi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100741 kwargs: static_kwargs)
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100742 if brlapi.found() and not cc.links('''
743 #include <brlapi.h>
744 #include <stddef.h>
745 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
746 brlapi = not_found
747 if get_option('brlapi').enabled()
748 error('could not link brlapi')
749 else
750 warning('could not link brlapi, disabling')
751 endif
752 endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200753endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100754
Paolo Bonzini760e4322020-08-26 08:09:48 +0200755sdl = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100756if not get_option('sdl').auto() or (have_system and not cocoa.found())
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100757 sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200758 sdl_image = not_found
759endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100760if sdl.found()
761 # work around 2.0.8 bug
762 sdl = declare_dependency(compile_args: '-Wno-undef',
763 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200764 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100765 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100766else
767 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100768 error('sdl-image required, but SDL was @0@'.format(
769 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100770 endif
771 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200772endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100773
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400774rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100775if not get_option('rbd').auto() or have_block
776 librados = cc.find_library('rados', required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100777 kwargs: static_kwargs)
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100778 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
779 required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100780 kwargs: static_kwargs)
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100781 if librados.found() and librbd.found()
782 if cc.links('''
783 #include <stdio.h>
784 #include <rbd/librbd.h>
785 int main(void) {
786 rados_t cluster;
787 rados_create(&cluster, NULL);
Peter Lieven48672ac2021-07-02 19:23:51 +0200788 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
789 #error
790 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100791 return 0;
792 }''', dependencies: [librbd, librados])
793 rbd = declare_dependency(dependencies: [librbd, librados])
794 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +0200795 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100796 else
Peter Lieven48672ac2021-07-02 19:23:51 +0200797 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100798 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100799 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400800endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100801
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400802glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100803glusterfs_ftruncate_has_stat = false
804glusterfs_iocb_has_stat = false
805if not get_option('glusterfs').auto() or have_block
806 glusterfs = dependency('glusterfs-api', version: '>=3',
807 required: get_option('glusterfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100808 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100809 if glusterfs.found()
810 glusterfs_ftruncate_has_stat = cc.links('''
811 #include <glusterfs/api/glfs.h>
812
813 int
814 main(void)
815 {
816 /* new glfs_ftruncate() passes two additional args */
817 return glfs_ftruncate(NULL, 0, NULL, NULL);
818 }
819 ''', dependencies: glusterfs)
820 glusterfs_iocb_has_stat = cc.links('''
821 #include <glusterfs/api/glfs.h>
822
823 /* new glfs_io_cbk() passes two additional glfs_stat structs */
824 static void
825 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
826 {}
827
828 int
829 main(void)
830 {
831 glfs_io_cbk iocb = &glusterfs_iocb;
832 iocb(NULL, 0 , NULL, NULL, NULL);
833 return 0;
834 }
835 ''', dependencies: glusterfs)
836 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400837endif
838libssh = not_found
839if 'CONFIG_LIBSSH' in config_host
840 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
841 link_args: config_host['LIBSSH_LIBS'].split())
842endif
843libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100844if not get_option('bzip2').auto() or have_block
845 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
846 required: get_option('bzip2'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100847 kwargs: static_kwargs)
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100848 if libbzip2.found() and not cc.links('''
849 #include <bzlib.h>
850 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
851 libbzip2 = not_found
852 if get_option('bzip2').enabled()
853 error('could not link libbzip2')
854 else
855 warning('could not link libbzip2, disabling')
856 endif
857 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400858endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100859
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400860liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +0100861if not get_option('lzfse').auto() or have_block
862 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
863 required: get_option('lzfse'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100864 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400865endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100866if liblzfse.found() and not cc.links('''
867 #include <lzfse.h>
868 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
869 liblzfse = not_found
870 if get_option('lzfse').enabled()
871 error('could not link liblzfse')
872 else
873 warning('could not link liblzfse, disabling')
874 endif
875endif
876
Paolo Bonzini478e9432020-08-17 12:47:55 +0200877oss = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200878if not get_option('oss').auto() or have_system
879 if not cc.has_header('sys/soundcard.h')
880 # not found
881 elif targetos == 'netbsd'
882 oss = cc.find_library('ossaudio', required: get_option('oss'),
883 kwargs: static_kwargs)
884 else
885 oss = declare_dependency()
886 endif
887
888 if not oss.found()
889 if get_option('oss').enabled()
890 error('OSS not found')
891 else
892 warning('OSS not found, disabling')
893 endif
894 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200895endif
896dsound = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200897if not get_option('dsound').auto() or (targetos == 'windows' and have_system)
898 if cc.has_header('dsound.h')
899 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
900 endif
901
902 if not dsound.found()
903 if get_option('dsound').enabled()
904 error('DirectSound not found')
905 else
906 warning('DirectSound not found, disabling')
907 endif
908 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200909endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200910
Paolo Bonzini478e9432020-08-17 12:47:55 +0200911coreaudio = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200912if not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system)
913 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
914 required: get_option('coreaudio'))
915 if coreaudio.found() and not cc.links('''
916 #include <CoreAudio/CoreAudio.h>
917 int main(void)
918 {
919 return (int)AudioGetCurrentHostTime();
920 }''')
921 coreaudio = not_found
922 endif
923
924 if not coreaudio.found()
925 if get_option('coreaudio').enabled()
926 error('CoreAudio not found')
927 else
928 warning('CoreAudio not found, disabling')
929 endif
930 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200931endif
Thomas Huth8bc51842021-07-13 13:09:02 +0200932
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400933opengl = not_found
934if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400935 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
936 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400937endif
Thomas Huth8bc51842021-07-13 13:09:02 +0200938gbm = not_found
939if (have_system or have_tools) and (virgl.found() or opengl.found())
940 gbm = dependency('gbm', method: 'pkg-config', required: false,
941 kwargs: static_kwargs)
942endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100943
Paolo Bonzini57612512021-06-03 11:15:26 +0200944gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +0100945gnutls_crypto = not_found
Alyssa Rossabc14fd2021-08-06 14:49:47 +0000946if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +0100947 # For general TLS support our min gnutls matches
948 # that implied by our platform support matrix
949 #
950 # For the crypto backends, we look for a newer
951 # gnutls:
952 #
953 # Version 3.6.8 is needed to get XTS
954 # Version 3.6.13 is needed to get PBKDF
955 # Version 3.6.14 is needed to get HW accelerated XTS
956 #
957 # If newer enough gnutls isn't available, we can
958 # still use a different crypto backend to satisfy
959 # the platform support requirements
960 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
961 method: 'pkg-config',
962 required: false,
963 kwargs: static_kwargs)
964 if gnutls_crypto.found()
965 gnutls = gnutls_crypto
966 else
967 # Our min version if all we need is TLS
968 gnutls = dependency('gnutls', version: '>=3.5.18',
969 method: 'pkg-config',
970 required: get_option('gnutls'),
971 kwargs: static_kwargs)
972 endif
Paolo Bonzini57612512021-06-03 11:15:26 +0200973endif
974
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +0100975# We prefer use of gnutls for crypto, unless the options
976# explicitly asked for nettle or gcrypt.
977#
978# If gnutls isn't available for crypto, then we'll prefer
979# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +0200980gcrypt = not_found
981nettle = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +0100982xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +0100983
Paolo Bonzini57612512021-06-03 11:15:26 +0200984if get_option('nettle').enabled() and get_option('gcrypt').enabled()
985 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +0200986endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +0100987
988# Explicit nettle/gcrypt request, so ignore gnutls for crypto
989if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +0100990 gnutls_crypto = not_found
991endif
Paolo Bonzini57612512021-06-03 11:15:26 +0200992
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +0100993if not gnutls_crypto.found()
994 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
995 gcrypt = dependency('libgcrypt', version: '>=1.8',
996 method: 'config-tool',
997 required: get_option('gcrypt'),
998 kwargs: static_kwargs)
999 # Debian has removed -lgpg-error from libgcrypt-config
1000 # as it "spreads unnecessary dependencies" which in
1001 # turn breaks static builds...
1002 if gcrypt.found() and enable_static
1003 gcrypt = declare_dependency(dependencies: [
1004 gcrypt,
1005 cc.find_library('gpg-error', required: true, kwargs: static_kwargs)])
1006 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001007 endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001008 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1009 nettle = dependency('nettle', version: '>=3.4',
1010 method: 'pkg-config',
1011 required: get_option('nettle'),
1012 kwargs: static_kwargs)
1013 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1014 xts = 'private'
1015 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001016 endif
1017endif
1018
1019gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +01001020gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001021vte = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +01001022if not get_option('gtk').auto() or (have_system and not cocoa.found())
Paolo Bonzini1b695472021-01-07 14:02:29 +01001023 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1024 method: 'pkg-config',
1025 required: get_option('gtk'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001026 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +01001027 if gtk.found()
1028 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1029 method: 'pkg-config',
1030 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001031 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +01001032 gtk = declare_dependency(dependencies: [gtk, gtkx11])
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001033
1034 if not get_option('vte').auto() or have_system
1035 vte = dependency('vte-2.91',
1036 method: 'pkg-config',
1037 required: get_option('vte'),
1038 kwargs: static_kwargs)
1039 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001040 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001041endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001042
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001043x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +02001044if gtkx11.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001045 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001046 kwargs: static_kwargs)
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001047endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001048vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001049png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001050jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001051sasl = not_found
Thomas Huth95e22892021-09-06 17:39:39 +02001052if have_system and not get_option('vnc').disabled()
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001053 vnc = declare_dependency() # dummy dependency
1054 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001055 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini8e242b32020-11-23 13:34:02 -05001056 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001057 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001058 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
1059 required: get_option('vnc_sasl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001060 kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001061 if sasl.found()
1062 sasl = declare_dependency(dependencies: sasl,
1063 compile_args: '-DSTRUCT_IOVEC_DEFINED')
1064 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001065endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01001066
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001067pam = not_found
1068if not get_option('auth_pam').auto() or have_system
1069 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
1070 required: get_option('auth_pam'),
1071 kwargs: static_kwargs)
1072endif
1073if pam.found() and not cc.links('''
1074 #include <stddef.h>
1075 #include <security/pam_appl.h>
1076 int main(void) {
1077 const char *service_name = "qemu";
1078 const char *user = "frank";
1079 const struct pam_conv pam_conv = { 0 };
1080 pam_handle_t *pamh = NULL;
1081 pam_start(service_name, user, &pam_conv, &pamh);
1082 return 0;
1083 }''', dependencies: pam)
1084 pam = not_found
1085 if get_option('auth_pam').enabled()
1086 error('could not link libpam')
1087 else
1088 warning('could not link libpam, disabling')
1089 endif
1090endif
1091
Marc-André Lureau708eab42019-09-03 16:59:33 +04001092snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +01001093if not get_option('snappy').auto() or have_system
1094 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
1095 required: get_option('snappy'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001096 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +04001097endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01001098if snappy.found() and not cc.links('''
1099 #include <snappy-c.h>
1100 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
1101 snappy = not_found
1102 if get_option('snappy').enabled()
1103 error('could not link libsnappy')
1104 else
1105 warning('could not link libsnappy, disabling')
1106 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +04001107endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001108
Marc-André Lureau708eab42019-09-03 16:59:33 +04001109lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001110if not get_option('lzo').auto() or have_system
1111 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
1112 required: get_option('lzo'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001113 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +04001114endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001115if lzo.found() and not cc.links('''
1116 #include <lzo/lzo1x.h>
1117 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
1118 lzo = not_found
1119 if get_option('lzo').enabled()
1120 error('could not link liblzo2')
1121 else
1122 warning('could not link liblzo2, disabling')
1123 endif
1124endif
1125
Marc-André Lureau55166232019-07-24 19:16:22 +04001126rdma = not_found
1127if 'CONFIG_RDMA' in config_host
1128 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
1129endif
Marc-André Lureauab318052019-07-24 19:23:16 +04001130numa = not_found
1131if 'CONFIG_NUMA' in config_host
1132 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
1133endif
Marc-André Lureau582ea952019-08-15 15:15:32 +04001134xen = not_found
1135if 'CONFIG_XEN_BACKEND' in config_host
1136 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
1137 link_args: config_host['XEN_LIBS'].split())
1138endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001139cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02001140if not get_option('smartcard').auto() or have_system
1141 cacard = dependency('libcacard', required: get_option('smartcard'),
1142 version: '>=2.5.1', method: 'pkg-config',
1143 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001144endif
César Belley0a40bcb2020-08-26 13:42:04 +02001145u2f = not_found
1146if have_system
1147 u2f = dependency('u2f-emu', required: get_option('u2f'),
1148 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001149 kwargs: static_kwargs)
César Belley0a40bcb2020-08-26 13:42:04 +02001150endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001151usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02001152if not get_option('usb_redir').auto() or have_system
1153 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
1154 version: '>=0.6', method: 'pkg-config',
1155 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001156endif
1157libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02001158if not get_option('libusb').auto() or have_system
1159 libusb = dependency('libusb-1.0', required: get_option('libusb'),
1160 version: '>=1.0.13', method: 'pkg-config',
1161 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001162endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02001163
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001164libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02001165if not get_option('libpmem').auto() or have_system
1166 libpmem = dependency('libpmem', required: get_option('libpmem'),
1167 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001168endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001169libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02001170if not get_option('libdaxctl').auto() or have_system
1171 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
1172 version: '>=57', method: 'pkg-config',
1173 kwargs: static_kwargs)
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001174endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001175tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02001176if gnutls.found()
1177 tasn1 = dependency('libtasn1',
1178 method: 'pkg-config',
1179 kwargs: static_kwargs)
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001180endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001181keyutils = dependency('libkeyutils', required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001182 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001183
Marc-André Lureau3909def2020-08-28 15:07:33 +04001184has_gettid = cc.has_function('gettid')
1185
Paolo Bonziniaa087962020-09-01 11:15:30 -04001186# Malloc tests
1187
1188malloc = []
1189if get_option('malloc') == 'system'
1190 has_malloc_trim = \
1191 not get_option('malloc_trim').disabled() and \
1192 cc.links('''#include <malloc.h>
1193 int main(void) { malloc_trim(0); return 0; }''')
1194else
1195 has_malloc_trim = false
1196 malloc = cc.find_library(get_option('malloc'), required: true)
1197endif
1198if not has_malloc_trim and get_option('malloc_trim').enabled()
1199 if get_option('malloc') == 'system'
1200 error('malloc_trim not available on this platform.')
1201 else
1202 error('malloc_trim not available with non-libc memory allocator')
1203 endif
1204endif
1205
Max Reitz84e319a2020-11-02 17:18:55 +01001206# Check whether the glibc provides statx()
1207
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001208gnu_source_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01001209 #ifndef _GNU_SOURCE
1210 #define _GNU_SOURCE
1211 #endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001212'''
1213statx_test = gnu_source_prefix + '''
Max Reitz84e319a2020-11-02 17:18:55 +01001214 #include <sys/stat.h>
1215 int main(void) {
1216 struct statx statxbuf;
1217 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
1218 return 0;
1219 }'''
1220
1221has_statx = cc.links(statx_test)
1222
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +00001223have_vhost_user_blk_server = (targetos == 'linux' and
1224 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001225
1226if get_option('vhost_user_blk_server').enabled()
1227 if targetos != 'linux'
1228 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +00001229 elif 'CONFIG_VHOST_USER' not in config_host
1230 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001231 endif
1232elif get_option('vhost_user_blk_server').disabled() or not have_system
1233 have_vhost_user_blk_server = false
1234endif
1235
Daniele Buono9e62ba42020-12-04 18:06:14 -05001236
Max Reitzdf4ea702020-10-27 20:05:46 +01001237if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1238 error('Cannot enable fuse-lseek while fuse is disabled')
1239endif
1240
Max Reitza484a712020-10-27 20:05:41 +01001241fuse = dependency('fuse3', required: get_option('fuse'),
1242 version: '>=3.1', method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001243 kwargs: static_kwargs)
Max Reitza484a712020-10-27 20:05:41 +01001244
Max Reitzdf4ea702020-10-27 20:05:46 +01001245fuse_lseek = not_found
1246if not get_option('fuse_lseek').disabled()
1247 if fuse.version().version_compare('>=3.8')
1248 # Dummy dependency
1249 fuse_lseek = declare_dependency()
1250 elif get_option('fuse_lseek').enabled()
1251 if fuse.found()
1252 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1253 else
1254 error('fuse-lseek requires libfuse, which was not found')
1255 endif
1256 endif
1257endif
1258
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001259# libbpf
1260libbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
1261if libbpf.found() and not cc.links('''
1262 #include <bpf/libbpf.h>
1263 int main(void)
1264 {
1265 bpf_object__destroy_skeleton(NULL);
1266 return 0;
1267 }''', dependencies: libbpf)
1268 libbpf = not_found
1269 if get_option('bpf').enabled()
1270 error('libbpf skeleton test failed')
1271 else
1272 warning('libbpf skeleton test failed, disabling')
1273 endif
1274endif
1275
Paolo Bonzini87430d52021-10-07 15:06:09 +02001276#################
1277# config-host.h #
1278#################
1279
1280audio_drivers_selected = []
1281if have_system
1282 audio_drivers_available = {
1283 'alsa': alsa.found(),
1284 'coreaudio': coreaudio.found(),
1285 'dsound': dsound.found(),
1286 'jack': jack.found(),
1287 'oss': oss.found(),
1288 'pa': pulse.found(),
1289 'sdl': sdl.found(),
1290 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02001291 foreach k, v: audio_drivers_available
1292 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
1293 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02001294
1295 # Default to native drivers first, OSS second, SDL third
1296 audio_drivers_priority = \
1297 [ 'pa', 'coreaudio', 'dsound', 'oss' ] + \
1298 (targetos == 'linux' ? [] : [ 'sdl' ])
1299 audio_drivers_default = []
1300 foreach k: audio_drivers_priority
1301 if audio_drivers_available[k]
1302 audio_drivers_default += k
1303 endif
1304 endforeach
1305
1306 foreach k: get_option('audio_drv_list')
1307 if k == 'default'
1308 audio_drivers_selected += audio_drivers_default
1309 elif not audio_drivers_available[k]
1310 error('Audio driver "@0@" not available.'.format(k))
1311 else
1312 audio_drivers_selected += k
1313 endif
1314 endforeach
1315endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001316config_host_data.set('CONFIG_AUDIO_DRIVERS',
1317 '"' + '", "'.join(audio_drivers_selected) + '", ')
1318
Daniele Buono9e62ba42020-12-04 18:06:14 -05001319if get_option('cfi')
1320 cfi_flags=[]
1321 # Check for dependency on LTO
1322 if not get_option('b_lto')
1323 error('Selected Control-Flow Integrity but LTO is disabled')
1324 endif
1325 if config_host.has_key('CONFIG_MODULES')
1326 error('Selected Control-Flow Integrity is not compatible with modules')
1327 endif
1328 # Check for cfi flags. CFI requires LTO so we can't use
1329 # get_supported_arguments, but need a more complex "compiles" which allows
1330 # custom arguments
1331 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1332 args: ['-flto', '-fsanitize=cfi-icall'] )
1333 cfi_flags += '-fsanitize=cfi-icall'
1334 else
1335 error('-fsanitize=cfi-icall is not supported by the compiler')
1336 endif
1337 if cc.compiles('int main () { return 0; }',
1338 name: '-fsanitize-cfi-icall-generalize-pointers',
1339 args: ['-flto', '-fsanitize=cfi-icall',
1340 '-fsanitize-cfi-icall-generalize-pointers'] )
1341 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1342 else
1343 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1344 endif
1345 if get_option('cfi_debug')
1346 if cc.compiles('int main () { return 0; }',
1347 name: '-fno-sanitize-trap=cfi-icall',
1348 args: ['-flto', '-fsanitize=cfi-icall',
1349 '-fno-sanitize-trap=cfi-icall'] )
1350 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1351 else
1352 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1353 endif
1354 endif
Marc-André Lureau5fc06172021-01-14 16:56:02 +04001355 add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1356 add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
Daniele Buono9e62ba42020-12-04 18:06:14 -05001357endif
1358
Joelle van Dyne14176c82021-03-15 11:03:38 -07001359have_host_block_device = (targetos != 'darwin' or
1360 cc.has_header('IOKit/storage/IOMedia.h'))
1361
Paolo Bonzini69202b42020-11-17 14:46:21 +01001362have_virtfs = (targetos == 'linux' and
1363 have_system and
1364 libattr.found() and
1365 libcap_ng.found())
1366
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01001367have_virtfs_proxy_helper = have_virtfs and have_tools
1368
Paolo Bonzini69202b42020-11-17 14:46:21 +01001369if get_option('virtfs').enabled()
1370 if not have_virtfs
1371 if targetos != 'linux'
1372 error('virtio-9p (virtfs) requires Linux')
1373 elif not libcap_ng.found() or not libattr.found()
1374 error('virtio-9p (virtfs) requires libcap-ng-devel and libattr-devel')
1375 elif not have_system
1376 error('virtio-9p (virtfs) needs system emulation support')
1377 endif
1378 endif
1379elif get_option('virtfs').disabled()
1380 have_virtfs = false
1381endif
1382
Paolo Bonzini9c29b742021-10-07 15:08:14 +02001383foreach k : get_option('trace_backends')
1384 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
1385endforeach
1386config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
1387
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001388config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1389config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1390config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1391config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1392config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
1393config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
1394config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1395config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1396config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1397config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1398config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1399config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1400
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001401config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001402config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04001403config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzini537b7242021-10-07 15:08:12 +02001404config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02001405config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001406config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001407config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001408config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1409config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001410config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08001411config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02001412config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001413config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1414if glusterfs.found()
1415 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1416 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1417 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1418 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1419 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1420 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1421endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001422config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001423config_host_data.set('CONFIG_VTE', vte.found())
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001424config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001425config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001426config_host_data.set('CONFIG_EBPF', libbpf.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001427config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001428config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01001429config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001430config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
1431config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001432config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001433config_host_data.set('CONFIG_SDL', sdl.found())
1434config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01001435config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01001436config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzini90540f32021-06-03 11:15:26 +02001437config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001438config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001439config_host_data.set('CONFIG_VNC', vnc.found())
1440config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1441config_host_data.set('CONFIG_VNC_PNG', png.found())
1442config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01001443config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001444config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001445config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001446config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04001447config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02001448config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001449config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02001450config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
1451config_host_data.set('CONFIG_NETTLE', nettle.found())
1452config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04001453config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01001454config_host_data.set('CONFIG_STATX', has_statx)
Paolo Bonzinib1def332020-11-17 13:37:39 +01001455config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01001456config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01001457config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01001458config_host_data.set('CONFIG_X11', x11.found())
Daniele Buono9e62ba42020-12-04 18:06:14 -05001459config_host_data.set('CONFIG_CFI', get_option('cfi'))
Paolo Bonzini859aef02020-08-04 18:14:26 +02001460config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1461config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1462config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1463config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1464
Paolo Bonzinia6305082021-10-07 15:08:15 +02001465config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001466config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
Paolo Bonzini269506d2021-10-07 15:08:16 +02001467config_host_data.set('HOST_WORDS_BIGENDIAN', host_machine.endian() == 'big')
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001468
1469# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001470config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02001471config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
1472config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
Thomas Huth48f670e2020-11-18 18:10:52 +01001473config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001474config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001475config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001476config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001477config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001478config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001479
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001480# has_function
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001481config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001482config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
1483config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
1484config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
1485config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001486config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001487config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001488config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001489config_host_data.set('CONFIG_SEM_TIMEDWAIT', cc.has_function('sem_timedwait', dependencies: threads))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001490config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
1491config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
1492config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
1493config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
1494config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001495config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001496config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001497config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001498config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001499
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001500# has_header_symbol
1501config_host_data.set('CONFIG_BYTESWAP_H',
1502 cc.has_header_symbol('byteswap.h', 'bswap_32'))
1503config_host_data.set('CONFIG_EPOLL_CREATE1',
1504 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02001505config_host_data.set('CONFIG_HAS_ENVIRON',
1506 cc.has_header_symbol('unistd.h', 'environ', prefix: gnu_source_prefix))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001507config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
1508 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
1509 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
1510config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
1511 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
1512config_host_data.set('CONFIG_FIEMAP',
1513 cc.has_header('linux/fiemap.h') and
1514 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001515config_host_data.set('CONFIG_GETRANDOM',
1516 cc.has_function('getrandom') and
1517 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001518config_host_data.set('CONFIG_INOTIFY',
1519 cc.has_header_symbol('sys/inotify.h', 'inotify_init'))
1520config_host_data.set('CONFIG_INOTIFY1',
1521 cc.has_header_symbol('sys/inotify.h', 'inotify_init1'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001522config_host_data.set('CONFIG_MACHINE_BSWAP_H',
1523 cc.has_header_symbol('machine/bswap.h', 'bswap32',
1524 prefix: '''#include <sys/endian.h>
1525 #include <sys/types.h>'''))
1526config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
1527 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001528config_host_data.set('CONFIG_RTNETLINK',
1529 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
1530config_host_data.set('CONFIG_SYSMACROS',
1531 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001532config_host_data.set('HAVE_OPTRESET',
1533 cc.has_header_symbol('getopt.h', 'optreset'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001534config_host_data.set('HAVE_UTMPX',
1535 cc.has_header_symbol('utmpx.h', 'struct utmpx'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04001536config_host_data.set('HAVE_IPPROTO_MPTCP',
1537 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001538
1539# has_member
1540config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
1541 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
1542 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001543config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
1544 cc.has_member('struct stat', 'st_atim',
1545 prefix: '#include <sys/stat.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001546
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001547config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001548 #include <sys/eventfd.h>
1549 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001550config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001551 #include <unistd.h>
1552 int main(void) {
1553 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
1554 return fdatasync(0);
1555 #else
1556 #error Not supported
1557 #endif
1558 }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001559config_host_data.set('CONFIG_MADVISE', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001560 #include <sys/types.h>
1561 #include <sys/mman.h>
1562 #include <stddef.h>
1563 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001564config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001565 #include <sys/mman.h>
1566 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001567config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02001568 #include <fcntl.h>
1569 #if !defined(AT_EMPTY_PATH)
1570 # error missing definition
1571 #else
1572 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
1573 #endif'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001574config_host_data.set('CONFIG_PIPE2', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001575 #include <unistd.h>
1576 #include <fcntl.h>
1577
1578 int main(void)
1579 {
1580 int pipefd[2];
1581 return pipe2(pipefd, O_CLOEXEC);
1582 }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001583config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001584 #include <sys/mman.h>
1585 #include <stddef.h>
1586 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
Paolo Bonzini10f6b232021-10-07 15:08:19 +02001587
1588config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links('''
1589 #include <pthread.h>
1590
1591 static void *f(void *p) { return NULL; }
1592 int main(void)
1593 {
1594 pthread_t thread;
1595 pthread_create(&thread, 0, f, 0);
1596 pthread_setname_np(thread, "QEMU");
1597 return 0;
1598 }''', dependencies: threads))
1599config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links('''
1600 #include <pthread.h>
1601
1602 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
1603 int main(void)
1604 {
1605 pthread_t thread;
1606 pthread_create(&thread, 0, f, 0);
1607 return 0;
1608 }''', dependencies: threads))
1609
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001610config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02001611 #include <sys/signalfd.h>
1612 #include <stddef.h>
1613 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001614config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001615 #include <unistd.h>
1616 #include <fcntl.h>
1617 #include <limits.h>
1618
1619 int main(void)
1620 {
1621 int len, fd = 0;
1622 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
1623 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
1624 return 0;
1625 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001626
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02001627config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
1628 #include <sys/mman.h>
1629 int main(int argc, char *argv[]) {
1630 return mlockall(MCL_FUTURE);
1631 }'''))
1632
1633# Work around a system header bug with some kernel/XFS header
1634# versions where they both try to define 'struct fsxattr':
1635# xfs headers will not try to redefine structs from linux headers
1636# if this macro is set.
1637config_host_data.set('HAVE_FSXATTR', cc.links('''
1638 #include <linux/fs.h>'
1639 struct fsxattr foo;
1640 int main(void) {
1641 return 0;
1642 }'''))
1643
Paolo Bonzinie46bd552021-06-03 11:57:04 +02001644# Some versions of Mac OS X incorrectly define SIZE_MAX
1645config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
1646 #include <stdint.h>
1647 #include <stdio.h>
1648 int main(int argc, char *argv[]) {
1649 return printf("%zu", SIZE_MAX);
1650 }''', args: ['-Werror']))
1651
Paolo Bonzinia76a1f62021-10-13 10:04:24 +02001652ignored = ['CONFIG_QEMU_INTERP_PREFIX', # actually per-target
1653 'HAVE_GDB_BIN']
Paolo Bonzini87430d52021-10-07 15:06:09 +02001654arrays = ['CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzinia6305082021-10-07 15:08:15 +02001655strings = ['CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001656foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -04001657 if ignored.contains(k)
1658 # do nothing
1659 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001660 if v != ''
1661 v = '"' + '", "'.join(v.split()) + '", '
1662 endif
1663 config_host_data.set(k, v)
1664 elif k == 'ARCH'
1665 config_host_data.set('HOST_' + v.to_upper(), 1)
1666 elif strings.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001667 config_host_data.set_quoted(k, v)
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02001668 elif k.startswith('CONFIG_')
Paolo Bonzini859aef02020-08-04 18:14:26 +02001669 config_host_data.set(k, v == 'y' ? 1 : v)
1670 endif
1671endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02001672
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001673########################
1674# Target configuration #
1675########################
1676
Paolo Bonzini2becc362020-02-03 11:42:03 +01001677minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04001678config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001679config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001680config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001681config_devices_mak_list = []
1682config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02001683config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001684config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001685
1686disassemblers = {
1687 'alpha' : ['CONFIG_ALPHA_DIS'],
1688 'arm' : ['CONFIG_ARM_DIS'],
1689 'avr' : ['CONFIG_AVR_DIS'],
1690 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06001691 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001692 'hppa' : ['CONFIG_HPPA_DIS'],
1693 'i386' : ['CONFIG_I386_DIS'],
1694 'x86_64' : ['CONFIG_I386_DIS'],
1695 'x32' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001696 'm68k' : ['CONFIG_M68K_DIS'],
1697 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1698 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001699 'nios2' : ['CONFIG_NIOS2_DIS'],
1700 'or1k' : ['CONFIG_OPENRISC_DIS'],
1701 'ppc' : ['CONFIG_PPC_DIS'],
1702 'riscv' : ['CONFIG_RISCV_DIS'],
1703 'rx' : ['CONFIG_RX_DIS'],
1704 's390' : ['CONFIG_S390_DIS'],
1705 'sh4' : ['CONFIG_SH4_DIS'],
1706 'sparc' : ['CONFIG_SPARC_DIS'],
1707 'xtensa' : ['CONFIG_XTENSA_DIS'],
1708}
1709if link_language == 'cpp'
1710 disassemblers += {
1711 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1712 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1713 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1714 }
1715endif
1716
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001717have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01001718host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02001719 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001720 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
1721 ('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02001722 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001723 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01001724 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001725 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1726 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1727 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01001728 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001729 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman3090de62021-01-29 11:46:05 -05001730 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : []) + \
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01001731 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01001732
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001733ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001734
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001735default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1736actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001737fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001738foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04001739 config_target = { 'TARGET_NAME': target.split('-')[0] }
1740 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001741 if targetos != 'linux'
1742 if default_targets
1743 continue
1744 endif
1745 error('Target @0@ is only available on a Linux host'.format(target))
1746 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001747 config_target += { 'CONFIG_LINUX_USER': 'y' }
1748 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001749 if 'CONFIG_BSD' not in config_host
1750 if default_targets
1751 continue
1752 endif
1753 error('Target @0@ is only available on a BSD host'.format(target))
1754 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001755 config_target += { 'CONFIG_BSD_USER': 'y' }
1756 elif target.endswith('softmmu')
1757 config_target += { 'CONFIG_SOFTMMU': 'y' }
1758 endif
1759 if target.endswith('-user')
1760 config_target += {
1761 'CONFIG_USER_ONLY': 'y',
1762 'CONFIG_QEMU_INTERP_PREFIX':
1763 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1764 }
1765 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001766
Paolo Bonzini0a189112020-11-17 14:58:32 +01001767 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04001768 foreach sym: accelerators
1769 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1770 config_target += { sym: 'y' }
1771 config_all += { sym: 'y' }
Paolo Bonzini23a77b22020-12-14 12:01:45 +01001772 if sym == 'CONFIG_TCG' and tcg_arch == 'tci'
1773 config_target += { 'CONFIG_TCG_INTERPRETER': 'y' }
1774 elif sym == 'CONFIG_XEN' and have_xen_pci_passthrough
Paolo Bonzini8a199802020-09-18 05:37:01 -04001775 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1776 endif
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02001777 if target in modular_tcg
1778 config_target += { 'CONFIG_TCG_MODULAR': 'y' }
1779 else
1780 config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
1781 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01001782 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04001783 endif
1784 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01001785 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001786 if default_targets
1787 continue
1788 endif
1789 error('No accelerator available for target @0@'.format(target))
1790 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001791
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001792 actual_target_dirs += target
Alex Bennée812b31d2021-07-07 14:17:43 +01001793 config_target += keyval.load('configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001794 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001795
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001796 if 'TARGET_NEED_FDT' in config_target
1797 fdt_required += target
1798 endif
1799
Paolo Bonzinifa731682020-09-21 05:19:07 -04001800 # Add default keys
1801 if 'TARGET_BASE_ARCH' not in config_target
1802 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1803 endif
1804 if 'TARGET_ABI_DIR' not in config_target
1805 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1806 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001807
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001808 foreach k, v: disassemblers
1809 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1810 foreach sym: v
1811 config_target += { sym: 'y' }
1812 config_all_disas += { sym: 'y' }
1813 endforeach
1814 endif
1815 endforeach
1816
Paolo Bonzini859aef02020-08-04 18:14:26 +02001817 config_target_data = configuration_data()
1818 foreach k, v: config_target
1819 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1820 # do nothing
1821 elif ignored.contains(k)
1822 # do nothing
1823 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001824 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1825 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001826 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001827 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001828 config_target_data.set_quoted(k, v)
1829 elif v == 'y'
1830 config_target_data.set(k, 1)
1831 else
1832 config_target_data.set(k, v)
1833 endif
1834 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01001835 config_target_data.set('QEMU_ARCH',
1836 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02001837 config_target_h += {target: configure_file(output: target + '-config-target.h',
1838 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001839
1840 if target.endswith('-softmmu')
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01001841 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001842 config_devices_mak = target + '-config-devices.mak'
1843 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01001844 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001845 output: config_devices_mak,
1846 depfile: config_devices_mak + '.d',
1847 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01001848 command: [minikconf,
1849 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01001850 config_devices_mak, '@DEPFILE@', '@INPUT@',
Philippe Mathieu-Daudéf4063f92021-07-07 14:17:40 +01001851 host_kconfig, accel_kconfig,
1852 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'])
Paolo Bonzini859aef02020-08-04 18:14:26 +02001853
1854 config_devices_data = configuration_data()
1855 config_devices = keyval.load(config_devices_mak)
1856 foreach k, v: config_devices
1857 config_devices_data.set(k, 1)
1858 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001859 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001860 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1861 configuration: config_devices_data)}
1862 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001863 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001864 endif
1865 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001866endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001867target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001868
Paolo Bonzini2becc362020-02-03 11:42:03 +01001869# This configuration is used to build files that are shared by
1870# multiple binaries, and then extracted out of the "common"
1871# static_library target.
1872#
1873# We do not use all_sources()/all_dependencies(), because it would
1874# build literally all source files, including devices only used by
1875# targets that are not built for this compilation. The CONFIG_ALL
1876# pseudo symbol replaces it.
1877
Paolo Bonzini05512f52020-09-16 15:31:11 -04001878config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001879config_all += config_host
1880config_all += config_all_disas
1881config_all += {
1882 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1883 'CONFIG_SOFTMMU': have_system,
1884 'CONFIG_USER_ONLY': have_user,
1885 'CONFIG_ALL': true,
1886}
1887
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001888##############
1889# Submodules #
1890##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001891
1892capstone = not_found
1893capstone_opt = get_option('capstone')
1894if capstone_opt in ['enabled', 'auto', 'system']
1895 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07001896 capstone = dependency('capstone', version: '>=4.0',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001897 kwargs: static_kwargs, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001898 required: capstone_opt == 'system' or
1899 capstone_opt == 'enabled' and not have_internal)
Daniel P. Berrangé8f4aea72021-07-09 15:29:31 +01001900
1901 # Some versions of capstone have broken pkg-config file
1902 # that reports a wrong -I path, causing the #include to
1903 # fail later. If the system has such a broken version
1904 # do not use it.
1905 if capstone.found() and not cc.compiles('#include <capstone.h>',
1906 dependencies: [capstone])
1907 capstone = not_found
1908 if capstone_opt == 'system'
1909 error('system capstone requested, it does not appear to work')
1910 endif
1911 endif
1912
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001913 if capstone.found()
1914 capstone_opt = 'system'
1915 elif have_internal
1916 capstone_opt = 'internal'
1917 else
1918 capstone_opt = 'disabled'
1919 endif
1920endif
1921if capstone_opt == 'internal'
1922 capstone_data = configuration_data()
1923 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1924
1925 capstone_files = files(
1926 'capstone/cs.c',
1927 'capstone/MCInst.c',
1928 'capstone/MCInstrDesc.c',
1929 'capstone/MCRegisterInfo.c',
1930 'capstone/SStream.c',
1931 'capstone/utils.c'
1932 )
1933
1934 if 'CONFIG_ARM_DIS' in config_all_disas
1935 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1936 capstone_files += files(
1937 'capstone/arch/ARM/ARMDisassembler.c',
1938 'capstone/arch/ARM/ARMInstPrinter.c',
1939 'capstone/arch/ARM/ARMMapping.c',
1940 'capstone/arch/ARM/ARMModule.c'
1941 )
1942 endif
1943
1944 # FIXME: This config entry currently depends on a c++ compiler.
1945 # Which is needed for building libvixl, but not for capstone.
1946 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1947 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1948 capstone_files += files(
1949 'capstone/arch/AArch64/AArch64BaseInfo.c',
1950 'capstone/arch/AArch64/AArch64Disassembler.c',
1951 'capstone/arch/AArch64/AArch64InstPrinter.c',
1952 'capstone/arch/AArch64/AArch64Mapping.c',
1953 'capstone/arch/AArch64/AArch64Module.c'
1954 )
1955 endif
1956
1957 if 'CONFIG_PPC_DIS' in config_all_disas
1958 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1959 capstone_files += files(
1960 'capstone/arch/PowerPC/PPCDisassembler.c',
1961 'capstone/arch/PowerPC/PPCInstPrinter.c',
1962 'capstone/arch/PowerPC/PPCMapping.c',
1963 'capstone/arch/PowerPC/PPCModule.c'
1964 )
1965 endif
1966
Richard Henderson3d562842020-01-04 07:24:59 +10001967 if 'CONFIG_S390_DIS' in config_all_disas
1968 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1969 capstone_files += files(
1970 'capstone/arch/SystemZ/SystemZDisassembler.c',
1971 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1972 'capstone/arch/SystemZ/SystemZMapping.c',
1973 'capstone/arch/SystemZ/SystemZModule.c',
1974 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1975 )
1976 endif
1977
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001978 if 'CONFIG_I386_DIS' in config_all_disas
1979 capstone_data.set('CAPSTONE_HAS_X86', 1)
1980 capstone_files += files(
1981 'capstone/arch/X86/X86Disassembler.c',
1982 'capstone/arch/X86/X86DisassemblerDecoder.c',
1983 'capstone/arch/X86/X86ATTInstPrinter.c',
1984 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07001985 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001986 'capstone/arch/X86/X86Mapping.c',
1987 'capstone/arch/X86/X86Module.c'
1988 )
1989 endif
1990
1991 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1992
1993 capstone_cargs = [
1994 # FIXME: There does not seem to be a way to completely replace the c_args
1995 # that come from add_project_arguments() -- we can only add to them.
1996 # So: disable all warnings with a big hammer.
1997 '-Wno-error', '-w',
1998
1999 # Include all configuration defines via a header file, which will wind up
2000 # as a dependency on the object file, and thus changes here will result
2001 # in a rebuild.
2002 '-include', 'capstone-defs.h'
2003 ]
2004
2005 libcapstone = static_library('capstone',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01002006 build_by_default: false,
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002007 sources: capstone_files,
2008 c_args: capstone_cargs,
2009 include_directories: 'capstone/include')
2010 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07002011 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002012endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002013
2014slirp = not_found
2015slirp_opt = 'disabled'
2016if have_system
2017 slirp_opt = get_option('slirp')
2018 if slirp_opt in ['enabled', 'auto', 'system']
2019 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01002020 slirp = dependency('slirp', kwargs: static_kwargs,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002021 method: 'pkg-config',
2022 required: slirp_opt == 'system' or
2023 slirp_opt == 'enabled' and not have_internal)
2024 if slirp.found()
2025 slirp_opt = 'system'
2026 elif have_internal
2027 slirp_opt = 'internal'
2028 else
2029 slirp_opt = 'disabled'
2030 endif
2031 endif
2032 if slirp_opt == 'internal'
2033 slirp_deps = []
2034 if targetos == 'windows'
2035 slirp_deps = cc.find_library('iphlpapi')
Marc-André Lureau43f547b2021-05-18 19:51:11 +04002036 elif targetos == 'darwin'
2037 slirp_deps = cc.find_library('resolv')
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002038 endif
2039 slirp_conf = configuration_data()
2040 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
2041 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
2042 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
2043 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
2044 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
2045 slirp_files = [
2046 'slirp/src/arp_table.c',
2047 'slirp/src/bootp.c',
2048 'slirp/src/cksum.c',
2049 'slirp/src/dhcpv6.c',
2050 'slirp/src/dnssearch.c',
2051 'slirp/src/if.c',
2052 'slirp/src/ip6_icmp.c',
2053 'slirp/src/ip6_input.c',
2054 'slirp/src/ip6_output.c',
2055 'slirp/src/ip_icmp.c',
2056 'slirp/src/ip_input.c',
2057 'slirp/src/ip_output.c',
2058 'slirp/src/mbuf.c',
2059 'slirp/src/misc.c',
2060 'slirp/src/ncsi.c',
2061 'slirp/src/ndp_table.c',
2062 'slirp/src/sbuf.c',
2063 'slirp/src/slirp.c',
2064 'slirp/src/socket.c',
2065 'slirp/src/state.c',
2066 'slirp/src/stream.c',
2067 'slirp/src/tcp_input.c',
2068 'slirp/src/tcp_output.c',
2069 'slirp/src/tcp_subr.c',
2070 'slirp/src/tcp_timer.c',
2071 'slirp/src/tftp.c',
2072 'slirp/src/udp.c',
2073 'slirp/src/udp6.c',
2074 'slirp/src/util.c',
2075 'slirp/src/version.c',
2076 'slirp/src/vmstate.c',
2077 ]
2078
2079 configure_file(
2080 input : 'slirp/src/libslirp-version.h.in',
2081 output : 'libslirp-version.h',
2082 configuration: slirp_conf)
2083
2084 slirp_inc = include_directories('slirp', 'slirp/src')
2085 libslirp = static_library('slirp',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01002086 build_by_default: false,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002087 sources: slirp_files,
2088 c_args: slirp_cargs,
2089 include_directories: slirp_inc)
2090 slirp = declare_dependency(link_with: libslirp,
2091 dependencies: slirp_deps,
2092 include_directories: slirp_inc)
2093 endif
2094endif
2095
Daniele Buonoc7153432021-03-03 21:59:38 -05002096# For CFI, we need to compile slirp as a static library together with qemu.
2097# This is because we register slirp functions as callbacks for QEMU Timers.
2098# When using a system-wide shared libslirp, the type information for the
2099# callback is missing and the timer call produces a false positive with CFI.
2100#
2101# Now that slirp_opt has been defined, check if the selected slirp is compatible
2102# with control-flow integrity.
2103if get_option('cfi') and slirp_opt == 'system'
2104 error('Control-Flow Integrity is not compatible with system-wide slirp.' \
2105 + ' Please configure with --enable-slirp=git')
2106endif
2107
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002108fdt = not_found
2109fdt_opt = get_option('fdt')
2110if have_system
2111 if fdt_opt in ['enabled', 'auto', 'system']
2112 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01002113 fdt = cc.find_library('fdt', kwargs: static_kwargs,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002114 required: fdt_opt == 'system' or
2115 fdt_opt == 'enabled' and not have_internal)
2116 if fdt.found() and cc.links('''
2117 #include <libfdt.h>
2118 #include <libfdt_env.h>
2119 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
2120 dependencies: fdt)
2121 fdt_opt = 'system'
Thomas Huth6c228532021-08-27 14:09:00 +02002122 elif fdt_opt == 'system'
2123 error('system libfdt requested, but it is too old (1.5.1 or newer required)')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002124 elif have_internal
2125 fdt_opt = 'internal'
2126 else
2127 fdt_opt = 'disabled'
Thomas Huth87daf892021-08-27 14:08:59 +02002128 fdt = not_found
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002129 endif
2130 endif
2131 if fdt_opt == 'internal'
2132 fdt_files = files(
2133 'dtc/libfdt/fdt.c',
2134 'dtc/libfdt/fdt_ro.c',
2135 'dtc/libfdt/fdt_wip.c',
2136 'dtc/libfdt/fdt_sw.c',
2137 'dtc/libfdt/fdt_rw.c',
2138 'dtc/libfdt/fdt_strerror.c',
2139 'dtc/libfdt/fdt_empty_tree.c',
2140 'dtc/libfdt/fdt_addresses.c',
2141 'dtc/libfdt/fdt_overlay.c',
2142 'dtc/libfdt/fdt_check.c',
2143 )
2144
2145 fdt_inc = include_directories('dtc/libfdt')
2146 libfdt = static_library('fdt',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01002147 build_by_default: false,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002148 sources: fdt_files,
2149 include_directories: fdt_inc)
2150 fdt = declare_dependency(link_with: libfdt,
2151 include_directories: fdt_inc)
2152 endif
2153endif
2154if not fdt.found() and fdt_required.length() > 0
2155 error('fdt not available but required by targets ' + ', '.join(fdt_required))
2156endif
2157
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002158config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002159config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002160config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002161
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002162#####################
2163# Generated sources #
2164#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002165
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002166genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002167
Marc-André Lureau3f885652019-07-15 18:06:04 +04002168hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04002169shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002170qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002171qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
2172 meson.current_source_dir() / 'scripts/qapi/commands.py',
2173 meson.current_source_dir() / 'scripts/qapi/common.py',
2174 meson.current_source_dir() / 'scripts/qapi/error.py',
2175 meson.current_source_dir() / 'scripts/qapi/events.py',
2176 meson.current_source_dir() / 'scripts/qapi/expr.py',
2177 meson.current_source_dir() / 'scripts/qapi/gen.py',
2178 meson.current_source_dir() / 'scripts/qapi/introspect.py',
2179 meson.current_source_dir() / 'scripts/qapi/parser.py',
2180 meson.current_source_dir() / 'scripts/qapi/schema.py',
2181 meson.current_source_dir() / 'scripts/qapi/source.py',
2182 meson.current_source_dir() / 'scripts/qapi/types.py',
2183 meson.current_source_dir() / 'scripts/qapi/visit.py',
2184 meson.current_source_dir() / 'scripts/qapi/common.py',
2185 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002186]
2187
2188tracetool = [
2189 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002190 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002191]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002192tracetool_depends = files(
2193 'scripts/tracetool/backend/log.py',
2194 'scripts/tracetool/backend/__init__.py',
2195 'scripts/tracetool/backend/dtrace.py',
2196 'scripts/tracetool/backend/ftrace.py',
2197 'scripts/tracetool/backend/simple.py',
2198 'scripts/tracetool/backend/syslog.py',
2199 'scripts/tracetool/backend/ust.py',
2200 'scripts/tracetool/format/tcg_h.py',
2201 'scripts/tracetool/format/ust_events_c.py',
2202 'scripts/tracetool/format/ust_events_h.py',
2203 'scripts/tracetool/format/__init__.py',
2204 'scripts/tracetool/format/d.py',
2205 'scripts/tracetool/format/tcg_helper_c.py',
2206 'scripts/tracetool/format/simpletrace_stap.py',
2207 'scripts/tracetool/format/c.py',
2208 'scripts/tracetool/format/h.py',
2209 'scripts/tracetool/format/tcg_helper_h.py',
2210 'scripts/tracetool/format/log_stap.py',
2211 'scripts/tracetool/format/stap.py',
2212 'scripts/tracetool/format/tcg_helper_wrapper_h.py',
2213 'scripts/tracetool/__init__.py',
2214 'scripts/tracetool/transform.py',
2215 'scripts/tracetool/vcpu.py'
2216)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002217
Marc-André Lureau2c273f32019-07-15 17:10:19 +04002218qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
2219 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02002220 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04002221qemu_version = custom_target('qemu-version.h',
2222 output: 'qemu-version.h',
2223 command: qemu_version_cmd,
2224 capture: true,
2225 build_by_default: true,
2226 build_always_stale: true)
2227genh += qemu_version
2228
Marc-André Lureau3f885652019-07-15 18:06:04 +04002229hxdep = []
2230hx_headers = [
2231 ['qemu-options.hx', 'qemu-options.def'],
2232 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
2233]
2234if have_system
2235 hx_headers += [
2236 ['hmp-commands.hx', 'hmp-commands.h'],
2237 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
2238 ]
2239endif
2240foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002241 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04002242 input: files(d[0]),
2243 output: d[1],
2244 capture: true,
2245 build_by_default: true, # to be removed when added to a target
2246 command: [hxtool, '-h', '@INPUT0@'])
2247endforeach
2248genh += hxdep
2249
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002250###################
2251# Collect sources #
2252###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002253
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02002254authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002255blockdev_ss = ss.source_set()
2256block_ss = ss.source_set()
2257bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002258chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002259common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002260crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002261io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002262linux_user_ss = ss.source_set()
2263qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02002264qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002265softmmu_ss = ss.source_set()
2266specific_fuzz_ss = ss.source_set()
2267specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002268stub_ss = ss.source_set()
2269trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002270user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002271util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002272
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002273# accel modules
2274qtest_module_ss = ss.source_set()
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002275tcg_module_ss = ss.source_set()
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002276
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002277modules = {}
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002278target_modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002279hw_arch = {}
2280target_arch = {}
2281target_softmmu_arch = {}
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02002282target_user_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002283
2284###############
2285# Trace files #
2286###############
2287
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002288# TODO: add each directory to the subdirs from its own meson.build, once
2289# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002290trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002291 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01002292 'qapi',
2293 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002294 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01002295 'util',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002296]
2297if have_user
2298 trace_events_subdirs += [ 'linux-user' ]
2299endif
2300if have_block
2301 trace_events_subdirs += [
2302 'authz',
2303 'block',
2304 'io',
2305 'nbd',
2306 'scsi',
2307 ]
2308endif
2309if have_system
2310 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002311 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002312 'audio',
2313 'backends',
2314 'backends/tpm',
2315 'chardev',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002316 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002317 'hw/9pfs',
2318 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08002319 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002320 'hw/alpha',
2321 'hw/arm',
2322 'hw/audio',
2323 'hw/block',
2324 'hw/block/dataplane',
2325 'hw/char',
2326 'hw/display',
2327 'hw/dma',
2328 'hw/hppa',
2329 'hw/hyperv',
2330 'hw/i2c',
2331 'hw/i386',
2332 'hw/i386/xen',
2333 'hw/ide',
2334 'hw/input',
2335 'hw/intc',
2336 'hw/isa',
2337 'hw/mem',
2338 'hw/mips',
2339 'hw/misc',
2340 'hw/misc/macio',
2341 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08002342 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01002343 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02002344 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002345 'hw/nvram',
2346 'hw/pci',
2347 'hw/pci-host',
2348 'hw/ppc',
2349 'hw/rdma',
2350 'hw/rdma/vmw',
2351 'hw/rtc',
2352 'hw/s390x',
2353 'hw/scsi',
2354 'hw/sd',
2355 'hw/sparc',
2356 'hw/sparc64',
2357 'hw/ssi',
2358 'hw/timer',
2359 'hw/tpm',
2360 'hw/usb',
2361 'hw/vfio',
2362 'hw/virtio',
2363 'hw/watchdog',
2364 'hw/xen',
2365 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002366 'migration',
2367 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02002368 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002369 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05002370 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002371 ]
2372endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002373if have_system or have_user
2374 trace_events_subdirs += [
2375 'accel/tcg',
2376 'hw/core',
2377 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02002378 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002379 'target/hppa',
2380 'target/i386',
2381 'target/i386/kvm',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02002382 'target/mips/tcg',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002383 'target/ppc',
2384 'target/riscv',
2385 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08002386 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002387 'target/sparc',
2388 ]
2389endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002390
Marc-André Lureau0df750e2020-11-25 14:06:37 +04002391vhost_user = not_found
2392if 'CONFIG_VHOST_USER' in config_host
2393 libvhost_user = subproject('libvhost-user')
2394 vhost_user = libvhost_user.get_variable('vhost_user_dep')
2395endif
2396
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002397subdir('qapi')
2398subdir('qobject')
2399subdir('stubs')
2400subdir('trace')
2401subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04002402subdir('qom')
2403subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002404subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04002405subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002406
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002407
2408if enable_modules
2409 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
2410 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
2411endif
2412
Paolo Bonzini2becc362020-02-03 11:42:03 +01002413stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002414
2415util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01002416util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002417libqemuutil = static_library('qemuutil',
2418 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +02002419 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002420qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04002421 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002422
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01002423if have_system or have_user
2424 decodetree = generator(find_program('scripts/decodetree.py'),
2425 output: 'decode-@BASENAME@.c.inc',
2426 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
2427 subdir('libdecnumber')
2428 subdir('target')
2429endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002430
Paolo Bonzini478e9432020-08-17 12:47:55 +02002431subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04002432subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04002433subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04002434subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04002435subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04002436
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002437if have_block
2438 block_ss.add(files(
2439 'block.c',
2440 'blockjob.c',
2441 'job.c',
2442 'qemu-io-cmds.c',
2443 ))
2444 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002445
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002446 subdir('nbd')
2447 subdir('scsi')
2448 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002449
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002450 blockdev_ss.add(files(
2451 'blockdev.c',
2452 'blockdev-nbd.c',
2453 'iothread.c',
2454 'job-qmp.c',
2455 ), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02002456
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002457 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
2458 # os-win32.c does not
2459 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
2460 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
2461endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02002462
2463common_ss.add(files('cpus-common.c'))
2464
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02002465subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002466
Richard Hendersonf3433462020-09-12 10:47:33 -07002467common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02002468specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002469
Richard Henderson44b99a62021-03-22 12:24:26 +01002470# Work around a gcc bug/misfeature wherein constant propagation looks
2471# through an alias:
2472# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
2473# to guess that a const variable is always zero. Without lto, this is
2474# impossible, as the alias is restricted to page-vary-common.c. Indeed,
2475# without lto, not even the alias is required -- we simply use different
2476# declarations in different compilation units.
2477pagevary = files('page-vary-common.c')
2478if get_option('b_lto')
2479 pagevary_flags = ['-fno-lto']
2480 if get_option('cfi')
2481 pagevary_flags += '-fno-sanitize=cfi-icall'
2482 endif
2483 pagevary = static_library('page-vary-common', sources: pagevary,
2484 c_args: pagevary_flags)
2485 pagevary = declare_dependency(link_with: pagevary)
2486endif
2487common_ss.add(pagevary)
Richard Henderson6670d4d2021-03-22 12:24:24 +01002488specific_ss.add(files('page-vary.c'))
2489
Marc-André Lureauab318052019-07-24 19:23:16 +04002490subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04002491subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04002492subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002493subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04002494subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04002495subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00002496subdir('semihosting')
Marc-André Lureau582ea952019-08-15 15:15:32 +04002497subdir('hw')
Richard Henderson104cc2c2021-03-08 12:04:33 -08002498subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08002499subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04002500subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002501subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04002502subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04002503subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002504subdir('ebpf')
2505
Marc-André Lureaub309c322019-08-18 19:20:37 +04002506bsd_user_ss.add(files('gdbstub.c'))
2507specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
2508
Marc-André Lureau3a304462019-08-18 16:13:08 +04002509linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
2510specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02002511
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002512# needed for fuzzing binaries
2513subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002514subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002515
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002516# accel modules
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002517tcg_real_module_ss = ss.source_set()
2518tcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
2519specific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
2520target_modules += { 'accel' : { 'qtest': qtest_module_ss,
2521 'tcg': tcg_real_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002522
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002523########################
2524# Library dependencies #
2525########################
2526
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002527modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02002528modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002529modinfo_files = []
2530
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002531block_mods = []
2532softmmu_mods = []
2533foreach d, list : modules
2534 foreach m, module_ss : list
2535 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02002536 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002537 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
2538 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
2539 if d == 'block'
2540 block_mods += sl
2541 else
2542 softmmu_mods += sl
2543 endif
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002544 if module_ss.sources() != []
2545 # FIXME: Should use sl.extract_all_objects(recursive: true) as
2546 # input. Sources can be used multiple times but objects are
2547 # unique when it comes to lookup in compile_commands.json.
2548 # Depnds on a mesion version with
2549 # https://github.com/mesonbuild/meson/pull/8900
2550 modinfo_files += custom_target(d + '-' + m + '.modinfo',
2551 output: d + '-' + m + '.modinfo',
Paolo Bonziniac347112021-07-21 18:51:57 +02002552 input: module_ss.sources() + genh,
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002553 capture: true,
Paolo Bonziniac347112021-07-21 18:51:57 +02002554 command: [modinfo_collect, module_ss.sources()])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002555 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002556 else
2557 if d == 'block'
2558 block_ss.add_all(module_ss)
2559 else
2560 softmmu_ss.add_all(module_ss)
2561 endif
2562 endif
2563 endforeach
2564endforeach
2565
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002566foreach d, list : target_modules
2567 foreach m, module_ss : list
2568 if enable_modules and targetos != 'windows'
2569 foreach target : target_dirs
2570 if target.endswith('-softmmu')
2571 config_target = config_target_mak[target]
2572 config_target += config_host
2573 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2574 c_args = ['-DNEED_CPU_H',
2575 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2576 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
2577 target_module_ss = module_ss.apply(config_target, strict: false)
2578 if target_module_ss.sources() != []
2579 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
2580 sl = static_library(module_name,
2581 [genh, target_module_ss.sources()],
2582 dependencies: [modulecommon, target_module_ss.dependencies()],
2583 include_directories: target_inc,
2584 c_args: c_args,
2585 pic: true)
2586 softmmu_mods += sl
2587 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
2588 modinfo_files += custom_target(module_name + '.modinfo',
2589 output: module_name + '.modinfo',
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02002590 input: target_module_ss.sources() + genh,
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002591 capture: true,
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02002592 command: [modinfo_collect, '--target', target, target_module_ss.sources()])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002593 endif
2594 endif
2595 endforeach
2596 else
2597 specific_ss.add_all(module_ss)
2598 endif
2599 endforeach
2600endforeach
2601
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02002602if enable_modules
2603 modinfo_src = custom_target('modinfo.c',
2604 output: 'modinfo.c',
2605 input: modinfo_files,
2606 command: [modinfo_generate, '@INPUT@'],
2607 capture: true)
2608 modinfo_lib = static_library('modinfo', modinfo_src)
2609 modinfo_dep = declare_dependency(link_whole: modinfo_lib)
2610 softmmu_ss.add(modinfo_dep)
2611endif
2612
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002613nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08002614undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002615block_syms = custom_target('block.syms', output: 'block.syms',
2616 input: [libqemuutil, block_mods],
2617 capture: true,
2618 command: [undefsym, nm, '@INPUT@'])
2619qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
2620 input: [libqemuutil, softmmu_mods],
2621 capture: true,
2622 command: [undefsym, nm, '@INPUT@'])
2623
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02002624qom_ss = qom_ss.apply(config_host, strict: false)
2625libqom = static_library('qom', qom_ss.sources() + genh,
2626 dependencies: [qom_ss.dependencies()],
2627 name_suffix: 'fa')
2628
2629qom = declare_dependency(link_whole: libqom)
2630
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02002631authz_ss = authz_ss.apply(config_host, strict: false)
2632libauthz = static_library('authz', authz_ss.sources() + genh,
2633 dependencies: [authz_ss.dependencies()],
2634 name_suffix: 'fa',
2635 build_by_default: false)
2636
2637authz = declare_dependency(link_whole: libauthz,
2638 dependencies: qom)
2639
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002640crypto_ss = crypto_ss.apply(config_host, strict: false)
2641libcrypto = static_library('crypto', crypto_ss.sources() + genh,
2642 dependencies: [crypto_ss.dependencies()],
2643 name_suffix: 'fa',
2644 build_by_default: false)
2645
2646crypto = declare_dependency(link_whole: libcrypto,
2647 dependencies: [authz, qom])
2648
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002649io_ss = io_ss.apply(config_host, strict: false)
2650libio = static_library('io', io_ss.sources() + genh,
2651 dependencies: [io_ss.dependencies()],
2652 link_with: libqemuutil,
2653 name_suffix: 'fa',
2654 build_by_default: false)
2655
2656io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
2657
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02002658libmigration = static_library('migration', sources: migration_files + genh,
2659 name_suffix: 'fa',
2660 build_by_default: false)
2661migration = declare_dependency(link_with: libmigration,
2662 dependencies: [zlib, qom, io])
2663softmmu_ss.add(migration)
2664
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002665block_ss = block_ss.apply(config_host, strict: false)
2666libblock = static_library('block', block_ss.sources() + genh,
2667 dependencies: block_ss.dependencies(),
2668 link_depends: block_syms,
2669 name_suffix: 'fa',
2670 build_by_default: false)
2671
2672block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002673 link_args: '@block.syms',
2674 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002675
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002676blockdev_ss = blockdev_ss.apply(config_host, strict: false)
2677libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
2678 dependencies: blockdev_ss.dependencies(),
2679 name_suffix: 'fa',
2680 build_by_default: false)
2681
2682blockdev = declare_dependency(link_whole: [libblockdev],
2683 dependencies: [block])
2684
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002685qmp_ss = qmp_ss.apply(config_host, strict: false)
2686libqmp = static_library('qmp', qmp_ss.sources() + genh,
2687 dependencies: qmp_ss.dependencies(),
2688 name_suffix: 'fa',
2689 build_by_default: false)
2690
2691qmp = declare_dependency(link_whole: [libqmp])
2692
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002693libchardev = static_library('chardev', chardev_ss.sources() + genh,
2694 name_suffix: 'fa',
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002695 dependencies: [gnutls],
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002696 build_by_default: false)
2697
2698chardev = declare_dependency(link_whole: libchardev)
2699
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02002700libhwcore = static_library('hwcore', sources: hwcore_files + genh,
2701 name_suffix: 'fa',
2702 build_by_default: false)
2703hwcore = declare_dependency(link_whole: libhwcore)
2704common_ss.add(hwcore)
2705
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02002706###########
2707# Targets #
2708###########
2709
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002710foreach m : block_mods + softmmu_mods
2711 shared_module(m.name(),
2712 name_prefix: '',
2713 link_whole: m,
2714 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002715 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002716endforeach
2717
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002718softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002719common_ss.add(qom, qemuutil)
2720
2721common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01002722common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
2723
2724common_all = common_ss.apply(config_all, strict: false)
2725common_all = static_library('common',
2726 build_by_default: false,
2727 sources: common_all.sources() + genh,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09002728 implicit_include_directories: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002729 dependencies: common_all.dependencies(),
2730 name_suffix: 'fa')
2731
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002732feature_to_c = find_program('scripts/feature_to_c.sh')
2733
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002734emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002735foreach target : target_dirs
2736 config_target = config_target_mak[target]
2737 target_name = config_target['TARGET_NAME']
2738 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02002739 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002740 arch_deps = []
2741 c_args = ['-DNEED_CPU_H',
2742 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2743 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04002744 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01002745
Paolo Bonzini859aef02020-08-04 18:14:26 +02002746 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01002747 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2748 if targetos == 'linux'
2749 target_inc += include_directories('linux-headers', is_system: true)
2750 endif
2751 if target.endswith('-softmmu')
2752 qemu_target_name = 'qemu-system-' + target_name
2753 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002754 t = target_softmmu_arch[arch].apply(config_target, strict: false)
2755 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002756 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002757
Marc-André Lureau2c442202019-08-17 13:55:58 +04002758 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
2759 hw = hw_arch[hw_dir].apply(config_target, strict: false)
2760 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002761 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04002762
Paolo Bonzini2becc362020-02-03 11:42:03 +01002763 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002764 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002765 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04002766 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002767 target_type='user'
2768 qemu_target_name = 'qemu-' + target_name
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02002769 if arch in target_user_arch
2770 t = target_user_arch[arch].apply(config_target, strict: false)
2771 arch_srcs += t.sources()
2772 arch_deps += t.dependencies()
2773 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002774 if 'CONFIG_LINUX_USER' in config_target
2775 base_dir = 'linux-user'
2776 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
Warner Loshe2a74722021-08-03 17:17:17 -06002777 endif
2778 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01002779 base_dir = 'bsd-user'
Warner Loshe2a74722021-08-03 17:17:17 -06002780 target_inc += include_directories('bsd-user/' / targetos)
2781 dir = base_dir / abi
2782 arch_srcs += files(dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002783 endif
2784 target_inc += include_directories(
2785 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04002786 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002787 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04002788 if 'CONFIG_LINUX_USER' in config_target
2789 dir = base_dir / abi
2790 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
2791 if config_target.has_key('TARGET_SYSTBL_ABI')
2792 arch_srcs += \
2793 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
2794 extra_args : config_target['TARGET_SYSTBL_ABI'])
2795 endif
2796 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002797 endif
2798
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002799 if 'TARGET_XML_FILES' in config_target
2800 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
2801 output: target + '-gdbstub-xml.c',
2802 input: files(config_target['TARGET_XML_FILES'].split()),
2803 command: [feature_to_c, '@INPUT@'],
2804 capture: true)
2805 arch_srcs += gdbstub_xml
2806 endif
2807
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002808 t = target_arch[arch].apply(config_target, strict: false)
2809 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002810 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002811
Paolo Bonzini2becc362020-02-03 11:42:03 +01002812 target_common = common_ss.apply(config_target, strict: false)
2813 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002814 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002815
Paolo Bonzini2becc362020-02-03 11:42:03 +01002816 target_specific = specific_ss.apply(config_target, strict: false)
2817 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002818 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002819
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002820 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02002821 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002822 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002823 objects: objects,
2824 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002825 c_args: c_args,
2826 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002827 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002828
2829 if target.endswith('-softmmu')
2830 execs = [{
2831 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002832 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002833 'sources': files('softmmu/main.c'),
2834 'dependencies': []
2835 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002836 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002837 execs += [{
2838 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002839 'win_subsystem': 'windows',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002840 'sources': files('softmmu/main.c'),
2841 'dependencies': []
2842 }]
2843 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02002844 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002845 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
2846 execs += [{
2847 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002848 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002849 'sources': specific_fuzz.sources(),
2850 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002851 }]
2852 endif
2853 else
2854 execs = [{
2855 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002856 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002857 'sources': [],
2858 'dependencies': []
2859 }]
2860 endif
2861 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01002862 exe_name = exe['name']
John Arbuckle3983a762021-07-05 15:53:28 -04002863 if targetos == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01002864 exe_name += '-unsigned'
2865 endif
2866
2867 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09002868 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002869 c_args: c_args,
2870 dependencies: arch_deps + deps + exe['dependencies'],
2871 objects: lib.extract_all_objects(recursive: true),
2872 link_language: link_language,
2873 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
2874 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002875 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01002876
John Arbuckle3983a762021-07-05 15:53:28 -04002877 if targetos == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09002878 icon = 'pc-bios/qemu.rsrc'
2879 build_input = [emulator, files(icon)]
2880 install_input = [
2881 get_option('bindir') / exe_name,
2882 meson.current_source_dir() / icon
2883 ]
2884 if 'CONFIG_HVF' in config_target
2885 entitlements = 'accel/hvf/entitlements.plist'
2886 build_input += files(entitlements)
2887 install_input += meson.current_source_dir() / entitlements
2888 endif
2889
Alexander Graf8a74ce62021-01-20 23:44:34 +01002890 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09002891 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01002892 output: exe['name'],
2893 command: [
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09002894 files('scripts/entitlement.sh'),
2895 '@OUTPUT@',
2896 '@INPUT@'
Alexander Graf8a74ce62021-01-20 23:44:34 +01002897 ])
2898 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09002899
2900 meson.add_install_script('scripts/entitlement.sh', '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09002901 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09002902 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01002903 else
2904 emulators += {exe['name']: emulator}
2905 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002906
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002907 if stap.found()
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002908 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002909 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
2910 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002911 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
2912 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
2913 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002914 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002915 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002916 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002917 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002918 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002919 command: [
2920 tracetool, '--group=all', '--format=' + stp['fmt'],
2921 '--binary=' + stp['bin'],
2922 '--target-name=' + target_name,
2923 '--target-type=' + target_type,
2924 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01002925 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002926 ],
2927 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002928 endforeach
2929 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002930 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002931endforeach
2932
Paolo Bonzini931049b2020-02-05 09:44:24 +01002933# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002934
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002935if 'CONFIG_PLUGIN' in config_host
2936 install_headers('include/qemu/qemu-plugin.h')
2937endif
2938
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002939if 'CONFIG_GUEST_AGENT' in config_host
2940 subdir('qga')
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002941elif get_option('guest_agent_msi').enabled()
2942 error('Guest agent MSI requested, but the guest agent is not being built')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002943endif
2944
Laurent Vivier9755c942020-08-24 17:24:30 +02002945# Don't build qemu-keymap if xkbcommon is not explicitly enabled
2946# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002947if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04002948 # used for the update-keymaps target, so include rules even if !have_tools
2949 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
2950 dependencies: [qemuutil, xkbcommon], install: have_tools)
2951endif
2952
Paolo Bonzini931049b2020-02-05 09:44:24 +01002953if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002954 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
2955 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
2956 qemu_io = executable('qemu-io', files('qemu-io.c'),
2957 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01002958 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002959 dependencies: [blockdev, qemuutil, gnutls], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002960
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02002961 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002962 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04002963 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002964
Marc-André Lureau157e7b12019-07-15 14:50:58 +04002965 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
2966 dependencies: qemuutil,
2967 install: true)
2968
Paolo Bonzini931049b2020-02-05 09:44:24 +01002969 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02002970 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002971 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04002972 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02002973 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01002974 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002975
2976 if targetos == 'linux'
2977 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2978 dependencies: [qemuutil, libcap_ng],
2979 install: true,
2980 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002981
2982 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2983 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002984 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002985 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002986 endif
2987
Paolo Bonziniccd250a2021-06-03 12:50:17 +02002988 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04002989 subdir('contrib/ivshmem-client')
2990 subdir('contrib/ivshmem-server')
2991 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01002992endif
2993
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04002994subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002995subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04002996subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02002997subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08002998subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01002999if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04003000 subdir('po')
3001endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01003002
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003003if host_machine.system() == 'windows'
3004 nsis_cmd = [
3005 find_program('scripts/nsis.py'),
3006 '@OUTPUT@',
3007 get_option('prefix'),
3008 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01003009 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003010 '--',
3011 '-DDISPLAYVERSION=' + meson.project_version(),
3012 ]
3013 if build_docs
3014 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
3015 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01003016 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003017 nsis_cmd += '-DCONFIG_GTK=y'
3018 endif
3019
3020 nsis = custom_target('nsis',
3021 output: 'qemu-setup-' + meson.project_version() + '.exe',
3022 input: files('qemu.nsi'),
3023 build_always_stale: true,
3024 command: nsis_cmd + ['@INPUT@'])
3025 alias_target('installer', nsis)
3026endif
3027
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003028#########################
3029# Configuration summary #
3030#########################
3031
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003032# Directories
Paolo Bonzinif9332752020-02-03 13:28:38 +01003033summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003034summary_info += {'Install prefix': get_option('prefix')}
3035summary_info += {'BIOS directory': qemu_datadir}
3036summary_info += {'firmware path': get_option('qemu_firmwarepath')}
3037summary_info += {'binary directory': get_option('bindir')}
3038summary_info += {'library directory': get_option('libdir')}
3039summary_info += {'module directory': qemu_moddir}
3040summary_info += {'libexec directory': get_option('libexecdir')}
3041summary_info += {'include directory': get_option('includedir')}
3042summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003043if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003044 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04003045 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003046else
3047 summary_info += {'local state directory': 'queried at runtime'}
3048endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04003049summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003050summary_info += {'Build directory': meson.current_build_dir()}
3051summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003052summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003053summary(summary_info, bool_yn: true, section: 'Directories')
3054
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003055# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003056summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003057summary_info += {'git': config_host['GIT']}
3058summary_info += {'make': config_host['MAKE']}
3059summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003060summary_info += {'sphinx-build': sphinx_build}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003061if config_host.has_key('HAVE_GDB_BIN')
3062 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
3063endif
3064summary_info += {'genisoimage': config_host['GENISOIMAGE']}
3065if targetos == 'windows' and config_host.has_key('CONFIG_GUEST_AGENT')
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003066 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003067endif
Joelle van Dyneb8e0c492021-03-15 11:03:41 -07003068if slirp_opt != 'disabled' and 'CONFIG_SLIRP_SMBD' in config_host
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003069 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
3070endif
3071summary(summary_info, bool_yn: true, section: 'Host binaries')
3072
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003073# Configurable features
3074summary_info = {}
3075summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003076summary_info += {'system-mode emulation': have_system}
3077summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003078summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003079summary_info += {'Install blobs': get_option('install_blobs')}
3080summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
3081if config_host.has_key('CONFIG_MODULES')
3082 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
3083endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02003084summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003085if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02003086 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003087endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003088summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
3089if 'simple' in get_option('trace_backends')
3090 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003091endif
3092summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
3093summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
3094summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
3095summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
3096summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
3097summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
3098summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
3099summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
3100summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
3101summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
3102summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
3103summary(summary_info, bool_yn: true, section: 'Configurable features')
3104
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003105# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003106summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003107summary_info += {'host CPU': cpu}
3108summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01003109summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
3110summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003111if link_language == 'cpp'
Alex Bennée63de9352021-05-27 17:03:15 +01003112 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003113else
3114 summary_info += {'C++ compiler': false}
3115endif
3116if targetos == 'darwin'
Alex Bennée63de9352021-05-27 17:03:15 +01003117 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003118endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003119if targetos == 'windows'
3120 if 'WIN_SDK' in config_host
3121 summary_info += {'Windows SDK': config_host['WIN_SDK']}
3122 endif
3123endif
Paolo Bonzini47b30832020-09-23 05:26:17 -04003124summary_info += {'CFLAGS': ' '.join(get_option('c_args')
3125 + ['-O' + get_option('optimization')]
3126 + (get_option('debug') ? ['-g'] : []))}
3127if link_language == 'cpp'
3128 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
3129 + ['-O' + get_option('optimization')]
3130 + (get_option('debug') ? ['-g'] : []))}
3131endif
3132link_args = get_option(link_language + '_link_args')
3133if link_args.length() > 0
3134 summary_info += {'LDFLAGS': ' '.join(link_args)}
3135endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01003136summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
3137summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003138summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05003139summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003140summary_info += {'PIE': get_option('b_pie')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02003141summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003142summary_info += {'malloc trim support': has_malloc_trim}
3143summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003144summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
3145summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
3146summary_info += {'memory allocator': get_option('malloc')}
3147summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
3148summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
3149summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
3150summary_info += {'gcov': get_option('b_coverage')}
3151summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
3152summary_info += {'CFI support': get_option('cfi')}
3153if get_option('cfi')
3154 summary_info += {'CFI debug support': get_option('cfi_debug')}
3155endif
3156summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003157summary_info += {'sparse': sparse}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003158summary_info += {'mingw32 support': targetos == 'windows'}
Alex Bennée49e85652021-02-22 10:14:50 +00003159
3160# snarf the cross-compilation information for tests
3161foreach target: target_dirs
3162 tcg_mak = meson.current_build_dir() / 'tests/tcg' / 'config-' + target + '.mak'
3163 if fs.exists(tcg_mak)
3164 config_cross_tcg = keyval.load(tcg_mak)
3165 target = config_cross_tcg['TARGET_NAME']
3166 compiler = ''
3167 if 'DOCKER_CROSS_CC_GUEST' in config_cross_tcg
3168 summary_info += {target + ' tests': config_cross_tcg['DOCKER_CROSS_CC_GUEST'] +
3169 ' via ' + config_cross_tcg['DOCKER_IMAGE']}
3170 elif 'CROSS_CC_GUEST' in config_cross_tcg
3171 summary_info += {target + ' tests'
3172 : config_cross_tcg['CROSS_CC_GUEST'] }
3173 endif
3174 endif
3175endforeach
3176
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003177summary(summary_info, bool_yn: true, section: 'Compilation')
3178
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003179# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003180summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003181if have_system
3182 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
3183 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
3184 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
3185 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
Reinoud Zandijk74a414a2021-04-02 22:25:32 +02003186 summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003187 summary_info += {'Xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
3188 if config_host.has_key('CONFIG_XEN_BACKEND')
3189 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
3190 endif
3191endif
3192summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
3193if config_all.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01003194 if get_option('tcg_interpreter')
3195 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, experimental and slow)'}
3196 else
3197 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
3198 endif
Alex Bennée029aa682021-07-09 15:29:53 +01003199 summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003200 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003201endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003202summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003203if have_system
3204 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01003205 summary_info += {'out of process emulation': multiprocess_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003206endif
3207summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
3208
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003209# Block layer
3210summary_info = {}
3211summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
3212summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
3213if have_block
3214 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
3215 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
Kevin Wolfe5f05f82021-07-09 18:41:41 +02003216 summary_info += {'Use block whitelist in tools': config_host.has_key('CONFIG_BDRV_WHITELIST_TOOLS')}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003217 summary_info += {'VirtFS support': have_virtfs}
3218 summary_info += {'build virtiofs daemon': have_virtiofsd}
3219 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
3220 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
3221 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
3222 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
3223 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
3224 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
3225 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
3226 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
3227 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
3228 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003229 summary_info += {'FUSE exports': fuse}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003230endif
3231summary(summary_info, bool_yn: true, section: 'Block layer support')
3232
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003233# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003234summary_info = {}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003235summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003236summary_info += {'GNUTLS support': gnutls}
3237if gnutls.found()
3238 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
3239endif
3240summary_info += {'libgcrypt': gcrypt}
3241summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02003242if nettle.found()
3243 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003244endif
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003245summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
3246summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
3247summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
3248summary(summary_info, bool_yn: true, section: 'Crypto')
3249
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01003250# Libraries
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003251summary_info = {}
3252if targetos == 'darwin'
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003253 summary_info += {'Cocoa support': cocoa}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003254endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003255summary_info += {'SDL support': sdl}
3256summary_info += {'SDL image support': sdl_image}
3257summary_info += {'GTK support': gtk}
3258summary_info += {'pixman': pixman}
3259summary_info += {'VTE support': vte}
3260summary_info += {'slirp support': slirp_opt == 'internal' ? slirp_opt : slirp}
3261summary_info += {'libtasn1': tasn1}
3262summary_info += {'PAM': pam}
3263summary_info += {'iconv support': iconv}
3264summary_info += {'curses support': curses}
3265summary_info += {'virgl support': virgl}
3266summary_info += {'curl support': curl}
3267summary_info += {'Multipath support': mpathpersist}
3268summary_info += {'VNC support': vnc}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01003269if vnc.found()
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003270 summary_info += {'VNC SASL support': sasl}
3271 summary_info += {'VNC JPEG support': jpeg}
3272 summary_info += {'VNC PNG support': png}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003273endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02003274if targetos not in ['darwin', 'haiku', 'windows']
3275 summary_info += {'OSS support': oss}
3276elif targetos == 'darwin'
3277 summary_info += {'CoreAudio support': coreaudio}
3278elif targetos == 'windows'
3279 summary_info += {'DirectSound support': dsound}
3280endif
3281if targetos == 'linux'
3282 summary_info += {'ALSA support': alsa}
3283 summary_info += {'PulseAudio support': pulse}
3284endif
3285summary_info += {'JACK support': jack}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003286summary_info += {'brlapi support': brlapi}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003287summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
3288summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
3289summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003290summary_info += {'Linux io_uring support': linux_io_uring}
3291summary_info += {'ATTR/XATTR support': libattr}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003292summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
3293summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003294summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003295summary_info += {'libcap-ng support': libcap_ng}
3296summary_info += {'bpf support': libbpf}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003297# TODO: add back protocol and server version
3298summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003299summary_info += {'rbd support': rbd}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003300summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003301summary_info += {'smartcard support': cacard}
3302summary_info += {'U2F support': u2f}
3303summary_info += {'libusb': libusb}
3304summary_info += {'usb net redir': usbredir}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003305summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003306summary_info += {'GBM': gbm}
3307summary_info += {'libiscsi support': libiscsi}
3308summary_info += {'libnfs support': libnfs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003309if targetos == 'windows'
Paolo Bonzinib846ab72021-01-21 11:49:04 +01003310 if config_host.has_key('CONFIG_GUEST_AGENT')
3311 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
3312 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01003313 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01003314endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003315summary_info += {'seccomp support': seccomp}
3316summary_info += {'GlusterFS support': glusterfs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003317summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
3318summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003319summary_info += {'lzo support': lzo}
3320summary_info += {'snappy support': snappy}
3321summary_info += {'bzip2 support': libbzip2}
3322summary_info += {'lzfse support': liblzfse}
3323summary_info += {'zstd support': zstd}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003324summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003325summary_info += {'libxml2': libxml2}
3326summary_info += {'capstone': capstone_opt == 'internal' ? capstone_opt : capstone}
3327summary_info += {'libpmem support': libpmem}
3328summary_info += {'libdaxctl support': libdaxctl}
3329summary_info += {'libudev': libudev}
3330# Dummy dependency, keep .found()
Max Reitzdf4ea702020-10-27 20:05:46 +01003331summary_info += {'FUSE lseek': fuse_lseek.found()}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01003332summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01003333
3334if not supported_cpus.contains(cpu)
3335 message()
3336 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
3337 message()
3338 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
3339 message('The QEMU project intends to remove support for this host CPU in')
3340 message('a future release if nobody volunteers to maintain it and to')
3341 message('provide a build host for our continuous integration setup.')
3342 message('configure has succeeded and you can continue to build, but')
3343 message('if you care about QEMU on this platform you should contact')
3344 message('us upstream at qemu-devel@nongnu.org.')
3345endif
3346
3347if not supported_oses.contains(targetos)
3348 message()
3349 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
3350 message()
3351 message('Host OS ' + targetos + 'support is not currently maintained.')
3352 message('The QEMU project intends to remove support for this host OS in')
3353 message('a future release if nobody volunteers to maintain it and to')
3354 message('provide a build host for our continuous integration setup.')
3355 message('configure has succeeded and you can continue to build, but')
3356 message('if you care about QEMU on this platform you should contact')
3357 message('us upstream at qemu-devel@nongnu.org.')
3358endif