blob: e301eda3a58dfff411ffa327f4436ae6a9daf631 [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')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700186 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
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
Paolo Bonzini587d59d2021-06-03 11:31:35 +0200474if not get_option('virglrenderer').auto() or have_system
475 virgl = dependency('virglrenderer',
476 method: 'pkg-config',
477 required: get_option('virglrenderer'),
478 kwargs: static_kwargs)
Marc-André Lureauea458962019-07-12 22:23:46 +0400479endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400480curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100481if not get_option('curl').auto() or have_block
482 curl = dependency('libcurl', version: '>=7.29.0',
483 method: 'pkg-config',
484 required: get_option('curl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100485 kwargs: static_kwargs)
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400486endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200487libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200488if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200489 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +0100490 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400491 required: get_option('libudev'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100492 kwargs: static_kwargs)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200493endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200494
Paolo Bonzini5c530152020-10-15 06:09:27 -0400495mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200496mpathpersist = not_found
497mpathpersist_new_api = false
498if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
499 mpath_test_source_new = '''
500 #include <libudev.h>
501 #include <mpath_persist.h>
502 unsigned mpath_mx_alloc_len = 1024;
503 int logsink;
504 static struct config *multipath_conf;
505 extern struct udev *udev;
506 extern struct config *get_multipath_config(void);
507 extern void put_multipath_config(struct config *conf);
508 struct udev *udev;
509 struct config *get_multipath_config(void) { return multipath_conf; }
510 void put_multipath_config(struct config *conf) { }
511 int main(void) {
512 udev = udev_new();
513 multipath_conf = mpath_lib_init();
514 return 0;
515 }'''
516 mpath_test_source_old = '''
517 #include <libudev.h>
518 #include <mpath_persist.h>
519 unsigned mpath_mx_alloc_len = 1024;
520 int logsink;
521 int main(void) {
522 struct udev *udev = udev_new();
523 mpath_lib_init(udev);
524 return 0;
525 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400526 libmpathpersist = cc.find_library('mpathpersist',
527 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100528 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400529 if libmpathpersist.found()
530 mpathlibs += libmpathpersist
531 if enable_static
532 mpathlibs += cc.find_library('devmapper',
533 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100534 kwargs: static_kwargs)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200535 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400536 mpathlibs += cc.find_library('multipath',
537 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100538 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400539 foreach lib: mpathlibs
540 if not lib.found()
541 mpathlibs = []
542 break
543 endif
544 endforeach
545 if mpathlibs.length() == 0
546 msg = 'Dependencies missing for libmpathpersist'
547 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200548 mpathpersist = declare_dependency(dependencies: mpathlibs)
549 mpathpersist_new_api = true
550 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
551 mpathpersist = declare_dependency(dependencies: mpathlibs)
552 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400553 msg = 'Cannot detect libmpathpersist API'
554 endif
555 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200556 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400557 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200558 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400559 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200560 endif
561 endif
562 endif
563endif
564
Yonggang Luo5285e592020-10-13 07:43:48 +0800565iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800566curses = not_found
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400567if have_system and not get_option('curses').disabled()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400568 curses_test = '''
569 #include <locale.h>
570 #include <curses.h>
571 #include <wchar.h>
572 int main(void) {
573 wchar_t wch = L'w';
574 setlocale(LC_ALL, "");
575 resize_term(0, 0);
576 addwstr(L"wide chars\n");
577 addnwstr(&wch, 1);
578 add_wch(WACS_DEGREE);
579 return 0;
580 }'''
581
Yonggang Luoca31e302020-11-17 05:31:06 +0800582 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
583 foreach curses_dep : curses_dep_list
584 if not curses.found()
585 curses = dependency(curses_dep,
586 required: false,
587 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100588 kwargs: static_kwargs)
Yonggang Luoca31e302020-11-17 05:31:06 +0800589 endif
590 endforeach
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400591 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500592 curses_compile_args = ['-DNCURSES_WIDECHAR']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400593 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500594 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
595 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400596 else
597 msg = 'curses package not usable'
598 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800599 endif
600 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400601 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400602 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
603 if targetos != 'windows' and not has_curses_h
604 message('Trying with /usr/include/ncursesw')
605 curses_compile_args += ['-I/usr/include/ncursesw']
606 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
607 endif
608 if has_curses_h
609 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
610 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800611 libcurses = cc.find_library(curses_libname,
612 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100613 kwargs: static_kwargs)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400614 if libcurses.found()
615 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
616 curses = declare_dependency(compile_args: curses_compile_args,
617 dependencies: [libcurses])
618 break
619 else
620 msg = 'curses library not usable'
621 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800622 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400623 endforeach
624 endif
625 endif
626 if not get_option('iconv').disabled()
627 foreach link_args : [ ['-liconv'], [] ]
628 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
629 # We need to use libiconv if available because mixing libiconv's headers with
630 # the system libc does not work.
631 # However, without adding glib to the dependencies -L/usr/local/lib will not be
632 # included in the command line and libiconv will not be found.
633 if cc.links('''
634 #include <iconv.h>
635 int main(void) {
636 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
637 return conv != (iconv_t) -1;
638 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
639 iconv = declare_dependency(link_args: link_args, dependencies: glib)
640 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800641 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400642 endforeach
643 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400644 if curses.found() and not iconv.found()
645 if get_option('iconv').enabled()
646 error('iconv not available')
647 endif
648 msg = 'iconv required for curses UI but not available'
649 curses = not_found
650 endif
651 if not curses.found() and msg != ''
652 if get_option('curses').enabled()
653 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400654 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400655 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400656 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800657 endif
658endif
659
Paolo Bonzini26347332019-07-29 15:40:07 +0200660brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100661if not get_option('brlapi').auto() or have_system
662 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
663 required: get_option('brlapi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100664 kwargs: static_kwargs)
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100665 if brlapi.found() and not cc.links('''
666 #include <brlapi.h>
667 #include <stddef.h>
668 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
669 brlapi = not_found
670 if get_option('brlapi').enabled()
671 error('could not link brlapi')
672 else
673 warning('could not link brlapi, disabling')
674 endif
675 endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200676endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100677
Paolo Bonzini760e4322020-08-26 08:09:48 +0200678sdl = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100679if not get_option('sdl').auto() or (have_system and not cocoa.found())
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100680 sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200681 sdl_image = not_found
682endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100683if sdl.found()
684 # work around 2.0.8 bug
685 sdl = declare_dependency(compile_args: '-Wno-undef',
686 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200687 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100688 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100689else
690 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100691 error('sdl-image required, but SDL was @0@'.format(
692 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100693 endif
694 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200695endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100696
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400697rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100698if not get_option('rbd').auto() or have_block
699 librados = cc.find_library('rados', required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100700 kwargs: static_kwargs)
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100701 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
702 required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100703 kwargs: static_kwargs)
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100704 if librados.found() and librbd.found()
705 if cc.links('''
706 #include <stdio.h>
707 #include <rbd/librbd.h>
708 int main(void) {
709 rados_t cluster;
710 rados_create(&cluster, NULL);
711 return 0;
712 }''', dependencies: [librbd, librados])
713 rbd = declare_dependency(dependencies: [librbd, librados])
714 elif get_option('rbd').enabled()
715 error('could not link librados')
716 else
717 warning('could not link librados, disabling')
718 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100719 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400720endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100721
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400722glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100723glusterfs_ftruncate_has_stat = false
724glusterfs_iocb_has_stat = false
725if not get_option('glusterfs').auto() or have_block
726 glusterfs = dependency('glusterfs-api', version: '>=3',
727 required: get_option('glusterfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100728 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100729 if glusterfs.found()
730 glusterfs_ftruncate_has_stat = cc.links('''
731 #include <glusterfs/api/glfs.h>
732
733 int
734 main(void)
735 {
736 /* new glfs_ftruncate() passes two additional args */
737 return glfs_ftruncate(NULL, 0, NULL, NULL);
738 }
739 ''', dependencies: glusterfs)
740 glusterfs_iocb_has_stat = cc.links('''
741 #include <glusterfs/api/glfs.h>
742
743 /* new glfs_io_cbk() passes two additional glfs_stat structs */
744 static void
745 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
746 {}
747
748 int
749 main(void)
750 {
751 glfs_io_cbk iocb = &glusterfs_iocb;
752 iocb(NULL, 0 , NULL, NULL, NULL);
753 return 0;
754 }
755 ''', dependencies: glusterfs)
756 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400757endif
758libssh = not_found
759if 'CONFIG_LIBSSH' in config_host
760 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
761 link_args: config_host['LIBSSH_LIBS'].split())
762endif
763libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100764if not get_option('bzip2').auto() or have_block
765 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
766 required: get_option('bzip2'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100767 kwargs: static_kwargs)
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100768 if libbzip2.found() and not cc.links('''
769 #include <bzlib.h>
770 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
771 libbzip2 = not_found
772 if get_option('bzip2').enabled()
773 error('could not link libbzip2')
774 else
775 warning('could not link libbzip2, disabling')
776 endif
777 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400778endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100779
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400780liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +0100781if not get_option('lzfse').auto() or have_block
782 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
783 required: get_option('lzfse'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100784 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400785endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100786if liblzfse.found() and not cc.links('''
787 #include <lzfse.h>
788 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
789 liblzfse = not_found
790 if get_option('lzfse').enabled()
791 error('could not link liblzfse')
792 else
793 warning('could not link liblzfse, disabling')
794 endif
795endif
796
Paolo Bonzini478e9432020-08-17 12:47:55 +0200797oss = not_found
798if 'CONFIG_AUDIO_OSS' in config_host
799 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
800endif
801dsound = not_found
802if 'CONFIG_AUDIO_DSOUND' in config_host
803 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
804endif
805coreaudio = not_found
806if 'CONFIG_AUDIO_COREAUDIO' in config_host
807 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
808endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400809opengl = not_found
810if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400811 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
812 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400813endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100814
Paolo Bonzini57612512021-06-03 11:15:26 +0200815gnutls = not_found
816if not get_option('gnutls').auto() or have_system
817 gnutls = dependency('gnutls', version: '>=3.5.18',
818 method: 'pkg-config',
819 required: get_option('gnutls'),
820 kwargs: static_kwargs)
821endif
822
823# Nettle has priority over gcrypt
824gcrypt = not_found
825nettle = not_found
826xts = 'private'
827if get_option('nettle').enabled() and get_option('gcrypt').enabled()
828 error('Only one of gcrypt & nettle can be enabled')
829elif (not get_option('nettle').auto() or have_system) and not get_option('gcrypt').enabled()
830 nettle = dependency('nettle', version: '>=3.4',
831 method: 'pkg-config',
832 required: get_option('nettle'),
833 kwargs: static_kwargs)
834 if nettle.found() and cc.has_header('nettle/xts.h', dependencies: nettle)
835 xts = 'nettle'
836 endif
837endif
838if (not get_option('gcrypt').auto() or have_system) and not nettle.found()
839 gcrypt = dependency('libgcrypt', version: '>=1.5',
840 method: 'config-tool',
841 required: get_option('gcrypt'),
842 kwargs: static_kwargs)
843 if gcrypt.found() and cc.compiles('''
844 #include <gcrypt.h>
845 int main(void) {
846 gcry_cipher_hd_t handle;
847 gcry_cipher_open(&handle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_XTS, 0);
848 return 0;
849 }
850 ''', dependencies: gcrypt)
851 xts = 'gcrypt'
852 endif
853 # Debian has removed -lgpg-error from libgcrypt-config
854 # as it "spreads unnecessary dependencies" which in
855 # turn breaks static builds...
856 if gcrypt.found() and enable_static
857 gcrypt = declare_dependency(dependencies: [
858 gcrypt,
859 cc.find_library('gpg-error', required: true, kwargs: static_kwargs)])
860 endif
861endif
862
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400863gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +0100864gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +0200865vte = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100866if not get_option('gtk').auto() or (have_system and not cocoa.found())
Paolo Bonzini1b695472021-01-07 14:02:29 +0100867 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
868 method: 'pkg-config',
869 required: get_option('gtk'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100870 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +0100871 if gtk.found()
872 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
873 method: 'pkg-config',
874 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100875 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +0100876 gtk = declare_dependency(dependencies: [gtk, gtkx11])
Paolo Bonzinic23d7b42021-06-03 11:31:35 +0200877
878 if not get_option('vte').auto() or have_system
879 vte = dependency('vte-2.91',
880 method: 'pkg-config',
881 required: get_option('vte'),
882 kwargs: static_kwargs)
883 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100884 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400885endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100886
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400887x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +0200888if gtkx11.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +0100889 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100890 kwargs: static_kwargs)
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400891endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100892vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400893png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400894jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400895sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100896if get_option('vnc').enabled()
897 vnc = declare_dependency() # dummy dependency
898 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100899 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini8e242b32020-11-23 13:34:02 -0500900 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100901 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100902 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
903 required: get_option('vnc_sasl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100904 kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100905 if sasl.found()
906 sasl = declare_dependency(dependencies: sasl,
907 compile_args: '-DSTRUCT_IOVEC_DEFINED')
908 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400909endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100910
Paolo Bonzini05e391a2021-06-03 11:15:26 +0200911pam = not_found
912if not get_option('auth_pam').auto() or have_system
913 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
914 required: get_option('auth_pam'),
915 kwargs: static_kwargs)
916endif
917if pam.found() and not cc.links('''
918 #include <stddef.h>
919 #include <security/pam_appl.h>
920 int main(void) {
921 const char *service_name = "qemu";
922 const char *user = "frank";
923 const struct pam_conv pam_conv = { 0 };
924 pam_handle_t *pamh = NULL;
925 pam_start(service_name, user, &pam_conv, &pamh);
926 return 0;
927 }''', dependencies: pam)
928 pam = not_found
929 if get_option('auth_pam').enabled()
930 error('could not link libpam')
931 else
932 warning('could not link libpam, disabling')
933 endif
934endif
935
Marc-André Lureau708eab42019-09-03 16:59:33 +0400936snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +0100937if not get_option('snappy').auto() or have_system
938 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
939 required: get_option('snappy'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100940 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400941endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100942if snappy.found() and not cc.links('''
943 #include <snappy-c.h>
944 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
945 snappy = not_found
946 if get_option('snappy').enabled()
947 error('could not link libsnappy')
948 else
949 warning('could not link libsnappy, disabling')
950 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400951endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100952
Marc-André Lureau708eab42019-09-03 16:59:33 +0400953lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100954if not get_option('lzo').auto() or have_system
955 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
956 required: get_option('lzo'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100957 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400958endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100959if lzo.found() and not cc.links('''
960 #include <lzo/lzo1x.h>
961 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
962 lzo = not_found
963 if get_option('lzo').enabled()
964 error('could not link liblzo2')
965 else
966 warning('could not link liblzo2, disabling')
967 endif
968endif
969
Marc-André Lureau55166232019-07-24 19:16:22 +0400970rdma = not_found
971if 'CONFIG_RDMA' in config_host
972 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
973endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400974numa = not_found
975if 'CONFIG_NUMA' in config_host
976 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
977endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400978xen = not_found
979if 'CONFIG_XEN_BACKEND' in config_host
980 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
981 link_args: config_host['XEN_LIBS'].split())
982endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200983cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +0200984if not get_option('smartcard').auto() or have_system
985 cacard = dependency('libcacard', required: get_option('smartcard'),
986 version: '>=2.5.1', method: 'pkg-config',
987 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200988endif
César Belley0a40bcb2020-08-26 13:42:04 +0200989u2f = not_found
990if have_system
991 u2f = dependency('u2f-emu', required: get_option('u2f'),
992 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100993 kwargs: static_kwargs)
César Belley0a40bcb2020-08-26 13:42:04 +0200994endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200995usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +0200996if not get_option('usb_redir').auto() or have_system
997 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
998 version: '>=0.6', method: 'pkg-config',
999 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001000endif
1001libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02001002if not get_option('libusb').auto() or have_system
1003 libusb = dependency('libusb-1.0', required: get_option('libusb'),
1004 version: '>=1.0.13', method: 'pkg-config',
1005 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001006endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02001007
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001008libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02001009if not get_option('libpmem').auto() or have_system
1010 libpmem = dependency('libpmem', required: get_option('libpmem'),
1011 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001012endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001013libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02001014if not get_option('libdaxctl').auto() or have_system
1015 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
1016 version: '>=57', method: 'pkg-config',
1017 kwargs: static_kwargs)
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001018endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001019tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02001020if gnutls.found()
1021 tasn1 = dependency('libtasn1',
1022 method: 'pkg-config',
1023 kwargs: static_kwargs)
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001024endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001025keyutils = dependency('libkeyutils', required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001026 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001027
Marc-André Lureau3909def2020-08-28 15:07:33 +04001028has_gettid = cc.has_function('gettid')
1029
Paolo Bonziniaa087962020-09-01 11:15:30 -04001030# Malloc tests
1031
1032malloc = []
1033if get_option('malloc') == 'system'
1034 has_malloc_trim = \
1035 not get_option('malloc_trim').disabled() and \
1036 cc.links('''#include <malloc.h>
1037 int main(void) { malloc_trim(0); return 0; }''')
1038else
1039 has_malloc_trim = false
1040 malloc = cc.find_library(get_option('malloc'), required: true)
1041endif
1042if not has_malloc_trim and get_option('malloc_trim').enabled()
1043 if get_option('malloc') == 'system'
1044 error('malloc_trim not available on this platform.')
1045 else
1046 error('malloc_trim not available with non-libc memory allocator')
1047 endif
1048endif
1049
Max Reitz84e319a2020-11-02 17:18:55 +01001050# Check whether the glibc provides statx()
1051
1052statx_test = '''
1053 #ifndef _GNU_SOURCE
1054 #define _GNU_SOURCE
1055 #endif
1056 #include <sys/stat.h>
1057 int main(void) {
1058 struct statx statxbuf;
1059 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
1060 return 0;
1061 }'''
1062
1063has_statx = cc.links(statx_test)
1064
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +00001065have_vhost_user_blk_server = (targetos == 'linux' and
1066 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001067
1068if get_option('vhost_user_blk_server').enabled()
1069 if targetos != 'linux'
1070 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +00001071 elif 'CONFIG_VHOST_USER' not in config_host
1072 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001073 endif
1074elif get_option('vhost_user_blk_server').disabled() or not have_system
1075 have_vhost_user_blk_server = false
1076endif
1077
Daniele Buono9e62ba42020-12-04 18:06:14 -05001078
Max Reitzdf4ea702020-10-27 20:05:46 +01001079if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1080 error('Cannot enable fuse-lseek while fuse is disabled')
1081endif
1082
Max Reitza484a712020-10-27 20:05:41 +01001083fuse = dependency('fuse3', required: get_option('fuse'),
1084 version: '>=3.1', method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001085 kwargs: static_kwargs)
Max Reitza484a712020-10-27 20:05:41 +01001086
Max Reitzdf4ea702020-10-27 20:05:46 +01001087fuse_lseek = not_found
1088if not get_option('fuse_lseek').disabled()
1089 if fuse.version().version_compare('>=3.8')
1090 # Dummy dependency
1091 fuse_lseek = declare_dependency()
1092 elif get_option('fuse_lseek').enabled()
1093 if fuse.found()
1094 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1095 else
1096 error('fuse-lseek requires libfuse, which was not found')
1097 endif
1098 endif
1099endif
1100
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001101# libbpf
1102libbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
1103if libbpf.found() and not cc.links('''
1104 #include <bpf/libbpf.h>
1105 int main(void)
1106 {
1107 bpf_object__destroy_skeleton(NULL);
1108 return 0;
1109 }''', dependencies: libbpf)
1110 libbpf = not_found
1111 if get_option('bpf').enabled()
1112 error('libbpf skeleton test failed')
1113 else
1114 warning('libbpf skeleton test failed, disabling')
1115 endif
1116endif
1117
Daniele Buono9e62ba42020-12-04 18:06:14 -05001118if get_option('cfi')
1119 cfi_flags=[]
1120 # Check for dependency on LTO
1121 if not get_option('b_lto')
1122 error('Selected Control-Flow Integrity but LTO is disabled')
1123 endif
1124 if config_host.has_key('CONFIG_MODULES')
1125 error('Selected Control-Flow Integrity is not compatible with modules')
1126 endif
1127 # Check for cfi flags. CFI requires LTO so we can't use
1128 # get_supported_arguments, but need a more complex "compiles" which allows
1129 # custom arguments
1130 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1131 args: ['-flto', '-fsanitize=cfi-icall'] )
1132 cfi_flags += '-fsanitize=cfi-icall'
1133 else
1134 error('-fsanitize=cfi-icall is not supported by the compiler')
1135 endif
1136 if cc.compiles('int main () { return 0; }',
1137 name: '-fsanitize-cfi-icall-generalize-pointers',
1138 args: ['-flto', '-fsanitize=cfi-icall',
1139 '-fsanitize-cfi-icall-generalize-pointers'] )
1140 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1141 else
1142 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1143 endif
1144 if get_option('cfi_debug')
1145 if cc.compiles('int main () { return 0; }',
1146 name: '-fno-sanitize-trap=cfi-icall',
1147 args: ['-flto', '-fsanitize=cfi-icall',
1148 '-fno-sanitize-trap=cfi-icall'] )
1149 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1150 else
1151 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1152 endif
1153 endif
Marc-André Lureau5fc06172021-01-14 16:56:02 +04001154 add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1155 add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
Daniele Buono9e62ba42020-12-04 18:06:14 -05001156endif
1157
Joelle van Dyne14176c82021-03-15 11:03:38 -07001158have_host_block_device = (targetos != 'darwin' or
1159 cc.has_header('IOKit/storage/IOMedia.h'))
1160
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001161#################
1162# config-host.h #
1163#################
Paolo Bonzini859aef02020-08-04 18:14:26 +02001164
Paolo Bonzini69202b42020-11-17 14:46:21 +01001165have_virtfs = (targetos == 'linux' and
1166 have_system and
1167 libattr.found() and
1168 libcap_ng.found())
1169
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01001170have_virtfs_proxy_helper = have_virtfs and have_tools
1171
Paolo Bonzini69202b42020-11-17 14:46:21 +01001172if get_option('virtfs').enabled()
1173 if not have_virtfs
1174 if targetos != 'linux'
1175 error('virtio-9p (virtfs) requires Linux')
1176 elif not libcap_ng.found() or not libattr.found()
1177 error('virtio-9p (virtfs) requires libcap-ng-devel and libattr-devel')
1178 elif not have_system
1179 error('virtio-9p (virtfs) needs system emulation support')
1180 endif
1181 endif
1182elif get_option('virtfs').disabled()
1183 have_virtfs = false
1184endif
1185
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001186config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1187config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1188config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1189config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1190config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
1191config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
1192config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1193config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1194config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1195config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1196config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1197config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1198
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001199config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001200config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04001201config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001202config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001203config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001204config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1205config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001206config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08001207config_host_data.set('CONFIG_CURSES', curses.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001208config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1209if glusterfs.found()
1210 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1211 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1212 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1213 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1214 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1215 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1216endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001217config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001218config_host_data.set('CONFIG_VTE', vte.found())
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001219config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001220config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001221config_host_data.set('CONFIG_EBPF', libbpf.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001222config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01001223config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001224config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001225config_host_data.set('CONFIG_SDL', sdl.found())
1226config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01001227config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01001228config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzini90540f32021-06-03 11:15:26 +02001229config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001230config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001231config_host_data.set('CONFIG_VNC', vnc.found())
1232config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1233config_host_data.set('CONFIG_VNC_PNG', png.found())
1234config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01001235config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001236config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001237config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04001238config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02001239config_host_data.set('CONFIG_GNUTLS', gnutls.found())
1240config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
1241config_host_data.set('CONFIG_NETTLE', nettle.found())
1242config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04001243config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01001244config_host_data.set('CONFIG_STATX', has_statx)
Paolo Bonzinib1def332020-11-17 13:37:39 +01001245config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01001246config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01001247config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01001248config_host_data.set('CONFIG_X11', x11.found())
Daniele Buono9e62ba42020-12-04 18:06:14 -05001249config_host_data.set('CONFIG_CFI', get_option('cfi'))
Paolo Bonzini859aef02020-08-04 18:14:26 +02001250config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1251config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1252config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1253config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1254
Thomas Huth48f670e2020-11-18 18:10:52 +01001255config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001256config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001257config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001258config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001259config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Joelle van Dyne1ad27f72021-01-25 17:24:51 -08001260config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Joelle van Dyne14176c82021-03-15 11:03:38 -07001261config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
Joelle van Dynefeccdce2021-03-15 11:03:39 -07001262config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001263
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001264config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
1265
Paolo Bonzini765686d2020-09-18 06:37:21 -04001266ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
Paolo Bonzini859aef02020-08-04 18:14:26 +02001267arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001268strings = ['HOST_DSOSUF', 'CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001269foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -04001270 if ignored.contains(k)
1271 # do nothing
1272 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001273 if v != ''
1274 v = '"' + '", "'.join(v.split()) + '", '
1275 endif
1276 config_host_data.set(k, v)
1277 elif k == 'ARCH'
1278 config_host_data.set('HOST_' + v.to_upper(), 1)
1279 elif strings.contains(k)
1280 if not k.startswith('CONFIG_')
1281 k = 'CONFIG_' + k.to_upper()
1282 endif
1283 config_host_data.set_quoted(k, v)
1284 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
1285 config_host_data.set(k, v == 'y' ? 1 : v)
1286 endif
1287endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02001288
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001289########################
1290# Target configuration #
1291########################
1292
Paolo Bonzini2becc362020-02-03 11:42:03 +01001293minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04001294config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001295config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001296config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001297config_devices_mak_list = []
1298config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02001299config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001300config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001301
1302disassemblers = {
1303 'alpha' : ['CONFIG_ALPHA_DIS'],
1304 'arm' : ['CONFIG_ARM_DIS'],
1305 'avr' : ['CONFIG_AVR_DIS'],
1306 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06001307 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001308 'hppa' : ['CONFIG_HPPA_DIS'],
1309 'i386' : ['CONFIG_I386_DIS'],
1310 'x86_64' : ['CONFIG_I386_DIS'],
1311 'x32' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001312 'm68k' : ['CONFIG_M68K_DIS'],
1313 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1314 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001315 'nios2' : ['CONFIG_NIOS2_DIS'],
1316 'or1k' : ['CONFIG_OPENRISC_DIS'],
1317 'ppc' : ['CONFIG_PPC_DIS'],
1318 'riscv' : ['CONFIG_RISCV_DIS'],
1319 'rx' : ['CONFIG_RX_DIS'],
1320 's390' : ['CONFIG_S390_DIS'],
1321 'sh4' : ['CONFIG_SH4_DIS'],
1322 'sparc' : ['CONFIG_SPARC_DIS'],
1323 'xtensa' : ['CONFIG_XTENSA_DIS'],
1324}
1325if link_language == 'cpp'
1326 disassemblers += {
1327 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1328 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1329 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1330 }
1331endif
1332
Paolo Bonzini0a189112020-11-17 14:58:32 +01001333host_kconfig = \
1334 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
1335 ('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
1336 ('CONFIG_IVSHMEM' in config_host ? ['CONFIG_IVSHMEM=y'] : []) + \
1337 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01001338 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001339 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1340 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1341 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01001342 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001343 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman3090de62021-01-29 11:46:05 -05001344 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : []) + \
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01001345 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01001346
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001347ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001348
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001349default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1350actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001351fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001352foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04001353 config_target = { 'TARGET_NAME': target.split('-')[0] }
1354 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001355 if targetos != 'linux'
1356 if default_targets
1357 continue
1358 endif
1359 error('Target @0@ is only available on a Linux host'.format(target))
1360 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001361 config_target += { 'CONFIG_LINUX_USER': 'y' }
1362 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001363 if 'CONFIG_BSD' not in config_host
1364 if default_targets
1365 continue
1366 endif
1367 error('Target @0@ is only available on a BSD host'.format(target))
1368 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001369 config_target += { 'CONFIG_BSD_USER': 'y' }
1370 elif target.endswith('softmmu')
1371 config_target += { 'CONFIG_SOFTMMU': 'y' }
1372 endif
1373 if target.endswith('-user')
1374 config_target += {
1375 'CONFIG_USER_ONLY': 'y',
1376 'CONFIG_QEMU_INTERP_PREFIX':
1377 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1378 }
1379 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001380
Paolo Bonzini0a189112020-11-17 14:58:32 +01001381 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04001382 foreach sym: accelerators
1383 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1384 config_target += { sym: 'y' }
1385 config_all += { sym: 'y' }
Paolo Bonzini23a77b22020-12-14 12:01:45 +01001386 if sym == 'CONFIG_TCG' and tcg_arch == 'tci'
1387 config_target += { 'CONFIG_TCG_INTERPRETER': 'y' }
1388 elif sym == 'CONFIG_XEN' and have_xen_pci_passthrough
Paolo Bonzini8a199802020-09-18 05:37:01 -04001389 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1390 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01001391 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04001392 endif
1393 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01001394 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001395 if default_targets
1396 continue
1397 endif
1398 error('No accelerator available for target @0@'.format(target))
1399 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001400
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001401 actual_target_dirs += target
Paolo Bonzini765686d2020-09-18 06:37:21 -04001402 config_target += keyval.load('default-configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001403 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001404
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001405 if 'TARGET_NEED_FDT' in config_target
1406 fdt_required += target
1407 endif
1408
Paolo Bonzinifa731682020-09-21 05:19:07 -04001409 # Add default keys
1410 if 'TARGET_BASE_ARCH' not in config_target
1411 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1412 endif
1413 if 'TARGET_ABI_DIR' not in config_target
1414 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1415 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001416
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001417 foreach k, v: disassemblers
1418 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1419 foreach sym: v
1420 config_target += { sym: 'y' }
1421 config_all_disas += { sym: 'y' }
1422 endforeach
1423 endif
1424 endforeach
1425
Paolo Bonzini859aef02020-08-04 18:14:26 +02001426 config_target_data = configuration_data()
1427 foreach k, v: config_target
1428 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1429 # do nothing
1430 elif ignored.contains(k)
1431 # do nothing
1432 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001433 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1434 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001435 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001436 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001437 config_target_data.set_quoted(k, v)
1438 elif v == 'y'
1439 config_target_data.set(k, 1)
1440 else
1441 config_target_data.set(k, v)
1442 endif
1443 endforeach
1444 config_target_h += {target: configure_file(output: target + '-config-target.h',
1445 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001446
1447 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001448 config_devices_mak = target + '-config-devices.mak'
1449 config_devices_mak = configure_file(
Paolo Bonzini1bb4cb12020-09-18 06:06:09 -04001450 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001451 output: config_devices_mak,
1452 depfile: config_devices_mak + '.d',
1453 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01001454 command: [minikconf,
1455 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01001456 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzini0a189112020-11-17 14:58:32 +01001457 host_kconfig, accel_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02001458
1459 config_devices_data = configuration_data()
1460 config_devices = keyval.load(config_devices_mak)
1461 foreach k, v: config_devices
1462 config_devices_data.set(k, 1)
1463 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001464 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001465 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1466 configuration: config_devices_data)}
1467 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001468 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001469 endif
1470 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001471endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001472target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001473
Paolo Bonzini2becc362020-02-03 11:42:03 +01001474# This configuration is used to build files that are shared by
1475# multiple binaries, and then extracted out of the "common"
1476# static_library target.
1477#
1478# We do not use all_sources()/all_dependencies(), because it would
1479# build literally all source files, including devices only used by
1480# targets that are not built for this compilation. The CONFIG_ALL
1481# pseudo symbol replaces it.
1482
Paolo Bonzini05512f52020-09-16 15:31:11 -04001483config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001484config_all += config_host
1485config_all += config_all_disas
1486config_all += {
1487 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1488 'CONFIG_SOFTMMU': have_system,
1489 'CONFIG_USER_ONLY': have_user,
1490 'CONFIG_ALL': true,
1491}
1492
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001493##############
1494# Submodules #
1495##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001496
1497capstone = not_found
1498capstone_opt = get_option('capstone')
1499if capstone_opt in ['enabled', 'auto', 'system']
1500 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07001501 capstone = dependency('capstone', version: '>=4.0',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001502 kwargs: static_kwargs, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001503 required: capstone_opt == 'system' or
1504 capstone_opt == 'enabled' and not have_internal)
1505 if capstone.found()
1506 capstone_opt = 'system'
1507 elif have_internal
1508 capstone_opt = 'internal'
1509 else
1510 capstone_opt = 'disabled'
1511 endif
1512endif
1513if capstone_opt == 'internal'
1514 capstone_data = configuration_data()
1515 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1516
1517 capstone_files = files(
1518 'capstone/cs.c',
1519 'capstone/MCInst.c',
1520 'capstone/MCInstrDesc.c',
1521 'capstone/MCRegisterInfo.c',
1522 'capstone/SStream.c',
1523 'capstone/utils.c'
1524 )
1525
1526 if 'CONFIG_ARM_DIS' in config_all_disas
1527 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1528 capstone_files += files(
1529 'capstone/arch/ARM/ARMDisassembler.c',
1530 'capstone/arch/ARM/ARMInstPrinter.c',
1531 'capstone/arch/ARM/ARMMapping.c',
1532 'capstone/arch/ARM/ARMModule.c'
1533 )
1534 endif
1535
1536 # FIXME: This config entry currently depends on a c++ compiler.
1537 # Which is needed for building libvixl, but not for capstone.
1538 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1539 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1540 capstone_files += files(
1541 'capstone/arch/AArch64/AArch64BaseInfo.c',
1542 'capstone/arch/AArch64/AArch64Disassembler.c',
1543 'capstone/arch/AArch64/AArch64InstPrinter.c',
1544 'capstone/arch/AArch64/AArch64Mapping.c',
1545 'capstone/arch/AArch64/AArch64Module.c'
1546 )
1547 endif
1548
1549 if 'CONFIG_PPC_DIS' in config_all_disas
1550 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1551 capstone_files += files(
1552 'capstone/arch/PowerPC/PPCDisassembler.c',
1553 'capstone/arch/PowerPC/PPCInstPrinter.c',
1554 'capstone/arch/PowerPC/PPCMapping.c',
1555 'capstone/arch/PowerPC/PPCModule.c'
1556 )
1557 endif
1558
Richard Henderson3d562842020-01-04 07:24:59 +10001559 if 'CONFIG_S390_DIS' in config_all_disas
1560 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1561 capstone_files += files(
1562 'capstone/arch/SystemZ/SystemZDisassembler.c',
1563 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1564 'capstone/arch/SystemZ/SystemZMapping.c',
1565 'capstone/arch/SystemZ/SystemZModule.c',
1566 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1567 )
1568 endif
1569
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001570 if 'CONFIG_I386_DIS' in config_all_disas
1571 capstone_data.set('CAPSTONE_HAS_X86', 1)
1572 capstone_files += files(
1573 'capstone/arch/X86/X86Disassembler.c',
1574 'capstone/arch/X86/X86DisassemblerDecoder.c',
1575 'capstone/arch/X86/X86ATTInstPrinter.c',
1576 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07001577 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001578 'capstone/arch/X86/X86Mapping.c',
1579 'capstone/arch/X86/X86Module.c'
1580 )
1581 endif
1582
1583 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1584
1585 capstone_cargs = [
1586 # FIXME: There does not seem to be a way to completely replace the c_args
1587 # that come from add_project_arguments() -- we can only add to them.
1588 # So: disable all warnings with a big hammer.
1589 '-Wno-error', '-w',
1590
1591 # Include all configuration defines via a header file, which will wind up
1592 # as a dependency on the object file, and thus changes here will result
1593 # in a rebuild.
1594 '-include', 'capstone-defs.h'
1595 ]
1596
1597 libcapstone = static_library('capstone',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001598 build_by_default: false,
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001599 sources: capstone_files,
1600 c_args: capstone_cargs,
1601 include_directories: 'capstone/include')
1602 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07001603 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001604endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001605
1606slirp = not_found
1607slirp_opt = 'disabled'
1608if have_system
1609 slirp_opt = get_option('slirp')
1610 if slirp_opt in ['enabled', 'auto', 'system']
1611 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001612 slirp = dependency('slirp', kwargs: static_kwargs,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001613 method: 'pkg-config',
1614 required: slirp_opt == 'system' or
1615 slirp_opt == 'enabled' and not have_internal)
1616 if slirp.found()
1617 slirp_opt = 'system'
1618 elif have_internal
1619 slirp_opt = 'internal'
1620 else
1621 slirp_opt = 'disabled'
1622 endif
1623 endif
1624 if slirp_opt == 'internal'
1625 slirp_deps = []
1626 if targetos == 'windows'
1627 slirp_deps = cc.find_library('iphlpapi')
1628 endif
1629 slirp_conf = configuration_data()
1630 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1631 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1632 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1633 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1634 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1635 slirp_files = [
1636 'slirp/src/arp_table.c',
1637 'slirp/src/bootp.c',
1638 'slirp/src/cksum.c',
1639 'slirp/src/dhcpv6.c',
1640 'slirp/src/dnssearch.c',
1641 'slirp/src/if.c',
1642 'slirp/src/ip6_icmp.c',
1643 'slirp/src/ip6_input.c',
1644 'slirp/src/ip6_output.c',
1645 'slirp/src/ip_icmp.c',
1646 'slirp/src/ip_input.c',
1647 'slirp/src/ip_output.c',
1648 'slirp/src/mbuf.c',
1649 'slirp/src/misc.c',
1650 'slirp/src/ncsi.c',
1651 'slirp/src/ndp_table.c',
1652 'slirp/src/sbuf.c',
1653 'slirp/src/slirp.c',
1654 'slirp/src/socket.c',
1655 'slirp/src/state.c',
1656 'slirp/src/stream.c',
1657 'slirp/src/tcp_input.c',
1658 'slirp/src/tcp_output.c',
1659 'slirp/src/tcp_subr.c',
1660 'slirp/src/tcp_timer.c',
1661 'slirp/src/tftp.c',
1662 'slirp/src/udp.c',
1663 'slirp/src/udp6.c',
1664 'slirp/src/util.c',
1665 'slirp/src/version.c',
1666 'slirp/src/vmstate.c',
1667 ]
1668
1669 configure_file(
1670 input : 'slirp/src/libslirp-version.h.in',
1671 output : 'libslirp-version.h',
1672 configuration: slirp_conf)
1673
1674 slirp_inc = include_directories('slirp', 'slirp/src')
1675 libslirp = static_library('slirp',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001676 build_by_default: false,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001677 sources: slirp_files,
1678 c_args: slirp_cargs,
1679 include_directories: slirp_inc)
1680 slirp = declare_dependency(link_with: libslirp,
1681 dependencies: slirp_deps,
1682 include_directories: slirp_inc)
1683 endif
1684endif
1685
Daniele Buonoc7153432021-03-03 21:59:38 -05001686# For CFI, we need to compile slirp as a static library together with qemu.
1687# This is because we register slirp functions as callbacks for QEMU Timers.
1688# When using a system-wide shared libslirp, the type information for the
1689# callback is missing and the timer call produces a false positive with CFI.
1690#
1691# Now that slirp_opt has been defined, check if the selected slirp is compatible
1692# with control-flow integrity.
1693if get_option('cfi') and slirp_opt == 'system'
1694 error('Control-Flow Integrity is not compatible with system-wide slirp.' \
1695 + ' Please configure with --enable-slirp=git')
1696endif
1697
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001698fdt = not_found
1699fdt_opt = get_option('fdt')
1700if have_system
1701 if fdt_opt in ['enabled', 'auto', 'system']
1702 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001703 fdt = cc.find_library('fdt', kwargs: static_kwargs,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001704 required: fdt_opt == 'system' or
1705 fdt_opt == 'enabled' and not have_internal)
1706 if fdt.found() and cc.links('''
1707 #include <libfdt.h>
1708 #include <libfdt_env.h>
1709 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1710 dependencies: fdt)
1711 fdt_opt = 'system'
1712 elif have_internal
1713 fdt_opt = 'internal'
1714 else
1715 fdt_opt = 'disabled'
1716 endif
1717 endif
1718 if fdt_opt == 'internal'
1719 fdt_files = files(
1720 'dtc/libfdt/fdt.c',
1721 'dtc/libfdt/fdt_ro.c',
1722 'dtc/libfdt/fdt_wip.c',
1723 'dtc/libfdt/fdt_sw.c',
1724 'dtc/libfdt/fdt_rw.c',
1725 'dtc/libfdt/fdt_strerror.c',
1726 'dtc/libfdt/fdt_empty_tree.c',
1727 'dtc/libfdt/fdt_addresses.c',
1728 'dtc/libfdt/fdt_overlay.c',
1729 'dtc/libfdt/fdt_check.c',
1730 )
1731
1732 fdt_inc = include_directories('dtc/libfdt')
1733 libfdt = static_library('fdt',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001734 build_by_default: false,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001735 sources: fdt_files,
1736 include_directories: fdt_inc)
1737 fdt = declare_dependency(link_with: libfdt,
1738 include_directories: fdt_inc)
1739 endif
1740endif
1741if not fdt.found() and fdt_required.length() > 0
1742 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1743endif
1744
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001745config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001746config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001747config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001748
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001749#####################
1750# Generated sources #
1751#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001752
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001753genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001754
Marc-André Lureau3f885652019-07-15 18:06:04 +04001755hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04001756shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001757qapi_gen = find_program('scripts/qapi-gen.py')
1758qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1759 meson.source_root() / 'scripts/qapi/commands.py',
1760 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001761 meson.source_root() / 'scripts/qapi/error.py',
1762 meson.source_root() / 'scripts/qapi/events.py',
1763 meson.source_root() / 'scripts/qapi/expr.py',
1764 meson.source_root() / 'scripts/qapi/gen.py',
1765 meson.source_root() / 'scripts/qapi/introspect.py',
1766 meson.source_root() / 'scripts/qapi/parser.py',
1767 meson.source_root() / 'scripts/qapi/schema.py',
1768 meson.source_root() / 'scripts/qapi/source.py',
1769 meson.source_root() / 'scripts/qapi/types.py',
1770 meson.source_root() / 'scripts/qapi/visit.py',
1771 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001772 meson.source_root() / 'scripts/qapi-gen.py'
1773]
1774
1775tracetool = [
1776 python, files('scripts/tracetool.py'),
1777 '--backend=' + config_host['TRACE_BACKENDS']
1778]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00001779tracetool_depends = files(
1780 'scripts/tracetool/backend/log.py',
1781 'scripts/tracetool/backend/__init__.py',
1782 'scripts/tracetool/backend/dtrace.py',
1783 'scripts/tracetool/backend/ftrace.py',
1784 'scripts/tracetool/backend/simple.py',
1785 'scripts/tracetool/backend/syslog.py',
1786 'scripts/tracetool/backend/ust.py',
1787 'scripts/tracetool/format/tcg_h.py',
1788 'scripts/tracetool/format/ust_events_c.py',
1789 'scripts/tracetool/format/ust_events_h.py',
1790 'scripts/tracetool/format/__init__.py',
1791 'scripts/tracetool/format/d.py',
1792 'scripts/tracetool/format/tcg_helper_c.py',
1793 'scripts/tracetool/format/simpletrace_stap.py',
1794 'scripts/tracetool/format/c.py',
1795 'scripts/tracetool/format/h.py',
1796 'scripts/tracetool/format/tcg_helper_h.py',
1797 'scripts/tracetool/format/log_stap.py',
1798 'scripts/tracetool/format/stap.py',
1799 'scripts/tracetool/format/tcg_helper_wrapper_h.py',
1800 'scripts/tracetool/__init__.py',
1801 'scripts/tracetool/transform.py',
1802 'scripts/tracetool/vcpu.py'
1803)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001804
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001805qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1806 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02001807 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001808qemu_version = custom_target('qemu-version.h',
1809 output: 'qemu-version.h',
1810 command: qemu_version_cmd,
1811 capture: true,
1812 build_by_default: true,
1813 build_always_stale: true)
1814genh += qemu_version
1815
Marc-André Lureau3f885652019-07-15 18:06:04 +04001816hxdep = []
1817hx_headers = [
1818 ['qemu-options.hx', 'qemu-options.def'],
1819 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1820]
1821if have_system
1822 hx_headers += [
1823 ['hmp-commands.hx', 'hmp-commands.h'],
1824 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1825 ]
1826endif
1827foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001828 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04001829 input: files(d[0]),
1830 output: d[1],
1831 capture: true,
1832 build_by_default: true, # to be removed when added to a target
1833 command: [hxtool, '-h', '@INPUT0@'])
1834endforeach
1835genh += hxdep
1836
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001837###################
1838# Collect sources #
1839###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001840
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001841authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001842blockdev_ss = ss.source_set()
1843block_ss = ss.source_set()
1844bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001845chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001846common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001847crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001848io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001849linux_user_ss = ss.source_set()
1850qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001851qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001852softmmu_ss = ss.source_set()
1853specific_fuzz_ss = ss.source_set()
1854specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001855stub_ss = ss.source_set()
1856trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001857user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001858util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001859
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001860modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001861hw_arch = {}
1862target_arch = {}
1863target_softmmu_arch = {}
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02001864target_user_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001865
1866###############
1867# Trace files #
1868###############
1869
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001870# TODO: add each directory to the subdirs from its own meson.build, once
1871# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001872trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001873 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01001874 'qapi',
1875 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001876 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01001877 'util',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001878]
1879if have_user
1880 trace_events_subdirs += [ 'linux-user' ]
1881endif
1882if have_block
1883 trace_events_subdirs += [
1884 'authz',
1885 'block',
1886 'io',
1887 'nbd',
1888 'scsi',
1889 ]
1890endif
1891if have_system
1892 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01001893 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001894 'audio',
1895 'backends',
1896 'backends/tpm',
1897 'chardev',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001898 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001899 'hw/9pfs',
1900 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08001901 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001902 'hw/alpha',
1903 'hw/arm',
1904 'hw/audio',
1905 'hw/block',
1906 'hw/block/dataplane',
1907 'hw/char',
1908 'hw/display',
1909 'hw/dma',
1910 'hw/hppa',
1911 'hw/hyperv',
1912 'hw/i2c',
1913 'hw/i386',
1914 'hw/i386/xen',
1915 'hw/ide',
1916 'hw/input',
1917 'hw/intc',
1918 'hw/isa',
1919 'hw/mem',
1920 'hw/mips',
1921 'hw/misc',
1922 'hw/misc/macio',
1923 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08001924 'hw/net/can',
Klaus Jensen88eea452021-04-14 22:14:30 +02001925 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001926 'hw/nvram',
1927 'hw/pci',
1928 'hw/pci-host',
1929 'hw/ppc',
1930 'hw/rdma',
1931 'hw/rdma/vmw',
1932 'hw/rtc',
1933 'hw/s390x',
1934 'hw/scsi',
1935 'hw/sd',
1936 'hw/sparc',
1937 'hw/sparc64',
1938 'hw/ssi',
1939 'hw/timer',
1940 'hw/tpm',
1941 'hw/usb',
1942 'hw/vfio',
1943 'hw/virtio',
1944 'hw/watchdog',
1945 'hw/xen',
1946 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001947 'migration',
1948 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02001949 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001950 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05001951 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001952 ]
1953endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01001954if have_system or have_user
1955 trace_events_subdirs += [
1956 'accel/tcg',
1957 'hw/core',
1958 'target/arm',
1959 'target/hppa',
1960 'target/i386',
1961 'target/i386/kvm',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02001962 'target/mips/tcg',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01001963 'target/ppc',
1964 'target/riscv',
1965 'target/s390x',
1966 'target/sparc',
1967 ]
1968endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001969
Marc-André Lureau0df750e2020-11-25 14:06:37 +04001970vhost_user = not_found
1971if 'CONFIG_VHOST_USER' in config_host
1972 libvhost_user = subproject('libvhost-user')
1973 vhost_user = libvhost_user.get_variable('vhost_user_dep')
1974endif
1975
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001976subdir('qapi')
1977subdir('qobject')
1978subdir('stubs')
1979subdir('trace')
1980subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04001981subdir('qom')
1982subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001983subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04001984subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001985
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001986
1987if enable_modules
1988 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1989 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1990endif
1991
Paolo Bonzini2becc362020-02-03 11:42:03 +01001992stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001993
1994util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01001995util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001996libqemuutil = static_library('qemuutil',
1997 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini7fa1c632021-06-01 10:00:48 +02001998 dependencies: [util_ss.dependencies(), libm, glib, socket, malloc, pixman])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001999qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04002000 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002001
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01002002if have_system or have_user
2003 decodetree = generator(find_program('scripts/decodetree.py'),
2004 output: 'decode-@BASENAME@.c.inc',
2005 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
2006 subdir('libdecnumber')
2007 subdir('target')
2008endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002009
Paolo Bonzini478e9432020-08-17 12:47:55 +02002010subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04002011subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04002012subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04002013subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04002014subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04002015
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002016if have_block
2017 block_ss.add(files(
2018 'block.c',
2019 'blockjob.c',
2020 'job.c',
2021 'qemu-io-cmds.c',
2022 ))
2023 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002024
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002025 subdir('nbd')
2026 subdir('scsi')
2027 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002028
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002029 blockdev_ss.add(files(
2030 'blockdev.c',
2031 'blockdev-nbd.c',
2032 'iothread.c',
2033 'job-qmp.c',
2034 ), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02002035
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002036 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
2037 # os-win32.c does not
2038 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
2039 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
2040endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02002041
2042common_ss.add(files('cpus-common.c'))
2043
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02002044subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002045
Richard Hendersonf3433462020-09-12 10:47:33 -07002046common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02002047specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002048
Richard Henderson44b99a62021-03-22 12:24:26 +01002049# Work around a gcc bug/misfeature wherein constant propagation looks
2050# through an alias:
2051# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
2052# to guess that a const variable is always zero. Without lto, this is
2053# impossible, as the alias is restricted to page-vary-common.c. Indeed,
2054# without lto, not even the alias is required -- we simply use different
2055# declarations in different compilation units.
2056pagevary = files('page-vary-common.c')
2057if get_option('b_lto')
2058 pagevary_flags = ['-fno-lto']
2059 if get_option('cfi')
2060 pagevary_flags += '-fno-sanitize=cfi-icall'
2061 endif
2062 pagevary = static_library('page-vary-common', sources: pagevary,
2063 c_args: pagevary_flags)
2064 pagevary = declare_dependency(link_with: pagevary)
2065endif
2066common_ss.add(pagevary)
Richard Henderson6670d4d2021-03-22 12:24:24 +01002067specific_ss.add(files('page-vary.c'))
2068
Marc-André Lureauab318052019-07-24 19:23:16 +04002069subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04002070subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04002071subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002072subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04002073subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04002074subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00002075subdir('semihosting')
Marc-André Lureau582ea952019-08-15 15:15:32 +04002076subdir('hw')
Richard Henderson104cc2c2021-03-08 12:04:33 -08002077subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08002078subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04002079subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002080subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04002081subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04002082subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002083subdir('ebpf')
2084
2085common_ss.add(libbpf)
Marc-André Lureau3a304462019-08-18 16:13:08 +04002086
Marc-André Lureaub309c322019-08-18 19:20:37 +04002087bsd_user_ss.add(files('gdbstub.c'))
2088specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
2089
Marc-André Lureau3a304462019-08-18 16:13:08 +04002090linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
2091specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02002092
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002093# needed for fuzzing binaries
2094subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002095subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002096
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002097########################
2098# Library dependencies #
2099########################
2100
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002101block_mods = []
2102softmmu_mods = []
2103foreach d, list : modules
2104 foreach m, module_ss : list
2105 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02002106 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002107 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
2108 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
2109 if d == 'block'
2110 block_mods += sl
2111 else
2112 softmmu_mods += sl
2113 endif
2114 else
2115 if d == 'block'
2116 block_ss.add_all(module_ss)
2117 else
2118 softmmu_ss.add_all(module_ss)
2119 endif
2120 endif
2121 endforeach
2122endforeach
2123
2124nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08002125undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002126block_syms = custom_target('block.syms', output: 'block.syms',
2127 input: [libqemuutil, block_mods],
2128 capture: true,
2129 command: [undefsym, nm, '@INPUT@'])
2130qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
2131 input: [libqemuutil, softmmu_mods],
2132 capture: true,
2133 command: [undefsym, nm, '@INPUT@'])
2134
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02002135qom_ss = qom_ss.apply(config_host, strict: false)
2136libqom = static_library('qom', qom_ss.sources() + genh,
2137 dependencies: [qom_ss.dependencies()],
2138 name_suffix: 'fa')
2139
2140qom = declare_dependency(link_whole: libqom)
2141
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02002142authz_ss = authz_ss.apply(config_host, strict: false)
2143libauthz = static_library('authz', authz_ss.sources() + genh,
2144 dependencies: [authz_ss.dependencies()],
2145 name_suffix: 'fa',
2146 build_by_default: false)
2147
2148authz = declare_dependency(link_whole: libauthz,
2149 dependencies: qom)
2150
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002151crypto_ss = crypto_ss.apply(config_host, strict: false)
2152libcrypto = static_library('crypto', crypto_ss.sources() + genh,
2153 dependencies: [crypto_ss.dependencies()],
2154 name_suffix: 'fa',
2155 build_by_default: false)
2156
2157crypto = declare_dependency(link_whole: libcrypto,
2158 dependencies: [authz, qom])
2159
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002160io_ss = io_ss.apply(config_host, strict: false)
2161libio = static_library('io', io_ss.sources() + genh,
2162 dependencies: [io_ss.dependencies()],
2163 link_with: libqemuutil,
2164 name_suffix: 'fa',
2165 build_by_default: false)
2166
2167io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
2168
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02002169libmigration = static_library('migration', sources: migration_files + genh,
2170 name_suffix: 'fa',
2171 build_by_default: false)
2172migration = declare_dependency(link_with: libmigration,
2173 dependencies: [zlib, qom, io])
2174softmmu_ss.add(migration)
2175
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002176block_ss = block_ss.apply(config_host, strict: false)
2177libblock = static_library('block', block_ss.sources() + genh,
2178 dependencies: block_ss.dependencies(),
2179 link_depends: block_syms,
2180 name_suffix: 'fa',
2181 build_by_default: false)
2182
2183block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002184 link_args: '@block.syms',
2185 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002186
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002187blockdev_ss = blockdev_ss.apply(config_host, strict: false)
2188libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
2189 dependencies: blockdev_ss.dependencies(),
2190 name_suffix: 'fa',
2191 build_by_default: false)
2192
2193blockdev = declare_dependency(link_whole: [libblockdev],
2194 dependencies: [block])
2195
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002196qmp_ss = qmp_ss.apply(config_host, strict: false)
2197libqmp = static_library('qmp', qmp_ss.sources() + genh,
2198 dependencies: qmp_ss.dependencies(),
2199 name_suffix: 'fa',
2200 build_by_default: false)
2201
2202qmp = declare_dependency(link_whole: [libqmp])
2203
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002204libchardev = static_library('chardev', chardev_ss.sources() + genh,
2205 name_suffix: 'fa',
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002206 dependencies: [gnutls],
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002207 build_by_default: false)
2208
2209chardev = declare_dependency(link_whole: libchardev)
2210
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02002211libhwcore = static_library('hwcore', sources: hwcore_files + genh,
2212 name_suffix: 'fa',
2213 build_by_default: false)
2214hwcore = declare_dependency(link_whole: libhwcore)
2215common_ss.add(hwcore)
2216
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02002217###########
2218# Targets #
2219###########
2220
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002221foreach m : block_mods + softmmu_mods
2222 shared_module(m.name(),
2223 name_prefix: '',
2224 link_whole: m,
2225 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002226 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002227endforeach
2228
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002229softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002230common_ss.add(qom, qemuutil)
2231
2232common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01002233common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
2234
2235common_all = common_ss.apply(config_all, strict: false)
2236common_all = static_library('common',
2237 build_by_default: false,
2238 sources: common_all.sources() + genh,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09002239 implicit_include_directories: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002240 dependencies: common_all.dependencies(),
2241 name_suffix: 'fa')
2242
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002243feature_to_c = find_program('scripts/feature_to_c.sh')
2244
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002245emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002246foreach target : target_dirs
2247 config_target = config_target_mak[target]
2248 target_name = config_target['TARGET_NAME']
2249 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02002250 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002251 arch_deps = []
2252 c_args = ['-DNEED_CPU_H',
2253 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2254 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04002255 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01002256
Paolo Bonzini859aef02020-08-04 18:14:26 +02002257 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01002258 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2259 if targetos == 'linux'
2260 target_inc += include_directories('linux-headers', is_system: true)
2261 endif
2262 if target.endswith('-softmmu')
2263 qemu_target_name = 'qemu-system-' + target_name
2264 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002265 t = target_softmmu_arch[arch].apply(config_target, strict: false)
2266 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002267 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002268
Marc-André Lureau2c442202019-08-17 13:55:58 +04002269 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
2270 hw = hw_arch[hw_dir].apply(config_target, strict: false)
2271 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002272 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04002273
Paolo Bonzini2becc362020-02-03 11:42:03 +01002274 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002275 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002276 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04002277 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002278 target_type='user'
2279 qemu_target_name = 'qemu-' + target_name
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02002280 if arch in target_user_arch
2281 t = target_user_arch[arch].apply(config_target, strict: false)
2282 arch_srcs += t.sources()
2283 arch_deps += t.dependencies()
2284 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002285 if 'CONFIG_LINUX_USER' in config_target
2286 base_dir = 'linux-user'
2287 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
2288 else
2289 base_dir = 'bsd-user'
Stacey Sonea1ab4c2020-12-18 13:54:50 -07002290 target_inc += include_directories('bsd-user/freebsd')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002291 endif
2292 target_inc += include_directories(
2293 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04002294 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002295 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04002296 if 'CONFIG_LINUX_USER' in config_target
2297 dir = base_dir / abi
2298 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
2299 if config_target.has_key('TARGET_SYSTBL_ABI')
2300 arch_srcs += \
2301 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
2302 extra_args : config_target['TARGET_SYSTBL_ABI'])
2303 endif
2304 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002305 endif
2306
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002307 if 'TARGET_XML_FILES' in config_target
2308 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
2309 output: target + '-gdbstub-xml.c',
2310 input: files(config_target['TARGET_XML_FILES'].split()),
2311 command: [feature_to_c, '@INPUT@'],
2312 capture: true)
2313 arch_srcs += gdbstub_xml
2314 endif
2315
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002316 t = target_arch[arch].apply(config_target, strict: false)
2317 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002318 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002319
Paolo Bonzini2becc362020-02-03 11:42:03 +01002320 target_common = common_ss.apply(config_target, strict: false)
2321 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002322 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002323
Paolo Bonzini2becc362020-02-03 11:42:03 +01002324 target_specific = specific_ss.apply(config_target, strict: false)
2325 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002326 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002327
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002328 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02002329 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002330 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002331 objects: objects,
2332 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002333 c_args: c_args,
2334 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002335 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002336
2337 if target.endswith('-softmmu')
2338 execs = [{
2339 'name': 'qemu-system-' + target_name,
2340 'gui': false,
2341 'sources': files('softmmu/main.c'),
2342 'dependencies': []
2343 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002344 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002345 execs += [{
2346 'name': 'qemu-system-' + target_name + 'w',
2347 'gui': true,
2348 'sources': files('softmmu/main.c'),
2349 'dependencies': []
2350 }]
2351 endif
2352 if config_host.has_key('CONFIG_FUZZ')
2353 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
2354 execs += [{
2355 'name': 'qemu-fuzz-' + target_name,
2356 'gui': false,
2357 'sources': specific_fuzz.sources(),
2358 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002359 }]
2360 endif
2361 else
2362 execs = [{
2363 'name': 'qemu-' + target_name,
2364 'gui': false,
2365 'sources': [],
2366 'dependencies': []
2367 }]
2368 endif
2369 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01002370 exe_name = exe['name']
2371 exe_sign = 'CONFIG_HVF' in config_target
2372 if exe_sign
2373 exe_name += '-unsigned'
2374 endif
2375
2376 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09002377 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002378 c_args: c_args,
2379 dependencies: arch_deps + deps + exe['dependencies'],
2380 objects: lib.extract_all_objects(recursive: true),
2381 link_language: link_language,
2382 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
2383 link_args: link_args,
2384 gui_app: exe['gui'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01002385
2386 if exe_sign
2387 emulators += {exe['name'] : custom_target(exe['name'],
Alexander Graf8a74ce62021-01-20 23:44:34 +01002388 depends: emulator,
2389 output: exe['name'],
2390 command: [
2391 meson.current_source_dir() / 'scripts/entitlement.sh',
2392 meson.current_build_dir() / exe_name,
2393 meson.current_build_dir() / exe['name'],
2394 meson.current_source_dir() / 'accel/hvf/entitlements.plist'
2395 ])
2396 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09002397
2398 meson.add_install_script('scripts/entitlement.sh', '--install',
2399 get_option('bindir') / exe_name,
2400 get_option('bindir') / exe['name'],
2401 meson.current_source_dir() / 'accel/hvf/entitlements.plist')
Alexander Graf8a74ce62021-01-20 23:44:34 +01002402 else
2403 emulators += {exe['name']: emulator}
2404 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002405
2406 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
2407 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002408 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
2409 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002410 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
2411 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
2412 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002413 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002414 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002415 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002416 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002417 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002418 command: [
2419 tracetool, '--group=all', '--format=' + stp['fmt'],
2420 '--binary=' + stp['bin'],
2421 '--target-name=' + target_name,
2422 '--target-type=' + target_type,
2423 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01002424 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002425 ],
2426 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002427 endforeach
2428 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002429 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002430endforeach
2431
Paolo Bonzini931049b2020-02-05 09:44:24 +01002432# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002433
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002434if 'CONFIG_PLUGIN' in config_host
2435 install_headers('include/qemu/qemu-plugin.h')
2436endif
2437
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002438if 'CONFIG_GUEST_AGENT' in config_host
2439 subdir('qga')
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002440elif get_option('guest_agent_msi').enabled()
2441 error('Guest agent MSI requested, but the guest agent is not being built')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002442endif
2443
Laurent Vivier9755c942020-08-24 17:24:30 +02002444# Don't build qemu-keymap if xkbcommon is not explicitly enabled
2445# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002446if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04002447 # used for the update-keymaps target, so include rules even if !have_tools
2448 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
2449 dependencies: [qemuutil, xkbcommon], install: have_tools)
2450endif
2451
Paolo Bonzini931049b2020-02-05 09:44:24 +01002452if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002453 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
2454 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
2455 qemu_io = executable('qemu-io', files('qemu-io.c'),
2456 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01002457 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002458 dependencies: [blockdev, qemuutil, gnutls], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002459
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02002460 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002461 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04002462 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002463
Marc-André Lureau157e7b12019-07-15 14:50:58 +04002464 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
2465 dependencies: qemuutil,
2466 install: true)
2467
Paolo Bonzini931049b2020-02-05 09:44:24 +01002468 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02002469 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002470 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04002471 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02002472 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01002473 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002474
2475 if targetos == 'linux'
2476 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2477 dependencies: [qemuutil, libcap_ng],
2478 install: true,
2479 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002480
2481 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2482 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002483 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002484 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002485 endif
2486
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04002487 if 'CONFIG_IVSHMEM' in config_host
2488 subdir('contrib/ivshmem-client')
2489 subdir('contrib/ivshmem-server')
2490 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01002491endif
2492
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04002493subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002494subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04002495subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02002496subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08002497subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01002498if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04002499 subdir('po')
2500endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002501
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002502if host_machine.system() == 'windows'
2503 nsis_cmd = [
2504 find_program('scripts/nsis.py'),
2505 '@OUTPUT@',
2506 get_option('prefix'),
2507 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01002508 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002509 '--',
2510 '-DDISPLAYVERSION=' + meson.project_version(),
2511 ]
2512 if build_docs
2513 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2514 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002515 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002516 nsis_cmd += '-DCONFIG_GTK=y'
2517 endif
2518
2519 nsis = custom_target('nsis',
2520 output: 'qemu-setup-' + meson.project_version() + '.exe',
2521 input: files('qemu.nsi'),
2522 build_always_stale: true,
2523 command: nsis_cmd + ['@INPUT@'])
2524 alias_target('installer', nsis)
2525endif
2526
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002527#########################
2528# Configuration summary #
2529#########################
2530
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002531# Directories
Paolo Bonzinif9332752020-02-03 13:28:38 +01002532summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002533summary_info += {'Install prefix': get_option('prefix')}
2534summary_info += {'BIOS directory': qemu_datadir}
2535summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2536summary_info += {'binary directory': get_option('bindir')}
2537summary_info += {'library directory': get_option('libdir')}
2538summary_info += {'module directory': qemu_moddir}
2539summary_info += {'libexec directory': get_option('libexecdir')}
2540summary_info += {'include directory': get_option('includedir')}
2541summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002542if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002543 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04002544 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002545else
2546 summary_info += {'local state directory': 'queried at runtime'}
2547endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04002548summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002549summary_info += {'Build directory': meson.current_build_dir()}
2550summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002551summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002552summary(summary_info, bool_yn: true, section: 'Directories')
2553
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002554# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002555summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002556summary_info += {'git': config_host['GIT']}
2557summary_info += {'make': config_host['MAKE']}
2558summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
2559summary_info += {'sphinx-build': sphinx_build.found()}
2560if config_host.has_key('HAVE_GDB_BIN')
2561 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2562endif
2563summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2564if targetos == 'windows' and config_host.has_key('CONFIG_GUEST_AGENT')
2565 summary_info += {'wixl': wixl.found() ? wixl.full_path() : false}
2566endif
Joelle van Dyneb8e0c492021-03-15 11:03:41 -07002567if slirp_opt != 'disabled' and 'CONFIG_SLIRP_SMBD' in config_host
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002568 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2569endif
2570summary(summary_info, bool_yn: true, section: 'Host binaries')
2571
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01002572# Configurable features
2573summary_info = {}
2574summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002575summary_info += {'system-mode emulation': have_system}
2576summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002577summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01002578summary_info += {'Install blobs': get_option('install_blobs')}
2579summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2580if config_host.has_key('CONFIG_MODULES')
2581 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2582endif
2583summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2584summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2585if have_system
2586 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2587endif
2588summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2589if config_host['TRACE_BACKENDS'].split().contains('simple')
2590 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2591endif
2592summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2593summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
2594summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2595summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2596summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2597summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
2598summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
2599summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
2600summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2601summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2602summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2603summary(summary_info, bool_yn: true, section: 'Configurable features')
2604
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002605# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002606summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002607summary_info += {'host CPU': cpu}
2608summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01002609summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
2610summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002611if link_language == 'cpp'
Alex Bennée63de9352021-05-27 17:03:15 +01002612 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002613else
2614 summary_info += {'C++ compiler': false}
2615endif
2616if targetos == 'darwin'
Alex Bennée63de9352021-05-27 17:03:15 +01002617 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002618endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002619if targetos == 'windows'
2620 if 'WIN_SDK' in config_host
2621 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2622 endif
2623endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002624summary_info += {'ARFLAGS': config_host['ARFLAGS']}
Paolo Bonzini47b30832020-09-23 05:26:17 -04002625summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2626 + ['-O' + get_option('optimization')]
2627 + (get_option('debug') ? ['-g'] : []))}
2628if link_language == 'cpp'
2629 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2630 + ['-O' + get_option('optimization')]
2631 + (get_option('debug') ? ['-g'] : []))}
2632endif
2633link_args = get_option(link_language + '_link_args')
2634if link_args.length() > 0
2635 summary_info += {'LDFLAGS': ' '.join(link_args)}
2636endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002637summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2638summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002639summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05002640summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002641summary_info += {'PIE': get_option('b_pie')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02002642summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002643summary_info += {'malloc trim support': has_malloc_trim}
2644summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002645summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2646summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2647summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2648summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
2649summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2650summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2651summary_info += {'memory allocator': get_option('malloc')}
2652summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2653summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2654summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
2655summary_info += {'gcov': get_option('b_coverage')}
2656summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2657summary_info += {'CFI support': get_option('cfi')}
2658if get_option('cfi')
2659 summary_info += {'CFI debug support': get_option('cfi_debug')}
2660endif
2661summary_info += {'strip binaries': get_option('strip')}
2662summary_info += {'sparse': sparse.found() ? sparse.full_path() : false}
2663summary_info += {'mingw32 support': targetos == 'windows'}
Alex Bennée49e85652021-02-22 10:14:50 +00002664
2665# snarf the cross-compilation information for tests
2666foreach target: target_dirs
2667 tcg_mak = meson.current_build_dir() / 'tests/tcg' / 'config-' + target + '.mak'
2668 if fs.exists(tcg_mak)
2669 config_cross_tcg = keyval.load(tcg_mak)
2670 target = config_cross_tcg['TARGET_NAME']
2671 compiler = ''
2672 if 'DOCKER_CROSS_CC_GUEST' in config_cross_tcg
2673 summary_info += {target + ' tests': config_cross_tcg['DOCKER_CROSS_CC_GUEST'] +
2674 ' via ' + config_cross_tcg['DOCKER_IMAGE']}
2675 elif 'CROSS_CC_GUEST' in config_cross_tcg
2676 summary_info += {target + ' tests'
2677 : config_cross_tcg['CROSS_CC_GUEST'] }
2678 endif
2679 endif
2680endforeach
2681
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002682summary(summary_info, bool_yn: true, section: 'Compilation')
2683
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002684# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002685summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002686if have_system
2687 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2688 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2689 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2690 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
Reinoud Zandijk74a414a2021-04-02 22:25:32 +02002691 summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002692 summary_info += {'Xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2693 if config_host.has_key('CONFIG_XEN_BACKEND')
2694 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2695 endif
2696endif
2697summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2698if config_all.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01002699 if get_option('tcg_interpreter')
2700 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, experimental and slow)'}
2701 else
2702 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
2703 endif
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002704 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002705endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002706summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002707if have_system
2708 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01002709 summary_info += {'out of process emulation': multiprocess_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002710endif
2711summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
2712
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002713# Block layer
2714summary_info = {}
2715summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2716summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2717if have_block
2718 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2719 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
2720 summary_info += {'VirtFS support': have_virtfs}
2721 summary_info += {'build virtiofs daemon': have_virtiofsd}
2722 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
2723 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2724 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2725 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2726 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2727 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2728 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2729 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2730 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2731 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002732 summary_info += {'FUSE exports': fuse.found()}
2733endif
2734summary(summary_info, bool_yn: true, section: 'Block layer support')
2735
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002736# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002737summary_info = {}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002738summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
Paolo Bonzini57612512021-06-03 11:15:26 +02002739summary_info += {'GNUTLS support': gnutls.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002740# TODO: add back version
Paolo Bonzini57612512021-06-03 11:15:26 +02002741summary_info += {'libgcrypt': gcrypt.found()}
2742if gcrypt.found()
2743 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002744endif
2745# TODO: add back version
Paolo Bonzini57612512021-06-03 11:15:26 +02002746summary_info += {'nettle': nettle.found()}
2747if nettle.found()
2748 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002749endif
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002750summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
2751summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2752summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
2753summary(summary_info, bool_yn: true, section: 'Crypto')
2754
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01002755# Libraries
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002756summary_info = {}
2757if targetos == 'darwin'
2758 summary_info += {'Cocoa support': cocoa.found()}
2759endif
2760# TODO: add back version
2761summary_info += {'SDL support': sdl.found()}
2762summary_info += {'SDL image support': sdl_image.found()}
2763# TODO: add back version
2764summary_info += {'GTK support': gtk.found()}
2765summary_info += {'pixman': pixman.found()}
2766# TODO: add back version
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02002767summary_info += {'VTE support': vte.found()}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002768# TODO: add back version
2769summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
Paolo Bonziniba7ed402021-06-03 11:15:26 +02002770summary_info += {'libtasn1': tasn1.found()}
Paolo Bonzini05e391a2021-06-03 11:15:26 +02002771summary_info += {'PAM': pam.found()}
Yonggang Luo5285e592020-10-13 07:43:48 +08002772summary_info += {'iconv support': iconv.found()}
2773summary_info += {'curses support': curses.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002774# TODO: add back version
Paolo Bonzini587d59d2021-06-03 11:31:35 +02002775summary_info += {'virgl support': virgl.found()}
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002776summary_info += {'curl support': curl.found()}
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002777summary_info += {'Multipath support': mpathpersist.found()}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002778summary_info += {'VNC support': vnc.found()}
2779if vnc.found()
2780 summary_info += {'VNC SASL support': sasl.found()}
2781 summary_info += {'VNC JPEG support': jpeg.found()}
2782 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002783endif
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002784summary_info += {'brlapi support': brlapi.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002785summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2786summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2787summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2788summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002789summary_info += {'ATTR/XATTR support': libattr.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002790summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2791summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002792summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002793summary_info += {'libcap-ng support': libcap_ng.found()}
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002794summary_info += {'bpf support': libbpf.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002795# TODO: add back protocol and server version
2796summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002797summary_info += {'rbd support': rbd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002798summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
Paolo Bonzini5f364c52021-06-03 11:15:26 +02002799summary_info += {'smartcard support': cacard.found()}
César Belley0a40bcb2020-08-26 13:42:04 +02002800summary_info += {'U2F support': u2f.found()}
Paolo Bonzini90540f32021-06-03 11:15:26 +02002801summary_info += {'libusb': libusb.found()}
Paolo Bonzini18f31e62021-06-03 11:15:26 +02002802summary_info += {'usb net redir': usbredir.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002803summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
Akihiko Odakibc6a3562021-02-23 15:03:07 +09002804summary_info += {'GBM': config_host.has_key('CONFIG_GBM')}
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002805summary_info += {'libiscsi support': libiscsi.found()}
Paolo Bonzini30045c02020-11-17 13:11:25 +01002806summary_info += {'libnfs support': libnfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002807if targetos == 'windows'
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002808 if config_host.has_key('CONFIG_GUEST_AGENT')
2809 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2810 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002811 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002812endif
Paolo Bonzini90835c22020-11-17 14:22:24 +01002813summary_info += {'seccomp support': seccomp.found()}
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002814summary_info += {'GlusterFS support': glusterfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002815summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2816summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002817summary_info += {'lzo support': lzo.found()}
Paolo Bonzini241611e2020-11-17 13:32:34 +01002818summary_info += {'snappy support': snappy.found()}
Paolo Bonzini29ba6112020-11-17 13:07:52 +01002819summary_info += {'bzip2 support': libbzip2.found()}
Paolo Bonziniecea3692020-11-17 13:35:28 +01002820summary_info += {'lzfse support': liblzfse.found()}
Paolo Bonzinib1def332020-11-17 13:37:39 +01002821summary_info += {'zstd support': zstd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002822summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2823summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002824summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02002825summary_info += {'libpmem support': libpmem.found()}
Paolo Bonzini83ef1682021-06-03 11:31:35 +02002826summary_info += {'libdaxctl support': libdaxctl.found()}
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002827summary_info += {'libudev': libudev.found()}
Max Reitzdf4ea702020-10-27 20:05:46 +01002828summary_info += {'FUSE lseek': fuse_lseek.found()}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01002829summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01002830
2831if not supported_cpus.contains(cpu)
2832 message()
2833 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2834 message()
2835 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2836 message('The QEMU project intends to remove support for this host CPU in')
2837 message('a future release if nobody volunteers to maintain it and to')
2838 message('provide a build host for our continuous integration setup.')
2839 message('configure has succeeded and you can continue to build, but')
2840 message('if you care about QEMU on this platform you should contact')
2841 message('us upstream at qemu-devel@nongnu.org.')
2842endif
2843
2844if not supported_oses.contains(targetos)
2845 message()
2846 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2847 message()
2848 message('Host OS ' + targetos + 'support is not currently maintained.')
2849 message('The QEMU project intends to remove support for this host OS in')
2850 message('a future release if nobody volunteers to maintain it and to')
2851 message('provide a build host for our continuous integration setup.')
2852 message('configure has succeeded and you can continue to build, but')
2853 message('if you care about QEMU on this platform you should contact')
2854 message('us upstream at qemu-devel@nongnu.org.')
2855endif