blob: d3025e05fc30bd98ac78e41250ab7fa9df89bd43 [file] [log] [blame]
Paolo Bonzinia5665052019-06-10 12:05:14 +02001project('qemu', ['c'], meson_version: '>=0.55.0',
Richard Hendersond22797c2021-06-14 16:31:36 -07002 default_options: ['warning_level=1', 'c_std=gnu11', 'cpp_std=gnu++11', 'b_colorout=auto'] +
Paolo Bonzinia5cb7c52020-10-19 06:56:16 -04003 (meson.version().version_compare('>=0.56.0') ? [ 'b_staticpic=false' ] : []),
Paolo Bonzinia5665052019-06-10 12:05:14 +02004 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5
6not_found = dependency('', required: false)
Paolo Bonzinib29b40f2020-08-10 18:04:43 +02007if meson.version().version_compare('>=0.56.0')
8 keyval = import('keyval')
9else
10 keyval = import('unstable-keyval')
11endif
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 = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020045
Paolo Bonzini760e4322020-08-26 08:09:48 +020046target_dirs = config_host['TARGET_DIRS'].split()
47have_user = false
48have_system = false
49foreach target : target_dirs
50 have_user = have_user or target.endswith('-user')
51 have_system = have_system or target.endswith('-softmmu')
52endforeach
53have_tools = 'CONFIG_TOOLS' in config_host
54have_block = have_system or have_tools
55
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040056python = import('python').find_installation()
57
58supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Sergei Trofimovich61256732020-10-12 18:57:19 +010059supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040060 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
61
62cpu = host_machine.cpu_family()
63targetos = host_machine.system()
64
Paolo Bonzini8a199802020-09-18 05:37:01 -040065if cpu in ['x86', 'x86_64']
66 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
67elif cpu == 'aarch64'
68 kvm_targets = ['aarch64-softmmu']
69elif cpu == 's390x'
70 kvm_targets = ['s390x-softmmu']
71elif cpu in ['ppc', 'ppc64']
72 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Huacai Chenfbc58842020-10-07 16:39:28 +080073elif cpu in ['mips', 'mips64']
74 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -040075else
76 kvm_targets = []
77endif
78
79accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alex Bennée0c3e41d2020-11-10 19:23:09 +000080if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
81 # i368 emulator provides xenpv machine type for multiple architectures
82 accelerator_targets += {
83 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
84 }
85endif
Paolo Bonzini8a199802020-09-18 05:37:01 -040086if cpu in ['x86', 'x86_64']
87 accelerator_targets += {
88 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -040089 'CONFIG_HVF': ['x86_64-softmmu'],
Reinoud Zandijk74a414a2021-04-02 22:25:32 +020090 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -040091 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
92 }
93endif
94
Philippe Mathieu-Daudéeae9a1d2021-01-14 18:45:08 +010095edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
96install_edk2_blobs = false
97if get_option('install_blobs')
98 foreach target : target_dirs
99 install_edk2_blobs = install_edk2_blobs or target in edk2_targets
100 endforeach
101endif
102
Philippe Mathieu-Daudé45b545d2021-01-14 18:45:09 +0100103bzip2 = find_program('bzip2', required: install_edk2_blobs)
104
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400105##################
106# Compiler flags #
107##################
108
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400109# Specify linker-script with add_project_link_arguments so that it is not placed
110# within a linker --start-group/--end-group pair
111if 'CONFIG_FUZZ' in config_host
112 add_project_link_arguments(['-Wl,-T,',
113 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
114 native: false, language: ['c', 'cpp', 'objc'])
115endif
116
Marc-André Lureau5fc06172021-01-14 16:56:02 +0400117add_global_arguments(config_host['QEMU_CFLAGS'].split(),
118 native: false, language: ['c', 'objc'])
119add_global_arguments(config_host['QEMU_CXXFLAGS'].split(),
120 native: false, language: 'cpp')
121add_global_link_arguments(config_host['QEMU_LDFLAGS'].split(),
122 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzinia5665052019-06-10 12:05:14 +0200123
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400124if targetos == 'linux'
125 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
126 '-isystem', 'linux-headers',
127 language: ['c', 'cpp'])
128endif
129
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100130add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400131 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400132 '-iquote', meson.current_source_dir() / 'include',
133 '-iquote', meson.current_source_dir() / 'disas/libvixl',
134 language: ['c', 'cpp', 'objc'])
Alexander Bulekovc46f76d2020-09-02 13:36:50 -0400135
Marc-André Lureaufc929892019-07-13 01:47:54 +0400136link_language = meson.get_external_property('link_language', 'cpp')
137if link_language == 'cpp'
138 add_languages('cpp', required: true, native: false)
139endif
Paolo Bonzinia5665052019-06-10 12:05:14 +0200140if host_machine.system() == 'darwin'
141 add_languages('objc', required: false, native: false)
142endif
143
Paolo Bonzinideb62372020-09-01 07:51:16 -0400144sparse = find_program('cgcc', required: get_option('sparse'))
145if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100146 run_target('sparse',
147 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400148 'compile_commands.json', sparse.full_path(), '-Wbitwise',
149 '-Wno-transparent-union', '-Wno-old-initializer',
150 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100151endif
152
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200153###########################################
154# Target-specific checks and dependencies #
155###########################################
156
157if targetos != 'linux' and get_option('mpath').enabled()
158 error('Multipath is supported only on Linux')
159endif
160
Paolo Bonzini106ad1f2021-02-17 16:24:25 +0100161if targetos != 'linux' and get_option('multiprocess').enabled()
162 error('Multiprocess QEMU is supported only on Linux')
163endif
164multiprocess_allowed = targetos == 'linux' and not get_option('multiprocess').disabled()
165
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200166libm = cc.find_library('m', required: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400167util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200168winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400169socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400170version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400171coref = []
172iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400173emulator_link_args = []
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200174nvmm =not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400175hvf = not_found
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400176if targetos == 'windows'
177 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200178 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400179
180 win = import('windows')
181 version_res = win.compile_resources('version.rc',
182 depend_files: files('pc-bios/qemu-nsis.ico'),
183 include_directories: include_directories('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400184elif targetos == 'darwin'
185 coref = dependency('appleframeworks', modules: 'CoreFoundation')
186 iokit = dependency('appleframeworks', modules: 'IOKit')
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200187elif targetos == 'sunos'
188 socket = [cc.find_library('socket'),
189 cc.find_library('nsl'),
190 cc.find_library('resolv')]
191elif targetos == 'haiku'
192 socket = [cc.find_library('posix_error_mapper'),
193 cc.find_library('network'),
194 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400195elif targetos == 'openbsd'
196 if not get_option('tcg').disabled() and target_dirs.length() > 0
197 # Disable OpenBSD W^X if available
198 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
199 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400200endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200201
Paolo Bonzini8a199802020-09-18 05:37:01 -0400202accelerators = []
203if not get_option('kvm').disabled() and targetos == 'linux'
204 accelerators += 'CONFIG_KVM'
205endif
206if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
207 accelerators += 'CONFIG_XEN'
208 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
209else
210 have_xen_pci_passthrough = false
211endif
212if not get_option('whpx').disabled() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000213 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400214 error('WHPX requires 64-bit host')
215 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
216 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
217 accelerators += 'CONFIG_WHPX'
218 endif
219endif
220if not get_option('hvf').disabled()
221 hvf = dependency('appleframeworks', modules: 'Hypervisor',
222 required: get_option('hvf'))
223 if hvf.found()
224 accelerators += 'CONFIG_HVF'
225 endif
226endif
227if not get_option('hax').disabled()
228 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
229 accelerators += 'CONFIG_HAX'
230 endif
231endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200232if targetos == 'netbsd'
233 if cc.has_header_symbol('nvmm.h', 'nvmm_cpu_stop', required: get_option('nvmm'))
234 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
235 endif
236 if nvmm.found()
237 accelerators += 'CONFIG_NVMM'
238 endif
239endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100240
241tcg_arch = config_host['ARCH']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400242if not get_option('tcg').disabled()
243 if cpu not in supported_cpus
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100244 if get_option('tcg_interpreter')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +0100245 warning('Unsupported CPU @0@, will use TCG with TCI (experimental and slow)'.format(cpu))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400246 else
247 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
248 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100249 elif get_option('tcg_interpreter')
250 warning('Use of the TCG interpretor is not recommended on this host')
251 warning('architecture. There is a native TCG execution backend available')
252 warning('which provides substantially better performance and reliability.')
253 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
254 warning('configuration option on this architecture to use the native')
255 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400256 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100257 if get_option('tcg_interpreter')
258 tcg_arch = 'tci'
259 elif config_host['ARCH'] == 'sparc64'
260 tcg_arch = 'sparc'
261 elif config_host['ARCH'] == 's390x'
262 tcg_arch = 's390'
263 elif config_host['ARCH'] in ['x86_64', 'x32']
264 tcg_arch = 'i386'
265 elif config_host['ARCH'] == 'ppc64'
266 tcg_arch = 'ppc'
267 elif config_host['ARCH'] in ['riscv32', 'riscv64']
268 tcg_arch = 'riscv'
269 endif
270 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100271 language: ['c', 'cpp', 'objc'])
272
Paolo Bonzini8a199802020-09-18 05:37:01 -0400273 accelerators += 'CONFIG_TCG'
274 config_host += { 'CONFIG_TCG': 'y' }
275endif
276
277if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
278 error('KVM not available on this platform')
279endif
280if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
281 error('HVF not available on this platform')
282endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200283if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
284 error('NVMM not available on this platform')
285endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400286if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
287 error('WHPX not available on this platform')
288endif
289if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
290 if 'CONFIG_XEN' in accelerators
291 error('Xen PCI passthrough not available on this platform')
292 else
293 error('Xen PCI passthrough requested but Xen not enabled')
294 endif
295endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400296
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200297################
298# Dependencies #
299################
300
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400301# The path to glib.h is added to all compilation commands. This was
302# grandfathered in from the QEMU Makefiles.
303add_project_arguments(config_host['GLIB_CFLAGS'].split(),
304 native: false, language: ['c', 'cpp', 'objc'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400305glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
306 link_args: config_host['GLIB_LIBS'].split())
307# override glib dep with the configure results (for subprojects)
308meson.override_dependency('glib-2.0', glib)
309
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400310gio = not_found
311if 'CONFIG_GIO' in config_host
312 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
313 link_args: config_host['GIO_LIBS'].split())
314endif
315lttng = not_found
316if 'CONFIG_TRACE_UST' in config_host
317 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
318endif
319urcubp = not_found
320if 'CONFIG_TRACE_UST' in config_host
321 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
322endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200323pixman = not_found
324if have_system or have_tools
325 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100326 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200327endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400328libaio = cc.find_library('aio', required: false)
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100329zlib = dependency('zlib', required: true, kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400330linux_io_uring = not_found
331if 'CONFIG_LINUX_IO_URING' in config_host
332 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
333 link_args: config_host['LINUX_IO_URING_LIBS'].split())
334endif
335libxml2 = not_found
336if 'CONFIG_LIBXML2' in config_host
337 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
338 link_args: config_host['LIBXML2_LIBS'].split())
339endif
340libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +0100341if not get_option('libnfs').auto() or have_block
342 libnfs = dependency('libnfs', version: '>=1.9.3',
343 required: get_option('libnfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100344 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400345endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100346
347libattr_test = '''
348 #include <stddef.h>
349 #include <sys/types.h>
350 #ifdef CONFIG_LIBATTR
351 #include <attr/xattr.h>
352 #else
353 #include <sys/xattr.h>
354 #endif
355 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
356
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400357libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100358have_old_libattr = false
359if not get_option('attr').disabled()
360 if cc.links(libattr_test)
361 libattr = declare_dependency()
362 else
363 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
364 required: get_option('attr'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100365 kwargs: static_kwargs)
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100366 if libattr.found() and not \
367 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
368 libattr = not_found
369 if get_option('attr').enabled()
370 error('could not link libattr')
371 else
372 warning('could not link libattr, disabling')
373 endif
374 else
375 have_old_libattr = libattr.found()
376 endif
377 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400378endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100379
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100380cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
381if cocoa.found() and get_option('sdl').enabled()
382 error('Cocoa and SDL cannot be enabled at the same time')
383endif
384if cocoa.found() and get_option('gtk').enabled()
385 error('Cocoa and GTK+ cannot be enabled at the same time')
386endif
387
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100388seccomp = not_found
Paolo Bonzini90835c22020-11-17 14:22:24 +0100389if not get_option('seccomp').auto() or have_system or have_tools
390 seccomp = dependency('libseccomp', version: '>=2.3.0',
391 required: get_option('seccomp'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100392 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100393endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100394
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100395libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100396if not get_option('cap_ng').auto() or have_system or have_tools
397 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
398 required: get_option('cap_ng'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100399 kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100400endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100401if libcap_ng.found() and not cc.links('''
402 #include <cap-ng.h>
403 int main(void)
404 {
405 capng_capability_to_name(CAPNG_EFFECTIVE);
406 return 0;
407 }''', dependencies: libcap_ng)
408 libcap_ng = not_found
409 if get_option('cap_ng').enabled()
410 error('could not link libcap-ng')
411 else
412 warning('could not link libcap-ng, disabling')
413 endif
414endif
415
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400416if get_option('xkbcommon').auto() and not have_system and not have_tools
417 xkbcommon = not_found
418else
419 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100420 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400421endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400422vde = not_found
423if config_host.has_key('CONFIG_VDE')
424 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
425endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200426pulse = not_found
427if 'CONFIG_LIBPULSE' in config_host
428 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
429 link_args: config_host['PULSE_LIBS'].split())
430endif
431alsa = not_found
432if 'CONFIG_ALSA' in config_host
433 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
434 link_args: config_host['ALSA_LIBS'].split())
435endif
436jack = not_found
437if 'CONFIG_LIBJACK' in config_host
438 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
439endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200440spice = not_found
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200441spice_headers = not_found
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200442spice_protocol = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200443if 'CONFIG_SPICE' in config_host
444 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
445 link_args: config_host['SPICE_LIBS'].split())
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200446 spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
Paolo Bonzini26347332019-07-29 15:40:07 +0200447endif
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200448if 'CONFIG_SPICE_PROTOCOL' in config_host
449 spice_protocol = declare_dependency(compile_args: config_host['SPICE_PROTOCOL_CFLAGS'].split())
450endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400451rt = cc.find_library('rt', required: false)
Paolo Bonziniccf7afa2020-09-01 06:44:23 -0400452libdl = not_found
453if 'CONFIG_PLUGIN' in config_host
454 libdl = cc.find_library('dl', required: true)
455endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200456libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100457if not get_option('libiscsi').auto() or have_block
458 libiscsi = dependency('libiscsi', version: '>=1.9.0',
459 required: get_option('libiscsi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100460 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini99650b62019-06-10 12:21:14 +0200461endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400462zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +0100463if not get_option('zstd').auto() or have_block
464 zstd = dependency('libzstd', version: '>=1.4.0',
465 required: get_option('zstd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100466 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400467endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400468gbm = not_found
469if 'CONFIG_GBM' in config_host
470 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
471 link_args: config_host['GBM_LIBS'].split())
472endif
473virgl = not_found
474if 'CONFIG_VIRGL' in config_host
475 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
476 link_args: config_host['VIRGL_LIBS'].split())
477endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400478curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100479if not get_option('curl').auto() or have_block
480 curl = dependency('libcurl', version: '>=7.29.0',
481 method: 'pkg-config',
482 required: get_option('curl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100483 kwargs: static_kwargs)
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400484endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200485libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200486if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200487 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +0100488 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400489 required: get_option('libudev'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100490 kwargs: static_kwargs)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200491endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200492
Paolo Bonzini5c530152020-10-15 06:09:27 -0400493mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200494mpathpersist = not_found
495mpathpersist_new_api = false
496if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
497 mpath_test_source_new = '''
498 #include <libudev.h>
499 #include <mpath_persist.h>
500 unsigned mpath_mx_alloc_len = 1024;
501 int logsink;
502 static struct config *multipath_conf;
503 extern struct udev *udev;
504 extern struct config *get_multipath_config(void);
505 extern void put_multipath_config(struct config *conf);
506 struct udev *udev;
507 struct config *get_multipath_config(void) { return multipath_conf; }
508 void put_multipath_config(struct config *conf) { }
509 int main(void) {
510 udev = udev_new();
511 multipath_conf = mpath_lib_init();
512 return 0;
513 }'''
514 mpath_test_source_old = '''
515 #include <libudev.h>
516 #include <mpath_persist.h>
517 unsigned mpath_mx_alloc_len = 1024;
518 int logsink;
519 int main(void) {
520 struct udev *udev = udev_new();
521 mpath_lib_init(udev);
522 return 0;
523 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400524 libmpathpersist = cc.find_library('mpathpersist',
525 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100526 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400527 if libmpathpersist.found()
528 mpathlibs += libmpathpersist
529 if enable_static
530 mpathlibs += cc.find_library('devmapper',
531 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100532 kwargs: static_kwargs)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200533 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400534 mpathlibs += cc.find_library('multipath',
535 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100536 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400537 foreach lib: mpathlibs
538 if not lib.found()
539 mpathlibs = []
540 break
541 endif
542 endforeach
543 if mpathlibs.length() == 0
544 msg = 'Dependencies missing for libmpathpersist'
545 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200546 mpathpersist = declare_dependency(dependencies: mpathlibs)
547 mpathpersist_new_api = true
548 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
549 mpathpersist = declare_dependency(dependencies: mpathlibs)
550 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400551 msg = 'Cannot detect libmpathpersist API'
552 endif
553 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200554 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400555 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200556 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400557 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200558 endif
559 endif
560 endif
561endif
562
Yonggang Luo5285e592020-10-13 07:43:48 +0800563iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800564curses = not_found
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400565if have_system and not get_option('curses').disabled()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400566 curses_test = '''
567 #include <locale.h>
568 #include <curses.h>
569 #include <wchar.h>
570 int main(void) {
571 wchar_t wch = L'w';
572 setlocale(LC_ALL, "");
573 resize_term(0, 0);
574 addwstr(L"wide chars\n");
575 addnwstr(&wch, 1);
576 add_wch(WACS_DEGREE);
577 return 0;
578 }'''
579
Yonggang Luoca31e302020-11-17 05:31:06 +0800580 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
581 foreach curses_dep : curses_dep_list
582 if not curses.found()
583 curses = dependency(curses_dep,
584 required: false,
585 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100586 kwargs: static_kwargs)
Yonggang Luoca31e302020-11-17 05:31:06 +0800587 endif
588 endforeach
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400589 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500590 curses_compile_args = ['-DNCURSES_WIDECHAR']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400591 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500592 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
593 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400594 else
595 msg = 'curses package not usable'
596 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800597 endif
598 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400599 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400600 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
601 if targetos != 'windows' and not has_curses_h
602 message('Trying with /usr/include/ncursesw')
603 curses_compile_args += ['-I/usr/include/ncursesw']
604 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
605 endif
606 if has_curses_h
607 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
608 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800609 libcurses = cc.find_library(curses_libname,
610 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100611 kwargs: static_kwargs)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400612 if libcurses.found()
613 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
614 curses = declare_dependency(compile_args: curses_compile_args,
615 dependencies: [libcurses])
616 break
617 else
618 msg = 'curses library not usable'
619 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800620 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400621 endforeach
622 endif
623 endif
624 if not get_option('iconv').disabled()
625 foreach link_args : [ ['-liconv'], [] ]
626 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
627 # We need to use libiconv if available because mixing libiconv's headers with
628 # the system libc does not work.
629 # However, without adding glib to the dependencies -L/usr/local/lib will not be
630 # included in the command line and libiconv will not be found.
631 if cc.links('''
632 #include <iconv.h>
633 int main(void) {
634 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
635 return conv != (iconv_t) -1;
636 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
637 iconv = declare_dependency(link_args: link_args, dependencies: glib)
638 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800639 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400640 endforeach
641 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400642 if curses.found() and not iconv.found()
643 if get_option('iconv').enabled()
644 error('iconv not available')
645 endif
646 msg = 'iconv required for curses UI but not available'
647 curses = not_found
648 endif
649 if not curses.found() and msg != ''
650 if get_option('curses').enabled()
651 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400652 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400653 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400654 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800655 endif
656endif
657
Paolo Bonzini26347332019-07-29 15:40:07 +0200658brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100659if not get_option('brlapi').auto() or have_system
660 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
661 required: get_option('brlapi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100662 kwargs: static_kwargs)
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100663 if brlapi.found() and not cc.links('''
664 #include <brlapi.h>
665 #include <stddef.h>
666 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
667 brlapi = not_found
668 if get_option('brlapi').enabled()
669 error('could not link brlapi')
670 else
671 warning('could not link brlapi, disabling')
672 endif
673 endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200674endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100675
Paolo Bonzini760e4322020-08-26 08:09:48 +0200676sdl = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100677if not get_option('sdl').auto() or (have_system and not cocoa.found())
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100678 sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200679 sdl_image = not_found
680endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100681if sdl.found()
682 # work around 2.0.8 bug
683 sdl = declare_dependency(compile_args: '-Wno-undef',
684 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200685 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100686 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100687else
688 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100689 error('sdl-image required, but SDL was @0@'.format(
690 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100691 endif
692 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200693endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100694
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400695rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100696if not get_option('rbd').auto() or have_block
697 librados = cc.find_library('rados', required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100698 kwargs: static_kwargs)
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100699 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
700 required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100701 kwargs: static_kwargs)
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100702 if librados.found() and librbd.found()
703 if cc.links('''
704 #include <stdio.h>
705 #include <rbd/librbd.h>
706 int main(void) {
707 rados_t cluster;
708 rados_create(&cluster, NULL);
709 return 0;
710 }''', dependencies: [librbd, librados])
711 rbd = declare_dependency(dependencies: [librbd, librados])
712 elif get_option('rbd').enabled()
713 error('could not link librados')
714 else
715 warning('could not link librados, disabling')
716 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100717 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400718endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100719
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400720glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100721glusterfs_ftruncate_has_stat = false
722glusterfs_iocb_has_stat = false
723if not get_option('glusterfs').auto() or have_block
724 glusterfs = dependency('glusterfs-api', version: '>=3',
725 required: get_option('glusterfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100726 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100727 if glusterfs.found()
728 glusterfs_ftruncate_has_stat = cc.links('''
729 #include <glusterfs/api/glfs.h>
730
731 int
732 main(void)
733 {
734 /* new glfs_ftruncate() passes two additional args */
735 return glfs_ftruncate(NULL, 0, NULL, NULL);
736 }
737 ''', dependencies: glusterfs)
738 glusterfs_iocb_has_stat = cc.links('''
739 #include <glusterfs/api/glfs.h>
740
741 /* new glfs_io_cbk() passes two additional glfs_stat structs */
742 static void
743 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
744 {}
745
746 int
747 main(void)
748 {
749 glfs_io_cbk iocb = &glusterfs_iocb;
750 iocb(NULL, 0 , NULL, NULL, NULL);
751 return 0;
752 }
753 ''', dependencies: glusterfs)
754 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400755endif
756libssh = not_found
757if 'CONFIG_LIBSSH' in config_host
758 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
759 link_args: config_host['LIBSSH_LIBS'].split())
760endif
761libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100762if not get_option('bzip2').auto() or have_block
763 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
764 required: get_option('bzip2'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100765 kwargs: static_kwargs)
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100766 if libbzip2.found() and not cc.links('''
767 #include <bzlib.h>
768 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
769 libbzip2 = not_found
770 if get_option('bzip2').enabled()
771 error('could not link libbzip2')
772 else
773 warning('could not link libbzip2, disabling')
774 endif
775 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400776endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100777
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400778liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +0100779if not get_option('lzfse').auto() or have_block
780 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
781 required: get_option('lzfse'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100782 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400783endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100784if liblzfse.found() and not cc.links('''
785 #include <lzfse.h>
786 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
787 liblzfse = not_found
788 if get_option('lzfse').enabled()
789 error('could not link liblzfse')
790 else
791 warning('could not link liblzfse, disabling')
792 endif
793endif
794
Paolo Bonzini478e9432020-08-17 12:47:55 +0200795oss = not_found
796if 'CONFIG_AUDIO_OSS' in config_host
797 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
798endif
799dsound = not_found
800if 'CONFIG_AUDIO_DSOUND' in config_host
801 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
802endif
803coreaudio = not_found
804if 'CONFIG_AUDIO_COREAUDIO' in config_host
805 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
806endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400807opengl = not_found
808if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400809 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
810 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400811endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100812
Paolo Bonzini57612512021-06-03 11:15:26 +0200813gnutls = not_found
814if not get_option('gnutls').auto() or have_system
815 gnutls = dependency('gnutls', version: '>=3.5.18',
816 method: 'pkg-config',
817 required: get_option('gnutls'),
818 kwargs: static_kwargs)
819endif
820
821# Nettle has priority over gcrypt
822gcrypt = not_found
823nettle = not_found
824xts = 'private'
825if get_option('nettle').enabled() and get_option('gcrypt').enabled()
826 error('Only one of gcrypt & nettle can be enabled')
827elif (not get_option('nettle').auto() or have_system) and not get_option('gcrypt').enabled()
828 nettle = dependency('nettle', version: '>=3.4',
829 method: 'pkg-config',
830 required: get_option('nettle'),
831 kwargs: static_kwargs)
832 if nettle.found() and cc.has_header('nettle/xts.h', dependencies: nettle)
833 xts = 'nettle'
834 endif
835endif
836if (not get_option('gcrypt').auto() or have_system) and not nettle.found()
837 gcrypt = dependency('libgcrypt', version: '>=1.5',
838 method: 'config-tool',
839 required: get_option('gcrypt'),
840 kwargs: static_kwargs)
841 if gcrypt.found() and cc.compiles('''
842 #include <gcrypt.h>
843 int main(void) {
844 gcry_cipher_hd_t handle;
845 gcry_cipher_open(&handle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_XTS, 0);
846 return 0;
847 }
848 ''', dependencies: gcrypt)
849 xts = 'gcrypt'
850 endif
851 # Debian has removed -lgpg-error from libgcrypt-config
852 # as it "spreads unnecessary dependencies" which in
853 # turn breaks static builds...
854 if gcrypt.found() and enable_static
855 gcrypt = declare_dependency(dependencies: [
856 gcrypt,
857 cc.find_library('gpg-error', required: true, kwargs: static_kwargs)])
858 endif
859endif
860
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400861gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +0100862gtkx11 = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100863if not get_option('gtk').auto() or (have_system and not cocoa.found())
Paolo Bonzini1b695472021-01-07 14:02:29 +0100864 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
865 method: 'pkg-config',
866 required: get_option('gtk'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100867 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +0100868 if gtk.found()
869 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
870 method: 'pkg-config',
871 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100872 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +0100873 gtk = declare_dependency(dependencies: [gtk, gtkx11])
874 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400875endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100876
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400877vte = not_found
878if 'CONFIG_VTE' in config_host
879 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
880 link_args: config_host['VTE_LIBS'].split())
881endif
882x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +0200883if gtkx11.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +0100884 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100885 kwargs: static_kwargs)
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400886endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100887vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400888png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400889jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400890sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100891if get_option('vnc').enabled()
892 vnc = declare_dependency() # dummy dependency
893 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100894 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini8e242b32020-11-23 13:34:02 -0500895 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100896 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100897 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
898 required: get_option('vnc_sasl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100899 kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100900 if sasl.found()
901 sasl = declare_dependency(dependencies: sasl,
902 compile_args: '-DSTRUCT_IOVEC_DEFINED')
903 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400904endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100905
Paolo Bonzini05e391a2021-06-03 11:15:26 +0200906pam = not_found
907if not get_option('auth_pam').auto() or have_system
908 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
909 required: get_option('auth_pam'),
910 kwargs: static_kwargs)
911endif
912if pam.found() and not cc.links('''
913 #include <stddef.h>
914 #include <security/pam_appl.h>
915 int main(void) {
916 const char *service_name = "qemu";
917 const char *user = "frank";
918 const struct pam_conv pam_conv = { 0 };
919 pam_handle_t *pamh = NULL;
920 pam_start(service_name, user, &pam_conv, &pamh);
921 return 0;
922 }''', dependencies: pam)
923 pam = not_found
924 if get_option('auth_pam').enabled()
925 error('could not link libpam')
926 else
927 warning('could not link libpam, disabling')
928 endif
929endif
930
Marc-André Lureau708eab42019-09-03 16:59:33 +0400931snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +0100932if not get_option('snappy').auto() or have_system
933 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
934 required: get_option('snappy'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100935 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400936endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100937if snappy.found() and not cc.links('''
938 #include <snappy-c.h>
939 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
940 snappy = not_found
941 if get_option('snappy').enabled()
942 error('could not link libsnappy')
943 else
944 warning('could not link libsnappy, disabling')
945 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400946endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100947
Marc-André Lureau708eab42019-09-03 16:59:33 +0400948lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100949if not get_option('lzo').auto() or have_system
950 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
951 required: get_option('lzo'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100952 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400953endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100954if lzo.found() and not cc.links('''
955 #include <lzo/lzo1x.h>
956 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
957 lzo = not_found
958 if get_option('lzo').enabled()
959 error('could not link liblzo2')
960 else
961 warning('could not link liblzo2, disabling')
962 endif
963endif
964
Marc-André Lureau55166232019-07-24 19:16:22 +0400965rdma = not_found
966if 'CONFIG_RDMA' in config_host
967 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
968endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400969numa = not_found
970if 'CONFIG_NUMA' in config_host
971 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
972endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400973xen = not_found
974if 'CONFIG_XEN_BACKEND' in config_host
975 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
976 link_args: config_host['XEN_LIBS'].split())
977endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200978cacard = not_found
979if 'CONFIG_SMARTCARD' in config_host
980 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
981 link_args: config_host['SMARTCARD_LIBS'].split())
982endif
César Belley0a40bcb2020-08-26 13:42:04 +0200983u2f = not_found
984if have_system
985 u2f = dependency('u2f-emu', required: get_option('u2f'),
986 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100987 kwargs: static_kwargs)
César Belley0a40bcb2020-08-26 13:42:04 +0200988endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200989usbredir = not_found
990if 'CONFIG_USB_REDIR' in config_host
991 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
992 link_args: config_host['USB_REDIR_LIBS'].split())
993endif
994libusb = not_found
995if 'CONFIG_USB_LIBUSB' in config_host
996 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
997 link_args: config_host['LIBUSB_LIBS'].split())
998endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400999libpmem = not_found
1000if 'CONFIG_LIBPMEM' in config_host
1001 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
1002 link_args: config_host['LIBPMEM_LIBS'].split())
1003endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001004libdaxctl = not_found
1005if 'CONFIG_LIBDAXCTL' in config_host
1006 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
1007endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001008tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02001009if gnutls.found()
1010 tasn1 = dependency('libtasn1',
1011 method: 'pkg-config',
1012 kwargs: static_kwargs)
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001013endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001014keyutils = dependency('libkeyutils', required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001015 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001016
Marc-André Lureau3909def2020-08-28 15:07:33 +04001017has_gettid = cc.has_function('gettid')
1018
Paolo Bonziniaa087962020-09-01 11:15:30 -04001019# Malloc tests
1020
1021malloc = []
1022if get_option('malloc') == 'system'
1023 has_malloc_trim = \
1024 not get_option('malloc_trim').disabled() and \
1025 cc.links('''#include <malloc.h>
1026 int main(void) { malloc_trim(0); return 0; }''')
1027else
1028 has_malloc_trim = false
1029 malloc = cc.find_library(get_option('malloc'), required: true)
1030endif
1031if not has_malloc_trim and get_option('malloc_trim').enabled()
1032 if get_option('malloc') == 'system'
1033 error('malloc_trim not available on this platform.')
1034 else
1035 error('malloc_trim not available with non-libc memory allocator')
1036 endif
1037endif
1038
Max Reitz84e319a2020-11-02 17:18:55 +01001039# Check whether the glibc provides statx()
1040
1041statx_test = '''
1042 #ifndef _GNU_SOURCE
1043 #define _GNU_SOURCE
1044 #endif
1045 #include <sys/stat.h>
1046 int main(void) {
1047 struct statx statxbuf;
1048 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
1049 return 0;
1050 }'''
1051
1052has_statx = cc.links(statx_test)
1053
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +00001054have_vhost_user_blk_server = (targetos == 'linux' and
1055 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001056
1057if get_option('vhost_user_blk_server').enabled()
1058 if targetos != 'linux'
1059 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +00001060 elif 'CONFIG_VHOST_USER' not in config_host
1061 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001062 endif
1063elif get_option('vhost_user_blk_server').disabled() or not have_system
1064 have_vhost_user_blk_server = false
1065endif
1066
Daniele Buono9e62ba42020-12-04 18:06:14 -05001067
Max Reitzdf4ea702020-10-27 20:05:46 +01001068if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1069 error('Cannot enable fuse-lseek while fuse is disabled')
1070endif
1071
Max Reitza484a712020-10-27 20:05:41 +01001072fuse = dependency('fuse3', required: get_option('fuse'),
1073 version: '>=3.1', method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001074 kwargs: static_kwargs)
Max Reitza484a712020-10-27 20:05:41 +01001075
Max Reitzdf4ea702020-10-27 20:05:46 +01001076fuse_lseek = not_found
1077if not get_option('fuse_lseek').disabled()
1078 if fuse.version().version_compare('>=3.8')
1079 # Dummy dependency
1080 fuse_lseek = declare_dependency()
1081 elif get_option('fuse_lseek').enabled()
1082 if fuse.found()
1083 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1084 else
1085 error('fuse-lseek requires libfuse, which was not found')
1086 endif
1087 endif
1088endif
1089
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001090# libbpf
1091libbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
1092if libbpf.found() and not cc.links('''
1093 #include <bpf/libbpf.h>
1094 int main(void)
1095 {
1096 bpf_object__destroy_skeleton(NULL);
1097 return 0;
1098 }''', dependencies: libbpf)
1099 libbpf = not_found
1100 if get_option('bpf').enabled()
1101 error('libbpf skeleton test failed')
1102 else
1103 warning('libbpf skeleton test failed, disabling')
1104 endif
1105endif
1106
Daniele Buono9e62ba42020-12-04 18:06:14 -05001107if get_option('cfi')
1108 cfi_flags=[]
1109 # Check for dependency on LTO
1110 if not get_option('b_lto')
1111 error('Selected Control-Flow Integrity but LTO is disabled')
1112 endif
1113 if config_host.has_key('CONFIG_MODULES')
1114 error('Selected Control-Flow Integrity is not compatible with modules')
1115 endif
1116 # Check for cfi flags. CFI requires LTO so we can't use
1117 # get_supported_arguments, but need a more complex "compiles" which allows
1118 # custom arguments
1119 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1120 args: ['-flto', '-fsanitize=cfi-icall'] )
1121 cfi_flags += '-fsanitize=cfi-icall'
1122 else
1123 error('-fsanitize=cfi-icall is not supported by the compiler')
1124 endif
1125 if cc.compiles('int main () { return 0; }',
1126 name: '-fsanitize-cfi-icall-generalize-pointers',
1127 args: ['-flto', '-fsanitize=cfi-icall',
1128 '-fsanitize-cfi-icall-generalize-pointers'] )
1129 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1130 else
1131 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1132 endif
1133 if get_option('cfi_debug')
1134 if cc.compiles('int main () { return 0; }',
1135 name: '-fno-sanitize-trap=cfi-icall',
1136 args: ['-flto', '-fsanitize=cfi-icall',
1137 '-fno-sanitize-trap=cfi-icall'] )
1138 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1139 else
1140 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1141 endif
1142 endif
Marc-André Lureau5fc06172021-01-14 16:56:02 +04001143 add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1144 add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
Daniele Buono9e62ba42020-12-04 18:06:14 -05001145endif
1146
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001147#################
1148# config-host.h #
1149#################
Paolo Bonzini859aef02020-08-04 18:14:26 +02001150
Paolo Bonzini69202b42020-11-17 14:46:21 +01001151have_virtfs = (targetos == 'linux' and
1152 have_system and
1153 libattr.found() and
1154 libcap_ng.found())
1155
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01001156have_virtfs_proxy_helper = have_virtfs and have_tools
1157
Paolo Bonzini69202b42020-11-17 14:46:21 +01001158if get_option('virtfs').enabled()
1159 if not have_virtfs
1160 if targetos != 'linux'
1161 error('virtio-9p (virtfs) requires Linux')
1162 elif not libcap_ng.found() or not libattr.found()
1163 error('virtio-9p (virtfs) requires libcap-ng-devel and libattr-devel')
1164 elif not have_system
1165 error('virtio-9p (virtfs) needs system emulation support')
1166 endif
1167 endif
1168elif get_option('virtfs').disabled()
1169 have_virtfs = false
1170endif
1171
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001172config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1173config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1174config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1175config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1176config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
1177config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
1178config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1179config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1180config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1181config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1182config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1183config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1184
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001185config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001186config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04001187config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001188config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001189config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001190config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1191config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001192config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08001193config_host_data.set('CONFIG_CURSES', curses.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001194config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1195if glusterfs.found()
1196 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1197 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1198 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1199 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1200 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1201 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1202endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001203config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001204config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001205config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001206config_host_data.set('CONFIG_EBPF', libbpf.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001207config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01001208config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001209config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001210config_host_data.set('CONFIG_SDL', sdl.found())
1211config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01001212config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01001213config_host_data.set('CONFIG_SNAPPY', snappy.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001214config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001215config_host_data.set('CONFIG_VNC', vnc.found())
1216config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1217config_host_data.set('CONFIG_VNC_PNG', png.found())
1218config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01001219config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001220config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001221config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04001222config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02001223config_host_data.set('CONFIG_GNUTLS', gnutls.found())
1224config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
1225config_host_data.set('CONFIG_NETTLE', nettle.found())
1226config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04001227config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01001228config_host_data.set('CONFIG_STATX', has_statx)
Paolo Bonzinib1def332020-11-17 13:37:39 +01001229config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01001230config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01001231config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01001232config_host_data.set('CONFIG_X11', x11.found())
Daniele Buono9e62ba42020-12-04 18:06:14 -05001233config_host_data.set('CONFIG_CFI', get_option('cfi'))
Paolo Bonzini859aef02020-08-04 18:14:26 +02001234config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1235config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1236config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1237config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1238
Thomas Huth48f670e2020-11-18 18:10:52 +01001239config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001240config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001241config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001242config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001243config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Joelle van Dyne1ad27f72021-01-25 17:24:51 -08001244config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Thomas Huthded5d782020-11-14 11:10:11 +01001245
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001246config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
1247
Paolo Bonzini765686d2020-09-18 06:37:21 -04001248ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
Paolo Bonzini859aef02020-08-04 18:14:26 +02001249arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001250strings = ['HOST_DSOSUF', 'CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001251foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -04001252 if ignored.contains(k)
1253 # do nothing
1254 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001255 if v != ''
1256 v = '"' + '", "'.join(v.split()) + '", '
1257 endif
1258 config_host_data.set(k, v)
1259 elif k == 'ARCH'
1260 config_host_data.set('HOST_' + v.to_upper(), 1)
1261 elif strings.contains(k)
1262 if not k.startswith('CONFIG_')
1263 k = 'CONFIG_' + k.to_upper()
1264 endif
1265 config_host_data.set_quoted(k, v)
1266 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
1267 config_host_data.set(k, v == 'y' ? 1 : v)
1268 endif
1269endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02001270
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001271########################
1272# Target configuration #
1273########################
1274
Paolo Bonzini2becc362020-02-03 11:42:03 +01001275minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04001276config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001277config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001278config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001279config_devices_mak_list = []
1280config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02001281config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001282config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001283
1284disassemblers = {
1285 'alpha' : ['CONFIG_ALPHA_DIS'],
1286 'arm' : ['CONFIG_ARM_DIS'],
1287 'avr' : ['CONFIG_AVR_DIS'],
1288 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06001289 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001290 'hppa' : ['CONFIG_HPPA_DIS'],
1291 'i386' : ['CONFIG_I386_DIS'],
1292 'x86_64' : ['CONFIG_I386_DIS'],
1293 'x32' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001294 'm68k' : ['CONFIG_M68K_DIS'],
1295 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1296 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001297 'nios2' : ['CONFIG_NIOS2_DIS'],
1298 'or1k' : ['CONFIG_OPENRISC_DIS'],
1299 'ppc' : ['CONFIG_PPC_DIS'],
1300 'riscv' : ['CONFIG_RISCV_DIS'],
1301 'rx' : ['CONFIG_RX_DIS'],
1302 's390' : ['CONFIG_S390_DIS'],
1303 'sh4' : ['CONFIG_SH4_DIS'],
1304 'sparc' : ['CONFIG_SPARC_DIS'],
1305 'xtensa' : ['CONFIG_XTENSA_DIS'],
1306}
1307if link_language == 'cpp'
1308 disassemblers += {
1309 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1310 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1311 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1312 }
1313endif
1314
Paolo Bonzini0a189112020-11-17 14:58:32 +01001315host_kconfig = \
1316 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
1317 ('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
1318 ('CONFIG_IVSHMEM' in config_host ? ['CONFIG_IVSHMEM=y'] : []) + \
1319 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01001320 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001321 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1322 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1323 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01001324 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001325 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman3090de62021-01-29 11:46:05 -05001326 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : []) + \
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01001327 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01001328
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001329ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001330
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001331default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1332actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001333fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001334foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04001335 config_target = { 'TARGET_NAME': target.split('-')[0] }
1336 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001337 if targetos != 'linux'
1338 if default_targets
1339 continue
1340 endif
1341 error('Target @0@ is only available on a Linux host'.format(target))
1342 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001343 config_target += { 'CONFIG_LINUX_USER': 'y' }
1344 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001345 if 'CONFIG_BSD' not in config_host
1346 if default_targets
1347 continue
1348 endif
1349 error('Target @0@ is only available on a BSD host'.format(target))
1350 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001351 config_target += { 'CONFIG_BSD_USER': 'y' }
1352 elif target.endswith('softmmu')
1353 config_target += { 'CONFIG_SOFTMMU': 'y' }
1354 endif
1355 if target.endswith('-user')
1356 config_target += {
1357 'CONFIG_USER_ONLY': 'y',
1358 'CONFIG_QEMU_INTERP_PREFIX':
1359 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1360 }
1361 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001362
Paolo Bonzini0a189112020-11-17 14:58:32 +01001363 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04001364 foreach sym: accelerators
1365 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1366 config_target += { sym: 'y' }
1367 config_all += { sym: 'y' }
Paolo Bonzini23a77b22020-12-14 12:01:45 +01001368 if sym == 'CONFIG_TCG' and tcg_arch == 'tci'
1369 config_target += { 'CONFIG_TCG_INTERPRETER': 'y' }
1370 elif sym == 'CONFIG_XEN' and have_xen_pci_passthrough
Paolo Bonzini8a199802020-09-18 05:37:01 -04001371 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1372 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01001373 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04001374 endif
1375 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01001376 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001377 if default_targets
1378 continue
1379 endif
1380 error('No accelerator available for target @0@'.format(target))
1381 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001382
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001383 actual_target_dirs += target
Paolo Bonzini765686d2020-09-18 06:37:21 -04001384 config_target += keyval.load('default-configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001385 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001386
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001387 if 'TARGET_NEED_FDT' in config_target
1388 fdt_required += target
1389 endif
1390
Paolo Bonzinifa731682020-09-21 05:19:07 -04001391 # Add default keys
1392 if 'TARGET_BASE_ARCH' not in config_target
1393 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1394 endif
1395 if 'TARGET_ABI_DIR' not in config_target
1396 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1397 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001398
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001399 foreach k, v: disassemblers
1400 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1401 foreach sym: v
1402 config_target += { sym: 'y' }
1403 config_all_disas += { sym: 'y' }
1404 endforeach
1405 endif
1406 endforeach
1407
Paolo Bonzini859aef02020-08-04 18:14:26 +02001408 config_target_data = configuration_data()
1409 foreach k, v: config_target
1410 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1411 # do nothing
1412 elif ignored.contains(k)
1413 # do nothing
1414 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001415 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1416 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001417 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001418 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001419 config_target_data.set_quoted(k, v)
1420 elif v == 'y'
1421 config_target_data.set(k, 1)
1422 else
1423 config_target_data.set(k, v)
1424 endif
1425 endforeach
1426 config_target_h += {target: configure_file(output: target + '-config-target.h',
1427 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001428
1429 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001430 config_devices_mak = target + '-config-devices.mak'
1431 config_devices_mak = configure_file(
Paolo Bonzini1bb4cb12020-09-18 06:06:09 -04001432 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001433 output: config_devices_mak,
1434 depfile: config_devices_mak + '.d',
1435 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01001436 command: [minikconf,
1437 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01001438 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzini0a189112020-11-17 14:58:32 +01001439 host_kconfig, accel_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02001440
1441 config_devices_data = configuration_data()
1442 config_devices = keyval.load(config_devices_mak)
1443 foreach k, v: config_devices
1444 config_devices_data.set(k, 1)
1445 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001446 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001447 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1448 configuration: config_devices_data)}
1449 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001450 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001451 endif
1452 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001453endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001454target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001455
Paolo Bonzini2becc362020-02-03 11:42:03 +01001456# This configuration is used to build files that are shared by
1457# multiple binaries, and then extracted out of the "common"
1458# static_library target.
1459#
1460# We do not use all_sources()/all_dependencies(), because it would
1461# build literally all source files, including devices only used by
1462# targets that are not built for this compilation. The CONFIG_ALL
1463# pseudo symbol replaces it.
1464
Paolo Bonzini05512f52020-09-16 15:31:11 -04001465config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001466config_all += config_host
1467config_all += config_all_disas
1468config_all += {
1469 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1470 'CONFIG_SOFTMMU': have_system,
1471 'CONFIG_USER_ONLY': have_user,
1472 'CONFIG_ALL': true,
1473}
1474
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001475##############
1476# Submodules #
1477##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001478
1479capstone = not_found
1480capstone_opt = get_option('capstone')
1481if capstone_opt in ['enabled', 'auto', 'system']
1482 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07001483 capstone = dependency('capstone', version: '>=4.0',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001484 kwargs: static_kwargs, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001485 required: capstone_opt == 'system' or
1486 capstone_opt == 'enabled' and not have_internal)
1487 if capstone.found()
1488 capstone_opt = 'system'
1489 elif have_internal
1490 capstone_opt = 'internal'
1491 else
1492 capstone_opt = 'disabled'
1493 endif
1494endif
1495if capstone_opt == 'internal'
1496 capstone_data = configuration_data()
1497 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1498
1499 capstone_files = files(
1500 'capstone/cs.c',
1501 'capstone/MCInst.c',
1502 'capstone/MCInstrDesc.c',
1503 'capstone/MCRegisterInfo.c',
1504 'capstone/SStream.c',
1505 'capstone/utils.c'
1506 )
1507
1508 if 'CONFIG_ARM_DIS' in config_all_disas
1509 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1510 capstone_files += files(
1511 'capstone/arch/ARM/ARMDisassembler.c',
1512 'capstone/arch/ARM/ARMInstPrinter.c',
1513 'capstone/arch/ARM/ARMMapping.c',
1514 'capstone/arch/ARM/ARMModule.c'
1515 )
1516 endif
1517
1518 # FIXME: This config entry currently depends on a c++ compiler.
1519 # Which is needed for building libvixl, but not for capstone.
1520 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1521 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1522 capstone_files += files(
1523 'capstone/arch/AArch64/AArch64BaseInfo.c',
1524 'capstone/arch/AArch64/AArch64Disassembler.c',
1525 'capstone/arch/AArch64/AArch64InstPrinter.c',
1526 'capstone/arch/AArch64/AArch64Mapping.c',
1527 'capstone/arch/AArch64/AArch64Module.c'
1528 )
1529 endif
1530
1531 if 'CONFIG_PPC_DIS' in config_all_disas
1532 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1533 capstone_files += files(
1534 'capstone/arch/PowerPC/PPCDisassembler.c',
1535 'capstone/arch/PowerPC/PPCInstPrinter.c',
1536 'capstone/arch/PowerPC/PPCMapping.c',
1537 'capstone/arch/PowerPC/PPCModule.c'
1538 )
1539 endif
1540
Richard Henderson3d562842020-01-04 07:24:59 +10001541 if 'CONFIG_S390_DIS' in config_all_disas
1542 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1543 capstone_files += files(
1544 'capstone/arch/SystemZ/SystemZDisassembler.c',
1545 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1546 'capstone/arch/SystemZ/SystemZMapping.c',
1547 'capstone/arch/SystemZ/SystemZModule.c',
1548 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1549 )
1550 endif
1551
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001552 if 'CONFIG_I386_DIS' in config_all_disas
1553 capstone_data.set('CAPSTONE_HAS_X86', 1)
1554 capstone_files += files(
1555 'capstone/arch/X86/X86Disassembler.c',
1556 'capstone/arch/X86/X86DisassemblerDecoder.c',
1557 'capstone/arch/X86/X86ATTInstPrinter.c',
1558 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07001559 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001560 'capstone/arch/X86/X86Mapping.c',
1561 'capstone/arch/X86/X86Module.c'
1562 )
1563 endif
1564
1565 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1566
1567 capstone_cargs = [
1568 # FIXME: There does not seem to be a way to completely replace the c_args
1569 # that come from add_project_arguments() -- we can only add to them.
1570 # So: disable all warnings with a big hammer.
1571 '-Wno-error', '-w',
1572
1573 # Include all configuration defines via a header file, which will wind up
1574 # as a dependency on the object file, and thus changes here will result
1575 # in a rebuild.
1576 '-include', 'capstone-defs.h'
1577 ]
1578
1579 libcapstone = static_library('capstone',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001580 build_by_default: false,
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001581 sources: capstone_files,
1582 c_args: capstone_cargs,
1583 include_directories: 'capstone/include')
1584 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07001585 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001586endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001587
1588slirp = not_found
1589slirp_opt = 'disabled'
1590if have_system
1591 slirp_opt = get_option('slirp')
1592 if slirp_opt in ['enabled', 'auto', 'system']
1593 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001594 slirp = dependency('slirp', kwargs: static_kwargs,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001595 method: 'pkg-config',
1596 required: slirp_opt == 'system' or
1597 slirp_opt == 'enabled' and not have_internal)
1598 if slirp.found()
1599 slirp_opt = 'system'
1600 elif have_internal
1601 slirp_opt = 'internal'
1602 else
1603 slirp_opt = 'disabled'
1604 endif
1605 endif
1606 if slirp_opt == 'internal'
1607 slirp_deps = []
1608 if targetos == 'windows'
1609 slirp_deps = cc.find_library('iphlpapi')
1610 endif
1611 slirp_conf = configuration_data()
1612 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1613 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1614 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1615 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1616 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1617 slirp_files = [
1618 'slirp/src/arp_table.c',
1619 'slirp/src/bootp.c',
1620 'slirp/src/cksum.c',
1621 'slirp/src/dhcpv6.c',
1622 'slirp/src/dnssearch.c',
1623 'slirp/src/if.c',
1624 'slirp/src/ip6_icmp.c',
1625 'slirp/src/ip6_input.c',
1626 'slirp/src/ip6_output.c',
1627 'slirp/src/ip_icmp.c',
1628 'slirp/src/ip_input.c',
1629 'slirp/src/ip_output.c',
1630 'slirp/src/mbuf.c',
1631 'slirp/src/misc.c',
1632 'slirp/src/ncsi.c',
1633 'slirp/src/ndp_table.c',
1634 'slirp/src/sbuf.c',
1635 'slirp/src/slirp.c',
1636 'slirp/src/socket.c',
1637 'slirp/src/state.c',
1638 'slirp/src/stream.c',
1639 'slirp/src/tcp_input.c',
1640 'slirp/src/tcp_output.c',
1641 'slirp/src/tcp_subr.c',
1642 'slirp/src/tcp_timer.c',
1643 'slirp/src/tftp.c',
1644 'slirp/src/udp.c',
1645 'slirp/src/udp6.c',
1646 'slirp/src/util.c',
1647 'slirp/src/version.c',
1648 'slirp/src/vmstate.c',
1649 ]
1650
1651 configure_file(
1652 input : 'slirp/src/libslirp-version.h.in',
1653 output : 'libslirp-version.h',
1654 configuration: slirp_conf)
1655
1656 slirp_inc = include_directories('slirp', 'slirp/src')
1657 libslirp = static_library('slirp',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001658 build_by_default: false,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001659 sources: slirp_files,
1660 c_args: slirp_cargs,
1661 include_directories: slirp_inc)
1662 slirp = declare_dependency(link_with: libslirp,
1663 dependencies: slirp_deps,
1664 include_directories: slirp_inc)
1665 endif
1666endif
1667
Daniele Buonoc7153432021-03-03 21:59:38 -05001668# For CFI, we need to compile slirp as a static library together with qemu.
1669# This is because we register slirp functions as callbacks for QEMU Timers.
1670# When using a system-wide shared libslirp, the type information for the
1671# callback is missing and the timer call produces a false positive with CFI.
1672#
1673# Now that slirp_opt has been defined, check if the selected slirp is compatible
1674# with control-flow integrity.
1675if get_option('cfi') and slirp_opt == 'system'
1676 error('Control-Flow Integrity is not compatible with system-wide slirp.' \
1677 + ' Please configure with --enable-slirp=git')
1678endif
1679
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001680fdt = not_found
1681fdt_opt = get_option('fdt')
1682if have_system
1683 if fdt_opt in ['enabled', 'auto', 'system']
1684 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001685 fdt = cc.find_library('fdt', kwargs: static_kwargs,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001686 required: fdt_opt == 'system' or
1687 fdt_opt == 'enabled' and not have_internal)
1688 if fdt.found() and cc.links('''
1689 #include <libfdt.h>
1690 #include <libfdt_env.h>
1691 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1692 dependencies: fdt)
1693 fdt_opt = 'system'
1694 elif have_internal
1695 fdt_opt = 'internal'
1696 else
1697 fdt_opt = 'disabled'
1698 endif
1699 endif
1700 if fdt_opt == 'internal'
1701 fdt_files = files(
1702 'dtc/libfdt/fdt.c',
1703 'dtc/libfdt/fdt_ro.c',
1704 'dtc/libfdt/fdt_wip.c',
1705 'dtc/libfdt/fdt_sw.c',
1706 'dtc/libfdt/fdt_rw.c',
1707 'dtc/libfdt/fdt_strerror.c',
1708 'dtc/libfdt/fdt_empty_tree.c',
1709 'dtc/libfdt/fdt_addresses.c',
1710 'dtc/libfdt/fdt_overlay.c',
1711 'dtc/libfdt/fdt_check.c',
1712 )
1713
1714 fdt_inc = include_directories('dtc/libfdt')
1715 libfdt = static_library('fdt',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001716 build_by_default: false,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001717 sources: fdt_files,
1718 include_directories: fdt_inc)
1719 fdt = declare_dependency(link_with: libfdt,
1720 include_directories: fdt_inc)
1721 endif
1722endif
1723if not fdt.found() and fdt_required.length() > 0
1724 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1725endif
1726
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001727config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001728config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001729config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001730
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001731#####################
1732# Generated sources #
1733#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001734
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001735genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001736
Marc-André Lureau3f885652019-07-15 18:06:04 +04001737hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04001738shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001739qapi_gen = find_program('scripts/qapi-gen.py')
1740qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1741 meson.source_root() / 'scripts/qapi/commands.py',
1742 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001743 meson.source_root() / 'scripts/qapi/error.py',
1744 meson.source_root() / 'scripts/qapi/events.py',
1745 meson.source_root() / 'scripts/qapi/expr.py',
1746 meson.source_root() / 'scripts/qapi/gen.py',
1747 meson.source_root() / 'scripts/qapi/introspect.py',
1748 meson.source_root() / 'scripts/qapi/parser.py',
1749 meson.source_root() / 'scripts/qapi/schema.py',
1750 meson.source_root() / 'scripts/qapi/source.py',
1751 meson.source_root() / 'scripts/qapi/types.py',
1752 meson.source_root() / 'scripts/qapi/visit.py',
1753 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001754 meson.source_root() / 'scripts/qapi-gen.py'
1755]
1756
1757tracetool = [
1758 python, files('scripts/tracetool.py'),
1759 '--backend=' + config_host['TRACE_BACKENDS']
1760]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00001761tracetool_depends = files(
1762 'scripts/tracetool/backend/log.py',
1763 'scripts/tracetool/backend/__init__.py',
1764 'scripts/tracetool/backend/dtrace.py',
1765 'scripts/tracetool/backend/ftrace.py',
1766 'scripts/tracetool/backend/simple.py',
1767 'scripts/tracetool/backend/syslog.py',
1768 'scripts/tracetool/backend/ust.py',
1769 'scripts/tracetool/format/tcg_h.py',
1770 'scripts/tracetool/format/ust_events_c.py',
1771 'scripts/tracetool/format/ust_events_h.py',
1772 'scripts/tracetool/format/__init__.py',
1773 'scripts/tracetool/format/d.py',
1774 'scripts/tracetool/format/tcg_helper_c.py',
1775 'scripts/tracetool/format/simpletrace_stap.py',
1776 'scripts/tracetool/format/c.py',
1777 'scripts/tracetool/format/h.py',
1778 'scripts/tracetool/format/tcg_helper_h.py',
1779 'scripts/tracetool/format/log_stap.py',
1780 'scripts/tracetool/format/stap.py',
1781 'scripts/tracetool/format/tcg_helper_wrapper_h.py',
1782 'scripts/tracetool/__init__.py',
1783 'scripts/tracetool/transform.py',
1784 'scripts/tracetool/vcpu.py'
1785)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001786
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001787qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1788 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02001789 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001790qemu_version = custom_target('qemu-version.h',
1791 output: 'qemu-version.h',
1792 command: qemu_version_cmd,
1793 capture: true,
1794 build_by_default: true,
1795 build_always_stale: true)
1796genh += qemu_version
1797
Marc-André Lureau3f885652019-07-15 18:06:04 +04001798hxdep = []
1799hx_headers = [
1800 ['qemu-options.hx', 'qemu-options.def'],
1801 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1802]
1803if have_system
1804 hx_headers += [
1805 ['hmp-commands.hx', 'hmp-commands.h'],
1806 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1807 ]
1808endif
1809foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001810 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04001811 input: files(d[0]),
1812 output: d[1],
1813 capture: true,
1814 build_by_default: true, # to be removed when added to a target
1815 command: [hxtool, '-h', '@INPUT0@'])
1816endforeach
1817genh += hxdep
1818
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001819###################
1820# Collect sources #
1821###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001822
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001823authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001824blockdev_ss = ss.source_set()
1825block_ss = ss.source_set()
1826bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001827chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001828common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001829crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001830io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001831linux_user_ss = ss.source_set()
1832qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001833qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001834softmmu_ss = ss.source_set()
1835specific_fuzz_ss = ss.source_set()
1836specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001837stub_ss = ss.source_set()
1838trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001839user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001840util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001841
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001842modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001843hw_arch = {}
1844target_arch = {}
1845target_softmmu_arch = {}
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02001846target_user_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001847
1848###############
1849# Trace files #
1850###############
1851
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001852# TODO: add each directory to the subdirs from its own meson.build, once
1853# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001854trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001855 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01001856 'qapi',
1857 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001858 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01001859 'util',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001860]
1861if have_user
1862 trace_events_subdirs += [ 'linux-user' ]
1863endif
1864if have_block
1865 trace_events_subdirs += [
1866 'authz',
1867 'block',
1868 'io',
1869 'nbd',
1870 'scsi',
1871 ]
1872endif
1873if have_system
1874 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01001875 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001876 'audio',
1877 'backends',
1878 'backends/tpm',
1879 'chardev',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001880 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001881 'hw/9pfs',
1882 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08001883 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001884 'hw/alpha',
1885 'hw/arm',
1886 'hw/audio',
1887 'hw/block',
1888 'hw/block/dataplane',
1889 'hw/char',
1890 'hw/display',
1891 'hw/dma',
1892 'hw/hppa',
1893 'hw/hyperv',
1894 'hw/i2c',
1895 'hw/i386',
1896 'hw/i386/xen',
1897 'hw/ide',
1898 'hw/input',
1899 'hw/intc',
1900 'hw/isa',
1901 'hw/mem',
1902 'hw/mips',
1903 'hw/misc',
1904 'hw/misc/macio',
1905 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08001906 'hw/net/can',
Klaus Jensen88eea452021-04-14 22:14:30 +02001907 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001908 'hw/nvram',
1909 'hw/pci',
1910 'hw/pci-host',
1911 'hw/ppc',
1912 'hw/rdma',
1913 'hw/rdma/vmw',
1914 'hw/rtc',
1915 'hw/s390x',
1916 'hw/scsi',
1917 'hw/sd',
1918 'hw/sparc',
1919 'hw/sparc64',
1920 'hw/ssi',
1921 'hw/timer',
1922 'hw/tpm',
1923 'hw/usb',
1924 'hw/vfio',
1925 'hw/virtio',
1926 'hw/watchdog',
1927 'hw/xen',
1928 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001929 'migration',
1930 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02001931 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001932 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05001933 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001934 ]
1935endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01001936if have_system or have_user
1937 trace_events_subdirs += [
1938 'accel/tcg',
1939 'hw/core',
1940 'target/arm',
1941 'target/hppa',
1942 'target/i386',
1943 'target/i386/kvm',
1944 'target/mips',
1945 'target/ppc',
1946 'target/riscv',
1947 'target/s390x',
1948 'target/sparc',
1949 ]
1950endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001951
Marc-André Lureau0df750e2020-11-25 14:06:37 +04001952vhost_user = not_found
1953if 'CONFIG_VHOST_USER' in config_host
1954 libvhost_user = subproject('libvhost-user')
1955 vhost_user = libvhost_user.get_variable('vhost_user_dep')
1956endif
1957
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001958subdir('qapi')
1959subdir('qobject')
1960subdir('stubs')
1961subdir('trace')
1962subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04001963subdir('qom')
1964subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001965subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04001966subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001967
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001968
1969if enable_modules
1970 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1971 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1972endif
1973
Paolo Bonzini2becc362020-02-03 11:42:03 +01001974stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001975
1976util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01001977util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001978libqemuutil = static_library('qemuutil',
1979 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini7fa1c632021-06-01 10:00:48 +02001980 dependencies: [util_ss.dependencies(), libm, glib, socket, malloc, pixman])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001981qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04001982 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001983
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01001984if have_system or have_user
1985 decodetree = generator(find_program('scripts/decodetree.py'),
1986 output: 'decode-@BASENAME@.c.inc',
1987 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1988 subdir('libdecnumber')
1989 subdir('target')
1990endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001991
Paolo Bonzini478e9432020-08-17 12:47:55 +02001992subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04001993subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04001994subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001995subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04001996subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001997
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01001998if have_block
1999 block_ss.add(files(
2000 'block.c',
2001 'blockjob.c',
2002 'job.c',
2003 'qemu-io-cmds.c',
2004 ))
2005 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002006
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002007 subdir('nbd')
2008 subdir('scsi')
2009 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002010
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002011 blockdev_ss.add(files(
2012 'blockdev.c',
2013 'blockdev-nbd.c',
2014 'iothread.c',
2015 'job-qmp.c',
2016 ), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02002017
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002018 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
2019 # os-win32.c does not
2020 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
2021 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
2022endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02002023
2024common_ss.add(files('cpus-common.c'))
2025
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02002026subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002027
Richard Hendersonf3433462020-09-12 10:47:33 -07002028common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02002029specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002030
Richard Henderson44b99a62021-03-22 12:24:26 +01002031# Work around a gcc bug/misfeature wherein constant propagation looks
2032# through an alias:
2033# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
2034# to guess that a const variable is always zero. Without lto, this is
2035# impossible, as the alias is restricted to page-vary-common.c. Indeed,
2036# without lto, not even the alias is required -- we simply use different
2037# declarations in different compilation units.
2038pagevary = files('page-vary-common.c')
2039if get_option('b_lto')
2040 pagevary_flags = ['-fno-lto']
2041 if get_option('cfi')
2042 pagevary_flags += '-fno-sanitize=cfi-icall'
2043 endif
2044 pagevary = static_library('page-vary-common', sources: pagevary,
2045 c_args: pagevary_flags)
2046 pagevary = declare_dependency(link_with: pagevary)
2047endif
2048common_ss.add(pagevary)
Richard Henderson6670d4d2021-03-22 12:24:24 +01002049specific_ss.add(files('page-vary.c'))
2050
Marc-André Lureauab318052019-07-24 19:23:16 +04002051subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04002052subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04002053subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002054subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04002055subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04002056subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00002057subdir('semihosting')
Marc-André Lureau582ea952019-08-15 15:15:32 +04002058subdir('hw')
Richard Henderson104cc2c2021-03-08 12:04:33 -08002059subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08002060subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04002061subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002062subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04002063subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04002064subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002065subdir('ebpf')
2066
2067common_ss.add(libbpf)
Marc-André Lureau3a304462019-08-18 16:13:08 +04002068
Marc-André Lureaub309c322019-08-18 19:20:37 +04002069bsd_user_ss.add(files('gdbstub.c'))
2070specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
2071
Marc-André Lureau3a304462019-08-18 16:13:08 +04002072linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
2073specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02002074
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002075# needed for fuzzing binaries
2076subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002077subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002078
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002079########################
2080# Library dependencies #
2081########################
2082
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002083block_mods = []
2084softmmu_mods = []
2085foreach d, list : modules
2086 foreach m, module_ss : list
2087 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02002088 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002089 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
2090 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
2091 if d == 'block'
2092 block_mods += sl
2093 else
2094 softmmu_mods += sl
2095 endif
2096 else
2097 if d == 'block'
2098 block_ss.add_all(module_ss)
2099 else
2100 softmmu_ss.add_all(module_ss)
2101 endif
2102 endif
2103 endforeach
2104endforeach
2105
2106nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08002107undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002108block_syms = custom_target('block.syms', output: 'block.syms',
2109 input: [libqemuutil, block_mods],
2110 capture: true,
2111 command: [undefsym, nm, '@INPUT@'])
2112qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
2113 input: [libqemuutil, softmmu_mods],
2114 capture: true,
2115 command: [undefsym, nm, '@INPUT@'])
2116
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02002117qom_ss = qom_ss.apply(config_host, strict: false)
2118libqom = static_library('qom', qom_ss.sources() + genh,
2119 dependencies: [qom_ss.dependencies()],
2120 name_suffix: 'fa')
2121
2122qom = declare_dependency(link_whole: libqom)
2123
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02002124authz_ss = authz_ss.apply(config_host, strict: false)
2125libauthz = static_library('authz', authz_ss.sources() + genh,
2126 dependencies: [authz_ss.dependencies()],
2127 name_suffix: 'fa',
2128 build_by_default: false)
2129
2130authz = declare_dependency(link_whole: libauthz,
2131 dependencies: qom)
2132
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002133crypto_ss = crypto_ss.apply(config_host, strict: false)
2134libcrypto = static_library('crypto', crypto_ss.sources() + genh,
2135 dependencies: [crypto_ss.dependencies()],
2136 name_suffix: 'fa',
2137 build_by_default: false)
2138
2139crypto = declare_dependency(link_whole: libcrypto,
2140 dependencies: [authz, qom])
2141
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002142io_ss = io_ss.apply(config_host, strict: false)
2143libio = static_library('io', io_ss.sources() + genh,
2144 dependencies: [io_ss.dependencies()],
2145 link_with: libqemuutil,
2146 name_suffix: 'fa',
2147 build_by_default: false)
2148
2149io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
2150
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02002151libmigration = static_library('migration', sources: migration_files + genh,
2152 name_suffix: 'fa',
2153 build_by_default: false)
2154migration = declare_dependency(link_with: libmigration,
2155 dependencies: [zlib, qom, io])
2156softmmu_ss.add(migration)
2157
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002158block_ss = block_ss.apply(config_host, strict: false)
2159libblock = static_library('block', block_ss.sources() + genh,
2160 dependencies: block_ss.dependencies(),
2161 link_depends: block_syms,
2162 name_suffix: 'fa',
2163 build_by_default: false)
2164
2165block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002166 link_args: '@block.syms',
2167 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002168
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002169blockdev_ss = blockdev_ss.apply(config_host, strict: false)
2170libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
2171 dependencies: blockdev_ss.dependencies(),
2172 name_suffix: 'fa',
2173 build_by_default: false)
2174
2175blockdev = declare_dependency(link_whole: [libblockdev],
2176 dependencies: [block])
2177
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002178qmp_ss = qmp_ss.apply(config_host, strict: false)
2179libqmp = static_library('qmp', qmp_ss.sources() + genh,
2180 dependencies: qmp_ss.dependencies(),
2181 name_suffix: 'fa',
2182 build_by_default: false)
2183
2184qmp = declare_dependency(link_whole: [libqmp])
2185
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002186libchardev = static_library('chardev', chardev_ss.sources() + genh,
2187 name_suffix: 'fa',
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002188 dependencies: [gnutls],
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002189 build_by_default: false)
2190
2191chardev = declare_dependency(link_whole: libchardev)
2192
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02002193libhwcore = static_library('hwcore', sources: hwcore_files + genh,
2194 name_suffix: 'fa',
2195 build_by_default: false)
2196hwcore = declare_dependency(link_whole: libhwcore)
2197common_ss.add(hwcore)
2198
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02002199###########
2200# Targets #
2201###########
2202
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002203foreach m : block_mods + softmmu_mods
2204 shared_module(m.name(),
2205 name_prefix: '',
2206 link_whole: m,
2207 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002208 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002209endforeach
2210
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002211softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002212common_ss.add(qom, qemuutil)
2213
2214common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01002215common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
2216
2217common_all = common_ss.apply(config_all, strict: false)
2218common_all = static_library('common',
2219 build_by_default: false,
2220 sources: common_all.sources() + genh,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09002221 implicit_include_directories: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002222 dependencies: common_all.dependencies(),
2223 name_suffix: 'fa')
2224
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002225feature_to_c = find_program('scripts/feature_to_c.sh')
2226
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002227emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002228foreach target : target_dirs
2229 config_target = config_target_mak[target]
2230 target_name = config_target['TARGET_NAME']
2231 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02002232 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002233 arch_deps = []
2234 c_args = ['-DNEED_CPU_H',
2235 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2236 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04002237 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01002238
Paolo Bonzini859aef02020-08-04 18:14:26 +02002239 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01002240 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2241 if targetos == 'linux'
2242 target_inc += include_directories('linux-headers', is_system: true)
2243 endif
2244 if target.endswith('-softmmu')
2245 qemu_target_name = 'qemu-system-' + target_name
2246 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002247 t = target_softmmu_arch[arch].apply(config_target, strict: false)
2248 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002249 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002250
Marc-André Lureau2c442202019-08-17 13:55:58 +04002251 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
2252 hw = hw_arch[hw_dir].apply(config_target, strict: false)
2253 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002254 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04002255
Paolo Bonzini2becc362020-02-03 11:42:03 +01002256 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002257 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002258 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04002259 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002260 target_type='user'
2261 qemu_target_name = 'qemu-' + target_name
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02002262 if arch in target_user_arch
2263 t = target_user_arch[arch].apply(config_target, strict: false)
2264 arch_srcs += t.sources()
2265 arch_deps += t.dependencies()
2266 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002267 if 'CONFIG_LINUX_USER' in config_target
2268 base_dir = 'linux-user'
2269 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
2270 else
2271 base_dir = 'bsd-user'
Stacey Sonea1ab4c2020-12-18 13:54:50 -07002272 target_inc += include_directories('bsd-user/freebsd')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002273 endif
2274 target_inc += include_directories(
2275 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04002276 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002277 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04002278 if 'CONFIG_LINUX_USER' in config_target
2279 dir = base_dir / abi
2280 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
2281 if config_target.has_key('TARGET_SYSTBL_ABI')
2282 arch_srcs += \
2283 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
2284 extra_args : config_target['TARGET_SYSTBL_ABI'])
2285 endif
2286 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002287 endif
2288
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002289 if 'TARGET_XML_FILES' in config_target
2290 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
2291 output: target + '-gdbstub-xml.c',
2292 input: files(config_target['TARGET_XML_FILES'].split()),
2293 command: [feature_to_c, '@INPUT@'],
2294 capture: true)
2295 arch_srcs += gdbstub_xml
2296 endif
2297
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002298 t = target_arch[arch].apply(config_target, strict: false)
2299 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002300 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002301
Paolo Bonzini2becc362020-02-03 11:42:03 +01002302 target_common = common_ss.apply(config_target, strict: false)
2303 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002304 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002305
Paolo Bonzini2becc362020-02-03 11:42:03 +01002306 target_specific = specific_ss.apply(config_target, strict: false)
2307 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002308 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002309
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002310 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02002311 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002312 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002313 objects: objects,
2314 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002315 c_args: c_args,
2316 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002317 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002318
2319 if target.endswith('-softmmu')
2320 execs = [{
2321 'name': 'qemu-system-' + target_name,
2322 'gui': false,
2323 'sources': files('softmmu/main.c'),
2324 'dependencies': []
2325 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002326 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002327 execs += [{
2328 'name': 'qemu-system-' + target_name + 'w',
2329 'gui': true,
2330 'sources': files('softmmu/main.c'),
2331 'dependencies': []
2332 }]
2333 endif
2334 if config_host.has_key('CONFIG_FUZZ')
2335 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
2336 execs += [{
2337 'name': 'qemu-fuzz-' + target_name,
2338 'gui': false,
2339 'sources': specific_fuzz.sources(),
2340 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002341 }]
2342 endif
2343 else
2344 execs = [{
2345 'name': 'qemu-' + target_name,
2346 'gui': false,
2347 'sources': [],
2348 'dependencies': []
2349 }]
2350 endif
2351 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01002352 exe_name = exe['name']
2353 exe_sign = 'CONFIG_HVF' in config_target
2354 if exe_sign
2355 exe_name += '-unsigned'
2356 endif
2357
2358 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09002359 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002360 c_args: c_args,
2361 dependencies: arch_deps + deps + exe['dependencies'],
2362 objects: lib.extract_all_objects(recursive: true),
2363 link_language: link_language,
2364 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
2365 link_args: link_args,
2366 gui_app: exe['gui'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01002367
2368 if exe_sign
2369 emulators += {exe['name'] : custom_target(exe['name'],
Alexander Graf8a74ce62021-01-20 23:44:34 +01002370 depends: emulator,
2371 output: exe['name'],
2372 command: [
2373 meson.current_source_dir() / 'scripts/entitlement.sh',
2374 meson.current_build_dir() / exe_name,
2375 meson.current_build_dir() / exe['name'],
2376 meson.current_source_dir() / 'accel/hvf/entitlements.plist'
2377 ])
2378 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09002379
2380 meson.add_install_script('scripts/entitlement.sh', '--install',
2381 get_option('bindir') / exe_name,
2382 get_option('bindir') / exe['name'],
2383 meson.current_source_dir() / 'accel/hvf/entitlements.plist')
Alexander Graf8a74ce62021-01-20 23:44:34 +01002384 else
2385 emulators += {exe['name']: emulator}
2386 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002387
2388 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
2389 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002390 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
2391 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002392 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
2393 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
2394 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002395 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002396 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002397 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002398 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002399 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002400 command: [
2401 tracetool, '--group=all', '--format=' + stp['fmt'],
2402 '--binary=' + stp['bin'],
2403 '--target-name=' + target_name,
2404 '--target-type=' + target_type,
2405 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01002406 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002407 ],
2408 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002409 endforeach
2410 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002411 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002412endforeach
2413
Paolo Bonzini931049b2020-02-05 09:44:24 +01002414# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002415
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002416if 'CONFIG_PLUGIN' in config_host
2417 install_headers('include/qemu/qemu-plugin.h')
2418endif
2419
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002420if 'CONFIG_GUEST_AGENT' in config_host
2421 subdir('qga')
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002422elif get_option('guest_agent_msi').enabled()
2423 error('Guest agent MSI requested, but the guest agent is not being built')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002424endif
2425
Laurent Vivier9755c942020-08-24 17:24:30 +02002426# Don't build qemu-keymap if xkbcommon is not explicitly enabled
2427# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002428if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04002429 # used for the update-keymaps target, so include rules even if !have_tools
2430 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
2431 dependencies: [qemuutil, xkbcommon], install: have_tools)
2432endif
2433
Paolo Bonzini931049b2020-02-05 09:44:24 +01002434if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002435 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
2436 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
2437 qemu_io = executable('qemu-io', files('qemu-io.c'),
2438 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01002439 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002440 dependencies: [blockdev, qemuutil, gnutls], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002441
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02002442 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002443 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04002444 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002445
Marc-André Lureau157e7b12019-07-15 14:50:58 +04002446 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
2447 dependencies: qemuutil,
2448 install: true)
2449
Paolo Bonzini931049b2020-02-05 09:44:24 +01002450 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02002451 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002452 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04002453 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02002454 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01002455 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002456
2457 if targetos == 'linux'
2458 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2459 dependencies: [qemuutil, libcap_ng],
2460 install: true,
2461 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002462
2463 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2464 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002465 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002466 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002467 endif
2468
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04002469 if 'CONFIG_IVSHMEM' in config_host
2470 subdir('contrib/ivshmem-client')
2471 subdir('contrib/ivshmem-server')
2472 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01002473endif
2474
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04002475subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002476subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04002477subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02002478subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08002479subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01002480if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04002481 subdir('po')
2482endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002483
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002484if host_machine.system() == 'windows'
2485 nsis_cmd = [
2486 find_program('scripts/nsis.py'),
2487 '@OUTPUT@',
2488 get_option('prefix'),
2489 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01002490 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002491 '--',
2492 '-DDISPLAYVERSION=' + meson.project_version(),
2493 ]
2494 if build_docs
2495 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2496 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002497 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002498 nsis_cmd += '-DCONFIG_GTK=y'
2499 endif
2500
2501 nsis = custom_target('nsis',
2502 output: 'qemu-setup-' + meson.project_version() + '.exe',
2503 input: files('qemu.nsi'),
2504 build_always_stale: true,
2505 command: nsis_cmd + ['@INPUT@'])
2506 alias_target('installer', nsis)
2507endif
2508
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002509#########################
2510# Configuration summary #
2511#########################
2512
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002513# Directories
Paolo Bonzinif9332752020-02-03 13:28:38 +01002514summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002515summary_info += {'Install prefix': get_option('prefix')}
2516summary_info += {'BIOS directory': qemu_datadir}
2517summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2518summary_info += {'binary directory': get_option('bindir')}
2519summary_info += {'library directory': get_option('libdir')}
2520summary_info += {'module directory': qemu_moddir}
2521summary_info += {'libexec directory': get_option('libexecdir')}
2522summary_info += {'include directory': get_option('includedir')}
2523summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002524if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002525 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04002526 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002527else
2528 summary_info += {'local state directory': 'queried at runtime'}
2529endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04002530summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002531summary_info += {'Build directory': meson.current_build_dir()}
2532summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002533summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002534summary(summary_info, bool_yn: true, section: 'Directories')
2535
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002536# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002537summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002538summary_info += {'git': config_host['GIT']}
2539summary_info += {'make': config_host['MAKE']}
2540summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
2541summary_info += {'sphinx-build': sphinx_build.found()}
2542if config_host.has_key('HAVE_GDB_BIN')
2543 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2544endif
2545summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2546if targetos == 'windows' and config_host.has_key('CONFIG_GUEST_AGENT')
2547 summary_info += {'wixl': wixl.found() ? wixl.full_path() : false}
2548endif
Joelle van Dyneb8e0c492021-03-15 11:03:41 -07002549if slirp_opt != 'disabled' and 'CONFIG_SLIRP_SMBD' in config_host
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002550 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2551endif
2552summary(summary_info, bool_yn: true, section: 'Host binaries')
2553
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01002554# Configurable features
2555summary_info = {}
2556summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002557summary_info += {'system-mode emulation': have_system}
2558summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002559summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01002560summary_info += {'Install blobs': get_option('install_blobs')}
2561summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2562if config_host.has_key('CONFIG_MODULES')
2563 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2564endif
2565summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2566summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2567if have_system
2568 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2569endif
2570summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2571if config_host['TRACE_BACKENDS'].split().contains('simple')
2572 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2573endif
2574summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2575summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
2576summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2577summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2578summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2579summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
2580summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
2581summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
2582summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2583summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2584summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2585summary(summary_info, bool_yn: true, section: 'Configurable features')
2586
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002587# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002588summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002589summary_info += {'host CPU': cpu}
2590summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01002591summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
2592summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002593if link_language == 'cpp'
Alex Bennée63de9352021-05-27 17:03:15 +01002594 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002595else
2596 summary_info += {'C++ compiler': false}
2597endif
2598if targetos == 'darwin'
Alex Bennée63de9352021-05-27 17:03:15 +01002599 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002600endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002601if targetos == 'windows'
2602 if 'WIN_SDK' in config_host
2603 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2604 endif
2605endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002606summary_info += {'ARFLAGS': config_host['ARFLAGS']}
Paolo Bonzini47b30832020-09-23 05:26:17 -04002607summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2608 + ['-O' + get_option('optimization')]
2609 + (get_option('debug') ? ['-g'] : []))}
2610if link_language == 'cpp'
2611 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2612 + ['-O' + get_option('optimization')]
2613 + (get_option('debug') ? ['-g'] : []))}
2614endif
2615link_args = get_option(link_language + '_link_args')
2616if link_args.length() > 0
2617 summary_info += {'LDFLAGS': ' '.join(link_args)}
2618endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002619summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2620summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002621summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05002622summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002623summary_info += {'PIE': get_option('b_pie')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02002624summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002625summary_info += {'malloc trim support': has_malloc_trim}
2626summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002627summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2628summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2629summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2630summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
2631summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2632summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2633summary_info += {'memory allocator': get_option('malloc')}
2634summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2635summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2636summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
2637summary_info += {'gcov': get_option('b_coverage')}
2638summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2639summary_info += {'CFI support': get_option('cfi')}
2640if get_option('cfi')
2641 summary_info += {'CFI debug support': get_option('cfi_debug')}
2642endif
2643summary_info += {'strip binaries': get_option('strip')}
2644summary_info += {'sparse': sparse.found() ? sparse.full_path() : false}
2645summary_info += {'mingw32 support': targetos == 'windows'}
Alex Bennée49e85652021-02-22 10:14:50 +00002646
2647# snarf the cross-compilation information for tests
2648foreach target: target_dirs
2649 tcg_mak = meson.current_build_dir() / 'tests/tcg' / 'config-' + target + '.mak'
2650 if fs.exists(tcg_mak)
2651 config_cross_tcg = keyval.load(tcg_mak)
2652 target = config_cross_tcg['TARGET_NAME']
2653 compiler = ''
2654 if 'DOCKER_CROSS_CC_GUEST' in config_cross_tcg
2655 summary_info += {target + ' tests': config_cross_tcg['DOCKER_CROSS_CC_GUEST'] +
2656 ' via ' + config_cross_tcg['DOCKER_IMAGE']}
2657 elif 'CROSS_CC_GUEST' in config_cross_tcg
2658 summary_info += {target + ' tests'
2659 : config_cross_tcg['CROSS_CC_GUEST'] }
2660 endif
2661 endif
2662endforeach
2663
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002664summary(summary_info, bool_yn: true, section: 'Compilation')
2665
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002666# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002667summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002668if have_system
2669 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2670 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2671 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2672 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
Reinoud Zandijk74a414a2021-04-02 22:25:32 +02002673 summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002674 summary_info += {'Xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2675 if config_host.has_key('CONFIG_XEN_BACKEND')
2676 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2677 endif
2678endif
2679summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2680if config_all.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01002681 if get_option('tcg_interpreter')
2682 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, experimental and slow)'}
2683 else
2684 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
2685 endif
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002686 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002687endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002688summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002689if have_system
2690 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01002691 summary_info += {'out of process emulation': multiprocess_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002692endif
2693summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
2694
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002695# Block layer
2696summary_info = {}
2697summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2698summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2699if have_block
2700 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2701 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
2702 summary_info += {'VirtFS support': have_virtfs}
2703 summary_info += {'build virtiofs daemon': have_virtiofsd}
2704 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
2705 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2706 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2707 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2708 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2709 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2710 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2711 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2712 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2713 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002714 summary_info += {'FUSE exports': fuse.found()}
2715endif
2716summary(summary_info, bool_yn: true, section: 'Block layer support')
2717
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002718# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002719summary_info = {}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002720summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
Paolo Bonzini57612512021-06-03 11:15:26 +02002721summary_info += {'GNUTLS support': gnutls.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002722# TODO: add back version
Paolo Bonzini57612512021-06-03 11:15:26 +02002723summary_info += {'libgcrypt': gcrypt.found()}
2724if gcrypt.found()
2725 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002726endif
2727# TODO: add back version
Paolo Bonzini57612512021-06-03 11:15:26 +02002728summary_info += {'nettle': nettle.found()}
2729if nettle.found()
2730 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002731endif
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002732summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
2733summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2734summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
2735summary(summary_info, bool_yn: true, section: 'Crypto')
2736
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01002737# Libraries
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002738summary_info = {}
2739if targetos == 'darwin'
2740 summary_info += {'Cocoa support': cocoa.found()}
2741endif
2742# TODO: add back version
2743summary_info += {'SDL support': sdl.found()}
2744summary_info += {'SDL image support': sdl_image.found()}
2745# TODO: add back version
2746summary_info += {'GTK support': gtk.found()}
2747summary_info += {'pixman': pixman.found()}
2748# TODO: add back version
2749summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002750# TODO: add back version
2751summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
Paolo Bonziniba7ed402021-06-03 11:15:26 +02002752summary_info += {'libtasn1': tasn1.found()}
Paolo Bonzini05e391a2021-06-03 11:15:26 +02002753summary_info += {'PAM': pam.found()}
Yonggang Luo5285e592020-10-13 07:43:48 +08002754summary_info += {'iconv support': iconv.found()}
2755summary_info += {'curses support': curses.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002756# TODO: add back version
2757summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002758summary_info += {'curl support': curl.found()}
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002759summary_info += {'Multipath support': mpathpersist.found()}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002760summary_info += {'VNC support': vnc.found()}
2761if vnc.found()
2762 summary_info += {'VNC SASL support': sasl.found()}
2763 summary_info += {'VNC JPEG support': jpeg.found()}
2764 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002765endif
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002766summary_info += {'brlapi support': brlapi.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002767summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2768summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2769summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2770summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002771summary_info += {'ATTR/XATTR support': libattr.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002772summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2773summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002774summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002775summary_info += {'libcap-ng support': libcap_ng.found()}
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002776summary_info += {'bpf support': libbpf.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002777# TODO: add back protocol and server version
2778summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002779summary_info += {'rbd support': rbd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002780summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
2781summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02002782summary_info += {'U2F support': u2f.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002783summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
2784summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
2785summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
Akihiko Odakibc6a3562021-02-23 15:03:07 +09002786summary_info += {'GBM': config_host.has_key('CONFIG_GBM')}
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002787summary_info += {'libiscsi support': libiscsi.found()}
Paolo Bonzini30045c02020-11-17 13:11:25 +01002788summary_info += {'libnfs support': libnfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002789if targetos == 'windows'
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002790 if config_host.has_key('CONFIG_GUEST_AGENT')
2791 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2792 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002793 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002794endif
Paolo Bonzini90835c22020-11-17 14:22:24 +01002795summary_info += {'seccomp support': seccomp.found()}
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002796summary_info += {'GlusterFS support': glusterfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002797summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2798summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002799summary_info += {'lzo support': lzo.found()}
Paolo Bonzini241611e2020-11-17 13:32:34 +01002800summary_info += {'snappy support': snappy.found()}
Paolo Bonzini29ba6112020-11-17 13:07:52 +01002801summary_info += {'bzip2 support': libbzip2.found()}
Paolo Bonziniecea3692020-11-17 13:35:28 +01002802summary_info += {'lzfse support': liblzfse.found()}
Paolo Bonzinib1def332020-11-17 13:37:39 +01002803summary_info += {'zstd support': zstd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002804summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2805summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002806summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002807summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2808summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002809summary_info += {'libudev': libudev.found()}
Max Reitzdf4ea702020-10-27 20:05:46 +01002810summary_info += {'FUSE lseek': fuse_lseek.found()}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01002811summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01002812
2813if not supported_cpus.contains(cpu)
2814 message()
2815 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2816 message()
2817 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2818 message('The QEMU project intends to remove support for this host CPU in')
2819 message('a future release if nobody volunteers to maintain it and to')
2820 message('provide a build host for our continuous integration setup.')
2821 message('configure has succeeded and you can continue to build, but')
2822 message('if you care about QEMU on this platform you should contact')
2823 message('us upstream at qemu-devel@nongnu.org.')
2824endif
2825
2826if not supported_oses.contains(targetos)
2827 message()
2828 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2829 message()
2830 message('Host OS ' + targetos + 'support is not currently maintained.')
2831 message('The QEMU project intends to remove support for this host OS in')
2832 message('a future release if nobody volunteers to maintain it and to')
2833 message('provide a build host for our continuous integration setup.')
2834 message('configure has succeeded and you can continue to build, but')
2835 message('if you care about QEMU on this platform you should contact')
2836 message('us upstream at qemu-devel@nongnu.org.')
2837endif