blob: 5f4335507185f78a4d549745e8fe51f4405e6728 [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',
Paolo Bonzini3d2f73e2021-02-11 06:15:12 -05003 'b_staticpic=false', 'stdsplit=false'],
Paolo Bonzini654d6b02021-02-09 14:59:26 +01004 version: files('VERSION'))
Paolo Bonzinia5665052019-06-10 12:05:14 +02005
Paolo Bonzini98487b92021-10-06 11:27:47 +02006add_test_setup('quick', exclude_suites: ['block', 'slow', 'thorough'], is_default: true)
7add_test_setup('slow', exclude_suites: ['block', 'thorough'], env: ['G_TEST_SLOW=1', 'SPEED=slow'])
8add_test_setup('thorough', exclude_suites: ['block'], env: ['G_TEST_SLOW=1', 'SPEED=thorough'])
Paolo Bonzini3d2f73e2021-02-11 06:15:12 -05009
Paolo Bonzinia5665052019-06-10 12:05:14 +020010not_found = dependency('', required: false)
Paolo Bonzini654d6b02021-02-09 14:59:26 +010011keyval = import('keyval')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040012ss = import('sourceset')
Richard Henderson8b18cdb2020-09-13 12:19:25 -070013fs = import('fs')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040014
Paolo Bonzinice1c1e72020-01-28 16:41:44 +010015sh = find_program('sh')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040016cc = meson.get_compiler('c')
Paolo Bonzinia5665052019-06-10 12:05:14 +020017config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Marc-André Lureau3154fee2019-08-29 22:07:01 +040018enable_modules = 'CONFIG_MODULES' in config_host
Paolo Bonzini35be72b2020-02-06 14:17:15 +010019enable_static = 'CONFIG_STATIC' in config_host
Yonggang Luoe3667662020-10-16 06:06:25 +080020
Paolo Bonzinid7dedf42021-01-26 11:15:33 +010021# Allow both shared and static libraries unless --enable-static
22static_kwargs = enable_static ? {'static': true} : {}
23
Yonggang Luoe3667662020-10-16 06:06:25 +080024# Temporary directory used for files created while
25# configure runs. Since it is in the build directory
26# we can safely blow away any previous version of it
27# (and we need not jump through hoops to try to delete
28# it when configure exits.)
29tmpdir = meson.current_build_dir() / 'meson-private/temp'
Marc-André Lureau8fe11232020-09-11 14:42:48 +020030
31if get_option('qemu_suffix').startswith('/')
32 error('qemu_suffix cannot start with a /')
33endif
34
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040035qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
Marc-André Lureauab4c0992020-08-26 15:04:16 +040036qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040037qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040038qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
39
40qemu_desktopdir = get_option('datadir') / 'applications'
41qemu_icondir = get_option('datadir') / 'icons'
42
Paolo Bonzini859aef02020-08-04 18:14:26 +020043config_host_data = configuration_data()
44genh = []
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +010045qapi_trace_events = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020046
Paolo Bonzini760e4322020-08-26 08:09:48 +020047target_dirs = config_host['TARGET_DIRS'].split()
Warner Loshdda2da62021-10-08 16:47:37 -060048have_linux_user = false
49have_bsd_user = false
Paolo Bonzini760e4322020-08-26 08:09:48 +020050have_system = false
51foreach target : target_dirs
Warner Loshdda2da62021-10-08 16:47:37 -060052 have_linux_user = have_linux_user or target.endswith('linux-user')
53 have_bsd_user = have_bsd_user or target.endswith('bsd-user')
Paolo Bonzini760e4322020-08-26 08:09:48 +020054 have_system = have_system or target.endswith('-softmmu')
55endforeach
Warner Loshdda2da62021-10-08 16:47:37 -060056have_user = have_linux_user or have_bsd_user
Paolo Bonzini760e4322020-08-26 08:09:48 +020057have_tools = 'CONFIG_TOOLS' in config_host
58have_block = have_system or have_tools
59
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040060python = import('python').find_installation()
61
62supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Richard Hendersonba0e7332021-09-17 11:08:09 -070063supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv', 'x86', 'x86_64',
WANG Xueruidfcf9002021-12-21 13:41:04 +080064 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc', 'sparc64']
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040065
66cpu = host_machine.cpu_family()
Richard Hendersonc94c2392021-11-16 10:50:42 +010067
68# Unify riscv* to a single family.
69if cpu in ['riscv32', 'riscv64']
70 cpu = 'riscv'
71endif
72
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040073targetos = host_machine.system()
74
Paolo Bonzini823eb012021-11-08 14:18:17 +010075if cpu not in supported_cpus
76 host_arch = 'unknown'
77elif cpu == 'x86'
78 host_arch = 'i386'
Richard Henderson0e3ed772021-12-31 05:25:11 +000079elif cpu == 'mips64'
80 host_arch = 'mips'
Paolo Bonzini823eb012021-11-08 14:18:17 +010081else
82 host_arch = cpu
83endif
84
Paolo Bonzini8a199802020-09-18 05:37:01 -040085if cpu in ['x86', 'x86_64']
86 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
87elif cpu == 'aarch64'
88 kvm_targets = ['aarch64-softmmu']
89elif cpu == 's390x'
90 kvm_targets = ['s390x-softmmu']
91elif cpu in ['ppc', 'ppc64']
92 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Huacai Chenfbc58842020-10-07 16:39:28 +080093elif cpu in ['mips', 'mips64']
94 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Yifei Jiangfbf43c72022-01-12 16:13:29 +080095elif cpu in ['riscv']
96 kvm_targets = ['riscv32-softmmu', 'riscv64-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -040097else
98 kvm_targets = []
99endif
100
Igor Mammedov44d3d892021-10-27 11:10:12 -0400101kvm_targets_c = '""'
Igor Mammedove741aff2021-09-02 07:35:38 -0400102if not get_option('kvm').disabled() and targetos == 'linux'
103 kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"'
104endif
105config_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c)
106
Paolo Bonzini8a199802020-09-18 05:37:01 -0400107accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alexander Graf844a06b2021-09-16 17:54:02 +0200108
109if cpu in ['aarch64']
110 accelerator_targets += {
111 'CONFIG_HVF': ['aarch64-softmmu']
112 }
113endif
114
Alex Bennée0c3e41d2020-11-10 19:23:09 +0000115if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
Marc-André Lureau2a2d51b2021-09-14 16:30:45 +0400116 # i386 emulator provides xenpv machine type for multiple architectures
Alex Bennée0c3e41d2020-11-10 19:23:09 +0000117 accelerator_targets += {
118 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
119 }
120endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400121if cpu in ['x86', 'x86_64']
122 accelerator_targets += {
123 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400124 'CONFIG_HVF': ['x86_64-softmmu'],
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200125 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -0400126 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
127 }
128endif
129
Paolo Bonzinia1b176f2021-07-12 14:22:08 +0200130modular_tcg = []
131# Darwin does not support references to thread-local variables in modules
132if targetos != 'darwin'
133 modular_tcg = ['i386-softmmu', 'x86_64-softmmu']
134endif
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +0200135
Philippe Mathieu-Daudéeae9a1d2021-01-14 18:45:08 +0100136edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
Paolo Bonzinie49c0ef2021-09-23 06:55:28 -0400137unpack_edk2_blobs = false
138foreach target : edk2_targets
139 if target in target_dirs
140 bzip2 = find_program('bzip2', required: get_option('install_blobs'))
141 unpack_edk2_blobs = bzip2.found()
142 break
143 endif
144endforeach
Philippe Mathieu-Daudé45b545d2021-01-14 18:45:09 +0100145
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200146dtrace = not_found
147stap = not_found
148if 'dtrace' in get_option('trace_backends')
149 dtrace = find_program('dtrace', required: true)
150 stap = find_program('stap', required: false)
151 if stap.found()
152 # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol
153 # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility
154 # instead. QEMU --enable-modules depends on this because the SystemTap
155 # semaphores are linked into the main binary and not the module's shared
156 # object.
157 add_global_arguments('-DSTAP_SDT_V2',
158 native: false, language: ['c', 'cpp', 'objc'])
159 endif
160endif
161
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400162##################
163# Compiler flags #
164##################
165
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400166# Specify linker-script with add_project_link_arguments so that it is not placed
167# within a linker --start-group/--end-group pair
Paolo Bonzini537b7242021-10-07 15:08:12 +0200168if get_option('fuzzing')
169 add_project_link_arguments(['-Wl,-T,',
170 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
171 native: false, language: ['c', 'cpp', 'objc'])
172
173 # Specify a filter to only instrument code that is directly related to
174 # virtual-devices.
175 configure_file(output: 'instrumentation-filter',
176 input: 'scripts/oss-fuzz/instrumentation-filter-template',
177 copy: true)
178 add_global_arguments(
179 cc.get_supported_arguments('-fsanitize-coverage-allowlist=instrumentation-filter'),
180 native: false, language: ['c', 'cpp', 'objc'])
181
182 if get_option('fuzzing_engine') == ''
183 # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
184 # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link
185 # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be
186 # unable to bind the fuzzer-related callbacks added by instrumentation.
187 add_global_arguments('-fsanitize=fuzzer-no-link',
188 native: false, language: ['c', 'cpp', 'objc'])
189 add_global_link_arguments('-fsanitize=fuzzer-no-link',
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400190 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzini537b7242021-10-07 15:08:12 +0200191 # For the actual fuzzer binaries, we need to link against the libfuzzer
192 # library. They need to be configurable, to support OSS-Fuzz
193 fuzz_exe_ldflags = ['-fsanitize=fuzzer']
194 else
195 # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and
196 # the needed CFLAGS have already been provided
197 fuzz_exe_ldflags = get_option('fuzzing_engine').split()
198 endif
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400199endif
200
Marc-André Lureau5fc06172021-01-14 16:56:02 +0400201add_global_arguments(config_host['QEMU_CFLAGS'].split(),
202 native: false, language: ['c', 'objc'])
203add_global_arguments(config_host['QEMU_CXXFLAGS'].split(),
204 native: false, language: 'cpp')
205add_global_link_arguments(config_host['QEMU_LDFLAGS'].split(),
206 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzinia5665052019-06-10 12:05:14 +0200207
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400208if targetos == 'linux'
209 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
210 '-isystem', 'linux-headers',
211 language: ['c', 'cpp'])
212endif
213
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100214add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400215 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400216 '-iquote', meson.current_source_dir() / 'include',
217 '-iquote', meson.current_source_dir() / 'disas/libvixl',
218 language: ['c', 'cpp', 'objc'])
Alexander Bulekovc46f76d2020-09-02 13:36:50 -0400219
Marc-André Lureaufc929892019-07-13 01:47:54 +0400220link_language = meson.get_external_property('link_language', 'cpp')
221if link_language == 'cpp'
222 add_languages('cpp', required: true, native: false)
Paolo Bonzini565174d2021-11-04 14:35:14 +0100223 cxx = meson.get_compiler('cpp')
224 linker = cxx
225else
226 linker = cc
Marc-André Lureaufc929892019-07-13 01:47:54 +0400227endif
Paolo Bonzinia5665052019-06-10 12:05:14 +0200228if host_machine.system() == 'darwin'
229 add_languages('objc', required: false, native: false)
230endif
231
Paolo Bonzinideb62372020-09-01 07:51:16 -0400232sparse = find_program('cgcc', required: get_option('sparse'))
233if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100234 run_target('sparse',
235 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400236 'compile_commands.json', sparse.full_path(), '-Wbitwise',
237 '-Wno-transparent-union', '-Wno-old-initializer',
238 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100239endif
240
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200241###########################################
242# Target-specific checks and dependencies #
243###########################################
244
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100245# Fuzzing
Paolo Bonzini537b7242021-10-07 15:08:12 +0200246if get_option('fuzzing') and get_option('fuzzing_engine') == '' and \
247 not cc.links('''
248 #include <stdint.h>
249 #include <sys/types.h>
250 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size);
251 int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; }
252 ''',
253 args: ['-Werror', '-fsanitize=fuzzer'])
254 error('Your compiler does not support -fsanitize=fuzzer')
255endif
256
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100257# Tracing backends
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200258if 'ftrace' in get_option('trace_backends') and targetos != 'linux'
259 error('ftrace is supported only on Linux')
260endif
261if 'syslog' in get_option('trace_backends') and not cc.compiles('''
262 #include <syslog.h>
263 int main(void) {
264 openlog("qemu", LOG_PID, LOG_DAEMON);
265 syslog(LOG_INFO, "configure");
266 return 0;
267 }''')
268 error('syslog is not supported on this system')
269endif
270
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100271# Miscellaneous Linux-only features
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200272if targetos != 'linux' and get_option('mpath').enabled()
273 error('Multipath is supported only on Linux')
274endif
275
Paolo Bonzini106ad1f2021-02-17 16:24:25 +0100276if targetos != 'linux' and get_option('multiprocess').enabled()
277 error('Multiprocess QEMU is supported only on Linux')
278endif
279multiprocess_allowed = targetos == 'linux' and not get_option('multiprocess').disabled()
280
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100281# Target-specific libraries and flags
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200282libm = cc.find_library('m', required: false)
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +0200283threads = dependency('threads')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400284util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200285winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400286socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400287version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400288coref = []
289iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400290emulator_link_args = []
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200291nvmm =not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400292hvf = not_found
Paolo Bonzinia6305082021-10-07 15:08:15 +0200293host_dsosuf = '.so'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400294if targetos == 'windows'
295 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200296 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400297
298 win = import('windows')
299 version_res = win.compile_resources('version.rc',
300 depend_files: files('pc-bios/qemu-nsis.ico'),
301 include_directories: include_directories('.'))
Paolo Bonzinia6305082021-10-07 15:08:15 +0200302 host_dsosuf = '.dll'
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400303elif targetos == 'darwin'
304 coref = dependency('appleframeworks', modules: 'CoreFoundation')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700305 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
Paolo Bonzinia6305082021-10-07 15:08:15 +0200306 host_dsosuf = '.dylib'
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200307elif targetos == 'sunos'
308 socket = [cc.find_library('socket'),
309 cc.find_library('nsl'),
310 cc.find_library('resolv')]
311elif targetos == 'haiku'
312 socket = [cc.find_library('posix_error_mapper'),
313 cc.find_library('network'),
314 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400315elif targetos == 'openbsd'
316 if not get_option('tcg').disabled() and target_dirs.length() > 0
317 # Disable OpenBSD W^X if available
318 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
319 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400320endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200321
Paolo Bonzinib7a75c82021-11-08 12:59:16 +0100322# Target-specific configuration of accelerators
Paolo Bonzini8a199802020-09-18 05:37:01 -0400323accelerators = []
324if not get_option('kvm').disabled() and targetos == 'linux'
325 accelerators += 'CONFIG_KVM'
326endif
327if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
328 accelerators += 'CONFIG_XEN'
329 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
330else
331 have_xen_pci_passthrough = false
332endif
333if not get_option('whpx').disabled() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000334 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400335 error('WHPX requires 64-bit host')
336 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
337 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
338 accelerators += 'CONFIG_WHPX'
339 endif
340endif
341if not get_option('hvf').disabled()
342 hvf = dependency('appleframeworks', modules: 'Hypervisor',
343 required: get_option('hvf'))
344 if hvf.found()
345 accelerators += 'CONFIG_HVF'
346 endif
347endif
348if not get_option('hax').disabled()
349 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
350 accelerators += 'CONFIG_HAX'
351 endif
352endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200353if targetos == 'netbsd'
nia0cc49652021-10-13 13:54:17 +0000354 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200355 if nvmm.found()
356 accelerators += 'CONFIG_NVMM'
357 endif
358endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100359
Paolo Bonzini823eb012021-11-08 14:18:17 +0100360tcg_arch = host_arch
Paolo Bonzini8a199802020-09-18 05:37:01 -0400361if not get_option('tcg').disabled()
Paolo Bonzini823eb012021-11-08 14:18:17 +0100362 if host_arch == 'unknown'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100363 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +0100364 warning('Unsupported CPU @0@, will use TCG with TCI (slow)'.format(cpu))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400365 else
366 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
367 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100368 elif get_option('tcg_interpreter')
Philippe Mathieu-Daudé1c282da2021-05-21 12:34:23 +0200369 warning('Use of the TCG interpreter is not recommended on this host')
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100370 warning('architecture. There is a native TCG execution backend available')
371 warning('which provides substantially better performance and reliability.')
372 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
373 warning('configuration option on this architecture to use the native')
374 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400375 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100376 if get_option('tcg_interpreter')
377 tcg_arch = 'tci'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100378 elif host_arch == 'sparc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100379 tcg_arch = 'sparc'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100380 elif host_arch == 'x86_64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100381 tcg_arch = 'i386'
Paolo Bonzini823eb012021-11-08 14:18:17 +0100382 elif host_arch == 'ppc64'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100383 tcg_arch = 'ppc'
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100384 endif
385 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100386 language: ['c', 'cpp', 'objc'])
387
Paolo Bonzini8a199802020-09-18 05:37:01 -0400388 accelerators += 'CONFIG_TCG'
389 config_host += { 'CONFIG_TCG': 'y' }
390endif
391
392if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
393 error('KVM not available on this platform')
394endif
395if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
396 error('HVF not available on this platform')
397endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200398if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
399 error('NVMM not available on this platform')
400endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400401if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
402 error('WHPX not available on this platform')
403endif
404if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
405 if 'CONFIG_XEN' in accelerators
406 error('Xen PCI passthrough not available on this platform')
407 else
408 error('Xen PCI passthrough requested but Xen not enabled')
409 endif
410endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400411
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200412################
413# Dependencies #
414################
415
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400416# The path to glib.h is added to all compilation commands. This was
417# grandfathered in from the QEMU Makefiles.
418add_project_arguments(config_host['GLIB_CFLAGS'].split(),
419 native: false, language: ['c', 'cpp', 'objc'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400420glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
Marc-André Lureaud83acfd2021-10-09 17:37:40 +0400421 link_args: config_host['GLIB_LIBS'].split(),
422 version: config_host['GLIB_VERSION'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400423# override glib dep with the configure results (for subprojects)
424meson.override_dependency('glib-2.0', glib)
425
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400426gio = not_found
427if 'CONFIG_GIO' in config_host
428 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
Marc-André Lureaud83acfd2021-10-09 17:37:40 +0400429 link_args: config_host['GIO_LIBS'].split(),
430 version: config_host['GLIB_VERSION'])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400431endif
432lttng = not_found
Paolo Bonzini9c29b742021-10-07 15:08:14 +0200433if 'ust' in get_option('trace_backends')
434 lttng = dependency('lttng-ust', required: true, method: 'pkg-config',
435 kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400436endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200437pixman = not_found
438if have_system or have_tools
439 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100440 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200441endif
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100442zlib = dependency('zlib', required: true, kwargs: static_kwargs)
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200443
Paolo Bonziniff66f3e2021-10-07 15:08:20 +0200444libaio = not_found
445if not get_option('linux_aio').auto() or have_block
446 libaio = cc.find_library('aio', has_headers: ['libaio.h'],
447 required: get_option('linux_aio'),
448 kwargs: static_kwargs)
449endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400450linux_io_uring = not_found
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200451if not get_option('linux_io_uring').auto() or have_block
Daniel P. Berrangéa41b4fd2022-01-05 13:49:38 +0000452 linux_io_uring = dependency('liburing', version: '>=0.3',
453 required: get_option('linux_io_uring'),
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200454 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400455endif
456libxml2 = not_found
Paolo Bonzinic5b36c22021-06-03 11:31:35 +0200457if not get_option('libxml2').auto() or have_block
458 libxml2 = dependency('libxml-2.0', required: get_option('libxml2'),
459 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400460endif
461libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +0100462if not get_option('libnfs').auto() or have_block
463 libnfs = dependency('libnfs', version: '>=1.9.3',
464 required: get_option('libnfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100465 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400466endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100467
468libattr_test = '''
469 #include <stddef.h>
470 #include <sys/types.h>
471 #ifdef CONFIG_LIBATTR
472 #include <attr/xattr.h>
473 #else
474 #include <sys/xattr.h>
475 #endif
476 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
477
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400478libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100479have_old_libattr = false
480if not get_option('attr').disabled()
481 if cc.links(libattr_test)
482 libattr = declare_dependency()
483 else
484 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
485 required: get_option('attr'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100486 kwargs: static_kwargs)
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100487 if libattr.found() and not \
488 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
489 libattr = not_found
490 if get_option('attr').enabled()
491 error('could not link libattr')
492 else
493 warning('could not link libattr, disabling')
494 endif
495 else
496 have_old_libattr = libattr.found()
497 endif
498 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400499endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100500
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100501cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
502if cocoa.found() and get_option('sdl').enabled()
503 error('Cocoa and SDL cannot be enabled at the same time')
504endif
505if cocoa.found() and get_option('gtk').enabled()
506 error('Cocoa and GTK+ cannot be enabled at the same time')
507endif
508
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100509seccomp = not_found
Paolo Bonzini90835c22020-11-17 14:22:24 +0100510if not get_option('seccomp').auto() or have_system or have_tools
511 seccomp = dependency('libseccomp', version: '>=2.3.0',
512 required: get_option('seccomp'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100513 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100514endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100515
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100516libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100517if not get_option('cap_ng').auto() or have_system or have_tools
518 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
519 required: get_option('cap_ng'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100520 kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100521endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100522if libcap_ng.found() and not cc.links('''
523 #include <cap-ng.h>
524 int main(void)
525 {
526 capng_capability_to_name(CAPNG_EFFECTIVE);
527 return 0;
528 }''', dependencies: libcap_ng)
529 libcap_ng = not_found
530 if get_option('cap_ng').enabled()
531 error('could not link libcap-ng')
532 else
533 warning('could not link libcap-ng, disabling')
534 endif
535endif
536
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400537if get_option('xkbcommon').auto() and not have_system and not have_tools
538 xkbcommon = not_found
539else
540 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100541 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400542endif
Paolo Bonzinie1723992021-10-07 15:08:21 +0200543
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400544vde = not_found
Paolo Bonzinie1723992021-10-07 15:08:21 +0200545if not get_option('vde').auto() or have_system or have_tools
546 vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'],
547 required: get_option('vde'),
548 kwargs: static_kwargs)
549endif
550if vde.found() and not cc.links('''
551 #include <libvdeplug.h>
552 int main(void)
553 {
554 struct vde_open_args a = {0, 0, 0};
555 char s[] = "";
556 vde_open(s, s, &a);
557 return 0;
558 }''', dependencies: vde)
559 vde = not_found
560 if get_option('cap_ng').enabled()
561 error('could not link libvdeplug')
562 else
563 warning('could not link libvdeplug, disabling')
564 endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400565endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200566
Paolo Bonzini478e9432020-08-17 12:47:55 +0200567pulse = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200568if not get_option('pa').auto() or (targetos == 'linux' and have_system)
569 pulse = dependency('libpulse', required: get_option('pa'),
570 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200571endif
572alsa = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200573if not get_option('alsa').auto() or (targetos == 'linux' and have_system)
574 alsa = dependency('alsa', required: get_option('alsa'),
575 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200576endif
577jack = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200578if not get_option('jack').auto() or have_system
579 jack = dependency('jack', required: get_option('jack'),
580 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini478e9432020-08-17 12:47:55 +0200581endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200582
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200583spice_protocol = not_found
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200584if not get_option('spice_protocol').auto() or have_system
585 spice_protocol = dependency('spice-protocol', version: '>=0.12.3',
586 required: get_option('spice_protocol'),
587 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini26347332019-07-29 15:40:07 +0200588endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200589spice = not_found
590if not get_option('spice').auto() or have_system
591 spice = dependency('spice-server', version: '>=0.12.5',
592 required: get_option('spice'),
593 method: 'pkg-config', kwargs: static_kwargs)
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200594endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +0200595spice_headers = spice.partial_dependency(compile_args: true, includes: true)
596
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400597rt = cc.find_library('rt', required: false)
Paolo Bonzinia399f912021-11-15 14:29:13 +0000598
Paolo Bonzini99650b62019-06-10 12:21:14 +0200599libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100600if not get_option('libiscsi').auto() or have_block
601 libiscsi = dependency('libiscsi', version: '>=1.9.0',
602 required: get_option('libiscsi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100603 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini99650b62019-06-10 12:21:14 +0200604endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400605zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +0100606if not get_option('zstd').auto() or have_block
607 zstd = dependency('libzstd', version: '>=1.4.0',
608 required: get_option('zstd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100609 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400610endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400611virgl = not_found
Paolo Bonzini587d59d2021-06-03 11:31:35 +0200612if not get_option('virglrenderer').auto() or have_system
613 virgl = dependency('virglrenderer',
614 method: 'pkg-config',
615 required: get_option('virglrenderer'),
616 kwargs: static_kwargs)
Marc-André Lureauea458962019-07-12 22:23:46 +0400617endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400618curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100619if not get_option('curl').auto() or have_block
620 curl = dependency('libcurl', version: '>=7.29.0',
621 method: 'pkg-config',
622 required: get_option('curl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100623 kwargs: static_kwargs)
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400624endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200625libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200626if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200627 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +0100628 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400629 required: get_option('libudev'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100630 kwargs: static_kwargs)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200631endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200632
Paolo Bonzini5c530152020-10-15 06:09:27 -0400633mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200634mpathpersist = not_found
635mpathpersist_new_api = false
636if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
637 mpath_test_source_new = '''
638 #include <libudev.h>
639 #include <mpath_persist.h>
640 unsigned mpath_mx_alloc_len = 1024;
641 int logsink;
642 static struct config *multipath_conf;
643 extern struct udev *udev;
644 extern struct config *get_multipath_config(void);
645 extern void put_multipath_config(struct config *conf);
646 struct udev *udev;
647 struct config *get_multipath_config(void) { return multipath_conf; }
648 void put_multipath_config(struct config *conf) { }
649 int main(void) {
650 udev = udev_new();
651 multipath_conf = mpath_lib_init();
652 return 0;
653 }'''
654 mpath_test_source_old = '''
655 #include <libudev.h>
656 #include <mpath_persist.h>
657 unsigned mpath_mx_alloc_len = 1024;
658 int logsink;
659 int main(void) {
660 struct udev *udev = udev_new();
661 mpath_lib_init(udev);
662 return 0;
663 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400664 libmpathpersist = cc.find_library('mpathpersist',
665 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100666 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400667 if libmpathpersist.found()
668 mpathlibs += libmpathpersist
669 if enable_static
670 mpathlibs += cc.find_library('devmapper',
671 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100672 kwargs: static_kwargs)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200673 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400674 mpathlibs += cc.find_library('multipath',
675 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100676 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400677 foreach lib: mpathlibs
678 if not lib.found()
679 mpathlibs = []
680 break
681 endif
682 endforeach
683 if mpathlibs.length() == 0
684 msg = 'Dependencies missing for libmpathpersist'
685 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200686 mpathpersist = declare_dependency(dependencies: mpathlibs)
687 mpathpersist_new_api = true
688 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
689 mpathpersist = declare_dependency(dependencies: mpathlibs)
690 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400691 msg = 'Cannot detect libmpathpersist API'
692 endif
693 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200694 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400695 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200696 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400697 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200698 endif
699 endif
700 endif
701endif
702
Yonggang Luo5285e592020-10-13 07:43:48 +0800703iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800704curses = not_found
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400705if have_system and not get_option('curses').disabled()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400706 curses_test = '''
Stefan Weilfbab8cc2021-11-17 21:53:55 +0100707 #if defined(__APPLE__) || defined(__OpenBSD__)
708 #define _XOPEN_SOURCE_EXTENDED 1
709 #endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400710 #include <locale.h>
711 #include <curses.h>
712 #include <wchar.h>
713 int main(void) {
714 wchar_t wch = L'w';
715 setlocale(LC_ALL, "");
716 resize_term(0, 0);
717 addwstr(L"wide chars\n");
718 addnwstr(&wch, 1);
719 add_wch(WACS_DEGREE);
720 return 0;
721 }'''
722
Yonggang Luoca31e302020-11-17 05:31:06 +0800723 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
724 foreach curses_dep : curses_dep_list
725 if not curses.found()
726 curses = dependency(curses_dep,
727 required: false,
728 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100729 kwargs: static_kwargs)
Yonggang Luoca31e302020-11-17 05:31:06 +0800730 endif
731 endforeach
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400732 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Stefan Weilfbab8cc2021-11-17 21:53:55 +0100733 curses_compile_args = ['-DNCURSES_WIDECHAR=1']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400734 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500735 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
736 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400737 else
738 msg = 'curses package not usable'
739 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800740 endif
741 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400742 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400743 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
744 if targetos != 'windows' and not has_curses_h
745 message('Trying with /usr/include/ncursesw')
746 curses_compile_args += ['-I/usr/include/ncursesw']
747 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
748 endif
749 if has_curses_h
750 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
751 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800752 libcurses = cc.find_library(curses_libname,
753 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100754 kwargs: static_kwargs)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400755 if libcurses.found()
756 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
757 curses = declare_dependency(compile_args: curses_compile_args,
758 dependencies: [libcurses])
759 break
760 else
761 msg = 'curses library not usable'
762 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800763 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400764 endforeach
765 endif
766 endif
767 if not get_option('iconv').disabled()
768 foreach link_args : [ ['-liconv'], [] ]
769 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
770 # We need to use libiconv if available because mixing libiconv's headers with
771 # the system libc does not work.
772 # However, without adding glib to the dependencies -L/usr/local/lib will not be
773 # included in the command line and libiconv will not be found.
774 if cc.links('''
775 #include <iconv.h>
776 int main(void) {
777 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
778 return conv != (iconv_t) -1;
779 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
780 iconv = declare_dependency(link_args: link_args, dependencies: glib)
781 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800782 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400783 endforeach
784 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400785 if curses.found() and not iconv.found()
786 if get_option('iconv').enabled()
787 error('iconv not available')
788 endif
789 msg = 'iconv required for curses UI but not available'
790 curses = not_found
791 endif
792 if not curses.found() and msg != ''
793 if get_option('curses').enabled()
794 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400795 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400796 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400797 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800798 endif
799endif
800
Paolo Bonzini26347332019-07-29 15:40:07 +0200801brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100802if not get_option('brlapi').auto() or have_system
803 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
804 required: get_option('brlapi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100805 kwargs: static_kwargs)
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100806 if brlapi.found() and not cc.links('''
807 #include <brlapi.h>
808 #include <stddef.h>
809 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
810 brlapi = not_found
811 if get_option('brlapi').enabled()
812 error('could not link brlapi')
813 else
814 warning('could not link brlapi, disabling')
815 endif
816 endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200817endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100818
Paolo Bonzini760e4322020-08-26 08:09:48 +0200819sdl = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100820if not get_option('sdl').auto() or (have_system and not cocoa.found())
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100821 sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200822 sdl_image = not_found
823endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100824if sdl.found()
825 # work around 2.0.8 bug
826 sdl = declare_dependency(compile_args: '-Wno-undef',
827 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200828 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100829 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100830else
831 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100832 error('sdl-image required, but SDL was @0@'.format(
833 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100834 endif
835 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200836endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100837
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400838rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100839if not get_option('rbd').auto() or have_block
840 librados = cc.find_library('rados', required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100841 kwargs: static_kwargs)
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100842 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
843 required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100844 kwargs: static_kwargs)
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100845 if librados.found() and librbd.found()
846 if cc.links('''
847 #include <stdio.h>
848 #include <rbd/librbd.h>
849 int main(void) {
850 rados_t cluster;
851 rados_create(&cluster, NULL);
Peter Lieven48672ac2021-07-02 19:23:51 +0200852 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
853 #error
854 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100855 return 0;
856 }''', dependencies: [librbd, librados])
857 rbd = declare_dependency(dependencies: [librbd, librados])
858 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +0200859 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100860 else
Peter Lieven48672ac2021-07-02 19:23:51 +0200861 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100862 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100863 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400864endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100865
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400866glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100867glusterfs_ftruncate_has_stat = false
868glusterfs_iocb_has_stat = false
869if not get_option('glusterfs').auto() or have_block
870 glusterfs = dependency('glusterfs-api', version: '>=3',
871 required: get_option('glusterfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100872 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100873 if glusterfs.found()
874 glusterfs_ftruncate_has_stat = cc.links('''
875 #include <glusterfs/api/glfs.h>
876
877 int
878 main(void)
879 {
880 /* new glfs_ftruncate() passes two additional args */
881 return glfs_ftruncate(NULL, 0, NULL, NULL);
882 }
883 ''', dependencies: glusterfs)
884 glusterfs_iocb_has_stat = cc.links('''
885 #include <glusterfs/api/glfs.h>
886
887 /* new glfs_io_cbk() passes two additional glfs_stat structs */
888 static void
889 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
890 {}
891
892 int
893 main(void)
894 {
895 glfs_io_cbk iocb = &glusterfs_iocb;
896 iocb(NULL, 0 , NULL, NULL, NULL);
897 return 0;
898 }
899 ''', dependencies: glusterfs)
900 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400901endif
Thomas Huthe6a52b32021-12-09 15:48:01 +0100902
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400903libssh = not_found
Thomas Huthe6a52b32021-12-09 15:48:01 +0100904if not get_option('libssh').auto() or have_block
905 libssh = dependency('libssh', version: '>=0.8.7',
906 method: 'pkg-config',
907 required: get_option('libssh'),
908 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400909endif
Thomas Huthe6a52b32021-12-09 15:48:01 +0100910
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400911libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100912if not get_option('bzip2').auto() or have_block
913 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
914 required: get_option('bzip2'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100915 kwargs: static_kwargs)
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100916 if libbzip2.found() and not cc.links('''
917 #include <bzlib.h>
918 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
919 libbzip2 = not_found
920 if get_option('bzip2').enabled()
921 error('could not link libbzip2')
922 else
923 warning('could not link libbzip2, disabling')
924 endif
925 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400926endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100927
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400928liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +0100929if not get_option('lzfse').auto() or have_block
930 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
931 required: get_option('lzfse'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100932 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400933endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100934if liblzfse.found() and not cc.links('''
935 #include <lzfse.h>
936 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
937 liblzfse = not_found
938 if get_option('lzfse').enabled()
939 error('could not link liblzfse')
940 else
941 warning('could not link liblzfse, disabling')
942 endif
943endif
944
Paolo Bonzini478e9432020-08-17 12:47:55 +0200945oss = not_found
Thomas Huthab486f12021-11-02 11:58:22 +0100946if have_system and not get_option('oss').disabled()
Paolo Bonzini87430d52021-10-07 15:06:09 +0200947 if not cc.has_header('sys/soundcard.h')
948 # not found
949 elif targetos == 'netbsd'
950 oss = cc.find_library('ossaudio', required: get_option('oss'),
951 kwargs: static_kwargs)
952 else
953 oss = declare_dependency()
954 endif
955
956 if not oss.found()
957 if get_option('oss').enabled()
958 error('OSS not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +0200959 endif
960 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200961endif
962dsound = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200963if not get_option('dsound').auto() or (targetos == 'windows' and have_system)
964 if cc.has_header('dsound.h')
965 dsound = declare_dependency(link_args: ['-lole32', '-ldxguid'])
966 endif
967
968 if not dsound.found()
969 if get_option('dsound').enabled()
970 error('DirectSound not found')
Paolo Bonzini87430d52021-10-07 15:06:09 +0200971 endif
972 endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200973endif
Paolo Bonzini87430d52021-10-07 15:06:09 +0200974
Paolo Bonzini478e9432020-08-17 12:47:55 +0200975coreaudio = not_found
Paolo Bonzini87430d52021-10-07 15:06:09 +0200976if not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system)
977 coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
978 required: get_option('coreaudio'))
Paolo Bonzini478e9432020-08-17 12:47:55 +0200979endif
Thomas Huth8bc51842021-07-13 13:09:02 +0200980
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400981opengl = not_found
982if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400983 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
984 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400985endif
Thomas Huth8bc51842021-07-13 13:09:02 +0200986gbm = not_found
987if (have_system or have_tools) and (virgl.found() or opengl.found())
988 gbm = dependency('gbm', method: 'pkg-config', required: false,
989 kwargs: static_kwargs)
990endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100991
Paolo Bonzini57612512021-06-03 11:15:26 +0200992gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +0100993gnutls_crypto = not_found
Alyssa Rossabc14fd2021-08-06 14:49:47 +0000994if get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system)
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +0100995 # For general TLS support our min gnutls matches
996 # that implied by our platform support matrix
997 #
998 # For the crypto backends, we look for a newer
999 # gnutls:
1000 #
1001 # Version 3.6.8 is needed to get XTS
1002 # Version 3.6.13 is needed to get PBKDF
1003 # Version 3.6.14 is needed to get HW accelerated XTS
1004 #
1005 # If newer enough gnutls isn't available, we can
1006 # still use a different crypto backend to satisfy
1007 # the platform support requirements
1008 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
1009 method: 'pkg-config',
1010 required: false,
1011 kwargs: static_kwargs)
1012 if gnutls_crypto.found()
1013 gnutls = gnutls_crypto
1014 else
1015 # Our min version if all we need is TLS
1016 gnutls = dependency('gnutls', version: '>=3.5.18',
1017 method: 'pkg-config',
1018 required: get_option('gnutls'),
1019 kwargs: static_kwargs)
1020 endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001021endif
1022
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001023# We prefer use of gnutls for crypto, unless the options
1024# explicitly asked for nettle or gcrypt.
1025#
1026# If gnutls isn't available for crypto, then we'll prefer
1027# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +02001028gcrypt = not_found
1029nettle = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +01001030xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001031
Paolo Bonzini57612512021-06-03 11:15:26 +02001032if get_option('nettle').enabled() and get_option('gcrypt').enabled()
1033 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +02001034endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001035
1036# Explicit nettle/gcrypt request, so ignore gnutls for crypto
1037if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001038 gnutls_crypto = not_found
1039endif
Paolo Bonzini57612512021-06-03 11:15:26 +02001040
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001041if not gnutls_crypto.found()
1042 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
1043 gcrypt = dependency('libgcrypt', version: '>=1.8',
1044 method: 'config-tool',
1045 required: get_option('gcrypt'),
1046 kwargs: static_kwargs)
1047 # Debian has removed -lgpg-error from libgcrypt-config
1048 # as it "spreads unnecessary dependencies" which in
1049 # turn breaks static builds...
1050 if gcrypt.found() and enable_static
1051 gcrypt = declare_dependency(dependencies: [
1052 gcrypt,
1053 cc.find_library('gpg-error', required: true, kwargs: static_kwargs)])
1054 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001055 endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +01001056 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
1057 nettle = dependency('nettle', version: '>=3.4',
1058 method: 'pkg-config',
1059 required: get_option('nettle'),
1060 kwargs: static_kwargs)
1061 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
1062 xts = 'private'
1063 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001064 endif
1065endif
1066
1067gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +01001068gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001069vte = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +01001070if not get_option('gtk').auto() or (have_system and not cocoa.found())
Paolo Bonzini1b695472021-01-07 14:02:29 +01001071 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
1072 method: 'pkg-config',
1073 required: get_option('gtk'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001074 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +01001075 if gtk.found()
1076 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
1077 method: 'pkg-config',
1078 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001079 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +01001080 gtk = declare_dependency(dependencies: [gtk, gtkx11])
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001081
1082 if not get_option('vte').auto() or have_system
1083 vte = dependency('vte-2.91',
1084 method: 'pkg-config',
1085 required: get_option('vte'),
1086 kwargs: static_kwargs)
1087 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001088 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001089endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001090
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001091x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +02001092if gtkx11.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +01001093 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001094 kwargs: static_kwargs)
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001095endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001096vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001097png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001098jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001099sasl = not_found
Thomas Huth95e22892021-09-06 17:39:39 +02001100if have_system and not get_option('vnc').disabled()
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001101 vnc = declare_dependency() # dummy dependency
1102 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001103 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini8e242b32020-11-23 13:34:02 -05001104 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001105 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001106 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
1107 required: get_option('vnc_sasl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001108 kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001109 if sasl.found()
1110 sasl = declare_dependency(dependencies: sasl,
1111 compile_args: '-DSTRUCT_IOVEC_DEFINED')
1112 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +04001113endif
Paolo Bonzini241611e2020-11-17 13:32:34 +01001114
Paolo Bonzini05e391a2021-06-03 11:15:26 +02001115pam = not_found
1116if not get_option('auth_pam').auto() or have_system
1117 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
1118 required: get_option('auth_pam'),
1119 kwargs: static_kwargs)
1120endif
1121if pam.found() and not cc.links('''
1122 #include <stddef.h>
1123 #include <security/pam_appl.h>
1124 int main(void) {
1125 const char *service_name = "qemu";
1126 const char *user = "frank";
1127 const struct pam_conv pam_conv = { 0 };
1128 pam_handle_t *pamh = NULL;
1129 pam_start(service_name, user, &pam_conv, &pamh);
1130 return 0;
1131 }''', dependencies: pam)
1132 pam = not_found
1133 if get_option('auth_pam').enabled()
1134 error('could not link libpam')
1135 else
1136 warning('could not link libpam, disabling')
1137 endif
1138endif
1139
Marc-André Lureau708eab42019-09-03 16:59:33 +04001140snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +01001141if not get_option('snappy').auto() or have_system
1142 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
1143 required: get_option('snappy'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001144 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +04001145endif
Paolo Bonzini565174d2021-11-04 14:35:14 +01001146if snappy.found() and not linker.links('''
Paolo Bonzini241611e2020-11-17 13:32:34 +01001147 #include <snappy-c.h>
1148 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
1149 snappy = not_found
1150 if get_option('snappy').enabled()
1151 error('could not link libsnappy')
1152 else
1153 warning('could not link libsnappy, disabling')
1154 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +04001155endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001156
Marc-André Lureau708eab42019-09-03 16:59:33 +04001157lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001158if not get_option('lzo').auto() or have_system
1159 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
1160 required: get_option('lzo'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001161 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +04001162endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001163if lzo.found() and not cc.links('''
1164 #include <lzo/lzo1x.h>
1165 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
1166 lzo = not_found
1167 if get_option('lzo').enabled()
1168 error('could not link liblzo2')
1169 else
1170 warning('could not link liblzo2, disabling')
1171 endif
1172endif
1173
Marc-André Lureau55166232019-07-24 19:16:22 +04001174rdma = not_found
1175if 'CONFIG_RDMA' in config_host
1176 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
1177endif
Marc-André Lureauab318052019-07-24 19:23:16 +04001178numa = not_found
1179if 'CONFIG_NUMA' in config_host
1180 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
1181endif
Marc-André Lureau582ea952019-08-15 15:15:32 +04001182xen = not_found
1183if 'CONFIG_XEN_BACKEND' in config_host
1184 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
1185 link_args: config_host['XEN_LIBS'].split())
1186endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001187cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02001188if not get_option('smartcard').auto() or have_system
1189 cacard = dependency('libcacard', required: get_option('smartcard'),
1190 version: '>=2.5.1', method: 'pkg-config',
1191 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001192endif
César Belley0a40bcb2020-08-26 13:42:04 +02001193u2f = not_found
1194if have_system
1195 u2f = dependency('u2f-emu', required: get_option('u2f'),
1196 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001197 kwargs: static_kwargs)
César Belley0a40bcb2020-08-26 13:42:04 +02001198endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001199usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02001200if not get_option('usb_redir').auto() or have_system
1201 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
1202 version: '>=0.6', method: 'pkg-config',
1203 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001204endif
1205libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02001206if not get_option('libusb').auto() or have_system
1207 libusb = dependency('libusb-1.0', required: get_option('libusb'),
1208 version: '>=1.0.13', method: 'pkg-config',
1209 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001210endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02001211
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001212libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02001213if not get_option('libpmem').auto() or have_system
1214 libpmem = dependency('libpmem', required: get_option('libpmem'),
1215 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001216endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001217libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02001218if not get_option('libdaxctl').auto() or have_system
1219 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
1220 version: '>=57', method: 'pkg-config',
1221 kwargs: static_kwargs)
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001222endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001223tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02001224if gnutls.found()
1225 tasn1 = dependency('libtasn1',
1226 method: 'pkg-config',
1227 kwargs: static_kwargs)
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001228endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001229keyutils = dependency('libkeyutils', required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001230 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001231
Marc-André Lureau3909def2020-08-28 15:07:33 +04001232has_gettid = cc.has_function('gettid')
1233
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001234# libselinux
1235selinux = dependency('libselinux',
1236 required: get_option('selinux'),
1237 method: 'pkg-config', kwargs: static_kwargs)
1238
Paolo Bonziniaa087962020-09-01 11:15:30 -04001239# Malloc tests
1240
1241malloc = []
1242if get_option('malloc') == 'system'
1243 has_malloc_trim = \
1244 not get_option('malloc_trim').disabled() and \
1245 cc.links('''#include <malloc.h>
1246 int main(void) { malloc_trim(0); return 0; }''')
1247else
1248 has_malloc_trim = false
1249 malloc = cc.find_library(get_option('malloc'), required: true)
1250endif
1251if not has_malloc_trim and get_option('malloc_trim').enabled()
1252 if get_option('malloc') == 'system'
1253 error('malloc_trim not available on this platform.')
1254 else
1255 error('malloc_trim not available with non-libc memory allocator')
1256 endif
1257endif
1258
Max Reitz84e319a2020-11-02 17:18:55 +01001259# Check whether the glibc provides statx()
1260
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001261gnu_source_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01001262 #ifndef _GNU_SOURCE
1263 #define _GNU_SOURCE
1264 #endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001265'''
1266statx_test = gnu_source_prefix + '''
Max Reitz84e319a2020-11-02 17:18:55 +01001267 #include <sys/stat.h>
1268 int main(void) {
1269 struct statx statxbuf;
1270 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
1271 return 0;
1272 }'''
1273
1274has_statx = cc.links(statx_test)
1275
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +00001276have_vhost_user_blk_server = (targetos == 'linux' and
1277 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001278
1279if get_option('vhost_user_blk_server').enabled()
1280 if targetos != 'linux'
1281 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +00001282 elif 'CONFIG_VHOST_USER' not in config_host
1283 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001284 endif
1285elif get_option('vhost_user_blk_server').disabled() or not have_system
1286 have_vhost_user_blk_server = false
1287endif
1288
Daniele Buono9e62ba42020-12-04 18:06:14 -05001289
Max Reitzdf4ea702020-10-27 20:05:46 +01001290if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1291 error('Cannot enable fuse-lseek while fuse is disabled')
1292endif
1293
Max Reitza484a712020-10-27 20:05:41 +01001294fuse = dependency('fuse3', required: get_option('fuse'),
1295 version: '>=3.1', method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001296 kwargs: static_kwargs)
Max Reitza484a712020-10-27 20:05:41 +01001297
Max Reitzdf4ea702020-10-27 20:05:46 +01001298fuse_lseek = not_found
1299if not get_option('fuse_lseek').disabled()
1300 if fuse.version().version_compare('>=3.8')
1301 # Dummy dependency
1302 fuse_lseek = declare_dependency()
1303 elif get_option('fuse_lseek').enabled()
1304 if fuse.found()
1305 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1306 else
1307 error('fuse-lseek requires libfuse, which was not found')
1308 endif
1309 endif
1310endif
1311
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001312# libbpf
1313libbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
1314if libbpf.found() and not cc.links('''
1315 #include <bpf/libbpf.h>
1316 int main(void)
1317 {
1318 bpf_object__destroy_skeleton(NULL);
1319 return 0;
1320 }''', dependencies: libbpf)
1321 libbpf = not_found
1322 if get_option('bpf').enabled()
1323 error('libbpf skeleton test failed')
1324 else
1325 warning('libbpf skeleton test failed, disabling')
1326 endif
1327endif
1328
Paolo Bonzini87430d52021-10-07 15:06:09 +02001329#################
1330# config-host.h #
1331#################
1332
1333audio_drivers_selected = []
1334if have_system
1335 audio_drivers_available = {
1336 'alsa': alsa.found(),
1337 'coreaudio': coreaudio.found(),
1338 'dsound': dsound.found(),
1339 'jack': jack.found(),
1340 'oss': oss.found(),
1341 'pa': pulse.found(),
1342 'sdl': sdl.found(),
1343 }
Paolo Bonzinie5424a22021-10-07 15:06:10 +02001344 foreach k, v: audio_drivers_available
1345 config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v)
1346 endforeach
Paolo Bonzini87430d52021-10-07 15:06:09 +02001347
1348 # Default to native drivers first, OSS second, SDL third
1349 audio_drivers_priority = \
1350 [ 'pa', 'coreaudio', 'dsound', 'oss' ] + \
1351 (targetos == 'linux' ? [] : [ 'sdl' ])
1352 audio_drivers_default = []
1353 foreach k: audio_drivers_priority
1354 if audio_drivers_available[k]
1355 audio_drivers_default += k
1356 endif
1357 endforeach
1358
1359 foreach k: get_option('audio_drv_list')
1360 if k == 'default'
1361 audio_drivers_selected += audio_drivers_default
1362 elif not audio_drivers_available[k]
1363 error('Audio driver "@0@" not available.'.format(k))
1364 else
1365 audio_drivers_selected += k
1366 endif
1367 endforeach
1368endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02001369config_host_data.set('CONFIG_AUDIO_DRIVERS',
1370 '"' + '", "'.join(audio_drivers_selected) + '", ')
1371
Daniele Buono9e62ba42020-12-04 18:06:14 -05001372if get_option('cfi')
1373 cfi_flags=[]
1374 # Check for dependency on LTO
1375 if not get_option('b_lto')
1376 error('Selected Control-Flow Integrity but LTO is disabled')
1377 endif
1378 if config_host.has_key('CONFIG_MODULES')
1379 error('Selected Control-Flow Integrity is not compatible with modules')
1380 endif
1381 # Check for cfi flags. CFI requires LTO so we can't use
1382 # get_supported_arguments, but need a more complex "compiles" which allows
1383 # custom arguments
1384 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1385 args: ['-flto', '-fsanitize=cfi-icall'] )
1386 cfi_flags += '-fsanitize=cfi-icall'
1387 else
1388 error('-fsanitize=cfi-icall is not supported by the compiler')
1389 endif
1390 if cc.compiles('int main () { return 0; }',
1391 name: '-fsanitize-cfi-icall-generalize-pointers',
1392 args: ['-flto', '-fsanitize=cfi-icall',
1393 '-fsanitize-cfi-icall-generalize-pointers'] )
1394 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1395 else
1396 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1397 endif
1398 if get_option('cfi_debug')
1399 if cc.compiles('int main () { return 0; }',
1400 name: '-fno-sanitize-trap=cfi-icall',
1401 args: ['-flto', '-fsanitize=cfi-icall',
1402 '-fno-sanitize-trap=cfi-icall'] )
1403 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1404 else
1405 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1406 endif
1407 endif
Marc-André Lureau5fc06172021-01-14 16:56:02 +04001408 add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1409 add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
Daniele Buono9e62ba42020-12-04 18:06:14 -05001410endif
1411
Joelle van Dyne14176c82021-03-15 11:03:38 -07001412have_host_block_device = (targetos != 'darwin' or
1413 cc.has_header('IOKit/storage/IOMedia.h'))
1414
Marc-André Lureau142ca622021-07-15 11:53:53 +04001415dbus_display = false
1416if not get_option('dbus_display').disabled()
1417 # FIXME enable_modules shouldn't be necessary, but: https://github.com/mesonbuild/meson/issues/8333
1418 dbus_display = gio.version().version_compare('>=2.64') and config_host.has_key('GDBUS_CODEGEN') and enable_modules
1419 if get_option('dbus_display').enabled() and not dbus_display
1420 error('Requirements missing to enable -display dbus (glib>=2.64 && --enable-modules)')
1421 endif
1422endif
1423
Paolo Bonzini69202b42020-11-17 14:46:21 +01001424have_virtfs = (targetos == 'linux' and
1425 have_system and
1426 libattr.found() and
1427 libcap_ng.found())
1428
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01001429have_virtfs_proxy_helper = have_virtfs and have_tools
1430
Paolo Bonzini69202b42020-11-17 14:46:21 +01001431if get_option('virtfs').enabled()
1432 if not have_virtfs
1433 if targetos != 'linux'
1434 error('virtio-9p (virtfs) requires Linux')
1435 elif not libcap_ng.found() or not libattr.found()
1436 error('virtio-9p (virtfs) requires libcap-ng-devel and libattr-devel')
1437 elif not have_system
1438 error('virtio-9p (virtfs) needs system emulation support')
1439 endif
1440 endif
1441elif get_option('virtfs').disabled()
1442 have_virtfs = false
1443endif
1444
Paolo Bonzini9c29b742021-10-07 15:08:14 +02001445foreach k : get_option('trace_backends')
1446 config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true)
1447endforeach
1448config_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file'))
1449
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001450config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1451config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1452config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1453config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1454config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
1455config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
1456config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1457config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1458config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1459config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1460config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1461config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1462
Paolo Bonzini823eb012021-11-08 14:18:17 +01001463config_host_data.set('HOST_' + host_arch.to_upper(), 1)
1464
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001465config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001466config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04001467config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzini537b7242021-10-07 15:08:12 +02001468config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
Paolo Bonziniaf2bb992021-10-07 15:08:17 +02001469config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001470config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001471config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001472config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1473config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001474config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08001475config_host_data.set('CONFIG_CURSES', curses.found())
Thomas Huth8bc51842021-07-13 13:09:02 +02001476config_host_data.set('CONFIG_GBM', gbm.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001477config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1478if glusterfs.found()
1479 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1480 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1481 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1482 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1483 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1484 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1485endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001486config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001487config_host_data.set('CONFIG_VTE', vte.found())
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001488config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001489config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001490config_host_data.set('CONFIG_EBPF', libbpf.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001491config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001492config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01001493config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Thomas Huthe6a52b32021-12-09 15:48:01 +01001494config_host_data.set('CONFIG_LIBSSH', libssh.found())
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02001495config_host_data.set('CONFIG_LINUX_AIO', libaio.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001496config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
1497config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001498config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001499config_host_data.set('CONFIG_SDL', sdl.found())
1500config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01001501config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01001502config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzini90540f32021-06-03 11:15:26 +02001503config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Paolo Bonzinie1723992021-10-07 15:08:21 +02001504config_host_data.set('CONFIG_VDE', vde.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001505config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001506config_host_data.set('CONFIG_VNC', vnc.found())
1507config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1508config_host_data.set('CONFIG_VNC_PNG', png.found())
1509config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01001510config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001511config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001512config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001513config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04001514config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02001515config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001516config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02001517config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
1518config_host_data.set('CONFIG_NETTLE', nettle.found())
1519config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04001520config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01001521config_host_data.set('CONFIG_STATX', has_statx)
Paolo Bonzinib1def332020-11-17 13:37:39 +01001522config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01001523config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01001524config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001525config_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found())
Marc-André Lureauddece462021-10-06 14:18:09 +04001526if spice_protocol.found()
1527config_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0])
1528config_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1])
1529config_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2])
1530endif
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001531config_host_data.set('CONFIG_SPICE', spice.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01001532config_host_data.set('CONFIG_X11', x11.found())
Marc-André Lureau142ca622021-07-15 11:53:53 +04001533config_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display)
Daniele Buono9e62ba42020-12-04 18:06:14 -05001534config_host_data.set('CONFIG_CFI', get_option('cfi'))
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06001535config_host_data.set('CONFIG_SELINUX', selinux.found())
Paolo Bonzini859aef02020-08-04 18:14:26 +02001536config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1537config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1538config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1539config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1540
Paolo Bonzinia6305082021-10-07 15:08:15 +02001541config_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf)
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001542config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
Paolo Bonzini269506d2021-10-07 15:08:16 +02001543config_host_data.set('HOST_WORDS_BIGENDIAN', host_machine.endian() == 'big')
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001544
1545# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001546config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02001547config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
1548config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
Thomas Huth48f670e2020-11-18 18:10:52 +01001549config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001550config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001551config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001552config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001553config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001554config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001555
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001556# has_function
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001557config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001558config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
1559config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
1560config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
1561config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001562config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001563config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001564config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001565config_host_data.set('CONFIG_SEM_TIMEDWAIT', cc.has_function('sem_timedwait', dependencies: threads))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001566config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
1567config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
1568config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
1569config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
1570config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001571config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001572config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001573config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001574config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Li Zhijian911965a2021-09-10 15:02:55 +08001575if rdma.found()
1576 config_host_data.set('HAVE_IBV_ADVISE_MR',
1577 cc.has_function('ibv_advise_mr',
1578 args: config_host['RDMA_LIBS'].split(),
1579 prefix: '#include <infiniband/verbs.h>'))
1580endif
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001581
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001582# has_header_symbol
1583config_host_data.set('CONFIG_BYTESWAP_H',
1584 cc.has_header_symbol('byteswap.h', 'bswap_32'))
1585config_host_data.set('CONFIG_EPOLL_CREATE1',
1586 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02001587config_host_data.set('CONFIG_HAS_ENVIRON',
1588 cc.has_header_symbol('unistd.h', 'environ', prefix: gnu_source_prefix))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001589config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
1590 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
1591 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
1592config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
1593 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
1594config_host_data.set('CONFIG_FIEMAP',
1595 cc.has_header('linux/fiemap.h') and
1596 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001597config_host_data.set('CONFIG_GETRANDOM',
1598 cc.has_function('getrandom') and
1599 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001600config_host_data.set('CONFIG_INOTIFY',
1601 cc.has_header_symbol('sys/inotify.h', 'inotify_init'))
1602config_host_data.set('CONFIG_INOTIFY1',
1603 cc.has_header_symbol('sys/inotify.h', 'inotify_init1'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001604config_host_data.set('CONFIG_MACHINE_BSWAP_H',
1605 cc.has_header_symbol('machine/bswap.h', 'bswap32',
1606 prefix: '''#include <sys/endian.h>
1607 #include <sys/types.h>'''))
1608config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
1609 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001610config_host_data.set('CONFIG_RTNETLINK',
1611 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
1612config_host_data.set('CONFIG_SYSMACROS',
1613 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001614config_host_data.set('HAVE_OPTRESET',
1615 cc.has_header_symbol('getopt.h', 'optreset'))
Marc-André Lureau653163f2021-09-07 16:19:13 +04001616config_host_data.set('HAVE_IPPROTO_MPTCP',
1617 cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001618
1619# has_member
1620config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
1621 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
1622 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001623config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
1624 cc.has_member('struct stat', 'st_atim',
1625 prefix: '#include <sys/stat.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001626
Paolo Bonzini6a23f812021-11-16 08:28:29 +01001627# has_type
1628config_host_data.set('CONFIG_IOVEC',
1629 cc.has_type('struct iovec',
1630 prefix: '#include <sys/uio.h>'))
1631config_host_data.set('HAVE_UTMPX',
1632 cc.has_type('struct utmpx',
1633 prefix: '#include <utmpx.h>'))
1634
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001635config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001636 #include <sys/eventfd.h>
1637 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001638config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001639 #include <unistd.h>
1640 int main(void) {
1641 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
1642 return fdatasync(0);
1643 #else
1644 #error Not supported
1645 #endif
1646 }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001647config_host_data.set('CONFIG_MADVISE', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001648 #include <sys/types.h>
1649 #include <sys/mman.h>
1650 #include <stddef.h>
1651 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001652config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001653 #include <sys/mman.h>
1654 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001655config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02001656 #include <fcntl.h>
1657 #if !defined(AT_EMPTY_PATH)
1658 # error missing definition
1659 #else
1660 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
1661 #endif'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001662config_host_data.set('CONFIG_PIPE2', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001663 #include <unistd.h>
1664 #include <fcntl.h>
1665
1666 int main(void)
1667 {
1668 int pipefd[2];
1669 return pipe2(pipefd, O_CLOEXEC);
1670 }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001671config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001672 #include <sys/mman.h>
1673 #include <stddef.h>
1674 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
Paolo Bonzini10f6b232021-10-07 15:08:19 +02001675
Paolo Bonzini6a23f812021-11-16 08:28:29 +01001676config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02001677 #include <pthread.h>
1678
1679 static void *f(void *p) { return NULL; }
1680 int main(void)
1681 {
1682 pthread_t thread;
1683 pthread_create(&thread, 0, f, 0);
1684 pthread_setname_np(thread, "QEMU");
1685 return 0;
1686 }''', dependencies: threads))
Paolo Bonzini6a23f812021-11-16 08:28:29 +01001687config_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + '''
Paolo Bonzini10f6b232021-10-07 15:08:19 +02001688 #include <pthread.h>
1689
1690 static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; }
1691 int main(void)
1692 {
1693 pthread_t thread;
1694 pthread_create(&thread, 0, f, 0);
1695 return 0;
1696 }''', dependencies: threads))
1697
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001698config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
Kacper Słomiński6bd17dc2021-09-05 03:16:22 +02001699 #include <sys/signalfd.h>
1700 #include <stddef.h>
1701 int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001702config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001703 #include <unistd.h>
1704 #include <fcntl.h>
1705 #include <limits.h>
1706
1707 int main(void)
1708 {
1709 int len, fd = 0;
1710 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
1711 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
1712 return 0;
1713 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001714
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02001715config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
1716 #include <sys/mman.h>
1717 int main(int argc, char *argv[]) {
1718 return mlockall(MCL_FUTURE);
1719 }'''))
1720
Thomas Hutheea94532021-10-28 20:59:08 +02001721have_l2tpv3 = false
1722if not get_option('l2tpv3').disabled() and have_system
Paolo Bonzini6a23f812021-11-16 08:28:29 +01001723 have_l2tpv3 = cc.has_type('struct mmsghdr',
1724 prefix: gnu_source_prefix + '''
1725 #include <sys/socket.h>
1726 #include <linux/ip.h>''')
Thomas Hutheea94532021-10-28 20:59:08 +02001727endif
1728config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
1729
Paolo Bonzini837b84b2021-10-07 15:08:22 +02001730have_netmap = false
1731if not get_option('netmap').disabled() and have_system
1732 have_netmap = cc.compiles('''
1733 #include <inttypes.h>
1734 #include <net/if.h>
1735 #include <net/netmap.h>
1736 #include <net/netmap_user.h>
1737 #if (NETMAP_API < 11) || (NETMAP_API > 15)
1738 #error
1739 #endif
1740 int main(void) { return 0; }''')
1741 if not have_netmap and get_option('netmap').enabled()
1742 error('Netmap headers not available')
1743 endif
1744endif
1745config_host_data.set('CONFIG_NETMAP', have_netmap)
1746
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02001747# Work around a system header bug with some kernel/XFS header
1748# versions where they both try to define 'struct fsxattr':
1749# xfs headers will not try to redefine structs from linux headers
1750# if this macro is set.
1751config_host_data.set('HAVE_FSXATTR', cc.links('''
Paolo Bonzini6a23f812021-11-16 08:28:29 +01001752 #include <linux/fs.h>
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02001753 struct fsxattr foo;
1754 int main(void) {
1755 return 0;
1756 }'''))
1757
Paolo Bonzinie46bd552021-06-03 11:57:04 +02001758# Some versions of Mac OS X incorrectly define SIZE_MAX
1759config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
1760 #include <stdint.h>
1761 #include <stdio.h>
1762 int main(int argc, char *argv[]) {
1763 return printf("%zu", SIZE_MAX);
1764 }''', args: ['-Werror']))
1765
Paolo Bonzinibd87a362021-10-07 15:08:25 +02001766# See if 64-bit atomic operations are supported.
1767# Note that without __atomic builtins, we can only
1768# assume atomic loads/stores max at pointer size.
1769config_host_data.set('CONFIG_ATOMIC64', cc.links('''
1770 #include <stdint.h>
1771 int main(void)
1772 {
1773 uint64_t x = 0, y = 0;
1774 y = __atomic_load_n(&x, __ATOMIC_RELAXED);
1775 __atomic_store_n(&x, y, __ATOMIC_RELAXED);
1776 __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
1777 __atomic_exchange_n(&x, y, __ATOMIC_RELAXED);
1778 __atomic_fetch_add(&x, y, __ATOMIC_RELAXED);
1779 return 0;
1780 }'''))
1781
1782config_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + '''
1783 #include <sys/auxv.h>
1784 int main(void) {
1785 return getauxval(AT_HWCAP) == 0;
1786 }'''))
1787
1788config_host_data.set('CONFIG_AF_VSOCK', cc.compiles(gnu_source_prefix + '''
1789 #include <errno.h>
1790 #include <sys/types.h>
1791 #include <sys/socket.h>
1792 #if !defined(AF_VSOCK)
1793 # error missing AF_VSOCK flag
1794 #endif
1795 #include <linux/vm_sockets.h>
1796 int main(void) {
1797 int sock, ret;
1798 struct sockaddr_vm svm;
1799 socklen_t len = sizeof(svm);
1800 sock = socket(AF_VSOCK, SOCK_STREAM, 0);
1801 ret = getpeername(sock, (struct sockaddr *)&svm, &len);
1802 if ((ret == -1) && (errno == ENOTCONN)) {
1803 return 0;
1804 }
1805 return -1;
1806 }'''))
1807
Paolo Bonzinia76a1f62021-10-13 10:04:24 +02001808ignored = ['CONFIG_QEMU_INTERP_PREFIX', # actually per-target
1809 'HAVE_GDB_BIN']
Paolo Bonzini87430d52021-10-07 15:06:09 +02001810arrays = ['CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzinia6305082021-10-07 15:08:15 +02001811strings = ['CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001812foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -04001813 if ignored.contains(k)
1814 # do nothing
1815 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001816 if v != ''
1817 v = '"' + '", "'.join(v.split()) + '", '
1818 endif
1819 config_host_data.set(k, v)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001820 elif strings.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001821 config_host_data.set_quoted(k, v)
Paolo Bonzini96a63ae2021-10-07 15:08:18 +02001822 elif k.startswith('CONFIG_')
Paolo Bonzini859aef02020-08-04 18:14:26 +02001823 config_host_data.set(k, v == 'y' ? 1 : v)
1824 endif
1825endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02001826
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001827########################
1828# Target configuration #
1829########################
1830
Paolo Bonzini2becc362020-02-03 11:42:03 +01001831minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04001832config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001833config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001834config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001835config_devices_mak_list = []
1836config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02001837config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001838config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001839
1840disassemblers = {
1841 'alpha' : ['CONFIG_ALPHA_DIS'],
1842 'arm' : ['CONFIG_ARM_DIS'],
1843 'avr' : ['CONFIG_AVR_DIS'],
1844 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06001845 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001846 'hppa' : ['CONFIG_HPPA_DIS'],
1847 'i386' : ['CONFIG_I386_DIS'],
1848 'x86_64' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001849 'm68k' : ['CONFIG_M68K_DIS'],
1850 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1851 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001852 'nios2' : ['CONFIG_NIOS2_DIS'],
1853 'or1k' : ['CONFIG_OPENRISC_DIS'],
1854 'ppc' : ['CONFIG_PPC_DIS'],
1855 'riscv' : ['CONFIG_RISCV_DIS'],
1856 'rx' : ['CONFIG_RX_DIS'],
1857 's390' : ['CONFIG_S390_DIS'],
1858 'sh4' : ['CONFIG_SH4_DIS'],
1859 'sparc' : ['CONFIG_SPARC_DIS'],
1860 'xtensa' : ['CONFIG_XTENSA_DIS'],
1861}
1862if link_language == 'cpp'
1863 disassemblers += {
1864 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1865 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1866 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1867 }
1868endif
1869
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001870have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01001871host_kconfig = \
Paolo Bonzini537b7242021-10-07 15:08:12 +02001872 (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001873 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02001874 (spice.found() ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02001875 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001876 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01001877 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001878 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1879 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1880 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01001881 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001882 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman3090de62021-01-29 11:46:05 -05001883 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : []) + \
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01001884 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01001885
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001886ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001887
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001888default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1889actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001890fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001891foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04001892 config_target = { 'TARGET_NAME': target.split('-')[0] }
1893 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001894 if targetos != 'linux'
1895 if default_targets
1896 continue
1897 endif
1898 error('Target @0@ is only available on a Linux host'.format(target))
1899 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001900 config_target += { 'CONFIG_LINUX_USER': 'y' }
1901 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001902 if 'CONFIG_BSD' not in config_host
1903 if default_targets
1904 continue
1905 endif
1906 error('Target @0@ is only available on a BSD host'.format(target))
1907 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001908 config_target += { 'CONFIG_BSD_USER': 'y' }
1909 elif target.endswith('softmmu')
1910 config_target += { 'CONFIG_SOFTMMU': 'y' }
1911 endif
1912 if target.endswith('-user')
1913 config_target += {
1914 'CONFIG_USER_ONLY': 'y',
1915 'CONFIG_QEMU_INTERP_PREFIX':
1916 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1917 }
1918 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001919
Paolo Bonzini0a189112020-11-17 14:58:32 +01001920 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04001921 foreach sym: accelerators
1922 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1923 config_target += { sym: 'y' }
1924 config_all += { sym: 'y' }
Paolo Bonzini23a77b22020-12-14 12:01:45 +01001925 if sym == 'CONFIG_TCG' and tcg_arch == 'tci'
1926 config_target += { 'CONFIG_TCG_INTERPRETER': 'y' }
1927 elif sym == 'CONFIG_XEN' and have_xen_pci_passthrough
Paolo Bonzini8a199802020-09-18 05:37:01 -04001928 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1929 endif
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02001930 if target in modular_tcg
1931 config_target += { 'CONFIG_TCG_MODULAR': 'y' }
1932 else
1933 config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
1934 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01001935 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04001936 endif
1937 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01001938 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001939 if default_targets
1940 continue
1941 endif
1942 error('No accelerator available for target @0@'.format(target))
1943 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001944
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001945 actual_target_dirs += target
Alex Bennée812b31d2021-07-07 14:17:43 +01001946 config_target += keyval.load('configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001947 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001948
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001949 if 'TARGET_NEED_FDT' in config_target
1950 fdt_required += target
1951 endif
1952
Paolo Bonzinifa731682020-09-21 05:19:07 -04001953 # Add default keys
1954 if 'TARGET_BASE_ARCH' not in config_target
1955 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1956 endif
1957 if 'TARGET_ABI_DIR' not in config_target
1958 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1959 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001960
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001961 foreach k, v: disassemblers
Paolo Bonzini823eb012021-11-08 14:18:17 +01001962 if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001963 foreach sym: v
1964 config_target += { sym: 'y' }
1965 config_all_disas += { sym: 'y' }
1966 endforeach
1967 endif
1968 endforeach
1969
Paolo Bonzini859aef02020-08-04 18:14:26 +02001970 config_target_data = configuration_data()
1971 foreach k, v: config_target
1972 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1973 # do nothing
1974 elif ignored.contains(k)
1975 # do nothing
1976 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001977 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1978 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001979 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001980 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001981 config_target_data.set_quoted(k, v)
1982 elif v == 'y'
1983 config_target_data.set(k, 1)
1984 else
1985 config_target_data.set(k, v)
1986 endif
1987 endforeach
Peter Maydellcb2c5532021-07-30 11:59:43 +01001988 config_target_data.set('QEMU_ARCH',
1989 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper())
Paolo Bonzini859aef02020-08-04 18:14:26 +02001990 config_target_h += {target: configure_file(output: target + '-config-target.h',
1991 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001992
1993 if target.endswith('-softmmu')
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01001994 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001995 config_devices_mak = target + '-config-devices.mak'
1996 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01001997 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001998 output: config_devices_mak,
1999 depfile: config_devices_mak + '.d',
2000 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01002001 command: [minikconf,
2002 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01002003 config_devices_mak, '@DEPFILE@', '@INPUT@',
Philippe Mathieu-Daudéf4063f92021-07-07 14:17:40 +01002004 host_kconfig, accel_kconfig,
2005 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'])
Paolo Bonzini859aef02020-08-04 18:14:26 +02002006
2007 config_devices_data = configuration_data()
2008 config_devices = keyval.load(config_devices_mak)
2009 foreach k, v: config_devices
2010 config_devices_data.set(k, 1)
2011 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002012 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02002013 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
2014 configuration: config_devices_data)}
2015 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04002016 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01002017 endif
2018 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002019endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002020target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002021
Paolo Bonzini2becc362020-02-03 11:42:03 +01002022# This configuration is used to build files that are shared by
2023# multiple binaries, and then extracted out of the "common"
2024# static_library target.
2025#
2026# We do not use all_sources()/all_dependencies(), because it would
2027# build literally all source files, including devices only used by
2028# targets that are not built for this compilation. The CONFIG_ALL
2029# pseudo symbol replaces it.
2030
Paolo Bonzini05512f52020-09-16 15:31:11 -04002031config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01002032config_all += config_host
2033config_all += config_all_disas
2034config_all += {
2035 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
2036 'CONFIG_SOFTMMU': have_system,
2037 'CONFIG_USER_ONLY': have_user,
2038 'CONFIG_ALL': true,
2039}
2040
Paolo Bonzinieed56e92021-11-10 11:01:26 +01002041target_configs_h = []
2042foreach target: target_dirs
2043 target_configs_h += config_target_h[target]
2044 target_configs_h += config_devices_h.get(target, [])
2045endforeach
2046genh += custom_target('config-poison.h',
2047 input: [target_configs_h],
2048 output: 'config-poison.h',
2049 capture: true,
2050 command: [find_program('scripts/make-config-poison.sh'),
2051 target_configs_h])
2052
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002053##############
2054# Submodules #
2055##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002056
2057capstone = not_found
2058capstone_opt = get_option('capstone')
2059if capstone_opt in ['enabled', 'auto', 'system']
2060 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07002061 capstone = dependency('capstone', version: '>=4.0',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01002062 kwargs: static_kwargs, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002063 required: capstone_opt == 'system' or
2064 capstone_opt == 'enabled' and not have_internal)
Daniel P. Berrangé8f4aea72021-07-09 15:29:31 +01002065
2066 # Some versions of capstone have broken pkg-config file
2067 # that reports a wrong -I path, causing the #include to
2068 # fail later. If the system has such a broken version
2069 # do not use it.
2070 if capstone.found() and not cc.compiles('#include <capstone.h>',
2071 dependencies: [capstone])
2072 capstone = not_found
2073 if capstone_opt == 'system'
2074 error('system capstone requested, it does not appear to work')
2075 endif
2076 endif
2077
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002078 if capstone.found()
2079 capstone_opt = 'system'
2080 elif have_internal
2081 capstone_opt = 'internal'
2082 else
2083 capstone_opt = 'disabled'
2084 endif
2085endif
2086if capstone_opt == 'internal'
2087 capstone_data = configuration_data()
2088 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
2089
2090 capstone_files = files(
2091 'capstone/cs.c',
2092 'capstone/MCInst.c',
2093 'capstone/MCInstrDesc.c',
2094 'capstone/MCRegisterInfo.c',
2095 'capstone/SStream.c',
2096 'capstone/utils.c'
2097 )
2098
2099 if 'CONFIG_ARM_DIS' in config_all_disas
2100 capstone_data.set('CAPSTONE_HAS_ARM', '1')
2101 capstone_files += files(
2102 'capstone/arch/ARM/ARMDisassembler.c',
2103 'capstone/arch/ARM/ARMInstPrinter.c',
2104 'capstone/arch/ARM/ARMMapping.c',
2105 'capstone/arch/ARM/ARMModule.c'
2106 )
2107 endif
2108
2109 # FIXME: This config entry currently depends on a c++ compiler.
2110 # Which is needed for building libvixl, but not for capstone.
2111 if 'CONFIG_ARM_A64_DIS' in config_all_disas
2112 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
2113 capstone_files += files(
2114 'capstone/arch/AArch64/AArch64BaseInfo.c',
2115 'capstone/arch/AArch64/AArch64Disassembler.c',
2116 'capstone/arch/AArch64/AArch64InstPrinter.c',
2117 'capstone/arch/AArch64/AArch64Mapping.c',
2118 'capstone/arch/AArch64/AArch64Module.c'
2119 )
2120 endif
2121
2122 if 'CONFIG_PPC_DIS' in config_all_disas
2123 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
2124 capstone_files += files(
2125 'capstone/arch/PowerPC/PPCDisassembler.c',
2126 'capstone/arch/PowerPC/PPCInstPrinter.c',
2127 'capstone/arch/PowerPC/PPCMapping.c',
2128 'capstone/arch/PowerPC/PPCModule.c'
2129 )
2130 endif
2131
Richard Henderson3d562842020-01-04 07:24:59 +10002132 if 'CONFIG_S390_DIS' in config_all_disas
2133 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
2134 capstone_files += files(
2135 'capstone/arch/SystemZ/SystemZDisassembler.c',
2136 'capstone/arch/SystemZ/SystemZInstPrinter.c',
2137 'capstone/arch/SystemZ/SystemZMapping.c',
2138 'capstone/arch/SystemZ/SystemZModule.c',
2139 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
2140 )
2141 endif
2142
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002143 if 'CONFIG_I386_DIS' in config_all_disas
2144 capstone_data.set('CAPSTONE_HAS_X86', 1)
2145 capstone_files += files(
2146 'capstone/arch/X86/X86Disassembler.c',
2147 'capstone/arch/X86/X86DisassemblerDecoder.c',
2148 'capstone/arch/X86/X86ATTInstPrinter.c',
2149 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07002150 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002151 'capstone/arch/X86/X86Mapping.c',
2152 'capstone/arch/X86/X86Module.c'
2153 )
2154 endif
2155
2156 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
2157
2158 capstone_cargs = [
2159 # FIXME: There does not seem to be a way to completely replace the c_args
2160 # that come from add_project_arguments() -- we can only add to them.
2161 # So: disable all warnings with a big hammer.
2162 '-Wno-error', '-w',
2163
2164 # Include all configuration defines via a header file, which will wind up
2165 # as a dependency on the object file, and thus changes here will result
2166 # in a rebuild.
2167 '-include', 'capstone-defs.h'
2168 ]
2169
2170 libcapstone = static_library('capstone',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01002171 build_by_default: false,
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002172 sources: capstone_files,
2173 c_args: capstone_cargs,
2174 include_directories: 'capstone/include')
2175 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07002176 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002177endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002178
2179slirp = not_found
2180slirp_opt = 'disabled'
2181if have_system
2182 slirp_opt = get_option('slirp')
2183 if slirp_opt in ['enabled', 'auto', 'system']
2184 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01002185 slirp = dependency('slirp', kwargs: static_kwargs,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002186 method: 'pkg-config',
2187 required: slirp_opt == 'system' or
2188 slirp_opt == 'enabled' and not have_internal)
2189 if slirp.found()
2190 slirp_opt = 'system'
2191 elif have_internal
2192 slirp_opt = 'internal'
2193 else
2194 slirp_opt = 'disabled'
2195 endif
2196 endif
2197 if slirp_opt == 'internal'
2198 slirp_deps = []
2199 if targetos == 'windows'
2200 slirp_deps = cc.find_library('iphlpapi')
Marc-André Lureau43f547b2021-05-18 19:51:11 +04002201 elif targetos == 'darwin'
2202 slirp_deps = cc.find_library('resolv')
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002203 endif
2204 slirp_conf = configuration_data()
2205 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
2206 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
2207 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
2208 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
2209 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
2210 slirp_files = [
2211 'slirp/src/arp_table.c',
2212 'slirp/src/bootp.c',
2213 'slirp/src/cksum.c',
2214 'slirp/src/dhcpv6.c',
2215 'slirp/src/dnssearch.c',
2216 'slirp/src/if.c',
2217 'slirp/src/ip6_icmp.c',
2218 'slirp/src/ip6_input.c',
2219 'slirp/src/ip6_output.c',
2220 'slirp/src/ip_icmp.c',
2221 'slirp/src/ip_input.c',
2222 'slirp/src/ip_output.c',
2223 'slirp/src/mbuf.c',
2224 'slirp/src/misc.c',
2225 'slirp/src/ncsi.c',
2226 'slirp/src/ndp_table.c',
2227 'slirp/src/sbuf.c',
2228 'slirp/src/slirp.c',
2229 'slirp/src/socket.c',
2230 'slirp/src/state.c',
2231 'slirp/src/stream.c',
2232 'slirp/src/tcp_input.c',
2233 'slirp/src/tcp_output.c',
2234 'slirp/src/tcp_subr.c',
2235 'slirp/src/tcp_timer.c',
2236 'slirp/src/tftp.c',
2237 'slirp/src/udp.c',
2238 'slirp/src/udp6.c',
2239 'slirp/src/util.c',
2240 'slirp/src/version.c',
2241 'slirp/src/vmstate.c',
2242 ]
2243
2244 configure_file(
2245 input : 'slirp/src/libslirp-version.h.in',
2246 output : 'libslirp-version.h',
2247 configuration: slirp_conf)
2248
2249 slirp_inc = include_directories('slirp', 'slirp/src')
2250 libslirp = static_library('slirp',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01002251 build_by_default: false,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002252 sources: slirp_files,
2253 c_args: slirp_cargs,
2254 include_directories: slirp_inc)
2255 slirp = declare_dependency(link_with: libslirp,
2256 dependencies: slirp_deps,
2257 include_directories: slirp_inc)
2258 endif
2259endif
2260
Daniele Buonoc7153432021-03-03 21:59:38 -05002261# For CFI, we need to compile slirp as a static library together with qemu.
2262# This is because we register slirp functions as callbacks for QEMU Timers.
2263# When using a system-wide shared libslirp, the type information for the
2264# callback is missing and the timer call produces a false positive with CFI.
2265#
2266# Now that slirp_opt has been defined, check if the selected slirp is compatible
2267# with control-flow integrity.
2268if get_option('cfi') and slirp_opt == 'system'
2269 error('Control-Flow Integrity is not compatible with system-wide slirp.' \
2270 + ' Please configure with --enable-slirp=git')
2271endif
2272
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002273fdt = not_found
2274fdt_opt = get_option('fdt')
2275if have_system
2276 if fdt_opt in ['enabled', 'auto', 'system']
2277 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01002278 fdt = cc.find_library('fdt', kwargs: static_kwargs,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002279 required: fdt_opt == 'system' or
2280 fdt_opt == 'enabled' and not have_internal)
2281 if fdt.found() and cc.links('''
2282 #include <libfdt.h>
2283 #include <libfdt_env.h>
Thomas Huthde47b0f2022-01-18 18:05:48 +01002284 int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002285 dependencies: fdt)
2286 fdt_opt = 'system'
Thomas Huth6c228532021-08-27 14:09:00 +02002287 elif fdt_opt == 'system'
2288 error('system libfdt requested, but it is too old (1.5.1 or newer required)')
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002289 elif have_internal
2290 fdt_opt = 'internal'
2291 else
2292 fdt_opt = 'disabled'
Thomas Huth87daf892021-08-27 14:08:59 +02002293 fdt = not_found
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002294 endif
2295 endif
2296 if fdt_opt == 'internal'
2297 fdt_files = files(
2298 'dtc/libfdt/fdt.c',
2299 'dtc/libfdt/fdt_ro.c',
2300 'dtc/libfdt/fdt_wip.c',
2301 'dtc/libfdt/fdt_sw.c',
2302 'dtc/libfdt/fdt_rw.c',
2303 'dtc/libfdt/fdt_strerror.c',
2304 'dtc/libfdt/fdt_empty_tree.c',
2305 'dtc/libfdt/fdt_addresses.c',
2306 'dtc/libfdt/fdt_overlay.c',
2307 'dtc/libfdt/fdt_check.c',
2308 )
2309
2310 fdt_inc = include_directories('dtc/libfdt')
2311 libfdt = static_library('fdt',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01002312 build_by_default: false,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002313 sources: fdt_files,
2314 include_directories: fdt_inc)
2315 fdt = declare_dependency(link_with: libfdt,
2316 include_directories: fdt_inc)
2317 endif
2318endif
2319if not fdt.found() and fdt_required.length() > 0
2320 error('fdt not available but required by targets ' + ', '.join(fdt_required))
2321endif
2322
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002323config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002324config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002325config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002326
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002327#####################
2328# Generated sources #
2329#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002330
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002331genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002332
Marc-André Lureau3f885652019-07-15 18:06:04 +04002333hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04002334shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002335qapi_gen = find_program('scripts/qapi-gen.py')
Paolo Bonzini654d6b02021-02-09 14:59:26 +01002336qapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py',
2337 meson.current_source_dir() / 'scripts/qapi/commands.py',
2338 meson.current_source_dir() / 'scripts/qapi/common.py',
2339 meson.current_source_dir() / 'scripts/qapi/error.py',
2340 meson.current_source_dir() / 'scripts/qapi/events.py',
2341 meson.current_source_dir() / 'scripts/qapi/expr.py',
2342 meson.current_source_dir() / 'scripts/qapi/gen.py',
2343 meson.current_source_dir() / 'scripts/qapi/introspect.py',
2344 meson.current_source_dir() / 'scripts/qapi/parser.py',
2345 meson.current_source_dir() / 'scripts/qapi/schema.py',
2346 meson.current_source_dir() / 'scripts/qapi/source.py',
2347 meson.current_source_dir() / 'scripts/qapi/types.py',
2348 meson.current_source_dir() / 'scripts/qapi/visit.py',
2349 meson.current_source_dir() / 'scripts/qapi/common.py',
2350 meson.current_source_dir() / 'scripts/qapi-gen.py'
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002351]
2352
2353tracetool = [
2354 python, files('scripts/tracetool.py'),
Paolo Bonzini9c29b742021-10-07 15:08:14 +02002355 '--backend=' + ','.join(get_option('trace_backends'))
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002356]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002357tracetool_depends = files(
2358 'scripts/tracetool/backend/log.py',
2359 'scripts/tracetool/backend/__init__.py',
2360 'scripts/tracetool/backend/dtrace.py',
2361 'scripts/tracetool/backend/ftrace.py',
2362 'scripts/tracetool/backend/simple.py',
2363 'scripts/tracetool/backend/syslog.py',
2364 'scripts/tracetool/backend/ust.py',
2365 'scripts/tracetool/format/tcg_h.py',
2366 'scripts/tracetool/format/ust_events_c.py',
2367 'scripts/tracetool/format/ust_events_h.py',
2368 'scripts/tracetool/format/__init__.py',
2369 'scripts/tracetool/format/d.py',
2370 'scripts/tracetool/format/tcg_helper_c.py',
2371 'scripts/tracetool/format/simpletrace_stap.py',
2372 'scripts/tracetool/format/c.py',
2373 'scripts/tracetool/format/h.py',
2374 'scripts/tracetool/format/tcg_helper_h.py',
2375 'scripts/tracetool/format/log_stap.py',
2376 'scripts/tracetool/format/stap.py',
2377 'scripts/tracetool/format/tcg_helper_wrapper_h.py',
2378 'scripts/tracetool/__init__.py',
2379 'scripts/tracetool/transform.py',
2380 'scripts/tracetool/vcpu.py'
2381)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002382
Marc-André Lureau2c273f32019-07-15 17:10:19 +04002383qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
2384 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02002385 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04002386qemu_version = custom_target('qemu-version.h',
2387 output: 'qemu-version.h',
2388 command: qemu_version_cmd,
2389 capture: true,
2390 build_by_default: true,
2391 build_always_stale: true)
2392genh += qemu_version
2393
Marc-André Lureau3f885652019-07-15 18:06:04 +04002394hxdep = []
2395hx_headers = [
2396 ['qemu-options.hx', 'qemu-options.def'],
2397 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
2398]
2399if have_system
2400 hx_headers += [
2401 ['hmp-commands.hx', 'hmp-commands.h'],
2402 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
2403 ]
2404endif
2405foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002406 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04002407 input: files(d[0]),
2408 output: d[1],
2409 capture: true,
2410 build_by_default: true, # to be removed when added to a target
2411 command: [hxtool, '-h', '@INPUT0@'])
2412endforeach
2413genh += hxdep
2414
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002415###################
2416# Collect sources #
2417###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002418
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02002419authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002420blockdev_ss = ss.source_set()
2421block_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002422chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002423common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002424crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02002425hwcore_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002426io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002427qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02002428qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002429softmmu_ss = ss.source_set()
2430specific_fuzz_ss = ss.source_set()
2431specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002432stub_ss = ss.source_set()
2433trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002434user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002435util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002436
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002437# accel modules
2438qtest_module_ss = ss.source_set()
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002439tcg_module_ss = ss.source_set()
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002440
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002441modules = {}
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002442target_modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002443hw_arch = {}
2444target_arch = {}
2445target_softmmu_arch = {}
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02002446target_user_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002447
2448###############
2449# Trace files #
2450###############
2451
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002452# TODO: add each directory to the subdirs from its own meson.build, once
2453# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002454trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002455 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01002456 'qapi',
2457 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002458 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01002459 'util',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002460]
Warner Losh6ddc1ab2022-01-08 17:37:23 -07002461if have_linux_user
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002462 trace_events_subdirs += [ 'linux-user' ]
2463endif
Warner Losh6ddc1ab2022-01-08 17:37:23 -07002464if have_bsd_user
2465 trace_events_subdirs += [ 'bsd-user' ]
2466endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002467if have_block
2468 trace_events_subdirs += [
2469 'authz',
2470 'block',
2471 'io',
2472 'nbd',
2473 'scsi',
2474 ]
2475endif
2476if have_system
2477 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002478 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002479 'audio',
2480 'backends',
2481 'backends/tpm',
2482 'chardev',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002483 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002484 'hw/9pfs',
2485 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08002486 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002487 'hw/alpha',
2488 'hw/arm',
2489 'hw/audio',
2490 'hw/block',
2491 'hw/block/dataplane',
2492 'hw/char',
2493 'hw/display',
2494 'hw/dma',
2495 'hw/hppa',
2496 'hw/hyperv',
2497 'hw/i2c',
2498 'hw/i386',
2499 'hw/i386/xen',
2500 'hw/ide',
2501 'hw/input',
2502 'hw/intc',
2503 'hw/isa',
2504 'hw/mem',
2505 'hw/mips',
2506 'hw/misc',
2507 'hw/misc/macio',
2508 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08002509 'hw/net/can',
Mark Cave-Aylandce0e6a22021-09-24 08:37:55 +01002510 'hw/nubus',
Klaus Jensen88eea452021-04-14 22:14:30 +02002511 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002512 'hw/nvram',
2513 'hw/pci',
2514 'hw/pci-host',
2515 'hw/ppc',
2516 'hw/rdma',
2517 'hw/rdma/vmw',
2518 'hw/rtc',
2519 'hw/s390x',
2520 'hw/scsi',
2521 'hw/sd',
BALATON Zoltanad52cfc2021-10-29 23:02:09 +02002522 'hw/sh4',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002523 'hw/sparc',
2524 'hw/sparc64',
2525 'hw/ssi',
2526 'hw/timer',
2527 'hw/tpm',
2528 'hw/usb',
2529 'hw/vfio',
2530 'hw/virtio',
2531 'hw/watchdog',
2532 'hw/xen',
2533 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002534 'migration',
2535 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02002536 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002537 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05002538 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002539 ]
2540endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002541if have_system or have_user
2542 trace_events_subdirs += [
2543 'accel/tcg',
2544 'hw/core',
2545 'target/arm',
Alexander Grafa1477da2021-09-16 17:53:58 +02002546 'target/arm/hvf',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002547 'target/hppa',
2548 'target/i386',
2549 'target/i386/kvm',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02002550 'target/mips/tcg',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002551 'target/ppc',
2552 'target/riscv',
2553 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08002554 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002555 'target/sparc',
2556 ]
2557endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002558
Marc-André Lureau0df750e2020-11-25 14:06:37 +04002559vhost_user = not_found
2560if 'CONFIG_VHOST_USER' in config_host
2561 libvhost_user = subproject('libvhost-user')
2562 vhost_user = libvhost_user.get_variable('vhost_user_dep')
2563endif
2564
Vladimir Sementsov-Ogievskiyb83a80e2022-01-26 17:11:27 +01002565# NOTE: the trace/ subdirectory needs the qapi_trace_events variable
2566# that is filled in by qapi/.
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002567subdir('qapi')
2568subdir('qobject')
2569subdir('stubs')
2570subdir('trace')
2571subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04002572subdir('qom')
2573subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002574subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04002575subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002576
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002577
2578if enable_modules
2579 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
2580 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
2581endif
2582
Paolo Bonzini2becc362020-02-03 11:42:03 +01002583stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002584
2585util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01002586util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002587libqemuutil = static_library('qemuutil',
2588 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +02002589 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002590qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04002591 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002592
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01002593if have_system or have_user
2594 decodetree = generator(find_program('scripts/decodetree.py'),
2595 output: 'decode-@BASENAME@.c.inc',
2596 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
2597 subdir('libdecnumber')
2598 subdir('target')
2599endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002600
Paolo Bonzini478e9432020-08-17 12:47:55 +02002601subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04002602subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04002603subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04002604subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04002605subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04002606
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002607if have_block
2608 block_ss.add(files(
2609 'block.c',
2610 'blockjob.c',
2611 'job.c',
2612 'qemu-io-cmds.c',
2613 ))
2614 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002615
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002616 subdir('nbd')
2617 subdir('scsi')
2618 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002619
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002620 blockdev_ss.add(files(
2621 'blockdev.c',
2622 'blockdev-nbd.c',
2623 'iothread.c',
2624 'job-qmp.c',
2625 ), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02002626
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002627 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
2628 # os-win32.c does not
2629 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
2630 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
2631endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02002632
2633common_ss.add(files('cpus-common.c'))
2634
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02002635subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002636
Richard Hendersonf3433462020-09-12 10:47:33 -07002637common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02002638specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002639
Richard Henderson44b99a62021-03-22 12:24:26 +01002640# Work around a gcc bug/misfeature wherein constant propagation looks
2641# through an alias:
2642# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
2643# to guess that a const variable is always zero. Without lto, this is
2644# impossible, as the alias is restricted to page-vary-common.c. Indeed,
2645# without lto, not even the alias is required -- we simply use different
2646# declarations in different compilation units.
2647pagevary = files('page-vary-common.c')
2648if get_option('b_lto')
2649 pagevary_flags = ['-fno-lto']
2650 if get_option('cfi')
2651 pagevary_flags += '-fno-sanitize=cfi-icall'
2652 endif
2653 pagevary = static_library('page-vary-common', sources: pagevary,
2654 c_args: pagevary_flags)
2655 pagevary = declare_dependency(link_with: pagevary)
2656endif
2657common_ss.add(pagevary)
Richard Henderson6670d4d2021-03-22 12:24:24 +01002658specific_ss.add(files('page-vary.c'))
2659
Marc-André Lureauab318052019-07-24 19:23:16 +04002660subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04002661subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04002662subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002663subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04002664subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04002665subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00002666subdir('semihosting')
Marc-André Lureau582ea952019-08-15 15:15:32 +04002667subdir('hw')
Richard Henderson104cc2c2021-03-08 12:04:33 -08002668subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08002669subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04002670subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002671subdir('plugins')
Richard Hendersonbbf15aa2021-11-17 16:14:00 +01002672subdir('ebpf')
2673
2674common_user_inc = []
2675
2676subdir('common-user')
Marc-André Lureaub309c322019-08-18 19:20:37 +04002677subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04002678subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002679
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002680# needed for fuzzing binaries
2681subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002682subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002683
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002684# accel modules
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002685tcg_real_module_ss = ss.source_set()
2686tcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
2687specific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
2688target_modules += { 'accel' : { 'qtest': qtest_module_ss,
2689 'tcg': tcg_real_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002690
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002691########################
2692# Library dependencies #
2693########################
2694
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002695modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02002696modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002697modinfo_files = []
2698
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002699block_mods = []
2700softmmu_mods = []
2701foreach d, list : modules
2702 foreach m, module_ss : list
2703 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02002704 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002705 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
2706 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
2707 if d == 'block'
2708 block_mods += sl
2709 else
2710 softmmu_mods += sl
2711 endif
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002712 if module_ss.sources() != []
2713 # FIXME: Should use sl.extract_all_objects(recursive: true) as
2714 # input. Sources can be used multiple times but objects are
2715 # unique when it comes to lookup in compile_commands.json.
2716 # Depnds on a mesion version with
2717 # https://github.com/mesonbuild/meson/pull/8900
2718 modinfo_files += custom_target(d + '-' + m + '.modinfo',
2719 output: d + '-' + m + '.modinfo',
Paolo Bonziniac347112021-07-21 18:51:57 +02002720 input: module_ss.sources() + genh,
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002721 capture: true,
Paolo Bonziniac347112021-07-21 18:51:57 +02002722 command: [modinfo_collect, module_ss.sources()])
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002723 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002724 else
2725 if d == 'block'
2726 block_ss.add_all(module_ss)
2727 else
2728 softmmu_ss.add_all(module_ss)
2729 endif
2730 endif
2731 endforeach
2732endforeach
2733
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002734foreach d, list : target_modules
2735 foreach m, module_ss : list
2736 if enable_modules and targetos != 'windows'
2737 foreach target : target_dirs
2738 if target.endswith('-softmmu')
2739 config_target = config_target_mak[target]
2740 config_target += config_host
2741 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2742 c_args = ['-DNEED_CPU_H',
2743 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2744 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
2745 target_module_ss = module_ss.apply(config_target, strict: false)
2746 if target_module_ss.sources() != []
2747 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
2748 sl = static_library(module_name,
2749 [genh, target_module_ss.sources()],
2750 dependencies: [modulecommon, target_module_ss.dependencies()],
2751 include_directories: target_inc,
2752 c_args: c_args,
2753 pic: true)
2754 softmmu_mods += sl
2755 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
2756 modinfo_files += custom_target(module_name + '.modinfo',
2757 output: module_name + '.modinfo',
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02002758 input: target_module_ss.sources() + genh,
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002759 capture: true,
Gerd Hoffmann917ddc22021-07-23 14:01:56 +02002760 command: [modinfo_collect, '--target', target, target_module_ss.sources()])
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002761 endif
2762 endif
2763 endforeach
2764 else
2765 specific_ss.add_all(module_ss)
2766 endif
2767 endforeach
2768endforeach
2769
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02002770if enable_modules
2771 modinfo_src = custom_target('modinfo.c',
2772 output: 'modinfo.c',
2773 input: modinfo_files,
2774 command: [modinfo_generate, '@INPUT@'],
2775 capture: true)
2776 modinfo_lib = static_library('modinfo', modinfo_src)
2777 modinfo_dep = declare_dependency(link_whole: modinfo_lib)
2778 softmmu_ss.add(modinfo_dep)
2779endif
2780
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002781nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08002782undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002783block_syms = custom_target('block.syms', output: 'block.syms',
2784 input: [libqemuutil, block_mods],
2785 capture: true,
2786 command: [undefsym, nm, '@INPUT@'])
2787qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
2788 input: [libqemuutil, softmmu_mods],
2789 capture: true,
2790 command: [undefsym, nm, '@INPUT@'])
2791
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02002792qom_ss = qom_ss.apply(config_host, strict: false)
2793libqom = static_library('qom', qom_ss.sources() + genh,
2794 dependencies: [qom_ss.dependencies()],
2795 name_suffix: 'fa')
2796
2797qom = declare_dependency(link_whole: libqom)
2798
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02002799authz_ss = authz_ss.apply(config_host, strict: false)
2800libauthz = static_library('authz', authz_ss.sources() + genh,
2801 dependencies: [authz_ss.dependencies()],
2802 name_suffix: 'fa',
2803 build_by_default: false)
2804
2805authz = declare_dependency(link_whole: libauthz,
2806 dependencies: qom)
2807
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002808crypto_ss = crypto_ss.apply(config_host, strict: false)
2809libcrypto = static_library('crypto', crypto_ss.sources() + genh,
2810 dependencies: [crypto_ss.dependencies()],
2811 name_suffix: 'fa',
2812 build_by_default: false)
2813
2814crypto = declare_dependency(link_whole: libcrypto,
2815 dependencies: [authz, qom])
2816
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002817io_ss = io_ss.apply(config_host, strict: false)
2818libio = static_library('io', io_ss.sources() + genh,
2819 dependencies: [io_ss.dependencies()],
2820 link_with: libqemuutil,
2821 name_suffix: 'fa',
2822 build_by_default: false)
2823
2824io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
2825
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02002826libmigration = static_library('migration', sources: migration_files + genh,
2827 name_suffix: 'fa',
2828 build_by_default: false)
2829migration = declare_dependency(link_with: libmigration,
2830 dependencies: [zlib, qom, io])
2831softmmu_ss.add(migration)
2832
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002833block_ss = block_ss.apply(config_host, strict: false)
2834libblock = static_library('block', block_ss.sources() + genh,
2835 dependencies: block_ss.dependencies(),
2836 link_depends: block_syms,
2837 name_suffix: 'fa',
2838 build_by_default: false)
2839
2840block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002841 link_args: '@block.syms',
2842 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002843
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002844blockdev_ss = blockdev_ss.apply(config_host, strict: false)
2845libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
2846 dependencies: blockdev_ss.dependencies(),
2847 name_suffix: 'fa',
2848 build_by_default: false)
2849
2850blockdev = declare_dependency(link_whole: [libblockdev],
2851 dependencies: [block])
2852
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002853qmp_ss = qmp_ss.apply(config_host, strict: false)
2854libqmp = static_library('qmp', qmp_ss.sources() + genh,
2855 dependencies: qmp_ss.dependencies(),
2856 name_suffix: 'fa',
2857 build_by_default: false)
2858
2859qmp = declare_dependency(link_whole: [libqmp])
2860
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002861libchardev = static_library('chardev', chardev_ss.sources() + genh,
2862 name_suffix: 'fa',
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002863 dependencies: [gnutls],
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002864 build_by_default: false)
2865
2866chardev = declare_dependency(link_whole: libchardev)
2867
Philippe Mathieu-Daudéf73fb062021-10-28 16:34:19 +02002868hwcore_ss = hwcore_ss.apply(config_host, strict: false)
2869libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02002870 name_suffix: 'fa',
2871 build_by_default: false)
2872hwcore = declare_dependency(link_whole: libhwcore)
2873common_ss.add(hwcore)
2874
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02002875###########
2876# Targets #
2877###########
2878
Paolo Bonzinifb721762022-01-07 13:00:44 +01002879emulator_modules = []
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002880foreach m : block_mods + softmmu_mods
Paolo Bonzinifb721762022-01-07 13:00:44 +01002881 emulator_modules += shared_module(m.name(),
2882 build_by_default: true,
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002883 name_prefix: '',
2884 link_whole: m,
2885 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002886 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002887endforeach
2888
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002889softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002890common_ss.add(qom, qemuutil)
2891
2892common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01002893common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
2894
2895common_all = common_ss.apply(config_all, strict: false)
2896common_all = static_library('common',
2897 build_by_default: false,
2898 sources: common_all.sources() + genh,
Paolo Bonzini9d24fb72021-12-21 16:09:54 +01002899 include_directories: common_user_inc,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09002900 implicit_include_directories: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002901 dependencies: common_all.dependencies(),
2902 name_suffix: 'fa')
2903
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002904feature_to_c = find_program('scripts/feature_to_c.sh')
2905
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002906emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002907foreach target : target_dirs
2908 config_target = config_target_mak[target]
2909 target_name = config_target['TARGET_NAME']
Paolo Bonziniffb91f62021-11-08 15:44:39 +01002910 target_base_arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02002911 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002912 arch_deps = []
2913 c_args = ['-DNEED_CPU_H',
2914 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2915 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04002916 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01002917
Paolo Bonzini859aef02020-08-04 18:14:26 +02002918 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01002919 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2920 if targetos == 'linux'
2921 target_inc += include_directories('linux-headers', is_system: true)
2922 endif
2923 if target.endswith('-softmmu')
2924 qemu_target_name = 'qemu-system-' + target_name
2925 target_type='system'
Paolo Bonziniffb91f62021-11-08 15:44:39 +01002926 t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002927 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002928 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002929
Paolo Bonziniffb91f62021-11-08 15:44:39 +01002930 hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch
Marc-André Lureau2c442202019-08-17 13:55:58 +04002931 hw = hw_arch[hw_dir].apply(config_target, strict: false)
2932 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002933 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04002934
Paolo Bonzini2becc362020-02-03 11:42:03 +01002935 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002936 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002937 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04002938 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002939 target_type='user'
Paolo Bonzinia3a576b2021-12-21 16:23:55 +01002940 target_inc += common_user_inc
Paolo Bonzini2becc362020-02-03 11:42:03 +01002941 qemu_target_name = 'qemu-' + target_name
Paolo Bonziniffb91f62021-11-08 15:44:39 +01002942 if target_base_arch in target_user_arch
2943 t = target_user_arch[target_base_arch].apply(config_target, strict: false)
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02002944 arch_srcs += t.sources()
2945 arch_deps += t.dependencies()
2946 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002947 if 'CONFIG_LINUX_USER' in config_target
2948 base_dir = 'linux-user'
Warner Loshe2a74722021-08-03 17:17:17 -06002949 endif
2950 if 'CONFIG_BSD_USER' in config_target
Paolo Bonzini2becc362020-02-03 11:42:03 +01002951 base_dir = 'bsd-user'
Warner Loshe2a74722021-08-03 17:17:17 -06002952 target_inc += include_directories('bsd-user/' / targetos)
Warner Losh85fc1b52022-01-08 17:27:34 -07002953 target_inc += include_directories('bsd-user/host/' / host_arch)
Warner Loshe2a74722021-08-03 17:17:17 -06002954 dir = base_dir / abi
Warner Losh19bf1292021-11-04 16:34:48 -06002955 arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002956 endif
2957 target_inc += include_directories(
2958 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04002959 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002960 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04002961 if 'CONFIG_LINUX_USER' in config_target
2962 dir = base_dir / abi
2963 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
2964 if config_target.has_key('TARGET_SYSTBL_ABI')
2965 arch_srcs += \
2966 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
2967 extra_args : config_target['TARGET_SYSTBL_ABI'])
2968 endif
2969 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002970 endif
2971
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002972 if 'TARGET_XML_FILES' in config_target
2973 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
2974 output: target + '-gdbstub-xml.c',
2975 input: files(config_target['TARGET_XML_FILES'].split()),
2976 command: [feature_to_c, '@INPUT@'],
2977 capture: true)
2978 arch_srcs += gdbstub_xml
2979 endif
2980
Paolo Bonziniffb91f62021-11-08 15:44:39 +01002981 t = target_arch[target_base_arch].apply(config_target, strict: false)
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002982 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002983 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002984
Paolo Bonzini2becc362020-02-03 11:42:03 +01002985 target_common = common_ss.apply(config_target, strict: false)
2986 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002987 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002988
Paolo Bonzini2becc362020-02-03 11:42:03 +01002989 target_specific = specific_ss.apply(config_target, strict: false)
2990 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002991 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002992
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002993 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02002994 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002995 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002996 objects: objects,
2997 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002998 c_args: c_args,
2999 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01003000 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003001
3002 if target.endswith('-softmmu')
3003 execs = [{
3004 'name': 'qemu-system-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003005 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003006 'sources': files('softmmu/main.c'),
3007 'dependencies': []
3008 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01003009 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003010 execs += [{
3011 'name': 'qemu-system-' + target_name + 'w',
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003012 'win_subsystem': 'windows',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003013 'sources': files('softmmu/main.c'),
3014 'dependencies': []
3015 }]
3016 endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02003017 if get_option('fuzzing')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003018 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
3019 execs += [{
3020 'name': 'qemu-fuzz-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003021 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003022 'sources': specific_fuzz.sources(),
3023 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003024 }]
3025 endif
3026 else
3027 execs = [{
3028 'name': 'qemu-' + target_name,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003029 'win_subsystem': 'console',
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003030 'sources': [],
3031 'dependencies': []
3032 }]
3033 endif
3034 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01003035 exe_name = exe['name']
John Arbuckle3983a762021-07-05 15:53:28 -04003036 if targetos == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01003037 exe_name += '-unsigned'
3038 endif
3039
3040 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09003041 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003042 c_args: c_args,
3043 dependencies: arch_deps + deps + exe['dependencies'],
3044 objects: lib.extract_all_objects(recursive: true),
3045 link_language: link_language,
3046 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
3047 link_args: link_args,
Paolo Bonzini654d6b02021-02-09 14:59:26 +01003048 win_subsystem: exe['win_subsystem'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003049
John Arbuckle3983a762021-07-05 15:53:28 -04003050 if targetos == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003051 icon = 'pc-bios/qemu.rsrc'
3052 build_input = [emulator, files(icon)]
3053 install_input = [
3054 get_option('bindir') / exe_name,
3055 meson.current_source_dir() / icon
3056 ]
3057 if 'CONFIG_HVF' in config_target
3058 entitlements = 'accel/hvf/entitlements.plist'
3059 build_input += files(entitlements)
3060 install_input += meson.current_source_dir() / entitlements
3061 endif
3062
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003063 entitlement = find_program('scripts/entitlement.sh')
Alexander Graf8a74ce62021-01-20 23:44:34 +01003064 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003065 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01003066 output: exe['name'],
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003067 command: [entitlement, '@OUTPUT@', '@INPUT@'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01003068 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09003069
Philippe Mathieu-Daudé235b5232022-01-22 01:20:52 +01003070 meson.add_install_script(entitlement, '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09003071 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09003072 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01003073 else
3074 emulators += {exe['name']: emulator}
3075 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003076
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003077 if stap.found()
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003078 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003079 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
3080 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003081 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
3082 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
3083 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003084 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003085 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02003086 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003087 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003088 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003089 command: [
3090 tracetool, '--group=all', '--format=' + stp['fmt'],
3091 '--binary=' + stp['bin'],
3092 '--target-name=' + target_name,
3093 '--target-type=' + target_type,
3094 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01003095 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00003096 ],
3097 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04003098 endforeach
3099 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02003100 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01003101endforeach
3102
Paolo Bonzini931049b2020-02-05 09:44:24 +01003103# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003104
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01003105if 'CONFIG_PLUGIN' in config_host
3106 install_headers('include/qemu/qemu-plugin.h')
3107endif
3108
Paolo Bonzinif15bff22019-07-18 13:19:02 +02003109if 'CONFIG_GUEST_AGENT' in config_host
3110 subdir('qga')
Paolo Bonzinib846ab72021-01-21 11:49:04 +01003111elif get_option('guest_agent_msi').enabled()
3112 error('Guest agent MSI requested, but the guest agent is not being built')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02003113endif
3114
Laurent Vivier9755c942020-08-24 17:24:30 +02003115# Don't build qemu-keymap if xkbcommon is not explicitly enabled
3116# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02003117if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04003118 # used for the update-keymaps target, so include rules even if !have_tools
3119 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
3120 dependencies: [qemuutil, xkbcommon], install: have_tools)
3121endif
3122
Paolo Bonzini931049b2020-02-05 09:44:24 +01003123if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003124 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
3125 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
3126 qemu_io = executable('qemu-io', files('qemu-io.c'),
3127 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01003128 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06003129 dependencies: [blockdev, qemuutil, gnutls, selinux],
3130 install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04003131
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02003132 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003133 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04003134 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02003135
Marc-André Lureau157e7b12019-07-15 14:50:58 +04003136 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
3137 dependencies: qemuutil,
3138 install: true)
3139
Paolo Bonzini931049b2020-02-05 09:44:24 +01003140 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02003141 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02003142 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04003143 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02003144 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01003145 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003146
3147 if targetos == 'linux'
3148 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
3149 dependencies: [qemuutil, libcap_ng],
3150 install: true,
3151 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003152
3153 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
3154 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02003155 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04003156 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04003157 endif
3158
Paolo Bonziniccd250a2021-06-03 12:50:17 +02003159 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04003160 subdir('contrib/ivshmem-client')
3161 subdir('contrib/ivshmem-server')
3162 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01003163endif
3164
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04003165subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01003166subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04003167subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02003168subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08003169subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01003170if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04003171 subdir('po')
3172endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01003173
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003174if host_machine.system() == 'windows'
3175 nsis_cmd = [
3176 find_program('scripts/nsis.py'),
3177 '@OUTPUT@',
3178 get_option('prefix'),
3179 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01003180 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003181 '--',
3182 '-DDISPLAYVERSION=' + meson.project_version(),
3183 ]
3184 if build_docs
3185 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
3186 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01003187 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04003188 nsis_cmd += '-DCONFIG_GTK=y'
3189 endif
3190
3191 nsis = custom_target('nsis',
3192 output: 'qemu-setup-' + meson.project_version() + '.exe',
3193 input: files('qemu.nsi'),
3194 build_always_stale: true,
3195 command: nsis_cmd + ['@INPUT@'])
3196 alias_target('installer', nsis)
3197endif
3198
Paolo Bonzinia0c91622020-10-07 11:01:51 -04003199#########################
3200# Configuration summary #
3201#########################
3202
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003203# Directories
Paolo Bonzinif9332752020-02-03 13:28:38 +01003204summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003205summary_info += {'Install prefix': get_option('prefix')}
3206summary_info += {'BIOS directory': qemu_datadir}
3207summary_info += {'firmware path': get_option('qemu_firmwarepath')}
3208summary_info += {'binary directory': get_option('bindir')}
3209summary_info += {'library directory': get_option('libdir')}
3210summary_info += {'module directory': qemu_moddir}
3211summary_info += {'libexec directory': get_option('libexecdir')}
3212summary_info += {'include directory': get_option('includedir')}
3213summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003214if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04003215 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04003216 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003217else
3218 summary_info += {'local state directory': 'queried at runtime'}
3219endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04003220summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003221summary_info += {'Build directory': meson.current_build_dir()}
3222summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003223summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003224summary(summary_info, bool_yn: true, section: 'Directories')
3225
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003226# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01003227summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003228summary_info += {'git': config_host['GIT']}
3229summary_info += {'make': config_host['MAKE']}
3230summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003231summary_info += {'sphinx-build': sphinx_build}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003232if config_host.has_key('HAVE_GDB_BIN')
3233 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
3234endif
3235summary_info += {'genisoimage': config_host['GENISOIMAGE']}
3236if targetos == 'windows' and config_host.has_key('CONFIG_GUEST_AGENT')
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003237 summary_info += {'wixl': wixl}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003238endif
Joelle van Dyneb8e0c492021-03-15 11:03:41 -07003239if slirp_opt != 'disabled' and 'CONFIG_SLIRP_SMBD' in config_host
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003240 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
3241endif
3242summary(summary_info, bool_yn: true, section: 'Host binaries')
3243
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003244# Configurable features
3245summary_info = {}
3246summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003247summary_info += {'system-mode emulation': have_system}
3248summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003249summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003250summary_info += {'Install blobs': get_option('install_blobs')}
3251summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
3252if config_host.has_key('CONFIG_MODULES')
3253 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
3254endif
Paolo Bonzini537b7242021-10-07 15:08:12 +02003255summary_info += {'fuzzing support': get_option('fuzzing')}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003256if have_system
Paolo Bonzini87430d52021-10-07 15:06:09 +02003257 summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003258endif
Paolo Bonzini9c29b742021-10-07 15:08:14 +02003259summary_info += {'Trace backends': ','.join(get_option('trace_backends'))}
3260if 'simple' in get_option('trace_backends')
3261 summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003262endif
Marc-André Lureau142ca622021-07-15 11:53:53 +04003263summary_info += {'D-Bus display': dbus_display}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01003264summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
3265summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
3266summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
3267summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
3268summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
3269summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
3270summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
3271summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
3272summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
3273summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
3274summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
3275summary(summary_info, bool_yn: true, section: 'Configurable features')
3276
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003277# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01003278summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003279summary_info += {'host CPU': cpu}
3280summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01003281summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
3282summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003283if link_language == 'cpp'
Alex Bennée63de9352021-05-27 17:03:15 +01003284 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003285else
3286 summary_info += {'C++ compiler': false}
3287endif
3288if targetos == 'darwin'
Alex Bennée63de9352021-05-27 17:03:15 +01003289 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003290endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003291if targetos == 'windows'
3292 if 'WIN_SDK' in config_host
3293 summary_info += {'Windows SDK': config_host['WIN_SDK']}
3294 endif
3295endif
Paolo Bonzini47b30832020-09-23 05:26:17 -04003296summary_info += {'CFLAGS': ' '.join(get_option('c_args')
3297 + ['-O' + get_option('optimization')]
3298 + (get_option('debug') ? ['-g'] : []))}
3299if link_language == 'cpp'
3300 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
3301 + ['-O' + get_option('optimization')]
3302 + (get_option('debug') ? ['-g'] : []))}
3303endif
3304link_args = get_option(link_language + '_link_args')
3305if link_args.length() > 0
3306 summary_info += {'LDFLAGS': ' '.join(link_args)}
3307endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01003308summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
3309summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003310summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05003311summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003312summary_info += {'PIE': get_option('b_pie')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02003313summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003314summary_info += {'malloc trim support': has_malloc_trim}
3315summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003316summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
3317summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
3318summary_info += {'memory allocator': get_option('malloc')}
3319summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
3320summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
3321summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
3322summary_info += {'gcov': get_option('b_coverage')}
3323summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
3324summary_info += {'CFI support': get_option('cfi')}
3325if get_option('cfi')
3326 summary_info += {'CFI debug support': get_option('cfi_debug')}
3327endif
3328summary_info += {'strip binaries': get_option('strip')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003329summary_info += {'sparse': sparse}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003330summary_info += {'mingw32 support': targetos == 'windows'}
Alex Bennée49e85652021-02-22 10:14:50 +00003331
3332# snarf the cross-compilation information for tests
3333foreach target: target_dirs
3334 tcg_mak = meson.current_build_dir() / 'tests/tcg' / 'config-' + target + '.mak'
3335 if fs.exists(tcg_mak)
3336 config_cross_tcg = keyval.load(tcg_mak)
3337 target = config_cross_tcg['TARGET_NAME']
3338 compiler = ''
3339 if 'DOCKER_CROSS_CC_GUEST' in config_cross_tcg
3340 summary_info += {target + ' tests': config_cross_tcg['DOCKER_CROSS_CC_GUEST'] +
3341 ' via ' + config_cross_tcg['DOCKER_IMAGE']}
3342 elif 'CROSS_CC_GUEST' in config_cross_tcg
3343 summary_info += {target + ' tests'
3344 : config_cross_tcg['CROSS_CC_GUEST'] }
3345 endif
3346 endif
3347endforeach
3348
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003349summary(summary_info, bool_yn: true, section: 'Compilation')
3350
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003351# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003352summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003353if have_system
3354 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
3355 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
3356 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
3357 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
Reinoud Zandijk74a414a2021-04-02 22:25:32 +02003358 summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003359 summary_info += {'Xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
3360 if config_host.has_key('CONFIG_XEN_BACKEND')
3361 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
3362 endif
3363endif
3364summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
3365if config_all.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01003366 if get_option('tcg_interpreter')
Philippe Mathieu-Daudéf1f727a2021-11-06 12:14:57 +01003367 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'}
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01003368 else
3369 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
3370 endif
Alex Bennée029aa682021-07-09 15:29:53 +01003371 summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003372 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003373endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003374summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003375if have_system
3376 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01003377 summary_info += {'out of process emulation': multiprocess_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003378endif
3379summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
3380
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003381# Block layer
3382summary_info = {}
3383summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
3384summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
3385if have_block
3386 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
3387 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
Kevin Wolfe5f05f82021-07-09 18:41:41 +02003388 summary_info += {'Use block whitelist in tools': config_host.has_key('CONFIG_BDRV_WHITELIST_TOOLS')}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003389 summary_info += {'VirtFS support': have_virtfs}
3390 summary_info += {'build virtiofs daemon': have_virtiofsd}
3391 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
3392 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
3393 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
3394 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
3395 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
3396 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
3397 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
3398 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
3399 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
3400 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003401 summary_info += {'FUSE exports': fuse}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01003402endif
3403summary(summary_info, bool_yn: true, section: 'Block layer support')
3404
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003405# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01003406summary_info = {}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003407summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003408summary_info += {'GNUTLS support': gnutls}
3409if gnutls.found()
3410 summary_info += {' GNUTLS crypto': gnutls_crypto.found()}
3411endif
3412summary_info += {'libgcrypt': gcrypt}
3413summary_info += {'nettle': nettle}
Paolo Bonzini57612512021-06-03 11:15:26 +02003414if nettle.found()
3415 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003416endif
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003417summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
3418summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
3419summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
3420summary(summary_info, bool_yn: true, section: 'Crypto')
3421
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01003422# Libraries
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003423summary_info = {}
3424if targetos == 'darwin'
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003425 summary_info += {'Cocoa support': cocoa}
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003426endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003427summary_info += {'SDL support': sdl}
3428summary_info += {'SDL image support': sdl_image}
3429summary_info += {'GTK support': gtk}
3430summary_info += {'pixman': pixman}
3431summary_info += {'VTE support': vte}
3432summary_info += {'slirp support': slirp_opt == 'internal' ? slirp_opt : slirp}
3433summary_info += {'libtasn1': tasn1}
3434summary_info += {'PAM': pam}
3435summary_info += {'iconv support': iconv}
3436summary_info += {'curses support': curses}
3437summary_info += {'virgl support': virgl}
3438summary_info += {'curl support': curl}
3439summary_info += {'Multipath support': mpathpersist}
3440summary_info += {'VNC support': vnc}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01003441if vnc.found()
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003442 summary_info += {'VNC SASL support': sasl}
3443 summary_info += {'VNC JPEG support': jpeg}
3444 summary_info += {'VNC PNG support': png}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003445endif
Paolo Bonzini87430d52021-10-07 15:06:09 +02003446if targetos not in ['darwin', 'haiku', 'windows']
3447 summary_info += {'OSS support': oss}
3448elif targetos == 'darwin'
3449 summary_info += {'CoreAudio support': coreaudio}
3450elif targetos == 'windows'
3451 summary_info += {'DirectSound support': dsound}
3452endif
3453if targetos == 'linux'
3454 summary_info += {'ALSA support': alsa}
3455 summary_info += {'PulseAudio support': pulse}
3456endif
3457summary_info += {'JACK support': jack}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003458summary_info += {'brlapi support': brlapi}
Paolo Bonzinie1723992021-10-07 15:08:21 +02003459summary_info += {'vde support': vde}
Paolo Bonzini837b84b2021-10-07 15:08:22 +02003460summary_info += {'netmap support': have_netmap}
Thomas Hutheea94532021-10-28 20:59:08 +02003461summary_info += {'l2tpv3 support': have_l2tpv3}
Paolo Bonziniff66f3e2021-10-07 15:08:20 +02003462summary_info += {'Linux AIO support': libaio}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003463summary_info += {'Linux io_uring support': linux_io_uring}
3464summary_info += {'ATTR/XATTR support': libattr}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003465summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
3466summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003467summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003468summary_info += {'libcap-ng support': libcap_ng}
3469summary_info += {'bpf support': libbpf}
Marc-André Lureau3f0a5d52021-10-07 15:08:23 +02003470summary_info += {'spice protocol support': spice_protocol}
3471if spice_protocol.found()
3472 summary_info += {' spice server support': spice}
3473endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003474summary_info += {'rbd support': rbd}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003475summary_info += {'smartcard support': cacard}
3476summary_info += {'U2F support': u2f}
3477summary_info += {'libusb': libusb}
3478summary_info += {'usb net redir': usbredir}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003479summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003480summary_info += {'GBM': gbm}
3481summary_info += {'libiscsi support': libiscsi}
3482summary_info += {'libnfs support': libnfs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003483if targetos == 'windows'
Paolo Bonzinib846ab72021-01-21 11:49:04 +01003484 if config_host.has_key('CONFIG_GUEST_AGENT')
3485 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
3486 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01003487 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01003488endif
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003489summary_info += {'seccomp support': seccomp}
3490summary_info += {'GlusterFS support': glusterfs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003491summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
Thomas Huthe6a52b32021-12-09 15:48:01 +01003492summary_info += {'libssh support': libssh}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003493summary_info += {'lzo support': lzo}
3494summary_info += {'snappy support': snappy}
3495summary_info += {'bzip2 support': libbzip2}
3496summary_info += {'lzfse support': liblzfse}
3497summary_info += {'zstd support': zstd}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003498summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
Paolo Bonzinibb647c42021-06-03 11:24:56 +02003499summary_info += {'libxml2': libxml2}
3500summary_info += {'capstone': capstone_opt == 'internal' ? capstone_opt : capstone}
3501summary_info += {'libpmem support': libpmem}
3502summary_info += {'libdaxctl support': libdaxctl}
3503summary_info += {'libudev': libudev}
3504# Dummy dependency, keep .found()
Max Reitzdf4ea702020-10-27 20:05:46 +01003505summary_info += {'FUSE lseek': fuse_lseek.found()}
Richard W.M. Jones3d212b42021-11-15 14:29:43 -06003506summary_info += {'selinux': selinux}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01003507summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01003508
3509if not supported_cpus.contains(cpu)
3510 message()
3511 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
3512 message()
3513 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
3514 message('The QEMU project intends to remove support for this host CPU in')
3515 message('a future release if nobody volunteers to maintain it and to')
3516 message('provide a build host for our continuous integration setup.')
3517 message('configure has succeeded and you can continue to build, but')
3518 message('if you care about QEMU on this platform you should contact')
3519 message('us upstream at qemu-devel@nongnu.org.')
3520endif
3521
3522if not supported_oses.contains(targetos)
3523 message()
3524 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
3525 message()
3526 message('Host OS ' + targetos + 'support is not currently maintained.')
3527 message('The QEMU project intends to remove support for this host OS in')
3528 message('a future release if nobody volunteers to maintain it and to')
3529 message('provide a build host for our continuous integration setup.')
3530 message('configure has succeeded and you can continue to build, but')
3531 message('if you care about QEMU on this platform you should contact')
3532 message('us upstream at qemu-devel@nongnu.org.')
3533endif