blob: 073269c59f46ed2733a4565dead83b52bc5fff1e [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
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +020095modular_tcg = ['i386-softmmu', 'x86_64-softmmu']
96
Philippe Mathieu-Daudéeae9a1d2021-01-14 18:45:08 +010097edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
98install_edk2_blobs = false
99if get_option('install_blobs')
100 foreach target : target_dirs
101 install_edk2_blobs = install_edk2_blobs or target in edk2_targets
102 endforeach
103endif
104
Philippe Mathieu-Daudé45b545d2021-01-14 18:45:09 +0100105bzip2 = find_program('bzip2', required: install_edk2_blobs)
106
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400107##################
108# Compiler flags #
109##################
110
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400111# Specify linker-script with add_project_link_arguments so that it is not placed
112# within a linker --start-group/--end-group pair
113if 'CONFIG_FUZZ' in config_host
114 add_project_link_arguments(['-Wl,-T,',
115 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
116 native: false, language: ['c', 'cpp', 'objc'])
117endif
118
Marc-André Lureau5fc06172021-01-14 16:56:02 +0400119add_global_arguments(config_host['QEMU_CFLAGS'].split(),
120 native: false, language: ['c', 'objc'])
121add_global_arguments(config_host['QEMU_CXXFLAGS'].split(),
122 native: false, language: 'cpp')
123add_global_link_arguments(config_host['QEMU_LDFLAGS'].split(),
124 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzinia5665052019-06-10 12:05:14 +0200125
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400126if targetos == 'linux'
127 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
128 '-isystem', 'linux-headers',
129 language: ['c', 'cpp'])
130endif
131
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100132add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400133 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400134 '-iquote', meson.current_source_dir() / 'include',
135 '-iquote', meson.current_source_dir() / 'disas/libvixl',
136 language: ['c', 'cpp', 'objc'])
Alexander Bulekovc46f76d2020-09-02 13:36:50 -0400137
Marc-André Lureaufc929892019-07-13 01:47:54 +0400138link_language = meson.get_external_property('link_language', 'cpp')
139if link_language == 'cpp'
140 add_languages('cpp', required: true, native: false)
141endif
Paolo Bonzinia5665052019-06-10 12:05:14 +0200142if host_machine.system() == 'darwin'
143 add_languages('objc', required: false, native: false)
144endif
145
Paolo Bonzinideb62372020-09-01 07:51:16 -0400146sparse = find_program('cgcc', required: get_option('sparse'))
147if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100148 run_target('sparse',
149 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400150 'compile_commands.json', sparse.full_path(), '-Wbitwise',
151 '-Wno-transparent-union', '-Wno-old-initializer',
152 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100153endif
154
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200155###########################################
156# Target-specific checks and dependencies #
157###########################################
158
159if targetos != 'linux' and get_option('mpath').enabled()
160 error('Multipath is supported only on Linux')
161endif
162
Paolo Bonzini106ad1f2021-02-17 16:24:25 +0100163if targetos != 'linux' and get_option('multiprocess').enabled()
164 error('Multiprocess QEMU is supported only on Linux')
165endif
166multiprocess_allowed = targetos == 'linux' and not get_option('multiprocess').disabled()
167
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200168libm = cc.find_library('m', required: false)
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +0200169threads = dependency('threads')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400170util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200171winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400172socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400173version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400174coref = []
175iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400176emulator_link_args = []
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200177nvmm =not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400178hvf = not_found
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400179if targetos == 'windows'
180 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200181 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400182
183 win = import('windows')
184 version_res = win.compile_resources('version.rc',
185 depend_files: files('pc-bios/qemu-nsis.ico'),
186 include_directories: include_directories('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400187elif targetos == 'darwin'
188 coref = dependency('appleframeworks', modules: 'CoreFoundation')
Joelle van Dyne14176c82021-03-15 11:03:38 -0700189 iokit = dependency('appleframeworks', modules: 'IOKit', required: false)
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200190elif targetos == 'sunos'
191 socket = [cc.find_library('socket'),
192 cc.find_library('nsl'),
193 cc.find_library('resolv')]
194elif targetos == 'haiku'
195 socket = [cc.find_library('posix_error_mapper'),
196 cc.find_library('network'),
197 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400198elif targetos == 'openbsd'
199 if not get_option('tcg').disabled() and target_dirs.length() > 0
200 # Disable OpenBSD W^X if available
201 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
202 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400203endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200204
Paolo Bonzini8a199802020-09-18 05:37:01 -0400205accelerators = []
206if not get_option('kvm').disabled() and targetos == 'linux'
207 accelerators += 'CONFIG_KVM'
208endif
209if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
210 accelerators += 'CONFIG_XEN'
211 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
212else
213 have_xen_pci_passthrough = false
214endif
215if not get_option('whpx').disabled() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000216 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400217 error('WHPX requires 64-bit host')
218 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
219 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
220 accelerators += 'CONFIG_WHPX'
221 endif
222endif
223if not get_option('hvf').disabled()
224 hvf = dependency('appleframeworks', modules: 'Hypervisor',
225 required: get_option('hvf'))
226 if hvf.found()
227 accelerators += 'CONFIG_HVF'
228 endif
229endif
230if not get_option('hax').disabled()
231 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
232 accelerators += 'CONFIG_HAX'
233 endif
234endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200235if targetos == 'netbsd'
236 if cc.has_header_symbol('nvmm.h', 'nvmm_cpu_stop', required: get_option('nvmm'))
237 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
238 endif
239 if nvmm.found()
240 accelerators += 'CONFIG_NVMM'
241 endif
242endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100243
244tcg_arch = config_host['ARCH']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400245if not get_option('tcg').disabled()
246 if cpu not in supported_cpus
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100247 if get_option('tcg_interpreter')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +0100248 warning('Unsupported CPU @0@, will use TCG with TCI (experimental and slow)'.format(cpu))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400249 else
250 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
251 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100252 elif get_option('tcg_interpreter')
253 warning('Use of the TCG interpretor is not recommended on this host')
254 warning('architecture. There is a native TCG execution backend available')
255 warning('which provides substantially better performance and reliability.')
256 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
257 warning('configuration option on this architecture to use the native')
258 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400259 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100260 if get_option('tcg_interpreter')
261 tcg_arch = 'tci'
262 elif config_host['ARCH'] == 'sparc64'
263 tcg_arch = 'sparc'
264 elif config_host['ARCH'] == 's390x'
265 tcg_arch = 's390'
266 elif config_host['ARCH'] in ['x86_64', 'x32']
267 tcg_arch = 'i386'
268 elif config_host['ARCH'] == 'ppc64'
269 tcg_arch = 'ppc'
270 elif config_host['ARCH'] in ['riscv32', 'riscv64']
271 tcg_arch = 'riscv'
272 endif
273 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100274 language: ['c', 'cpp', 'objc'])
275
Paolo Bonzini8a199802020-09-18 05:37:01 -0400276 accelerators += 'CONFIG_TCG'
277 config_host += { 'CONFIG_TCG': 'y' }
278endif
279
280if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
281 error('KVM not available on this platform')
282endif
283if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
284 error('HVF not available on this platform')
285endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200286if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
287 error('NVMM not available on this platform')
288endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400289if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
290 error('WHPX not available on this platform')
291endif
292if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
293 if 'CONFIG_XEN' in accelerators
294 error('Xen PCI passthrough not available on this platform')
295 else
296 error('Xen PCI passthrough requested but Xen not enabled')
297 endif
298endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400299
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200300################
301# Dependencies #
302################
303
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400304# The path to glib.h is added to all compilation commands. This was
305# grandfathered in from the QEMU Makefiles.
306add_project_arguments(config_host['GLIB_CFLAGS'].split(),
307 native: false, language: ['c', 'cpp', 'objc'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400308glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
309 link_args: config_host['GLIB_LIBS'].split())
310# override glib dep with the configure results (for subprojects)
311meson.override_dependency('glib-2.0', glib)
312
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400313gio = not_found
314if 'CONFIG_GIO' in config_host
315 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
316 link_args: config_host['GIO_LIBS'].split())
317endif
318lttng = not_found
319if 'CONFIG_TRACE_UST' in config_host
320 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
321endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200322pixman = not_found
323if have_system or have_tools
324 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100325 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200326endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400327libaio = cc.find_library('aio', required: false)
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100328zlib = dependency('zlib', required: true, kwargs: static_kwargs)
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200329
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400330linux_io_uring = not_found
Paolo Bonzini53c22b62021-06-03 11:31:35 +0200331if not get_option('linux_io_uring').auto() or have_block
332 linux_io_uring = dependency('liburing', required: get_option('linux_io_uring'),
333 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400334endif
335libxml2 = not_found
Paolo Bonzinic5b36c22021-06-03 11:31:35 +0200336if not get_option('libxml2').auto() or have_block
337 libxml2 = dependency('libxml-2.0', required: get_option('libxml2'),
338 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400339endif
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);
Peter Lieven48672ac2021-07-02 19:23:51 +0200711 #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0)
712 #error
713 #endif
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100714 return 0;
715 }''', dependencies: [librbd, librados])
716 rbd = declare_dependency(dependencies: [librbd, librados])
717 elif get_option('rbd').enabled()
Peter Lieven48672ac2021-07-02 19:23:51 +0200718 error('librbd >= 1.12.0 required')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100719 else
Peter Lieven48672ac2021-07-02 19:23:51 +0200720 warning('librbd >= 1.12.0 not found, disabling')
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100721 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100722 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400723endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100724
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400725glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100726glusterfs_ftruncate_has_stat = false
727glusterfs_iocb_has_stat = false
728if not get_option('glusterfs').auto() or have_block
729 glusterfs = dependency('glusterfs-api', version: '>=3',
730 required: get_option('glusterfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100731 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100732 if glusterfs.found()
733 glusterfs_ftruncate_has_stat = cc.links('''
734 #include <glusterfs/api/glfs.h>
735
736 int
737 main(void)
738 {
739 /* new glfs_ftruncate() passes two additional args */
740 return glfs_ftruncate(NULL, 0, NULL, NULL);
741 }
742 ''', dependencies: glusterfs)
743 glusterfs_iocb_has_stat = cc.links('''
744 #include <glusterfs/api/glfs.h>
745
746 /* new glfs_io_cbk() passes two additional glfs_stat structs */
747 static void
748 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
749 {}
750
751 int
752 main(void)
753 {
754 glfs_io_cbk iocb = &glusterfs_iocb;
755 iocb(NULL, 0 , NULL, NULL, NULL);
756 return 0;
757 }
758 ''', dependencies: glusterfs)
759 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400760endif
761libssh = not_found
762if 'CONFIG_LIBSSH' in config_host
763 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
764 link_args: config_host['LIBSSH_LIBS'].split())
765endif
766libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100767if not get_option('bzip2').auto() or have_block
768 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
769 required: get_option('bzip2'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100770 kwargs: static_kwargs)
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100771 if libbzip2.found() and not cc.links('''
772 #include <bzlib.h>
773 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
774 libbzip2 = not_found
775 if get_option('bzip2').enabled()
776 error('could not link libbzip2')
777 else
778 warning('could not link libbzip2, disabling')
779 endif
780 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400781endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100782
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400783liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +0100784if not get_option('lzfse').auto() or have_block
785 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
786 required: get_option('lzfse'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100787 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400788endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100789if liblzfse.found() and not cc.links('''
790 #include <lzfse.h>
791 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
792 liblzfse = not_found
793 if get_option('lzfse').enabled()
794 error('could not link liblzfse')
795 else
796 warning('could not link liblzfse, disabling')
797 endif
798endif
799
Paolo Bonzini478e9432020-08-17 12:47:55 +0200800oss = not_found
801if 'CONFIG_AUDIO_OSS' in config_host
802 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
803endif
804dsound = not_found
805if 'CONFIG_AUDIO_DSOUND' in config_host
806 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
807endif
808coreaudio = not_found
809if 'CONFIG_AUDIO_COREAUDIO' in config_host
810 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
811endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400812opengl = not_found
813if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400814 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
815 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400816endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100817
Paolo Bonzini57612512021-06-03 11:15:26 +0200818gnutls = not_found
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +0100819gnutls_crypto = not_found
Paolo Bonzini57612512021-06-03 11:15:26 +0200820if not get_option('gnutls').auto() or have_system
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +0100821 # For general TLS support our min gnutls matches
822 # that implied by our platform support matrix
823 #
824 # For the crypto backends, we look for a newer
825 # gnutls:
826 #
827 # Version 3.6.8 is needed to get XTS
828 # Version 3.6.13 is needed to get PBKDF
829 # Version 3.6.14 is needed to get HW accelerated XTS
830 #
831 # If newer enough gnutls isn't available, we can
832 # still use a different crypto backend to satisfy
833 # the platform support requirements
834 gnutls_crypto = dependency('gnutls', version: '>=3.6.14',
835 method: 'pkg-config',
836 required: false,
837 kwargs: static_kwargs)
838 if gnutls_crypto.found()
839 gnutls = gnutls_crypto
840 else
841 # Our min version if all we need is TLS
842 gnutls = dependency('gnutls', version: '>=3.5.18',
843 method: 'pkg-config',
844 required: get_option('gnutls'),
845 kwargs: static_kwargs)
846 endif
Paolo Bonzini57612512021-06-03 11:15:26 +0200847endif
848
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +0100849# We prefer use of gnutls for crypto, unless the options
850# explicitly asked for nettle or gcrypt.
851#
852# If gnutls isn't available for crypto, then we'll prefer
853# gcrypt over nettle for performance reasons.
Paolo Bonzini57612512021-06-03 11:15:26 +0200854gcrypt = not_found
855nettle = not_found
Daniel P. Berrangé68014042021-07-02 17:00:32 +0100856xts = 'none'
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +0100857
Paolo Bonzini57612512021-06-03 11:15:26 +0200858if get_option('nettle').enabled() and get_option('gcrypt').enabled()
859 error('Only one of gcrypt & nettle can be enabled')
Paolo Bonzini57612512021-06-03 11:15:26 +0200860endif
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +0100861
862# Explicit nettle/gcrypt request, so ignore gnutls for crypto
863if get_option('nettle').enabled() or get_option('gcrypt').enabled()
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +0100864 gnutls_crypto = not_found
865endif
Paolo Bonzini57612512021-06-03 11:15:26 +0200866
Daniel P. Berrangé8bd09312021-07-02 17:38:33 +0100867if not gnutls_crypto.found()
868 if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled()
869 gcrypt = dependency('libgcrypt', version: '>=1.8',
870 method: 'config-tool',
871 required: get_option('gcrypt'),
872 kwargs: static_kwargs)
873 # Debian has removed -lgpg-error from libgcrypt-config
874 # as it "spreads unnecessary dependencies" which in
875 # turn breaks static builds...
876 if gcrypt.found() and enable_static
877 gcrypt = declare_dependency(dependencies: [
878 gcrypt,
879 cc.find_library('gpg-error', required: true, kwargs: static_kwargs)])
880 endif
881 endif
882 if (not get_option('nettle').auto() or have_system) and not gcrypt.found()
883 nettle = dependency('nettle', version: '>=3.4',
884 method: 'pkg-config',
885 required: get_option('nettle'),
886 kwargs: static_kwargs)
887 if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle)
888 xts = 'private'
889 endif
890 endif
891endif
892
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400893gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +0100894gtkx11 = not_found
Paolo Bonzinic23d7b42021-06-03 11:31:35 +0200895vte = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100896if not get_option('gtk').auto() or (have_system and not cocoa.found())
Paolo Bonzini1b695472021-01-07 14:02:29 +0100897 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
898 method: 'pkg-config',
899 required: get_option('gtk'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100900 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +0100901 if gtk.found()
902 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
903 method: 'pkg-config',
904 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100905 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +0100906 gtk = declare_dependency(dependencies: [gtk, gtkx11])
Paolo Bonzinic23d7b42021-06-03 11:31:35 +0200907
908 if not get_option('vte').auto() or have_system
909 vte = dependency('vte-2.91',
910 method: 'pkg-config',
911 required: get_option('vte'),
912 kwargs: static_kwargs)
913 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100914 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400915endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100916
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400917x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +0200918if gtkx11.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +0100919 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100920 kwargs: static_kwargs)
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400921endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100922vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400923png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400924jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400925sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100926if get_option('vnc').enabled()
927 vnc = declare_dependency() # dummy dependency
928 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100929 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini8e242b32020-11-23 13:34:02 -0500930 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100931 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100932 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
933 required: get_option('vnc_sasl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100934 kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100935 if sasl.found()
936 sasl = declare_dependency(dependencies: sasl,
937 compile_args: '-DSTRUCT_IOVEC_DEFINED')
938 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400939endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100940
Paolo Bonzini05e391a2021-06-03 11:15:26 +0200941pam = not_found
942if not get_option('auth_pam').auto() or have_system
943 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
944 required: get_option('auth_pam'),
945 kwargs: static_kwargs)
946endif
947if pam.found() and not cc.links('''
948 #include <stddef.h>
949 #include <security/pam_appl.h>
950 int main(void) {
951 const char *service_name = "qemu";
952 const char *user = "frank";
953 const struct pam_conv pam_conv = { 0 };
954 pam_handle_t *pamh = NULL;
955 pam_start(service_name, user, &pam_conv, &pamh);
956 return 0;
957 }''', dependencies: pam)
958 pam = not_found
959 if get_option('auth_pam').enabled()
960 error('could not link libpam')
961 else
962 warning('could not link libpam, disabling')
963 endif
964endif
965
Marc-André Lureau708eab42019-09-03 16:59:33 +0400966snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +0100967if not get_option('snappy').auto() or have_system
968 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
969 required: get_option('snappy'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100970 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400971endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100972if snappy.found() and not cc.links('''
973 #include <snappy-c.h>
974 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
975 snappy = not_found
976 if get_option('snappy').enabled()
977 error('could not link libsnappy')
978 else
979 warning('could not link libsnappy, disabling')
980 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400981endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100982
Marc-André Lureau708eab42019-09-03 16:59:33 +0400983lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100984if not get_option('lzo').auto() or have_system
985 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
986 required: get_option('lzo'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100987 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400988endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100989if lzo.found() and not cc.links('''
990 #include <lzo/lzo1x.h>
991 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
992 lzo = not_found
993 if get_option('lzo').enabled()
994 error('could not link liblzo2')
995 else
996 warning('could not link liblzo2, disabling')
997 endif
998endif
999
Marc-André Lureau55166232019-07-24 19:16:22 +04001000rdma = not_found
1001if 'CONFIG_RDMA' in config_host
1002 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
1003endif
Marc-André Lureauab318052019-07-24 19:23:16 +04001004numa = not_found
1005if 'CONFIG_NUMA' in config_host
1006 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
1007endif
Marc-André Lureau582ea952019-08-15 15:15:32 +04001008xen = not_found
1009if 'CONFIG_XEN_BACKEND' in config_host
1010 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
1011 link_args: config_host['XEN_LIBS'].split())
1012endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001013cacard = not_found
Paolo Bonzini5f364c52021-06-03 11:15:26 +02001014if not get_option('smartcard').auto() or have_system
1015 cacard = dependency('libcacard', required: get_option('smartcard'),
1016 version: '>=2.5.1', method: 'pkg-config',
1017 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001018endif
César Belley0a40bcb2020-08-26 13:42:04 +02001019u2f = not_found
1020if have_system
1021 u2f = dependency('u2f-emu', required: get_option('u2f'),
1022 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001023 kwargs: static_kwargs)
César Belley0a40bcb2020-08-26 13:42:04 +02001024endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001025usbredir = not_found
Paolo Bonzini18f31e62021-06-03 11:15:26 +02001026if not get_option('usb_redir').auto() or have_system
1027 usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'),
1028 version: '>=0.6', method: 'pkg-config',
1029 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001030endif
1031libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +02001032if not get_option('libusb').auto() or have_system
1033 libusb = dependency('libusb-1.0', required: get_option('libusb'),
1034 version: '>=1.0.13', method: 'pkg-config',
1035 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +02001036endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02001037
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001038libpmem = not_found
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02001039if not get_option('libpmem').auto() or have_system
1040 libpmem = dependency('libpmem', required: get_option('libpmem'),
1041 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001042endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001043libdaxctl = not_found
Paolo Bonzini83ef1682021-06-03 11:31:35 +02001044if not get_option('libdaxctl').auto() or have_system
1045 libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'),
1046 version: '>=57', method: 'pkg-config',
1047 kwargs: static_kwargs)
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001048endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001049tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02001050if gnutls.found()
1051 tasn1 = dependency('libtasn1',
1052 method: 'pkg-config',
1053 kwargs: static_kwargs)
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001054endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001055keyutils = dependency('libkeyutils', required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001056 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001057
Marc-André Lureau3909def2020-08-28 15:07:33 +04001058has_gettid = cc.has_function('gettid')
1059
Paolo Bonziniaa087962020-09-01 11:15:30 -04001060# Malloc tests
1061
1062malloc = []
1063if get_option('malloc') == 'system'
1064 has_malloc_trim = \
1065 not get_option('malloc_trim').disabled() and \
1066 cc.links('''#include <malloc.h>
1067 int main(void) { malloc_trim(0); return 0; }''')
1068else
1069 has_malloc_trim = false
1070 malloc = cc.find_library(get_option('malloc'), required: true)
1071endif
1072if not has_malloc_trim and get_option('malloc_trim').enabled()
1073 if get_option('malloc') == 'system'
1074 error('malloc_trim not available on this platform.')
1075 else
1076 error('malloc_trim not available with non-libc memory allocator')
1077 endif
1078endif
1079
Max Reitz84e319a2020-11-02 17:18:55 +01001080# Check whether the glibc provides statx()
1081
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001082gnu_source_prefix = '''
Max Reitz84e319a2020-11-02 17:18:55 +01001083 #ifndef _GNU_SOURCE
1084 #define _GNU_SOURCE
1085 #endif
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001086'''
1087statx_test = gnu_source_prefix + '''
Max Reitz84e319a2020-11-02 17:18:55 +01001088 #include <sys/stat.h>
1089 int main(void) {
1090 struct statx statxbuf;
1091 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
1092 return 0;
1093 }'''
1094
1095has_statx = cc.links(statx_test)
1096
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +00001097have_vhost_user_blk_server = (targetos == 'linux' and
1098 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001099
1100if get_option('vhost_user_blk_server').enabled()
1101 if targetos != 'linux'
1102 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +00001103 elif 'CONFIG_VHOST_USER' not in config_host
1104 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001105 endif
1106elif get_option('vhost_user_blk_server').disabled() or not have_system
1107 have_vhost_user_blk_server = false
1108endif
1109
Daniele Buono9e62ba42020-12-04 18:06:14 -05001110
Max Reitzdf4ea702020-10-27 20:05:46 +01001111if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1112 error('Cannot enable fuse-lseek while fuse is disabled')
1113endif
1114
Max Reitza484a712020-10-27 20:05:41 +01001115fuse = dependency('fuse3', required: get_option('fuse'),
1116 version: '>=3.1', method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001117 kwargs: static_kwargs)
Max Reitza484a712020-10-27 20:05:41 +01001118
Max Reitzdf4ea702020-10-27 20:05:46 +01001119fuse_lseek = not_found
1120if not get_option('fuse_lseek').disabled()
1121 if fuse.version().version_compare('>=3.8')
1122 # Dummy dependency
1123 fuse_lseek = declare_dependency()
1124 elif get_option('fuse_lseek').enabled()
1125 if fuse.found()
1126 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1127 else
1128 error('fuse-lseek requires libfuse, which was not found')
1129 endif
1130 endif
1131endif
1132
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001133# libbpf
1134libbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
1135if libbpf.found() and not cc.links('''
1136 #include <bpf/libbpf.h>
1137 int main(void)
1138 {
1139 bpf_object__destroy_skeleton(NULL);
1140 return 0;
1141 }''', dependencies: libbpf)
1142 libbpf = not_found
1143 if get_option('bpf').enabled()
1144 error('libbpf skeleton test failed')
1145 else
1146 warning('libbpf skeleton test failed, disabling')
1147 endif
1148endif
1149
Daniele Buono9e62ba42020-12-04 18:06:14 -05001150if get_option('cfi')
1151 cfi_flags=[]
1152 # Check for dependency on LTO
1153 if not get_option('b_lto')
1154 error('Selected Control-Flow Integrity but LTO is disabled')
1155 endif
1156 if config_host.has_key('CONFIG_MODULES')
1157 error('Selected Control-Flow Integrity is not compatible with modules')
1158 endif
1159 # Check for cfi flags. CFI requires LTO so we can't use
1160 # get_supported_arguments, but need a more complex "compiles" which allows
1161 # custom arguments
1162 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1163 args: ['-flto', '-fsanitize=cfi-icall'] )
1164 cfi_flags += '-fsanitize=cfi-icall'
1165 else
1166 error('-fsanitize=cfi-icall is not supported by the compiler')
1167 endif
1168 if cc.compiles('int main () { return 0; }',
1169 name: '-fsanitize-cfi-icall-generalize-pointers',
1170 args: ['-flto', '-fsanitize=cfi-icall',
1171 '-fsanitize-cfi-icall-generalize-pointers'] )
1172 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1173 else
1174 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1175 endif
1176 if get_option('cfi_debug')
1177 if cc.compiles('int main () { return 0; }',
1178 name: '-fno-sanitize-trap=cfi-icall',
1179 args: ['-flto', '-fsanitize=cfi-icall',
1180 '-fno-sanitize-trap=cfi-icall'] )
1181 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1182 else
1183 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1184 endif
1185 endif
Marc-André Lureau5fc06172021-01-14 16:56:02 +04001186 add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1187 add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
Daniele Buono9e62ba42020-12-04 18:06:14 -05001188endif
1189
Joelle van Dyne14176c82021-03-15 11:03:38 -07001190have_host_block_device = (targetos != 'darwin' or
1191 cc.has_header('IOKit/storage/IOMedia.h'))
1192
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001193#################
1194# config-host.h #
1195#################
Paolo Bonzini859aef02020-08-04 18:14:26 +02001196
Paolo Bonzini69202b42020-11-17 14:46:21 +01001197have_virtfs = (targetos == 'linux' and
1198 have_system and
1199 libattr.found() and
1200 libcap_ng.found())
1201
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01001202have_virtfs_proxy_helper = have_virtfs and have_tools
1203
Paolo Bonzini69202b42020-11-17 14:46:21 +01001204if get_option('virtfs').enabled()
1205 if not have_virtfs
1206 if targetos != 'linux'
1207 error('virtio-9p (virtfs) requires Linux')
1208 elif not libcap_ng.found() or not libattr.found()
1209 error('virtio-9p (virtfs) requires libcap-ng-devel and libattr-devel')
1210 elif not have_system
1211 error('virtio-9p (virtfs) needs system emulation support')
1212 endif
1213 endif
1214elif get_option('virtfs').disabled()
1215 have_virtfs = false
1216endif
1217
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001218config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1219config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1220config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1221config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1222config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
1223config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
1224config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1225config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1226config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1227config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1228config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1229config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1230
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001231config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001232config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04001233config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001234config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001235config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001236config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1237config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001238config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08001239config_host_data.set('CONFIG_CURSES', curses.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001240config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1241if glusterfs.found()
1242 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1243 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1244 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1245 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1246 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1247 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1248endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001249config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02001250config_host_data.set('CONFIG_VTE', vte.found())
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001251config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001252config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001253config_host_data.set('CONFIG_EBPF', libbpf.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001254config_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001255config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01001256config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001257config_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found())
1258config_host_data.set('CONFIG_LIBPMEM', libpmem.found())
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001259config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001260config_host_data.set('CONFIG_SDL', sdl.found())
1261config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01001262config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01001263config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzini90540f32021-06-03 11:15:26 +02001264config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001265config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001266config_host_data.set('CONFIG_VNC', vnc.found())
1267config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1268config_host_data.set('CONFIG_VNC_PNG', png.found())
1269config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01001270config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Paolo Bonzini63a7f852021-07-08 13:50:06 +02001271config_host_data.set('CONFIG_VTE', vte.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001272config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001273config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04001274config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02001275config_host_data.set('CONFIG_GNUTLS', gnutls.found())
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01001276config_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found())
Paolo Bonzini57612512021-06-03 11:15:26 +02001277config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
1278config_host_data.set('CONFIG_NETTLE', nettle.found())
1279config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04001280config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01001281config_host_data.set('CONFIG_STATX', has_statx)
Paolo Bonzinib1def332020-11-17 13:37:39 +01001282config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01001283config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01001284config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01001285config_host_data.set('CONFIG_X11', x11.found())
Daniele Buono9e62ba42020-12-04 18:06:14 -05001286config_host_data.set('CONFIG_CFI', get_option('cfi'))
Paolo Bonzini859aef02020-08-04 18:14:26 +02001287config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1288config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1289config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1290config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1291
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001292config_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device)
1293
1294# has_header
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001295config_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02001296config_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h'))
1297config_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h'))
Thomas Huth48f670e2020-11-18 18:10:52 +01001298config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001299config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001300config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001301config_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001302config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001303config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001304
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001305# has_function
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001306config_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001307config_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime'))
1308config_host_data.set('CONFIG_DUP3', cc.has_function('dup3'))
1309config_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate'))
1310config_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001311config_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001312config_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001313config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001314config_host_data.set('CONFIG_SEM_TIMEDWAIT', cc.has_function('sem_timedwait', dependencies: threads))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001315config_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile'))
1316config_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare'))
1317config_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs'))
1318config_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range'))
1319config_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001320config_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001321config_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001322config_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul'))
Paolo Bonzini69d8de72021-06-03 11:56:11 +02001323config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001324
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001325# has_header_symbol
1326config_host_data.set('CONFIG_BYTESWAP_H',
1327 cc.has_header_symbol('byteswap.h', 'bswap_32'))
1328config_host_data.set('CONFIG_EPOLL_CREATE1',
1329 cc.has_header_symbol('sys/epoll.h', 'epoll_create1'))
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02001330config_host_data.set('CONFIG_HAS_ENVIRON',
1331 cc.has_header_symbol('unistd.h', 'environ', prefix: gnu_source_prefix))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001332config_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE',
1333 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and
1334 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE'))
1335config_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE',
1336 cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE'))
1337config_host_data.set('CONFIG_FIEMAP',
1338 cc.has_header('linux/fiemap.h') and
1339 cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001340config_host_data.set('CONFIG_GETRANDOM',
1341 cc.has_function('getrandom') and
1342 cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK'))
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001343config_host_data.set('CONFIG_INOTIFY',
1344 cc.has_header_symbol('sys/inotify.h', 'inotify_init'))
1345config_host_data.set('CONFIG_INOTIFY1',
1346 cc.has_header_symbol('sys/inotify.h', 'inotify_init1'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001347config_host_data.set('CONFIG_MACHINE_BSWAP_H',
1348 cc.has_header_symbol('machine/bswap.h', 'bswap32',
1349 prefix: '''#include <sys/endian.h>
1350 #include <sys/types.h>'''))
1351config_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK',
1352 cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001353config_host_data.set('CONFIG_RTNETLINK',
1354 cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN'))
1355config_host_data.set('CONFIG_SYSMACROS',
1356 cc.has_header_symbol('sys/sysmacros.h', 'makedev'))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001357config_host_data.set('HAVE_OPTRESET',
1358 cc.has_header_symbol('getopt.h', 'optreset'))
Paolo Bonzinibe7e89f2021-06-03 12:02:00 +02001359config_host_data.set('HAVE_UTMPX',
1360 cc.has_header_symbol('utmpx.h', 'struct utmpx'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001361
1362# has_member
1363config_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID',
1364 cc.has_member('struct sigevent', 'sigev_notify_thread_id',
1365 prefix: '#include <signal.h>'))
Paolo Bonzinied3b3f12021-06-03 12:14:48 +02001366config_host_data.set('HAVE_STRUCT_STAT_ST_ATIM',
1367 cc.has_member('struct stat', 'st_atim',
1368 prefix: '#include <sys/stat.h>'))
Paolo Bonzinie66420a2021-06-03 12:10:05 +02001369
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001370config_host_data.set('CONFIG_EVENTFD', cc.links('''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001371 #include <sys/eventfd.h>
1372 int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001373config_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001374 #include <unistd.h>
1375 int main(void) {
1376 #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
1377 return fdatasync(0);
1378 #else
1379 #error Not supported
1380 #endif
1381 }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001382config_host_data.set('CONFIG_MADVISE', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001383 #include <sys/types.h>
1384 #include <sys/mman.h>
1385 #include <stddef.h>
1386 int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001387config_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001388 #include <sys/mman.h>
1389 int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001390config_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + '''
Paolo Bonzinid47a8b32021-06-03 12:02:00 +02001391 #include <fcntl.h>
1392 #if !defined(AT_EMPTY_PATH)
1393 # error missing definition
1394 #else
1395 int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); }
1396 #endif'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001397config_host_data.set('CONFIG_PIPE2', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001398 #include <unistd.h>
1399 #include <fcntl.h>
1400
1401 int main(void)
1402 {
1403 int pipefd[2];
1404 return pipe2(pipefd, O_CLOEXEC);
1405 }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001406config_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001407 #include <sys/mman.h>
1408 #include <stddef.h>
1409 int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001410config_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + '''
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001411 #include <unistd.h>
1412 #include <sys/syscall.h>
1413 #include <signal.h>
1414 int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }'''))
Paolo Bonzini904ad5e2021-07-07 16:35:26 +02001415config_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + '''
Paolo Bonzinia620fbe2021-06-03 13:04:47 +02001416 #include <unistd.h>
1417 #include <fcntl.h>
1418 #include <limits.h>
1419
1420 int main(void)
1421 {
1422 int len, fd = 0;
1423 len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
1424 splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
1425 return 0;
1426 }'''))
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001427
Paolo Bonzinie46bd552021-06-03 11:57:04 +02001428# Some versions of Mac OS X incorrectly define SIZE_MAX
1429config_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles('''
1430 #include <stdint.h>
1431 #include <stdio.h>
1432 int main(int argc, char *argv[]) {
1433 return printf("%zu", SIZE_MAX);
1434 }''', args: ['-Werror']))
1435
1436
Paolo Bonzini765686d2020-09-18 06:37:21 -04001437ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
Paolo Bonzini859aef02020-08-04 18:14:26 +02001438arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001439strings = ['HOST_DSOSUF', 'CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001440foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -04001441 if ignored.contains(k)
1442 # do nothing
1443 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001444 if v != ''
1445 v = '"' + '", "'.join(v.split()) + '", '
1446 endif
1447 config_host_data.set(k, v)
1448 elif k == 'ARCH'
1449 config_host_data.set('HOST_' + v.to_upper(), 1)
1450 elif strings.contains(k)
1451 if not k.startswith('CONFIG_')
1452 k = 'CONFIG_' + k.to_upper()
1453 endif
1454 config_host_data.set_quoted(k, v)
1455 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
1456 config_host_data.set(k, v == 'y' ? 1 : v)
1457 endif
1458endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02001459
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001460########################
1461# Target configuration #
1462########################
1463
Paolo Bonzini2becc362020-02-03 11:42:03 +01001464minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04001465config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001466config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001467config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001468config_devices_mak_list = []
1469config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02001470config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001471config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001472
1473disassemblers = {
1474 'alpha' : ['CONFIG_ALPHA_DIS'],
1475 'arm' : ['CONFIG_ARM_DIS'],
1476 'avr' : ['CONFIG_AVR_DIS'],
1477 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06001478 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001479 'hppa' : ['CONFIG_HPPA_DIS'],
1480 'i386' : ['CONFIG_I386_DIS'],
1481 'x86_64' : ['CONFIG_I386_DIS'],
1482 'x32' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001483 'm68k' : ['CONFIG_M68K_DIS'],
1484 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1485 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001486 'nios2' : ['CONFIG_NIOS2_DIS'],
1487 'or1k' : ['CONFIG_OPENRISC_DIS'],
1488 'ppc' : ['CONFIG_PPC_DIS'],
1489 'riscv' : ['CONFIG_RISCV_DIS'],
1490 'rx' : ['CONFIG_RX_DIS'],
1491 's390' : ['CONFIG_S390_DIS'],
1492 'sh4' : ['CONFIG_SH4_DIS'],
1493 'sparc' : ['CONFIG_SPARC_DIS'],
1494 'xtensa' : ['CONFIG_XTENSA_DIS'],
1495}
1496if link_language == 'cpp'
1497 disassemblers += {
1498 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1499 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1500 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1501 }
1502endif
1503
Paolo Bonzinie1fbd2c2021-06-03 12:02:00 +02001504have_ivshmem = config_host_data.get('CONFIG_EVENTFD')
Paolo Bonzini0a189112020-11-17 14:58:32 +01001505host_kconfig = \
1506 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
1507 ('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
Paolo Bonziniccd250a2021-06-03 12:50:17 +02001508 (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001509 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01001510 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001511 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1512 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1513 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01001514 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001515 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman3090de62021-01-29 11:46:05 -05001516 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : []) + \
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01001517 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01001518
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001519ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001520
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001521default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1522actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001523fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001524foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04001525 config_target = { 'TARGET_NAME': target.split('-')[0] }
1526 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001527 if targetos != 'linux'
1528 if default_targets
1529 continue
1530 endif
1531 error('Target @0@ is only available on a Linux host'.format(target))
1532 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001533 config_target += { 'CONFIG_LINUX_USER': 'y' }
1534 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001535 if 'CONFIG_BSD' not in config_host
1536 if default_targets
1537 continue
1538 endif
1539 error('Target @0@ is only available on a BSD host'.format(target))
1540 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001541 config_target += { 'CONFIG_BSD_USER': 'y' }
1542 elif target.endswith('softmmu')
1543 config_target += { 'CONFIG_SOFTMMU': 'y' }
1544 endif
1545 if target.endswith('-user')
1546 config_target += {
1547 'CONFIG_USER_ONLY': 'y',
1548 'CONFIG_QEMU_INTERP_PREFIX':
1549 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1550 }
1551 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001552
Paolo Bonzini0a189112020-11-17 14:58:32 +01001553 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04001554 foreach sym: accelerators
1555 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1556 config_target += { sym: 'y' }
1557 config_all += { sym: 'y' }
Paolo Bonzini23a77b22020-12-14 12:01:45 +01001558 if sym == 'CONFIG_TCG' and tcg_arch == 'tci'
1559 config_target += { 'CONFIG_TCG_INTERPRETER': 'y' }
1560 elif sym == 'CONFIG_XEN' and have_xen_pci_passthrough
Paolo Bonzini8a199802020-09-18 05:37:01 -04001561 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1562 endif
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02001563 if target in modular_tcg
1564 config_target += { 'CONFIG_TCG_MODULAR': 'y' }
1565 else
1566 config_target += { 'CONFIG_TCG_BUILTIN': 'y' }
1567 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01001568 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04001569 endif
1570 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01001571 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001572 if default_targets
1573 continue
1574 endif
1575 error('No accelerator available for target @0@'.format(target))
1576 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001577
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001578 actual_target_dirs += target
Alex Bennée812b31d2021-07-07 14:17:43 +01001579 config_target += keyval.load('configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001580 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001581
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001582 if 'TARGET_NEED_FDT' in config_target
1583 fdt_required += target
1584 endif
1585
Paolo Bonzinifa731682020-09-21 05:19:07 -04001586 # Add default keys
1587 if 'TARGET_BASE_ARCH' not in config_target
1588 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1589 endif
1590 if 'TARGET_ABI_DIR' not in config_target
1591 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1592 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001593
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001594 foreach k, v: disassemblers
1595 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1596 foreach sym: v
1597 config_target += { sym: 'y' }
1598 config_all_disas += { sym: 'y' }
1599 endforeach
1600 endif
1601 endforeach
1602
Paolo Bonzini859aef02020-08-04 18:14:26 +02001603 config_target_data = configuration_data()
1604 foreach k, v: config_target
1605 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1606 # do nothing
1607 elif ignored.contains(k)
1608 # do nothing
1609 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001610 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1611 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001612 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001613 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001614 config_target_data.set_quoted(k, v)
1615 elif v == 'y'
1616 config_target_data.set(k, 1)
1617 else
1618 config_target_data.set(k, v)
1619 endif
1620 endforeach
1621 config_target_h += {target: configure_file(output: target + '-config-target.h',
1622 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001623
1624 if target.endswith('-softmmu')
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01001625 config_input = meson.get_external_property(target, 'default')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001626 config_devices_mak = target + '-config-devices.mak'
1627 config_devices_mak = configure_file(
Alex Bennéed1d5e9e2021-07-07 14:17:44 +01001628 input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001629 output: config_devices_mak,
1630 depfile: config_devices_mak + '.d',
1631 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01001632 command: [minikconf,
1633 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01001634 config_devices_mak, '@DEPFILE@', '@INPUT@',
Philippe Mathieu-Daudéf4063f92021-07-07 14:17:40 +01001635 host_kconfig, accel_kconfig,
1636 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y'])
Paolo Bonzini859aef02020-08-04 18:14:26 +02001637
1638 config_devices_data = configuration_data()
1639 config_devices = keyval.load(config_devices_mak)
1640 foreach k, v: config_devices
1641 config_devices_data.set(k, 1)
1642 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001643 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001644 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1645 configuration: config_devices_data)}
1646 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001647 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001648 endif
1649 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001650endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001651target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001652
Paolo Bonzini2becc362020-02-03 11:42:03 +01001653# This configuration is used to build files that are shared by
1654# multiple binaries, and then extracted out of the "common"
1655# static_library target.
1656#
1657# We do not use all_sources()/all_dependencies(), because it would
1658# build literally all source files, including devices only used by
1659# targets that are not built for this compilation. The CONFIG_ALL
1660# pseudo symbol replaces it.
1661
Paolo Bonzini05512f52020-09-16 15:31:11 -04001662config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001663config_all += config_host
1664config_all += config_all_disas
1665config_all += {
1666 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1667 'CONFIG_SOFTMMU': have_system,
1668 'CONFIG_USER_ONLY': have_user,
1669 'CONFIG_ALL': true,
1670}
1671
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001672##############
1673# Submodules #
1674##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001675
1676capstone = not_found
1677capstone_opt = get_option('capstone')
1678if capstone_opt in ['enabled', 'auto', 'system']
1679 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07001680 capstone = dependency('capstone', version: '>=4.0',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001681 kwargs: static_kwargs, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001682 required: capstone_opt == 'system' or
1683 capstone_opt == 'enabled' and not have_internal)
1684 if capstone.found()
1685 capstone_opt = 'system'
1686 elif have_internal
1687 capstone_opt = 'internal'
1688 else
1689 capstone_opt = 'disabled'
1690 endif
1691endif
1692if capstone_opt == 'internal'
1693 capstone_data = configuration_data()
1694 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1695
1696 capstone_files = files(
1697 'capstone/cs.c',
1698 'capstone/MCInst.c',
1699 'capstone/MCInstrDesc.c',
1700 'capstone/MCRegisterInfo.c',
1701 'capstone/SStream.c',
1702 'capstone/utils.c'
1703 )
1704
1705 if 'CONFIG_ARM_DIS' in config_all_disas
1706 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1707 capstone_files += files(
1708 'capstone/arch/ARM/ARMDisassembler.c',
1709 'capstone/arch/ARM/ARMInstPrinter.c',
1710 'capstone/arch/ARM/ARMMapping.c',
1711 'capstone/arch/ARM/ARMModule.c'
1712 )
1713 endif
1714
1715 # FIXME: This config entry currently depends on a c++ compiler.
1716 # Which is needed for building libvixl, but not for capstone.
1717 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1718 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1719 capstone_files += files(
1720 'capstone/arch/AArch64/AArch64BaseInfo.c',
1721 'capstone/arch/AArch64/AArch64Disassembler.c',
1722 'capstone/arch/AArch64/AArch64InstPrinter.c',
1723 'capstone/arch/AArch64/AArch64Mapping.c',
1724 'capstone/arch/AArch64/AArch64Module.c'
1725 )
1726 endif
1727
1728 if 'CONFIG_PPC_DIS' in config_all_disas
1729 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1730 capstone_files += files(
1731 'capstone/arch/PowerPC/PPCDisassembler.c',
1732 'capstone/arch/PowerPC/PPCInstPrinter.c',
1733 'capstone/arch/PowerPC/PPCMapping.c',
1734 'capstone/arch/PowerPC/PPCModule.c'
1735 )
1736 endif
1737
Richard Henderson3d562842020-01-04 07:24:59 +10001738 if 'CONFIG_S390_DIS' in config_all_disas
1739 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1740 capstone_files += files(
1741 'capstone/arch/SystemZ/SystemZDisassembler.c',
1742 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1743 'capstone/arch/SystemZ/SystemZMapping.c',
1744 'capstone/arch/SystemZ/SystemZModule.c',
1745 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1746 )
1747 endif
1748
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001749 if 'CONFIG_I386_DIS' in config_all_disas
1750 capstone_data.set('CAPSTONE_HAS_X86', 1)
1751 capstone_files += files(
1752 'capstone/arch/X86/X86Disassembler.c',
1753 'capstone/arch/X86/X86DisassemblerDecoder.c',
1754 'capstone/arch/X86/X86ATTInstPrinter.c',
1755 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07001756 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001757 'capstone/arch/X86/X86Mapping.c',
1758 'capstone/arch/X86/X86Module.c'
1759 )
1760 endif
1761
1762 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1763
1764 capstone_cargs = [
1765 # FIXME: There does not seem to be a way to completely replace the c_args
1766 # that come from add_project_arguments() -- we can only add to them.
1767 # So: disable all warnings with a big hammer.
1768 '-Wno-error', '-w',
1769
1770 # Include all configuration defines via a header file, which will wind up
1771 # as a dependency on the object file, and thus changes here will result
1772 # in a rebuild.
1773 '-include', 'capstone-defs.h'
1774 ]
1775
1776 libcapstone = static_library('capstone',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001777 build_by_default: false,
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001778 sources: capstone_files,
1779 c_args: capstone_cargs,
1780 include_directories: 'capstone/include')
1781 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07001782 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001783endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001784
1785slirp = not_found
1786slirp_opt = 'disabled'
1787if have_system
1788 slirp_opt = get_option('slirp')
1789 if slirp_opt in ['enabled', 'auto', 'system']
1790 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001791 slirp = dependency('slirp', kwargs: static_kwargs,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001792 method: 'pkg-config',
1793 required: slirp_opt == 'system' or
1794 slirp_opt == 'enabled' and not have_internal)
1795 if slirp.found()
1796 slirp_opt = 'system'
1797 elif have_internal
1798 slirp_opt = 'internal'
1799 else
1800 slirp_opt = 'disabled'
1801 endif
1802 endif
1803 if slirp_opt == 'internal'
1804 slirp_deps = []
1805 if targetos == 'windows'
1806 slirp_deps = cc.find_library('iphlpapi')
1807 endif
1808 slirp_conf = configuration_data()
1809 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1810 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1811 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1812 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1813 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1814 slirp_files = [
1815 'slirp/src/arp_table.c',
1816 'slirp/src/bootp.c',
1817 'slirp/src/cksum.c',
1818 'slirp/src/dhcpv6.c',
1819 'slirp/src/dnssearch.c',
1820 'slirp/src/if.c',
1821 'slirp/src/ip6_icmp.c',
1822 'slirp/src/ip6_input.c',
1823 'slirp/src/ip6_output.c',
1824 'slirp/src/ip_icmp.c',
1825 'slirp/src/ip_input.c',
1826 'slirp/src/ip_output.c',
1827 'slirp/src/mbuf.c',
1828 'slirp/src/misc.c',
1829 'slirp/src/ncsi.c',
1830 'slirp/src/ndp_table.c',
1831 'slirp/src/sbuf.c',
1832 'slirp/src/slirp.c',
1833 'slirp/src/socket.c',
1834 'slirp/src/state.c',
1835 'slirp/src/stream.c',
1836 'slirp/src/tcp_input.c',
1837 'slirp/src/tcp_output.c',
1838 'slirp/src/tcp_subr.c',
1839 'slirp/src/tcp_timer.c',
1840 'slirp/src/tftp.c',
1841 'slirp/src/udp.c',
1842 'slirp/src/udp6.c',
1843 'slirp/src/util.c',
1844 'slirp/src/version.c',
1845 'slirp/src/vmstate.c',
1846 ]
1847
1848 configure_file(
1849 input : 'slirp/src/libslirp-version.h.in',
1850 output : 'libslirp-version.h',
1851 configuration: slirp_conf)
1852
1853 slirp_inc = include_directories('slirp', 'slirp/src')
1854 libslirp = static_library('slirp',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001855 build_by_default: false,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001856 sources: slirp_files,
1857 c_args: slirp_cargs,
1858 include_directories: slirp_inc)
1859 slirp = declare_dependency(link_with: libslirp,
1860 dependencies: slirp_deps,
1861 include_directories: slirp_inc)
1862 endif
1863endif
1864
Daniele Buonoc7153432021-03-03 21:59:38 -05001865# For CFI, we need to compile slirp as a static library together with qemu.
1866# This is because we register slirp functions as callbacks for QEMU Timers.
1867# When using a system-wide shared libslirp, the type information for the
1868# callback is missing and the timer call produces a false positive with CFI.
1869#
1870# Now that slirp_opt has been defined, check if the selected slirp is compatible
1871# with control-flow integrity.
1872if get_option('cfi') and slirp_opt == 'system'
1873 error('Control-Flow Integrity is not compatible with system-wide slirp.' \
1874 + ' Please configure with --enable-slirp=git')
1875endif
1876
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001877fdt = not_found
1878fdt_opt = get_option('fdt')
1879if have_system
1880 if fdt_opt in ['enabled', 'auto', 'system']
1881 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001882 fdt = cc.find_library('fdt', kwargs: static_kwargs,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001883 required: fdt_opt == 'system' or
1884 fdt_opt == 'enabled' and not have_internal)
1885 if fdt.found() and cc.links('''
1886 #include <libfdt.h>
1887 #include <libfdt_env.h>
1888 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1889 dependencies: fdt)
1890 fdt_opt = 'system'
1891 elif have_internal
1892 fdt_opt = 'internal'
1893 else
1894 fdt_opt = 'disabled'
1895 endif
1896 endif
1897 if fdt_opt == 'internal'
1898 fdt_files = files(
1899 'dtc/libfdt/fdt.c',
1900 'dtc/libfdt/fdt_ro.c',
1901 'dtc/libfdt/fdt_wip.c',
1902 'dtc/libfdt/fdt_sw.c',
1903 'dtc/libfdt/fdt_rw.c',
1904 'dtc/libfdt/fdt_strerror.c',
1905 'dtc/libfdt/fdt_empty_tree.c',
1906 'dtc/libfdt/fdt_addresses.c',
1907 'dtc/libfdt/fdt_overlay.c',
1908 'dtc/libfdt/fdt_check.c',
1909 )
1910
1911 fdt_inc = include_directories('dtc/libfdt')
1912 libfdt = static_library('fdt',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001913 build_by_default: false,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001914 sources: fdt_files,
1915 include_directories: fdt_inc)
1916 fdt = declare_dependency(link_with: libfdt,
1917 include_directories: fdt_inc)
1918 endif
1919endif
1920if not fdt.found() and fdt_required.length() > 0
1921 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1922endif
1923
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001924config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001925config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001926config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001927
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001928#####################
1929# Generated sources #
1930#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001931
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001932genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001933
Marc-André Lureau3f885652019-07-15 18:06:04 +04001934hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04001935shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001936qapi_gen = find_program('scripts/qapi-gen.py')
1937qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1938 meson.source_root() / 'scripts/qapi/commands.py',
1939 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001940 meson.source_root() / 'scripts/qapi/error.py',
1941 meson.source_root() / 'scripts/qapi/events.py',
1942 meson.source_root() / 'scripts/qapi/expr.py',
1943 meson.source_root() / 'scripts/qapi/gen.py',
1944 meson.source_root() / 'scripts/qapi/introspect.py',
1945 meson.source_root() / 'scripts/qapi/parser.py',
1946 meson.source_root() / 'scripts/qapi/schema.py',
1947 meson.source_root() / 'scripts/qapi/source.py',
1948 meson.source_root() / 'scripts/qapi/types.py',
1949 meson.source_root() / 'scripts/qapi/visit.py',
1950 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001951 meson.source_root() / 'scripts/qapi-gen.py'
1952]
1953
1954tracetool = [
1955 python, files('scripts/tracetool.py'),
1956 '--backend=' + config_host['TRACE_BACKENDS']
1957]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00001958tracetool_depends = files(
1959 'scripts/tracetool/backend/log.py',
1960 'scripts/tracetool/backend/__init__.py',
1961 'scripts/tracetool/backend/dtrace.py',
1962 'scripts/tracetool/backend/ftrace.py',
1963 'scripts/tracetool/backend/simple.py',
1964 'scripts/tracetool/backend/syslog.py',
1965 'scripts/tracetool/backend/ust.py',
1966 'scripts/tracetool/format/tcg_h.py',
1967 'scripts/tracetool/format/ust_events_c.py',
1968 'scripts/tracetool/format/ust_events_h.py',
1969 'scripts/tracetool/format/__init__.py',
1970 'scripts/tracetool/format/d.py',
1971 'scripts/tracetool/format/tcg_helper_c.py',
1972 'scripts/tracetool/format/simpletrace_stap.py',
1973 'scripts/tracetool/format/c.py',
1974 'scripts/tracetool/format/h.py',
1975 'scripts/tracetool/format/tcg_helper_h.py',
1976 'scripts/tracetool/format/log_stap.py',
1977 'scripts/tracetool/format/stap.py',
1978 'scripts/tracetool/format/tcg_helper_wrapper_h.py',
1979 'scripts/tracetool/__init__.py',
1980 'scripts/tracetool/transform.py',
1981 'scripts/tracetool/vcpu.py'
1982)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001983
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001984qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1985 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02001986 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001987qemu_version = custom_target('qemu-version.h',
1988 output: 'qemu-version.h',
1989 command: qemu_version_cmd,
1990 capture: true,
1991 build_by_default: true,
1992 build_always_stale: true)
1993genh += qemu_version
1994
Marc-André Lureau3f885652019-07-15 18:06:04 +04001995hxdep = []
1996hx_headers = [
1997 ['qemu-options.hx', 'qemu-options.def'],
1998 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1999]
2000if have_system
2001 hx_headers += [
2002 ['hmp-commands.hx', 'hmp-commands.h'],
2003 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
2004 ]
2005endif
2006foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002007 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04002008 input: files(d[0]),
2009 output: d[1],
2010 capture: true,
2011 build_by_default: true, # to be removed when added to a target
2012 command: [hxtool, '-h', '@INPUT0@'])
2013endforeach
2014genh += hxdep
2015
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002016###################
2017# Collect sources #
2018###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002019
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02002020authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002021blockdev_ss = ss.source_set()
2022block_ss = ss.source_set()
2023bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002024chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002025common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002026crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002027io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002028linux_user_ss = ss.source_set()
2029qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02002030qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002031softmmu_ss = ss.source_set()
2032specific_fuzz_ss = ss.source_set()
2033specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002034stub_ss = ss.source_set()
2035trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002036user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02002037util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002038
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002039# accel modules
2040qtest_module_ss = ss.source_set()
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002041tcg_module_ss = ss.source_set()
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002042
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002043modules = {}
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002044target_modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002045hw_arch = {}
2046target_arch = {}
2047target_softmmu_arch = {}
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02002048target_user_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002049
2050###############
2051# Trace files #
2052###############
2053
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002054# TODO: add each directory to the subdirs from its own meson.build, once
2055# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002056trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002057 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01002058 'qapi',
2059 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002060 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01002061 'util',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002062]
2063if have_user
2064 trace_events_subdirs += [ 'linux-user' ]
2065endif
2066if have_block
2067 trace_events_subdirs += [
2068 'authz',
2069 'block',
2070 'io',
2071 'nbd',
2072 'scsi',
2073 ]
2074endif
2075if have_system
2076 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002077 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002078 'audio',
2079 'backends',
2080 'backends/tpm',
2081 'chardev',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002082 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002083 'hw/9pfs',
2084 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08002085 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002086 'hw/alpha',
2087 'hw/arm',
2088 'hw/audio',
2089 'hw/block',
2090 'hw/block/dataplane',
2091 'hw/char',
2092 'hw/display',
2093 'hw/dma',
2094 'hw/hppa',
2095 'hw/hyperv',
2096 'hw/i2c',
2097 'hw/i386',
2098 'hw/i386/xen',
2099 'hw/ide',
2100 'hw/input',
2101 'hw/intc',
2102 'hw/isa',
2103 'hw/mem',
2104 'hw/mips',
2105 'hw/misc',
2106 'hw/misc/macio',
2107 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08002108 'hw/net/can',
Klaus Jensen88eea452021-04-14 22:14:30 +02002109 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002110 'hw/nvram',
2111 'hw/pci',
2112 'hw/pci-host',
2113 'hw/ppc',
2114 'hw/rdma',
2115 'hw/rdma/vmw',
2116 'hw/rtc',
2117 'hw/s390x',
2118 'hw/scsi',
2119 'hw/sd',
2120 'hw/sparc',
2121 'hw/sparc64',
2122 'hw/ssi',
2123 'hw/timer',
2124 'hw/tpm',
2125 'hw/usb',
2126 'hw/vfio',
2127 'hw/virtio',
2128 'hw/watchdog',
2129 'hw/xen',
2130 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002131 'migration',
2132 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02002133 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002134 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05002135 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002136 ]
2137endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002138if have_system or have_user
2139 trace_events_subdirs += [
2140 'accel/tcg',
2141 'hw/core',
2142 'target/arm',
2143 'target/hppa',
2144 'target/i386',
2145 'target/i386/kvm',
Philippe Mathieu-Daudé34b8ff22021-05-30 09:02:16 +02002146 'target/mips/tcg',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002147 'target/ppc',
2148 'target/riscv',
2149 'target/s390x',
Cho, Yu-Chen67043602021-07-07 18:53:23 +08002150 'target/s390x/kvm',
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01002151 'target/sparc',
2152 ]
2153endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002154
Marc-André Lureau0df750e2020-11-25 14:06:37 +04002155vhost_user = not_found
2156if 'CONFIG_VHOST_USER' in config_host
2157 libvhost_user = subproject('libvhost-user')
2158 vhost_user = libvhost_user.get_variable('vhost_user_dep')
2159endif
2160
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002161subdir('qapi')
2162subdir('qobject')
2163subdir('stubs')
2164subdir('trace')
2165subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04002166subdir('qom')
2167subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002168subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04002169subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002170
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002171
2172if enable_modules
2173 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
2174 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
2175endif
2176
Paolo Bonzini2becc362020-02-03 11:42:03 +01002177stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002178
2179util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01002180util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002181libqemuutil = static_library('qemuutil',
2182 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini6d7c7c22021-06-03 15:01:35 +02002183 dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002184qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04002185 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04002186
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01002187if have_system or have_user
2188 decodetree = generator(find_program('scripts/decodetree.py'),
2189 output: 'decode-@BASENAME@.c.inc',
2190 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
2191 subdir('libdecnumber')
2192 subdir('target')
2193endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002194
Paolo Bonzini478e9432020-08-17 12:47:55 +02002195subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04002196subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04002197subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04002198subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04002199subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04002200
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002201if have_block
2202 block_ss.add(files(
2203 'block.c',
2204 'blockjob.c',
2205 'job.c',
2206 'qemu-io-cmds.c',
2207 ))
2208 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002209
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002210 subdir('nbd')
2211 subdir('scsi')
2212 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002213
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002214 blockdev_ss.add(files(
2215 'blockdev.c',
2216 'blockdev-nbd.c',
2217 'iothread.c',
2218 'job-qmp.c',
2219 ), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02002220
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002221 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
2222 # os-win32.c does not
2223 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
2224 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
2225endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02002226
2227common_ss.add(files('cpus-common.c'))
2228
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02002229subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002230
Richard Hendersonf3433462020-09-12 10:47:33 -07002231common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02002232specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002233
Richard Henderson44b99a62021-03-22 12:24:26 +01002234# Work around a gcc bug/misfeature wherein constant propagation looks
2235# through an alias:
2236# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
2237# to guess that a const variable is always zero. Without lto, this is
2238# impossible, as the alias is restricted to page-vary-common.c. Indeed,
2239# without lto, not even the alias is required -- we simply use different
2240# declarations in different compilation units.
2241pagevary = files('page-vary-common.c')
2242if get_option('b_lto')
2243 pagevary_flags = ['-fno-lto']
2244 if get_option('cfi')
2245 pagevary_flags += '-fno-sanitize=cfi-icall'
2246 endif
2247 pagevary = static_library('page-vary-common', sources: pagevary,
2248 c_args: pagevary_flags)
2249 pagevary = declare_dependency(link_with: pagevary)
2250endif
2251common_ss.add(pagevary)
Richard Henderson6670d4d2021-03-22 12:24:24 +01002252specific_ss.add(files('page-vary.c'))
2253
Marc-André Lureauab318052019-07-24 19:23:16 +04002254subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04002255subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04002256subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002257subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04002258subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04002259subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00002260subdir('semihosting')
Marc-André Lureau582ea952019-08-15 15:15:32 +04002261subdir('hw')
Richard Henderson104cc2c2021-03-08 12:04:33 -08002262subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08002263subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04002264subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002265subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04002266subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04002267subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002268subdir('ebpf')
2269
2270common_ss.add(libbpf)
Marc-André Lureau3a304462019-08-18 16:13:08 +04002271
Marc-André Lureaub309c322019-08-18 19:20:37 +04002272bsd_user_ss.add(files('gdbstub.c'))
2273specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
2274
Marc-André Lureau3a304462019-08-18 16:13:08 +04002275linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
2276specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02002277
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002278# needed for fuzzing binaries
2279subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002280subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002281
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002282# accel modules
Gerd Hoffmanndae0ec12021-06-24 12:38:31 +02002283tcg_real_module_ss = ss.source_set()
2284tcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss)
2285specific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss)
2286target_modules += { 'accel' : { 'qtest': qtest_module_ss,
2287 'tcg': tcg_real_module_ss }}
Gerd Hoffmannc94a7b82021-06-24 12:38:29 +02002288
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002289########################
2290# Library dependencies #
2291########################
2292
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002293modinfo_collect = find_program('scripts/modinfo-collect.py')
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02002294modinfo_generate = find_program('scripts/modinfo-generate.py')
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002295modinfo_files = []
2296
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002297block_mods = []
2298softmmu_mods = []
2299foreach d, list : modules
2300 foreach m, module_ss : list
2301 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02002302 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002303 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
2304 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
2305 if d == 'block'
2306 block_mods += sl
2307 else
2308 softmmu_mods += sl
2309 endif
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002310 if module_ss.sources() != []
2311 # FIXME: Should use sl.extract_all_objects(recursive: true) as
2312 # input. Sources can be used multiple times but objects are
2313 # unique when it comes to lookup in compile_commands.json.
2314 # Depnds on a mesion version with
2315 # https://github.com/mesonbuild/meson/pull/8900
2316 modinfo_files += custom_target(d + '-' + m + '.modinfo',
2317 output: d + '-' + m + '.modinfo',
2318 input: module_ss.sources(),
2319 capture: true,
Gerd Hoffmannf5723ab2021-06-24 12:38:04 +02002320 command: [modinfo_collect, '@INPUT@'])
2321 endif
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002322 else
2323 if d == 'block'
2324 block_ss.add_all(module_ss)
2325 else
2326 softmmu_ss.add_all(module_ss)
2327 endif
2328 endif
2329 endforeach
2330endforeach
2331
Gerd Hoffmanndb2e89d2021-06-24 12:38:22 +02002332foreach d, list : target_modules
2333 foreach m, module_ss : list
2334 if enable_modules and targetos != 'windows'
2335 foreach target : target_dirs
2336 if target.endswith('-softmmu')
2337 config_target = config_target_mak[target]
2338 config_target += config_host
2339 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2340 c_args = ['-DNEED_CPU_H',
2341 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2342 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
2343 target_module_ss = module_ss.apply(config_target, strict: false)
2344 if target_module_ss.sources() != []
2345 module_name = d + '-' + m + '-' + config_target['TARGET_NAME']
2346 sl = static_library(module_name,
2347 [genh, target_module_ss.sources()],
2348 dependencies: [modulecommon, target_module_ss.dependencies()],
2349 include_directories: target_inc,
2350 c_args: c_args,
2351 pic: true)
2352 softmmu_mods += sl
2353 # FIXME: Should use sl.extract_all_objects(recursive: true) too.
2354 modinfo_files += custom_target(module_name + '.modinfo',
2355 output: module_name + '.modinfo',
2356 input: target_module_ss.sources(),
2357 capture: true,
2358 command: [modinfo_collect, '--target', target, '@INPUT@'])
2359 endif
2360 endif
2361 endforeach
2362 else
2363 specific_ss.add_all(module_ss)
2364 endif
2365 endforeach
2366endforeach
2367
Gerd Hoffmann5ebbfec2021-06-24 12:38:05 +02002368if enable_modules
2369 modinfo_src = custom_target('modinfo.c',
2370 output: 'modinfo.c',
2371 input: modinfo_files,
2372 command: [modinfo_generate, '@INPUT@'],
2373 capture: true)
2374 modinfo_lib = static_library('modinfo', modinfo_src)
2375 modinfo_dep = declare_dependency(link_whole: modinfo_lib)
2376 softmmu_ss.add(modinfo_dep)
2377endif
2378
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002379nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08002380undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002381block_syms = custom_target('block.syms', output: 'block.syms',
2382 input: [libqemuutil, block_mods],
2383 capture: true,
2384 command: [undefsym, nm, '@INPUT@'])
2385qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
2386 input: [libqemuutil, softmmu_mods],
2387 capture: true,
2388 command: [undefsym, nm, '@INPUT@'])
2389
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02002390qom_ss = qom_ss.apply(config_host, strict: false)
2391libqom = static_library('qom', qom_ss.sources() + genh,
2392 dependencies: [qom_ss.dependencies()],
2393 name_suffix: 'fa')
2394
2395qom = declare_dependency(link_whole: libqom)
2396
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02002397authz_ss = authz_ss.apply(config_host, strict: false)
2398libauthz = static_library('authz', authz_ss.sources() + genh,
2399 dependencies: [authz_ss.dependencies()],
2400 name_suffix: 'fa',
2401 build_by_default: false)
2402
2403authz = declare_dependency(link_whole: libauthz,
2404 dependencies: qom)
2405
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002406crypto_ss = crypto_ss.apply(config_host, strict: false)
2407libcrypto = static_library('crypto', crypto_ss.sources() + genh,
2408 dependencies: [crypto_ss.dependencies()],
2409 name_suffix: 'fa',
2410 build_by_default: false)
2411
2412crypto = declare_dependency(link_whole: libcrypto,
2413 dependencies: [authz, qom])
2414
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002415io_ss = io_ss.apply(config_host, strict: false)
2416libio = static_library('io', io_ss.sources() + genh,
2417 dependencies: [io_ss.dependencies()],
2418 link_with: libqemuutil,
2419 name_suffix: 'fa',
2420 build_by_default: false)
2421
2422io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
2423
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02002424libmigration = static_library('migration', sources: migration_files + genh,
2425 name_suffix: 'fa',
2426 build_by_default: false)
2427migration = declare_dependency(link_with: libmigration,
2428 dependencies: [zlib, qom, io])
2429softmmu_ss.add(migration)
2430
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002431block_ss = block_ss.apply(config_host, strict: false)
2432libblock = static_library('block', block_ss.sources() + genh,
2433 dependencies: block_ss.dependencies(),
2434 link_depends: block_syms,
2435 name_suffix: 'fa',
2436 build_by_default: false)
2437
2438block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002439 link_args: '@block.syms',
2440 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002441
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002442blockdev_ss = blockdev_ss.apply(config_host, strict: false)
2443libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
2444 dependencies: blockdev_ss.dependencies(),
2445 name_suffix: 'fa',
2446 build_by_default: false)
2447
2448blockdev = declare_dependency(link_whole: [libblockdev],
2449 dependencies: [block])
2450
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002451qmp_ss = qmp_ss.apply(config_host, strict: false)
2452libqmp = static_library('qmp', qmp_ss.sources() + genh,
2453 dependencies: qmp_ss.dependencies(),
2454 name_suffix: 'fa',
2455 build_by_default: false)
2456
2457qmp = declare_dependency(link_whole: [libqmp])
2458
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002459libchardev = static_library('chardev', chardev_ss.sources() + genh,
2460 name_suffix: 'fa',
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002461 dependencies: [gnutls],
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002462 build_by_default: false)
2463
2464chardev = declare_dependency(link_whole: libchardev)
2465
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02002466libhwcore = static_library('hwcore', sources: hwcore_files + genh,
2467 name_suffix: 'fa',
2468 build_by_default: false)
2469hwcore = declare_dependency(link_whole: libhwcore)
2470common_ss.add(hwcore)
2471
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02002472###########
2473# Targets #
2474###########
2475
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002476foreach m : block_mods + softmmu_mods
2477 shared_module(m.name(),
2478 name_prefix: '',
2479 link_whole: m,
2480 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002481 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002482endforeach
2483
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002484softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002485common_ss.add(qom, qemuutil)
2486
2487common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01002488common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
2489
2490common_all = common_ss.apply(config_all, strict: false)
2491common_all = static_library('common',
2492 build_by_default: false,
2493 sources: common_all.sources() + genh,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09002494 implicit_include_directories: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002495 dependencies: common_all.dependencies(),
2496 name_suffix: 'fa')
2497
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002498feature_to_c = find_program('scripts/feature_to_c.sh')
2499
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002500emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002501foreach target : target_dirs
2502 config_target = config_target_mak[target]
2503 target_name = config_target['TARGET_NAME']
2504 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02002505 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002506 arch_deps = []
2507 c_args = ['-DNEED_CPU_H',
2508 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2509 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04002510 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01002511
Paolo Bonzini859aef02020-08-04 18:14:26 +02002512 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01002513 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2514 if targetos == 'linux'
2515 target_inc += include_directories('linux-headers', is_system: true)
2516 endif
2517 if target.endswith('-softmmu')
2518 qemu_target_name = 'qemu-system-' + target_name
2519 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002520 t = target_softmmu_arch[arch].apply(config_target, strict: false)
2521 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002522 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002523
Marc-André Lureau2c442202019-08-17 13:55:58 +04002524 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
2525 hw = hw_arch[hw_dir].apply(config_target, strict: false)
2526 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002527 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04002528
Paolo Bonzini2becc362020-02-03 11:42:03 +01002529 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002530 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002531 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04002532 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002533 target_type='user'
2534 qemu_target_name = 'qemu-' + target_name
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02002535 if arch in target_user_arch
2536 t = target_user_arch[arch].apply(config_target, strict: false)
2537 arch_srcs += t.sources()
2538 arch_deps += t.dependencies()
2539 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002540 if 'CONFIG_LINUX_USER' in config_target
2541 base_dir = 'linux-user'
2542 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
2543 else
2544 base_dir = 'bsd-user'
Stacey Sonea1ab4c2020-12-18 13:54:50 -07002545 target_inc += include_directories('bsd-user/freebsd')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002546 endif
2547 target_inc += include_directories(
2548 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04002549 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002550 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04002551 if 'CONFIG_LINUX_USER' in config_target
2552 dir = base_dir / abi
2553 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
2554 if config_target.has_key('TARGET_SYSTBL_ABI')
2555 arch_srcs += \
2556 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
2557 extra_args : config_target['TARGET_SYSTBL_ABI'])
2558 endif
2559 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002560 endif
2561
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002562 if 'TARGET_XML_FILES' in config_target
2563 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
2564 output: target + '-gdbstub-xml.c',
2565 input: files(config_target['TARGET_XML_FILES'].split()),
2566 command: [feature_to_c, '@INPUT@'],
2567 capture: true)
2568 arch_srcs += gdbstub_xml
2569 endif
2570
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002571 t = target_arch[arch].apply(config_target, strict: false)
2572 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002573 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002574
Paolo Bonzini2becc362020-02-03 11:42:03 +01002575 target_common = common_ss.apply(config_target, strict: false)
2576 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002577 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002578
Paolo Bonzini2becc362020-02-03 11:42:03 +01002579 target_specific = specific_ss.apply(config_target, strict: false)
2580 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002581 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002582
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002583 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02002584 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002585 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002586 objects: objects,
2587 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002588 c_args: c_args,
2589 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002590 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002591
2592 if target.endswith('-softmmu')
2593 execs = [{
2594 'name': 'qemu-system-' + target_name,
2595 'gui': false,
2596 'sources': files('softmmu/main.c'),
2597 'dependencies': []
2598 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002599 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002600 execs += [{
2601 'name': 'qemu-system-' + target_name + 'w',
2602 'gui': true,
2603 'sources': files('softmmu/main.c'),
2604 'dependencies': []
2605 }]
2606 endif
2607 if config_host.has_key('CONFIG_FUZZ')
2608 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
2609 execs += [{
2610 'name': 'qemu-fuzz-' + target_name,
2611 'gui': false,
2612 'sources': specific_fuzz.sources(),
2613 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002614 }]
2615 endif
2616 else
2617 execs = [{
2618 'name': 'qemu-' + target_name,
2619 'gui': false,
2620 'sources': [],
2621 'dependencies': []
2622 }]
2623 endif
2624 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01002625 exe_name = exe['name']
John Arbuckle3983a762021-07-05 15:53:28 -04002626 if targetos == 'darwin'
Alexander Graf8a74ce62021-01-20 23:44:34 +01002627 exe_name += '-unsigned'
2628 endif
2629
2630 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09002631 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002632 c_args: c_args,
2633 dependencies: arch_deps + deps + exe['dependencies'],
2634 objects: lib.extract_all_objects(recursive: true),
2635 link_language: link_language,
2636 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
2637 link_args: link_args,
2638 gui_app: exe['gui'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01002639
John Arbuckle3983a762021-07-05 15:53:28 -04002640 if targetos == 'darwin'
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09002641 icon = 'pc-bios/qemu.rsrc'
2642 build_input = [emulator, files(icon)]
2643 install_input = [
2644 get_option('bindir') / exe_name,
2645 meson.current_source_dir() / icon
2646 ]
2647 if 'CONFIG_HVF' in config_target
2648 entitlements = 'accel/hvf/entitlements.plist'
2649 build_input += files(entitlements)
2650 install_input += meson.current_source_dir() / entitlements
2651 endif
2652
Alexander Graf8a74ce62021-01-20 23:44:34 +01002653 emulators += {exe['name'] : custom_target(exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09002654 input: build_input,
Alexander Graf8a74ce62021-01-20 23:44:34 +01002655 output: exe['name'],
2656 command: [
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09002657 files('scripts/entitlement.sh'),
2658 '@OUTPUT@',
2659 '@INPUT@'
Alexander Graf8a74ce62021-01-20 23:44:34 +01002660 ])
2661 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09002662
2663 meson.add_install_script('scripts/entitlement.sh', '--install',
Akihiko Odaki237377a2021-02-25 09:06:14 +09002664 get_option('bindir') / exe['name'],
Akihiko Odaki411ad8d2021-07-09 10:25:33 +09002665 install_input)
Alexander Graf8a74ce62021-01-20 23:44:34 +01002666 else
2667 emulators += {exe['name']: emulator}
2668 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002669
2670 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
2671 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002672 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
2673 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002674 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
2675 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
2676 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002677 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002678 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002679 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002680 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002681 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002682 command: [
2683 tracetool, '--group=all', '--format=' + stp['fmt'],
2684 '--binary=' + stp['bin'],
2685 '--target-name=' + target_name,
2686 '--target-type=' + target_type,
2687 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01002688 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002689 ],
2690 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002691 endforeach
2692 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002693 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002694endforeach
2695
Paolo Bonzini931049b2020-02-05 09:44:24 +01002696# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002697
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002698if 'CONFIG_PLUGIN' in config_host
2699 install_headers('include/qemu/qemu-plugin.h')
2700endif
2701
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002702if 'CONFIG_GUEST_AGENT' in config_host
2703 subdir('qga')
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002704elif get_option('guest_agent_msi').enabled()
2705 error('Guest agent MSI requested, but the guest agent is not being built')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002706endif
2707
Laurent Vivier9755c942020-08-24 17:24:30 +02002708# Don't build qemu-keymap if xkbcommon is not explicitly enabled
2709# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002710if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04002711 # used for the update-keymaps target, so include rules even if !have_tools
2712 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
2713 dependencies: [qemuutil, xkbcommon], install: have_tools)
2714endif
2715
Paolo Bonzini931049b2020-02-05 09:44:24 +01002716if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002717 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
2718 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
2719 qemu_io = executable('qemu-io', files('qemu-io.c'),
2720 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01002721 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002722 dependencies: [blockdev, qemuutil, gnutls], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002723
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02002724 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002725 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04002726 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002727
Marc-André Lureau157e7b12019-07-15 14:50:58 +04002728 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
2729 dependencies: qemuutil,
2730 install: true)
2731
Paolo Bonzini931049b2020-02-05 09:44:24 +01002732 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02002733 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002734 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04002735 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02002736 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01002737 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002738
2739 if targetos == 'linux'
2740 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2741 dependencies: [qemuutil, libcap_ng],
2742 install: true,
2743 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002744
2745 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2746 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002747 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002748 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002749 endif
2750
Paolo Bonziniccd250a2021-06-03 12:50:17 +02002751 if have_ivshmem
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04002752 subdir('contrib/ivshmem-client')
2753 subdir('contrib/ivshmem-server')
2754 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01002755endif
2756
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04002757subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002758subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04002759subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02002760subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08002761subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01002762if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04002763 subdir('po')
2764endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002765
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002766if host_machine.system() == 'windows'
2767 nsis_cmd = [
2768 find_program('scripts/nsis.py'),
2769 '@OUTPUT@',
2770 get_option('prefix'),
2771 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01002772 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002773 '--',
2774 '-DDISPLAYVERSION=' + meson.project_version(),
2775 ]
2776 if build_docs
2777 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2778 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002779 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002780 nsis_cmd += '-DCONFIG_GTK=y'
2781 endif
2782
2783 nsis = custom_target('nsis',
2784 output: 'qemu-setup-' + meson.project_version() + '.exe',
2785 input: files('qemu.nsi'),
2786 build_always_stale: true,
2787 command: nsis_cmd + ['@INPUT@'])
2788 alias_target('installer', nsis)
2789endif
2790
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002791#########################
2792# Configuration summary #
2793#########################
2794
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002795# Directories
Paolo Bonzinif9332752020-02-03 13:28:38 +01002796summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002797summary_info += {'Install prefix': get_option('prefix')}
2798summary_info += {'BIOS directory': qemu_datadir}
2799summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2800summary_info += {'binary directory': get_option('bindir')}
2801summary_info += {'library directory': get_option('libdir')}
2802summary_info += {'module directory': qemu_moddir}
2803summary_info += {'libexec directory': get_option('libexecdir')}
2804summary_info += {'include directory': get_option('includedir')}
2805summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002806if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002807 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04002808 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002809else
2810 summary_info += {'local state directory': 'queried at runtime'}
2811endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04002812summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002813summary_info += {'Build directory': meson.current_build_dir()}
2814summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002815summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002816summary(summary_info, bool_yn: true, section: 'Directories')
2817
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002818# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002819summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002820summary_info += {'git': config_host['GIT']}
2821summary_info += {'make': config_host['MAKE']}
2822summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
2823summary_info += {'sphinx-build': sphinx_build.found()}
2824if config_host.has_key('HAVE_GDB_BIN')
2825 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2826endif
2827summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2828if targetos == 'windows' and config_host.has_key('CONFIG_GUEST_AGENT')
2829 summary_info += {'wixl': wixl.found() ? wixl.full_path() : false}
2830endif
Joelle van Dyneb8e0c492021-03-15 11:03:41 -07002831if slirp_opt != 'disabled' and 'CONFIG_SLIRP_SMBD' in config_host
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002832 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2833endif
2834summary(summary_info, bool_yn: true, section: 'Host binaries')
2835
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01002836# Configurable features
2837summary_info = {}
2838summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002839summary_info += {'system-mode emulation': have_system}
2840summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002841summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01002842summary_info += {'Install blobs': get_option('install_blobs')}
2843summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2844if config_host.has_key('CONFIG_MODULES')
2845 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2846endif
2847summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2848summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2849if have_system
2850 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2851endif
2852summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2853if config_host['TRACE_BACKENDS'].split().contains('simple')
2854 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2855endif
2856summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2857summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
2858summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2859summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2860summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2861summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
2862summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
2863summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
2864summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2865summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2866summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2867summary(summary_info, bool_yn: true, section: 'Configurable features')
2868
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002869# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002870summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002871summary_info += {'host CPU': cpu}
2872summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01002873summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
2874summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002875if link_language == 'cpp'
Alex Bennée63de9352021-05-27 17:03:15 +01002876 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002877else
2878 summary_info += {'C++ compiler': false}
2879endif
2880if targetos == 'darwin'
Alex Bennée63de9352021-05-27 17:03:15 +01002881 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002882endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002883if targetos == 'windows'
2884 if 'WIN_SDK' in config_host
2885 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2886 endif
2887endif
Paolo Bonzini47b30832020-09-23 05:26:17 -04002888summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2889 + ['-O' + get_option('optimization')]
2890 + (get_option('debug') ? ['-g'] : []))}
2891if link_language == 'cpp'
2892 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2893 + ['-O' + get_option('optimization')]
2894 + (get_option('debug') ? ['-g'] : []))}
2895endif
2896link_args = get_option(link_language + '_link_args')
2897if link_args.length() > 0
2898 summary_info += {'LDFLAGS': ' '.join(link_args)}
2899endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002900summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2901summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002902summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05002903summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002904summary_info += {'PIE': get_option('b_pie')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02002905summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002906summary_info += {'malloc trim support': has_malloc_trim}
2907summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002908summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2909summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2910summary_info += {'memory allocator': get_option('malloc')}
2911summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2912summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2913summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
2914summary_info += {'gcov': get_option('b_coverage')}
2915summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2916summary_info += {'CFI support': get_option('cfi')}
2917if get_option('cfi')
2918 summary_info += {'CFI debug support': get_option('cfi_debug')}
2919endif
2920summary_info += {'strip binaries': get_option('strip')}
2921summary_info += {'sparse': sparse.found() ? sparse.full_path() : false}
2922summary_info += {'mingw32 support': targetos == 'windows'}
Alex Bennée49e85652021-02-22 10:14:50 +00002923
2924# snarf the cross-compilation information for tests
2925foreach target: target_dirs
2926 tcg_mak = meson.current_build_dir() / 'tests/tcg' / 'config-' + target + '.mak'
2927 if fs.exists(tcg_mak)
2928 config_cross_tcg = keyval.load(tcg_mak)
2929 target = config_cross_tcg['TARGET_NAME']
2930 compiler = ''
2931 if 'DOCKER_CROSS_CC_GUEST' in config_cross_tcg
2932 summary_info += {target + ' tests': config_cross_tcg['DOCKER_CROSS_CC_GUEST'] +
2933 ' via ' + config_cross_tcg['DOCKER_IMAGE']}
2934 elif 'CROSS_CC_GUEST' in config_cross_tcg
2935 summary_info += {target + ' tests'
2936 : config_cross_tcg['CROSS_CC_GUEST'] }
2937 endif
2938 endif
2939endforeach
2940
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002941summary(summary_info, bool_yn: true, section: 'Compilation')
2942
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002943# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002944summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002945if have_system
2946 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2947 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2948 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2949 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
Reinoud Zandijk74a414a2021-04-02 22:25:32 +02002950 summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002951 summary_info += {'Xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2952 if config_host.has_key('CONFIG_XEN_BACKEND')
2953 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2954 endif
2955endif
2956summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2957if config_all.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01002958 if get_option('tcg_interpreter')
2959 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, experimental and slow)'}
2960 else
2961 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
2962 endif
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002963 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002964endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002965summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002966if have_system
2967 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01002968 summary_info += {'out of process emulation': multiprocess_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002969endif
2970summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
2971
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002972# Block layer
2973summary_info = {}
2974summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2975summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2976if have_block
2977 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2978 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
2979 summary_info += {'VirtFS support': have_virtfs}
2980 summary_info += {'build virtiofs daemon': have_virtiofsd}
2981 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
2982 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2983 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2984 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2985 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2986 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2987 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2988 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2989 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2990 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002991 summary_info += {'FUSE exports': fuse.found()}
2992endif
2993summary(summary_info, bool_yn: true, section: 'Block layer support')
2994
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002995# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002996summary_info = {}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002997summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
Paolo Bonzini57612512021-06-03 11:15:26 +02002998summary_info += {'GNUTLS support': gnutls.found()}
Daniel P. Berrangécc4c7c72021-06-30 17:20:02 +01002999summary_info += {'GNUTLS crypto': gnutls_crypto.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003000# TODO: add back version
Paolo Bonzini57612512021-06-03 11:15:26 +02003001summary_info += {'libgcrypt': gcrypt.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003002# TODO: add back version
Paolo Bonzini57612512021-06-03 11:15:26 +02003003summary_info += {'nettle': nettle.found()}
3004if nettle.found()
3005 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003006endif
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003007summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
3008summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
3009summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
3010summary(summary_info, bool_yn: true, section: 'Crypto')
3011
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01003012# Libraries
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01003013summary_info = {}
3014if targetos == 'darwin'
3015 summary_info += {'Cocoa support': cocoa.found()}
3016endif
3017# TODO: add back version
3018summary_info += {'SDL support': sdl.found()}
3019summary_info += {'SDL image support': sdl_image.found()}
3020# TODO: add back version
3021summary_info += {'GTK support': gtk.found()}
3022summary_info += {'pixman': pixman.found()}
3023# TODO: add back version
Paolo Bonzinic23d7b42021-06-03 11:31:35 +02003024summary_info += {'VTE support': vte.found()}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01003025# TODO: add back version
3026summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
Paolo Bonziniba7ed402021-06-03 11:15:26 +02003027summary_info += {'libtasn1': tasn1.found()}
Paolo Bonzini05e391a2021-06-03 11:15:26 +02003028summary_info += {'PAM': pam.found()}
Yonggang Luo5285e592020-10-13 07:43:48 +08003029summary_info += {'iconv support': iconv.found()}
3030summary_info += {'curses support': curses.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003031# TODO: add back version
Paolo Bonzini587d59d2021-06-03 11:31:35 +02003032summary_info += {'virgl support': virgl.found()}
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01003033summary_info += {'curl support': curl.found()}
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02003034summary_info += {'Multipath support': mpathpersist.found()}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01003035summary_info += {'VNC support': vnc.found()}
3036if vnc.found()
3037 summary_info += {'VNC SASL support': sasl.found()}
3038 summary_info += {'VNC JPEG support': jpeg.found()}
3039 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003040endif
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01003041summary_info += {'brlapi support': brlapi.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003042summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
3043summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
3044summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
Paolo Bonzini53c22b62021-06-03 11:31:35 +02003045summary_info += {'Linux io_uring support': linux_io_uring.found()}
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01003046summary_info += {'ATTR/XATTR support': libattr.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003047summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
3048summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02003049summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01003050summary_info += {'libcap-ng support': libcap_ng.found()}
Andrew Melnychenko46627f42021-05-14 14:48:32 +03003051summary_info += {'bpf support': libbpf.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003052# TODO: add back protocol and server version
3053summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01003054summary_info += {'rbd support': rbd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003055summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
Paolo Bonzini5f364c52021-06-03 11:15:26 +02003056summary_info += {'smartcard support': cacard.found()}
César Belley0a40bcb2020-08-26 13:42:04 +02003057summary_info += {'U2F support': u2f.found()}
Paolo Bonzini90540f32021-06-03 11:15:26 +02003058summary_info += {'libusb': libusb.found()}
Paolo Bonzini18f31e62021-06-03 11:15:26 +02003059summary_info += {'usb net redir': usbredir.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003060summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
Akihiko Odakibc6a3562021-02-23 15:03:07 +09003061summary_info += {'GBM': config_host.has_key('CONFIG_GBM')}
Paolo Bonzini9db405a2020-11-17 13:11:25 +01003062summary_info += {'libiscsi support': libiscsi.found()}
Paolo Bonzini30045c02020-11-17 13:11:25 +01003063summary_info += {'libnfs support': libnfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003064if targetos == 'windows'
Paolo Bonzinib846ab72021-01-21 11:49:04 +01003065 if config_host.has_key('CONFIG_GUEST_AGENT')
3066 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
3067 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01003068 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01003069endif
Paolo Bonzini90835c22020-11-17 14:22:24 +01003070summary_info += {'seccomp support': seccomp.found()}
Paolo Bonzini08821ca2020-11-17 13:01:26 +01003071summary_info += {'GlusterFS support': glusterfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003072summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
3073summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01003074summary_info += {'lzo support': lzo.found()}
Paolo Bonzini241611e2020-11-17 13:32:34 +01003075summary_info += {'snappy support': snappy.found()}
Paolo Bonzini29ba6112020-11-17 13:07:52 +01003076summary_info += {'bzip2 support': libbzip2.found()}
Paolo Bonziniecea3692020-11-17 13:35:28 +01003077summary_info += {'lzfse support': liblzfse.found()}
Paolo Bonzinib1def332020-11-17 13:37:39 +01003078summary_info += {'zstd support': zstd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01003079summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
Paolo Bonzinic5b36c22021-06-03 11:31:35 +02003080summary_info += {'libxml2': libxml2.found()}
Richard Henderson8b18cdb2020-09-13 12:19:25 -07003081summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
Paolo Bonzinie36e8c72021-06-03 11:31:35 +02003082summary_info += {'libpmem support': libpmem.found()}
Paolo Bonzini83ef1682021-06-03 11:31:35 +02003083summary_info += {'libdaxctl support': libdaxctl.found()}
Paolo Bonzinif01496a2020-09-16 17:54:14 +02003084summary_info += {'libudev': libudev.found()}
Max Reitzdf4ea702020-10-27 20:05:46 +01003085summary_info += {'FUSE lseek': fuse_lseek.found()}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01003086summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01003087
3088if not supported_cpus.contains(cpu)
3089 message()
3090 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
3091 message()
3092 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
3093 message('The QEMU project intends to remove support for this host CPU in')
3094 message('a future release if nobody volunteers to maintain it and to')
3095 message('provide a build host for our continuous integration setup.')
3096 message('configure has succeeded and you can continue to build, but')
3097 message('if you care about QEMU on this platform you should contact')
3098 message('us upstream at qemu-devel@nongnu.org.')
3099endif
3100
3101if not supported_oses.contains(targetos)
3102 message()
3103 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
3104 message()
3105 message('Host OS ' + targetos + 'support is not currently maintained.')
3106 message('The QEMU project intends to remove support for this host OS in')
3107 message('a future release if nobody volunteers to maintain it and to')
3108 message('provide a build host for our continuous integration setup.')
3109 message('configure has succeeded and you can continue to build, but')
3110 message('if you care about QEMU on this platform you should contact')
3111 message('us upstream at qemu-devel@nongnu.org.')
3112endif