blob: 0b4b55b9da299a4f501f23079bed3f068f3a148c [file] [log] [blame]
Paolo Bonzinia5665052019-06-10 12:05:14 +02001project('qemu', ['c'], meson_version: '>=0.55.0',
Richard Hendersond22797c2021-06-14 16:31:36 -07002 default_options: ['warning_level=1', 'c_std=gnu11', 'cpp_std=gnu++11', 'b_colorout=auto'] +
Paolo Bonzinia5cb7c52020-10-19 06:56:16 -04003 (meson.version().version_compare('>=0.56.0') ? [ 'b_staticpic=false' ] : []),
Paolo Bonzinia5665052019-06-10 12:05:14 +02004 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5
6not_found = dependency('', required: false)
Paolo Bonzinib29b40f2020-08-10 18:04:43 +02007if meson.version().version_compare('>=0.56.0')
8 keyval = import('keyval')
9else
10 keyval = import('unstable-keyval')
11endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040012ss = import('sourceset')
Richard Henderson8b18cdb2020-09-13 12:19:25 -070013fs = import('fs')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040014
Paolo Bonzinice1c1e72020-01-28 16:41:44 +010015sh = find_program('sh')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040016cc = meson.get_compiler('c')
Paolo Bonzinia5665052019-06-10 12:05:14 +020017config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Marc-André Lureau3154fee2019-08-29 22:07:01 +040018enable_modules = 'CONFIG_MODULES' in config_host
Paolo Bonzini35be72b2020-02-06 14:17:15 +010019enable_static = 'CONFIG_STATIC' in config_host
Yonggang Luoe3667662020-10-16 06:06:25 +080020
Paolo Bonzinid7dedf42021-01-26 11:15:33 +010021# Allow both shared and static libraries unless --enable-static
22static_kwargs = enable_static ? {'static': true} : {}
23
Yonggang Luoe3667662020-10-16 06:06:25 +080024# Temporary directory used for files created while
25# configure runs. Since it is in the build directory
26# we can safely blow away any previous version of it
27# (and we need not jump through hoops to try to delete
28# it when configure exits.)
29tmpdir = meson.current_build_dir() / 'meson-private/temp'
Marc-André Lureau8fe11232020-09-11 14:42:48 +020030
31if get_option('qemu_suffix').startswith('/')
32 error('qemu_suffix cannot start with a /')
33endif
34
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040035qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
Marc-André Lureauab4c0992020-08-26 15:04:16 +040036qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040037qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040038qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
39
40qemu_desktopdir = get_option('datadir') / 'applications'
41qemu_icondir = get_option('datadir') / 'icons'
42
Paolo Bonzini859aef02020-08-04 18:14:26 +020043config_host_data = configuration_data()
44genh = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020045
Paolo Bonzini760e4322020-08-26 08:09:48 +020046target_dirs = config_host['TARGET_DIRS'].split()
47have_user = false
48have_system = false
49foreach target : target_dirs
50 have_user = have_user or target.endswith('-user')
51 have_system = have_system or target.endswith('-softmmu')
52endforeach
53have_tools = 'CONFIG_TOOLS' in config_host
54have_block = have_system or have_tools
55
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040056python = import('python').find_installation()
57
58supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Sergei Trofimovich61256732020-10-12 18:57:19 +010059supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040060 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
61
62cpu = host_machine.cpu_family()
63targetos = host_machine.system()
64
Paolo Bonzini8a199802020-09-18 05:37:01 -040065if cpu in ['x86', 'x86_64']
66 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
67elif cpu == 'aarch64'
68 kvm_targets = ['aarch64-softmmu']
69elif cpu == 's390x'
70 kvm_targets = ['s390x-softmmu']
71elif cpu in ['ppc', 'ppc64']
72 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Huacai Chenfbc58842020-10-07 16:39:28 +080073elif cpu in ['mips', 'mips64']
74 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -040075else
76 kvm_targets = []
77endif
78
79accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alex Bennée0c3e41d2020-11-10 19:23:09 +000080if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
81 # i368 emulator provides xenpv machine type for multiple architectures
82 accelerator_targets += {
83 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
84 }
85endif
Paolo Bonzini8a199802020-09-18 05:37:01 -040086if cpu in ['x86', 'x86_64']
87 accelerator_targets += {
88 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -040089 'CONFIG_HVF': ['x86_64-softmmu'],
Reinoud Zandijk74a414a2021-04-02 22:25:32 +020090 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -040091 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
92 }
93endif
94
Philippe Mathieu-Daudéeae9a1d2021-01-14 18:45:08 +010095edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
96install_edk2_blobs = false
97if get_option('install_blobs')
98 foreach target : target_dirs
99 install_edk2_blobs = install_edk2_blobs or target in edk2_targets
100 endforeach
101endif
102
Philippe Mathieu-Daudé45b545d2021-01-14 18:45:09 +0100103bzip2 = find_program('bzip2', required: install_edk2_blobs)
104
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400105##################
106# Compiler flags #
107##################
108
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400109# Specify linker-script with add_project_link_arguments so that it is not placed
110# within a linker --start-group/--end-group pair
111if 'CONFIG_FUZZ' in config_host
112 add_project_link_arguments(['-Wl,-T,',
113 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
114 native: false, language: ['c', 'cpp', 'objc'])
115endif
116
Marc-André Lureau5fc06172021-01-14 16:56:02 +0400117add_global_arguments(config_host['QEMU_CFLAGS'].split(),
118 native: false, language: ['c', 'objc'])
119add_global_arguments(config_host['QEMU_CXXFLAGS'].split(),
120 native: false, language: 'cpp')
121add_global_link_arguments(config_host['QEMU_LDFLAGS'].split(),
122 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzinia5665052019-06-10 12:05:14 +0200123
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400124if targetos == 'linux'
125 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
126 '-isystem', 'linux-headers',
127 language: ['c', 'cpp'])
128endif
129
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100130add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400131 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400132 '-iquote', meson.current_source_dir() / 'include',
133 '-iquote', meson.current_source_dir() / 'disas/libvixl',
134 language: ['c', 'cpp', 'objc'])
Alexander Bulekovc46f76d2020-09-02 13:36:50 -0400135
Marc-André Lureaufc929892019-07-13 01:47:54 +0400136link_language = meson.get_external_property('link_language', 'cpp')
137if link_language == 'cpp'
138 add_languages('cpp', required: true, native: false)
139endif
Paolo Bonzinia5665052019-06-10 12:05:14 +0200140if host_machine.system() == 'darwin'
141 add_languages('objc', required: false, native: false)
142endif
143
Paolo Bonzinideb62372020-09-01 07:51:16 -0400144sparse = find_program('cgcc', required: get_option('sparse'))
145if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100146 run_target('sparse',
147 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400148 'compile_commands.json', sparse.full_path(), '-Wbitwise',
149 '-Wno-transparent-union', '-Wno-old-initializer',
150 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100151endif
152
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200153###########################################
154# Target-specific checks and dependencies #
155###########################################
156
157if targetos != 'linux' and get_option('mpath').enabled()
158 error('Multipath is supported only on Linux')
159endif
160
Paolo Bonzini106ad1f2021-02-17 16:24:25 +0100161if targetos != 'linux' and get_option('multiprocess').enabled()
162 error('Multiprocess QEMU is supported only on Linux')
163endif
164multiprocess_allowed = targetos == 'linux' and not get_option('multiprocess').disabled()
165
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200166libm = cc.find_library('m', required: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400167util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200168winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400169socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400170version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400171coref = []
172iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400173emulator_link_args = []
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200174nvmm =not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400175hvf = not_found
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400176if targetos == 'windows'
177 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200178 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400179
180 win = import('windows')
181 version_res = win.compile_resources('version.rc',
182 depend_files: files('pc-bios/qemu-nsis.ico'),
183 include_directories: include_directories('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400184elif targetos == 'darwin'
185 coref = dependency('appleframeworks', modules: 'CoreFoundation')
186 iokit = dependency('appleframeworks', modules: 'IOKit')
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200187elif targetos == 'sunos'
188 socket = [cc.find_library('socket'),
189 cc.find_library('nsl'),
190 cc.find_library('resolv')]
191elif targetos == 'haiku'
192 socket = [cc.find_library('posix_error_mapper'),
193 cc.find_library('network'),
194 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400195elif targetos == 'openbsd'
196 if not get_option('tcg').disabled() and target_dirs.length() > 0
197 # Disable OpenBSD W^X if available
198 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
199 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400200endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200201
Paolo Bonzini8a199802020-09-18 05:37:01 -0400202accelerators = []
203if not get_option('kvm').disabled() and targetos == 'linux'
204 accelerators += 'CONFIG_KVM'
205endif
206if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
207 accelerators += 'CONFIG_XEN'
208 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
209else
210 have_xen_pci_passthrough = false
211endif
212if not get_option('whpx').disabled() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000213 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400214 error('WHPX requires 64-bit host')
215 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
216 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
217 accelerators += 'CONFIG_WHPX'
218 endif
219endif
220if not get_option('hvf').disabled()
221 hvf = dependency('appleframeworks', modules: 'Hypervisor',
222 required: get_option('hvf'))
223 if hvf.found()
224 accelerators += 'CONFIG_HVF'
225 endif
226endif
227if not get_option('hax').disabled()
228 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
229 accelerators += 'CONFIG_HAX'
230 endif
231endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200232if targetos == 'netbsd'
233 if cc.has_header_symbol('nvmm.h', 'nvmm_cpu_stop', required: get_option('nvmm'))
234 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
235 endif
236 if nvmm.found()
237 accelerators += 'CONFIG_NVMM'
238 endif
239endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100240
241tcg_arch = config_host['ARCH']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400242if not get_option('tcg').disabled()
243 if cpu not in supported_cpus
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100244 if get_option('tcg_interpreter')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +0100245 warning('Unsupported CPU @0@, will use TCG with TCI (experimental and slow)'.format(cpu))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400246 else
247 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
248 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100249 elif get_option('tcg_interpreter')
250 warning('Use of the TCG interpretor is not recommended on this host')
251 warning('architecture. There is a native TCG execution backend available')
252 warning('which provides substantially better performance and reliability.')
253 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
254 warning('configuration option on this architecture to use the native')
255 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400256 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100257 if get_option('tcg_interpreter')
258 tcg_arch = 'tci'
259 elif config_host['ARCH'] == 'sparc64'
260 tcg_arch = 'sparc'
261 elif config_host['ARCH'] == 's390x'
262 tcg_arch = 's390'
263 elif config_host['ARCH'] in ['x86_64', 'x32']
264 tcg_arch = 'i386'
265 elif config_host['ARCH'] == 'ppc64'
266 tcg_arch = 'ppc'
267 elif config_host['ARCH'] in ['riscv32', 'riscv64']
268 tcg_arch = 'riscv'
269 endif
270 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100271 language: ['c', 'cpp', 'objc'])
272
Paolo Bonzini8a199802020-09-18 05:37:01 -0400273 accelerators += 'CONFIG_TCG'
274 config_host += { 'CONFIG_TCG': 'y' }
275endif
276
277if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
278 error('KVM not available on this platform')
279endif
280if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
281 error('HVF not available on this platform')
282endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200283if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
284 error('NVMM not available on this platform')
285endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400286if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
287 error('WHPX not available on this platform')
288endif
289if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
290 if 'CONFIG_XEN' in accelerators
291 error('Xen PCI passthrough not available on this platform')
292 else
293 error('Xen PCI passthrough requested but Xen not enabled')
294 endif
295endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400296
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200297################
298# Dependencies #
299################
300
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400301# The path to glib.h is added to all compilation commands. This was
302# grandfathered in from the QEMU Makefiles.
303add_project_arguments(config_host['GLIB_CFLAGS'].split(),
304 native: false, language: ['c', 'cpp', 'objc'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400305glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
306 link_args: config_host['GLIB_LIBS'].split())
307# override glib dep with the configure results (for subprojects)
308meson.override_dependency('glib-2.0', glib)
309
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400310gio = not_found
311if 'CONFIG_GIO' in config_host
312 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
313 link_args: config_host['GIO_LIBS'].split())
314endif
315lttng = not_found
316if 'CONFIG_TRACE_UST' in config_host
317 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
318endif
319urcubp = not_found
320if 'CONFIG_TRACE_UST' in config_host
321 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
322endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200323pixman = not_found
324if have_system or have_tools
325 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100326 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200327endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400328libaio = cc.find_library('aio', required: false)
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100329zlib = dependency('zlib', required: true, kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400330linux_io_uring = not_found
331if 'CONFIG_LINUX_IO_URING' in config_host
332 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
333 link_args: config_host['LINUX_IO_URING_LIBS'].split())
334endif
335libxml2 = not_found
336if 'CONFIG_LIBXML2' in config_host
337 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
338 link_args: config_host['LIBXML2_LIBS'].split())
339endif
340libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +0100341if not get_option('libnfs').auto() or have_block
342 libnfs = dependency('libnfs', version: '>=1.9.3',
343 required: get_option('libnfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100344 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400345endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100346
347libattr_test = '''
348 #include <stddef.h>
349 #include <sys/types.h>
350 #ifdef CONFIG_LIBATTR
351 #include <attr/xattr.h>
352 #else
353 #include <sys/xattr.h>
354 #endif
355 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
356
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400357libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100358have_old_libattr = false
359if not get_option('attr').disabled()
360 if cc.links(libattr_test)
361 libattr = declare_dependency()
362 else
363 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
364 required: get_option('attr'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100365 kwargs: static_kwargs)
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100366 if libattr.found() and not \
367 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
368 libattr = not_found
369 if get_option('attr').enabled()
370 error('could not link libattr')
371 else
372 warning('could not link libattr, disabling')
373 endif
374 else
375 have_old_libattr = libattr.found()
376 endif
377 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400378endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100379
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100380cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
381if cocoa.found() and get_option('sdl').enabled()
382 error('Cocoa and SDL cannot be enabled at the same time')
383endif
384if cocoa.found() and get_option('gtk').enabled()
385 error('Cocoa and GTK+ cannot be enabled at the same time')
386endif
387
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100388seccomp = not_found
Paolo Bonzini90835c22020-11-17 14:22:24 +0100389if not get_option('seccomp').auto() or have_system or have_tools
390 seccomp = dependency('libseccomp', version: '>=2.3.0',
391 required: get_option('seccomp'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100392 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100393endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100394
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100395libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100396if not get_option('cap_ng').auto() or have_system or have_tools
397 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
398 required: get_option('cap_ng'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100399 kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100400endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100401if libcap_ng.found() and not cc.links('''
402 #include <cap-ng.h>
403 int main(void)
404 {
405 capng_capability_to_name(CAPNG_EFFECTIVE);
406 return 0;
407 }''', dependencies: libcap_ng)
408 libcap_ng = not_found
409 if get_option('cap_ng').enabled()
410 error('could not link libcap-ng')
411 else
412 warning('could not link libcap-ng, disabling')
413 endif
414endif
415
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400416if get_option('xkbcommon').auto() and not have_system and not have_tools
417 xkbcommon = not_found
418else
419 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100420 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400421endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400422vde = not_found
423if config_host.has_key('CONFIG_VDE')
424 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
425endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200426pulse = not_found
427if 'CONFIG_LIBPULSE' in config_host
428 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
429 link_args: config_host['PULSE_LIBS'].split())
430endif
431alsa = not_found
432if 'CONFIG_ALSA' in config_host
433 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
434 link_args: config_host['ALSA_LIBS'].split())
435endif
436jack = not_found
437if 'CONFIG_LIBJACK' in config_host
438 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
439endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200440spice = not_found
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200441spice_headers = not_found
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200442spice_protocol = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200443if 'CONFIG_SPICE' in config_host
444 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
445 link_args: config_host['SPICE_LIBS'].split())
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200446 spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
Paolo Bonzini26347332019-07-29 15:40:07 +0200447endif
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200448if 'CONFIG_SPICE_PROTOCOL' in config_host
449 spice_protocol = declare_dependency(compile_args: config_host['SPICE_PROTOCOL_CFLAGS'].split())
450endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400451rt = cc.find_library('rt', required: false)
Paolo Bonziniccf7afa2020-09-01 06:44:23 -0400452libdl = not_found
453if 'CONFIG_PLUGIN' in config_host
454 libdl = cc.find_library('dl', required: true)
455endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200456libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100457if not get_option('libiscsi').auto() or have_block
458 libiscsi = dependency('libiscsi', version: '>=1.9.0',
459 required: get_option('libiscsi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100460 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini99650b62019-06-10 12:21:14 +0200461endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400462zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +0100463if not get_option('zstd').auto() or have_block
464 zstd = dependency('libzstd', version: '>=1.4.0',
465 required: get_option('zstd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100466 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400467endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400468gbm = not_found
469if 'CONFIG_GBM' in config_host
470 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
471 link_args: config_host['GBM_LIBS'].split())
472endif
473virgl = not_found
474if 'CONFIG_VIRGL' in config_host
475 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
476 link_args: config_host['VIRGL_LIBS'].split())
477endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400478curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100479if not get_option('curl').auto() or have_block
480 curl = dependency('libcurl', version: '>=7.29.0',
481 method: 'pkg-config',
482 required: get_option('curl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100483 kwargs: static_kwargs)
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400484endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200485libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200486if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200487 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +0100488 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400489 required: get_option('libudev'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100490 kwargs: static_kwargs)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200491endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200492
Paolo Bonzini5c530152020-10-15 06:09:27 -0400493mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200494mpathpersist = not_found
495mpathpersist_new_api = false
496if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
497 mpath_test_source_new = '''
498 #include <libudev.h>
499 #include <mpath_persist.h>
500 unsigned mpath_mx_alloc_len = 1024;
501 int logsink;
502 static struct config *multipath_conf;
503 extern struct udev *udev;
504 extern struct config *get_multipath_config(void);
505 extern void put_multipath_config(struct config *conf);
506 struct udev *udev;
507 struct config *get_multipath_config(void) { return multipath_conf; }
508 void put_multipath_config(struct config *conf) { }
509 int main(void) {
510 udev = udev_new();
511 multipath_conf = mpath_lib_init();
512 return 0;
513 }'''
514 mpath_test_source_old = '''
515 #include <libudev.h>
516 #include <mpath_persist.h>
517 unsigned mpath_mx_alloc_len = 1024;
518 int logsink;
519 int main(void) {
520 struct udev *udev = udev_new();
521 mpath_lib_init(udev);
522 return 0;
523 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400524 libmpathpersist = cc.find_library('mpathpersist',
525 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100526 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400527 if libmpathpersist.found()
528 mpathlibs += libmpathpersist
529 if enable_static
530 mpathlibs += cc.find_library('devmapper',
531 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100532 kwargs: static_kwargs)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200533 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400534 mpathlibs += cc.find_library('multipath',
535 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100536 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400537 foreach lib: mpathlibs
538 if not lib.found()
539 mpathlibs = []
540 break
541 endif
542 endforeach
543 if mpathlibs.length() == 0
544 msg = 'Dependencies missing for libmpathpersist'
545 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200546 mpathpersist = declare_dependency(dependencies: mpathlibs)
547 mpathpersist_new_api = true
548 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
549 mpathpersist = declare_dependency(dependencies: mpathlibs)
550 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400551 msg = 'Cannot detect libmpathpersist API'
552 endif
553 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200554 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400555 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200556 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400557 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200558 endif
559 endif
560 endif
561endif
562
Yonggang Luo5285e592020-10-13 07:43:48 +0800563iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800564curses = not_found
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400565if have_system and not get_option('curses').disabled()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400566 curses_test = '''
567 #include <locale.h>
568 #include <curses.h>
569 #include <wchar.h>
570 int main(void) {
571 wchar_t wch = L'w';
572 setlocale(LC_ALL, "");
573 resize_term(0, 0);
574 addwstr(L"wide chars\n");
575 addnwstr(&wch, 1);
576 add_wch(WACS_DEGREE);
577 return 0;
578 }'''
579
Yonggang Luoca31e302020-11-17 05:31:06 +0800580 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
581 foreach curses_dep : curses_dep_list
582 if not curses.found()
583 curses = dependency(curses_dep,
584 required: false,
585 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100586 kwargs: static_kwargs)
Yonggang Luoca31e302020-11-17 05:31:06 +0800587 endif
588 endforeach
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400589 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500590 curses_compile_args = ['-DNCURSES_WIDECHAR']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400591 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500592 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
593 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400594 else
595 msg = 'curses package not usable'
596 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800597 endif
598 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400599 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400600 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
601 if targetos != 'windows' and not has_curses_h
602 message('Trying with /usr/include/ncursesw')
603 curses_compile_args += ['-I/usr/include/ncursesw']
604 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
605 endif
606 if has_curses_h
607 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
608 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800609 libcurses = cc.find_library(curses_libname,
610 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100611 kwargs: static_kwargs)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400612 if libcurses.found()
613 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
614 curses = declare_dependency(compile_args: curses_compile_args,
615 dependencies: [libcurses])
616 break
617 else
618 msg = 'curses library not usable'
619 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800620 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400621 endforeach
622 endif
623 endif
624 if not get_option('iconv').disabled()
625 foreach link_args : [ ['-liconv'], [] ]
626 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
627 # We need to use libiconv if available because mixing libiconv's headers with
628 # the system libc does not work.
629 # However, without adding glib to the dependencies -L/usr/local/lib will not be
630 # included in the command line and libiconv will not be found.
631 if cc.links('''
632 #include <iconv.h>
633 int main(void) {
634 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
635 return conv != (iconv_t) -1;
636 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
637 iconv = declare_dependency(link_args: link_args, dependencies: glib)
638 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800639 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400640 endforeach
641 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400642 if curses.found() and not iconv.found()
643 if get_option('iconv').enabled()
644 error('iconv not available')
645 endif
646 msg = 'iconv required for curses UI but not available'
647 curses = not_found
648 endif
649 if not curses.found() and msg != ''
650 if get_option('curses').enabled()
651 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400652 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400653 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400654 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800655 endif
656endif
657
Paolo Bonzini26347332019-07-29 15:40:07 +0200658brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100659if not get_option('brlapi').auto() or have_system
660 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
661 required: get_option('brlapi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100662 kwargs: static_kwargs)
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100663 if brlapi.found() and not cc.links('''
664 #include <brlapi.h>
665 #include <stddef.h>
666 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
667 brlapi = not_found
668 if get_option('brlapi').enabled()
669 error('could not link brlapi')
670 else
671 warning('could not link brlapi, disabling')
672 endif
673 endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200674endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100675
Paolo Bonzini760e4322020-08-26 08:09:48 +0200676sdl = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100677if not get_option('sdl').auto() or (have_system and not cocoa.found())
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100678 sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200679 sdl_image = not_found
680endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100681if sdl.found()
682 # work around 2.0.8 bug
683 sdl = declare_dependency(compile_args: '-Wno-undef',
684 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200685 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100686 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100687else
688 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100689 error('sdl-image required, but SDL was @0@'.format(
690 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100691 endif
692 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200693endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100694
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400695rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100696if not get_option('rbd').auto() or have_block
697 librados = cc.find_library('rados', required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100698 kwargs: static_kwargs)
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100699 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
700 required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100701 kwargs: static_kwargs)
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100702 if librados.found() and librbd.found()
703 if cc.links('''
704 #include <stdio.h>
705 #include <rbd/librbd.h>
706 int main(void) {
707 rados_t cluster;
708 rados_create(&cluster, NULL);
709 return 0;
710 }''', dependencies: [librbd, librados])
711 rbd = declare_dependency(dependencies: [librbd, librados])
712 elif get_option('rbd').enabled()
713 error('could not link librados')
714 else
715 warning('could not link librados, disabling')
716 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100717 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400718endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100719
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400720glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100721glusterfs_ftruncate_has_stat = false
722glusterfs_iocb_has_stat = false
723if not get_option('glusterfs').auto() or have_block
724 glusterfs = dependency('glusterfs-api', version: '>=3',
725 required: get_option('glusterfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100726 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100727 if glusterfs.found()
728 glusterfs_ftruncate_has_stat = cc.links('''
729 #include <glusterfs/api/glfs.h>
730
731 int
732 main(void)
733 {
734 /* new glfs_ftruncate() passes two additional args */
735 return glfs_ftruncate(NULL, 0, NULL, NULL);
736 }
737 ''', dependencies: glusterfs)
738 glusterfs_iocb_has_stat = cc.links('''
739 #include <glusterfs/api/glfs.h>
740
741 /* new glfs_io_cbk() passes two additional glfs_stat structs */
742 static void
743 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
744 {}
745
746 int
747 main(void)
748 {
749 glfs_io_cbk iocb = &glusterfs_iocb;
750 iocb(NULL, 0 , NULL, NULL, NULL);
751 return 0;
752 }
753 ''', dependencies: glusterfs)
754 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400755endif
756libssh = not_found
757if 'CONFIG_LIBSSH' in config_host
758 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
759 link_args: config_host['LIBSSH_LIBS'].split())
760endif
761libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100762if not get_option('bzip2').auto() or have_block
763 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
764 required: get_option('bzip2'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100765 kwargs: static_kwargs)
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100766 if libbzip2.found() and not cc.links('''
767 #include <bzlib.h>
768 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
769 libbzip2 = not_found
770 if get_option('bzip2').enabled()
771 error('could not link libbzip2')
772 else
773 warning('could not link libbzip2, disabling')
774 endif
775 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400776endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100777
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400778liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +0100779if not get_option('lzfse').auto() or have_block
780 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
781 required: get_option('lzfse'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100782 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400783endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100784if liblzfse.found() and not cc.links('''
785 #include <lzfse.h>
786 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
787 liblzfse = not_found
788 if get_option('lzfse').enabled()
789 error('could not link liblzfse')
790 else
791 warning('could not link liblzfse, disabling')
792 endif
793endif
794
Paolo Bonzini478e9432020-08-17 12:47:55 +0200795oss = not_found
796if 'CONFIG_AUDIO_OSS' in config_host
797 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
798endif
799dsound = not_found
800if 'CONFIG_AUDIO_DSOUND' in config_host
801 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
802endif
803coreaudio = not_found
804if 'CONFIG_AUDIO_COREAUDIO' in config_host
805 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
806endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400807opengl = not_found
808if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400809 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
810 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400811endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100812
Paolo Bonzini57612512021-06-03 11:15:26 +0200813gnutls = not_found
814if not get_option('gnutls').auto() or have_system
815 gnutls = dependency('gnutls', version: '>=3.5.18',
816 method: 'pkg-config',
817 required: get_option('gnutls'),
818 kwargs: static_kwargs)
819endif
820
821# Nettle has priority over gcrypt
822gcrypt = not_found
823nettle = not_found
824xts = 'private'
825if get_option('nettle').enabled() and get_option('gcrypt').enabled()
826 error('Only one of gcrypt & nettle can be enabled')
827elif (not get_option('nettle').auto() or have_system) and not get_option('gcrypt').enabled()
828 nettle = dependency('nettle', version: '>=3.4',
829 method: 'pkg-config',
830 required: get_option('nettle'),
831 kwargs: static_kwargs)
832 if nettle.found() and cc.has_header('nettle/xts.h', dependencies: nettle)
833 xts = 'nettle'
834 endif
835endif
836if (not get_option('gcrypt').auto() or have_system) and not nettle.found()
837 gcrypt = dependency('libgcrypt', version: '>=1.5',
838 method: 'config-tool',
839 required: get_option('gcrypt'),
840 kwargs: static_kwargs)
841 if gcrypt.found() and cc.compiles('''
842 #include <gcrypt.h>
843 int main(void) {
844 gcry_cipher_hd_t handle;
845 gcry_cipher_open(&handle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_XTS, 0);
846 return 0;
847 }
848 ''', dependencies: gcrypt)
849 xts = 'gcrypt'
850 endif
851 # Debian has removed -lgpg-error from libgcrypt-config
852 # as it "spreads unnecessary dependencies" which in
853 # turn breaks static builds...
854 if gcrypt.found() and enable_static
855 gcrypt = declare_dependency(dependencies: [
856 gcrypt,
857 cc.find_library('gpg-error', required: true, kwargs: static_kwargs)])
858 endif
859endif
860
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400861gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +0100862gtkx11 = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100863if not get_option('gtk').auto() or (have_system and not cocoa.found())
Paolo Bonzini1b695472021-01-07 14:02:29 +0100864 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
865 method: 'pkg-config',
866 required: get_option('gtk'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100867 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +0100868 if gtk.found()
869 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
870 method: 'pkg-config',
871 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100872 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +0100873 gtk = declare_dependency(dependencies: [gtk, gtkx11])
874 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400875endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100876
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400877vte = not_found
878if 'CONFIG_VTE' in config_host
879 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
880 link_args: config_host['VTE_LIBS'].split())
881endif
882x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +0200883if gtkx11.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +0100884 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100885 kwargs: static_kwargs)
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400886endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100887vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400888png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400889jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400890sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100891if get_option('vnc').enabled()
892 vnc = declare_dependency() # dummy dependency
893 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100894 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini8e242b32020-11-23 13:34:02 -0500895 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100896 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100897 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
898 required: get_option('vnc_sasl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100899 kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100900 if sasl.found()
901 sasl = declare_dependency(dependencies: sasl,
902 compile_args: '-DSTRUCT_IOVEC_DEFINED')
903 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400904endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100905
Paolo Bonzini05e391a2021-06-03 11:15:26 +0200906pam = not_found
907if not get_option('auth_pam').auto() or have_system
908 pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'],
909 required: get_option('auth_pam'),
910 kwargs: static_kwargs)
911endif
912if pam.found() and not cc.links('''
913 #include <stddef.h>
914 #include <security/pam_appl.h>
915 int main(void) {
916 const char *service_name = "qemu";
917 const char *user = "frank";
918 const struct pam_conv pam_conv = { 0 };
919 pam_handle_t *pamh = NULL;
920 pam_start(service_name, user, &pam_conv, &pamh);
921 return 0;
922 }''', dependencies: pam)
923 pam = not_found
924 if get_option('auth_pam').enabled()
925 error('could not link libpam')
926 else
927 warning('could not link libpam, disabling')
928 endif
929endif
930
Marc-André Lureau708eab42019-09-03 16:59:33 +0400931snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +0100932if not get_option('snappy').auto() or have_system
933 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
934 required: get_option('snappy'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100935 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400936endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100937if snappy.found() and not cc.links('''
938 #include <snappy-c.h>
939 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
940 snappy = not_found
941 if get_option('snappy').enabled()
942 error('could not link libsnappy')
943 else
944 warning('could not link libsnappy, disabling')
945 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400946endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100947
Marc-André Lureau708eab42019-09-03 16:59:33 +0400948lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100949if not get_option('lzo').auto() or have_system
950 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
951 required: get_option('lzo'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100952 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400953endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100954if lzo.found() and not cc.links('''
955 #include <lzo/lzo1x.h>
956 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
957 lzo = not_found
958 if get_option('lzo').enabled()
959 error('could not link liblzo2')
960 else
961 warning('could not link liblzo2, disabling')
962 endif
963endif
964
Marc-André Lureau55166232019-07-24 19:16:22 +0400965rdma = not_found
966if 'CONFIG_RDMA' in config_host
967 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
968endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400969numa = not_found
970if 'CONFIG_NUMA' in config_host
971 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
972endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400973xen = not_found
974if 'CONFIG_XEN_BACKEND' in config_host
975 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
976 link_args: config_host['XEN_LIBS'].split())
977endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200978cacard = not_found
979if 'CONFIG_SMARTCARD' in config_host
980 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
981 link_args: config_host['SMARTCARD_LIBS'].split())
982endif
César Belley0a40bcb2020-08-26 13:42:04 +0200983u2f = not_found
984if have_system
985 u2f = dependency('u2f-emu', required: get_option('u2f'),
986 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100987 kwargs: static_kwargs)
César Belley0a40bcb2020-08-26 13:42:04 +0200988endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200989usbredir = not_found
990if 'CONFIG_USB_REDIR' in config_host
991 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
992 link_args: config_host['USB_REDIR_LIBS'].split())
993endif
994libusb = not_found
Paolo Bonzini90540f32021-06-03 11:15:26 +0200995if not get_option('libusb').auto() or have_system
996 libusb = dependency('libusb-1.0', required: get_option('libusb'),
997 version: '>=1.0.13', method: 'pkg-config',
998 kwargs: static_kwargs)
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200999endif
Paolo Bonzini90540f32021-06-03 11:15:26 +02001000
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001001libpmem = not_found
1002if 'CONFIG_LIBPMEM' in config_host
1003 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
1004 link_args: config_host['LIBPMEM_LIBS'].split())
1005endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -06001006libdaxctl = not_found
1007if 'CONFIG_LIBDAXCTL' in config_host
1008 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
1009endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001010tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +02001011if gnutls.found()
1012 tasn1 = dependency('libtasn1',
1013 method: 'pkg-config',
1014 kwargs: static_kwargs)
Marc-André Lureau8ce0a452020-08-28 15:07:20 +04001015endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001016keyutils = dependency('libkeyutils', required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001017 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001018
Marc-André Lureau3909def2020-08-28 15:07:33 +04001019has_gettid = cc.has_function('gettid')
1020
Paolo Bonziniaa087962020-09-01 11:15:30 -04001021# Malloc tests
1022
1023malloc = []
1024if get_option('malloc') == 'system'
1025 has_malloc_trim = \
1026 not get_option('malloc_trim').disabled() and \
1027 cc.links('''#include <malloc.h>
1028 int main(void) { malloc_trim(0); return 0; }''')
1029else
1030 has_malloc_trim = false
1031 malloc = cc.find_library(get_option('malloc'), required: true)
1032endif
1033if not has_malloc_trim and get_option('malloc_trim').enabled()
1034 if get_option('malloc') == 'system'
1035 error('malloc_trim not available on this platform.')
1036 else
1037 error('malloc_trim not available with non-libc memory allocator')
1038 endif
1039endif
1040
Max Reitz84e319a2020-11-02 17:18:55 +01001041# Check whether the glibc provides statx()
1042
1043statx_test = '''
1044 #ifndef _GNU_SOURCE
1045 #define _GNU_SOURCE
1046 #endif
1047 #include <sys/stat.h>
1048 int main(void) {
1049 struct statx statxbuf;
1050 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
1051 return 0;
1052 }'''
1053
1054has_statx = cc.links(statx_test)
1055
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +00001056have_vhost_user_blk_server = (targetos == 'linux' and
1057 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001058
1059if get_option('vhost_user_blk_server').enabled()
1060 if targetos != 'linux'
1061 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +00001062 elif 'CONFIG_VHOST_USER' not in config_host
1063 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001064 endif
1065elif get_option('vhost_user_blk_server').disabled() or not have_system
1066 have_vhost_user_blk_server = false
1067endif
1068
Daniele Buono9e62ba42020-12-04 18:06:14 -05001069
Max Reitzdf4ea702020-10-27 20:05:46 +01001070if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1071 error('Cannot enable fuse-lseek while fuse is disabled')
1072endif
1073
Max Reitza484a712020-10-27 20:05:41 +01001074fuse = dependency('fuse3', required: get_option('fuse'),
1075 version: '>=3.1', method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001076 kwargs: static_kwargs)
Max Reitza484a712020-10-27 20:05:41 +01001077
Max Reitzdf4ea702020-10-27 20:05:46 +01001078fuse_lseek = not_found
1079if not get_option('fuse_lseek').disabled()
1080 if fuse.version().version_compare('>=3.8')
1081 # Dummy dependency
1082 fuse_lseek = declare_dependency()
1083 elif get_option('fuse_lseek').enabled()
1084 if fuse.found()
1085 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1086 else
1087 error('fuse-lseek requires libfuse, which was not found')
1088 endif
1089 endif
1090endif
1091
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001092# libbpf
1093libbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
1094if libbpf.found() and not cc.links('''
1095 #include <bpf/libbpf.h>
1096 int main(void)
1097 {
1098 bpf_object__destroy_skeleton(NULL);
1099 return 0;
1100 }''', dependencies: libbpf)
1101 libbpf = not_found
1102 if get_option('bpf').enabled()
1103 error('libbpf skeleton test failed')
1104 else
1105 warning('libbpf skeleton test failed, disabling')
1106 endif
1107endif
1108
Daniele Buono9e62ba42020-12-04 18:06:14 -05001109if get_option('cfi')
1110 cfi_flags=[]
1111 # Check for dependency on LTO
1112 if not get_option('b_lto')
1113 error('Selected Control-Flow Integrity but LTO is disabled')
1114 endif
1115 if config_host.has_key('CONFIG_MODULES')
1116 error('Selected Control-Flow Integrity is not compatible with modules')
1117 endif
1118 # Check for cfi flags. CFI requires LTO so we can't use
1119 # get_supported_arguments, but need a more complex "compiles" which allows
1120 # custom arguments
1121 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1122 args: ['-flto', '-fsanitize=cfi-icall'] )
1123 cfi_flags += '-fsanitize=cfi-icall'
1124 else
1125 error('-fsanitize=cfi-icall is not supported by the compiler')
1126 endif
1127 if cc.compiles('int main () { return 0; }',
1128 name: '-fsanitize-cfi-icall-generalize-pointers',
1129 args: ['-flto', '-fsanitize=cfi-icall',
1130 '-fsanitize-cfi-icall-generalize-pointers'] )
1131 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1132 else
1133 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1134 endif
1135 if get_option('cfi_debug')
1136 if cc.compiles('int main () { return 0; }',
1137 name: '-fno-sanitize-trap=cfi-icall',
1138 args: ['-flto', '-fsanitize=cfi-icall',
1139 '-fno-sanitize-trap=cfi-icall'] )
1140 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1141 else
1142 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1143 endif
1144 endif
Marc-André Lureau5fc06172021-01-14 16:56:02 +04001145 add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1146 add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
Daniele Buono9e62ba42020-12-04 18:06:14 -05001147endif
1148
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001149#################
1150# config-host.h #
1151#################
Paolo Bonzini859aef02020-08-04 18:14:26 +02001152
Paolo Bonzini69202b42020-11-17 14:46:21 +01001153have_virtfs = (targetos == 'linux' and
1154 have_system and
1155 libattr.found() and
1156 libcap_ng.found())
1157
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01001158have_virtfs_proxy_helper = have_virtfs and have_tools
1159
Paolo Bonzini69202b42020-11-17 14:46:21 +01001160if get_option('virtfs').enabled()
1161 if not have_virtfs
1162 if targetos != 'linux'
1163 error('virtio-9p (virtfs) requires Linux')
1164 elif not libcap_ng.found() or not libattr.found()
1165 error('virtio-9p (virtfs) requires libcap-ng-devel and libattr-devel')
1166 elif not have_system
1167 error('virtio-9p (virtfs) needs system emulation support')
1168 endif
1169 endif
1170elif get_option('virtfs').disabled()
1171 have_virtfs = false
1172endif
1173
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001174config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1175config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1176config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1177config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1178config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
1179config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
1180config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1181config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1182config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1183config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1184config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1185config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1186
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001187config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001188config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04001189config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001190config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001191config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001192config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1193config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001194config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08001195config_host_data.set('CONFIG_CURSES', curses.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001196config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1197if glusterfs.found()
1198 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1199 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1200 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1201 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1202 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1203 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1204endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001205config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001206config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001207config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001208config_host_data.set('CONFIG_EBPF', libbpf.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001209config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01001210config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001211config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001212config_host_data.set('CONFIG_SDL', sdl.found())
1213config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01001214config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01001215config_host_data.set('CONFIG_SNAPPY', snappy.found())
Paolo Bonzini90540f32021-06-03 11:15:26 +02001216config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001217config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001218config_host_data.set('CONFIG_VNC', vnc.found())
1219config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1220config_host_data.set('CONFIG_VNC_PNG', png.found())
1221config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01001222config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001223config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001224config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04001225config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02001226config_host_data.set('CONFIG_GNUTLS', gnutls.found())
1227config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
1228config_host_data.set('CONFIG_NETTLE', nettle.found())
1229config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04001230config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01001231config_host_data.set('CONFIG_STATX', has_statx)
Paolo Bonzinib1def332020-11-17 13:37:39 +01001232config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01001233config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01001234config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01001235config_host_data.set('CONFIG_X11', x11.found())
Daniele Buono9e62ba42020-12-04 18:06:14 -05001236config_host_data.set('CONFIG_CFI', get_option('cfi'))
Paolo Bonzini859aef02020-08-04 18:14:26 +02001237config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1238config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1239config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1240config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1241
Thomas Huth48f670e2020-11-18 18:10:52 +01001242config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001243config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001244config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001245config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001246config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Joelle van Dyne1ad27f72021-01-25 17:24:51 -08001247config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Thomas Huthded5d782020-11-14 11:10:11 +01001248
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001249config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
1250
Paolo Bonzini765686d2020-09-18 06:37:21 -04001251ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
Paolo Bonzini859aef02020-08-04 18:14:26 +02001252arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001253strings = ['HOST_DSOSUF', 'CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001254foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -04001255 if ignored.contains(k)
1256 # do nothing
1257 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001258 if v != ''
1259 v = '"' + '", "'.join(v.split()) + '", '
1260 endif
1261 config_host_data.set(k, v)
1262 elif k == 'ARCH'
1263 config_host_data.set('HOST_' + v.to_upper(), 1)
1264 elif strings.contains(k)
1265 if not k.startswith('CONFIG_')
1266 k = 'CONFIG_' + k.to_upper()
1267 endif
1268 config_host_data.set_quoted(k, v)
1269 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
1270 config_host_data.set(k, v == 'y' ? 1 : v)
1271 endif
1272endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02001273
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001274########################
1275# Target configuration #
1276########################
1277
Paolo Bonzini2becc362020-02-03 11:42:03 +01001278minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04001279config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001280config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001281config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001282config_devices_mak_list = []
1283config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02001284config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001285config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001286
1287disassemblers = {
1288 'alpha' : ['CONFIG_ALPHA_DIS'],
1289 'arm' : ['CONFIG_ARM_DIS'],
1290 'avr' : ['CONFIG_AVR_DIS'],
1291 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06001292 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001293 'hppa' : ['CONFIG_HPPA_DIS'],
1294 'i386' : ['CONFIG_I386_DIS'],
1295 'x86_64' : ['CONFIG_I386_DIS'],
1296 'x32' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001297 'm68k' : ['CONFIG_M68K_DIS'],
1298 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1299 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001300 'nios2' : ['CONFIG_NIOS2_DIS'],
1301 'or1k' : ['CONFIG_OPENRISC_DIS'],
1302 'ppc' : ['CONFIG_PPC_DIS'],
1303 'riscv' : ['CONFIG_RISCV_DIS'],
1304 'rx' : ['CONFIG_RX_DIS'],
1305 's390' : ['CONFIG_S390_DIS'],
1306 'sh4' : ['CONFIG_SH4_DIS'],
1307 'sparc' : ['CONFIG_SPARC_DIS'],
1308 'xtensa' : ['CONFIG_XTENSA_DIS'],
1309}
1310if link_language == 'cpp'
1311 disassemblers += {
1312 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1313 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1314 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1315 }
1316endif
1317
Paolo Bonzini0a189112020-11-17 14:58:32 +01001318host_kconfig = \
1319 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
1320 ('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
1321 ('CONFIG_IVSHMEM' in config_host ? ['CONFIG_IVSHMEM=y'] : []) + \
1322 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01001323 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001324 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1325 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1326 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01001327 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001328 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman3090de62021-01-29 11:46:05 -05001329 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : []) + \
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01001330 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01001331
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001332ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001333
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001334default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1335actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001336fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001337foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04001338 config_target = { 'TARGET_NAME': target.split('-')[0] }
1339 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001340 if targetos != 'linux'
1341 if default_targets
1342 continue
1343 endif
1344 error('Target @0@ is only available on a Linux host'.format(target))
1345 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001346 config_target += { 'CONFIG_LINUX_USER': 'y' }
1347 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001348 if 'CONFIG_BSD' not in config_host
1349 if default_targets
1350 continue
1351 endif
1352 error('Target @0@ is only available on a BSD host'.format(target))
1353 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001354 config_target += { 'CONFIG_BSD_USER': 'y' }
1355 elif target.endswith('softmmu')
1356 config_target += { 'CONFIG_SOFTMMU': 'y' }
1357 endif
1358 if target.endswith('-user')
1359 config_target += {
1360 'CONFIG_USER_ONLY': 'y',
1361 'CONFIG_QEMU_INTERP_PREFIX':
1362 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1363 }
1364 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001365
Paolo Bonzini0a189112020-11-17 14:58:32 +01001366 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04001367 foreach sym: accelerators
1368 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1369 config_target += { sym: 'y' }
1370 config_all += { sym: 'y' }
Paolo Bonzini23a77b22020-12-14 12:01:45 +01001371 if sym == 'CONFIG_TCG' and tcg_arch == 'tci'
1372 config_target += { 'CONFIG_TCG_INTERPRETER': 'y' }
1373 elif sym == 'CONFIG_XEN' and have_xen_pci_passthrough
Paolo Bonzini8a199802020-09-18 05:37:01 -04001374 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1375 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01001376 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04001377 endif
1378 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01001379 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001380 if default_targets
1381 continue
1382 endif
1383 error('No accelerator available for target @0@'.format(target))
1384 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001385
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001386 actual_target_dirs += target
Paolo Bonzini765686d2020-09-18 06:37:21 -04001387 config_target += keyval.load('default-configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001388 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001389
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001390 if 'TARGET_NEED_FDT' in config_target
1391 fdt_required += target
1392 endif
1393
Paolo Bonzinifa731682020-09-21 05:19:07 -04001394 # Add default keys
1395 if 'TARGET_BASE_ARCH' not in config_target
1396 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1397 endif
1398 if 'TARGET_ABI_DIR' not in config_target
1399 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1400 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001401
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001402 foreach k, v: disassemblers
1403 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1404 foreach sym: v
1405 config_target += { sym: 'y' }
1406 config_all_disas += { sym: 'y' }
1407 endforeach
1408 endif
1409 endforeach
1410
Paolo Bonzini859aef02020-08-04 18:14:26 +02001411 config_target_data = configuration_data()
1412 foreach k, v: config_target
1413 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1414 # do nothing
1415 elif ignored.contains(k)
1416 # do nothing
1417 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001418 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1419 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001420 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001421 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001422 config_target_data.set_quoted(k, v)
1423 elif v == 'y'
1424 config_target_data.set(k, 1)
1425 else
1426 config_target_data.set(k, v)
1427 endif
1428 endforeach
1429 config_target_h += {target: configure_file(output: target + '-config-target.h',
1430 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001431
1432 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001433 config_devices_mak = target + '-config-devices.mak'
1434 config_devices_mak = configure_file(
Paolo Bonzini1bb4cb12020-09-18 06:06:09 -04001435 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001436 output: config_devices_mak,
1437 depfile: config_devices_mak + '.d',
1438 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01001439 command: [minikconf,
1440 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01001441 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzini0a189112020-11-17 14:58:32 +01001442 host_kconfig, accel_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02001443
1444 config_devices_data = configuration_data()
1445 config_devices = keyval.load(config_devices_mak)
1446 foreach k, v: config_devices
1447 config_devices_data.set(k, 1)
1448 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001449 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001450 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1451 configuration: config_devices_data)}
1452 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001453 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001454 endif
1455 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001456endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001457target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001458
Paolo Bonzini2becc362020-02-03 11:42:03 +01001459# This configuration is used to build files that are shared by
1460# multiple binaries, and then extracted out of the "common"
1461# static_library target.
1462#
1463# We do not use all_sources()/all_dependencies(), because it would
1464# build literally all source files, including devices only used by
1465# targets that are not built for this compilation. The CONFIG_ALL
1466# pseudo symbol replaces it.
1467
Paolo Bonzini05512f52020-09-16 15:31:11 -04001468config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001469config_all += config_host
1470config_all += config_all_disas
1471config_all += {
1472 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1473 'CONFIG_SOFTMMU': have_system,
1474 'CONFIG_USER_ONLY': have_user,
1475 'CONFIG_ALL': true,
1476}
1477
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001478##############
1479# Submodules #
1480##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001481
1482capstone = not_found
1483capstone_opt = get_option('capstone')
1484if capstone_opt in ['enabled', 'auto', 'system']
1485 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07001486 capstone = dependency('capstone', version: '>=4.0',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001487 kwargs: static_kwargs, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001488 required: capstone_opt == 'system' or
1489 capstone_opt == 'enabled' and not have_internal)
1490 if capstone.found()
1491 capstone_opt = 'system'
1492 elif have_internal
1493 capstone_opt = 'internal'
1494 else
1495 capstone_opt = 'disabled'
1496 endif
1497endif
1498if capstone_opt == 'internal'
1499 capstone_data = configuration_data()
1500 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1501
1502 capstone_files = files(
1503 'capstone/cs.c',
1504 'capstone/MCInst.c',
1505 'capstone/MCInstrDesc.c',
1506 'capstone/MCRegisterInfo.c',
1507 'capstone/SStream.c',
1508 'capstone/utils.c'
1509 )
1510
1511 if 'CONFIG_ARM_DIS' in config_all_disas
1512 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1513 capstone_files += files(
1514 'capstone/arch/ARM/ARMDisassembler.c',
1515 'capstone/arch/ARM/ARMInstPrinter.c',
1516 'capstone/arch/ARM/ARMMapping.c',
1517 'capstone/arch/ARM/ARMModule.c'
1518 )
1519 endif
1520
1521 # FIXME: This config entry currently depends on a c++ compiler.
1522 # Which is needed for building libvixl, but not for capstone.
1523 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1524 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1525 capstone_files += files(
1526 'capstone/arch/AArch64/AArch64BaseInfo.c',
1527 'capstone/arch/AArch64/AArch64Disassembler.c',
1528 'capstone/arch/AArch64/AArch64InstPrinter.c',
1529 'capstone/arch/AArch64/AArch64Mapping.c',
1530 'capstone/arch/AArch64/AArch64Module.c'
1531 )
1532 endif
1533
1534 if 'CONFIG_PPC_DIS' in config_all_disas
1535 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1536 capstone_files += files(
1537 'capstone/arch/PowerPC/PPCDisassembler.c',
1538 'capstone/arch/PowerPC/PPCInstPrinter.c',
1539 'capstone/arch/PowerPC/PPCMapping.c',
1540 'capstone/arch/PowerPC/PPCModule.c'
1541 )
1542 endif
1543
Richard Henderson3d562842020-01-04 07:24:59 +10001544 if 'CONFIG_S390_DIS' in config_all_disas
1545 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1546 capstone_files += files(
1547 'capstone/arch/SystemZ/SystemZDisassembler.c',
1548 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1549 'capstone/arch/SystemZ/SystemZMapping.c',
1550 'capstone/arch/SystemZ/SystemZModule.c',
1551 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1552 )
1553 endif
1554
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001555 if 'CONFIG_I386_DIS' in config_all_disas
1556 capstone_data.set('CAPSTONE_HAS_X86', 1)
1557 capstone_files += files(
1558 'capstone/arch/X86/X86Disassembler.c',
1559 'capstone/arch/X86/X86DisassemblerDecoder.c',
1560 'capstone/arch/X86/X86ATTInstPrinter.c',
1561 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07001562 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001563 'capstone/arch/X86/X86Mapping.c',
1564 'capstone/arch/X86/X86Module.c'
1565 )
1566 endif
1567
1568 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1569
1570 capstone_cargs = [
1571 # FIXME: There does not seem to be a way to completely replace the c_args
1572 # that come from add_project_arguments() -- we can only add to them.
1573 # So: disable all warnings with a big hammer.
1574 '-Wno-error', '-w',
1575
1576 # Include all configuration defines via a header file, which will wind up
1577 # as a dependency on the object file, and thus changes here will result
1578 # in a rebuild.
1579 '-include', 'capstone-defs.h'
1580 ]
1581
1582 libcapstone = static_library('capstone',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001583 build_by_default: false,
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001584 sources: capstone_files,
1585 c_args: capstone_cargs,
1586 include_directories: 'capstone/include')
1587 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07001588 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001589endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001590
1591slirp = not_found
1592slirp_opt = 'disabled'
1593if have_system
1594 slirp_opt = get_option('slirp')
1595 if slirp_opt in ['enabled', 'auto', 'system']
1596 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001597 slirp = dependency('slirp', kwargs: static_kwargs,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001598 method: 'pkg-config',
1599 required: slirp_opt == 'system' or
1600 slirp_opt == 'enabled' and not have_internal)
1601 if slirp.found()
1602 slirp_opt = 'system'
1603 elif have_internal
1604 slirp_opt = 'internal'
1605 else
1606 slirp_opt = 'disabled'
1607 endif
1608 endif
1609 if slirp_opt == 'internal'
1610 slirp_deps = []
1611 if targetos == 'windows'
1612 slirp_deps = cc.find_library('iphlpapi')
1613 endif
1614 slirp_conf = configuration_data()
1615 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1616 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1617 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1618 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1619 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1620 slirp_files = [
1621 'slirp/src/arp_table.c',
1622 'slirp/src/bootp.c',
1623 'slirp/src/cksum.c',
1624 'slirp/src/dhcpv6.c',
1625 'slirp/src/dnssearch.c',
1626 'slirp/src/if.c',
1627 'slirp/src/ip6_icmp.c',
1628 'slirp/src/ip6_input.c',
1629 'slirp/src/ip6_output.c',
1630 'slirp/src/ip_icmp.c',
1631 'slirp/src/ip_input.c',
1632 'slirp/src/ip_output.c',
1633 'slirp/src/mbuf.c',
1634 'slirp/src/misc.c',
1635 'slirp/src/ncsi.c',
1636 'slirp/src/ndp_table.c',
1637 'slirp/src/sbuf.c',
1638 'slirp/src/slirp.c',
1639 'slirp/src/socket.c',
1640 'slirp/src/state.c',
1641 'slirp/src/stream.c',
1642 'slirp/src/tcp_input.c',
1643 'slirp/src/tcp_output.c',
1644 'slirp/src/tcp_subr.c',
1645 'slirp/src/tcp_timer.c',
1646 'slirp/src/tftp.c',
1647 'slirp/src/udp.c',
1648 'slirp/src/udp6.c',
1649 'slirp/src/util.c',
1650 'slirp/src/version.c',
1651 'slirp/src/vmstate.c',
1652 ]
1653
1654 configure_file(
1655 input : 'slirp/src/libslirp-version.h.in',
1656 output : 'libslirp-version.h',
1657 configuration: slirp_conf)
1658
1659 slirp_inc = include_directories('slirp', 'slirp/src')
1660 libslirp = static_library('slirp',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001661 build_by_default: false,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001662 sources: slirp_files,
1663 c_args: slirp_cargs,
1664 include_directories: slirp_inc)
1665 slirp = declare_dependency(link_with: libslirp,
1666 dependencies: slirp_deps,
1667 include_directories: slirp_inc)
1668 endif
1669endif
1670
Daniele Buonoc7153432021-03-03 21:59:38 -05001671# For CFI, we need to compile slirp as a static library together with qemu.
1672# This is because we register slirp functions as callbacks for QEMU Timers.
1673# When using a system-wide shared libslirp, the type information for the
1674# callback is missing and the timer call produces a false positive with CFI.
1675#
1676# Now that slirp_opt has been defined, check if the selected slirp is compatible
1677# with control-flow integrity.
1678if get_option('cfi') and slirp_opt == 'system'
1679 error('Control-Flow Integrity is not compatible with system-wide slirp.' \
1680 + ' Please configure with --enable-slirp=git')
1681endif
1682
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001683fdt = not_found
1684fdt_opt = get_option('fdt')
1685if have_system
1686 if fdt_opt in ['enabled', 'auto', 'system']
1687 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001688 fdt = cc.find_library('fdt', kwargs: static_kwargs,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001689 required: fdt_opt == 'system' or
1690 fdt_opt == 'enabled' and not have_internal)
1691 if fdt.found() and cc.links('''
1692 #include <libfdt.h>
1693 #include <libfdt_env.h>
1694 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1695 dependencies: fdt)
1696 fdt_opt = 'system'
1697 elif have_internal
1698 fdt_opt = 'internal'
1699 else
1700 fdt_opt = 'disabled'
1701 endif
1702 endif
1703 if fdt_opt == 'internal'
1704 fdt_files = files(
1705 'dtc/libfdt/fdt.c',
1706 'dtc/libfdt/fdt_ro.c',
1707 'dtc/libfdt/fdt_wip.c',
1708 'dtc/libfdt/fdt_sw.c',
1709 'dtc/libfdt/fdt_rw.c',
1710 'dtc/libfdt/fdt_strerror.c',
1711 'dtc/libfdt/fdt_empty_tree.c',
1712 'dtc/libfdt/fdt_addresses.c',
1713 'dtc/libfdt/fdt_overlay.c',
1714 'dtc/libfdt/fdt_check.c',
1715 )
1716
1717 fdt_inc = include_directories('dtc/libfdt')
1718 libfdt = static_library('fdt',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001719 build_by_default: false,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001720 sources: fdt_files,
1721 include_directories: fdt_inc)
1722 fdt = declare_dependency(link_with: libfdt,
1723 include_directories: fdt_inc)
1724 endif
1725endif
1726if not fdt.found() and fdt_required.length() > 0
1727 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1728endif
1729
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001730config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001731config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001732config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001733
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001734#####################
1735# Generated sources #
1736#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001737
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001738genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001739
Marc-André Lureau3f885652019-07-15 18:06:04 +04001740hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04001741shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001742qapi_gen = find_program('scripts/qapi-gen.py')
1743qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1744 meson.source_root() / 'scripts/qapi/commands.py',
1745 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001746 meson.source_root() / 'scripts/qapi/error.py',
1747 meson.source_root() / 'scripts/qapi/events.py',
1748 meson.source_root() / 'scripts/qapi/expr.py',
1749 meson.source_root() / 'scripts/qapi/gen.py',
1750 meson.source_root() / 'scripts/qapi/introspect.py',
1751 meson.source_root() / 'scripts/qapi/parser.py',
1752 meson.source_root() / 'scripts/qapi/schema.py',
1753 meson.source_root() / 'scripts/qapi/source.py',
1754 meson.source_root() / 'scripts/qapi/types.py',
1755 meson.source_root() / 'scripts/qapi/visit.py',
1756 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001757 meson.source_root() / 'scripts/qapi-gen.py'
1758]
1759
1760tracetool = [
1761 python, files('scripts/tracetool.py'),
1762 '--backend=' + config_host['TRACE_BACKENDS']
1763]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00001764tracetool_depends = files(
1765 'scripts/tracetool/backend/log.py',
1766 'scripts/tracetool/backend/__init__.py',
1767 'scripts/tracetool/backend/dtrace.py',
1768 'scripts/tracetool/backend/ftrace.py',
1769 'scripts/tracetool/backend/simple.py',
1770 'scripts/tracetool/backend/syslog.py',
1771 'scripts/tracetool/backend/ust.py',
1772 'scripts/tracetool/format/tcg_h.py',
1773 'scripts/tracetool/format/ust_events_c.py',
1774 'scripts/tracetool/format/ust_events_h.py',
1775 'scripts/tracetool/format/__init__.py',
1776 'scripts/tracetool/format/d.py',
1777 'scripts/tracetool/format/tcg_helper_c.py',
1778 'scripts/tracetool/format/simpletrace_stap.py',
1779 'scripts/tracetool/format/c.py',
1780 'scripts/tracetool/format/h.py',
1781 'scripts/tracetool/format/tcg_helper_h.py',
1782 'scripts/tracetool/format/log_stap.py',
1783 'scripts/tracetool/format/stap.py',
1784 'scripts/tracetool/format/tcg_helper_wrapper_h.py',
1785 'scripts/tracetool/__init__.py',
1786 'scripts/tracetool/transform.py',
1787 'scripts/tracetool/vcpu.py'
1788)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001789
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001790qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1791 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02001792 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001793qemu_version = custom_target('qemu-version.h',
1794 output: 'qemu-version.h',
1795 command: qemu_version_cmd,
1796 capture: true,
1797 build_by_default: true,
1798 build_always_stale: true)
1799genh += qemu_version
1800
Marc-André Lureau3f885652019-07-15 18:06:04 +04001801hxdep = []
1802hx_headers = [
1803 ['qemu-options.hx', 'qemu-options.def'],
1804 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1805]
1806if have_system
1807 hx_headers += [
1808 ['hmp-commands.hx', 'hmp-commands.h'],
1809 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1810 ]
1811endif
1812foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001813 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04001814 input: files(d[0]),
1815 output: d[1],
1816 capture: true,
1817 build_by_default: true, # to be removed when added to a target
1818 command: [hxtool, '-h', '@INPUT0@'])
1819endforeach
1820genh += hxdep
1821
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001822###################
1823# Collect sources #
1824###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001825
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001826authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001827blockdev_ss = ss.source_set()
1828block_ss = ss.source_set()
1829bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001830chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001831common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001832crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001833io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001834linux_user_ss = ss.source_set()
1835qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001836qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001837softmmu_ss = ss.source_set()
1838specific_fuzz_ss = ss.source_set()
1839specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001840stub_ss = ss.source_set()
1841trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001842user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001843util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001844
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001845modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001846hw_arch = {}
1847target_arch = {}
1848target_softmmu_arch = {}
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02001849target_user_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001850
1851###############
1852# Trace files #
1853###############
1854
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001855# TODO: add each directory to the subdirs from its own meson.build, once
1856# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001857trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001858 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01001859 'qapi',
1860 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001861 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01001862 'util',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001863]
1864if have_user
1865 trace_events_subdirs += [ 'linux-user' ]
1866endif
1867if have_block
1868 trace_events_subdirs += [
1869 'authz',
1870 'block',
1871 'io',
1872 'nbd',
1873 'scsi',
1874 ]
1875endif
1876if have_system
1877 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01001878 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001879 'audio',
1880 'backends',
1881 'backends/tpm',
1882 'chardev',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001883 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001884 'hw/9pfs',
1885 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08001886 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001887 'hw/alpha',
1888 'hw/arm',
1889 'hw/audio',
1890 'hw/block',
1891 'hw/block/dataplane',
1892 'hw/char',
1893 'hw/display',
1894 'hw/dma',
1895 'hw/hppa',
1896 'hw/hyperv',
1897 'hw/i2c',
1898 'hw/i386',
1899 'hw/i386/xen',
1900 'hw/ide',
1901 'hw/input',
1902 'hw/intc',
1903 'hw/isa',
1904 'hw/mem',
1905 'hw/mips',
1906 'hw/misc',
1907 'hw/misc/macio',
1908 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08001909 'hw/net/can',
Klaus Jensen88eea452021-04-14 22:14:30 +02001910 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001911 'hw/nvram',
1912 'hw/pci',
1913 'hw/pci-host',
1914 'hw/ppc',
1915 'hw/rdma',
1916 'hw/rdma/vmw',
1917 'hw/rtc',
1918 'hw/s390x',
1919 'hw/scsi',
1920 'hw/sd',
1921 'hw/sparc',
1922 'hw/sparc64',
1923 'hw/ssi',
1924 'hw/timer',
1925 'hw/tpm',
1926 'hw/usb',
1927 'hw/vfio',
1928 'hw/virtio',
1929 'hw/watchdog',
1930 'hw/xen',
1931 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001932 'migration',
1933 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02001934 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001935 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05001936 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001937 ]
1938endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01001939if have_system or have_user
1940 trace_events_subdirs += [
1941 'accel/tcg',
1942 'hw/core',
1943 'target/arm',
1944 'target/hppa',
1945 'target/i386',
1946 'target/i386/kvm',
1947 'target/mips',
1948 'target/ppc',
1949 'target/riscv',
1950 'target/s390x',
1951 'target/sparc',
1952 ]
1953endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001954
Marc-André Lureau0df750e2020-11-25 14:06:37 +04001955vhost_user = not_found
1956if 'CONFIG_VHOST_USER' in config_host
1957 libvhost_user = subproject('libvhost-user')
1958 vhost_user = libvhost_user.get_variable('vhost_user_dep')
1959endif
1960
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001961subdir('qapi')
1962subdir('qobject')
1963subdir('stubs')
1964subdir('trace')
1965subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04001966subdir('qom')
1967subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001968subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04001969subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001970
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001971
1972if enable_modules
1973 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1974 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1975endif
1976
Paolo Bonzini2becc362020-02-03 11:42:03 +01001977stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001978
1979util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01001980util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001981libqemuutil = static_library('qemuutil',
1982 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini7fa1c632021-06-01 10:00:48 +02001983 dependencies: [util_ss.dependencies(), libm, glib, socket, malloc, pixman])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001984qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04001985 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001986
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01001987if have_system or have_user
1988 decodetree = generator(find_program('scripts/decodetree.py'),
1989 output: 'decode-@BASENAME@.c.inc',
1990 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1991 subdir('libdecnumber')
1992 subdir('target')
1993endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001994
Paolo Bonzini478e9432020-08-17 12:47:55 +02001995subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04001996subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04001997subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001998subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04001999subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04002000
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002001if have_block
2002 block_ss.add(files(
2003 'block.c',
2004 'blockjob.c',
2005 'job.c',
2006 'qemu-io-cmds.c',
2007 ))
2008 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002009
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002010 subdir('nbd')
2011 subdir('scsi')
2012 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002013
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002014 blockdev_ss.add(files(
2015 'blockdev.c',
2016 'blockdev-nbd.c',
2017 'iothread.c',
2018 'job-qmp.c',
2019 ), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02002020
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01002021 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
2022 # os-win32.c does not
2023 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
2024 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
2025endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02002026
2027common_ss.add(files('cpus-common.c'))
2028
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02002029subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002030
Richard Hendersonf3433462020-09-12 10:47:33 -07002031common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02002032specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002033
Richard Henderson44b99a62021-03-22 12:24:26 +01002034# Work around a gcc bug/misfeature wherein constant propagation looks
2035# through an alias:
2036# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
2037# to guess that a const variable is always zero. Without lto, this is
2038# impossible, as the alias is restricted to page-vary-common.c. Indeed,
2039# without lto, not even the alias is required -- we simply use different
2040# declarations in different compilation units.
2041pagevary = files('page-vary-common.c')
2042if get_option('b_lto')
2043 pagevary_flags = ['-fno-lto']
2044 if get_option('cfi')
2045 pagevary_flags += '-fno-sanitize=cfi-icall'
2046 endif
2047 pagevary = static_library('page-vary-common', sources: pagevary,
2048 c_args: pagevary_flags)
2049 pagevary = declare_dependency(link_with: pagevary)
2050endif
2051common_ss.add(pagevary)
Richard Henderson6670d4d2021-03-22 12:24:24 +01002052specific_ss.add(files('page-vary.c'))
2053
Marc-André Lureauab318052019-07-24 19:23:16 +04002054subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04002055subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04002056subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002057subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04002058subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04002059subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00002060subdir('semihosting')
Marc-André Lureau582ea952019-08-15 15:15:32 +04002061subdir('hw')
Richard Henderson104cc2c2021-03-08 12:04:33 -08002062subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08002063subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04002064subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002065subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04002066subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04002067subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002068subdir('ebpf')
2069
2070common_ss.add(libbpf)
Marc-André Lureau3a304462019-08-18 16:13:08 +04002071
Marc-André Lureaub309c322019-08-18 19:20:37 +04002072bsd_user_ss.add(files('gdbstub.c'))
2073specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
2074
Marc-André Lureau3a304462019-08-18 16:13:08 +04002075linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
2076specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02002077
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002078# needed for fuzzing binaries
2079subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002080subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002081
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002082########################
2083# Library dependencies #
2084########################
2085
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002086block_mods = []
2087softmmu_mods = []
2088foreach d, list : modules
2089 foreach m, module_ss : list
2090 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02002091 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002092 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
2093 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
2094 if d == 'block'
2095 block_mods += sl
2096 else
2097 softmmu_mods += sl
2098 endif
2099 else
2100 if d == 'block'
2101 block_ss.add_all(module_ss)
2102 else
2103 softmmu_ss.add_all(module_ss)
2104 endif
2105 endif
2106 endforeach
2107endforeach
2108
2109nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08002110undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002111block_syms = custom_target('block.syms', output: 'block.syms',
2112 input: [libqemuutil, block_mods],
2113 capture: true,
2114 command: [undefsym, nm, '@INPUT@'])
2115qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
2116 input: [libqemuutil, softmmu_mods],
2117 capture: true,
2118 command: [undefsym, nm, '@INPUT@'])
2119
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02002120qom_ss = qom_ss.apply(config_host, strict: false)
2121libqom = static_library('qom', qom_ss.sources() + genh,
2122 dependencies: [qom_ss.dependencies()],
2123 name_suffix: 'fa')
2124
2125qom = declare_dependency(link_whole: libqom)
2126
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02002127authz_ss = authz_ss.apply(config_host, strict: false)
2128libauthz = static_library('authz', authz_ss.sources() + genh,
2129 dependencies: [authz_ss.dependencies()],
2130 name_suffix: 'fa',
2131 build_by_default: false)
2132
2133authz = declare_dependency(link_whole: libauthz,
2134 dependencies: qom)
2135
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002136crypto_ss = crypto_ss.apply(config_host, strict: false)
2137libcrypto = static_library('crypto', crypto_ss.sources() + genh,
2138 dependencies: [crypto_ss.dependencies()],
2139 name_suffix: 'fa',
2140 build_by_default: false)
2141
2142crypto = declare_dependency(link_whole: libcrypto,
2143 dependencies: [authz, qom])
2144
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002145io_ss = io_ss.apply(config_host, strict: false)
2146libio = static_library('io', io_ss.sources() + genh,
2147 dependencies: [io_ss.dependencies()],
2148 link_with: libqemuutil,
2149 name_suffix: 'fa',
2150 build_by_default: false)
2151
2152io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
2153
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02002154libmigration = static_library('migration', sources: migration_files + genh,
2155 name_suffix: 'fa',
2156 build_by_default: false)
2157migration = declare_dependency(link_with: libmigration,
2158 dependencies: [zlib, qom, io])
2159softmmu_ss.add(migration)
2160
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002161block_ss = block_ss.apply(config_host, strict: false)
2162libblock = static_library('block', block_ss.sources() + genh,
2163 dependencies: block_ss.dependencies(),
2164 link_depends: block_syms,
2165 name_suffix: 'fa',
2166 build_by_default: false)
2167
2168block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002169 link_args: '@block.syms',
2170 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002171
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002172blockdev_ss = blockdev_ss.apply(config_host, strict: false)
2173libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
2174 dependencies: blockdev_ss.dependencies(),
2175 name_suffix: 'fa',
2176 build_by_default: false)
2177
2178blockdev = declare_dependency(link_whole: [libblockdev],
2179 dependencies: [block])
2180
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002181qmp_ss = qmp_ss.apply(config_host, strict: false)
2182libqmp = static_library('qmp', qmp_ss.sources() + genh,
2183 dependencies: qmp_ss.dependencies(),
2184 name_suffix: 'fa',
2185 build_by_default: false)
2186
2187qmp = declare_dependency(link_whole: [libqmp])
2188
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002189libchardev = static_library('chardev', chardev_ss.sources() + genh,
2190 name_suffix: 'fa',
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002191 dependencies: [gnutls],
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002192 build_by_default: false)
2193
2194chardev = declare_dependency(link_whole: libchardev)
2195
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02002196libhwcore = static_library('hwcore', sources: hwcore_files + genh,
2197 name_suffix: 'fa',
2198 build_by_default: false)
2199hwcore = declare_dependency(link_whole: libhwcore)
2200common_ss.add(hwcore)
2201
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02002202###########
2203# Targets #
2204###########
2205
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002206foreach m : block_mods + softmmu_mods
2207 shared_module(m.name(),
2208 name_prefix: '',
2209 link_whole: m,
2210 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002211 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002212endforeach
2213
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002214softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002215common_ss.add(qom, qemuutil)
2216
2217common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01002218common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
2219
2220common_all = common_ss.apply(config_all, strict: false)
2221common_all = static_library('common',
2222 build_by_default: false,
2223 sources: common_all.sources() + genh,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09002224 implicit_include_directories: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002225 dependencies: common_all.dependencies(),
2226 name_suffix: 'fa')
2227
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002228feature_to_c = find_program('scripts/feature_to_c.sh')
2229
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002230emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002231foreach target : target_dirs
2232 config_target = config_target_mak[target]
2233 target_name = config_target['TARGET_NAME']
2234 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02002235 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002236 arch_deps = []
2237 c_args = ['-DNEED_CPU_H',
2238 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2239 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04002240 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01002241
Paolo Bonzini859aef02020-08-04 18:14:26 +02002242 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01002243 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2244 if targetos == 'linux'
2245 target_inc += include_directories('linux-headers', is_system: true)
2246 endif
2247 if target.endswith('-softmmu')
2248 qemu_target_name = 'qemu-system-' + target_name
2249 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002250 t = target_softmmu_arch[arch].apply(config_target, strict: false)
2251 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002252 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002253
Marc-André Lureau2c442202019-08-17 13:55:58 +04002254 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
2255 hw = hw_arch[hw_dir].apply(config_target, strict: false)
2256 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002257 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04002258
Paolo Bonzini2becc362020-02-03 11:42:03 +01002259 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002260 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002261 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04002262 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002263 target_type='user'
2264 qemu_target_name = 'qemu-' + target_name
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02002265 if arch in target_user_arch
2266 t = target_user_arch[arch].apply(config_target, strict: false)
2267 arch_srcs += t.sources()
2268 arch_deps += t.dependencies()
2269 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002270 if 'CONFIG_LINUX_USER' in config_target
2271 base_dir = 'linux-user'
2272 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
2273 else
2274 base_dir = 'bsd-user'
Stacey Sonea1ab4c2020-12-18 13:54:50 -07002275 target_inc += include_directories('bsd-user/freebsd')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002276 endif
2277 target_inc += include_directories(
2278 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04002279 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002280 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04002281 if 'CONFIG_LINUX_USER' in config_target
2282 dir = base_dir / abi
2283 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
2284 if config_target.has_key('TARGET_SYSTBL_ABI')
2285 arch_srcs += \
2286 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
2287 extra_args : config_target['TARGET_SYSTBL_ABI'])
2288 endif
2289 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002290 endif
2291
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002292 if 'TARGET_XML_FILES' in config_target
2293 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
2294 output: target + '-gdbstub-xml.c',
2295 input: files(config_target['TARGET_XML_FILES'].split()),
2296 command: [feature_to_c, '@INPUT@'],
2297 capture: true)
2298 arch_srcs += gdbstub_xml
2299 endif
2300
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002301 t = target_arch[arch].apply(config_target, strict: false)
2302 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002303 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002304
Paolo Bonzini2becc362020-02-03 11:42:03 +01002305 target_common = common_ss.apply(config_target, strict: false)
2306 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002307 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002308
Paolo Bonzini2becc362020-02-03 11:42:03 +01002309 target_specific = specific_ss.apply(config_target, strict: false)
2310 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002311 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002312
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002313 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02002314 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002315 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002316 objects: objects,
2317 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002318 c_args: c_args,
2319 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002320 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002321
2322 if target.endswith('-softmmu')
2323 execs = [{
2324 'name': 'qemu-system-' + target_name,
2325 'gui': false,
2326 'sources': files('softmmu/main.c'),
2327 'dependencies': []
2328 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002329 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002330 execs += [{
2331 'name': 'qemu-system-' + target_name + 'w',
2332 'gui': true,
2333 'sources': files('softmmu/main.c'),
2334 'dependencies': []
2335 }]
2336 endif
2337 if config_host.has_key('CONFIG_FUZZ')
2338 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
2339 execs += [{
2340 'name': 'qemu-fuzz-' + target_name,
2341 'gui': false,
2342 'sources': specific_fuzz.sources(),
2343 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002344 }]
2345 endif
2346 else
2347 execs = [{
2348 'name': 'qemu-' + target_name,
2349 'gui': false,
2350 'sources': [],
2351 'dependencies': []
2352 }]
2353 endif
2354 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01002355 exe_name = exe['name']
2356 exe_sign = 'CONFIG_HVF' in config_target
2357 if exe_sign
2358 exe_name += '-unsigned'
2359 endif
2360
2361 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09002362 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002363 c_args: c_args,
2364 dependencies: arch_deps + deps + exe['dependencies'],
2365 objects: lib.extract_all_objects(recursive: true),
2366 link_language: link_language,
2367 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
2368 link_args: link_args,
2369 gui_app: exe['gui'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01002370
2371 if exe_sign
2372 emulators += {exe['name'] : custom_target(exe['name'],
Alexander Graf8a74ce62021-01-20 23:44:34 +01002373 depends: emulator,
2374 output: exe['name'],
2375 command: [
2376 meson.current_source_dir() / 'scripts/entitlement.sh',
2377 meson.current_build_dir() / exe_name,
2378 meson.current_build_dir() / exe['name'],
2379 meson.current_source_dir() / 'accel/hvf/entitlements.plist'
2380 ])
2381 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09002382
2383 meson.add_install_script('scripts/entitlement.sh', '--install',
2384 get_option('bindir') / exe_name,
2385 get_option('bindir') / exe['name'],
2386 meson.current_source_dir() / 'accel/hvf/entitlements.plist')
Alexander Graf8a74ce62021-01-20 23:44:34 +01002387 else
2388 emulators += {exe['name']: emulator}
2389 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002390
2391 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
2392 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002393 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
2394 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002395 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
2396 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
2397 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002398 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002399 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002400 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002401 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002402 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002403 command: [
2404 tracetool, '--group=all', '--format=' + stp['fmt'],
2405 '--binary=' + stp['bin'],
2406 '--target-name=' + target_name,
2407 '--target-type=' + target_type,
2408 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01002409 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002410 ],
2411 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002412 endforeach
2413 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002414 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002415endforeach
2416
Paolo Bonzini931049b2020-02-05 09:44:24 +01002417# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002418
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002419if 'CONFIG_PLUGIN' in config_host
2420 install_headers('include/qemu/qemu-plugin.h')
2421endif
2422
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002423if 'CONFIG_GUEST_AGENT' in config_host
2424 subdir('qga')
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002425elif get_option('guest_agent_msi').enabled()
2426 error('Guest agent MSI requested, but the guest agent is not being built')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002427endif
2428
Laurent Vivier9755c942020-08-24 17:24:30 +02002429# Don't build qemu-keymap if xkbcommon is not explicitly enabled
2430# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002431if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04002432 # used for the update-keymaps target, so include rules even if !have_tools
2433 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
2434 dependencies: [qemuutil, xkbcommon], install: have_tools)
2435endif
2436
Paolo Bonzini931049b2020-02-05 09:44:24 +01002437if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002438 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
2439 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
2440 qemu_io = executable('qemu-io', files('qemu-io.c'),
2441 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01002442 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002443 dependencies: [blockdev, qemuutil, gnutls], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002444
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02002445 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002446 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04002447 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002448
Marc-André Lureau157e7b12019-07-15 14:50:58 +04002449 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
2450 dependencies: qemuutil,
2451 install: true)
2452
Paolo Bonzini931049b2020-02-05 09:44:24 +01002453 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02002454 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002455 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04002456 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02002457 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01002458 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002459
2460 if targetos == 'linux'
2461 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2462 dependencies: [qemuutil, libcap_ng],
2463 install: true,
2464 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002465
2466 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2467 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002468 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002469 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002470 endif
2471
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04002472 if 'CONFIG_IVSHMEM' in config_host
2473 subdir('contrib/ivshmem-client')
2474 subdir('contrib/ivshmem-server')
2475 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01002476endif
2477
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04002478subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002479subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04002480subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02002481subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08002482subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01002483if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04002484 subdir('po')
2485endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002486
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002487if host_machine.system() == 'windows'
2488 nsis_cmd = [
2489 find_program('scripts/nsis.py'),
2490 '@OUTPUT@',
2491 get_option('prefix'),
2492 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01002493 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002494 '--',
2495 '-DDISPLAYVERSION=' + meson.project_version(),
2496 ]
2497 if build_docs
2498 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2499 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002500 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002501 nsis_cmd += '-DCONFIG_GTK=y'
2502 endif
2503
2504 nsis = custom_target('nsis',
2505 output: 'qemu-setup-' + meson.project_version() + '.exe',
2506 input: files('qemu.nsi'),
2507 build_always_stale: true,
2508 command: nsis_cmd + ['@INPUT@'])
2509 alias_target('installer', nsis)
2510endif
2511
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002512#########################
2513# Configuration summary #
2514#########################
2515
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002516# Directories
Paolo Bonzinif9332752020-02-03 13:28:38 +01002517summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002518summary_info += {'Install prefix': get_option('prefix')}
2519summary_info += {'BIOS directory': qemu_datadir}
2520summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2521summary_info += {'binary directory': get_option('bindir')}
2522summary_info += {'library directory': get_option('libdir')}
2523summary_info += {'module directory': qemu_moddir}
2524summary_info += {'libexec directory': get_option('libexecdir')}
2525summary_info += {'include directory': get_option('includedir')}
2526summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002527if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002528 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04002529 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002530else
2531 summary_info += {'local state directory': 'queried at runtime'}
2532endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04002533summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002534summary_info += {'Build directory': meson.current_build_dir()}
2535summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002536summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002537summary(summary_info, bool_yn: true, section: 'Directories')
2538
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002539# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002540summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002541summary_info += {'git': config_host['GIT']}
2542summary_info += {'make': config_host['MAKE']}
2543summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
2544summary_info += {'sphinx-build': sphinx_build.found()}
2545if config_host.has_key('HAVE_GDB_BIN')
2546 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2547endif
2548summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2549if targetos == 'windows' and config_host.has_key('CONFIG_GUEST_AGENT')
2550 summary_info += {'wixl': wixl.found() ? wixl.full_path() : false}
2551endif
Joelle van Dyneb8e0c492021-03-15 11:03:41 -07002552if slirp_opt != 'disabled' and 'CONFIG_SLIRP_SMBD' in config_host
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002553 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2554endif
2555summary(summary_info, bool_yn: true, section: 'Host binaries')
2556
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01002557# Configurable features
2558summary_info = {}
2559summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002560summary_info += {'system-mode emulation': have_system}
2561summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002562summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01002563summary_info += {'Install blobs': get_option('install_blobs')}
2564summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2565if config_host.has_key('CONFIG_MODULES')
2566 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2567endif
2568summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2569summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2570if have_system
2571 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2572endif
2573summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2574if config_host['TRACE_BACKENDS'].split().contains('simple')
2575 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2576endif
2577summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2578summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
2579summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2580summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2581summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2582summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
2583summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
2584summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
2585summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2586summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2587summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2588summary(summary_info, bool_yn: true, section: 'Configurable features')
2589
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002590# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002591summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002592summary_info += {'host CPU': cpu}
2593summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01002594summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
2595summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002596if link_language == 'cpp'
Alex Bennée63de9352021-05-27 17:03:15 +01002597 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002598else
2599 summary_info += {'C++ compiler': false}
2600endif
2601if targetos == 'darwin'
Alex Bennée63de9352021-05-27 17:03:15 +01002602 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002603endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002604if targetos == 'windows'
2605 if 'WIN_SDK' in config_host
2606 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2607 endif
2608endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002609summary_info += {'ARFLAGS': config_host['ARFLAGS']}
Paolo Bonzini47b30832020-09-23 05:26:17 -04002610summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2611 + ['-O' + get_option('optimization')]
2612 + (get_option('debug') ? ['-g'] : []))}
2613if link_language == 'cpp'
2614 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2615 + ['-O' + get_option('optimization')]
2616 + (get_option('debug') ? ['-g'] : []))}
2617endif
2618link_args = get_option(link_language + '_link_args')
2619if link_args.length() > 0
2620 summary_info += {'LDFLAGS': ' '.join(link_args)}
2621endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002622summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2623summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002624summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05002625summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002626summary_info += {'PIE': get_option('b_pie')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02002627summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002628summary_info += {'malloc trim support': has_malloc_trim}
2629summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002630summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2631summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2632summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2633summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
2634summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2635summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2636summary_info += {'memory allocator': get_option('malloc')}
2637summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2638summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2639summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
2640summary_info += {'gcov': get_option('b_coverage')}
2641summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2642summary_info += {'CFI support': get_option('cfi')}
2643if get_option('cfi')
2644 summary_info += {'CFI debug support': get_option('cfi_debug')}
2645endif
2646summary_info += {'strip binaries': get_option('strip')}
2647summary_info += {'sparse': sparse.found() ? sparse.full_path() : false}
2648summary_info += {'mingw32 support': targetos == 'windows'}
Alex Bennée49e85652021-02-22 10:14:50 +00002649
2650# snarf the cross-compilation information for tests
2651foreach target: target_dirs
2652 tcg_mak = meson.current_build_dir() / 'tests/tcg' / 'config-' + target + '.mak'
2653 if fs.exists(tcg_mak)
2654 config_cross_tcg = keyval.load(tcg_mak)
2655 target = config_cross_tcg['TARGET_NAME']
2656 compiler = ''
2657 if 'DOCKER_CROSS_CC_GUEST' in config_cross_tcg
2658 summary_info += {target + ' tests': config_cross_tcg['DOCKER_CROSS_CC_GUEST'] +
2659 ' via ' + config_cross_tcg['DOCKER_IMAGE']}
2660 elif 'CROSS_CC_GUEST' in config_cross_tcg
2661 summary_info += {target + ' tests'
2662 : config_cross_tcg['CROSS_CC_GUEST'] }
2663 endif
2664 endif
2665endforeach
2666
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002667summary(summary_info, bool_yn: true, section: 'Compilation')
2668
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002669# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002670summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002671if have_system
2672 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2673 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2674 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2675 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
Reinoud Zandijk74a414a2021-04-02 22:25:32 +02002676 summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002677 summary_info += {'Xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2678 if config_host.has_key('CONFIG_XEN_BACKEND')
2679 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2680 endif
2681endif
2682summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2683if config_all.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01002684 if get_option('tcg_interpreter')
2685 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, experimental and slow)'}
2686 else
2687 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
2688 endif
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002689 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002690endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002691summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002692if have_system
2693 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01002694 summary_info += {'out of process emulation': multiprocess_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002695endif
2696summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
2697
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002698# Block layer
2699summary_info = {}
2700summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2701summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2702if have_block
2703 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2704 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
2705 summary_info += {'VirtFS support': have_virtfs}
2706 summary_info += {'build virtiofs daemon': have_virtiofsd}
2707 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
2708 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2709 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2710 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2711 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2712 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2713 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2714 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2715 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2716 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002717 summary_info += {'FUSE exports': fuse.found()}
2718endif
2719summary(summary_info, bool_yn: true, section: 'Block layer support')
2720
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002721# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002722summary_info = {}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002723summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
Paolo Bonzini57612512021-06-03 11:15:26 +02002724summary_info += {'GNUTLS support': gnutls.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002725# TODO: add back version
Paolo Bonzini57612512021-06-03 11:15:26 +02002726summary_info += {'libgcrypt': gcrypt.found()}
2727if gcrypt.found()
2728 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002729endif
2730# TODO: add back version
Paolo Bonzini57612512021-06-03 11:15:26 +02002731summary_info += {'nettle': nettle.found()}
2732if nettle.found()
2733 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002734endif
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002735summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
2736summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2737summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
2738summary(summary_info, bool_yn: true, section: 'Crypto')
2739
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01002740# Libraries
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002741summary_info = {}
2742if targetos == 'darwin'
2743 summary_info += {'Cocoa support': cocoa.found()}
2744endif
2745# TODO: add back version
2746summary_info += {'SDL support': sdl.found()}
2747summary_info += {'SDL image support': sdl_image.found()}
2748# TODO: add back version
2749summary_info += {'GTK support': gtk.found()}
2750summary_info += {'pixman': pixman.found()}
2751# TODO: add back version
2752summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002753# TODO: add back version
2754summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
Paolo Bonziniba7ed402021-06-03 11:15:26 +02002755summary_info += {'libtasn1': tasn1.found()}
Paolo Bonzini05e391a2021-06-03 11:15:26 +02002756summary_info += {'PAM': pam.found()}
Yonggang Luo5285e592020-10-13 07:43:48 +08002757summary_info += {'iconv support': iconv.found()}
2758summary_info += {'curses support': curses.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002759# TODO: add back version
2760summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002761summary_info += {'curl support': curl.found()}
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002762summary_info += {'Multipath support': mpathpersist.found()}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002763summary_info += {'VNC support': vnc.found()}
2764if vnc.found()
2765 summary_info += {'VNC SASL support': sasl.found()}
2766 summary_info += {'VNC JPEG support': jpeg.found()}
2767 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002768endif
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002769summary_info += {'brlapi support': brlapi.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002770summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2771summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2772summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2773summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002774summary_info += {'ATTR/XATTR support': libattr.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002775summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2776summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002777summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002778summary_info += {'libcap-ng support': libcap_ng.found()}
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002779summary_info += {'bpf support': libbpf.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002780# TODO: add back protocol and server version
2781summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002782summary_info += {'rbd support': rbd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002783summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
2784summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02002785summary_info += {'U2F support': u2f.found()}
Paolo Bonzini90540f32021-06-03 11:15:26 +02002786summary_info += {'libusb': libusb.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002787summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
2788summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
Akihiko Odakibc6a3562021-02-23 15:03:07 +09002789summary_info += {'GBM': config_host.has_key('CONFIG_GBM')}
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002790summary_info += {'libiscsi support': libiscsi.found()}
Paolo Bonzini30045c02020-11-17 13:11:25 +01002791summary_info += {'libnfs support': libnfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002792if targetos == 'windows'
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002793 if config_host.has_key('CONFIG_GUEST_AGENT')
2794 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2795 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002796 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002797endif
Paolo Bonzini90835c22020-11-17 14:22:24 +01002798summary_info += {'seccomp support': seccomp.found()}
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002799summary_info += {'GlusterFS support': glusterfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002800summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2801summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002802summary_info += {'lzo support': lzo.found()}
Paolo Bonzini241611e2020-11-17 13:32:34 +01002803summary_info += {'snappy support': snappy.found()}
Paolo Bonzini29ba6112020-11-17 13:07:52 +01002804summary_info += {'bzip2 support': libbzip2.found()}
Paolo Bonziniecea3692020-11-17 13:35:28 +01002805summary_info += {'lzfse support': liblzfse.found()}
Paolo Bonzinib1def332020-11-17 13:37:39 +01002806summary_info += {'zstd support': zstd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002807summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2808summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002809summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002810summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2811summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002812summary_info += {'libudev': libudev.found()}
Max Reitzdf4ea702020-10-27 20:05:46 +01002813summary_info += {'FUSE lseek': fuse_lseek.found()}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01002814summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01002815
2816if not supported_cpus.contains(cpu)
2817 message()
2818 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2819 message()
2820 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2821 message('The QEMU project intends to remove support for this host CPU in')
2822 message('a future release if nobody volunteers to maintain it and to')
2823 message('provide a build host for our continuous integration setup.')
2824 message('configure has succeeded and you can continue to build, but')
2825 message('if you care about QEMU on this platform you should contact')
2826 message('us upstream at qemu-devel@nongnu.org.')
2827endif
2828
2829if not supported_oses.contains(targetos)
2830 message()
2831 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2832 message()
2833 message('Host OS ' + targetos + 'support is not currently maintained.')
2834 message('The QEMU project intends to remove support for this host OS in')
2835 message('a future release if nobody volunteers to maintain it and to')
2836 message('provide a build host for our continuous integration setup.')
2837 message('configure has succeeded and you can continue to build, but')
2838 message('if you care about QEMU on this platform you should contact')
2839 message('us upstream at qemu-devel@nongnu.org.')
2840endif