blob: ae67ca28ab38d6cf6b905e00640579363ac578b5 [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()
Warner Loshdda2da62021-10-08 16:47:37 -060043have_linux_user = false
44have_bsd_user = false
Paolo Bonzini760e4322020-08-26 08:09:48 +020045have_system = false
46foreach target : target_dirs
Warner Loshdda2da62021-10-08 16:47:37 -060047 have_linux_user = have_linux_user or target.endswith('linux-user')
48 have_bsd_user = have_bsd_user or target.endswith('bsd-user')
Paolo Bonzini760e4322020-08-26 08:09:48 +020049 have_system = have_system or target.endswith('-softmmu')
50endforeach
Warner Loshdda2da62021-10-08 16:47:37 -060051have_user = have_linux_user or have_bsd_user
Paolo Bonzini760e4322020-08-26 08:09:48 +020052have_tools = 'CONFIG_TOOLS' in config_host
53have_block = have_system or have_tools
54
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040055python = import('python').find_installation()
56
57supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Richard Hendersonba0e7332021-09-17 11:08:09 -070058supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv', 'x86', 'x86_64',
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040059 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
60
61cpu = host_machine.cpu_family()
Richard Hendersonc94c2392021-11-16 10:50:42 +010062
63# Unify riscv* to a single family.
64if cpu in ['riscv32', 'riscv64']
65 cpu = 'riscv'
66endif
67
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040068targetos = host_machine.system()
69
Paolo Bonzini8a199802020-09-18 05:37:01 -040070if cpu in ['x86', 'x86_64']
71 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
72elif cpu == 'aarch64'
73 kvm_targets = ['aarch64-softmmu']
74elif cpu == 's390x'
75 kvm_targets = ['s390x-softmmu']
76elif cpu in ['ppc', 'ppc64']
77 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Huacai Chenfbc58842020-10-07 16:39:28 +080078elif cpu in ['mips', 'mips64']
79 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -040080else
81 kvm_targets = []
82endif
83
Igor Mammedov44d3d892021-10-27 11:10:12 -040084kvm_targets_c = '""'
Igor Mammedove741aff2021-09-02 07:35:38 -040085if not get_option('kvm').disabled() and targetos == 'linux'
86 kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
87endif
88config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
89
Paolo Bonzini8a199802020-09-18 05:37:01 -040090accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alexander Graf844a06b2021-09-16 17:54:02 +020091
92if cpu in ['aarch64']
93 accelerator_targets += {
94 'CONFIG_HVF': ['aarch64-softmmu']
95 }
96endif
97
Alex Bennée0c3e41d2020-11-10 19:23:09 +000098if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
Marc-André Lureau2a2d51b2021-09-14 16:30:45 +040099 # i386 emulator provides xenpv machine type for multiple architectures
Alex Bennée0c3e41d2020-11-10 19:23:09 +0000100 accelerator_targets += {
101 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
102 }
103endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400104if cpu in ['x86', 'x86_64']
105 accelerator_targets += {
106 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400107 'CONFIG_HVF': ['x86_64-softmmu'],
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200108 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400109 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
110 }
111endif
112
Paolo Bonzinia1b176f2021-07-12 14:22:08 +0200113modular_tcg = []
114# Darwin does not support references to thread-local variables in modules
115if targetos != 'darwin'
116 modular_tcg = ['i386-softmmu', 'x86_64-softmmu']
117endif
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +0200118
Philippe Mathieu-Daudéeae9a1d2021-01-14 18:45:08 +0100119edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
Paolo Bonzinie49c0ef2021-09-23 06:55:28 -0400120unpack_edk2_blobs = false
121foreach target : edk2_targets
122 if target in target_dirs
123 bzip2 = find_program('bzip2', required: get_option('install_blobs'))
124 unpack_edk2_blobs = bzip2.found()
125 break
126 endif
127endforeach
Philippe Mathieu-Daudé45b545d2021-01-14 18:45:09 +0100128
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200129dtrace = not_found
130stap = not_found
131if 'dtrace' in get_option('trace_backends')
132 dtrace = find_program('dtrace', required: true)
133 stap = find_program('stap', required: false)
134 if stap.found()
135 # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
136 # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
137 # instead. QEMU --enable-modules depends on this because the SystemTap
138 # semaphores are linked into the main binary and not the module's shared
139 # object.
140 add_global_arguments('-DSTAP_SDT_V2',
141 native: false, language: ['c', 'cpp', 'objc'])
142 endif
143endif
144
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400145##################
146# Compiler flags #
147##################
148
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400149# Specify linker-script with add_project_link_arguments so that it is not placed
150# within a linker --start-group/--end-group pair
Paolo Bonzini537b7242021-10-07 15:08:12 +0200151if get_option('fuzzing')
152 add_project_link_arguments(['-Wl,-T,',
153 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
154 native: false, language: ['c', 'cpp', 'objc'])
155
156 # Specify a filter to only instrument code that is directly related to
157 # virtual-devices.
158 configure_file(output: 'instrumentation-filter',
159 input: 'scripts/oss-fuzz/instrumentation-filter-template',
160 copy: true)
161 add_global_arguments(
162 cc.get_supported_arguments('-fsanitize-coverage-allowlist=instrumentation-filter'),
163 native: false, language: ['c', 'cpp', 'objc'])
164
165 if get_option('fuzzing_engine') == ''
166 # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
167 # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link
168 # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
169 # unable to bind the fuzzer-related callbacks added by instrumentation.
170 add_global_arguments('-fsanitize=fuzzer-no-link',
171 native: false, language: ['c', 'cpp', 'objc'])
172 add_global_link_arguments('-fsanitize=fuzzer-no-link',
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400173 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzini537b7242021-10-07 15:08:12 +0200174 # For the actual fuzzer binaries, we need to link against the libfuzzer
175 # library. They need to be configurable, to support OSS-Fuzz
176 fuzz_exe_ldflags = ['-fsanitize=fuzzer']
177 else
178 # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
179 # the needed CFLAGS have already been provided
180 fuzz_exe_ldflags = get_option('fuzzing_engine').split()
181 endif
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400182endif
183
Marc-André Lureau5fc06172021-01-14 16:56:02 +0400184add_global_arguments(config_host['QEMU_CFLAGS'].split(),
185 native: false, language: ['c', 'objc'])
186add_global_arguments(config_host['QEMU_CXXFLAGS'].split(),
187 native: false, language: 'cpp')
188add_global_link_arguments(config_host['QEMU_LDFLAGS'].split(),
189 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzinia5665052019-06-10 12:05:14 +0200190
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400191if targetos == 'linux'
192 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
193 '-isystem', 'linux-headers',
194 language: ['c', 'cpp'])
195endif
196
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100197add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400198 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400199 '-iquote', meson.current_source_dir() / 'include',
200 '-iquote', meson.current_source_dir() / 'disas/libvixl',
201 language: ['c', 'cpp', 'objc'])
Alexander Bulekovc46f76d2020-09-02 13:36:50 -0400202
Marc-André Lureaufc929892019-07-13 01:47:54 +0400203link_language = meson.get_external_property('link_language', 'cpp')
204if link_language == 'cpp'
205 add_languages('cpp', required: true, native: false)
Paolo Bonzini565174d2021-11-04 14:35:14 +0100206 cxx = meson.get_compiler('cpp')
207 linker = cxx
208else
209 linker = cc
Marc-André Lureaufc929892019-07-13 01:47:54 +0400210endif
Paolo Bonzinia5665052019-06-10 12:05:14 +0200211if host_machine.system() == 'darwin'
212 add_languages('objc', required: false, native: false)
213endif
214
Paolo Bonzinideb62372020-09-01 07:51:16 -0400215sparse = find_program('cgcc', required: get_option('sparse'))
216if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100217 run_target('sparse',
218 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400219 'compile_commands.json', sparse.full_path(), '-Wbitwise',
220 '-Wno-transparent-union', '-Wno-old-initializer',
221 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100222endif
223
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200224###########################################
225# Target-specific checks and dependencies #
226###########################################
227
Paolo Bonzini537b7242021-10-07 15:08:12 +0200228if get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
229 not cc.links('''
230 #include <stdint.h>
231 #include <sys/types.h>
232 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
233 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
234 ''',
235 args: ['-Werror', '-fsanitize=fuzzer'])
236 error('Your compiler does not support -fsanitize=fuzzer')
237endif
238
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200239if 'ftrace' in get_option('trace_backends') and targetos != 'linux'
240 error('ftrace is supported only on Linux')
241endif
242if 'syslog' in get_option('trace_backends') and not cc.compiles('''
243 #include <syslog.h>
244 int main(void) {
245 openlog("qemu", LOG_PID, LOG_DAEMON);
246 syslog(LOG_INFO, "configure");
247 return 0;
248 }''')
249 error('syslog is not supported on this system')
250endif
251
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200252if targetos != 'linux' and get_option('mpath').enabled()
253 error('Multipath is supported only on Linux')
254endif
255
Paolo Bonzini106ad1f2021-02-17 16:24:25 +0100256if targetos != 'linux' and get_option('multiprocess').enabled()
257 error('Multiprocess QEMU is supported only on Linux')
258endif
259multiprocess_allowed = targetos == 'linux' and not get_option('multiprocess').disabled()
260
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200261libm = cc.find_library('m', required: false)
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +0200262threads = dependency('threads')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400263util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200264winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400265socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400266version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400267coref = []
268iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400269emulator_link_args = []
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200270nvmm =not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400271hvf = not_found
Paolo Bonzinia6305082021-10-07 15:08:15 +0200272host_dsosuf = '.so'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400273if targetos == 'windows'
274 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200275 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400276
277 win = import('windows')
278 version_res = win.compile_resources('version.rc',
279 depend_files: files('pc-bios/qemu-nsis.ico'),
280 include_directories: include_directories('.'))
Paolo Bonzinia6305082021-10-07 15:08:15 +0200281 host_dsosuf = '.dll'
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400282elif targetos == 'darwin'
283 coref = dependency('appleframeworks', modules: 'CoreFoundation')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700284 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
Paolo Bonzinia6305082021-10-07 15:08:15 +0200285 host_dsosuf = '.dylib'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200286elif targetos == 'sunos'
287 socket = [cc.find_library('socket'),
288 cc.find_library('nsl'),
289 cc.find_library('resolv')]
290elif targetos == 'haiku'
291 socket = [cc.find_library('posix_error_mapper'),
292 cc.find_library('network'),
293 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400294elif targetos == 'openbsd'
295 if not get_option('tcg').disabled() and target_dirs.length() > 0
296 # Disable OpenBSD W^X if available
297 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
298 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400299endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200300
Paolo Bonzini8a199802020-09-18 05:37:01 -0400301accelerators = []
302if not get_option('kvm').disabled() and targetos == 'linux'
303 accelerators += 'CONFIG_KVM'
304endif
305if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
306 accelerators += 'CONFIG_XEN'
307 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
308else
309 have_xen_pci_passthrough = false
310endif
311if not get_option('whpx').disabled() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000312 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400313 error('WHPX requires 64-bit host')
314 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
315 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
316 accelerators += 'CONFIG_WHPX'
317 endif
318endif
319if not get_option('hvf').disabled()
320 hvf = dependency('appleframeworks', modules: 'Hypervisor',
321 required: get_option('hvf'))
322 if hvf.found()
323 accelerators += 'CONFIG_HVF'
324 endif
325endif
326if not get_option('hax').disabled()
327 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
328 accelerators += 'CONFIG_HAX'
329 endif
330endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200331if targetos == 'netbsd'
nia0cc49652021-10-13 13:54:17 +0000332 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200333 if nvmm.found()
334 accelerators += 'CONFIG_NVMM'
335 endif
336endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100337
338tcg_arch = config_host['ARCH']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400339if not get_option('tcg').disabled()
340 if cpu not in supported_cpus
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100341 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +0100342 warning('Unsupported CPU @0@, will use TCG with TCI (slow)'.format(cpu))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400343 else
344 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
345 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100346 elif get_option('tcg_interpreter')
Philippe Mathieu-Daudé1c282da2021-05-21 12:34:23 +0200347 warning('Use of the TCG interpreter is not recommended on this host')
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100348 warning('architecture. There is a native TCG execution backend available')
349 warning('which provides substantially better performance and reliability.')
350 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
351 warning('configuration option on this architecture to use the native')
352 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400353 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100354 if get_option('tcg_interpreter')
355 tcg_arch = 'tci'
356 elif config_host['ARCH'] == 'sparc64'
357 tcg_arch = 'sparc'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100358 elif config_host['ARCH'] in ['x86_64', 'x32']
359 tcg_arch = 'i386'
360 elif config_host['ARCH'] == 'ppc64'
361 tcg_arch = 'ppc'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100362 endif
363 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100364 language: ['c', 'cpp', 'objc'])
365
Paolo Bonzini8a199802020-09-18 05:37:01 -0400366 accelerators += 'CONFIG_TCG'
367 config_host += { 'CONFIG_TCG': 'y' }
368endif
369
370if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
371 error('KVM not available on this platform')
372endif
373if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
374 error('HVF not available on this platform')
375endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200376if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
377 error('NVMM not available on this platform')
378endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400379if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
380 error('WHPX not available on this platform')
381endif
382if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
383 if 'CONFIG_XEN' in accelerators
384 error('Xen PCI passthrough not available on this platform')
385 else
386 error('Xen PCI passthrough requested but Xen not enabled')
387 endif
388endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400389
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200390################
391# Dependencies #
392################
393
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400394# The path to glib.h is added to all compilation commands. This was
395# grandfathered in from the QEMU Makefiles.
396add_project_arguments(config_host['GLIB_CFLAGS'].split(),
397 native: false, language: ['c', 'cpp', 'objc'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400398glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
399 link_args: config_host['GLIB_LIBS'].split())
400# override glib dep with the configure results (for subprojects)
401meson.override_dependency('glib-2.0', glib)
402
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400403gio = not_found
404if 'CONFIG_GIO' in config_host
405 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
406 link_args: config_host['GIO_LIBS'].split())
407endif
408lttng = not_found
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200409if 'ust' in get_option('trace_backends')
410 lttng = dependency('lttng-ust', required: true, method: 'pkg-config',
411 kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400412endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200413pixman = not_found
414if have_system or have_tools
415 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100416 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200417endif
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100418zlib = dependency('zlib', required: true, kwargs: static_kwargs)
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200419
Paolo Bonziniff66f3e2021-10-07 15:08:20 +0200420libaio = not_found
421if not get_option('linux_aio').auto() or have_block
422 libaio = cc.find_library('aio', has_headers: ['libaio.h'],
423 required: get_option('linux_aio'),
424 kwargs: static_kwargs)
425endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400426linux_io_uring = not_found
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200427if not get_option('linux_io_uring').auto() or have_block
428 linux_io_uring = dependency('liburing', required: get_option('linux_io_uring'),
429 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400430endif
431libxml2 = not_found
Paolo Bonzinic5b36c22021-06-03 11:31:35 +0200432if not get_option('libxml2').auto() or have_block
433 libxml2 = dependency('libxml-2.0', required: get_option('libxml2'),
434 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400435endif
436libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +0100437if not get_option('libnfs').auto() or have_block
438 libnfs = dependency('libnfs', version: '>=1.9.3',
439 required: get_option('libnfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100440 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400441endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100442
443libattr_test = '''
444 #include <stddef.h>
445 #include <sys/types.h>
446 #ifdef CONFIG_LIBATTR
447 #include <attr/xattr.h>
448 #else
449 #include <sys/xattr.h>
450 #endif
451 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
452
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400453libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100454have_old_libattr = false
455if not get_option('attr').disabled()
456 if cc.links(libattr_test)
457 libattr = declare_dependency()
458 else
459 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
460 required: get_option('attr'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100461 kwargs: static_kwargs)
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100462 if libattr.found() and not \
463 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
464 libattr = not_found
465 if get_option('attr').enabled()
466 error('could not link libattr')
467 else
468 warning('could not link libattr, disabling')
469 endif
470 else
471 have_old_libattr = libattr.found()
472 endif
473 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400474endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100475
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100476cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
477if cocoa.found() and get_option('sdl').enabled()
478 error('Cocoa and SDL cannot be enabled at the same time')
479endif
480if cocoa.found() and get_option('gtk').enabled()
481 error('Cocoa and GTK+ cannot be enabled at the same time')
482endif
483
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100484seccomp = not_found
Paolo Bonzini90835c22020-11-17 14:22:24 +0100485if not get_option('seccomp').auto() or have_system or have_tools
486 seccomp = dependency('libseccomp', version: '>=2.3.0',
487 required: get_option('seccomp'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100488 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100489endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100490
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100491libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100492if not get_option('cap_ng').auto() or have_system or have_tools
493 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
494 required: get_option('cap_ng'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100495 kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100496endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100497if libcap_ng.found() and not cc.links('''
498 #include <cap-ng.h>
499 int main(void)
500 {
501 capng_capability_to_name(CAPNG_EFFECTIVE);
502 return 0;
503 }''', dependencies: libcap_ng)
504 libcap_ng = not_found
505 if get_option('cap_ng').enabled()
506 error('could not link libcap-ng')
507 else
508 warning('could not link libcap-ng, disabling')
509 endif
510endif
511
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400512if get_option('xkbcommon').auto() and not have_system and not have_tools
513 xkbcommon = not_found
514else
515 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100516 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400517endif
Paolo Bonzinie1723992021-10-07 15:08:21 +0200518
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400519vde = not_found
Paolo Bonzinie1723992021-10-07 15:08:21 +0200520if not get_option('vde').auto() or have_system or have_tools
521 vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
522 required: get_option('vde'),
523 kwargs: static_kwargs)
524endif
525if vde.found() and not cc.links('''
526 #include <libvdeplug.h>
527 int main(void)
528 {
529 struct vde_open_args a = {0, 0, 0};
530 char s[] = "";
531 vde_open(s, s, &a);
532 return 0;
533 }''', dependencies: vde)
534 vde = not_found
535 if get_option('cap_ng').enabled()
536 error('could not link libvdeplug')
537 else
538 warning('could not link libvdeplug, disabling')
539 endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400540endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200541
Paolo Bonzini478e9432020-08-17 12:47:55 +0200542pulse = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200543if not get_option('pa').auto() or (targetos == 'linux' and have_system)
544 pulse = dependency('libpulse', required: get_option('pa'),
545 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200546endif
547alsa = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200548if not get_option('alsa').auto() or (targetos == 'linux' and have_system)
549 alsa = dependency('alsa', required: get_option('alsa'),
550 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200551endif
552jack = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200553if not get_option('jack').auto() or have_system
554 jack = dependency('jack', required: get_option('jack'),
555 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200556endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200557
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200558spice_protocol = not_found
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200559if not get_option('spice_protocol').auto() or have_system
560 spice_protocol = dependency('spice-protocol', version: '>=0.12.3',
561 required: get_option('spice_protocol'),
562 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini26347332019-07-29 15:40:07 +0200563endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200564spice = not_found
565if not get_option('spice').auto() or have_system
566 spice = dependency('spice-server', version: '>=0.12.5',
567 required: get_option('spice'),
568 method: 'pkg-config', kwargs: static_kwargs)
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200569endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200570spice_headers = spice.partial_dependency(compile_args: true, includes: true)
571
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400572rt = cc.find_library('rt', required: false)
Paolo Bonzinia399f912021-11-15 14:29:13 +0000573
Paolo Bonzini99650b62019-06-10 12:21:14 +0200574libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100575if not get_option('libiscsi').auto() or have_block
576 libiscsi = dependency('libiscsi', version: '>=1.9.0',
577 required: get_option('libiscsi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100578 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini99650b62019-06-10 12:21:14 +0200579endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400580zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +0100581if not get_option('zstd').auto() or have_block
582 zstd = dependency('libzstd', version: '>=1.4.0',
583 required: get_option('zstd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100584 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400585endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400586virgl = not_found
Paolo Bonzini587d59d2021-06-03 11:31:35 +0200587if not get_option('virglrenderer').auto() or have_system
588 virgl = dependency('virglrenderer',
589 method: 'pkg-config',
590 required: get_option('virglrenderer'),
591 kwargs: static_kwargs)
Marc-André Lureauea458962019-07-12 22:23:46 +0400592endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400593curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100594if not get_option('curl').auto() or have_block
595 curl = dependency('libcurl', version: '>=7.29.0',
596 method: 'pkg-config',
597 required: get_option('curl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100598 kwargs: static_kwargs)
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400599endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200600libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200601if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200602 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +0100603 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400604 required: get_option('libudev'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100605 kwargs: static_kwargs)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200606endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200607
Paolo Bonzini5c530152020-10-15 06:09:27 -0400608mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200609mpathpersist = not_found
610mpathpersist_new_api = false
611if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
612 mpath_test_source_new = '''
613 #include <libudev.h>
614 #include <mpath_persist.h>
615 unsigned mpath_mx_alloc_len = 1024;
616 int logsink;
617 static struct config *multipath_conf;
618 extern struct udev *udev;
619 extern struct config *get_multipath_config(void);
620 extern void put_multipath_config(struct config *conf);
621 struct udev *udev;
622 struct config *get_multipath_config(void) { return multipath_conf; }
623 void put_multipath_config(struct config *conf) { }
624 int main(void) {
625 udev = udev_new();
626 multipath_conf = mpath_lib_init();
627 return 0;
628 }'''
629 mpath_test_source_old = '''
630 #include <libudev.h>
631 #include <mpath_persist.h>
632 unsigned mpath_mx_alloc_len = 1024;
633 int logsink;
634 int main(void) {
635 struct udev *udev = udev_new();
636 mpath_lib_init(udev);
637 return 0;
638 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400639 libmpathpersist = cc.find_library('mpathpersist',
640 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100641 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400642 if libmpathpersist.found()
643 mpathlibs += libmpathpersist
644 if enable_static
645 mpathlibs += cc.find_library('devmapper',
646 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100647 kwargs: static_kwargs)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200648 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400649 mpathlibs += cc.find_library('multipath',
650 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100651 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400652 foreach lib: mpathlibs
653 if not lib.found()
654 mpathlibs = []
655 break
656 endif
657 endforeach
658 if mpathlibs.length() == 0
659 msg = 'Dependencies missing for libmpathpersist'
660 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200661 mpathpersist = declare_dependency(dependencies: mpathlibs)
662 mpathpersist_new_api = true
663 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
664 mpathpersist = declare_dependency(dependencies: mpathlibs)
665 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400666 msg = 'Cannot detect libmpathpersist API'
667 endif
668 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200669 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400670 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200671 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400672 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200673 endif
674 endif
675 endif
676endif
677
Yonggang Luo5285e592020-10-13 07:43:48 +0800678iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800679curses = not_found
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400680if have_system and not get_option('curses').disabled()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400681 curses_test = '''
Stefan Weilfbab8cc2021-11-17 21:53:55 +0100682 #if defined(__APPLE__) || defined(__OpenBSD__)
683 #define _XOPEN_SOURCE_EXTENDED 1
684 #endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400685 #include <locale.h>
686 #include <curses.h>
687 #include <wchar.h>
688 int main(void) {
689 wchar_t wch = L'w';
690 setlocale(LC_ALL, "");
691 resize_term(0, 0);
692 addwstr(L"wide chars\n");
693 addnwstr(&wch, 1);
694 add_wch(WACS_DEGREE);
695 return 0;
696 }'''
697
Yonggang Luoca31e302020-11-17 05:31:06 +0800698 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
699 foreach curses_dep : curses_dep_list
700 if not curses.found()
701 curses = dependency(curses_dep,
702 required: false,
703 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100704 kwargs: static_kwargs)
Yonggang Luoca31e302020-11-17 05:31:06 +0800705 endif
706 endforeach
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400707 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Stefan Weilfbab8cc2021-11-17 21:53:55 +0100708 curses_compile_args = ['-DNCURSES_WIDECHAR=1']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400709 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500710 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
711 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400712 else
713 msg = 'curses package not usable'
714 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800715 endif
716 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400717 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400718 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
719 if targetos != 'windows' and not has_curses_h
720 message('Trying with /usr/include/ncursesw')
721 curses_compile_args += ['-I/usr/include/ncursesw']
722 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
723 endif
724 if has_curses_h
725 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
726 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800727 libcurses = cc.find_library(curses_libname,
728 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100729 kwargs: static_kwargs)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400730 if libcurses.found()
731 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
732 curses = declare_dependency(compile_args: curses_compile_args,
733 dependencies: [libcurses])
734 break
735 else
736 msg = 'curses library not usable'
737 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800738 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400739 endforeach
740 endif
741 endif
742 if not get_option('iconv').disabled()
743 foreach link_args : [ ['-liconv'], [] ]
744 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
745 # We need to use libiconv if available because mixing libiconv's headers with
746 # the system libc does not work.
747 # However, without adding glib to the dependencies -L/usr/local/lib will not be
748 # included in the command line and libiconv will not be found.
749 if cc.links('''
750 #include <iconv.h>
751 int main(void) {
752 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
753 return conv != (iconv_t) -1;
754 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
755 iconv = declare_dependency(link_args: link_args, dependencies: glib)
756 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800757 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400758 endforeach
759 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400760 if curses.found() and not iconv.found()
761 if get_option('iconv').enabled()
762 error('iconv not available')
763 endif
764 msg = 'iconv required for curses UI but not available'
765 curses = not_found
766 endif
767 if not curses.found() and msg != ''
768 if get_option('curses').enabled()
769 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400770 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400771 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400772 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800773 endif
774endif
775
Paolo Bonzini26347332019-07-29 15:40:07 +0200776brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100777if not get_option('brlapi').auto() or have_system
778 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
779 required: get_option('brlapi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100780 kwargs: static_kwargs)
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100781 if brlapi.found() and not cc.links('''
782 #include <brlapi.h>
783 #include <stddef.h>
784 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
785 brlapi = not_found
786 if get_option('brlapi').enabled()
787 error('could not link brlapi')
788 else
789 warning('could not link brlapi, disabling')
790 endif
791 endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200792endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100793
Paolo Bonzini760e4322020-08-26 08:09:48 +0200794sdl = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100795if not get_option('sdl').auto() or (have_system and not cocoa.found())
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100796 sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200797 sdl_image = not_found
798endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100799if sdl.found()
800 # work around 2.0.8 bug
801 sdl = declare_dependency(compile_args: '-Wno-undef',
802 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200803 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100804 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100805else
806 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100807 error('sdl-image required, but SDL was @0@'.format(
808 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100809 endif
810 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200811endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100812
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400813rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100814if not get_option('rbd').auto() or have_block
815 librados = cc.find_library('rados', required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100816 kwargs: static_kwargs)
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100817 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
818 required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100819 kwargs: static_kwargs)
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100820 if librados.found() and librbd.found()
821 if cc.links('''
822 #include <stdio.h>
823 #include <rbd/librbd.h>
824 int main(void) {
825 rados_t cluster;
826 rados_create(&cluster, NULL);
Peter Lieven48672ac2021-07-02 19:23:51 +0200827 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
828 #error
829 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100830 return 0;
831 }''', dependencies: [librbd, librados])
832 rbd = declare_dependency(dependencies: [librbd, librados])
833 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +0200834 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100835 else
Peter Lieven48672ac2021-07-02 19:23:51 +0200836 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100837 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100838 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400839endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100840
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400841glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100842glusterfs_ftruncate_has_stat = false
843glusterfs_iocb_has_stat = false
844if not get_option('glusterfs').auto() or have_block
845 glusterfs = dependency('glusterfs-api', version: '>=3',
846 required: get_option('glusterfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100847 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100848 if glusterfs.found()
849 glusterfs_ftruncate_has_stat = cc.links('''
850 #include <glusterfs/api/glfs.h>
851
852 int
853 main(void)
854 {
855 /* new glfs_ftruncate() passes two additional args */
856 return glfs_ftruncate(NULL, 0, NULL, NULL);
857 }
858 ''', dependencies: glusterfs)
859 glusterfs_iocb_has_stat = cc.links('''
860 #include <glusterfs/api/glfs.h>
861
862 /* new glfs_io_cbk() passes two additional glfs_stat structs */
863 static void
864 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
865 {}
866
867 int
868 main(void)
869 {
870 glfs_io_cbk iocb = &glusterfs_iocb;
871 iocb(NULL, 0 , NULL, NULL, NULL);
872 return 0;
873 }
874 ''', dependencies: glusterfs)
875 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400876endif
Thomas Huthe6a52b32021-12-09 15:48:01 +0100877
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400878libssh = not_found
Thomas Huthe6a52b32021-12-09 15:48:01 +0100879if not get_option('libssh').auto() or have_block
880 libssh = dependency('libssh', version: '>=0.8.7',
881 method: 'pkg-config',
882 required: get_option('libssh'),
883 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400884endif
Thomas Huthe6a52b32021-12-09 15:48:01 +0100885
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400886libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100887if not get_option('bzip2').auto() or have_block
888 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
889 required: get_option('bzip2'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100890 kwargs: static_kwargs)
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100891 if libbzip2.found() and not cc.links('''
892 #include <bzlib.h>
893 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
894 libbzip2 = not_found
895 if get_option('bzip2').enabled()
896 error('could not link libbzip2')
897 else
898 warning('could not link libbzip2, disabling')
899 endif
900 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400901endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100902
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400903liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +0100904if not get_option('lzfse').auto() or have_block
905 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
906 required: get_option('lzfse'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100907 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400908endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100909if liblzfse.found() and not cc.links('''
910 #include <lzfse.h>
911 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
912 liblzfse = not_found
913 if get_option('lzfse').enabled()
914 error('could not link liblzfse')
915 else
916 warning('could not link liblzfse, disabling')
917 endif
918endif
919
Paolo Bonzini478e9432020-08-17 12:47:55 +0200920oss = not_found
Thomas Huthab486f12021-11-02 11:58:22 +0100921if have_system and not get_option('oss').disabled()
Paolo Bonzini87430d52021-10-07 15:06:09 +0200922 if not cc.has_header('sys/soundcard.h')
923 # not found
924 elif targetos == 'netbsd'
925 oss = cc.find_library('ossaudio', required: get_option('oss'),
926 kwargs: static_kwargs)
927 else
928 oss = declare_dependency()
929 endif
930
931 if not oss.found()
932 if get_option('oss').enabled()
933 error('OSS not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +0200934 endif
935 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200936endif
937dsound = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200938if not get_option('dsound').auto() or (targetos == 'windows' and have_system)
939 if cc.has_header('dsound.h')
940 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
941 endif
942
943 if not dsound.found()
944 if get_option('dsound').enabled()
945 error('DirectSound not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +0200946 endif
947 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200948endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200949
Paolo Bonzini478e9432020-08-17 12:47:55 +0200950coreaudio = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200951if not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system)
952 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
953 required: get_option('coreaudio'))
Paolo Bonzini478e9432020-08-17 12:47:55 +0200954endif
Thomas Huth8bc51842021-07-13 13:09:02 +0200955
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400956opengl = not_found
957if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400958 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
959 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400960endif
Thomas Huth8bc51842021-07-13 13:09:02 +0200961gbm = not_found
962if (have_system or have_tools) and (virgl.found() or opengl.found())
963 gbm = dependency('gbm', method: 'pkg-config', required: false,
964 kwargs: static_kwargs)
965endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100966
Paolo Bonzini57612512021-06-03 11:15:26 +0200967gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +0100968gnutls_crypto = not_found
Alyssa Rossabc14fd2021-08-06 14:49:47 +0000969if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +0100970 # For general TLS support our min gnutls matches
971 # that implied by our platform support matrix
972 #
973 # For the crypto backends, we look for a newer
974 # gnutls:
975 #
976 # Version 3.6.8 is needed to get XTS
977 # Version 3.6.13 is needed to get PBKDF
978 # Version 3.6.14 is needed to get HW accelerated XTS
979 #
980 # If newer enough gnutls isn't available, we can
981 # still use a different crypto backend to satisfy
982 # the platform support requirements
983 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
984 method: 'pkg-config',
985 required: false,
986 kwargs: static_kwargs)
987 if gnutls_crypto.found()
988 gnutls = gnutls_crypto
989 else
990 # Our min version if all we need is TLS
991 gnutls = dependency('gnutls', version: '>=3.5.18',
992 method: 'pkg-config',
993 required: get_option('gnutls'),
994 kwargs: static_kwargs)
995 endif
Paolo Bonzini57612512021-06-03 11:15:26 +0200996endif
997
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +0100998# We prefer use of gnutls for crypto, unless the options
999# explicitly asked for nettle or gcrypt.
1000#
1001# If gnutls isn't available for crypto, then we'll prefer
1002# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +02001003gcrypt = not_found
1004nettle = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +01001005xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001006
Paolo Bonzini57612512021-06-03 11:15:26 +02001007if get_option('nettle').enabled() and get_option('gcrypt').enabled()
1008 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +02001009endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001010
1011# Explicit nettle/gcrypt request, so ignore gnutls for crypto
1012if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001013 gnutls_crypto = not_found
1014endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001015
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001016if not gnutls_crypto.found()
1017 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
1018 gcrypt = dependency('libgcrypt', version: '>=1.8',
1019 method: 'config-tool',
1020 required: get_option('gcrypt'),
1021 kwargs: static_kwargs)
1022 # Debian has removed -lgpg-error from libgcrypt-config
1023 # as it "spreads unnecessary dependencies" which in
1024 # turn breaks static builds...
1025 if gcrypt.found() and enable_static
1026 gcrypt = declare_dependency(dependencies: [
1027 gcrypt,
1028 cc.find_library('gpg-error', required: true, kwargs: static_kwargs)])
1029 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001030 endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001031 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1032 nettle = dependency('nettle', version: '>=3.4',
1033 method: 'pkg-config',
1034 required: get_option('nettle'),
1035 kwargs: static_kwargs)
1036 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1037 xts = 'private'
1038 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001039 endif
1040endif
1041
1042gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +01001043gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001044vte = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +01001045if not get_option('gtk').auto() or (have_system and not cocoa.found())
Paolo Bonzini1b695472021-01-07 14:02:29 +01001046 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1047 method: 'pkg-config',
1048 required: get_option('gtk'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001049 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +01001050 if gtk.found()
1051 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1052 method: 'pkg-config',
1053 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001054 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +01001055 gtk = declare_dependency(dependencies: [gtk, gtkx11])
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001056
1057 if not get_option('vte').auto() or have_system
1058 vte = dependency('vte-2.91',
1059 method: 'pkg-config',
1060 required: get_option('vte'),
1061 kwargs: static_kwargs)
1062 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001063 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001064endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001065
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001066x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +02001067if gtkx11.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001068 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001069 kwargs: static_kwargs)
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001070endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001071vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001072png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001073jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001074sasl = not_found
Thomas Huth95e22892021-09-06 17:39:39 +02001075if have_system and not get_option('vnc').disabled()
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001076 vnc = declare_dependency() # dummy dependency
1077 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001078 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini8e242b32020-11-23 13:34:02 -05001079 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001080 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001081 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
1082 required: get_option('vnc_sasl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001083 kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001084 if sasl.found()
1085 sasl = declare_dependency(dependencies: sasl,
1086 compile_args: '-DSTRUCT_IOVEC_DEFINED')
1087 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001088endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01001089
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001090pam = not_found
1091if not get_option('auth_pam').auto() or have_system
1092 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
1093 required: get_option('auth_pam'),
1094 kwargs: static_kwargs)
1095endif
1096if pam.found() and not cc.links('''
1097 #include <stddef.h>
1098 #include <security/pam_appl.h>
1099 int main(void) {
1100 const char *service_name = "qemu";
1101 const char *user = "frank";
1102 const struct pam_conv pam_conv = { 0 };
1103 pam_handle_t *pamh = NULL;
1104 pam_start(service_name, user, &pam_conv, &pamh);
1105 return 0;
1106 }''', dependencies: pam)
1107 pam = not_found
1108 if get_option('auth_pam').enabled()
1109 error('could not link libpam')
1110 else
1111 warning('could not link libpam, disabling')
1112 endif
1113endif
1114
Marc-André Lureau708eab42019-09-03 16:59:33 +04001115snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +01001116if not get_option('snappy').auto() or have_system
1117 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
1118 required: get_option('snappy'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001119 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +04001120endif
Paolo Bonzini565174d2021-11-04 14:35:14 +01001121if snappy.found() and not linker.links('''
Paolo Bonzini241611e2020-11-17 13:32:34 +01001122 #include <snappy-c.h>
1123 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
1124 snappy = not_found
1125 if get_option('snappy').enabled()
1126 error('could not link libsnappy')
1127 else
1128 warning('could not link libsnappy, disabling')
1129 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +04001130endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001131
Marc-André Lureau708eab42019-09-03 16:59:33 +04001132lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001133if not get_option('lzo').auto() or have_system
1134 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
1135 required: get_option('lzo'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001136 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +04001137endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001138if lzo.found() and not cc.links('''
1139 #include <lzo/lzo1x.h>
1140 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
1141 lzo = not_found
1142 if get_option('lzo').enabled()
1143 error('could not link liblzo2')
1144 else
1145 warning('could not link liblzo2, disabling')
1146 endif
1147endif
1148
Marc-André Lureau55166232019-07-24 19:16:22 +04001149rdma = not_found
1150if 'CONFIG_RDMA' in config_host
1151 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
1152endif
Marc-André Lureauab318052019-07-24 19:23:16 +04001153numa = not_found
1154if 'CONFIG_NUMA' in config_host
1155 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
1156endif
Marc-André Lureau582ea952019-08-15 15:15:32 +04001157xen = not_found
1158if 'CONFIG_XEN_BACKEND' in config_host
1159 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
1160 link_args: config_host['XEN_LIBS'].split())
1161endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001162cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02001163if not get_option('smartcard').auto() or have_system
1164 cacard = dependency('libcacard', required: get_option('smartcard'),
1165 version: '>=2.5.1', method: 'pkg-config',
1166 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001167endif
César Belley0a40bcb2020-08-26 13:42:04 +02001168u2f = not_found
1169if have_system
1170 u2f = dependency('u2f-emu', required: get_option('u2f'),
1171 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001172 kwargs: static_kwargs)
César Belley0a40bcb2020-08-26 13:42:04 +02001173endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001174usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02001175if not get_option('usb_redir').auto() or have_system
1176 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
1177 version: '>=0.6', method: 'pkg-config',
1178 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001179endif
1180libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02001181if not get_option('libusb').auto() or have_system
1182 libusb = dependency('libusb-1.0', required: get_option('libusb'),
1183 version: '>=1.0.13', method: 'pkg-config',
1184 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001185endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02001186
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001187libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02001188if not get_option('libpmem').auto() or have_system
1189 libpmem = dependency('libpmem', required: get_option('libpmem'),
1190 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001191endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001192libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02001193if not get_option('libdaxctl').auto() or have_system
1194 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
1195 version: '>=57', method: 'pkg-config',
1196 kwargs: static_kwargs)
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001197endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001198tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02001199if gnutls.found()
1200 tasn1 = dependency('libtasn1',
1201 method: 'pkg-config',
1202 kwargs: static_kwargs)
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001203endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001204keyutils = dependency('libkeyutils', required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001205 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001206
Marc-André Lureau3909def2020-08-28 15:07:33 +04001207has_gettid = cc.has_function('gettid')
1208
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001209# libselinux
1210selinux = dependency('libselinux',
1211 required: get_option('selinux'),
1212 method: 'pkg-config', kwargs: static_kwargs)
1213
Paolo Bonziniaa087962020-09-01 11:15:30 -04001214# Malloc tests
1215
1216malloc = []
1217if get_option('malloc') == 'system'
1218 has_malloc_trim = \
1219 not get_option('malloc_trim').disabled() and \
1220 cc.links('''#include <malloc.h>
1221 int main(void) { malloc_trim(0); return 0; }''')
1222else
1223 has_malloc_trim = false
1224 malloc = cc.find_library(get_option('malloc'), required: true)
1225endif
1226if not has_malloc_trim and get_option('malloc_trim').enabled()
1227 if get_option('malloc') == 'system'
1228 error('malloc_trim not available on this platform.')
1229 else
1230 error('malloc_trim not available with non-libc memory allocator')
1231 endif
1232endif
1233
Max Reitz84e319a2020-11-02 17:18:55 +01001234# Check whether the glibc provides statx()
1235
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001236gnu_source_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01001237 #ifndef _GNU_SOURCE
1238 #define _GNU_SOURCE
1239 #endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001240'''
1241statx_test = gnu_source_prefix + '''
Max Reitz84e319a2020-11-02 17:18:55 +01001242 #include <sys/stat.h>
1243 int main(void) {
1244 struct statx statxbuf;
1245 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
1246 return 0;
1247 }'''
1248
1249has_statx = cc.links(statx_test)
1250
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +00001251have_vhost_user_blk_server = (targetos == 'linux' and
1252 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001253
1254if get_option('vhost_user_blk_server').enabled()
1255 if targetos != 'linux'
1256 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +00001257 elif 'CONFIG_VHOST_USER' not in config_host
1258 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001259 endif
1260elif get_option('vhost_user_blk_server').disabled() or not have_system
1261 have_vhost_user_blk_server = false
1262endif
1263
Daniele Buono9e62ba42020-12-04 18:06:14 -05001264
Max Reitzdf4ea702020-10-27 20:05:46 +01001265if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1266 error('Cannot enable fuse-lseek while fuse is disabled')
1267endif
1268
Max Reitza484a712020-10-27 20:05:41 +01001269fuse = dependency('fuse3', required: get_option('fuse'),
1270 version: '>=3.1', method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001271 kwargs: static_kwargs)
Max Reitza484a712020-10-27 20:05:41 +01001272
Max Reitzdf4ea702020-10-27 20:05:46 +01001273fuse_lseek = not_found
1274if not get_option('fuse_lseek').disabled()
1275 if fuse.version().version_compare('>=3.8')
1276 # Dummy dependency
1277 fuse_lseek = declare_dependency()
1278 elif get_option('fuse_lseek').enabled()
1279 if fuse.found()
1280 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1281 else
1282 error('fuse-lseek requires libfuse, which was not found')
1283 endif
1284 endif
1285endif
1286
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001287# libbpf
1288libbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
1289if libbpf.found() and not cc.links('''
1290 #include <bpf/libbpf.h>
1291 int main(void)
1292 {
1293 bpf_object__destroy_skeleton(NULL);
1294 return 0;
1295 }''', dependencies: libbpf)
1296 libbpf = not_found
1297 if get_option('bpf').enabled()
1298 error('libbpf skeleton test failed')
1299 else
1300 warning('libbpf skeleton test failed, disabling')
1301 endif
1302endif
1303
Paolo Bonzini87430d52021-10-07 15:06:09 +02001304#################
1305# config-host.h #
1306#################
1307
1308audio_drivers_selected = []
1309if have_system
1310 audio_drivers_available = {
1311 'alsa': alsa.found(),
1312 'coreaudio': coreaudio.found(),
1313 'dsound': dsound.found(),
1314 'jack': jack.found(),
1315 'oss': oss.found(),
1316 'pa': pulse.found(),
1317 'sdl': sdl.found(),
1318 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02001319 foreach k, v: audio_drivers_available
1320 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
1321 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02001322
1323 # Default to native drivers first, OSS second, SDL third
1324 audio_drivers_priority = \
1325 [ 'pa', 'coreaudio', 'dsound', 'oss' ] + \
1326 (targetos == 'linux' ? [] : [ 'sdl' ])
1327 audio_drivers_default = []
1328 foreach k: audio_drivers_priority
1329 if audio_drivers_available[k]
1330 audio_drivers_default += k
1331 endif
1332 endforeach
1333
1334 foreach k: get_option('audio_drv_list')
1335 if k == 'default'
1336 audio_drivers_selected += audio_drivers_default
1337 elif not audio_drivers_available[k]
1338 error('Audio driver "@0@" not available.'.format(k))
1339 else
1340 audio_drivers_selected += k
1341 endif
1342 endforeach
1343endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001344config_host_data.set('CONFIG_AUDIO_DRIVERS',
1345 '"' + '", "'.join(audio_drivers_selected) + '", ')
1346
Daniele Buono9e62ba42020-12-04 18:06:14 -05001347if get_option('cfi')
1348 cfi_flags=[]
1349 # Check for dependency on LTO
1350 if not get_option('b_lto')
1351 error('Selected Control-Flow Integrity but LTO is disabled')
1352 endif
1353 if config_host.has_key('CONFIG_MODULES')
1354 error('Selected Control-Flow Integrity is not compatible with modules')
1355 endif
1356 # Check for cfi flags. CFI requires LTO so we can't use
1357 # get_supported_arguments, but need a more complex "compiles" which allows
1358 # custom arguments
1359 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1360 args: ['-flto', '-fsanitize=cfi-icall'] )
1361 cfi_flags += '-fsanitize=cfi-icall'
1362 else
1363 error('-fsanitize=cfi-icall is not supported by the compiler')
1364 endif
1365 if cc.compiles('int main () { return 0; }',
1366 name: '-fsanitize-cfi-icall-generalize-pointers',
1367 args: ['-flto', '-fsanitize=cfi-icall',
1368 '-fsanitize-cfi-icall-generalize-pointers'] )
1369 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1370 else
1371 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1372 endif
1373 if get_option('cfi_debug')
1374 if cc.compiles('int main () { return 0; }',
1375 name: '-fno-sanitize-trap=cfi-icall',
1376 args: ['-flto', '-fsanitize=cfi-icall',
1377 '-fno-sanitize-trap=cfi-icall'] )
1378 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1379 else
1380 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1381 endif
1382 endif
Marc-André Lureau5fc06172021-01-14 16:56:02 +04001383 add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1384 add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
Daniele Buono9e62ba42020-12-04 18:06:14 -05001385endif
1386
Joelle van Dyne14176c82021-03-15 11:03:38 -07001387have_host_block_device = (targetos != 'darwin' or
1388 cc.has_header('IOKit/storage/IOMedia.h'))
1389
Paolo Bonzini69202b42020-11-17 14:46:21 +01001390have_virtfs = (targetos == 'linux' and
1391 have_system and
1392 libattr.found() and
1393 libcap_ng.found())
1394
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01001395have_virtfs_proxy_helper = have_virtfs and have_tools
1396
Paolo Bonzini69202b42020-11-17 14:46:21 +01001397if get_option('virtfs').enabled()
1398 if not have_virtfs
1399 if targetos != 'linux'
1400 error('virtio-9p (virtfs) requires Linux')
1401 elif not libcap_ng.found() or not libattr.found()
1402 error('virtio-9p (virtfs) requires libcap-ng-devel and libattr-devel')
1403 elif not have_system
1404 error('virtio-9p (virtfs) needs system emulation support')
1405 endif
1406 endif
1407elif get_option('virtfs').disabled()
1408 have_virtfs = false
1409endif
1410
Paolo Bonzini9c29b742021-10-07 15:08:14 +02001411foreach k : get_option('trace_backends')
1412 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
1413endforeach
1414config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
1415
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001416config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1417config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1418config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1419config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1420config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
1421config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
1422config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1423config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1424config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1425config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1426config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1427config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1428
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001429config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001430config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04001431config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzini537b7242021-10-07 15:08:12 +02001432config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02001433config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001434config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001435config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001436config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1437config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001438config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08001439config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02001440config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001441config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1442if glusterfs.found()
1443 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1444 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1445 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1446 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1447 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1448 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1449endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001450config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001451config_host_data.set('CONFIG_VTE', vte.found())
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001452config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001453config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001454config_host_data.set('CONFIG_EBPF', libbpf.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001455config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001456config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01001457config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Thomas Huthe6a52b32021-12-09 15:48:01 +01001458config_host_data.set('CONFIG_LIBSSH', libssh.found())
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001459config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001460config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
1461config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001462config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001463config_host_data.set('CONFIG_SDL', sdl.found())
1464config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01001465config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01001466config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzini90540f32021-06-03 11:15:26 +02001467config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Paolo Bonzinie1723992021-10-07 15:08:21 +02001468config_host_data.set('CONFIG_VDE', vde.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001469config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001470config_host_data.set('CONFIG_VNC', vnc.found())
1471config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1472config_host_data.set('CONFIG_VNC_PNG', png.found())
1473config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01001474config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001475config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001476config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001477config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04001478config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02001479config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001480config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02001481config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
1482config_host_data.set('CONFIG_NETTLE', nettle.found())
1483config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04001484config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01001485config_host_data.set('CONFIG_STATX', has_statx)
Paolo Bonzinib1def332020-11-17 13:37:39 +01001486config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01001487config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01001488config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001489config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
1490config_host_data.set('CONFIG_SPICE', spice.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01001491config_host_data.set('CONFIG_X11', x11.found())
Daniele Buono9e62ba42020-12-04 18:06:14 -05001492config_host_data.set('CONFIG_CFI', get_option('cfi'))
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001493config_host_data.set('CONFIG_SELINUX', selinux.found())
Paolo Bonzini859aef02020-08-04 18:14:26 +02001494config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1495config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1496config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1497config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1498
Paolo Bonzinia6305082021-10-07 15:08:15 +02001499config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001500config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
Paolo Bonzini269506d2021-10-07 15:08:16 +02001501config_host_data.set('HOST_WORDS_BIGENDIAN', host_machine.endian() == 'big')
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001502
1503# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001504config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02001505config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
1506config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
Thomas Huth48f670e2020-11-18 18:10:52 +01001507config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001508config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001509config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001510config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001511config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001512config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001513
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001514# has_function
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001515config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001516config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
1517config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
1518config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
1519config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001520config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001521config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001522config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001523config_host_data.set('CONFIG_SEM_TIMEDWAIT', cc.has_function('sem_timedwait', dependencies: threads))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001524config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
1525config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
1526config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
1527config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
1528config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001529config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001530config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001531config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001532config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Li Zhijian911965a2021-09-10 15:02:55 +08001533if rdma.found()
1534 config_host_data.set('HAVE_IBV_ADVISE_MR',
1535 cc.has_function('ibv_advise_mr',
1536 args: config_host['RDMA_LIBS'].split(),
1537 prefix: '#include <infiniband/verbs.h>'))
1538endif
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001539
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001540# has_header_symbol
1541config_host_data.set('CONFIG_BYTESWAP_H',
1542 cc.has_header_symbol('byteswap.h', 'bswap_32'))
1543config_host_data.set('CONFIG_EPOLL_CREATE1',
1544 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02001545config_host_data.set('CONFIG_HAS_ENVIRON',
1546 cc.has_header_symbol('unistd.h', 'environ', prefix: gnu_source_prefix))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001547config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
1548 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
1549 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
1550config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
1551 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
1552config_host_data.set('CONFIG_FIEMAP',
1553 cc.has_header('linux/fiemap.h') and
1554 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001555config_host_data.set('CONFIG_GETRANDOM',
1556 cc.has_function('getrandom') and
1557 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001558config_host_data.set('CONFIG_INOTIFY',
1559 cc.has_header_symbol('sys/inotify.h', 'inotify_init'))
1560config_host_data.set('CONFIG_INOTIFY1',
1561 cc.has_header_symbol('sys/inotify.h', 'inotify_init1'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001562config_host_data.set('CONFIG_MACHINE_BSWAP_H',
1563 cc.has_header_symbol('machine/bswap.h', 'bswap32',
1564 prefix: '''#include <sys/endian.h>
1565 #include <sys/types.h>'''))
1566config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
1567 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001568config_host_data.set('CONFIG_RTNETLINK',
1569 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
1570config_host_data.set('CONFIG_SYSMACROS',
1571 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001572config_host_data.set('HAVE_OPTRESET',
1573 cc.has_header_symbol('getopt.h', 'optreset'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04001574config_host_data.set('HAVE_IPPROTO_MPTCP',
1575 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001576
1577# has_member
1578config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
1579 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
1580 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001581config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
1582 cc.has_member('struct stat', 'st_atim',
1583 prefix: '#include <sys/stat.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001584
Paolo Bonzini6a23f812021-11-16 08:28:29 +01001585# has_type
1586config_host_data.set('CONFIG_IOVEC',
1587 cc.has_type('struct iovec',
1588 prefix: '#include <sys/uio.h>'))
1589config_host_data.set('HAVE_UTMPX',
1590 cc.has_type('struct utmpx',
1591 prefix: '#include <utmpx.h>'))
1592
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001593config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001594 #include <sys/eventfd.h>
1595 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001596config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001597 #include <unistd.h>
1598 int main(void) {
1599 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
1600 return fdatasync(0);
1601 #else
1602 #error Not supported
1603 #endif
1604 }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001605config_host_data.set('CONFIG_MADVISE', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001606 #include <sys/types.h>
1607 #include <sys/mman.h>
1608 #include <stddef.h>
1609 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001610config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001611 #include <sys/mman.h>
1612 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001613config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02001614 #include <fcntl.h>
1615 #if !defined(AT_EMPTY_PATH)
1616 # error missing definition
1617 #else
1618 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
1619 #endif'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001620config_host_data.set('CONFIG_PIPE2', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001621 #include <unistd.h>
1622 #include <fcntl.h>
1623
1624 int main(void)
1625 {
1626 int pipefd[2];
1627 return pipe2(pipefd, O_CLOEXEC);
1628 }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001629config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001630 #include <sys/mman.h>
1631 #include <stddef.h>
1632 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
Paolo Bonzini10f6b232021-10-07 15:08:19 +02001633
Paolo Bonzini6a23f812021-11-16 08:28:29 +01001634config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02001635 #include <pthread.h>
1636
1637 static void *f(void *p) { return NULL; }
1638 int main(void)
1639 {
1640 pthread_t thread;
1641 pthread_create(&thread, 0, f, 0);
1642 pthread_setname_np(thread, "QEMU");
1643 return 0;
1644 }''', dependencies: threads))
Paolo Bonzini6a23f812021-11-16 08:28:29 +01001645config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02001646 #include <pthread.h>
1647
1648 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
1649 int main(void)
1650 {
1651 pthread_t thread;
1652 pthread_create(&thread, 0, f, 0);
1653 return 0;
1654 }''', dependencies: threads))
1655
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001656config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02001657 #include <sys/signalfd.h>
1658 #include <stddef.h>
1659 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001660config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001661 #include <unistd.h>
1662 #include <fcntl.h>
1663 #include <limits.h>
1664
1665 int main(void)
1666 {
1667 int len, fd = 0;
1668 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
1669 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
1670 return 0;
1671 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001672
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02001673config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
1674 #include <sys/mman.h>
1675 int main(int argc, char *argv[]) {
1676 return mlockall(MCL_FUTURE);
1677 }'''))
1678
Thomas Hutheea94532021-10-28 20:59:08 +02001679have_l2tpv3 = false
1680if not get_option('l2tpv3').disabled() and have_system
Paolo Bonzini6a23f812021-11-16 08:28:29 +01001681 have_l2tpv3 = cc.has_type('struct mmsghdr',
1682 prefix: gnu_source_prefix + '''
1683 #include <sys/socket.h>
1684 #include <linux/ip.h>''')
Thomas Hutheea94532021-10-28 20:59:08 +02001685endif
1686config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
1687
Paolo Bonzini837b84b2021-10-07 15:08:22 +02001688have_netmap = false
1689if not get_option('netmap').disabled() and have_system
1690 have_netmap = cc.compiles('''
1691 #include <inttypes.h>
1692 #include <net/if.h>
1693 #include <net/netmap.h>
1694 #include <net/netmap_user.h>
1695 #if (NETMAP_API < 11) || (NETMAP_API > 15)
1696 #error
1697 #endif
1698 int main(void) { return 0; }''')
1699 if not have_netmap and get_option('netmap').enabled()
1700 error('Netmap headers not available')
1701 endif
1702endif
1703config_host_data.set('CONFIG_NETMAP', have_netmap)
1704
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02001705# Work around a system header bug with some kernel/XFS header
1706# versions where they both try to define 'struct fsxattr':
1707# xfs headers will not try to redefine structs from linux headers
1708# if this macro is set.
1709config_host_data.set('HAVE_FSXATTR', cc.links('''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01001710 #include <linux/fs.h>
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02001711 struct fsxattr foo;
1712 int main(void) {
1713 return 0;
1714 }'''))
1715
Paolo Bonzinie46bd552021-06-03 11:57:04 +02001716# Some versions of Mac OS X incorrectly define SIZE_MAX
1717config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
1718 #include <stdint.h>
1719 #include <stdio.h>
1720 int main(int argc, char *argv[]) {
1721 return printf("%zu", SIZE_MAX);
1722 }''', args: ['-Werror']))
1723
Paolo Bonzinibd87a362021-10-07 15:08:25 +02001724# See if 64-bit atomic operations are supported.
1725# Note that without __atomic builtins, we can only
1726# assume atomic loads/stores max at pointer size.
1727config_host_data.set('CONFIG_ATOMIC64', cc.links('''
1728 #include <stdint.h>
1729 int main(void)
1730 {
1731 uint64_t x = 0, y = 0;
1732 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
1733 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
1734 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
1735 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
1736 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
1737 return 0;
1738 }'''))
1739
1740config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
1741 #include <sys/auxv.h>
1742 int main(void) {
1743 return getauxval(AT_HWCAP) == 0;
1744 }'''))
1745
1746config_host_data.set('CONFIG_AF_VSOCK', cc.compiles(gnu_source_prefix + '''
1747 #include <errno.h>
1748 #include <sys/types.h>
1749 #include <sys/socket.h>
1750 #if !defined(AF_VSOCK)
1751 # error missing AF_VSOCK flag
1752 #endif
1753 #include <linux/vm_sockets.h>
1754 int main(void) {
1755 int sock, ret;
1756 struct sockaddr_vm svm;
1757 socklen_t len = sizeof(svm);
1758 sock = socket(AF_VSOCK, SOCK_STREAM, 0);
1759 ret = getpeername(sock, (struct sockaddr *)&svm, &len);
1760 if ((ret == -1) && (errno == ENOTCONN)) {
1761 return 0;
1762 }
1763 return -1;
1764 }'''))
1765
Paolo Bonzinia76a1f62021-10-13 10:04:24 +02001766ignored = ['CONFIG_QEMU_INTERP_PREFIX', # actually per-target
1767 'HAVE_GDB_BIN']
Paolo Bonzini87430d52021-10-07 15:06:09 +02001768arrays = ['CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzinia6305082021-10-07 15:08:15 +02001769strings = ['CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001770foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -04001771 if ignored.contains(k)
1772 # do nothing
1773 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001774 if v != ''
1775 v = '"' + '", "'.join(v.split()) + '", '
1776 endif
1777 config_host_data.set(k, v)
1778 elif k == 'ARCH'
1779 config_host_data.set('HOST_' + v.to_upper(), 1)
1780 elif strings.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001781 config_host_data.set_quoted(k, v)
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02001782 elif k.startswith('CONFIG_')
Paolo Bonzini859aef02020-08-04 18:14:26 +02001783 config_host_data.set(k, v == 'y' ? 1 : v)
1784 endif
1785endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02001786
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001787########################
1788# Target configuration #
1789########################
1790
Paolo Bonzini2becc362020-02-03 11:42:03 +01001791minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04001792config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001793config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001794config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001795config_devices_mak_list = []
1796config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02001797config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001798config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001799
1800disassemblers = {
1801 'alpha' : ['CONFIG_ALPHA_DIS'],
1802 'arm' : ['CONFIG_ARM_DIS'],
1803 'avr' : ['CONFIG_AVR_DIS'],
1804 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06001805 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001806 'hppa' : ['CONFIG_HPPA_DIS'],
1807 'i386' : ['CONFIG_I386_DIS'],
1808 'x86_64' : ['CONFIG_I386_DIS'],
1809 'x32' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001810 'm68k' : ['CONFIG_M68K_DIS'],
1811 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1812 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001813 'nios2' : ['CONFIG_NIOS2_DIS'],
1814 'or1k' : ['CONFIG_OPENRISC_DIS'],
1815 'ppc' : ['CONFIG_PPC_DIS'],
1816 'riscv' : ['CONFIG_RISCV_DIS'],
1817 'rx' : ['CONFIG_RX_DIS'],
1818 's390' : ['CONFIG_S390_DIS'],
1819 'sh4' : ['CONFIG_SH4_DIS'],
1820 'sparc' : ['CONFIG_SPARC_DIS'],
1821 'xtensa' : ['CONFIG_XTENSA_DIS'],
1822}
1823if link_language == 'cpp'
1824 disassemblers += {
1825 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1826 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1827 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1828 }
1829endif
1830
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001831have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01001832host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02001833 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001834 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001835 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02001836 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001837 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01001838 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001839 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1840 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1841 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01001842 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001843 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman3090de62021-01-29 11:46:05 -05001844 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : []) + \
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01001845 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01001846
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001847ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001848
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001849default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1850actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001851fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001852foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04001853 config_target = { 'TARGET_NAME': target.split('-')[0] }
1854 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001855 if targetos != 'linux'
1856 if default_targets
1857 continue
1858 endif
1859 error('Target @0@ is only available on a Linux host'.format(target))
1860 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001861 config_target += { 'CONFIG_LINUX_USER': 'y' }
1862 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001863 if 'CONFIG_BSD' not in config_host
1864 if default_targets
1865 continue
1866 endif
1867 error('Target @0@ is only available on a BSD host'.format(target))
1868 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001869 config_target += { 'CONFIG_BSD_USER': 'y' }
1870 elif target.endswith('softmmu')
1871 config_target += { 'CONFIG_SOFTMMU': 'y' }
1872 endif
1873 if target.endswith('-user')
1874 config_target += {
1875 'CONFIG_USER_ONLY': 'y',
1876 'CONFIG_QEMU_INTERP_PREFIX':
1877 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1878 }
1879 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001880
Paolo Bonzini0a189112020-11-17 14:58:32 +01001881 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04001882 foreach sym: accelerators
1883 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1884 config_target += { sym: 'y' }
1885 config_all += { sym: 'y' }
Paolo Bonzini23a77b22020-12-14 12:01:45 +01001886 if sym == 'CONFIG_TCG' and tcg_arch == 'tci'
1887 config_target += { 'CONFIG_TCG_INTERPRETER': 'y' }
1888 elif sym == 'CONFIG_XEN' and have_xen_pci_passthrough
Paolo Bonzini8a199802020-09-18 05:37:01 -04001889 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1890 endif
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02001891 if target in modular_tcg
1892 config_target += { 'CONFIG_TCG_MODULAR': 'y' }
1893 else
1894 config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
1895 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01001896 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04001897 endif
1898 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01001899 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001900 if default_targets
1901 continue
1902 endif
1903 error('No accelerator available for target @0@'.format(target))
1904 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001905
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001906 actual_target_dirs += target
Alex Bennée812b31d2021-07-07 14:17:43 +01001907 config_target += keyval.load('configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001908 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001909
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001910 if 'TARGET_NEED_FDT' in config_target
1911 fdt_required += target
1912 endif
1913
Paolo Bonzinifa731682020-09-21 05:19:07 -04001914 # Add default keys
1915 if 'TARGET_BASE_ARCH' not in config_target
1916 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1917 endif
1918 if 'TARGET_ABI_DIR' not in config_target
1919 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1920 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001921
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001922 foreach k, v: disassemblers
1923 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1924 foreach sym: v
1925 config_target += { sym: 'y' }
1926 config_all_disas += { sym: 'y' }
1927 endforeach
1928 endif
1929 endforeach
1930
Paolo Bonzini859aef02020-08-04 18:14:26 +02001931 config_target_data = configuration_data()
1932 foreach k, v: config_target
1933 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1934 # do nothing
1935 elif ignored.contains(k)
1936 # do nothing
1937 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001938 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1939 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001940 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001941 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001942 config_target_data.set_quoted(k, v)
1943 elif v == 'y'
1944 config_target_data.set(k, 1)
1945 else
1946 config_target_data.set(k, v)
1947 endif
1948 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01001949 config_target_data.set('QEMU_ARCH',
1950 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02001951 config_target_h += {target: configure_file(output: target + '-config-target.h',
1952 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001953
1954 if target.endswith('-softmmu')
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01001955 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001956 config_devices_mak = target + '-config-devices.mak'
1957 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01001958 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001959 output: config_devices_mak,
1960 depfile: config_devices_mak + '.d',
1961 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01001962 command: [minikconf,
1963 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01001964 config_devices_mak, '@DEPFILE@', '@INPUT@',
Philippe Mathieu-Daudéf4063f92021-07-07 14:17:40 +01001965 host_kconfig, accel_kconfig,
1966 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'])
Paolo Bonzini859aef02020-08-04 18:14:26 +02001967
1968 config_devices_data = configuration_data()
1969 config_devices = keyval.load(config_devices_mak)
1970 foreach k, v: config_devices
1971 config_devices_data.set(k, 1)
1972 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001973 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001974 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1975 configuration: config_devices_data)}
1976 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001977 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001978 endif
1979 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001980endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001981target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001982
Paolo Bonzini2becc362020-02-03 11:42:03 +01001983# This configuration is used to build files that are shared by
1984# multiple binaries, and then extracted out of the "common"
1985# static_library target.
1986#
1987# We do not use all_sources()/all_dependencies(), because it would
1988# build literally all source files, including devices only used by
1989# targets that are not built for this compilation. The CONFIG_ALL
1990# pseudo symbol replaces it.
1991
Paolo Bonzini05512f52020-09-16 15:31:11 -04001992config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001993config_all += config_host
1994config_all += config_all_disas
1995config_all += {
1996 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1997 'CONFIG_SOFTMMU': have_system,
1998 'CONFIG_USER_ONLY': have_user,
1999 'CONFIG_ALL': true,
2000}
2001
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002002##############
2003# Submodules #
2004##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002005
2006capstone = not_found
2007capstone_opt = get_option('capstone')
2008if capstone_opt in ['enabled', 'auto', 'system']
2009 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07002010 capstone = dependency('capstone', version: '>=4.0',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01002011 kwargs: static_kwargs, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002012 required: capstone_opt == 'system' or
2013 capstone_opt == 'enabled' and not have_internal)
Daniel P. Berrangé8f4aea72021-07-09 15:29:31 +01002014
2015 # Some versions of capstone have broken pkg-config file
2016 # that reports a wrong -I path, causing the #include to
2017 # fail later. If the system has such a broken version
2018 # do not use it.
2019 if capstone.found() and not cc.compiles('#include <capstone.h>',
2020 dependencies: [capstone])
2021 capstone = not_found
2022 if capstone_opt == 'system'
2023 error('system capstone requested, it does not appear to work')
2024 endif
2025 endif
2026
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002027 if capstone.found()
2028 capstone_opt = 'system'
2029 elif have_internal
2030 capstone_opt = 'internal'
2031 else
2032 capstone_opt = 'disabled'
2033 endif
2034endif
2035if capstone_opt == 'internal'
2036 capstone_data = configuration_data()
2037 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
2038
2039 capstone_files = files(
2040 'capstone/cs.c',
2041 'capstone/MCInst.c',
2042 'capstone/MCInstrDesc.c',
2043 'capstone/MCRegisterInfo.c',
2044 'capstone/SStream.c',
2045 'capstone/utils.c'
2046 )
2047
2048 if 'CONFIG_ARM_DIS' in config_all_disas
2049 capstone_data.set('CAPSTONE_HAS_ARM', '1')
2050 capstone_files += files(
2051 'capstone/arch/ARM/ARMDisassembler.c',
2052 'capstone/arch/ARM/ARMInstPrinter.c',
2053 'capstone/arch/ARM/ARMMapping.c',
2054 'capstone/arch/ARM/ARMModule.c'
2055 )
2056 endif
2057
2058 # FIXME: This config entry currently depends on a c++ compiler.
2059 # Which is needed for building libvixl, but not for capstone.
2060 if 'CONFIG_ARM_A64_DIS' in config_all_disas
2061 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
2062 capstone_files += files(
2063 'capstone/arch/AArch64/AArch64BaseInfo.c',
2064 'capstone/arch/AArch64/AArch64Disassembler.c',
2065 'capstone/arch/AArch64/AArch64InstPrinter.c',
2066 'capstone/arch/AArch64/AArch64Mapping.c',
2067 'capstone/arch/AArch64/AArch64Module.c'
2068 )
2069 endif
2070
2071 if 'CONFIG_PPC_DIS' in config_all_disas
2072 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
2073 capstone_files += files(
2074 'capstone/arch/PowerPC/PPCDisassembler.c',
2075 'capstone/arch/PowerPC/PPCInstPrinter.c',
2076 'capstone/arch/PowerPC/PPCMapping.c',
2077 'capstone/arch/PowerPC/PPCModule.c'
2078 )
2079 endif
2080
Richard Henderson3d562842020-01-04 07:24:59 +10002081 if 'CONFIG_S390_DIS' in config_all_disas
2082 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
2083 capstone_files += files(
2084 'capstone/arch/SystemZ/SystemZDisassembler.c',
2085 'capstone/arch/SystemZ/SystemZInstPrinter.c',
2086 'capstone/arch/SystemZ/SystemZMapping.c',
2087 'capstone/arch/SystemZ/SystemZModule.c',
2088 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
2089 )
2090 endif
2091
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002092 if 'CONFIG_I386_DIS' in config_all_disas
2093 capstone_data.set('CAPSTONE_HAS_X86', 1)
2094 capstone_files += files(
2095 'capstone/arch/X86/X86Disassembler.c',
2096 'capstone/arch/X86/X86DisassemblerDecoder.c',
2097 'capstone/arch/X86/X86ATTInstPrinter.c',
2098 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07002099 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002100 'capstone/arch/X86/X86Mapping.c',
2101 'capstone/arch/X86/X86Module.c'
2102 )
2103 endif
2104
2105 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
2106
2107 capstone_cargs = [
2108 # FIXME: There does not seem to be a way to completely replace the c_args
2109 # that come from add_project_arguments() -- we can only add to them.
2110 # So: disable all warnings with a big hammer.
2111 '-Wno-error', '-w',
2112
2113 # Include all configuration defines via a header file, which will wind up
2114 # as a dependency on the object file, and thus changes here will result
2115 # in a rebuild.
2116 '-include', 'capstone-defs.h'
2117 ]
2118
2119 libcapstone = static_library('capstone',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01002120 build_by_default: false,
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002121 sources: capstone_files,
2122 c_args: capstone_cargs,
2123 include_directories: 'capstone/include')
2124 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07002125 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002126endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002127
2128slirp = not_found
2129slirp_opt = 'disabled'
2130if have_system
2131 slirp_opt = get_option('slirp')
2132 if slirp_opt in ['enabled', 'auto', 'system']
2133 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01002134 slirp = dependency('slirp', kwargs: static_kwargs,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002135 method: 'pkg-config',
2136 required: slirp_opt == 'system' or
2137 slirp_opt == 'enabled' and not have_internal)
2138 if slirp.found()
2139 slirp_opt = 'system'
2140 elif have_internal
2141 slirp_opt = 'internal'
2142 else
2143 slirp_opt = 'disabled'
2144 endif
2145 endif
2146 if slirp_opt == 'internal'
2147 slirp_deps = []
2148 if targetos == 'windows'
2149 slirp_deps = cc.find_library('iphlpapi')
Marc-André Lureau43f547b2021-05-18 19:51:11 +04002150 elif targetos == 'darwin'
2151 slirp_deps = cc.find_library('resolv')
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002152 endif
2153 slirp_conf = configuration_data()
2154 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
2155 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
2156 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
2157 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
2158 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
2159 slirp_files = [
2160 'slirp/src/arp_table.c',
2161 'slirp/src/bootp.c',
2162 'slirp/src/cksum.c',
2163 'slirp/src/dhcpv6.c',
2164 'slirp/src/dnssearch.c',
2165 'slirp/src/if.c',
2166 'slirp/src/ip6_icmp.c',
2167 'slirp/src/ip6_input.c',
2168 'slirp/src/ip6_output.c',
2169 'slirp/src/ip_icmp.c',
2170 'slirp/src/ip_input.c',
2171 'slirp/src/ip_output.c',
2172 'slirp/src/mbuf.c',
2173 'slirp/src/misc.c',
2174 'slirp/src/ncsi.c',
2175 'slirp/src/ndp_table.c',
2176 'slirp/src/sbuf.c',
2177 'slirp/src/slirp.c',
2178 'slirp/src/socket.c',
2179 'slirp/src/state.c',
2180 'slirp/src/stream.c',
2181 'slirp/src/tcp_input.c',
2182 'slirp/src/tcp_output.c',
2183 'slirp/src/tcp_subr.c',
2184 'slirp/src/tcp_timer.c',
2185 'slirp/src/tftp.c',
2186 'slirp/src/udp.c',
2187 'slirp/src/udp6.c',
2188 'slirp/src/util.c',
2189 'slirp/src/version.c',
2190 'slirp/src/vmstate.c',
2191 ]
2192
2193 configure_file(
2194 input : 'slirp/src/libslirp-version.h.in',
2195 output : 'libslirp-version.h',
2196 configuration: slirp_conf)
2197
2198 slirp_inc = include_directories('slirp', 'slirp/src')
2199 libslirp = static_library('slirp',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01002200 build_by_default: false,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002201 sources: slirp_files,
2202 c_args: slirp_cargs,
2203 include_directories: slirp_inc)
2204 slirp = declare_dependency(link_with: libslirp,
2205 dependencies: slirp_deps,
2206 include_directories: slirp_inc)
2207 endif
2208endif
2209
Daniele Buonoc7153432021-03-03 21:59:38 -05002210# For CFI, we need to compile slirp as a static library together with qemu.
2211# This is because we register slirp functions as callbacks for QEMU Timers.
2212# When using a system-wide shared libslirp, the type information for the
2213# callback is missing and the timer call produces a false positive with CFI.
2214#
2215# Now that slirp_opt has been defined, check if the selected slirp is compatible
2216# with control-flow integrity.
2217if get_option('cfi') and slirp_opt == 'system'
2218 error('Control-Flow Integrity is not compatible with system-wide slirp.' \
2219 + ' Please configure with --enable-slirp=git')
2220endif
2221
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002222fdt = not_found
2223fdt_opt = get_option('fdt')
2224if have_system
2225 if fdt_opt in ['enabled', 'auto', 'system']
2226 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01002227 fdt = cc.find_library('fdt', kwargs: static_kwargs,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002228 required: fdt_opt == 'system' or
2229 fdt_opt == 'enabled' and not have_internal)
2230 if fdt.found() and cc.links('''
2231 #include <libfdt.h>
2232 #include <libfdt_env.h>
2233 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
2234 dependencies: fdt)
2235 fdt_opt = 'system'
Thomas Huth6c228532021-08-27 14:09:00 +02002236 elif fdt_opt == 'system'
2237 error('system libfdt requested, but it is too old (1.5.1 or newer required)')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002238 elif have_internal
2239 fdt_opt = 'internal'
2240 else
2241 fdt_opt = 'disabled'
Thomas Huth87daf892021-08-27 14:08:59 +02002242 fdt = not_found
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002243 endif
2244 endif
2245 if fdt_opt == 'internal'
2246 fdt_files = files(
2247 'dtc/libfdt/fdt.c',
2248 'dtc/libfdt/fdt_ro.c',
2249 'dtc/libfdt/fdt_wip.c',
2250 'dtc/libfdt/fdt_sw.c',
2251 'dtc/libfdt/fdt_rw.c',
2252 'dtc/libfdt/fdt_strerror.c',
2253 'dtc/libfdt/fdt_empty_tree.c',
2254 'dtc/libfdt/fdt_addresses.c',
2255 'dtc/libfdt/fdt_overlay.c',
2256 'dtc/libfdt/fdt_check.c',
2257 )
2258
2259 fdt_inc = include_directories('dtc/libfdt')
2260 libfdt = static_library('fdt',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01002261 build_by_default: false,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002262 sources: fdt_files,
2263 include_directories: fdt_inc)
2264 fdt = declare_dependency(link_with: libfdt,
2265 include_directories: fdt_inc)
2266 endif
2267endif
2268if not fdt.found() and fdt_required.length() > 0
2269 error('fdt not available but required by targets ' + ', '.join(fdt_required))
2270endif
2271
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002272config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002273config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002274config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002275
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002276#####################
2277# Generated sources #
2278#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002279
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002280genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002281
Marc-André Lureau3f885652019-07-15 18:06:04 +04002282hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04002283shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002284qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002285qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
2286 meson.current_source_dir() / 'scripts/qapi/commands.py',
2287 meson.current_source_dir() / 'scripts/qapi/common.py',
2288 meson.current_source_dir() / 'scripts/qapi/error.py',
2289 meson.current_source_dir() / 'scripts/qapi/events.py',
2290 meson.current_source_dir() / 'scripts/qapi/expr.py',
2291 meson.current_source_dir() / 'scripts/qapi/gen.py',
2292 meson.current_source_dir() / 'scripts/qapi/introspect.py',
2293 meson.current_source_dir() / 'scripts/qapi/parser.py',
2294 meson.current_source_dir() / 'scripts/qapi/schema.py',
2295 meson.current_source_dir() / 'scripts/qapi/source.py',
2296 meson.current_source_dir() / 'scripts/qapi/types.py',
2297 meson.current_source_dir() / 'scripts/qapi/visit.py',
2298 meson.current_source_dir() / 'scripts/qapi/common.py',
2299 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002300]
2301
2302tracetool = [
2303 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002304 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002305]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002306tracetool_depends = files(
2307 'scripts/tracetool/backend/log.py',
2308 'scripts/tracetool/backend/__init__.py',
2309 'scripts/tracetool/backend/dtrace.py',
2310 'scripts/tracetool/backend/ftrace.py',
2311 'scripts/tracetool/backend/simple.py',
2312 'scripts/tracetool/backend/syslog.py',
2313 'scripts/tracetool/backend/ust.py',
2314 'scripts/tracetool/format/tcg_h.py',
2315 'scripts/tracetool/format/ust_events_c.py',
2316 'scripts/tracetool/format/ust_events_h.py',
2317 'scripts/tracetool/format/__init__.py',
2318 'scripts/tracetool/format/d.py',
2319 'scripts/tracetool/format/tcg_helper_c.py',
2320 'scripts/tracetool/format/simpletrace_stap.py',
2321 'scripts/tracetool/format/c.py',
2322 'scripts/tracetool/format/h.py',
2323 'scripts/tracetool/format/tcg_helper_h.py',
2324 'scripts/tracetool/format/log_stap.py',
2325 'scripts/tracetool/format/stap.py',
2326 'scripts/tracetool/format/tcg_helper_wrapper_h.py',
2327 'scripts/tracetool/__init__.py',
2328 'scripts/tracetool/transform.py',
2329 'scripts/tracetool/vcpu.py'
2330)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002331
Marc-André Lureau2c273f32019-07-15 17:10:19 +04002332qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
2333 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02002334 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04002335qemu_version = custom_target('qemu-version.h',
2336 output: 'qemu-version.h',
2337 command: qemu_version_cmd,
2338 capture: true,
2339 build_by_default: true,
2340 build_always_stale: true)
2341genh += qemu_version
2342
Marc-André Lureau3f885652019-07-15 18:06:04 +04002343hxdep = []
2344hx_headers = [
2345 ['qemu-options.hx', 'qemu-options.def'],
2346 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
2347]
2348if have_system
2349 hx_headers += [
2350 ['hmp-commands.hx', 'hmp-commands.h'],
2351 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
2352 ]
2353endif
2354foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002355 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04002356 input: files(d[0]),
2357 output: d[1],
2358 capture: true,
2359 build_by_default: true, # to be removed when added to a target
2360 command: [hxtool, '-h', '@INPUT0@'])
2361endforeach
2362genh += hxdep
2363
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002364###################
2365# Collect sources #
2366###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002367
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02002368authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002369blockdev_ss = ss.source_set()
2370block_ss = ss.source_set()
2371bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002372chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002373common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002374crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02002375hwcore_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002376io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002377linux_user_ss = ss.source_set()
2378qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02002379qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002380softmmu_ss = ss.source_set()
2381specific_fuzz_ss = ss.source_set()
2382specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002383stub_ss = ss.source_set()
2384trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002385user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002386util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002387
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002388# accel modules
2389qtest_module_ss = ss.source_set()
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002390tcg_module_ss = ss.source_set()
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002391
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002392modules = {}
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002393target_modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002394hw_arch = {}
2395target_arch = {}
2396target_softmmu_arch = {}
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02002397target_user_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002398
2399###############
2400# Trace files #
2401###############
2402
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002403# TODO: add each directory to the subdirs from its own meson.build, once
2404# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002405trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002406 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01002407 'qapi',
2408 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002409 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01002410 'util',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002411]
2412if have_user
2413 trace_events_subdirs += [ 'linux-user' ]
2414endif
2415if have_block
2416 trace_events_subdirs += [
2417 'authz',
2418 'block',
2419 'io',
2420 'nbd',
2421 'scsi',
2422 ]
2423endif
2424if have_system
2425 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002426 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002427 'audio',
2428 'backends',
2429 'backends/tpm',
2430 'chardev',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002431 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002432 'hw/9pfs',
2433 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08002434 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002435 'hw/alpha',
2436 'hw/arm',
2437 'hw/audio',
2438 'hw/block',
2439 'hw/block/dataplane',
2440 'hw/char',
2441 'hw/display',
2442 'hw/dma',
2443 'hw/hppa',
2444 'hw/hyperv',
2445 'hw/i2c',
2446 'hw/i386',
2447 'hw/i386/xen',
2448 'hw/ide',
2449 'hw/input',
2450 'hw/intc',
2451 'hw/isa',
2452 'hw/mem',
2453 'hw/mips',
2454 'hw/misc',
2455 'hw/misc/macio',
2456 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08002457 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01002458 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02002459 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002460 'hw/nvram',
2461 'hw/pci',
2462 'hw/pci-host',
2463 'hw/ppc',
2464 'hw/rdma',
2465 'hw/rdma/vmw',
2466 'hw/rtc',
2467 'hw/s390x',
2468 'hw/scsi',
2469 'hw/sd',
BALATON Zoltanad52cfc2021-10-29 23:02:09 +02002470 'hw/sh4',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002471 'hw/sparc',
2472 'hw/sparc64',
2473 'hw/ssi',
2474 'hw/timer',
2475 'hw/tpm',
2476 'hw/usb',
2477 'hw/vfio',
2478 'hw/virtio',
2479 'hw/watchdog',
2480 'hw/xen',
2481 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002482 'migration',
2483 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02002484 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002485 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05002486 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002487 ]
2488endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002489if have_system or have_user
2490 trace_events_subdirs += [
2491 'accel/tcg',
2492 'hw/core',
2493 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02002494 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002495 'target/hppa',
2496 'target/i386',
2497 'target/i386/kvm',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02002498 'target/mips/tcg',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002499 'target/ppc',
2500 'target/riscv',
2501 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08002502 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002503 'target/sparc',
2504 ]
2505endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002506
Marc-André Lureau0df750e2020-11-25 14:06:37 +04002507vhost_user = not_found
2508if 'CONFIG_VHOST_USER' in config_host
2509 libvhost_user = subproject('libvhost-user')
2510 vhost_user = libvhost_user.get_variable('vhost_user_dep')
2511endif
2512
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002513subdir('qapi')
2514subdir('qobject')
2515subdir('stubs')
2516subdir('trace')
2517subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04002518subdir('qom')
2519subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002520subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04002521subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002522
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002523
2524if enable_modules
2525 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
2526 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
2527endif
2528
Paolo Bonzini2becc362020-02-03 11:42:03 +01002529stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002530
2531util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01002532util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002533libqemuutil = static_library('qemuutil',
2534 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +02002535 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002536qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04002537 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002538
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01002539if have_system or have_user
2540 decodetree = generator(find_program('scripts/decodetree.py'),
2541 output: 'decode-@BASENAME@.c.inc',
2542 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
2543 subdir('libdecnumber')
2544 subdir('target')
2545endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002546
Paolo Bonzini478e9432020-08-17 12:47:55 +02002547subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04002548subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04002549subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04002550subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04002551subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04002552
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002553if have_block
2554 block_ss.add(files(
2555 'block.c',
2556 'blockjob.c',
2557 'job.c',
2558 'qemu-io-cmds.c',
2559 ))
2560 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002561
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002562 subdir('nbd')
2563 subdir('scsi')
2564 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002565
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002566 blockdev_ss.add(files(
2567 'blockdev.c',
2568 'blockdev-nbd.c',
2569 'iothread.c',
2570 'job-qmp.c',
2571 ), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02002572
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002573 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
2574 # os-win32.c does not
2575 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
2576 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
2577endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02002578
2579common_ss.add(files('cpus-common.c'))
2580
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02002581subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002582
Richard Hendersonf3433462020-09-12 10:47:33 -07002583common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02002584specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002585
Richard Henderson44b99a62021-03-22 12:24:26 +01002586# Work around a gcc bug/misfeature wherein constant propagation looks
2587# through an alias:
2588# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
2589# to guess that a const variable is always zero. Without lto, this is
2590# impossible, as the alias is restricted to page-vary-common.c. Indeed,
2591# without lto, not even the alias is required -- we simply use different
2592# declarations in different compilation units.
2593pagevary = files('page-vary-common.c')
2594if get_option('b_lto')
2595 pagevary_flags = ['-fno-lto']
2596 if get_option('cfi')
2597 pagevary_flags += '-fno-sanitize=cfi-icall'
2598 endif
2599 pagevary = static_library('page-vary-common', sources: pagevary,
2600 c_args: pagevary_flags)
2601 pagevary = declare_dependency(link_with: pagevary)
2602endif
2603common_ss.add(pagevary)
Richard Henderson6670d4d2021-03-22 12:24:24 +01002604specific_ss.add(files('page-vary.c'))
2605
Marc-André Lureauab318052019-07-24 19:23:16 +04002606subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04002607subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04002608subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002609subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04002610subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04002611subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00002612subdir('semihosting')
Marc-André Lureau582ea952019-08-15 15:15:32 +04002613subdir('hw')
Richard Henderson104cc2c2021-03-08 12:04:33 -08002614subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08002615subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04002616subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002617subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04002618subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04002619subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002620subdir('ebpf')
2621
Marc-André Lureaub309c322019-08-18 19:20:37 +04002622specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
2623
Warner Loshdda2da62021-10-08 16:47:37 -06002624linux_user_ss.add(files('thunk.c'))
Marc-André Lureau3a304462019-08-18 16:13:08 +04002625specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02002626
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002627# needed for fuzzing binaries
2628subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002629subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002630
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002631# accel modules
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002632tcg_real_module_ss = ss.source_set()
2633tcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
2634specific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
2635target_modules += { 'accel' : { 'qtest': qtest_module_ss,
2636 'tcg': tcg_real_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002637
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002638########################
2639# Library dependencies #
2640########################
2641
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002642modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02002643modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002644modinfo_files = []
2645
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002646block_mods = []
2647softmmu_mods = []
2648foreach d, list : modules
2649 foreach m, module_ss : list
2650 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02002651 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002652 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
2653 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
2654 if d == 'block'
2655 block_mods += sl
2656 else
2657 softmmu_mods += sl
2658 endif
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002659 if module_ss.sources() != []
2660 # FIXME: Should use sl.extract_all_objects(recursive: true) as
2661 # input. Sources can be used multiple times but objects are
2662 # unique when it comes to lookup in compile_commands.json.
2663 # Depnds on a mesion version with
2664 # https://github.com/mesonbuild/meson/pull/8900
2665 modinfo_files += custom_target(d + '-' + m + '.modinfo',
2666 output: d + '-' + m + '.modinfo',
Paolo Bonziniac347112021-07-21 18:51:57 +02002667 input: module_ss.sources() + genh,
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002668 capture: true,
Paolo Bonziniac347112021-07-21 18:51:57 +02002669 command: [modinfo_collect, module_ss.sources()])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002670 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002671 else
2672 if d == 'block'
2673 block_ss.add_all(module_ss)
2674 else
2675 softmmu_ss.add_all(module_ss)
2676 endif
2677 endif
2678 endforeach
2679endforeach
2680
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002681foreach d, list : target_modules
2682 foreach m, module_ss : list
2683 if enable_modules and targetos != 'windows'
2684 foreach target : target_dirs
2685 if target.endswith('-softmmu')
2686 config_target = config_target_mak[target]
2687 config_target += config_host
2688 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2689 c_args = ['-DNEED_CPU_H',
2690 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2691 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
2692 target_module_ss = module_ss.apply(config_target, strict: false)
2693 if target_module_ss.sources() != []
2694 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
2695 sl = static_library(module_name,
2696 [genh, target_module_ss.sources()],
2697 dependencies: [modulecommon, target_module_ss.dependencies()],
2698 include_directories: target_inc,
2699 c_args: c_args,
2700 pic: true)
2701 softmmu_mods += sl
2702 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
2703 modinfo_files += custom_target(module_name + '.modinfo',
2704 output: module_name + '.modinfo',
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02002705 input: target_module_ss.sources() + genh,
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002706 capture: true,
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02002707 command: [modinfo_collect, '--target', target, target_module_ss.sources()])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002708 endif
2709 endif
2710 endforeach
2711 else
2712 specific_ss.add_all(module_ss)
2713 endif
2714 endforeach
2715endforeach
2716
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02002717if enable_modules
2718 modinfo_src = custom_target('modinfo.c',
2719 output: 'modinfo.c',
2720 input: modinfo_files,
2721 command: [modinfo_generate, '@INPUT@'],
2722 capture: true)
2723 modinfo_lib = static_library('modinfo', modinfo_src)
2724 modinfo_dep = declare_dependency(link_whole: modinfo_lib)
2725 softmmu_ss.add(modinfo_dep)
2726endif
2727
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002728nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08002729undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002730block_syms = custom_target('block.syms', output: 'block.syms',
2731 input: [libqemuutil, block_mods],
2732 capture: true,
2733 command: [undefsym, nm, '@INPUT@'])
2734qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
2735 input: [libqemuutil, softmmu_mods],
2736 capture: true,
2737 command: [undefsym, nm, '@INPUT@'])
2738
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02002739qom_ss = qom_ss.apply(config_host, strict: false)
2740libqom = static_library('qom', qom_ss.sources() + genh,
2741 dependencies: [qom_ss.dependencies()],
2742 name_suffix: 'fa')
2743
2744qom = declare_dependency(link_whole: libqom)
2745
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02002746authz_ss = authz_ss.apply(config_host, strict: false)
2747libauthz = static_library('authz', authz_ss.sources() + genh,
2748 dependencies: [authz_ss.dependencies()],
2749 name_suffix: 'fa',
2750 build_by_default: false)
2751
2752authz = declare_dependency(link_whole: libauthz,
2753 dependencies: qom)
2754
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002755crypto_ss = crypto_ss.apply(config_host, strict: false)
2756libcrypto = static_library('crypto', crypto_ss.sources() + genh,
2757 dependencies: [crypto_ss.dependencies()],
2758 name_suffix: 'fa',
2759 build_by_default: false)
2760
2761crypto = declare_dependency(link_whole: libcrypto,
2762 dependencies: [authz, qom])
2763
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002764io_ss = io_ss.apply(config_host, strict: false)
2765libio = static_library('io', io_ss.sources() + genh,
2766 dependencies: [io_ss.dependencies()],
2767 link_with: libqemuutil,
2768 name_suffix: 'fa',
2769 build_by_default: false)
2770
2771io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
2772
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02002773libmigration = static_library('migration', sources: migration_files + genh,
2774 name_suffix: 'fa',
2775 build_by_default: false)
2776migration = declare_dependency(link_with: libmigration,
2777 dependencies: [zlib, qom, io])
2778softmmu_ss.add(migration)
2779
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002780block_ss = block_ss.apply(config_host, strict: false)
2781libblock = static_library('block', block_ss.sources() + genh,
2782 dependencies: block_ss.dependencies(),
2783 link_depends: block_syms,
2784 name_suffix: 'fa',
2785 build_by_default: false)
2786
2787block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002788 link_args: '@block.syms',
2789 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002790
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002791blockdev_ss = blockdev_ss.apply(config_host, strict: false)
2792libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
2793 dependencies: blockdev_ss.dependencies(),
2794 name_suffix: 'fa',
2795 build_by_default: false)
2796
2797blockdev = declare_dependency(link_whole: [libblockdev],
2798 dependencies: [block])
2799
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002800qmp_ss = qmp_ss.apply(config_host, strict: false)
2801libqmp = static_library('qmp', qmp_ss.sources() + genh,
2802 dependencies: qmp_ss.dependencies(),
2803 name_suffix: 'fa',
2804 build_by_default: false)
2805
2806qmp = declare_dependency(link_whole: [libqmp])
2807
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002808libchardev = static_library('chardev', chardev_ss.sources() + genh,
2809 name_suffix: 'fa',
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002810 dependencies: [gnutls],
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002811 build_by_default: false)
2812
2813chardev = declare_dependency(link_whole: libchardev)
2814
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02002815hwcore_ss = hwcore_ss.apply(config_host, strict: false)
2816libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02002817 name_suffix: 'fa',
2818 build_by_default: false)
2819hwcore = declare_dependency(link_whole: libhwcore)
2820common_ss.add(hwcore)
2821
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02002822###########
2823# Targets #
2824###########
2825
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002826foreach m : block_mods + softmmu_mods
2827 shared_module(m.name(),
2828 name_prefix: '',
2829 link_whole: m,
2830 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002831 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002832endforeach
2833
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002834softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002835common_ss.add(qom, qemuutil)
2836
2837common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01002838common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
2839
2840common_all = common_ss.apply(config_all, strict: false)
2841common_all = static_library('common',
2842 build_by_default: false,
2843 sources: common_all.sources() + genh,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09002844 implicit_include_directories: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002845 dependencies: common_all.dependencies(),
2846 name_suffix: 'fa')
2847
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002848feature_to_c = find_program('scripts/feature_to_c.sh')
2849
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002850emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002851foreach target : target_dirs
2852 config_target = config_target_mak[target]
2853 target_name = config_target['TARGET_NAME']
2854 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02002855 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002856 arch_deps = []
2857 c_args = ['-DNEED_CPU_H',
2858 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2859 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04002860 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01002861
Paolo Bonzini859aef02020-08-04 18:14:26 +02002862 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01002863 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2864 if targetos == 'linux'
2865 target_inc += include_directories('linux-headers', is_system: true)
2866 endif
2867 if target.endswith('-softmmu')
2868 qemu_target_name = 'qemu-system-' + target_name
2869 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002870 t = target_softmmu_arch[arch].apply(config_target, strict: false)
2871 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002872 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002873
Marc-André Lureau2c442202019-08-17 13:55:58 +04002874 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
2875 hw = hw_arch[hw_dir].apply(config_target, strict: false)
2876 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002877 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04002878
Paolo Bonzini2becc362020-02-03 11:42:03 +01002879 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002880 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002881 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04002882 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002883 target_type='user'
2884 qemu_target_name = 'qemu-' + target_name
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02002885 if arch in target_user_arch
2886 t = target_user_arch[arch].apply(config_target, strict: false)
2887 arch_srcs += t.sources()
2888 arch_deps += t.dependencies()
2889 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002890 if 'CONFIG_LINUX_USER' in config_target
2891 base_dir = 'linux-user'
2892 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
Warner Loshe2a74722021-08-03 17:17:17 -06002893 endif
2894 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01002895 base_dir = 'bsd-user'
Warner Loshe2a74722021-08-03 17:17:17 -06002896 target_inc += include_directories('bsd-user/' / targetos)
2897 dir = base_dir / abi
2898 arch_srcs += files(dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002899 endif
2900 target_inc += include_directories(
2901 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04002902 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002903 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04002904 if 'CONFIG_LINUX_USER' in config_target
2905 dir = base_dir / abi
2906 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
2907 if config_target.has_key('TARGET_SYSTBL_ABI')
2908 arch_srcs += \
2909 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
2910 extra_args : config_target['TARGET_SYSTBL_ABI'])
2911 endif
2912 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002913 endif
2914
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002915 if 'TARGET_XML_FILES' in config_target
2916 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
2917 output: target + '-gdbstub-xml.c',
2918 input: files(config_target['TARGET_XML_FILES'].split()),
2919 command: [feature_to_c, '@INPUT@'],
2920 capture: true)
2921 arch_srcs += gdbstub_xml
2922 endif
2923
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002924 t = target_arch[arch].apply(config_target, strict: false)
2925 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002926 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002927
Paolo Bonzini2becc362020-02-03 11:42:03 +01002928 target_common = common_ss.apply(config_target, strict: false)
2929 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002930 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002931
Paolo Bonzini2becc362020-02-03 11:42:03 +01002932 target_specific = specific_ss.apply(config_target, strict: false)
2933 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002934 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002935
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002936 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02002937 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002938 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002939 objects: objects,
2940 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002941 c_args: c_args,
2942 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002943 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002944
2945 if target.endswith('-softmmu')
2946 execs = [{
2947 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002948 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002949 'sources': files('softmmu/main.c'),
2950 'dependencies': []
2951 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002952 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002953 execs += [{
2954 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002955 'win_subsystem': 'windows',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002956 'sources': files('softmmu/main.c'),
2957 'dependencies': []
2958 }]
2959 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02002960 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002961 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
2962 execs += [{
2963 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002964 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002965 'sources': specific_fuzz.sources(),
2966 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002967 }]
2968 endif
2969 else
2970 execs = [{
2971 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002972 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002973 'sources': [],
2974 'dependencies': []
2975 }]
2976 endif
2977 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01002978 exe_name = exe['name']
John Arbuckle3983a762021-07-05 15:53:28 -04002979 if targetos == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01002980 exe_name += '-unsigned'
2981 endif
2982
2983 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09002984 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002985 c_args: c_args,
2986 dependencies: arch_deps + deps + exe['dependencies'],
2987 objects: lib.extract_all_objects(recursive: true),
2988 link_language: link_language,
2989 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
2990 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002991 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01002992
John Arbuckle3983a762021-07-05 15:53:28 -04002993 if targetos == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09002994 icon = 'pc-bios/qemu.rsrc'
2995 build_input = [emulator, files(icon)]
2996 install_input = [
2997 get_option('bindir') / exe_name,
2998 meson.current_source_dir() / icon
2999 ]
3000 if 'CONFIG_HVF' in config_target
3001 entitlements = 'accel/hvf/entitlements.plist'
3002 build_input += files(entitlements)
3003 install_input += meson.current_source_dir() / entitlements
3004 endif
3005
Alexander Graf8a74ce62021-01-20 23:44:34 +01003006 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003007 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01003008 output: exe['name'],
3009 command: [
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003010 files('scripts/entitlement.sh'),
3011 '@OUTPUT@',
3012 '@INPUT@'
Alexander Graf8a74ce62021-01-20 23:44:34 +01003013 ])
3014 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09003015
3016 meson.add_install_script('scripts/entitlement.sh', '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09003017 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003018 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01003019 else
3020 emulators += {exe['name']: emulator}
3021 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003022
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003023 if stap.found()
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003024 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003025 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
3026 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003027 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
3028 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
3029 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003030 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003031 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003032 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003033 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003034 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003035 command: [
3036 tracetool, '--group=all', '--format=' + stp['fmt'],
3037 '--binary=' + stp['bin'],
3038 '--target-name=' + target_name,
3039 '--target-type=' + target_type,
3040 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01003041 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003042 ],
3043 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003044 endforeach
3045 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003046 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003047endforeach
3048
Paolo Bonzini931049b2020-02-05 09:44:24 +01003049# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003050
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003051if 'CONFIG_PLUGIN' in config_host
3052 install_headers('include/qemu/qemu-plugin.h')
3053endif
3054
Paolo Bonzinif15bff22019-07-18 13:19:02 +02003055if 'CONFIG_GUEST_AGENT' in config_host
3056 subdir('qga')
Paolo Bonzinib846ab72021-01-21 11:49:04 +01003057elif get_option('guest_agent_msi').enabled()
3058 error('Guest agent MSI requested, but the guest agent is not being built')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02003059endif
3060
Laurent Vivier9755c942020-08-24 17:24:30 +02003061# Don't build qemu-keymap if xkbcommon is not explicitly enabled
3062# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02003063if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04003064 # used for the update-keymaps target, so include rules even if !have_tools
3065 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
3066 dependencies: [qemuutil, xkbcommon], install: have_tools)
3067endif
3068
Paolo Bonzini931049b2020-02-05 09:44:24 +01003069if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003070 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
3071 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
3072 qemu_io = executable('qemu-io', files('qemu-io.c'),
3073 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01003074 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06003075 dependencies: [blockdev, qemuutil, gnutls, selinux],
3076 install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003077
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02003078 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003079 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04003080 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003081
Marc-André Lureau157e7b12019-07-15 14:50:58 +04003082 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
3083 dependencies: qemuutil,
3084 install: true)
3085
Paolo Bonzini931049b2020-02-05 09:44:24 +01003086 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02003087 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02003088 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04003089 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02003090 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01003091 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003092
3093 if targetos == 'linux'
3094 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
3095 dependencies: [qemuutil, libcap_ng],
3096 install: true,
3097 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003098
3099 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
3100 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02003101 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003102 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003103 endif
3104
Paolo Bonziniccd250a2021-06-03 12:50:17 +02003105 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04003106 subdir('contrib/ivshmem-client')
3107 subdir('contrib/ivshmem-server')
3108 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01003109endif
3110
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04003111subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01003112subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04003113subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02003114subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08003115subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01003116if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04003117 subdir('po')
3118endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01003119
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003120if host_machine.system() == 'windows'
3121 nsis_cmd = [
3122 find_program('scripts/nsis.py'),
3123 '@OUTPUT@',
3124 get_option('prefix'),
3125 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01003126 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003127 '--',
3128 '-DDISPLAYVERSION=' + meson.project_version(),
3129 ]
3130 if build_docs
3131 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
3132 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01003133 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003134 nsis_cmd += '-DCONFIG_GTK=y'
3135 endif
3136
3137 nsis = custom_target('nsis',
3138 output: 'qemu-setup-' + meson.project_version() + '.exe',
3139 input: files('qemu.nsi'),
3140 build_always_stale: true,
3141 command: nsis_cmd + ['@INPUT@'])
3142 alias_target('installer', nsis)
3143endif
3144
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003145#########################
3146# Configuration summary #
3147#########################
3148
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003149# Directories
Paolo Bonzinif9332752020-02-03 13:28:38 +01003150summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003151summary_info += {'Install prefix': get_option('prefix')}
3152summary_info += {'BIOS directory': qemu_datadir}
3153summary_info += {'firmware path': get_option('qemu_firmwarepath')}
3154summary_info += {'binary directory': get_option('bindir')}
3155summary_info += {'library directory': get_option('libdir')}
3156summary_info += {'module directory': qemu_moddir}
3157summary_info += {'libexec directory': get_option('libexecdir')}
3158summary_info += {'include directory': get_option('includedir')}
3159summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003160if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003161 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04003162 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003163else
3164 summary_info += {'local state directory': 'queried at runtime'}
3165endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04003166summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003167summary_info += {'Build directory': meson.current_build_dir()}
3168summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003169summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003170summary(summary_info, bool_yn: true, section: 'Directories')
3171
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003172# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003173summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003174summary_info += {'git': config_host['GIT']}
3175summary_info += {'make': config_host['MAKE']}
3176summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003177summary_info += {'sphinx-build': sphinx_build}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003178if config_host.has_key('HAVE_GDB_BIN')
3179 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
3180endif
3181summary_info += {'genisoimage': config_host['GENISOIMAGE']}
3182if targetos == 'windows' and config_host.has_key('CONFIG_GUEST_AGENT')
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003183 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003184endif
Joelle van Dyneb8e0c492021-03-15 11:03:41 -07003185if slirp_opt != 'disabled' and 'CONFIG_SLIRP_SMBD' in config_host
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003186 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
3187endif
3188summary(summary_info, bool_yn: true, section: 'Host binaries')
3189
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003190# Configurable features
3191summary_info = {}
3192summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003193summary_info += {'system-mode emulation': have_system}
3194summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003195summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003196summary_info += {'Install blobs': get_option('install_blobs')}
3197summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
3198if config_host.has_key('CONFIG_MODULES')
3199 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
3200endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02003201summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003202if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02003203 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003204endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003205summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
3206if 'simple' in get_option('trace_backends')
3207 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003208endif
3209summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
3210summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
3211summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
3212summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
3213summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
3214summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
3215summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
3216summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
3217summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
3218summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
3219summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
3220summary(summary_info, bool_yn: true, section: 'Configurable features')
3221
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003222# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003223summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003224summary_info += {'host CPU': cpu}
3225summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01003226summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
3227summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003228if link_language == 'cpp'
Alex Bennée63de9352021-05-27 17:03:15 +01003229 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003230else
3231 summary_info += {'C++ compiler': false}
3232endif
3233if targetos == 'darwin'
Alex Bennée63de9352021-05-27 17:03:15 +01003234 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003235endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003236if targetos == 'windows'
3237 if 'WIN_SDK' in config_host
3238 summary_info += {'Windows SDK': config_host['WIN_SDK']}
3239 endif
3240endif
Paolo Bonzini47b30832020-09-23 05:26:17 -04003241summary_info += {'CFLAGS': ' '.join(get_option('c_args')
3242 + ['-O' + get_option('optimization')]
3243 + (get_option('debug') ? ['-g'] : []))}
3244if link_language == 'cpp'
3245 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
3246 + ['-O' + get_option('optimization')]
3247 + (get_option('debug') ? ['-g'] : []))}
3248endif
3249link_args = get_option(link_language + '_link_args')
3250if link_args.length() > 0
3251 summary_info += {'LDFLAGS': ' '.join(link_args)}
3252endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01003253summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
3254summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003255summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05003256summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003257summary_info += {'PIE': get_option('b_pie')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02003258summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003259summary_info += {'malloc trim support': has_malloc_trim}
3260summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003261summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
3262summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
3263summary_info += {'memory allocator': get_option('malloc')}
3264summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
3265summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
3266summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
3267summary_info += {'gcov': get_option('b_coverage')}
3268summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
3269summary_info += {'CFI support': get_option('cfi')}
3270if get_option('cfi')
3271 summary_info += {'CFI debug support': get_option('cfi_debug')}
3272endif
3273summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003274summary_info += {'sparse': sparse}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003275summary_info += {'mingw32 support': targetos == 'windows'}
Alex Bennée49e85652021-02-22 10:14:50 +00003276
3277# snarf the cross-compilation information for tests
3278foreach target: target_dirs
3279 tcg_mak = meson.current_build_dir() / 'tests/tcg' / 'config-' + target + '.mak'
3280 if fs.exists(tcg_mak)
3281 config_cross_tcg = keyval.load(tcg_mak)
3282 target = config_cross_tcg['TARGET_NAME']
3283 compiler = ''
3284 if 'DOCKER_CROSS_CC_GUEST' in config_cross_tcg
3285 summary_info += {target + ' tests': config_cross_tcg['DOCKER_CROSS_CC_GUEST'] +
3286 ' via ' + config_cross_tcg['DOCKER_IMAGE']}
3287 elif 'CROSS_CC_GUEST' in config_cross_tcg
3288 summary_info += {target + ' tests'
3289 : config_cross_tcg['CROSS_CC_GUEST'] }
3290 endif
3291 endif
3292endforeach
3293
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003294summary(summary_info, bool_yn: true, section: 'Compilation')
3295
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003296# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003297summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003298if have_system
3299 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
3300 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
3301 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
3302 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
Reinoud Zandijk74a414a2021-04-02 22:25:32 +02003303 summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003304 summary_info += {'Xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
3305 if config_host.has_key('CONFIG_XEN_BACKEND')
3306 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
3307 endif
3308endif
3309summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
3310if config_all.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01003311 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +01003312 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01003313 else
3314 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
3315 endif
Alex Bennée029aa682021-07-09 15:29:53 +01003316 summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003317 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003318endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003319summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003320if have_system
3321 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01003322 summary_info += {'out of process emulation': multiprocess_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003323endif
3324summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
3325
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003326# Block layer
3327summary_info = {}
3328summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
3329summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
3330if have_block
3331 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
3332 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
Kevin Wolfe5f05f82021-07-09 18:41:41 +02003333 summary_info += {'Use block whitelist in tools': config_host.has_key('CONFIG_BDRV_WHITELIST_TOOLS')}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003334 summary_info += {'VirtFS support': have_virtfs}
3335 summary_info += {'build virtiofs daemon': have_virtiofsd}
3336 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
3337 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
3338 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
3339 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
3340 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
3341 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
3342 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
3343 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
3344 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
3345 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003346 summary_info += {'FUSE exports': fuse}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003347endif
3348summary(summary_info, bool_yn: true, section: 'Block layer support')
3349
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003350# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003351summary_info = {}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003352summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003353summary_info += {'GNUTLS support': gnutls}
3354if gnutls.found()
3355 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
3356endif
3357summary_info += {'libgcrypt': gcrypt}
3358summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02003359if nettle.found()
3360 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003361endif
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003362summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
3363summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
3364summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
3365summary(summary_info, bool_yn: true, section: 'Crypto')
3366
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01003367# Libraries
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003368summary_info = {}
3369if targetos == 'darwin'
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003370 summary_info += {'Cocoa support': cocoa}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003371endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003372summary_info += {'SDL support': sdl}
3373summary_info += {'SDL image support': sdl_image}
3374summary_info += {'GTK support': gtk}
3375summary_info += {'pixman': pixman}
3376summary_info += {'VTE support': vte}
3377summary_info += {'slirp support': slirp_opt == 'internal' ? slirp_opt : slirp}
3378summary_info += {'libtasn1': tasn1}
3379summary_info += {'PAM': pam}
3380summary_info += {'iconv support': iconv}
3381summary_info += {'curses support': curses}
3382summary_info += {'virgl support': virgl}
3383summary_info += {'curl support': curl}
3384summary_info += {'Multipath support': mpathpersist}
3385summary_info += {'VNC support': vnc}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01003386if vnc.found()
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003387 summary_info += {'VNC SASL support': sasl}
3388 summary_info += {'VNC JPEG support': jpeg}
3389 summary_info += {'VNC PNG support': png}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003390endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02003391if targetos not in ['darwin', 'haiku', 'windows']
3392 summary_info += {'OSS support': oss}
3393elif targetos == 'darwin'
3394 summary_info += {'CoreAudio support': coreaudio}
3395elif targetos == 'windows'
3396 summary_info += {'DirectSound support': dsound}
3397endif
3398if targetos == 'linux'
3399 summary_info += {'ALSA support': alsa}
3400 summary_info += {'PulseAudio support': pulse}
3401endif
3402summary_info += {'JACK support': jack}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003403summary_info += {'brlapi support': brlapi}
Paolo Bonzinie1723992021-10-07 15:08:21 +02003404summary_info += {'vde support': vde}
Paolo Bonzini837b84b2021-10-07 15:08:22 +02003405summary_info += {'netmap support': have_netmap}
Thomas Hutheea94532021-10-28 20:59:08 +02003406summary_info += {'l2tpv3 support': have_l2tpv3}
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02003407summary_info += {'Linux AIO support': libaio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003408summary_info += {'Linux io_uring support': linux_io_uring}
3409summary_info += {'ATTR/XATTR support': libattr}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003410summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
3411summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003412summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003413summary_info += {'libcap-ng support': libcap_ng}
3414summary_info += {'bpf support': libbpf}
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02003415summary_info += {'spice protocol support': spice_protocol}
3416if spice_protocol.found()
3417 summary_info += {' spice server support': spice}
3418endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003419summary_info += {'rbd support': rbd}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003420summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003421summary_info += {'smartcard support': cacard}
3422summary_info += {'U2F support': u2f}
3423summary_info += {'libusb': libusb}
3424summary_info += {'usb net redir': usbredir}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003425summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003426summary_info += {'GBM': gbm}
3427summary_info += {'libiscsi support': libiscsi}
3428summary_info += {'libnfs support': libnfs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003429if targetos == 'windows'
Paolo Bonzinib846ab72021-01-21 11:49:04 +01003430 if config_host.has_key('CONFIG_GUEST_AGENT')
3431 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
3432 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01003433 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01003434endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003435summary_info += {'seccomp support': seccomp}
3436summary_info += {'GlusterFS support': glusterfs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003437summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
Thomas Huthe6a52b32021-12-09 15:48:01 +01003438summary_info += {'libssh support': libssh}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003439summary_info += {'lzo support': lzo}
3440summary_info += {'snappy support': snappy}
3441summary_info += {'bzip2 support': libbzip2}
3442summary_info += {'lzfse support': liblzfse}
3443summary_info += {'zstd support': zstd}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003444summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003445summary_info += {'libxml2': libxml2}
3446summary_info += {'capstone': capstone_opt == 'internal' ? capstone_opt : capstone}
3447summary_info += {'libpmem support': libpmem}
3448summary_info += {'libdaxctl support': libdaxctl}
3449summary_info += {'libudev': libudev}
3450# Dummy dependency, keep .found()
Max Reitzdf4ea702020-10-27 20:05:46 +01003451summary_info += {'FUSE lseek': fuse_lseek.found()}
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06003452summary_info += {'selinux': selinux}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01003453summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01003454
3455if not supported_cpus.contains(cpu)
3456 message()
3457 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
3458 message()
3459 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
3460 message('The QEMU project intends to remove support for this host CPU in')
3461 message('a future release if nobody volunteers to maintain it and to')
3462 message('provide a build host for our continuous integration setup.')
3463 message('configure has succeeded and you can continue to build, but')
3464 message('if you care about QEMU on this platform you should contact')
3465 message('us upstream at qemu-devel@nongnu.org.')
3466endif
3467
3468if not supported_oses.contains(targetos)
3469 message()
3470 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
3471 message()
3472 message('Host OS ' + targetos + 'support is not currently maintained.')
3473 message('The QEMU project intends to remove support for this host OS in')
3474 message('a future release if nobody volunteers to maintain it and to')
3475 message('provide a build host for our continuous integration setup.')
3476 message('configure has succeeded and you can continue to build, but')
3477 message('if you care about QEMU on this platform you should contact')
3478 message('us upstream at qemu-devel@nongnu.org.')
3479endif