blob: 5bd22f431a93a9b0d61dfc6a1a8f1cdd954b8d52 [file] [log] [blame]
Paolo Bonzinia5665052019-06-10 12:05:14 +02001project('qemu', ['c'], meson_version: '>=0.55.0',
Paolo Bonzinia5cb7c52020-10-19 06:56:16 -04002 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_colorout=auto'] +
3 (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'],
90 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
91 }
92endif
93
Philippe Mathieu-Daudéeae9a1d2021-01-14 18:45:08 +010094edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
95install_edk2_blobs = false
96if get_option('install_blobs')
97 foreach target : target_dirs
98 install_edk2_blobs = install_edk2_blobs or target in edk2_targets
99 endforeach
100endif
101
Philippe Mathieu-Daudé45b545d2021-01-14 18:45:09 +0100102bzip2 = find_program('bzip2', required: install_edk2_blobs)
103
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400104##################
105# Compiler flags #
106##################
107
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400108# Specify linker-script with add_project_link_arguments so that it is not placed
109# within a linker --start-group/--end-group pair
110if 'CONFIG_FUZZ' in config_host
111 add_project_link_arguments(['-Wl,-T,',
112 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
113 native: false, language: ['c', 'cpp', 'objc'])
114endif
115
Marc-André Lureau5fc06172021-01-14 16:56:02 +0400116add_global_arguments(config_host['QEMU_CFLAGS'].split(),
117 native: false, language: ['c', 'objc'])
118add_global_arguments(config_host['QEMU_CXXFLAGS'].split(),
119 native: false, language: 'cpp')
120add_global_link_arguments(config_host['QEMU_LDFLAGS'].split(),
121 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzinia5665052019-06-10 12:05:14 +0200122
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400123if targetos == 'linux'
124 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
125 '-isystem', 'linux-headers',
126 language: ['c', 'cpp'])
127endif
128
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100129add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400130 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400131 '-iquote', meson.current_source_dir() / 'include',
132 '-iquote', meson.current_source_dir() / 'disas/libvixl',
133 language: ['c', 'cpp', 'objc'])
Alexander Bulekovc46f76d2020-09-02 13:36:50 -0400134
Marc-André Lureaufc929892019-07-13 01:47:54 +0400135link_language = meson.get_external_property('link_language', 'cpp')
136if link_language == 'cpp'
137 add_languages('cpp', required: true, native: false)
138endif
Paolo Bonzinia5665052019-06-10 12:05:14 +0200139if host_machine.system() == 'darwin'
140 add_languages('objc', required: false, native: false)
141endif
142
Paolo Bonzinideb62372020-09-01 07:51:16 -0400143sparse = find_program('cgcc', required: get_option('sparse'))
144if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100145 run_target('sparse',
146 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400147 'compile_commands.json', sparse.full_path(), '-Wbitwise',
148 '-Wno-transparent-union', '-Wno-old-initializer',
149 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100150endif
151
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200152###########################################
153# Target-specific checks and dependencies #
154###########################################
155
156if targetos != 'linux' and get_option('mpath').enabled()
157 error('Multipath is supported only on Linux')
158endif
159
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400160m = cc.find_library('m', required: false)
161util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200162winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400163socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400164version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400165coref = []
166iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400167emulator_link_args = []
Paolo Bonzini8a199802020-09-18 05:37:01 -0400168hvf = not_found
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400169if targetos == 'windows'
170 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200171 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400172
173 win = import('windows')
174 version_res = win.compile_resources('version.rc',
175 depend_files: files('pc-bios/qemu-nsis.ico'),
176 include_directories: include_directories('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400177elif targetos == 'darwin'
178 coref = dependency('appleframeworks', modules: 'CoreFoundation')
179 iokit = dependency('appleframeworks', modules: 'IOKit')
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200180elif targetos == 'sunos'
181 socket = [cc.find_library('socket'),
182 cc.find_library('nsl'),
183 cc.find_library('resolv')]
184elif targetos == 'haiku'
185 socket = [cc.find_library('posix_error_mapper'),
186 cc.find_library('network'),
187 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400188elif targetos == 'openbsd'
189 if not get_option('tcg').disabled() and target_dirs.length() > 0
190 # Disable OpenBSD W^X if available
191 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
192 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400193endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200194
Paolo Bonzini8a199802020-09-18 05:37:01 -0400195accelerators = []
196if not get_option('kvm').disabled() and targetos == 'linux'
197 accelerators += 'CONFIG_KVM'
198endif
199if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
200 accelerators += 'CONFIG_XEN'
201 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
202else
203 have_xen_pci_passthrough = false
204endif
205if not get_option('whpx').disabled() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000206 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400207 error('WHPX requires 64-bit host')
208 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
209 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
210 accelerators += 'CONFIG_WHPX'
211 endif
212endif
213if not get_option('hvf').disabled()
214 hvf = dependency('appleframeworks', modules: 'Hypervisor',
215 required: get_option('hvf'))
216 if hvf.found()
217 accelerators += 'CONFIG_HVF'
218 endif
219endif
220if not get_option('hax').disabled()
221 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
222 accelerators += 'CONFIG_HAX'
223 endif
224endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100225
226tcg_arch = config_host['ARCH']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400227if not get_option('tcg').disabled()
228 if cpu not in supported_cpus
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100229 if get_option('tcg_interpreter')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400230 warning('Unsupported CPU @0@, will use TCG with TCI (experimental)'.format(cpu))
231 else
232 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
233 endif
234 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100235 if get_option('tcg_interpreter')
236 tcg_arch = 'tci'
237 elif config_host['ARCH'] == 'sparc64'
238 tcg_arch = 'sparc'
239 elif config_host['ARCH'] == 's390x'
240 tcg_arch = 's390'
241 elif config_host['ARCH'] in ['x86_64', 'x32']
242 tcg_arch = 'i386'
243 elif config_host['ARCH'] == 'ppc64'
244 tcg_arch = 'ppc'
245 elif config_host['ARCH'] in ['riscv32', 'riscv64']
246 tcg_arch = 'riscv'
247 endif
248 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
249 '-iquote', meson.current_source_dir() / 'accel/tcg',
250 language: ['c', 'cpp', 'objc'])
251
Paolo Bonzini8a199802020-09-18 05:37:01 -0400252 accelerators += 'CONFIG_TCG'
253 config_host += { 'CONFIG_TCG': 'y' }
254endif
255
256if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
257 error('KVM not available on this platform')
258endif
259if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
260 error('HVF not available on this platform')
261endif
262if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
263 error('WHPX not available on this platform')
264endif
265if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
266 if 'CONFIG_XEN' in accelerators
267 error('Xen PCI passthrough not available on this platform')
268 else
269 error('Xen PCI passthrough requested but Xen not enabled')
270 endif
271endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400272
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200273################
274# Dependencies #
275################
276
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400277# The path to glib.h is added to all compilation commands. This was
278# grandfathered in from the QEMU Makefiles.
279add_project_arguments(config_host['GLIB_CFLAGS'].split(),
280 native: false, language: ['c', 'cpp', 'objc'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400281glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
282 link_args: config_host['GLIB_LIBS'].split())
283# override glib dep with the configure results (for subprojects)
284meson.override_dependency('glib-2.0', glib)
285
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400286gio = not_found
287if 'CONFIG_GIO' in config_host
288 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
289 link_args: config_host['GIO_LIBS'].split())
290endif
291lttng = not_found
292if 'CONFIG_TRACE_UST' in config_host
293 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
294endif
295urcubp = not_found
296if 'CONFIG_TRACE_UST' in config_host
297 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
298endif
Daniel P. Berrangé46859d92020-09-01 14:30:49 +0100299gcrypt = not_found
300if 'CONFIG_GCRYPT' in config_host
301 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
302 link_args: config_host['GCRYPT_LIBS'].split())
303endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400304nettle = not_found
305if 'CONFIG_NETTLE' in config_host
306 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
307 link_args: config_host['NETTLE_LIBS'].split())
308endif
309gnutls = not_found
310if 'CONFIG_GNUTLS' in config_host
311 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
312 link_args: config_host['GNUTLS_LIBS'].split())
313endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200314pixman = not_found
315if have_system or have_tools
316 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100317 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200318endif
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400319pam = not_found
320if 'CONFIG_AUTH_PAM' in config_host
321 pam = cc.find_library('pam')
322endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400323libaio = cc.find_library('aio', required: false)
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100324zlib = dependency('zlib', required: true, kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400325linux_io_uring = not_found
326if 'CONFIG_LINUX_IO_URING' in config_host
327 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
328 link_args: config_host['LINUX_IO_URING_LIBS'].split())
329endif
330libxml2 = not_found
331if 'CONFIG_LIBXML2' in config_host
332 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
333 link_args: config_host['LIBXML2_LIBS'].split())
334endif
335libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +0100336if not get_option('libnfs').auto() or have_block
337 libnfs = dependency('libnfs', version: '>=1.9.3',
338 required: get_option('libnfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100339 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400340endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100341
342libattr_test = '''
343 #include <stddef.h>
344 #include <sys/types.h>
345 #ifdef CONFIG_LIBATTR
346 #include <attr/xattr.h>
347 #else
348 #include <sys/xattr.h>
349 #endif
350 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
351
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400352libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100353have_old_libattr = false
354if not get_option('attr').disabled()
355 if cc.links(libattr_test)
356 libattr = declare_dependency()
357 else
358 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
359 required: get_option('attr'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100360 kwargs: static_kwargs)
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100361 if libattr.found() and not \
362 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
363 libattr = not_found
364 if get_option('attr').enabled()
365 error('could not link libattr')
366 else
367 warning('could not link libattr, disabling')
368 endif
369 else
370 have_old_libattr = libattr.found()
371 endif
372 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400373endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100374
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100375cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
376if cocoa.found() and get_option('sdl').enabled()
377 error('Cocoa and SDL cannot be enabled at the same time')
378endif
379if cocoa.found() and get_option('gtk').enabled()
380 error('Cocoa and GTK+ cannot be enabled at the same time')
381endif
382
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100383seccomp = not_found
Paolo Bonzini90835c22020-11-17 14:22:24 +0100384if not get_option('seccomp').auto() or have_system or have_tools
385 seccomp = dependency('libseccomp', version: '>=2.3.0',
386 required: get_option('seccomp'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100387 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100388endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100389
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100390libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100391if not get_option('cap_ng').auto() or have_system or have_tools
392 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
393 required: get_option('cap_ng'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100394 kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100395endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100396if libcap_ng.found() and not cc.links('''
397 #include <cap-ng.h>
398 int main(void)
399 {
400 capng_capability_to_name(CAPNG_EFFECTIVE);
401 return 0;
402 }''', dependencies: libcap_ng)
403 libcap_ng = not_found
404 if get_option('cap_ng').enabled()
405 error('could not link libcap-ng')
406 else
407 warning('could not link libcap-ng, disabling')
408 endif
409endif
410
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400411if get_option('xkbcommon').auto() and not have_system and not have_tools
412 xkbcommon = not_found
413else
414 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100415 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400416endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400417vde = not_found
418if config_host.has_key('CONFIG_VDE')
419 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
420endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200421pulse = not_found
422if 'CONFIG_LIBPULSE' in config_host
423 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
424 link_args: config_host['PULSE_LIBS'].split())
425endif
426alsa = not_found
427if 'CONFIG_ALSA' in config_host
428 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
429 link_args: config_host['ALSA_LIBS'].split())
430endif
431jack = not_found
432if 'CONFIG_LIBJACK' in config_host
433 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
434endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200435spice = not_found
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200436spice_headers = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200437if 'CONFIG_SPICE' in config_host
438 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
439 link_args: config_host['SPICE_LIBS'].split())
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200440 spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
Paolo Bonzini26347332019-07-29 15:40:07 +0200441endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400442rt = cc.find_library('rt', required: false)
Paolo Bonziniccf7afa2020-09-01 06:44:23 -0400443libdl = not_found
444if 'CONFIG_PLUGIN' in config_host
445 libdl = cc.find_library('dl', required: true)
446endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200447libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100448if not get_option('libiscsi').auto() or have_block
449 libiscsi = dependency('libiscsi', version: '>=1.9.0',
450 required: get_option('libiscsi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100451 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini99650b62019-06-10 12:21:14 +0200452endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400453zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +0100454if not get_option('zstd').auto() or have_block
455 zstd = dependency('libzstd', version: '>=1.4.0',
456 required: get_option('zstd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100457 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400458endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400459gbm = not_found
460if 'CONFIG_GBM' in config_host
461 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
462 link_args: config_host['GBM_LIBS'].split())
463endif
464virgl = not_found
465if 'CONFIG_VIRGL' in config_host
466 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
467 link_args: config_host['VIRGL_LIBS'].split())
468endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400469curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100470if not get_option('curl').auto() or have_block
471 curl = dependency('libcurl', version: '>=7.29.0',
472 method: 'pkg-config',
473 required: get_option('curl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100474 kwargs: static_kwargs)
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400475endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200476libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200477if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200478 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +0100479 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400480 required: get_option('libudev'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100481 kwargs: static_kwargs)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200482endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200483
Paolo Bonzini5c530152020-10-15 06:09:27 -0400484mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200485mpathpersist = not_found
486mpathpersist_new_api = false
487if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
488 mpath_test_source_new = '''
489 #include <libudev.h>
490 #include <mpath_persist.h>
491 unsigned mpath_mx_alloc_len = 1024;
492 int logsink;
493 static struct config *multipath_conf;
494 extern struct udev *udev;
495 extern struct config *get_multipath_config(void);
496 extern void put_multipath_config(struct config *conf);
497 struct udev *udev;
498 struct config *get_multipath_config(void) { return multipath_conf; }
499 void put_multipath_config(struct config *conf) { }
500 int main(void) {
501 udev = udev_new();
502 multipath_conf = mpath_lib_init();
503 return 0;
504 }'''
505 mpath_test_source_old = '''
506 #include <libudev.h>
507 #include <mpath_persist.h>
508 unsigned mpath_mx_alloc_len = 1024;
509 int logsink;
510 int main(void) {
511 struct udev *udev = udev_new();
512 mpath_lib_init(udev);
513 return 0;
514 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400515 libmpathpersist = cc.find_library('mpathpersist',
516 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100517 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400518 if libmpathpersist.found()
519 mpathlibs += libmpathpersist
520 if enable_static
521 mpathlibs += cc.find_library('devmapper',
522 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100523 kwargs: static_kwargs)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200524 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400525 mpathlibs += cc.find_library('multipath',
526 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100527 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400528 foreach lib: mpathlibs
529 if not lib.found()
530 mpathlibs = []
531 break
532 endif
533 endforeach
534 if mpathlibs.length() == 0
535 msg = 'Dependencies missing for libmpathpersist'
536 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200537 mpathpersist = declare_dependency(dependencies: mpathlibs)
538 mpathpersist_new_api = true
539 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
540 mpathpersist = declare_dependency(dependencies: mpathlibs)
541 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400542 msg = 'Cannot detect libmpathpersist API'
543 endif
544 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200545 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400546 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200547 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400548 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200549 endif
550 endif
551 endif
552endif
553
Yonggang Luo5285e592020-10-13 07:43:48 +0800554iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800555curses = not_found
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400556if have_system and not get_option('curses').disabled()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400557 curses_test = '''
558 #include <locale.h>
559 #include <curses.h>
560 #include <wchar.h>
561 int main(void) {
562 wchar_t wch = L'w';
563 setlocale(LC_ALL, "");
564 resize_term(0, 0);
565 addwstr(L"wide chars\n");
566 addnwstr(&wch, 1);
567 add_wch(WACS_DEGREE);
568 return 0;
569 }'''
570
Yonggang Luoca31e302020-11-17 05:31:06 +0800571 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
572 foreach curses_dep : curses_dep_list
573 if not curses.found()
574 curses = dependency(curses_dep,
575 required: false,
576 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100577 kwargs: static_kwargs)
Yonggang Luoca31e302020-11-17 05:31:06 +0800578 endif
579 endforeach
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400580 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500581 curses_compile_args = ['-DNCURSES_WIDECHAR']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400582 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500583 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
584 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400585 else
586 msg = 'curses package not usable'
587 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800588 endif
589 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400590 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400591 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
592 if targetos != 'windows' and not has_curses_h
593 message('Trying with /usr/include/ncursesw')
594 curses_compile_args += ['-I/usr/include/ncursesw']
595 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
596 endif
597 if has_curses_h
598 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
599 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800600 libcurses = cc.find_library(curses_libname,
601 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100602 kwargs: static_kwargs)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400603 if libcurses.found()
604 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
605 curses = declare_dependency(compile_args: curses_compile_args,
606 dependencies: [libcurses])
607 break
608 else
609 msg = 'curses library not usable'
610 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800611 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400612 endforeach
613 endif
614 endif
615 if not get_option('iconv').disabled()
616 foreach link_args : [ ['-liconv'], [] ]
617 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
618 # We need to use libiconv if available because mixing libiconv's headers with
619 # the system libc does not work.
620 # However, without adding glib to the dependencies -L/usr/local/lib will not be
621 # included in the command line and libiconv will not be found.
622 if cc.links('''
623 #include <iconv.h>
624 int main(void) {
625 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
626 return conv != (iconv_t) -1;
627 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
628 iconv = declare_dependency(link_args: link_args, dependencies: glib)
629 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800630 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400631 endforeach
632 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400633 if curses.found() and not iconv.found()
634 if get_option('iconv').enabled()
635 error('iconv not available')
636 endif
637 msg = 'iconv required for curses UI but not available'
638 curses = not_found
639 endif
640 if not curses.found() and msg != ''
641 if get_option('curses').enabled()
642 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400643 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400644 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400645 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800646 endif
647endif
648
Paolo Bonzini26347332019-07-29 15:40:07 +0200649brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100650if not get_option('brlapi').auto() or have_system
651 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
652 required: get_option('brlapi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100653 kwargs: static_kwargs)
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100654 if brlapi.found() and not cc.links('''
655 #include <brlapi.h>
656 #include <stddef.h>
657 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
658 brlapi = not_found
659 if get_option('brlapi').enabled()
660 error('could not link brlapi')
661 else
662 warning('could not link brlapi, disabling')
663 endif
664 endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200665endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100666
Paolo Bonzini760e4322020-08-26 08:09:48 +0200667sdl = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100668if not get_option('sdl').auto() or (have_system and not cocoa.found())
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100669 sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200670 sdl_image = not_found
671endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100672if sdl.found()
673 # work around 2.0.8 bug
674 sdl = declare_dependency(compile_args: '-Wno-undef',
675 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200676 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100677 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100678else
679 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100680 error('sdl-image required, but SDL was @0@'.format(
681 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100682 endif
683 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200684endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100685
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400686rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100687if not get_option('rbd').auto() or have_block
688 librados = cc.find_library('rados', required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100689 kwargs: static_kwargs)
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100690 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
691 required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100692 kwargs: static_kwargs)
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100693 if librados.found() and librbd.found()
694 if cc.links('''
695 #include <stdio.h>
696 #include <rbd/librbd.h>
697 int main(void) {
698 rados_t cluster;
699 rados_create(&cluster, NULL);
700 return 0;
701 }''', dependencies: [librbd, librados])
702 rbd = declare_dependency(dependencies: [librbd, librados])
703 elif get_option('rbd').enabled()
704 error('could not link librados')
705 else
706 warning('could not link librados, disabling')
707 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100708 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400709endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100710
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400711glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100712glusterfs_ftruncate_has_stat = false
713glusterfs_iocb_has_stat = false
714if not get_option('glusterfs').auto() or have_block
715 glusterfs = dependency('glusterfs-api', version: '>=3',
716 required: get_option('glusterfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100717 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100718 if glusterfs.found()
719 glusterfs_ftruncate_has_stat = cc.links('''
720 #include <glusterfs/api/glfs.h>
721
722 int
723 main(void)
724 {
725 /* new glfs_ftruncate() passes two additional args */
726 return glfs_ftruncate(NULL, 0, NULL, NULL);
727 }
728 ''', dependencies: glusterfs)
729 glusterfs_iocb_has_stat = cc.links('''
730 #include <glusterfs/api/glfs.h>
731
732 /* new glfs_io_cbk() passes two additional glfs_stat structs */
733 static void
734 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
735 {}
736
737 int
738 main(void)
739 {
740 glfs_io_cbk iocb = &glusterfs_iocb;
741 iocb(NULL, 0 , NULL, NULL, NULL);
742 return 0;
743 }
744 ''', dependencies: glusterfs)
745 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400746endif
747libssh = not_found
748if 'CONFIG_LIBSSH' in config_host
749 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
750 link_args: config_host['LIBSSH_LIBS'].split())
751endif
752libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100753if not get_option('bzip2').auto() or have_block
754 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
755 required: get_option('bzip2'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100756 kwargs: static_kwargs)
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100757 if libbzip2.found() and not cc.links('''
758 #include <bzlib.h>
759 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
760 libbzip2 = not_found
761 if get_option('bzip2').enabled()
762 error('could not link libbzip2')
763 else
764 warning('could not link libbzip2, disabling')
765 endif
766 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400767endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100768
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400769liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +0100770if not get_option('lzfse').auto() or have_block
771 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
772 required: get_option('lzfse'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100773 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400774endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100775if liblzfse.found() and not cc.links('''
776 #include <lzfse.h>
777 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
778 liblzfse = not_found
779 if get_option('lzfse').enabled()
780 error('could not link liblzfse')
781 else
782 warning('could not link liblzfse, disabling')
783 endif
784endif
785
Paolo Bonzini478e9432020-08-17 12:47:55 +0200786oss = not_found
787if 'CONFIG_AUDIO_OSS' in config_host
788 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
789endif
790dsound = not_found
791if 'CONFIG_AUDIO_DSOUND' in config_host
792 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
793endif
794coreaudio = not_found
795if 'CONFIG_AUDIO_COREAUDIO' in config_host
796 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
797endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400798opengl = not_found
799if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400800 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
801 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400802endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100803
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400804gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +0100805gtkx11 = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100806if not get_option('gtk').auto() or (have_system and not cocoa.found())
Paolo Bonzini1b695472021-01-07 14:02:29 +0100807 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
808 method: 'pkg-config',
809 required: get_option('gtk'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100810 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +0100811 if gtk.found()
812 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
813 method: 'pkg-config',
814 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100815 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +0100816 gtk = declare_dependency(dependencies: [gtk, gtkx11])
817 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400818endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100819
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400820vte = not_found
821if 'CONFIG_VTE' in config_host
822 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
823 link_args: config_host['VTE_LIBS'].split())
824endif
825x11 = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +0100826if gtkx11.found() or 'lm32-softmmu' in target_dirs
827 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100828 kwargs: static_kwargs)
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400829endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100830vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400831png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400832jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400833sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100834if get_option('vnc').enabled()
835 vnc = declare_dependency() # dummy dependency
836 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100837 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini8e242b32020-11-23 13:34:02 -0500838 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100839 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100840 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
841 required: get_option('vnc_sasl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100842 kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100843 if sasl.found()
844 sasl = declare_dependency(dependencies: sasl,
845 compile_args: '-DSTRUCT_IOVEC_DEFINED')
846 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400847endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100848
Marc-André Lureau708eab42019-09-03 16:59:33 +0400849snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +0100850if not get_option('snappy').auto() or have_system
851 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
852 required: get_option('snappy'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100853 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400854endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100855if snappy.found() and not cc.links('''
856 #include <snappy-c.h>
857 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
858 snappy = not_found
859 if get_option('snappy').enabled()
860 error('could not link libsnappy')
861 else
862 warning('could not link libsnappy, disabling')
863 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400864endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100865
Marc-André Lureau708eab42019-09-03 16:59:33 +0400866lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100867if not get_option('lzo').auto() or have_system
868 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
869 required: get_option('lzo'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100870 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400871endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100872if lzo.found() and not cc.links('''
873 #include <lzo/lzo1x.h>
874 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
875 lzo = not_found
876 if get_option('lzo').enabled()
877 error('could not link liblzo2')
878 else
879 warning('could not link liblzo2, disabling')
880 endif
881endif
882
Marc-André Lureau55166232019-07-24 19:16:22 +0400883rdma = not_found
884if 'CONFIG_RDMA' in config_host
885 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
886endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400887numa = not_found
888if 'CONFIG_NUMA' in config_host
889 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
890endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400891xen = not_found
892if 'CONFIG_XEN_BACKEND' in config_host
893 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
894 link_args: config_host['XEN_LIBS'].split())
895endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200896cacard = not_found
897if 'CONFIG_SMARTCARD' in config_host
898 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
899 link_args: config_host['SMARTCARD_LIBS'].split())
900endif
César Belley0a40bcb2020-08-26 13:42:04 +0200901u2f = not_found
902if have_system
903 u2f = dependency('u2f-emu', required: get_option('u2f'),
904 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100905 kwargs: static_kwargs)
César Belley0a40bcb2020-08-26 13:42:04 +0200906endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200907usbredir = not_found
908if 'CONFIG_USB_REDIR' in config_host
909 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
910 link_args: config_host['USB_REDIR_LIBS'].split())
911endif
912libusb = not_found
913if 'CONFIG_USB_LIBUSB' in config_host
914 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
915 link_args: config_host['LIBUSB_LIBS'].split())
916endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400917libpmem = not_found
918if 'CONFIG_LIBPMEM' in config_host
919 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
920 link_args: config_host['LIBPMEM_LIBS'].split())
921endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600922libdaxctl = not_found
923if 'CONFIG_LIBDAXCTL' in config_host
924 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
925endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +0400926tasn1 = not_found
927if 'CONFIG_TASN1' in config_host
928 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
929 link_args: config_host['TASN1_LIBS'].split())
930endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400931keyutils = dependency('libkeyutils', required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100932 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400933
Marc-André Lureau3909def2020-08-28 15:07:33 +0400934has_gettid = cc.has_function('gettid')
935
Paolo Bonziniaa087962020-09-01 11:15:30 -0400936# Malloc tests
937
938malloc = []
939if get_option('malloc') == 'system'
940 has_malloc_trim = \
941 not get_option('malloc_trim').disabled() and \
942 cc.links('''#include <malloc.h>
943 int main(void) { malloc_trim(0); return 0; }''')
944else
945 has_malloc_trim = false
946 malloc = cc.find_library(get_option('malloc'), required: true)
947endif
948if not has_malloc_trim and get_option('malloc_trim').enabled()
949 if get_option('malloc') == 'system'
950 error('malloc_trim not available on this platform.')
951 else
952 error('malloc_trim not available with non-libc memory allocator')
953 endif
954endif
955
Max Reitz84e319a2020-11-02 17:18:55 +0100956# Check whether the glibc provides statx()
957
958statx_test = '''
959 #ifndef _GNU_SOURCE
960 #define _GNU_SOURCE
961 #endif
962 #include <sys/stat.h>
963 int main(void) {
964 struct statx statxbuf;
965 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
966 return 0;
967 }'''
968
969has_statx = cc.links(statx_test)
970
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000971have_vhost_user_blk_server = (targetos == 'linux' and
972 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000973
974if get_option('vhost_user_blk_server').enabled()
975 if targetos != 'linux'
976 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000977 elif 'CONFIG_VHOST_USER' not in config_host
978 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000979 endif
980elif get_option('vhost_user_blk_server').disabled() or not have_system
981 have_vhost_user_blk_server = false
982endif
983
Daniele Buono9e62ba42020-12-04 18:06:14 -0500984
Max Reitzdf4ea702020-10-27 20:05:46 +0100985if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
986 error('Cannot enable fuse-lseek while fuse is disabled')
987endif
988
Max Reitza484a712020-10-27 20:05:41 +0100989fuse = dependency('fuse3', required: get_option('fuse'),
990 version: '>=3.1', method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100991 kwargs: static_kwargs)
Max Reitza484a712020-10-27 20:05:41 +0100992
Max Reitzdf4ea702020-10-27 20:05:46 +0100993fuse_lseek = not_found
994if not get_option('fuse_lseek').disabled()
995 if fuse.version().version_compare('>=3.8')
996 # Dummy dependency
997 fuse_lseek = declare_dependency()
998 elif get_option('fuse_lseek').enabled()
999 if fuse.found()
1000 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1001 else
1002 error('fuse-lseek requires libfuse, which was not found')
1003 endif
1004 endif
1005endif
1006
Daniele Buono9e62ba42020-12-04 18:06:14 -05001007if get_option('cfi')
1008 cfi_flags=[]
1009 # Check for dependency on LTO
1010 if not get_option('b_lto')
1011 error('Selected Control-Flow Integrity but LTO is disabled')
1012 endif
1013 if config_host.has_key('CONFIG_MODULES')
1014 error('Selected Control-Flow Integrity is not compatible with modules')
1015 endif
1016 # Check for cfi flags. CFI requires LTO so we can't use
1017 # get_supported_arguments, but need a more complex "compiles" which allows
1018 # custom arguments
1019 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1020 args: ['-flto', '-fsanitize=cfi-icall'] )
1021 cfi_flags += '-fsanitize=cfi-icall'
1022 else
1023 error('-fsanitize=cfi-icall is not supported by the compiler')
1024 endif
1025 if cc.compiles('int main () { return 0; }',
1026 name: '-fsanitize-cfi-icall-generalize-pointers',
1027 args: ['-flto', '-fsanitize=cfi-icall',
1028 '-fsanitize-cfi-icall-generalize-pointers'] )
1029 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1030 else
1031 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1032 endif
1033 if get_option('cfi_debug')
1034 if cc.compiles('int main () { return 0; }',
1035 name: '-fno-sanitize-trap=cfi-icall',
1036 args: ['-flto', '-fsanitize=cfi-icall',
1037 '-fno-sanitize-trap=cfi-icall'] )
1038 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1039 else
1040 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1041 endif
1042 endif
Marc-André Lureau5fc06172021-01-14 16:56:02 +04001043 add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1044 add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
Daniele Buono9e62ba42020-12-04 18:06:14 -05001045endif
1046
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001047#################
1048# config-host.h #
1049#################
Paolo Bonzini859aef02020-08-04 18:14:26 +02001050
Paolo Bonzini69202b42020-11-17 14:46:21 +01001051have_virtfs = (targetos == 'linux' and
1052 have_system and
1053 libattr.found() and
1054 libcap_ng.found())
1055
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01001056have_virtfs_proxy_helper = have_virtfs and have_tools
1057
Paolo Bonzini69202b42020-11-17 14:46:21 +01001058if get_option('virtfs').enabled()
1059 if not have_virtfs
1060 if targetos != 'linux'
1061 error('virtio-9p (virtfs) requires Linux')
1062 elif not libcap_ng.found() or not libattr.found()
1063 error('virtio-9p (virtfs) requires libcap-ng-devel and libattr-devel')
1064 elif not have_system
1065 error('virtio-9p (virtfs) needs system emulation support')
1066 endif
1067 endif
1068elif get_option('virtfs').disabled()
1069 have_virtfs = false
1070endif
1071
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001072config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1073config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1074config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1075config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1076config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
1077config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
1078config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1079config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1080config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1081config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1082config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1083config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1084
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001085config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001086config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04001087config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001088config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001089config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001090config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1091config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001092config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08001093config_host_data.set('CONFIG_CURSES', curses.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001094config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1095if glusterfs.found()
1096 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1097 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1098 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1099 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1100 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1101 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1102endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001103config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001104config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001105config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001106config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01001107config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001108config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001109config_host_data.set('CONFIG_SDL', sdl.found())
1110config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01001111config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01001112config_host_data.set('CONFIG_SNAPPY', snappy.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001113config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001114config_host_data.set('CONFIG_VNC', vnc.found())
1115config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1116config_host_data.set('CONFIG_VNC_PNG', png.found())
1117config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01001118config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001119config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001120config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04001121config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonziniaa087962020-09-01 11:15:30 -04001122config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01001123config_host_data.set('CONFIG_STATX', has_statx)
Paolo Bonzinib1def332020-11-17 13:37:39 +01001124config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01001125config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01001126config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01001127config_host_data.set('CONFIG_X11', x11.found())
Daniele Buono9e62ba42020-12-04 18:06:14 -05001128config_host_data.set('CONFIG_CFI', get_option('cfi'))
Paolo Bonzini859aef02020-08-04 18:14:26 +02001129config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1130config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1131config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1132config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1133
Thomas Huth48f670e2020-11-18 18:10:52 +01001134config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001135config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001136config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001137config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001138config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Joelle van Dyne1ad27f72021-01-25 17:24:51 -08001139config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Thomas Huthded5d782020-11-14 11:10:11 +01001140
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001141config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
1142
Paolo Bonzini765686d2020-09-18 06:37:21 -04001143ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
Paolo Bonzini859aef02020-08-04 18:14:26 +02001144arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001145strings = ['HOST_DSOSUF', 'CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001146foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -04001147 if ignored.contains(k)
1148 # do nothing
1149 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001150 if v != ''
1151 v = '"' + '", "'.join(v.split()) + '", '
1152 endif
1153 config_host_data.set(k, v)
1154 elif k == 'ARCH'
1155 config_host_data.set('HOST_' + v.to_upper(), 1)
1156 elif strings.contains(k)
1157 if not k.startswith('CONFIG_')
1158 k = 'CONFIG_' + k.to_upper()
1159 endif
1160 config_host_data.set_quoted(k, v)
1161 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
1162 config_host_data.set(k, v == 'y' ? 1 : v)
1163 endif
1164endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02001165
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001166########################
1167# Target configuration #
1168########################
1169
Paolo Bonzini2becc362020-02-03 11:42:03 +01001170minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04001171config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001172config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001173config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001174config_devices_mak_list = []
1175config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02001176config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001177config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001178
1179disassemblers = {
1180 'alpha' : ['CONFIG_ALPHA_DIS'],
1181 'arm' : ['CONFIG_ARM_DIS'],
1182 'avr' : ['CONFIG_AVR_DIS'],
1183 'cris' : ['CONFIG_CRIS_DIS'],
1184 'hppa' : ['CONFIG_HPPA_DIS'],
1185 'i386' : ['CONFIG_I386_DIS'],
1186 'x86_64' : ['CONFIG_I386_DIS'],
1187 'x32' : ['CONFIG_I386_DIS'],
1188 'lm32' : ['CONFIG_LM32_DIS'],
1189 'm68k' : ['CONFIG_M68K_DIS'],
1190 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1191 'mips' : ['CONFIG_MIPS_DIS'],
1192 'moxie' : ['CONFIG_MOXIE_DIS'],
1193 'nios2' : ['CONFIG_NIOS2_DIS'],
1194 'or1k' : ['CONFIG_OPENRISC_DIS'],
1195 'ppc' : ['CONFIG_PPC_DIS'],
1196 'riscv' : ['CONFIG_RISCV_DIS'],
1197 'rx' : ['CONFIG_RX_DIS'],
1198 's390' : ['CONFIG_S390_DIS'],
1199 'sh4' : ['CONFIG_SH4_DIS'],
1200 'sparc' : ['CONFIG_SPARC_DIS'],
1201 'xtensa' : ['CONFIG_XTENSA_DIS'],
1202}
1203if link_language == 'cpp'
1204 disassemblers += {
1205 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1206 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1207 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1208 }
1209endif
1210
Paolo Bonzini0a189112020-11-17 14:58:32 +01001211host_kconfig = \
1212 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
1213 ('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
1214 ('CONFIG_IVSHMEM' in config_host ? ['CONFIG_IVSHMEM=y'] : []) + \
1215 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01001216 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001217 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1218 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1219 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01001220 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001221 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
1222 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : [])
1223
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001224ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001225
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001226default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1227actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001228fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001229foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04001230 config_target = { 'TARGET_NAME': target.split('-')[0] }
1231 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001232 if targetos != 'linux'
1233 if default_targets
1234 continue
1235 endif
1236 error('Target @0@ is only available on a Linux host'.format(target))
1237 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001238 config_target += { 'CONFIG_LINUX_USER': 'y' }
1239 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001240 if 'CONFIG_BSD' not in config_host
1241 if default_targets
1242 continue
1243 endif
1244 error('Target @0@ is only available on a BSD host'.format(target))
1245 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001246 config_target += { 'CONFIG_BSD_USER': 'y' }
1247 elif target.endswith('softmmu')
1248 config_target += { 'CONFIG_SOFTMMU': 'y' }
1249 endif
1250 if target.endswith('-user')
1251 config_target += {
1252 'CONFIG_USER_ONLY': 'y',
1253 'CONFIG_QEMU_INTERP_PREFIX':
1254 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1255 }
1256 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001257
Paolo Bonzini0a189112020-11-17 14:58:32 +01001258 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04001259 foreach sym: accelerators
1260 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1261 config_target += { sym: 'y' }
1262 config_all += { sym: 'y' }
Paolo Bonzini23a77b22020-12-14 12:01:45 +01001263 if sym == 'CONFIG_TCG' and tcg_arch == 'tci'
1264 config_target += { 'CONFIG_TCG_INTERPRETER': 'y' }
1265 elif sym == 'CONFIG_XEN' and have_xen_pci_passthrough
Paolo Bonzini8a199802020-09-18 05:37:01 -04001266 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1267 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01001268 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04001269 endif
1270 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01001271 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001272 if default_targets
1273 continue
1274 endif
1275 error('No accelerator available for target @0@'.format(target))
1276 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001277
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001278 actual_target_dirs += target
Paolo Bonzini765686d2020-09-18 06:37:21 -04001279 config_target += keyval.load('default-configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001280 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001281
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001282 if 'TARGET_NEED_FDT' in config_target
1283 fdt_required += target
1284 endif
1285
Paolo Bonzinifa731682020-09-21 05:19:07 -04001286 # Add default keys
1287 if 'TARGET_BASE_ARCH' not in config_target
1288 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1289 endif
1290 if 'TARGET_ABI_DIR' not in config_target
1291 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1292 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001293
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001294 foreach k, v: disassemblers
1295 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1296 foreach sym: v
1297 config_target += { sym: 'y' }
1298 config_all_disas += { sym: 'y' }
1299 endforeach
1300 endif
1301 endforeach
1302
Paolo Bonzini859aef02020-08-04 18:14:26 +02001303 config_target_data = configuration_data()
1304 foreach k, v: config_target
1305 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1306 # do nothing
1307 elif ignored.contains(k)
1308 # do nothing
1309 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001310 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1311 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001312 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001313 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001314 config_target_data.set_quoted(k, v)
1315 elif v == 'y'
1316 config_target_data.set(k, 1)
1317 else
1318 config_target_data.set(k, v)
1319 endif
1320 endforeach
1321 config_target_h += {target: configure_file(output: target + '-config-target.h',
1322 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001323
1324 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001325 config_devices_mak = target + '-config-devices.mak'
1326 config_devices_mak = configure_file(
Paolo Bonzini1bb4cb12020-09-18 06:06:09 -04001327 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001328 output: config_devices_mak,
1329 depfile: config_devices_mak + '.d',
1330 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01001331 command: [minikconf,
1332 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01001333 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzini0a189112020-11-17 14:58:32 +01001334 host_kconfig, accel_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02001335
1336 config_devices_data = configuration_data()
1337 config_devices = keyval.load(config_devices_mak)
1338 foreach k, v: config_devices
1339 config_devices_data.set(k, 1)
1340 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001341 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001342 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1343 configuration: config_devices_data)}
1344 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001345 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001346 endif
1347 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001348endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001349target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001350
Paolo Bonzini2becc362020-02-03 11:42:03 +01001351# This configuration is used to build files that are shared by
1352# multiple binaries, and then extracted out of the "common"
1353# static_library target.
1354#
1355# We do not use all_sources()/all_dependencies(), because it would
1356# build literally all source files, including devices only used by
1357# targets that are not built for this compilation. The CONFIG_ALL
1358# pseudo symbol replaces it.
1359
Paolo Bonzini05512f52020-09-16 15:31:11 -04001360config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001361config_all += config_host
1362config_all += config_all_disas
1363config_all += {
1364 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1365 'CONFIG_SOFTMMU': have_system,
1366 'CONFIG_USER_ONLY': have_user,
1367 'CONFIG_ALL': true,
1368}
1369
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001370##############
1371# Submodules #
1372##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001373
1374capstone = not_found
1375capstone_opt = get_option('capstone')
1376if capstone_opt in ['enabled', 'auto', 'system']
1377 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07001378 capstone = dependency('capstone', version: '>=4.0',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001379 kwargs: static_kwargs, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001380 required: capstone_opt == 'system' or
1381 capstone_opt == 'enabled' and not have_internal)
1382 if capstone.found()
1383 capstone_opt = 'system'
1384 elif have_internal
1385 capstone_opt = 'internal'
1386 else
1387 capstone_opt = 'disabled'
1388 endif
1389endif
1390if capstone_opt == 'internal'
1391 capstone_data = configuration_data()
1392 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1393
1394 capstone_files = files(
1395 'capstone/cs.c',
1396 'capstone/MCInst.c',
1397 'capstone/MCInstrDesc.c',
1398 'capstone/MCRegisterInfo.c',
1399 'capstone/SStream.c',
1400 'capstone/utils.c'
1401 )
1402
1403 if 'CONFIG_ARM_DIS' in config_all_disas
1404 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1405 capstone_files += files(
1406 'capstone/arch/ARM/ARMDisassembler.c',
1407 'capstone/arch/ARM/ARMInstPrinter.c',
1408 'capstone/arch/ARM/ARMMapping.c',
1409 'capstone/arch/ARM/ARMModule.c'
1410 )
1411 endif
1412
1413 # FIXME: This config entry currently depends on a c++ compiler.
1414 # Which is needed for building libvixl, but not for capstone.
1415 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1416 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1417 capstone_files += files(
1418 'capstone/arch/AArch64/AArch64BaseInfo.c',
1419 'capstone/arch/AArch64/AArch64Disassembler.c',
1420 'capstone/arch/AArch64/AArch64InstPrinter.c',
1421 'capstone/arch/AArch64/AArch64Mapping.c',
1422 'capstone/arch/AArch64/AArch64Module.c'
1423 )
1424 endif
1425
1426 if 'CONFIG_PPC_DIS' in config_all_disas
1427 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1428 capstone_files += files(
1429 'capstone/arch/PowerPC/PPCDisassembler.c',
1430 'capstone/arch/PowerPC/PPCInstPrinter.c',
1431 'capstone/arch/PowerPC/PPCMapping.c',
1432 'capstone/arch/PowerPC/PPCModule.c'
1433 )
1434 endif
1435
Richard Henderson3d562842020-01-04 07:24:59 +10001436 if 'CONFIG_S390_DIS' in config_all_disas
1437 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1438 capstone_files += files(
1439 'capstone/arch/SystemZ/SystemZDisassembler.c',
1440 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1441 'capstone/arch/SystemZ/SystemZMapping.c',
1442 'capstone/arch/SystemZ/SystemZModule.c',
1443 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1444 )
1445 endif
1446
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001447 if 'CONFIG_I386_DIS' in config_all_disas
1448 capstone_data.set('CAPSTONE_HAS_X86', 1)
1449 capstone_files += files(
1450 'capstone/arch/X86/X86Disassembler.c',
1451 'capstone/arch/X86/X86DisassemblerDecoder.c',
1452 'capstone/arch/X86/X86ATTInstPrinter.c',
1453 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07001454 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001455 'capstone/arch/X86/X86Mapping.c',
1456 'capstone/arch/X86/X86Module.c'
1457 )
1458 endif
1459
1460 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1461
1462 capstone_cargs = [
1463 # FIXME: There does not seem to be a way to completely replace the c_args
1464 # that come from add_project_arguments() -- we can only add to them.
1465 # So: disable all warnings with a big hammer.
1466 '-Wno-error', '-w',
1467
1468 # Include all configuration defines via a header file, which will wind up
1469 # as a dependency on the object file, and thus changes here will result
1470 # in a rebuild.
1471 '-include', 'capstone-defs.h'
1472 ]
1473
1474 libcapstone = static_library('capstone',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001475 build_by_default: false,
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001476 sources: capstone_files,
1477 c_args: capstone_cargs,
1478 include_directories: 'capstone/include')
1479 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07001480 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001481endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001482
1483slirp = not_found
1484slirp_opt = 'disabled'
1485if have_system
1486 slirp_opt = get_option('slirp')
1487 if slirp_opt in ['enabled', 'auto', 'system']
1488 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001489 slirp = dependency('slirp', kwargs: static_kwargs,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001490 method: 'pkg-config',
1491 required: slirp_opt == 'system' or
1492 slirp_opt == 'enabled' and not have_internal)
1493 if slirp.found()
1494 slirp_opt = 'system'
1495 elif have_internal
1496 slirp_opt = 'internal'
1497 else
1498 slirp_opt = 'disabled'
1499 endif
1500 endif
1501 if slirp_opt == 'internal'
1502 slirp_deps = []
1503 if targetos == 'windows'
1504 slirp_deps = cc.find_library('iphlpapi')
1505 endif
1506 slirp_conf = configuration_data()
1507 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1508 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1509 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1510 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1511 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1512 slirp_files = [
1513 'slirp/src/arp_table.c',
1514 'slirp/src/bootp.c',
1515 'slirp/src/cksum.c',
1516 'slirp/src/dhcpv6.c',
1517 'slirp/src/dnssearch.c',
1518 'slirp/src/if.c',
1519 'slirp/src/ip6_icmp.c',
1520 'slirp/src/ip6_input.c',
1521 'slirp/src/ip6_output.c',
1522 'slirp/src/ip_icmp.c',
1523 'slirp/src/ip_input.c',
1524 'slirp/src/ip_output.c',
1525 'slirp/src/mbuf.c',
1526 'slirp/src/misc.c',
1527 'slirp/src/ncsi.c',
1528 'slirp/src/ndp_table.c',
1529 'slirp/src/sbuf.c',
1530 'slirp/src/slirp.c',
1531 'slirp/src/socket.c',
1532 'slirp/src/state.c',
1533 'slirp/src/stream.c',
1534 'slirp/src/tcp_input.c',
1535 'slirp/src/tcp_output.c',
1536 'slirp/src/tcp_subr.c',
1537 'slirp/src/tcp_timer.c',
1538 'slirp/src/tftp.c',
1539 'slirp/src/udp.c',
1540 'slirp/src/udp6.c',
1541 'slirp/src/util.c',
1542 'slirp/src/version.c',
1543 'slirp/src/vmstate.c',
1544 ]
1545
1546 configure_file(
1547 input : 'slirp/src/libslirp-version.h.in',
1548 output : 'libslirp-version.h',
1549 configuration: slirp_conf)
1550
1551 slirp_inc = include_directories('slirp', 'slirp/src')
1552 libslirp = static_library('slirp',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001553 build_by_default: false,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001554 sources: slirp_files,
1555 c_args: slirp_cargs,
1556 include_directories: slirp_inc)
1557 slirp = declare_dependency(link_with: libslirp,
1558 dependencies: slirp_deps,
1559 include_directories: slirp_inc)
1560 endif
1561endif
1562
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001563fdt = not_found
1564fdt_opt = get_option('fdt')
1565if have_system
1566 if fdt_opt in ['enabled', 'auto', 'system']
1567 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001568 fdt = cc.find_library('fdt', kwargs: static_kwargs,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001569 required: fdt_opt == 'system' or
1570 fdt_opt == 'enabled' and not have_internal)
1571 if fdt.found() and cc.links('''
1572 #include <libfdt.h>
1573 #include <libfdt_env.h>
1574 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1575 dependencies: fdt)
1576 fdt_opt = 'system'
1577 elif have_internal
1578 fdt_opt = 'internal'
1579 else
1580 fdt_opt = 'disabled'
1581 endif
1582 endif
1583 if fdt_opt == 'internal'
1584 fdt_files = files(
1585 'dtc/libfdt/fdt.c',
1586 'dtc/libfdt/fdt_ro.c',
1587 'dtc/libfdt/fdt_wip.c',
1588 'dtc/libfdt/fdt_sw.c',
1589 'dtc/libfdt/fdt_rw.c',
1590 'dtc/libfdt/fdt_strerror.c',
1591 'dtc/libfdt/fdt_empty_tree.c',
1592 'dtc/libfdt/fdt_addresses.c',
1593 'dtc/libfdt/fdt_overlay.c',
1594 'dtc/libfdt/fdt_check.c',
1595 )
1596
1597 fdt_inc = include_directories('dtc/libfdt')
1598 libfdt = static_library('fdt',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001599 build_by_default: false,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001600 sources: fdt_files,
1601 include_directories: fdt_inc)
1602 fdt = declare_dependency(link_with: libfdt,
1603 include_directories: fdt_inc)
1604 endif
1605endif
1606if not fdt.found() and fdt_required.length() > 0
1607 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1608endif
1609
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001610config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001611config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001612config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001613
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001614#####################
1615# Generated sources #
1616#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001617
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001618genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001619
Marc-André Lureau3f885652019-07-15 18:06:04 +04001620hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04001621shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001622qapi_gen = find_program('scripts/qapi-gen.py')
1623qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1624 meson.source_root() / 'scripts/qapi/commands.py',
1625 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001626 meson.source_root() / 'scripts/qapi/error.py',
1627 meson.source_root() / 'scripts/qapi/events.py',
1628 meson.source_root() / 'scripts/qapi/expr.py',
1629 meson.source_root() / 'scripts/qapi/gen.py',
1630 meson.source_root() / 'scripts/qapi/introspect.py',
1631 meson.source_root() / 'scripts/qapi/parser.py',
1632 meson.source_root() / 'scripts/qapi/schema.py',
1633 meson.source_root() / 'scripts/qapi/source.py',
1634 meson.source_root() / 'scripts/qapi/types.py',
1635 meson.source_root() / 'scripts/qapi/visit.py',
1636 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001637 meson.source_root() / 'scripts/qapi-gen.py'
1638]
1639
1640tracetool = [
1641 python, files('scripts/tracetool.py'),
1642 '--backend=' + config_host['TRACE_BACKENDS']
1643]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00001644tracetool_depends = files(
1645 'scripts/tracetool/backend/log.py',
1646 'scripts/tracetool/backend/__init__.py',
1647 'scripts/tracetool/backend/dtrace.py',
1648 'scripts/tracetool/backend/ftrace.py',
1649 'scripts/tracetool/backend/simple.py',
1650 'scripts/tracetool/backend/syslog.py',
1651 'scripts/tracetool/backend/ust.py',
1652 'scripts/tracetool/format/tcg_h.py',
1653 'scripts/tracetool/format/ust_events_c.py',
1654 'scripts/tracetool/format/ust_events_h.py',
1655 'scripts/tracetool/format/__init__.py',
1656 'scripts/tracetool/format/d.py',
1657 'scripts/tracetool/format/tcg_helper_c.py',
1658 'scripts/tracetool/format/simpletrace_stap.py',
1659 'scripts/tracetool/format/c.py',
1660 'scripts/tracetool/format/h.py',
1661 'scripts/tracetool/format/tcg_helper_h.py',
1662 'scripts/tracetool/format/log_stap.py',
1663 'scripts/tracetool/format/stap.py',
1664 'scripts/tracetool/format/tcg_helper_wrapper_h.py',
1665 'scripts/tracetool/__init__.py',
1666 'scripts/tracetool/transform.py',
1667 'scripts/tracetool/vcpu.py'
1668)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001669
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001670qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1671 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02001672 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001673qemu_version = custom_target('qemu-version.h',
1674 output: 'qemu-version.h',
1675 command: qemu_version_cmd,
1676 capture: true,
1677 build_by_default: true,
1678 build_always_stale: true)
1679genh += qemu_version
1680
Marc-André Lureau3f885652019-07-15 18:06:04 +04001681hxdep = []
1682hx_headers = [
1683 ['qemu-options.hx', 'qemu-options.def'],
1684 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1685]
1686if have_system
1687 hx_headers += [
1688 ['hmp-commands.hx', 'hmp-commands.h'],
1689 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1690 ]
1691endif
1692foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001693 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04001694 input: files(d[0]),
1695 output: d[1],
1696 capture: true,
1697 build_by_default: true, # to be removed when added to a target
1698 command: [hxtool, '-h', '@INPUT0@'])
1699endforeach
1700genh += hxdep
1701
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001702###################
1703# Collect sources #
1704###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001705
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001706authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001707blockdev_ss = ss.source_set()
1708block_ss = ss.source_set()
1709bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001710chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001711common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001712crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001713io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001714linux_user_ss = ss.source_set()
1715qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001716qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001717softmmu_ss = ss.source_set()
1718specific_fuzz_ss = ss.source_set()
1719specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001720stub_ss = ss.source_set()
1721trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001722user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001723util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001724
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001725modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001726hw_arch = {}
1727target_arch = {}
1728target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001729
1730###############
1731# Trace files #
1732###############
1733
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001734# TODO: add each directory to the subdirs from its own meson.build, once
1735# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001736trace_events_subdirs = [
1737 'accel/kvm',
1738 'accel/tcg',
1739 'crypto',
1740 'monitor',
1741]
1742if have_user
1743 trace_events_subdirs += [ 'linux-user' ]
1744endif
1745if have_block
1746 trace_events_subdirs += [
1747 'authz',
1748 'block',
1749 'io',
1750 'nbd',
1751 'scsi',
1752 ]
1753endif
1754if have_system
1755 trace_events_subdirs += [
1756 'audio',
1757 'backends',
1758 'backends/tpm',
1759 'chardev',
1760 'hw/9pfs',
1761 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08001762 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001763 'hw/alpha',
1764 'hw/arm',
1765 'hw/audio',
1766 'hw/block',
1767 'hw/block/dataplane',
1768 'hw/char',
1769 'hw/display',
1770 'hw/dma',
1771 'hw/hppa',
1772 'hw/hyperv',
1773 'hw/i2c',
1774 'hw/i386',
1775 'hw/i386/xen',
1776 'hw/ide',
1777 'hw/input',
1778 'hw/intc',
1779 'hw/isa',
1780 'hw/mem',
1781 'hw/mips',
1782 'hw/misc',
1783 'hw/misc/macio',
1784 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08001785 'hw/net/can',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001786 'hw/nvram',
1787 'hw/pci',
1788 'hw/pci-host',
1789 'hw/ppc',
1790 'hw/rdma',
1791 'hw/rdma/vmw',
1792 'hw/rtc',
1793 'hw/s390x',
1794 'hw/scsi',
1795 'hw/sd',
1796 'hw/sparc',
1797 'hw/sparc64',
1798 'hw/ssi',
1799 'hw/timer',
1800 'hw/tpm',
1801 'hw/usb',
1802 'hw/vfio',
1803 'hw/virtio',
1804 'hw/watchdog',
1805 'hw/xen',
1806 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001807 'migration',
1808 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02001809 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001810 'ui',
1811 ]
1812endif
1813trace_events_subdirs += [
1814 'hw/core',
1815 'qapi',
1816 'qom',
1817 'target/arm',
1818 'target/hppa',
1819 'target/i386',
Claudio Fontanaa9dc68d2020-12-12 16:55:08 +01001820 'target/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001821 'target/mips',
1822 'target/ppc',
1823 'target/riscv',
1824 'target/s390x',
1825 'target/sparc',
1826 'util',
1827]
1828
Marc-André Lureau0df750e2020-11-25 14:06:37 +04001829vhost_user = not_found
1830if 'CONFIG_VHOST_USER' in config_host
1831 libvhost_user = subproject('libvhost-user')
1832 vhost_user = libvhost_user.get_variable('vhost_user_dep')
1833endif
1834
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001835subdir('qapi')
1836subdir('qobject')
1837subdir('stubs')
1838subdir('trace')
1839subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04001840subdir('qom')
1841subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001842subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04001843subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001844
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001845
1846if enable_modules
1847 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1848 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1849endif
1850
Paolo Bonzini2becc362020-02-03 11:42:03 +01001851stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001852
1853util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01001854util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001855libqemuutil = static_library('qemuutil',
1856 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonziniaa087962020-09-01 11:15:30 -04001857 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001858qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04001859 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001860
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001861decodetree = generator(find_program('scripts/decodetree.py'),
1862 output: 'decode-@BASENAME@.c.inc',
1863 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1864
Paolo Bonzini478e9432020-08-17 12:47:55 +02001865subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04001866subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04001867subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001868subdir('fsdev')
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001869subdir('libdecnumber')
Marc-André Lureaud3b18482019-08-17 14:55:32 +04001870subdir('target')
Marc-André Lureau708eab42019-09-03 16:59:33 +04001871subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001872
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001873block_ss.add(files(
1874 'block.c',
1875 'blockjob.c',
1876 'job.c',
1877 'qemu-io-cmds.c',
1878))
1879block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
1880
1881subdir('nbd')
1882subdir('scsi')
1883subdir('block')
1884
Paolo Bonzini4a963372020-08-03 16:22:28 +02001885blockdev_ss.add(files(
1886 'blockdev.c',
Stefan Hajnoczicbc20bf2020-09-29 13:55:15 +01001887 'blockdev-nbd.c',
Paolo Bonzini4a963372020-08-03 16:22:28 +02001888 'iothread.c',
1889 'job-qmp.c',
Roman Bolshakov3eacf702021-01-02 15:52:13 +03001890), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02001891
1892# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1893# os-win32.c does not
1894blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1895softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
Paolo Bonzini4a963372020-08-03 16:22:28 +02001896
1897common_ss.add(files('cpus-common.c'))
1898
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001899subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001900
Richard Hendersonf3433462020-09-12 10:47:33 -07001901common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02001902specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001903specific_ss.add(files('exec-vary.c'))
1904specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1905 'fpu/softfloat.c',
1906 'tcg/optimize.c',
1907 'tcg/tcg-common.c',
1908 'tcg/tcg-op-gvec.c',
1909 'tcg/tcg-op-vec.c',
1910 'tcg/tcg-op.c',
1911 'tcg/tcg.c',
1912))
1913specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1914
Marc-André Lureauab318052019-07-24 19:23:16 +04001915subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04001916subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04001917subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001918subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001919subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04001920subdir('replay')
Marc-André Lureau582ea952019-08-15 15:15:32 +04001921subdir('hw')
Marc-André Lureau1a828782019-08-18 16:13:08 +04001922subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001923subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04001924subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04001925subdir('linux-user')
1926
Marc-André Lureaub309c322019-08-18 19:20:37 +04001927bsd_user_ss.add(files('gdbstub.c'))
1928specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1929
Marc-André Lureau3a304462019-08-18 16:13:08 +04001930linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1931specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001932
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001933# needed for fuzzing binaries
1934subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001935subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001936
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001937########################
1938# Library dependencies #
1939########################
1940
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001941block_mods = []
1942softmmu_mods = []
1943foreach d, list : modules
1944 foreach m, module_ss : list
1945 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02001946 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001947 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1948 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1949 if d == 'block'
1950 block_mods += sl
1951 else
1952 softmmu_mods += sl
1953 endif
1954 else
1955 if d == 'block'
1956 block_ss.add_all(module_ss)
1957 else
1958 softmmu_ss.add_all(module_ss)
1959 endif
1960 endif
1961 endforeach
1962endforeach
1963
1964nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08001965undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001966block_syms = custom_target('block.syms', output: 'block.syms',
1967 input: [libqemuutil, block_mods],
1968 capture: true,
1969 command: [undefsym, nm, '@INPUT@'])
1970qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1971 input: [libqemuutil, softmmu_mods],
1972 capture: true,
1973 command: [undefsym, nm, '@INPUT@'])
1974
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001975qom_ss = qom_ss.apply(config_host, strict: false)
1976libqom = static_library('qom', qom_ss.sources() + genh,
1977 dependencies: [qom_ss.dependencies()],
1978 name_suffix: 'fa')
1979
1980qom = declare_dependency(link_whole: libqom)
1981
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001982authz_ss = authz_ss.apply(config_host, strict: false)
1983libauthz = static_library('authz', authz_ss.sources() + genh,
1984 dependencies: [authz_ss.dependencies()],
1985 name_suffix: 'fa',
1986 build_by_default: false)
1987
1988authz = declare_dependency(link_whole: libauthz,
1989 dependencies: qom)
1990
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001991crypto_ss = crypto_ss.apply(config_host, strict: false)
1992libcrypto = static_library('crypto', crypto_ss.sources() + genh,
1993 dependencies: [crypto_ss.dependencies()],
1994 name_suffix: 'fa',
1995 build_by_default: false)
1996
1997crypto = declare_dependency(link_whole: libcrypto,
1998 dependencies: [authz, qom])
1999
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002000io_ss = io_ss.apply(config_host, strict: false)
2001libio = static_library('io', io_ss.sources() + genh,
2002 dependencies: [io_ss.dependencies()],
2003 link_with: libqemuutil,
2004 name_suffix: 'fa',
2005 build_by_default: false)
2006
2007io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
2008
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02002009libmigration = static_library('migration', sources: migration_files + genh,
2010 name_suffix: 'fa',
2011 build_by_default: false)
2012migration = declare_dependency(link_with: libmigration,
2013 dependencies: [zlib, qom, io])
2014softmmu_ss.add(migration)
2015
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002016block_ss = block_ss.apply(config_host, strict: false)
2017libblock = static_library('block', block_ss.sources() + genh,
2018 dependencies: block_ss.dependencies(),
2019 link_depends: block_syms,
2020 name_suffix: 'fa',
2021 build_by_default: false)
2022
2023block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002024 link_args: '@block.syms',
2025 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002026
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002027blockdev_ss = blockdev_ss.apply(config_host, strict: false)
2028libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
2029 dependencies: blockdev_ss.dependencies(),
2030 name_suffix: 'fa',
2031 build_by_default: false)
2032
2033blockdev = declare_dependency(link_whole: [libblockdev],
2034 dependencies: [block])
2035
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002036qmp_ss = qmp_ss.apply(config_host, strict: false)
2037libqmp = static_library('qmp', qmp_ss.sources() + genh,
2038 dependencies: qmp_ss.dependencies(),
2039 name_suffix: 'fa',
2040 build_by_default: false)
2041
2042qmp = declare_dependency(link_whole: [libqmp])
2043
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002044libchardev = static_library('chardev', chardev_ss.sources() + genh,
2045 name_suffix: 'fa',
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002046 dependencies: [gnutls],
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002047 build_by_default: false)
2048
2049chardev = declare_dependency(link_whole: libchardev)
2050
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02002051libhwcore = static_library('hwcore', sources: hwcore_files + genh,
2052 name_suffix: 'fa',
2053 build_by_default: false)
2054hwcore = declare_dependency(link_whole: libhwcore)
2055common_ss.add(hwcore)
2056
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02002057###########
2058# Targets #
2059###########
2060
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002061foreach m : block_mods + softmmu_mods
2062 shared_module(m.name(),
2063 name_prefix: '',
2064 link_whole: m,
2065 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002066 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002067endforeach
2068
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002069softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002070common_ss.add(qom, qemuutil)
2071
2072common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01002073common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
2074
2075common_all = common_ss.apply(config_all, strict: false)
2076common_all = static_library('common',
2077 build_by_default: false,
2078 sources: common_all.sources() + genh,
2079 dependencies: common_all.dependencies(),
2080 name_suffix: 'fa')
2081
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002082feature_to_c = find_program('scripts/feature_to_c.sh')
2083
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002084emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002085foreach target : target_dirs
2086 config_target = config_target_mak[target]
2087 target_name = config_target['TARGET_NAME']
2088 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02002089 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002090 arch_deps = []
2091 c_args = ['-DNEED_CPU_H',
2092 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2093 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04002094 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01002095
Paolo Bonzini859aef02020-08-04 18:14:26 +02002096 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01002097 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2098 if targetos == 'linux'
2099 target_inc += include_directories('linux-headers', is_system: true)
2100 endif
2101 if target.endswith('-softmmu')
2102 qemu_target_name = 'qemu-system-' + target_name
2103 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002104 t = target_softmmu_arch[arch].apply(config_target, strict: false)
2105 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002106 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002107
Marc-André Lureau2c442202019-08-17 13:55:58 +04002108 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
2109 hw = hw_arch[hw_dir].apply(config_target, strict: false)
2110 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002111 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04002112
Paolo Bonzini2becc362020-02-03 11:42:03 +01002113 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002114 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002115 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04002116 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002117 target_type='user'
2118 qemu_target_name = 'qemu-' + target_name
2119 if 'CONFIG_LINUX_USER' in config_target
2120 base_dir = 'linux-user'
2121 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
2122 else
2123 base_dir = 'bsd-user'
Stacey Sonea1ab4c2020-12-18 13:54:50 -07002124 target_inc += include_directories('bsd-user/freebsd')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002125 endif
2126 target_inc += include_directories(
2127 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04002128 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002129 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04002130 if 'CONFIG_LINUX_USER' in config_target
2131 dir = base_dir / abi
2132 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
2133 if config_target.has_key('TARGET_SYSTBL_ABI')
2134 arch_srcs += \
2135 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
2136 extra_args : config_target['TARGET_SYSTBL_ABI'])
2137 endif
2138 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002139 endif
2140
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002141 if 'TARGET_XML_FILES' in config_target
2142 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
2143 output: target + '-gdbstub-xml.c',
2144 input: files(config_target['TARGET_XML_FILES'].split()),
2145 command: [feature_to_c, '@INPUT@'],
2146 capture: true)
2147 arch_srcs += gdbstub_xml
2148 endif
2149
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002150 t = target_arch[arch].apply(config_target, strict: false)
2151 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002152 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002153
Paolo Bonzini2becc362020-02-03 11:42:03 +01002154 target_common = common_ss.apply(config_target, strict: false)
2155 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002156 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002157
Paolo Bonzini2becc362020-02-03 11:42:03 +01002158 target_specific = specific_ss.apply(config_target, strict: false)
2159 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002160 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002161
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002162 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02002163 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002164 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002165 objects: objects,
2166 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002167 c_args: c_args,
2168 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002169 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002170
2171 if target.endswith('-softmmu')
2172 execs = [{
2173 'name': 'qemu-system-' + target_name,
2174 'gui': false,
2175 'sources': files('softmmu/main.c'),
2176 'dependencies': []
2177 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002178 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002179 execs += [{
2180 'name': 'qemu-system-' + target_name + 'w',
2181 'gui': true,
2182 'sources': files('softmmu/main.c'),
2183 'dependencies': []
2184 }]
2185 endif
2186 if config_host.has_key('CONFIG_FUZZ')
2187 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
2188 execs += [{
2189 'name': 'qemu-fuzz-' + target_name,
2190 'gui': false,
2191 'sources': specific_fuzz.sources(),
2192 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002193 }]
2194 endif
2195 else
2196 execs = [{
2197 'name': 'qemu-' + target_name,
2198 'gui': false,
2199 'sources': [],
2200 'dependencies': []
2201 }]
2202 endif
2203 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01002204 exe_name = exe['name']
2205 exe_sign = 'CONFIG_HVF' in config_target
2206 if exe_sign
2207 exe_name += '-unsigned'
2208 endif
2209
2210 emulator = executable(exe_name, exe['sources'],
2211 install: not exe_sign,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002212 c_args: c_args,
2213 dependencies: arch_deps + deps + exe['dependencies'],
2214 objects: lib.extract_all_objects(recursive: true),
2215 link_language: link_language,
2216 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
2217 link_args: link_args,
2218 gui_app: exe['gui'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01002219
2220 if exe_sign
2221 emulators += {exe['name'] : custom_target(exe['name'],
2222 install: true,
2223 install_dir: get_option('bindir'),
2224 depends: emulator,
2225 output: exe['name'],
2226 command: [
2227 meson.current_source_dir() / 'scripts/entitlement.sh',
2228 meson.current_build_dir() / exe_name,
2229 meson.current_build_dir() / exe['name'],
2230 meson.current_source_dir() / 'accel/hvf/entitlements.plist'
2231 ])
2232 }
2233 else
2234 emulators += {exe['name']: emulator}
2235 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002236
2237 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
2238 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002239 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
2240 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002241 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
2242 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
2243 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002244 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002245 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002246 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002247 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002248 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002249 command: [
2250 tracetool, '--group=all', '--format=' + stp['fmt'],
2251 '--binary=' + stp['bin'],
2252 '--target-name=' + target_name,
2253 '--target-type=' + target_type,
2254 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01002255 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002256 ],
2257 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002258 endforeach
2259 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002260 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002261endforeach
2262
Paolo Bonzini931049b2020-02-05 09:44:24 +01002263# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002264
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002265if 'CONFIG_PLUGIN' in config_host
2266 install_headers('include/qemu/qemu-plugin.h')
2267endif
2268
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002269if 'CONFIG_GUEST_AGENT' in config_host
2270 subdir('qga')
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002271elif get_option('guest_agent_msi').enabled()
2272 error('Guest agent MSI requested, but the guest agent is not being built')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002273endif
2274
Laurent Vivier9755c942020-08-24 17:24:30 +02002275# Don't build qemu-keymap if xkbcommon is not explicitly enabled
2276# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002277if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04002278 # used for the update-keymaps target, so include rules even if !have_tools
2279 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
2280 dependencies: [qemuutil, xkbcommon], install: have_tools)
2281endif
2282
Paolo Bonzini931049b2020-02-05 09:44:24 +01002283if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002284 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
2285 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
2286 qemu_io = executable('qemu-io', files('qemu-io.c'),
2287 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01002288 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002289 dependencies: [blockdev, qemuutil, gnutls], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002290
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02002291 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002292 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04002293 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002294
Marc-André Lureau157e7b12019-07-15 14:50:58 +04002295 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
2296 dependencies: qemuutil,
2297 install: true)
2298
Paolo Bonzini931049b2020-02-05 09:44:24 +01002299 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02002300 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002301 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04002302 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02002303 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01002304 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002305
2306 if targetos == 'linux'
2307 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2308 dependencies: [qemuutil, libcap_ng],
2309 install: true,
2310 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002311
2312 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2313 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002314 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002315 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002316 endif
2317
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04002318 if 'CONFIG_IVSHMEM' in config_host
2319 subdir('contrib/ivshmem-client')
2320 subdir('contrib/ivshmem-server')
2321 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01002322endif
2323
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04002324subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002325subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04002326subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02002327subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08002328subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01002329if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04002330 subdir('po')
2331endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002332
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002333if host_machine.system() == 'windows'
2334 nsis_cmd = [
2335 find_program('scripts/nsis.py'),
2336 '@OUTPUT@',
2337 get_option('prefix'),
2338 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01002339 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002340 '--',
2341 '-DDISPLAYVERSION=' + meson.project_version(),
2342 ]
2343 if build_docs
2344 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2345 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002346 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002347 nsis_cmd += '-DCONFIG_GTK=y'
2348 endif
2349
2350 nsis = custom_target('nsis',
2351 output: 'qemu-setup-' + meson.project_version() + '.exe',
2352 input: files('qemu.nsi'),
2353 build_always_stale: true,
2354 command: nsis_cmd + ['@INPUT@'])
2355 alias_target('installer', nsis)
2356endif
2357
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002358#########################
2359# Configuration summary #
2360#########################
2361
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002362# Directories
Paolo Bonzinif9332752020-02-03 13:28:38 +01002363summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002364summary_info += {'Install prefix': get_option('prefix')}
2365summary_info += {'BIOS directory': qemu_datadir}
2366summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2367summary_info += {'binary directory': get_option('bindir')}
2368summary_info += {'library directory': get_option('libdir')}
2369summary_info += {'module directory': qemu_moddir}
2370summary_info += {'libexec directory': get_option('libexecdir')}
2371summary_info += {'include directory': get_option('includedir')}
2372summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002373if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002374 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04002375 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002376else
2377 summary_info += {'local state directory': 'queried at runtime'}
2378endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04002379summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002380summary_info += {'Build directory': meson.current_build_dir()}
2381summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002382summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002383summary(summary_info, bool_yn: true, section: 'Directories')
2384
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002385# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002386summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002387summary_info += {'git': config_host['GIT']}
2388summary_info += {'make': config_host['MAKE']}
2389summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
2390summary_info += {'sphinx-build': sphinx_build.found()}
2391if config_host.has_key('HAVE_GDB_BIN')
2392 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2393endif
2394summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2395if targetos == 'windows' and config_host.has_key('CONFIG_GUEST_AGENT')
2396 summary_info += {'wixl': wixl.found() ? wixl.full_path() : false}
2397endif
2398if slirp_opt != 'disabled'
2399 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2400endif
2401summary(summary_info, bool_yn: true, section: 'Host binaries')
2402
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01002403# Configurable features
2404summary_info = {}
2405summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002406summary_info += {'system-mode emulation': have_system}
2407summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002408summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01002409summary_info += {'Install blobs': get_option('install_blobs')}
2410summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2411if config_host.has_key('CONFIG_MODULES')
2412 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2413endif
2414summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2415summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2416if have_system
2417 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2418endif
2419summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2420if config_host['TRACE_BACKENDS'].split().contains('simple')
2421 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2422endif
2423summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2424summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
2425summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2426summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2427summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2428summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
2429summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
2430summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
2431summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2432summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2433summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2434summary(summary_info, bool_yn: true, section: 'Configurable features')
2435
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002436# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002437summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002438summary_info += {'host CPU': cpu}
2439summary_info += {'host endianness': build_machine.endian()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002440summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
2441summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
2442if link_language == 'cpp'
2443 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
2444else
2445 summary_info += {'C++ compiler': false}
2446endif
2447if targetos == 'darwin'
2448 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
2449endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002450if targetos == 'windows'
2451 if 'WIN_SDK' in config_host
2452 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2453 endif
2454endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002455summary_info += {'ARFLAGS': config_host['ARFLAGS']}
Paolo Bonzini47b30832020-09-23 05:26:17 -04002456summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2457 + ['-O' + get_option('optimization')]
2458 + (get_option('debug') ? ['-g'] : []))}
2459if link_language == 'cpp'
2460 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2461 + ['-O' + get_option('optimization')]
2462 + (get_option('debug') ? ['-g'] : []))}
2463endif
2464link_args = get_option(link_language + '_link_args')
2465if link_args.length() > 0
2466 summary_info += {'LDFLAGS': ' '.join(link_args)}
2467endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002468summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2469summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002470summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05002471summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002472summary_info += {'PIE': get_option('b_pie')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02002473summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002474summary_info += {'malloc trim support': has_malloc_trim}
2475summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002476summary_info += {'preadv support': config_host_data.get('CONFIG_PREADV')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002477summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2478summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2479summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2480summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
2481summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2482summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2483summary_info += {'memory allocator': get_option('malloc')}
2484summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2485summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2486summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
2487summary_info += {'gcov': get_option('b_coverage')}
2488summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2489summary_info += {'CFI support': get_option('cfi')}
2490if get_option('cfi')
2491 summary_info += {'CFI debug support': get_option('cfi_debug')}
2492endif
2493summary_info += {'strip binaries': get_option('strip')}
2494summary_info += {'sparse': sparse.found() ? sparse.full_path() : false}
2495summary_info += {'mingw32 support': targetos == 'windows'}
2496summary(summary_info, bool_yn: true, section: 'Compilation')
2497
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002498# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002499summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002500if have_system
2501 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2502 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2503 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2504 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
2505 summary_info += {'Xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2506 if config_host.has_key('CONFIG_XEN_BACKEND')
2507 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2508 endif
2509endif
2510summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2511if config_all.has_key('CONFIG_TCG')
2512 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
2513 summary_info += {'TCG interpreter': tcg_arch == 'tci'}
2514endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002515summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002516if have_system
2517 summary_info += {'default devices': get_option('default_devices')}
2518endif
2519summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
2520
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002521# Block layer
2522summary_info = {}
2523summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2524summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2525if have_block
2526 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2527 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
2528 summary_info += {'VirtFS support': have_virtfs}
2529 summary_info += {'build virtiofs daemon': have_virtiofsd}
2530 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
2531 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2532 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2533 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2534 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2535 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2536 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2537 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2538 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2539 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2540 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
2541 summary_info += {'FUSE exports': fuse.found()}
2542endif
2543summary(summary_info, bool_yn: true, section: 'Block layer support')
2544
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002545# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002546summary_info = {}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002547summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
2548summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
2549# TODO: add back version
2550summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
2551if config_host.has_key('CONFIG_GCRYPT')
2552 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
2553 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2554endif
2555# TODO: add back version
2556summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
2557if config_host.has_key('CONFIG_NETTLE')
2558 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2559endif
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002560summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
2561summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2562summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
2563summary(summary_info, bool_yn: true, section: 'Crypto')
2564
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01002565# Libraries
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002566summary_info = {}
2567if targetos == 'darwin'
2568 summary_info += {'Cocoa support': cocoa.found()}
2569endif
2570# TODO: add back version
2571summary_info += {'SDL support': sdl.found()}
2572summary_info += {'SDL image support': sdl_image.found()}
2573# TODO: add back version
2574summary_info += {'GTK support': gtk.found()}
2575summary_info += {'pixman': pixman.found()}
2576# TODO: add back version
2577summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002578# TODO: add back version
2579summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002580summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
2581summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
Yonggang Luo5285e592020-10-13 07:43:48 +08002582summary_info += {'iconv support': iconv.found()}
2583summary_info += {'curses support': curses.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002584# TODO: add back version
2585summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002586summary_info += {'curl support': curl.found()}
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002587summary_info += {'Multipath support': mpathpersist.found()}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002588summary_info += {'VNC support': vnc.found()}
2589if vnc.found()
2590 summary_info += {'VNC SASL support': sasl.found()}
2591 summary_info += {'VNC JPEG support': jpeg.found()}
2592 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002593endif
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002594summary_info += {'brlapi support': brlapi.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002595summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2596summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2597summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2598summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002599summary_info += {'ATTR/XATTR support': libattr.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002600summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2601summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002602summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002603summary_info += {'libcap-ng support': libcap_ng.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002604# TODO: add back protocol and server version
2605summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002606summary_info += {'rbd support': rbd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002607summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
2608summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02002609summary_info += {'U2F support': u2f.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002610summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
2611summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
2612summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
2613summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002614summary_info += {'libiscsi support': libiscsi.found()}
Paolo Bonzini30045c02020-11-17 13:11:25 +01002615summary_info += {'libnfs support': libnfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002616if targetos == 'windows'
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002617 if config_host.has_key('CONFIG_GUEST_AGENT')
2618 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2619 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002620 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002621endif
Paolo Bonzini90835c22020-11-17 14:22:24 +01002622summary_info += {'seccomp support': seccomp.found()}
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002623summary_info += {'GlusterFS support': glusterfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002624summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2625summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002626summary_info += {'lzo support': lzo.found()}
Paolo Bonzini241611e2020-11-17 13:32:34 +01002627summary_info += {'snappy support': snappy.found()}
Paolo Bonzini29ba6112020-11-17 13:07:52 +01002628summary_info += {'bzip2 support': libbzip2.found()}
Paolo Bonziniecea3692020-11-17 13:35:28 +01002629summary_info += {'lzfse support': liblzfse.found()}
Paolo Bonzinib1def332020-11-17 13:37:39 +01002630summary_info += {'zstd support': zstd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002631summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2632summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002633summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002634summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2635summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002636summary_info += {'libudev': libudev.found()}
Max Reitzdf4ea702020-10-27 20:05:46 +01002637summary_info += {'FUSE lseek': fuse_lseek.found()}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01002638summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01002639
2640if not supported_cpus.contains(cpu)
2641 message()
2642 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2643 message()
2644 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2645 message('The QEMU project intends to remove support for this host CPU in')
2646 message('a future release if nobody volunteers to maintain it and to')
2647 message('provide a build host for our continuous integration setup.')
2648 message('configure has succeeded and you can continue to build, but')
2649 message('if you care about QEMU on this platform you should contact')
2650 message('us upstream at qemu-devel@nongnu.org.')
2651endif
2652
2653if not supported_oses.contains(targetos)
2654 message()
2655 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2656 message()
2657 message('Host OS ' + targetos + 'support is not currently maintained.')
2658 message('The QEMU project intends to remove support for this host OS in')
2659 message('a future release if nobody volunteers to maintain it and to')
2660 message('provide a build host for our continuous integration setup.')
2661 message('configure has succeeded and you can continue to build, but')
2662 message('if you care about QEMU on this platform you should contact')
2663 message('us upstream at qemu-devel@nongnu.org.')
2664endif