blob: 0ce993a404b2c80e8efecff07494c0af4856e4a4 [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
21# Temporary directory used for files created while
22# configure runs. Since it is in the build directory
23# we can safely blow away any previous version of it
24# (and we need not jump through hoops to try to delete
25# it when configure exits.)
26tmpdir = meson.current_build_dir() / 'meson-private/temp'
Marc-André Lureau8fe11232020-09-11 14:42:48 +020027
28if get_option('qemu_suffix').startswith('/')
29 error('qemu_suffix cannot start with a /')
30endif
31
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040032qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
Marc-André Lureauab4c0992020-08-26 15:04:16 +040033qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040034qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040035qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
36
37qemu_desktopdir = get_option('datadir') / 'applications'
38qemu_icondir = get_option('datadir') / 'icons'
39
Paolo Bonzini859aef02020-08-04 18:14:26 +020040config_host_data = configuration_data()
41genh = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020042
Paolo Bonzini760e4322020-08-26 08:09:48 +020043target_dirs = config_host['TARGET_DIRS'].split()
44have_user = false
45have_system = false
46foreach target : target_dirs
47 have_user = have_user or target.endswith('-user')
48 have_system = have_system or target.endswith('-softmmu')
49endforeach
50have_tools = 'CONFIG_TOOLS' in config_host
51have_block = have_system or have_tools
52
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040053python = import('python').find_installation()
54
55supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Sergei Trofimovich61256732020-10-12 18:57:19 +010056supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040057 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
58
59cpu = host_machine.cpu_family()
60targetos = host_machine.system()
61
Paolo Bonzini8a199802020-09-18 05:37:01 -040062if cpu in ['x86', 'x86_64']
63 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
64elif cpu == 'aarch64'
65 kvm_targets = ['aarch64-softmmu']
66elif cpu == 's390x'
67 kvm_targets = ['s390x-softmmu']
68elif cpu in ['ppc', 'ppc64']
69 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Huacai Chenfbc58842020-10-07 16:39:28 +080070elif cpu in ['mips', 'mips64']
71 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -040072else
73 kvm_targets = []
74endif
75
76accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alex Bennée0c3e41d2020-11-10 19:23:09 +000077if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
78 # i368 emulator provides xenpv machine type for multiple architectures
79 accelerator_targets += {
80 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
81 }
82endif
Paolo Bonzini8a199802020-09-18 05:37:01 -040083if cpu in ['x86', 'x86_64']
84 accelerator_targets += {
85 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -040086 'CONFIG_HVF': ['x86_64-softmmu'],
87 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
88 }
89endif
90
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040091##################
92# Compiler flags #
93##################
94
Alexander Bulekovff9ed622020-09-09 18:05:16 -040095# Specify linker-script with add_project_link_arguments so that it is not placed
96# within a linker --start-group/--end-group pair
97if 'CONFIG_FUZZ' in config_host
98 add_project_link_arguments(['-Wl,-T,',
99 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
100 native: false, language: ['c', 'cpp', 'objc'])
101endif
102
Paolo Bonzinia5665052019-06-10 12:05:14 +0200103add_project_arguments(config_host['QEMU_CFLAGS'].split(),
104 native: false, language: ['c', 'objc'])
105add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
106 native: false, language: 'cpp')
107add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
108 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzinia5665052019-06-10 12:05:14 +0200109
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400110if targetos == 'linux'
111 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
112 '-isystem', 'linux-headers',
113 language: ['c', 'cpp'])
114endif
115
116if 'CONFIG_TCG_INTERPRETER' in config_host
117 tcg_arch = 'tci'
118elif config_host['ARCH'] == 'sparc64'
119 tcg_arch = 'sparc'
120elif config_host['ARCH'] == 's390x'
121 tcg_arch = 's390'
122elif config_host['ARCH'] in ['x86_64', 'x32']
123 tcg_arch = 'i386'
124elif config_host['ARCH'] == 'ppc64'
125 tcg_arch = 'ppc'
126elif config_host['ARCH'] in ['riscv32', 'riscv64']
127 tcg_arch = 'riscv'
128else
129 tcg_arch = config_host['ARCH']
130endif
131add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
132 '-iquote', '.',
133 '-iquote', meson.current_source_dir(),
134 '-iquote', meson.current_source_dir() / 'accel/tcg',
135 '-iquote', meson.current_source_dir() / 'include',
136 '-iquote', meson.current_source_dir() / 'disas/libvixl',
137 language: ['c', 'cpp', 'objc'])
Alexander Bulekovc46f76d2020-09-02 13:36:50 -0400138
Marc-André Lureaufc929892019-07-13 01:47:54 +0400139link_language = meson.get_external_property('link_language', 'cpp')
140if link_language == 'cpp'
141 add_languages('cpp', required: true, native: false)
142endif
Paolo Bonzinia5665052019-06-10 12:05:14 +0200143if host_machine.system() == 'darwin'
144 add_languages('objc', required: false, native: false)
145endif
146
Paolo Bonzinideb62372020-09-01 07:51:16 -0400147sparse = find_program('cgcc', required: get_option('sparse'))
148if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100149 run_target('sparse',
150 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400151 'compile_commands.json', sparse.full_path(), '-Wbitwise',
152 '-Wno-transparent-union', '-Wno-old-initializer',
153 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100154endif
155
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200156###########################################
157# Target-specific checks and dependencies #
158###########################################
159
160if targetos != 'linux' and get_option('mpath').enabled()
161 error('Multipath is supported only on Linux')
162endif
163
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400164m = cc.find_library('m', required: false)
165util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200166winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400167socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400168version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400169coref = []
170iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400171emulator_link_args = []
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400172cocoa = not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400173hvf = not_found
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400174if targetos == 'windows'
175 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200176 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400177
178 win = import('windows')
179 version_res = win.compile_resources('version.rc',
180 depend_files: files('pc-bios/qemu-nsis.ico'),
181 include_directories: include_directories('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400182elif targetos == 'darwin'
183 coref = dependency('appleframeworks', modules: 'CoreFoundation')
184 iokit = dependency('appleframeworks', modules: 'IOKit')
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400185 cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200186elif targetos == 'sunos'
187 socket = [cc.find_library('socket'),
188 cc.find_library('nsl'),
189 cc.find_library('resolv')]
190elif targetos == 'haiku'
191 socket = [cc.find_library('posix_error_mapper'),
192 cc.find_library('network'),
193 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400194elif targetos == 'openbsd'
195 if not get_option('tcg').disabled() and target_dirs.length() > 0
196 # Disable OpenBSD W^X if available
197 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
198 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400199endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200200
Paolo Bonzini8a199802020-09-18 05:37:01 -0400201accelerators = []
202if not get_option('kvm').disabled() and targetos == 'linux'
203 accelerators += 'CONFIG_KVM'
204endif
205if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
206 accelerators += 'CONFIG_XEN'
207 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
208else
209 have_xen_pci_passthrough = false
210endif
211if not get_option('whpx').disabled() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000212 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400213 error('WHPX requires 64-bit host')
214 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
215 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
216 accelerators += 'CONFIG_WHPX'
217 endif
218endif
219if not get_option('hvf').disabled()
220 hvf = dependency('appleframeworks', modules: 'Hypervisor',
221 required: get_option('hvf'))
222 if hvf.found()
223 accelerators += 'CONFIG_HVF'
224 endif
225endif
226if not get_option('hax').disabled()
227 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
228 accelerators += 'CONFIG_HAX'
229 endif
230endif
231if not get_option('tcg').disabled()
232 if cpu not in supported_cpus
233 if 'CONFIG_TCG_INTERPRETER' in config_host
234 warning('Unsupported CPU @0@, will use TCG with TCI (experimental)'.format(cpu))
235 else
236 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
237 endif
238 endif
239 accelerators += 'CONFIG_TCG'
240 config_host += { 'CONFIG_TCG': 'y' }
241endif
242
243if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
244 error('KVM not available on this platform')
245endif
246if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
247 error('HVF not available on this platform')
248endif
249if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
250 error('WHPX not available on this platform')
251endif
252if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
253 if 'CONFIG_XEN' in accelerators
254 error('Xen PCI passthrough not available on this platform')
255 else
256 error('Xen PCI passthrough requested but Xen not enabled')
257 endif
258endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400259if not cocoa.found() and get_option('cocoa').enabled()
260 error('Cocoa not available on this platform')
261endif
262
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200263################
264# Dependencies #
265################
266
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400267# The path to glib.h is added to all compilation commands. This was
268# grandfathered in from the QEMU Makefiles.
269add_project_arguments(config_host['GLIB_CFLAGS'].split(),
270 native: false, language: ['c', 'cpp', 'objc'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400271glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
272 link_args: config_host['GLIB_LIBS'].split())
273# override glib dep with the configure results (for subprojects)
274meson.override_dependency('glib-2.0', glib)
275
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400276gio = not_found
277if 'CONFIG_GIO' in config_host
278 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
279 link_args: config_host['GIO_LIBS'].split())
280endif
281lttng = not_found
282if 'CONFIG_TRACE_UST' in config_host
283 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
284endif
285urcubp = not_found
286if 'CONFIG_TRACE_UST' in config_host
287 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
288endif
Daniel P. Berrangé46859d92020-09-01 14:30:49 +0100289gcrypt = not_found
290if 'CONFIG_GCRYPT' in config_host
291 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
292 link_args: config_host['GCRYPT_LIBS'].split())
293endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400294nettle = not_found
295if 'CONFIG_NETTLE' in config_host
296 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
297 link_args: config_host['NETTLE_LIBS'].split())
298endif
299gnutls = not_found
300if 'CONFIG_GNUTLS' in config_host
301 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
302 link_args: config_host['GNUTLS_LIBS'].split())
303endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200304pixman = not_found
305if have_system or have_tools
306 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzini1a949332020-08-31 06:27:00 -0400307 method: 'pkg-config', static: enable_static)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200308endif
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400309pam = not_found
310if 'CONFIG_AUTH_PAM' in config_host
311 pam = cc.find_library('pam')
312endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400313libaio = cc.find_library('aio', required: false)
Paolo Bonzini1ffb3bb2020-08-28 19:33:54 +0200314zlib = dependency('zlib', required: true, static: enable_static)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400315linux_io_uring = not_found
316if 'CONFIG_LINUX_IO_URING' in config_host
317 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
318 link_args: config_host['LINUX_IO_URING_LIBS'].split())
319endif
320libxml2 = not_found
321if 'CONFIG_LIBXML2' in config_host
322 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
323 link_args: config_host['LIBXML2_LIBS'].split())
324endif
325libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +0100326if not get_option('libnfs').auto() or have_block
327 libnfs = dependency('libnfs', version: '>=1.9.3',
328 required: get_option('libnfs'),
329 method: 'pkg-config', static: enable_static)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400330endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100331
332libattr_test = '''
333 #include <stddef.h>
334 #include <sys/types.h>
335 #ifdef CONFIG_LIBATTR
336 #include <attr/xattr.h>
337 #else
338 #include <sys/xattr.h>
339 #endif
340 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
341
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400342libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100343have_old_libattr = false
344if not get_option('attr').disabled()
345 if cc.links(libattr_test)
346 libattr = declare_dependency()
347 else
348 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
349 required: get_option('attr'),
350 static: enable_static)
351 if libattr.found() and not \
352 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
353 libattr = not_found
354 if get_option('attr').enabled()
355 error('could not link libattr')
356 else
357 warning('could not link libattr, disabling')
358 endif
359 else
360 have_old_libattr = libattr.found()
361 endif
362 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400363endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100364
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100365seccomp = not_found
Paolo Bonzini90835c22020-11-17 14:22:24 +0100366if not get_option('seccomp').auto() or have_system or have_tools
367 seccomp = dependency('libseccomp', version: '>=2.3.0',
368 required: get_option('seccomp'),
369 method: 'pkg-config', static: enable_static)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100370endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100371
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100372libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100373if not get_option('cap_ng').auto() or have_system or have_tools
374 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
375 required: get_option('cap_ng'),
376 static: enable_static)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100377endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100378if libcap_ng.found() and not cc.links('''
379 #include <cap-ng.h>
380 int main(void)
381 {
382 capng_capability_to_name(CAPNG_EFFECTIVE);
383 return 0;
384 }''', dependencies: libcap_ng)
385 libcap_ng = not_found
386 if get_option('cap_ng').enabled()
387 error('could not link libcap-ng')
388 else
389 warning('could not link libcap-ng, disabling')
390 endif
391endif
392
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400393if get_option('xkbcommon').auto() and not have_system and not have_tools
394 xkbcommon = not_found
395else
396 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400397 method: 'pkg-config', static: enable_static)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400398endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400399vde = not_found
400if config_host.has_key('CONFIG_VDE')
401 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
402endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200403pulse = not_found
404if 'CONFIG_LIBPULSE' in config_host
405 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
406 link_args: config_host['PULSE_LIBS'].split())
407endif
408alsa = not_found
409if 'CONFIG_ALSA' in config_host
410 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
411 link_args: config_host['ALSA_LIBS'].split())
412endif
413jack = not_found
414if 'CONFIG_LIBJACK' in config_host
415 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
416endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200417spice = not_found
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200418spice_headers = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200419if 'CONFIG_SPICE' in config_host
420 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
421 link_args: config_host['SPICE_LIBS'].split())
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200422 spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
Paolo Bonzini26347332019-07-29 15:40:07 +0200423endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400424rt = cc.find_library('rt', required: false)
Paolo Bonziniccf7afa2020-09-01 06:44:23 -0400425libdl = not_found
426if 'CONFIG_PLUGIN' in config_host
427 libdl = cc.find_library('dl', required: true)
428endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200429libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100430if not get_option('libiscsi').auto() or have_block
431 libiscsi = dependency('libiscsi', version: '>=1.9.0',
432 required: get_option('libiscsi'),
433 method: 'pkg-config', static: enable_static)
Paolo Bonzini99650b62019-06-10 12:21:14 +0200434endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400435zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +0100436if not get_option('zstd').auto() or have_block
437 zstd = dependency('libzstd', version: '>=1.4.0',
438 required: get_option('zstd'),
439 method: 'pkg-config', static: enable_static)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400440endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400441gbm = not_found
442if 'CONFIG_GBM' in config_host
443 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
444 link_args: config_host['GBM_LIBS'].split())
445endif
446virgl = not_found
447if 'CONFIG_VIRGL' in config_host
448 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
449 link_args: config_host['VIRGL_LIBS'].split())
450endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400451curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100452if not get_option('curl').auto() or have_block
453 curl = dependency('libcurl', version: '>=7.29.0',
454 method: 'pkg-config',
455 required: get_option('curl'),
456 static: enable_static)
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400457endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200458libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200459if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200460 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +0100461 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400462 required: get_option('libudev'),
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200463 static: enable_static)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200464endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200465
Paolo Bonzini5c530152020-10-15 06:09:27 -0400466mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200467mpathpersist = not_found
468mpathpersist_new_api = false
469if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
470 mpath_test_source_new = '''
471 #include <libudev.h>
472 #include <mpath_persist.h>
473 unsigned mpath_mx_alloc_len = 1024;
474 int logsink;
475 static struct config *multipath_conf;
476 extern struct udev *udev;
477 extern struct config *get_multipath_config(void);
478 extern void put_multipath_config(struct config *conf);
479 struct udev *udev;
480 struct config *get_multipath_config(void) { return multipath_conf; }
481 void put_multipath_config(struct config *conf) { }
482 int main(void) {
483 udev = udev_new();
484 multipath_conf = mpath_lib_init();
485 return 0;
486 }'''
487 mpath_test_source_old = '''
488 #include <libudev.h>
489 #include <mpath_persist.h>
490 unsigned mpath_mx_alloc_len = 1024;
491 int logsink;
492 int main(void) {
493 struct udev *udev = udev_new();
494 mpath_lib_init(udev);
495 return 0;
496 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400497 libmpathpersist = cc.find_library('mpathpersist',
498 required: get_option('mpath'),
499 static: enable_static)
500 if libmpathpersist.found()
501 mpathlibs += libmpathpersist
502 if enable_static
503 mpathlibs += cc.find_library('devmapper',
504 required: get_option('mpath'),
505 static: enable_static)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200506 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400507 mpathlibs += cc.find_library('multipath',
508 required: get_option('mpath'),
509 static: enable_static)
510 foreach lib: mpathlibs
511 if not lib.found()
512 mpathlibs = []
513 break
514 endif
515 endforeach
516 if mpathlibs.length() == 0
517 msg = 'Dependencies missing for libmpathpersist'
518 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200519 mpathpersist = declare_dependency(dependencies: mpathlibs)
520 mpathpersist_new_api = true
521 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
522 mpathpersist = declare_dependency(dependencies: mpathlibs)
523 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400524 msg = 'Cannot detect libmpathpersist API'
525 endif
526 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200527 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400528 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200529 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400530 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200531 endif
532 endif
533 endif
534endif
535
Yonggang Luo5285e592020-10-13 07:43:48 +0800536iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800537curses = not_found
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400538if have_system and not get_option('curses').disabled()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400539 curses_test = '''
540 #include <locale.h>
541 #include <curses.h>
542 #include <wchar.h>
543 int main(void) {
544 wchar_t wch = L'w';
545 setlocale(LC_ALL, "");
546 resize_term(0, 0);
547 addwstr(L"wide chars\n");
548 addnwstr(&wch, 1);
549 add_wch(WACS_DEGREE);
550 return 0;
551 }'''
552
Yonggang Luoca31e302020-11-17 05:31:06 +0800553 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
554 foreach curses_dep : curses_dep_list
555 if not curses.found()
556 curses = dependency(curses_dep,
557 required: false,
558 method: 'pkg-config',
559 static: enable_static)
560 endif
561 endforeach
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400562 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500563 curses_compile_args = ['-DNCURSES_WIDECHAR']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400564 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500565 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
566 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400567 else
568 msg = 'curses package not usable'
569 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800570 endif
571 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400572 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400573 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
574 if targetos != 'windows' and not has_curses_h
575 message('Trying with /usr/include/ncursesw')
576 curses_compile_args += ['-I/usr/include/ncursesw']
577 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
578 endif
579 if has_curses_h
580 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
581 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800582 libcurses = cc.find_library(curses_libname,
583 required: false,
Yonggang Luo5285e592020-10-13 07:43:48 +0800584 static: enable_static)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400585 if libcurses.found()
586 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
587 curses = declare_dependency(compile_args: curses_compile_args,
588 dependencies: [libcurses])
589 break
590 else
591 msg = 'curses library not usable'
592 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800593 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400594 endforeach
595 endif
596 endif
597 if not get_option('iconv').disabled()
598 foreach link_args : [ ['-liconv'], [] ]
599 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
600 # We need to use libiconv if available because mixing libiconv's headers with
601 # the system libc does not work.
602 # However, without adding glib to the dependencies -L/usr/local/lib will not be
603 # included in the command line and libiconv will not be found.
604 if cc.links('''
605 #include <iconv.h>
606 int main(void) {
607 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
608 return conv != (iconv_t) -1;
609 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
610 iconv = declare_dependency(link_args: link_args, dependencies: glib)
611 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800612 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400613 endforeach
614 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400615 if curses.found() and not iconv.found()
616 if get_option('iconv').enabled()
617 error('iconv not available')
618 endif
619 msg = 'iconv required for curses UI but not available'
620 curses = not_found
621 endif
622 if not curses.found() and msg != ''
623 if get_option('curses').enabled()
624 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400625 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400626 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400627 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800628 endif
629endif
630
Paolo Bonzini26347332019-07-29 15:40:07 +0200631brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100632if not get_option('brlapi').auto() or have_system
633 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
634 required: get_option('brlapi'),
635 static: enable_static)
636 if brlapi.found() and not cc.links('''
637 #include <brlapi.h>
638 #include <stddef.h>
639 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
640 brlapi = not_found
641 if get_option('brlapi').enabled()
642 error('could not link brlapi')
643 else
644 warning('could not link brlapi, disabling')
645 endif
646 endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200647endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100648
Paolo Bonzini760e4322020-08-26 08:09:48 +0200649sdl = not_found
650if have_system
Yonggang Luo363743d2020-08-26 23:10:03 +0800651 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200652 sdl_image = not_found
653endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100654if sdl.found()
655 # work around 2.0.8 bug
656 sdl = declare_dependency(compile_args: '-Wno-undef',
657 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200658 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400659 method: 'pkg-config', static: enable_static)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100660else
661 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100662 error('sdl-image required, but SDL was @0@'.format(
663 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100664 endif
665 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200666endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100667
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400668rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100669if not get_option('rbd').auto() or have_block
670 librados = cc.find_library('rados', required: get_option('rbd'),
671 static: enable_static)
672 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
673 required: get_option('rbd'),
674 static: enable_static)
675 if librados.found() and librbd.found() and cc.links('''
676 #include <stdio.h>
677 #include <rbd/librbd.h>
678 int main(void) {
679 rados_t cluster;
680 rados_create(&cluster, NULL);
681 return 0;
682 }''', dependencies: [librbd, librados])
683 rbd = declare_dependency(dependencies: [librbd, librados])
684 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400685endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100686
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400687glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100688glusterfs_ftruncate_has_stat = false
689glusterfs_iocb_has_stat = false
690if not get_option('glusterfs').auto() or have_block
691 glusterfs = dependency('glusterfs-api', version: '>=3',
692 required: get_option('glusterfs'),
693 method: 'pkg-config', static: enable_static)
694 if glusterfs.found()
695 glusterfs_ftruncate_has_stat = cc.links('''
696 #include <glusterfs/api/glfs.h>
697
698 int
699 main(void)
700 {
701 /* new glfs_ftruncate() passes two additional args */
702 return glfs_ftruncate(NULL, 0, NULL, NULL);
703 }
704 ''', dependencies: glusterfs)
705 glusterfs_iocb_has_stat = cc.links('''
706 #include <glusterfs/api/glfs.h>
707
708 /* new glfs_io_cbk() passes two additional glfs_stat structs */
709 static void
710 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
711 {}
712
713 int
714 main(void)
715 {
716 glfs_io_cbk iocb = &glusterfs_iocb;
717 iocb(NULL, 0 , NULL, NULL, NULL);
718 return 0;
719 }
720 ''', dependencies: glusterfs)
721 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400722endif
723libssh = not_found
724if 'CONFIG_LIBSSH' in config_host
725 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
726 link_args: config_host['LIBSSH_LIBS'].split())
727endif
728libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100729if not get_option('bzip2').auto() or have_block
730 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
731 required: get_option('bzip2'),
732 static: enable_static)
733 if libbzip2.found() and not cc.links('''
734 #include <bzlib.h>
735 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
736 libbzip2 = not_found
737 if get_option('bzip2').enabled()
738 error('could not link libbzip2')
739 else
740 warning('could not link libbzip2, disabling')
741 endif
742 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400743endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100744
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400745liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +0100746if not get_option('lzfse').auto() or have_block
747 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
748 required: get_option('lzfse'),
749 static: enable_static)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400750endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100751if liblzfse.found() and not cc.links('''
752 #include <lzfse.h>
753 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
754 liblzfse = not_found
755 if get_option('lzfse').enabled()
756 error('could not link liblzfse')
757 else
758 warning('could not link liblzfse, disabling')
759 endif
760endif
761
Paolo Bonzini478e9432020-08-17 12:47:55 +0200762oss = not_found
763if 'CONFIG_AUDIO_OSS' in config_host
764 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
765endif
766dsound = not_found
767if 'CONFIG_AUDIO_DSOUND' in config_host
768 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
769endif
770coreaudio = not_found
771if 'CONFIG_AUDIO_COREAUDIO' in config_host
772 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
773endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400774opengl = not_found
775if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400776 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
777 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400778endif
779gtk = not_found
780if 'CONFIG_GTK' in config_host
781 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
782 link_args: config_host['GTK_LIBS'].split())
783endif
784vte = not_found
785if 'CONFIG_VTE' in config_host
786 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
787 link_args: config_host['VTE_LIBS'].split())
788endif
789x11 = not_found
790if 'CONFIG_X11' in config_host
791 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
792 link_args: config_host['X11_LIBS'].split())
793endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100794vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400795png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400796jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400797sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100798if get_option('vnc').enabled()
799 vnc = declare_dependency() # dummy dependency
800 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400801 method: 'pkg-config', static: enable_static)
Paolo Bonzini8e242b32020-11-23 13:34:02 -0500802 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
803 method: 'pkg-config', static: enable_static)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100804 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
805 required: get_option('vnc_sasl'),
806 static: enable_static)
807 if sasl.found()
808 sasl = declare_dependency(dependencies: sasl,
809 compile_args: '-DSTRUCT_IOVEC_DEFINED')
810 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400811endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100812
Marc-André Lureau708eab42019-09-03 16:59:33 +0400813snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +0100814if not get_option('snappy').auto() or have_system
815 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
816 required: get_option('snappy'),
817 static: enable_static)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400818endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100819if snappy.found() and not cc.links('''
820 #include <snappy-c.h>
821 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
822 snappy = not_found
823 if get_option('snappy').enabled()
824 error('could not link libsnappy')
825 else
826 warning('could not link libsnappy, disabling')
827 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400828endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100829
Marc-André Lureau708eab42019-09-03 16:59:33 +0400830lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100831if not get_option('lzo').auto() or have_system
832 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
833 required: get_option('lzo'),
834 static: enable_static)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400835endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100836if lzo.found() and not cc.links('''
837 #include <lzo/lzo1x.h>
838 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
839 lzo = not_found
840 if get_option('lzo').enabled()
841 error('could not link liblzo2')
842 else
843 warning('could not link liblzo2, disabling')
844 endif
845endif
846
Marc-André Lureau55166232019-07-24 19:16:22 +0400847rdma = not_found
848if 'CONFIG_RDMA' in config_host
849 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
850endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400851numa = not_found
852if 'CONFIG_NUMA' in config_host
853 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
854endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400855xen = not_found
856if 'CONFIG_XEN_BACKEND' in config_host
857 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
858 link_args: config_host['XEN_LIBS'].split())
859endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200860cacard = not_found
861if 'CONFIG_SMARTCARD' in config_host
862 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
863 link_args: config_host['SMARTCARD_LIBS'].split())
864endif
César Belley0a40bcb2020-08-26 13:42:04 +0200865u2f = not_found
866if have_system
867 u2f = dependency('u2f-emu', required: get_option('u2f'),
868 method: 'pkg-config',
869 static: enable_static)
870endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200871usbredir = not_found
872if 'CONFIG_USB_REDIR' in config_host
873 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
874 link_args: config_host['USB_REDIR_LIBS'].split())
875endif
876libusb = not_found
877if 'CONFIG_USB_LIBUSB' in config_host
878 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
879 link_args: config_host['LIBUSB_LIBS'].split())
880endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400881libpmem = not_found
882if 'CONFIG_LIBPMEM' in config_host
883 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
884 link_args: config_host['LIBPMEM_LIBS'].split())
885endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600886libdaxctl = not_found
887if 'CONFIG_LIBDAXCTL' in config_host
888 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
889endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +0400890tasn1 = not_found
891if 'CONFIG_TASN1' in config_host
892 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
893 link_args: config_host['TASN1_LIBS'].split())
894endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400895keyutils = dependency('libkeyutils', required: false,
896 method: 'pkg-config', static: enable_static)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400897
Marc-André Lureau3909def2020-08-28 15:07:33 +0400898has_gettid = cc.has_function('gettid')
899
Paolo Bonziniaa087962020-09-01 11:15:30 -0400900# Malloc tests
901
902malloc = []
903if get_option('malloc') == 'system'
904 has_malloc_trim = \
905 not get_option('malloc_trim').disabled() and \
906 cc.links('''#include <malloc.h>
907 int main(void) { malloc_trim(0); return 0; }''')
908else
909 has_malloc_trim = false
910 malloc = cc.find_library(get_option('malloc'), required: true)
911endif
912if not has_malloc_trim and get_option('malloc_trim').enabled()
913 if get_option('malloc') == 'system'
914 error('malloc_trim not available on this platform.')
915 else
916 error('malloc_trim not available with non-libc memory allocator')
917 endif
918endif
919
Max Reitz84e319a2020-11-02 17:18:55 +0100920# Check whether the glibc provides statx()
921
922statx_test = '''
923 #ifndef _GNU_SOURCE
924 #define _GNU_SOURCE
925 #endif
926 #include <sys/stat.h>
927 int main(void) {
928 struct statx statxbuf;
929 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
930 return 0;
931 }'''
932
933has_statx = cc.links(statx_test)
934
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000935have_vhost_user_blk_server = (targetos == 'linux' and
936 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000937
938if get_option('vhost_user_blk_server').enabled()
939 if targetos != 'linux'
940 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000941 elif 'CONFIG_VHOST_USER' not in config_host
942 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000943 endif
944elif get_option('vhost_user_blk_server').disabled() or not have_system
945 have_vhost_user_blk_server = false
946endif
947
Daniele Buono9e62ba42020-12-04 18:06:14 -0500948
Max Reitzdf4ea702020-10-27 20:05:46 +0100949if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
950 error('Cannot enable fuse-lseek while fuse is disabled')
951endif
952
Max Reitza484a712020-10-27 20:05:41 +0100953fuse = dependency('fuse3', required: get_option('fuse'),
954 version: '>=3.1', method: 'pkg-config',
955 static: enable_static)
956
Max Reitzdf4ea702020-10-27 20:05:46 +0100957fuse_lseek = not_found
958if not get_option('fuse_lseek').disabled()
959 if fuse.version().version_compare('>=3.8')
960 # Dummy dependency
961 fuse_lseek = declare_dependency()
962 elif get_option('fuse_lseek').enabled()
963 if fuse.found()
964 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
965 else
966 error('fuse-lseek requires libfuse, which was not found')
967 endif
968 endif
969endif
970
Daniele Buono9e62ba42020-12-04 18:06:14 -0500971if get_option('cfi')
972 cfi_flags=[]
973 # Check for dependency on LTO
974 if not get_option('b_lto')
975 error('Selected Control-Flow Integrity but LTO is disabled')
976 endif
977 if config_host.has_key('CONFIG_MODULES')
978 error('Selected Control-Flow Integrity is not compatible with modules')
979 endif
980 # Check for cfi flags. CFI requires LTO so we can't use
981 # get_supported_arguments, but need a more complex "compiles" which allows
982 # custom arguments
983 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
984 args: ['-flto', '-fsanitize=cfi-icall'] )
985 cfi_flags += '-fsanitize=cfi-icall'
986 else
987 error('-fsanitize=cfi-icall is not supported by the compiler')
988 endif
989 if cc.compiles('int main () { return 0; }',
990 name: '-fsanitize-cfi-icall-generalize-pointers',
991 args: ['-flto', '-fsanitize=cfi-icall',
992 '-fsanitize-cfi-icall-generalize-pointers'] )
993 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
994 else
995 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
996 endif
997 if get_option('cfi_debug')
998 if cc.compiles('int main () { return 0; }',
999 name: '-fno-sanitize-trap=cfi-icall',
1000 args: ['-flto', '-fsanitize=cfi-icall',
1001 '-fno-sanitize-trap=cfi-icall'] )
1002 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1003 else
1004 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1005 endif
1006 endif
1007 add_project_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1008 add_project_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1009endif
1010
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001011#################
1012# config-host.h #
1013#################
Paolo Bonzini859aef02020-08-04 18:14:26 +02001014
Paolo Bonzini69202b42020-11-17 14:46:21 +01001015have_virtfs = (targetos == 'linux' and
1016 have_system and
1017 libattr.found() and
1018 libcap_ng.found())
1019
1020if get_option('virtfs').enabled()
1021 if not have_virtfs
1022 if targetos != 'linux'
1023 error('virtio-9p (virtfs) requires Linux')
1024 elif not libcap_ng.found() or not libattr.found()
1025 error('virtio-9p (virtfs) requires libcap-ng-devel and libattr-devel')
1026 elif not have_system
1027 error('virtio-9p (virtfs) needs system emulation support')
1028 endif
1029 endif
1030elif get_option('virtfs').disabled()
1031 have_virtfs = false
1032endif
1033
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001034config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1035config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1036config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1037config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1038config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
1039config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
1040config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1041config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1042config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1043config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1044config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1045config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1046
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001047config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001048config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04001049config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001050config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001051config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001052config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1053config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001054config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08001055config_host_data.set('CONFIG_CURSES', curses.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001056config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1057if glusterfs.found()
1058 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1059 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1060 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1061 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1062 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1063 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1064endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001065config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001066config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001067config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01001068config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001069config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001070config_host_data.set('CONFIG_SDL', sdl.found())
1071config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01001072config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01001073config_host_data.set('CONFIG_SNAPPY', snappy.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001074config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001075config_host_data.set('CONFIG_VNC', vnc.found())
1076config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1077config_host_data.set('CONFIG_VNC_PNG', png.found())
1078config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01001079config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001080config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001081config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04001082config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonziniaa087962020-09-01 11:15:30 -04001083config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01001084config_host_data.set('CONFIG_STATX', has_statx)
Paolo Bonzinib1def332020-11-17 13:37:39 +01001085config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01001086config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01001087config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Daniele Buono9e62ba42020-12-04 18:06:14 -05001088config_host_data.set('CONFIG_CFI', get_option('cfi'))
Paolo Bonzini859aef02020-08-04 18:14:26 +02001089config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1090config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1091config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1092config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1093
Thomas Huth48f670e2020-11-18 18:10:52 +01001094config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001095config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001096config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001097config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001098config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Thomas Huth88c78f12020-11-18 18:10:50 +01001099config_host_data.set('HAVE_SYS_SIGNAL_H', cc.has_header('sys/signal.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001100
Paolo Bonzini765686d2020-09-18 06:37:21 -04001101ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
Paolo Bonzini859aef02020-08-04 18:14:26 +02001102arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001103strings = ['HOST_DSOSUF', 'CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001104foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -04001105 if ignored.contains(k)
1106 # do nothing
1107 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001108 if v != ''
1109 v = '"' + '", "'.join(v.split()) + '", '
1110 endif
1111 config_host_data.set(k, v)
1112 elif k == 'ARCH'
1113 config_host_data.set('HOST_' + v.to_upper(), 1)
1114 elif strings.contains(k)
1115 if not k.startswith('CONFIG_')
1116 k = 'CONFIG_' + k.to_upper()
1117 endif
1118 config_host_data.set_quoted(k, v)
1119 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
1120 config_host_data.set(k, v == 'y' ? 1 : v)
1121 endif
1122endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02001123
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001124########################
1125# Target configuration #
1126########################
1127
Paolo Bonzini2becc362020-02-03 11:42:03 +01001128minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04001129config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001130config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001131config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001132config_devices_mak_list = []
1133config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02001134config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001135config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001136
1137disassemblers = {
1138 'alpha' : ['CONFIG_ALPHA_DIS'],
1139 'arm' : ['CONFIG_ARM_DIS'],
1140 'avr' : ['CONFIG_AVR_DIS'],
1141 'cris' : ['CONFIG_CRIS_DIS'],
1142 'hppa' : ['CONFIG_HPPA_DIS'],
1143 'i386' : ['CONFIG_I386_DIS'],
1144 'x86_64' : ['CONFIG_I386_DIS'],
1145 'x32' : ['CONFIG_I386_DIS'],
1146 'lm32' : ['CONFIG_LM32_DIS'],
1147 'm68k' : ['CONFIG_M68K_DIS'],
1148 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1149 'mips' : ['CONFIG_MIPS_DIS'],
1150 'moxie' : ['CONFIG_MOXIE_DIS'],
1151 'nios2' : ['CONFIG_NIOS2_DIS'],
1152 'or1k' : ['CONFIG_OPENRISC_DIS'],
1153 'ppc' : ['CONFIG_PPC_DIS'],
1154 'riscv' : ['CONFIG_RISCV_DIS'],
1155 'rx' : ['CONFIG_RX_DIS'],
1156 's390' : ['CONFIG_S390_DIS'],
1157 'sh4' : ['CONFIG_SH4_DIS'],
1158 'sparc' : ['CONFIG_SPARC_DIS'],
1159 'xtensa' : ['CONFIG_XTENSA_DIS'],
1160}
1161if link_language == 'cpp'
1162 disassemblers += {
1163 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1164 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1165 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1166 }
1167endif
1168
Paolo Bonzini0a189112020-11-17 14:58:32 +01001169host_kconfig = \
1170 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
1171 ('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
1172 ('CONFIG_IVSHMEM' in config_host ? ['CONFIG_IVSHMEM=y'] : []) + \
1173 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
1174 ('CONFIG_X11' in config_host ? ['CONFIG_X11=y'] : []) + \
1175 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1176 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1177 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01001178 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001179 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
1180 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : [])
1181
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001182ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001183
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001184default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1185actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001186fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001187foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04001188 config_target = { 'TARGET_NAME': target.split('-')[0] }
1189 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001190 if targetos != 'linux'
1191 if default_targets
1192 continue
1193 endif
1194 error('Target @0@ is only available on a Linux host'.format(target))
1195 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001196 config_target += { 'CONFIG_LINUX_USER': 'y' }
1197 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001198 if 'CONFIG_BSD' not in config_host
1199 if default_targets
1200 continue
1201 endif
1202 error('Target @0@ is only available on a BSD host'.format(target))
1203 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001204 config_target += { 'CONFIG_BSD_USER': 'y' }
1205 elif target.endswith('softmmu')
1206 config_target += { 'CONFIG_SOFTMMU': 'y' }
1207 endif
1208 if target.endswith('-user')
1209 config_target += {
1210 'CONFIG_USER_ONLY': 'y',
1211 'CONFIG_QEMU_INTERP_PREFIX':
1212 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1213 }
1214 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001215
Paolo Bonzini0a189112020-11-17 14:58:32 +01001216 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04001217 foreach sym: accelerators
1218 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1219 config_target += { sym: 'y' }
1220 config_all += { sym: 'y' }
1221 if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
1222 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1223 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01001224 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04001225 endif
1226 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01001227 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001228 if default_targets
1229 continue
1230 endif
1231 error('No accelerator available for target @0@'.format(target))
1232 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001233
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001234 actual_target_dirs += target
Paolo Bonzini765686d2020-09-18 06:37:21 -04001235 config_target += keyval.load('default-configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001236 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001237
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001238 if 'TARGET_NEED_FDT' in config_target
1239 fdt_required += target
1240 endif
1241
Paolo Bonzinifa731682020-09-21 05:19:07 -04001242 # Add default keys
1243 if 'TARGET_BASE_ARCH' not in config_target
1244 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1245 endif
1246 if 'TARGET_ABI_DIR' not in config_target
1247 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1248 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001249
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001250 foreach k, v: disassemblers
1251 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1252 foreach sym: v
1253 config_target += { sym: 'y' }
1254 config_all_disas += { sym: 'y' }
1255 endforeach
1256 endif
1257 endforeach
1258
Paolo Bonzini859aef02020-08-04 18:14:26 +02001259 config_target_data = configuration_data()
1260 foreach k, v: config_target
1261 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1262 # do nothing
1263 elif ignored.contains(k)
1264 # do nothing
1265 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001266 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1267 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001268 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001269 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001270 config_target_data.set_quoted(k, v)
1271 elif v == 'y'
1272 config_target_data.set(k, 1)
1273 else
1274 config_target_data.set(k, v)
1275 endif
1276 endforeach
1277 config_target_h += {target: configure_file(output: target + '-config-target.h',
1278 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001279
1280 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001281 config_devices_mak = target + '-config-devices.mak'
1282 config_devices_mak = configure_file(
Paolo Bonzini1bb4cb12020-09-18 06:06:09 -04001283 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001284 output: config_devices_mak,
1285 depfile: config_devices_mak + '.d',
1286 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01001287 command: [minikconf,
1288 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01001289 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzini0a189112020-11-17 14:58:32 +01001290 host_kconfig, accel_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02001291
1292 config_devices_data = configuration_data()
1293 config_devices = keyval.load(config_devices_mak)
1294 foreach k, v: config_devices
1295 config_devices_data.set(k, 1)
1296 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001297 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001298 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1299 configuration: config_devices_data)}
1300 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001301 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001302 endif
1303 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001304endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001305target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001306
Paolo Bonzini2becc362020-02-03 11:42:03 +01001307# This configuration is used to build files that are shared by
1308# multiple binaries, and then extracted out of the "common"
1309# static_library target.
1310#
1311# We do not use all_sources()/all_dependencies(), because it would
1312# build literally all source files, including devices only used by
1313# targets that are not built for this compilation. The CONFIG_ALL
1314# pseudo symbol replaces it.
1315
Paolo Bonzini05512f52020-09-16 15:31:11 -04001316config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001317config_all += config_host
1318config_all += config_all_disas
1319config_all += {
1320 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1321 'CONFIG_SOFTMMU': have_system,
1322 'CONFIG_USER_ONLY': have_user,
1323 'CONFIG_ALL': true,
1324}
1325
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001326##############
1327# Submodules #
1328##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001329
1330capstone = not_found
1331capstone_opt = get_option('capstone')
1332if capstone_opt in ['enabled', 'auto', 'system']
1333 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07001334 capstone = dependency('capstone', version: '>=4.0',
1335 static: enable_static, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001336 required: capstone_opt == 'system' or
1337 capstone_opt == 'enabled' and not have_internal)
1338 if capstone.found()
1339 capstone_opt = 'system'
1340 elif have_internal
1341 capstone_opt = 'internal'
1342 else
1343 capstone_opt = 'disabled'
1344 endif
1345endif
1346if capstone_opt == 'internal'
1347 capstone_data = configuration_data()
1348 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1349
1350 capstone_files = files(
1351 'capstone/cs.c',
1352 'capstone/MCInst.c',
1353 'capstone/MCInstrDesc.c',
1354 'capstone/MCRegisterInfo.c',
1355 'capstone/SStream.c',
1356 'capstone/utils.c'
1357 )
1358
1359 if 'CONFIG_ARM_DIS' in config_all_disas
1360 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1361 capstone_files += files(
1362 'capstone/arch/ARM/ARMDisassembler.c',
1363 'capstone/arch/ARM/ARMInstPrinter.c',
1364 'capstone/arch/ARM/ARMMapping.c',
1365 'capstone/arch/ARM/ARMModule.c'
1366 )
1367 endif
1368
1369 # FIXME: This config entry currently depends on a c++ compiler.
1370 # Which is needed for building libvixl, but not for capstone.
1371 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1372 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1373 capstone_files += files(
1374 'capstone/arch/AArch64/AArch64BaseInfo.c',
1375 'capstone/arch/AArch64/AArch64Disassembler.c',
1376 'capstone/arch/AArch64/AArch64InstPrinter.c',
1377 'capstone/arch/AArch64/AArch64Mapping.c',
1378 'capstone/arch/AArch64/AArch64Module.c'
1379 )
1380 endif
1381
1382 if 'CONFIG_PPC_DIS' in config_all_disas
1383 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1384 capstone_files += files(
1385 'capstone/arch/PowerPC/PPCDisassembler.c',
1386 'capstone/arch/PowerPC/PPCInstPrinter.c',
1387 'capstone/arch/PowerPC/PPCMapping.c',
1388 'capstone/arch/PowerPC/PPCModule.c'
1389 )
1390 endif
1391
Richard Henderson3d562842020-01-04 07:24:59 +10001392 if 'CONFIG_S390_DIS' in config_all_disas
1393 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1394 capstone_files += files(
1395 'capstone/arch/SystemZ/SystemZDisassembler.c',
1396 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1397 'capstone/arch/SystemZ/SystemZMapping.c',
1398 'capstone/arch/SystemZ/SystemZModule.c',
1399 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1400 )
1401 endif
1402
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001403 if 'CONFIG_I386_DIS' in config_all_disas
1404 capstone_data.set('CAPSTONE_HAS_X86', 1)
1405 capstone_files += files(
1406 'capstone/arch/X86/X86Disassembler.c',
1407 'capstone/arch/X86/X86DisassemblerDecoder.c',
1408 'capstone/arch/X86/X86ATTInstPrinter.c',
1409 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07001410 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001411 'capstone/arch/X86/X86Mapping.c',
1412 'capstone/arch/X86/X86Module.c'
1413 )
1414 endif
1415
1416 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1417
1418 capstone_cargs = [
1419 # FIXME: There does not seem to be a way to completely replace the c_args
1420 # that come from add_project_arguments() -- we can only add to them.
1421 # So: disable all warnings with a big hammer.
1422 '-Wno-error', '-w',
1423
1424 # Include all configuration defines via a header file, which will wind up
1425 # as a dependency on the object file, and thus changes here will result
1426 # in a rebuild.
1427 '-include', 'capstone-defs.h'
1428 ]
1429
1430 libcapstone = static_library('capstone',
1431 sources: capstone_files,
1432 c_args: capstone_cargs,
1433 include_directories: 'capstone/include')
1434 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07001435 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001436endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001437
1438slirp = not_found
1439slirp_opt = 'disabled'
1440if have_system
1441 slirp_opt = get_option('slirp')
1442 if slirp_opt in ['enabled', 'auto', 'system']
1443 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
1444 slirp = dependency('slirp', static: enable_static,
1445 method: 'pkg-config',
1446 required: slirp_opt == 'system' or
1447 slirp_opt == 'enabled' and not have_internal)
1448 if slirp.found()
1449 slirp_opt = 'system'
1450 elif have_internal
1451 slirp_opt = 'internal'
1452 else
1453 slirp_opt = 'disabled'
1454 endif
1455 endif
1456 if slirp_opt == 'internal'
1457 slirp_deps = []
1458 if targetos == 'windows'
1459 slirp_deps = cc.find_library('iphlpapi')
1460 endif
1461 slirp_conf = configuration_data()
1462 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1463 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1464 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1465 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1466 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1467 slirp_files = [
1468 'slirp/src/arp_table.c',
1469 'slirp/src/bootp.c',
1470 'slirp/src/cksum.c',
1471 'slirp/src/dhcpv6.c',
1472 'slirp/src/dnssearch.c',
1473 'slirp/src/if.c',
1474 'slirp/src/ip6_icmp.c',
1475 'slirp/src/ip6_input.c',
1476 'slirp/src/ip6_output.c',
1477 'slirp/src/ip_icmp.c',
1478 'slirp/src/ip_input.c',
1479 'slirp/src/ip_output.c',
1480 'slirp/src/mbuf.c',
1481 'slirp/src/misc.c',
1482 'slirp/src/ncsi.c',
1483 'slirp/src/ndp_table.c',
1484 'slirp/src/sbuf.c',
1485 'slirp/src/slirp.c',
1486 'slirp/src/socket.c',
1487 'slirp/src/state.c',
1488 'slirp/src/stream.c',
1489 'slirp/src/tcp_input.c',
1490 'slirp/src/tcp_output.c',
1491 'slirp/src/tcp_subr.c',
1492 'slirp/src/tcp_timer.c',
1493 'slirp/src/tftp.c',
1494 'slirp/src/udp.c',
1495 'slirp/src/udp6.c',
1496 'slirp/src/util.c',
1497 'slirp/src/version.c',
1498 'slirp/src/vmstate.c',
1499 ]
1500
1501 configure_file(
1502 input : 'slirp/src/libslirp-version.h.in',
1503 output : 'libslirp-version.h',
1504 configuration: slirp_conf)
1505
1506 slirp_inc = include_directories('slirp', 'slirp/src')
1507 libslirp = static_library('slirp',
1508 sources: slirp_files,
1509 c_args: slirp_cargs,
1510 include_directories: slirp_inc)
1511 slirp = declare_dependency(link_with: libslirp,
1512 dependencies: slirp_deps,
1513 include_directories: slirp_inc)
1514 endif
1515endif
1516
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001517fdt = not_found
1518fdt_opt = get_option('fdt')
1519if have_system
1520 if fdt_opt in ['enabled', 'auto', 'system']
1521 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
1522 fdt = cc.find_library('fdt', static: enable_static,
1523 required: fdt_opt == 'system' or
1524 fdt_opt == 'enabled' and not have_internal)
1525 if fdt.found() and cc.links('''
1526 #include <libfdt.h>
1527 #include <libfdt_env.h>
1528 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1529 dependencies: fdt)
1530 fdt_opt = 'system'
1531 elif have_internal
1532 fdt_opt = 'internal'
1533 else
1534 fdt_opt = 'disabled'
1535 endif
1536 endif
1537 if fdt_opt == 'internal'
1538 fdt_files = files(
1539 'dtc/libfdt/fdt.c',
1540 'dtc/libfdt/fdt_ro.c',
1541 'dtc/libfdt/fdt_wip.c',
1542 'dtc/libfdt/fdt_sw.c',
1543 'dtc/libfdt/fdt_rw.c',
1544 'dtc/libfdt/fdt_strerror.c',
1545 'dtc/libfdt/fdt_empty_tree.c',
1546 'dtc/libfdt/fdt_addresses.c',
1547 'dtc/libfdt/fdt_overlay.c',
1548 'dtc/libfdt/fdt_check.c',
1549 )
1550
1551 fdt_inc = include_directories('dtc/libfdt')
1552 libfdt = static_library('fdt',
1553 sources: fdt_files,
1554 include_directories: fdt_inc)
1555 fdt = declare_dependency(link_with: libfdt,
1556 include_directories: fdt_inc)
1557 endif
1558endif
1559if not fdt.found() and fdt_required.length() > 0
1560 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1561endif
1562
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001563config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001564config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001565config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001566
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001567#####################
1568# Generated sources #
1569#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001570
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001571genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001572
Marc-André Lureau3f885652019-07-15 18:06:04 +04001573hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04001574shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001575qapi_gen = find_program('scripts/qapi-gen.py')
1576qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1577 meson.source_root() / 'scripts/qapi/commands.py',
1578 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001579 meson.source_root() / 'scripts/qapi/error.py',
1580 meson.source_root() / 'scripts/qapi/events.py',
1581 meson.source_root() / 'scripts/qapi/expr.py',
1582 meson.source_root() / 'scripts/qapi/gen.py',
1583 meson.source_root() / 'scripts/qapi/introspect.py',
1584 meson.source_root() / 'scripts/qapi/parser.py',
1585 meson.source_root() / 'scripts/qapi/schema.py',
1586 meson.source_root() / 'scripts/qapi/source.py',
1587 meson.source_root() / 'scripts/qapi/types.py',
1588 meson.source_root() / 'scripts/qapi/visit.py',
1589 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001590 meson.source_root() / 'scripts/qapi-gen.py'
1591]
1592
1593tracetool = [
1594 python, files('scripts/tracetool.py'),
1595 '--backend=' + config_host['TRACE_BACKENDS']
1596]
1597
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001598qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1599 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02001600 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001601qemu_version = custom_target('qemu-version.h',
1602 output: 'qemu-version.h',
1603 command: qemu_version_cmd,
1604 capture: true,
1605 build_by_default: true,
1606 build_always_stale: true)
1607genh += qemu_version
1608
Marc-André Lureau3f885652019-07-15 18:06:04 +04001609hxdep = []
1610hx_headers = [
1611 ['qemu-options.hx', 'qemu-options.def'],
1612 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1613]
1614if have_system
1615 hx_headers += [
1616 ['hmp-commands.hx', 'hmp-commands.h'],
1617 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1618 ]
1619endif
1620foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001621 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04001622 input: files(d[0]),
1623 output: d[1],
1624 capture: true,
1625 build_by_default: true, # to be removed when added to a target
1626 command: [hxtool, '-h', '@INPUT0@'])
1627endforeach
1628genh += hxdep
1629
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001630###################
1631# Collect sources #
1632###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001633
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001634authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001635blockdev_ss = ss.source_set()
1636block_ss = ss.source_set()
1637bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001638chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001639common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001640crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001641io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001642linux_user_ss = ss.source_set()
1643qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001644qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001645softmmu_ss = ss.source_set()
1646specific_fuzz_ss = ss.source_set()
1647specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001648stub_ss = ss.source_set()
1649trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001650user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001651util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001652
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001653modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001654hw_arch = {}
1655target_arch = {}
1656target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001657
1658###############
1659# Trace files #
1660###############
1661
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001662# TODO: add each directory to the subdirs from its own meson.build, once
1663# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001664trace_events_subdirs = [
1665 'accel/kvm',
1666 'accel/tcg',
1667 'crypto',
1668 'monitor',
1669]
1670if have_user
1671 trace_events_subdirs += [ 'linux-user' ]
1672endif
1673if have_block
1674 trace_events_subdirs += [
1675 'authz',
1676 'block',
1677 'io',
1678 'nbd',
1679 'scsi',
1680 ]
1681endif
1682if have_system
1683 trace_events_subdirs += [
1684 'audio',
1685 'backends',
1686 'backends/tpm',
1687 'chardev',
1688 'hw/9pfs',
1689 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08001690 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001691 'hw/alpha',
1692 'hw/arm',
1693 'hw/audio',
1694 'hw/block',
1695 'hw/block/dataplane',
1696 'hw/char',
1697 'hw/display',
1698 'hw/dma',
1699 'hw/hppa',
1700 'hw/hyperv',
1701 'hw/i2c',
1702 'hw/i386',
1703 'hw/i386/xen',
1704 'hw/ide',
1705 'hw/input',
1706 'hw/intc',
1707 'hw/isa',
1708 'hw/mem',
1709 'hw/mips',
1710 'hw/misc',
1711 'hw/misc/macio',
1712 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08001713 'hw/net/can',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001714 'hw/nvram',
1715 'hw/pci',
1716 'hw/pci-host',
1717 'hw/ppc',
1718 'hw/rdma',
1719 'hw/rdma/vmw',
1720 'hw/rtc',
1721 'hw/s390x',
1722 'hw/scsi',
1723 'hw/sd',
1724 'hw/sparc',
1725 'hw/sparc64',
1726 'hw/ssi',
1727 'hw/timer',
1728 'hw/tpm',
1729 'hw/usb',
1730 'hw/vfio',
1731 'hw/virtio',
1732 'hw/watchdog',
1733 'hw/xen',
1734 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001735 'migration',
1736 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02001737 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001738 'ui',
1739 ]
1740endif
1741trace_events_subdirs += [
1742 'hw/core',
1743 'qapi',
1744 'qom',
1745 'target/arm',
1746 'target/hppa',
1747 'target/i386',
Claudio Fontanaa9dc68d2020-12-12 16:55:08 +01001748 'target/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001749 'target/mips',
1750 'target/ppc',
1751 'target/riscv',
1752 'target/s390x',
1753 'target/sparc',
1754 'util',
1755]
1756
Marc-André Lureau0df750e2020-11-25 14:06:37 +04001757vhost_user = not_found
1758if 'CONFIG_VHOST_USER' in config_host
1759 libvhost_user = subproject('libvhost-user')
1760 vhost_user = libvhost_user.get_variable('vhost_user_dep')
1761endif
1762
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001763subdir('qapi')
1764subdir('qobject')
1765subdir('stubs')
1766subdir('trace')
1767subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04001768subdir('qom')
1769subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001770subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04001771subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001772
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001773
1774if enable_modules
1775 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1776 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1777endif
1778
Paolo Bonzini2becc362020-02-03 11:42:03 +01001779stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001780
1781util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01001782util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001783libqemuutil = static_library('qemuutil',
1784 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonziniaa087962020-09-01 11:15:30 -04001785 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001786qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04001787 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001788
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001789decodetree = generator(find_program('scripts/decodetree.py'),
1790 output: 'decode-@BASENAME@.c.inc',
1791 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1792
Paolo Bonzini478e9432020-08-17 12:47:55 +02001793subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04001794subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04001795subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001796subdir('fsdev')
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001797subdir('libdecnumber')
Marc-André Lureaud3b18482019-08-17 14:55:32 +04001798subdir('target')
Marc-André Lureau708eab42019-09-03 16:59:33 +04001799subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001800
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001801block_ss.add(files(
1802 'block.c',
1803 'blockjob.c',
1804 'job.c',
1805 'qemu-io-cmds.c',
1806))
1807block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
1808
1809subdir('nbd')
1810subdir('scsi')
1811subdir('block')
1812
Paolo Bonzini4a963372020-08-03 16:22:28 +02001813blockdev_ss.add(files(
1814 'blockdev.c',
Stefan Hajnoczicbc20bf2020-09-29 13:55:15 +01001815 'blockdev-nbd.c',
Paolo Bonzini4a963372020-08-03 16:22:28 +02001816 'iothread.c',
1817 'job-qmp.c',
1818))
1819
1820# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1821# os-win32.c does not
1822blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1823softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
Paolo Bonzini4a963372020-08-03 16:22:28 +02001824
1825common_ss.add(files('cpus-common.c'))
1826
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001827subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001828
Richard Hendersonf3433462020-09-12 10:47:33 -07001829common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02001830specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001831specific_ss.add(files('exec-vary.c'))
1832specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1833 'fpu/softfloat.c',
1834 'tcg/optimize.c',
1835 'tcg/tcg-common.c',
1836 'tcg/tcg-op-gvec.c',
1837 'tcg/tcg-op-vec.c',
1838 'tcg/tcg-op.c',
1839 'tcg/tcg.c',
1840))
1841specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1842
Marc-André Lureauab318052019-07-24 19:23:16 +04001843subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04001844subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04001845subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001846subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001847subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04001848subdir('replay')
Marc-André Lureau582ea952019-08-15 15:15:32 +04001849subdir('hw')
Marc-André Lureau1a828782019-08-18 16:13:08 +04001850subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001851subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04001852subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04001853subdir('linux-user')
1854
Marc-André Lureaub309c322019-08-18 19:20:37 +04001855bsd_user_ss.add(files('gdbstub.c'))
1856specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1857
Marc-André Lureau3a304462019-08-18 16:13:08 +04001858linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1859specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001860
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001861# needed for fuzzing binaries
1862subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001863subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001864
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001865########################
1866# Library dependencies #
1867########################
1868
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001869block_mods = []
1870softmmu_mods = []
1871foreach d, list : modules
1872 foreach m, module_ss : list
1873 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02001874 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001875 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1876 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1877 if d == 'block'
1878 block_mods += sl
1879 else
1880 softmmu_mods += sl
1881 endif
1882 else
1883 if d == 'block'
1884 block_ss.add_all(module_ss)
1885 else
1886 softmmu_ss.add_all(module_ss)
1887 endif
1888 endif
1889 endforeach
1890endforeach
1891
1892nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08001893undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001894block_syms = custom_target('block.syms', output: 'block.syms',
1895 input: [libqemuutil, block_mods],
1896 capture: true,
1897 command: [undefsym, nm, '@INPUT@'])
1898qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1899 input: [libqemuutil, softmmu_mods],
1900 capture: true,
1901 command: [undefsym, nm, '@INPUT@'])
1902
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001903qom_ss = qom_ss.apply(config_host, strict: false)
1904libqom = static_library('qom', qom_ss.sources() + genh,
1905 dependencies: [qom_ss.dependencies()],
1906 name_suffix: 'fa')
1907
1908qom = declare_dependency(link_whole: libqom)
1909
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001910authz_ss = authz_ss.apply(config_host, strict: false)
1911libauthz = static_library('authz', authz_ss.sources() + genh,
1912 dependencies: [authz_ss.dependencies()],
1913 name_suffix: 'fa',
1914 build_by_default: false)
1915
1916authz = declare_dependency(link_whole: libauthz,
1917 dependencies: qom)
1918
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001919crypto_ss = crypto_ss.apply(config_host, strict: false)
1920libcrypto = static_library('crypto', crypto_ss.sources() + genh,
1921 dependencies: [crypto_ss.dependencies()],
1922 name_suffix: 'fa',
1923 build_by_default: false)
1924
1925crypto = declare_dependency(link_whole: libcrypto,
1926 dependencies: [authz, qom])
1927
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001928io_ss = io_ss.apply(config_host, strict: false)
1929libio = static_library('io', io_ss.sources() + genh,
1930 dependencies: [io_ss.dependencies()],
1931 link_with: libqemuutil,
1932 name_suffix: 'fa',
1933 build_by_default: false)
1934
1935io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
1936
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02001937libmigration = static_library('migration', sources: migration_files + genh,
1938 name_suffix: 'fa',
1939 build_by_default: false)
1940migration = declare_dependency(link_with: libmigration,
1941 dependencies: [zlib, qom, io])
1942softmmu_ss.add(migration)
1943
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001944block_ss = block_ss.apply(config_host, strict: false)
1945libblock = static_library('block', block_ss.sources() + genh,
1946 dependencies: block_ss.dependencies(),
1947 link_depends: block_syms,
1948 name_suffix: 'fa',
1949 build_by_default: false)
1950
1951block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001952 link_args: '@block.syms',
1953 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001954
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01001955blockdev_ss = blockdev_ss.apply(config_host, strict: false)
1956libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
1957 dependencies: blockdev_ss.dependencies(),
1958 name_suffix: 'fa',
1959 build_by_default: false)
1960
1961blockdev = declare_dependency(link_whole: [libblockdev],
1962 dependencies: [block])
1963
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001964qmp_ss = qmp_ss.apply(config_host, strict: false)
1965libqmp = static_library('qmp', qmp_ss.sources() + genh,
1966 dependencies: qmp_ss.dependencies(),
1967 name_suffix: 'fa',
1968 build_by_default: false)
1969
1970qmp = declare_dependency(link_whole: [libqmp])
1971
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001972libchardev = static_library('chardev', chardev_ss.sources() + genh,
1973 name_suffix: 'fa',
1974 build_by_default: false)
1975
1976chardev = declare_dependency(link_whole: libchardev)
1977
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02001978libhwcore = static_library('hwcore', sources: hwcore_files + genh,
1979 name_suffix: 'fa',
1980 build_by_default: false)
1981hwcore = declare_dependency(link_whole: libhwcore)
1982common_ss.add(hwcore)
1983
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02001984###########
1985# Targets #
1986###########
1987
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001988foreach m : block_mods + softmmu_mods
1989 shared_module(m.name(),
1990 name_prefix: '',
1991 link_whole: m,
1992 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001993 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001994endforeach
1995
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01001996softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001997common_ss.add(qom, qemuutil)
1998
1999common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01002000common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
2001
2002common_all = common_ss.apply(config_all, strict: false)
2003common_all = static_library('common',
2004 build_by_default: false,
2005 sources: common_all.sources() + genh,
2006 dependencies: common_all.dependencies(),
2007 name_suffix: 'fa')
2008
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002009feature_to_c = find_program('scripts/feature_to_c.sh')
2010
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002011emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002012foreach target : target_dirs
2013 config_target = config_target_mak[target]
2014 target_name = config_target['TARGET_NAME']
2015 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02002016 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002017 arch_deps = []
2018 c_args = ['-DNEED_CPU_H',
2019 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2020 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04002021 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01002022
Paolo Bonzini859aef02020-08-04 18:14:26 +02002023 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01002024 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2025 if targetos == 'linux'
2026 target_inc += include_directories('linux-headers', is_system: true)
2027 endif
2028 if target.endswith('-softmmu')
2029 qemu_target_name = 'qemu-system-' + target_name
2030 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002031 t = target_softmmu_arch[arch].apply(config_target, strict: false)
2032 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002033 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002034
Marc-André Lureau2c442202019-08-17 13:55:58 +04002035 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
2036 hw = hw_arch[hw_dir].apply(config_target, strict: false)
2037 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002038 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04002039
Paolo Bonzini2becc362020-02-03 11:42:03 +01002040 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002041 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002042 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04002043 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002044 target_type='user'
2045 qemu_target_name = 'qemu-' + target_name
2046 if 'CONFIG_LINUX_USER' in config_target
2047 base_dir = 'linux-user'
2048 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
2049 else
2050 base_dir = 'bsd-user'
Stacey Sonea1ab4c2020-12-18 13:54:50 -07002051 target_inc += include_directories('bsd-user/freebsd')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002052 endif
2053 target_inc += include_directories(
2054 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04002055 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002056 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04002057 if 'CONFIG_LINUX_USER' in config_target
2058 dir = base_dir / abi
2059 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
2060 if config_target.has_key('TARGET_SYSTBL_ABI')
2061 arch_srcs += \
2062 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
2063 extra_args : config_target['TARGET_SYSTBL_ABI'])
2064 endif
2065 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002066 endif
2067
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002068 if 'TARGET_XML_FILES' in config_target
2069 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
2070 output: target + '-gdbstub-xml.c',
2071 input: files(config_target['TARGET_XML_FILES'].split()),
2072 command: [feature_to_c, '@INPUT@'],
2073 capture: true)
2074 arch_srcs += gdbstub_xml
2075 endif
2076
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002077 t = target_arch[arch].apply(config_target, strict: false)
2078 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002079 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002080
Paolo Bonzini2becc362020-02-03 11:42:03 +01002081 target_common = common_ss.apply(config_target, strict: false)
2082 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002083 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002084
Paolo Bonzini2becc362020-02-03 11:42:03 +01002085 target_specific = specific_ss.apply(config_target, strict: false)
2086 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002087 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002088
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002089 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02002090 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002091 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002092 objects: objects,
2093 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002094 c_args: c_args,
2095 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002096 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002097
2098 if target.endswith('-softmmu')
2099 execs = [{
2100 'name': 'qemu-system-' + target_name,
2101 'gui': false,
2102 'sources': files('softmmu/main.c'),
2103 'dependencies': []
2104 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002105 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002106 execs += [{
2107 'name': 'qemu-system-' + target_name + 'w',
2108 'gui': true,
2109 'sources': files('softmmu/main.c'),
2110 'dependencies': []
2111 }]
2112 endif
2113 if config_host.has_key('CONFIG_FUZZ')
2114 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
2115 execs += [{
2116 'name': 'qemu-fuzz-' + target_name,
2117 'gui': false,
2118 'sources': specific_fuzz.sources(),
2119 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002120 }]
2121 endif
2122 else
2123 execs = [{
2124 'name': 'qemu-' + target_name,
2125 'gui': false,
2126 'sources': [],
2127 'dependencies': []
2128 }]
2129 endif
2130 foreach exe: execs
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002131 emulators += {exe['name']:
2132 executable(exe['name'], exe['sources'],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002133 install: true,
2134 c_args: c_args,
2135 dependencies: arch_deps + deps + exe['dependencies'],
2136 objects: lib.extract_all_objects(recursive: true),
2137 link_language: link_language,
2138 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
2139 link_args: link_args,
2140 gui_app: exe['gui'])
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002141 }
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002142
2143 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
2144 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002145 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
2146 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002147 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
2148 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
2149 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002150 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002151 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002152 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002153 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002154 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002155 command: [
2156 tracetool, '--group=all', '--format=' + stp['fmt'],
2157 '--binary=' + stp['bin'],
2158 '--target-name=' + target_name,
2159 '--target-type=' + target_type,
2160 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01002161 '@INPUT@', '@OUTPUT@'
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002162 ])
2163 endforeach
2164 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002165 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002166endforeach
2167
Paolo Bonzini931049b2020-02-05 09:44:24 +01002168# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002169
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002170if 'CONFIG_PLUGIN' in config_host
2171 install_headers('include/qemu/qemu-plugin.h')
2172endif
2173
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002174if 'CONFIG_GUEST_AGENT' in config_host
2175 subdir('qga')
2176endif
2177
Laurent Vivier9755c942020-08-24 17:24:30 +02002178# Don't build qemu-keymap if xkbcommon is not explicitly enabled
2179# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002180if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04002181 # used for the update-keymaps target, so include rules even if !have_tools
2182 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
2183 dependencies: [qemuutil, xkbcommon], install: have_tools)
2184endif
2185
Paolo Bonzini931049b2020-02-05 09:44:24 +01002186if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002187 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
2188 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
2189 qemu_io = executable('qemu-io', files('qemu-io.c'),
2190 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01002191 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Stefan Hajnoczicbc20bf2020-09-29 13:55:15 +01002192 dependencies: [blockdev, qemuutil], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002193
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02002194 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002195 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04002196 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002197
Marc-André Lureau157e7b12019-07-15 14:50:58 +04002198 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
2199 dependencies: qemuutil,
2200 install: true)
2201
Paolo Bonzini931049b2020-02-05 09:44:24 +01002202 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02002203 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002204 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04002205 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02002206 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01002207 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002208
2209 if targetos == 'linux'
2210 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2211 dependencies: [qemuutil, libcap_ng],
2212 install: true,
2213 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002214
2215 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2216 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002217 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002218 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002219 endif
2220
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04002221 if 'CONFIG_IVSHMEM' in config_host
2222 subdir('contrib/ivshmem-client')
2223 subdir('contrib/ivshmem-server')
2224 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01002225endif
2226
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04002227subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002228subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04002229subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02002230subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08002231subdir('tests')
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04002232if 'CONFIG_GTK' in config_host
2233 subdir('po')
2234endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002235
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002236if host_machine.system() == 'windows'
2237 nsis_cmd = [
2238 find_program('scripts/nsis.py'),
2239 '@OUTPUT@',
2240 get_option('prefix'),
2241 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01002242 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002243 '--',
2244 '-DDISPLAYVERSION=' + meson.project_version(),
2245 ]
2246 if build_docs
2247 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2248 endif
2249 if 'CONFIG_GTK' in config_host
2250 nsis_cmd += '-DCONFIG_GTK=y'
2251 endif
2252
2253 nsis = custom_target('nsis',
2254 output: 'qemu-setup-' + meson.project_version() + '.exe',
2255 input: files('qemu.nsi'),
2256 build_always_stale: true,
2257 command: nsis_cmd + ['@INPUT@'])
2258 alias_target('installer', nsis)
2259endif
2260
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002261#########################
2262# Configuration summary #
2263#########################
2264
Paolo Bonzinif9332752020-02-03 13:28:38 +01002265summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002266summary_info += {'Install prefix': get_option('prefix')}
2267summary_info += {'BIOS directory': qemu_datadir}
2268summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2269summary_info += {'binary directory': get_option('bindir')}
2270summary_info += {'library directory': get_option('libdir')}
2271summary_info += {'module directory': qemu_moddir}
2272summary_info += {'libexec directory': get_option('libexecdir')}
2273summary_info += {'include directory': get_option('includedir')}
2274summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002275if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002276 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04002277 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002278else
2279 summary_info += {'local state directory': 'queried at runtime'}
2280endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04002281summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002282summary_info += {'Build directory': meson.current_build_dir()}
2283summary_info += {'Source path': meson.current_source_dir()}
2284summary_info += {'GIT binary': config_host['GIT']}
2285summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
2286summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
2287summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
2288if link_language == 'cpp'
2289 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
2290else
2291 summary_info += {'C++ compiler': false}
2292endif
2293if targetos == 'darwin'
2294 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
2295endif
2296summary_info += {'ARFLAGS': config_host['ARFLAGS']}
Paolo Bonzini47b30832020-09-23 05:26:17 -04002297summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2298 + ['-O' + get_option('optimization')]
2299 + (get_option('debug') ? ['-g'] : []))}
2300if link_language == 'cpp'
2301 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2302 + ['-O' + get_option('optimization')]
2303 + (get_option('debug') ? ['-g'] : []))}
2304endif
2305link_args = get_option(link_language + '_link_args')
2306if link_args.length() > 0
2307 summary_info += {'LDFLAGS': ' '.join(link_args)}
2308endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002309summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2310summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
2311summary_info += {'make': config_host['MAKE']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002312summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Yonggang Luoe3667662020-10-16 06:06:25 +08002313summary_info += {'sphinx-build': sphinx_build.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002314summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2315# TODO: add back version
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002316summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
2317if slirp_opt != 'disabled'
Paolo Bonzinif9332752020-02-03 13:28:38 +01002318 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2319endif
2320summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2321if config_host.has_key('CONFIG_MODULES')
2322 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2323endif
2324summary_info += {'host CPU': cpu}
2325summary_info += {'host endianness': build_machine.endian()}
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002326summary_info += {'target list': ' '.join(target_dirs)}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002327summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
Paolo Bonzinideb62372020-09-01 07:51:16 -04002328summary_info += {'sparse enabled': sparse.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002329summary_info += {'strip binaries': get_option('strip')}
2330summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05002331summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02002332summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002333if targetos == 'darwin'
2334 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
2335endif
2336# TODO: add back version
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002337summary_info += {'SDL support': sdl.found()}
2338summary_info += {'SDL image support': sdl_image.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002339# TODO: add back version
2340summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
2341summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002342summary_info += {'pixman': pixman.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002343# TODO: add back version
2344summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
2345summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
2346summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
2347# TODO: add back version
2348summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
2349if config_host.has_key('CONFIG_GCRYPT')
2350 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
2351 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2352endif
2353# TODO: add back version
2354summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
2355if config_host.has_key('CONFIG_NETTLE')
2356 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2357endif
2358summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
2359summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
Yonggang Luo5285e592020-10-13 07:43:48 +08002360summary_info += {'iconv support': iconv.found()}
2361summary_info += {'curses support': curses.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002362# TODO: add back version
2363summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002364summary_info += {'curl support': curl.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002365summary_info += {'mingw32 support': targetos == 'windows'}
2366summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2367summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2368summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
Paolo Bonzini69202b42020-11-17 14:46:21 +01002369summary_info += {'VirtFS support': have_virtfs}
Misono Tomohirocece1162020-10-08 19:31:33 +09002370summary_info += {'build virtiofs daemon': have_virtiofsd}
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002371summary_info += {'Multipath support': mpathpersist.found()}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002372summary_info += {'VNC support': vnc.found()}
2373if vnc.found()
2374 summary_info += {'VNC SASL support': sasl.found()}
2375 summary_info += {'VNC JPEG support': jpeg.found()}
2376 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002377endif
2378summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2379if config_host.has_key('CONFIG_XEN_BACKEND')
2380 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2381endif
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002382summary_info += {'brlapi support': brlapi.found()}
Yonggang Luoe3667662020-10-16 06:06:25 +08002383summary_info += {'Documentation': build_docs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002384summary_info += {'PIE': get_option('b_pie')}
2385summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2386summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2387summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2388summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002389summary_info += {'ATTR/XATTR support': libattr.found()}
Paolo Bonzinic8d54502020-10-16 03:32:52 -04002390summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini05512f52020-09-16 15:31:11 -04002391summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2392summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2393summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2394summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
2395summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2396if config_all.has_key('CONFIG_TCG')
2397 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
2398 summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
2399endif
Paolo Bonziniaa087962020-09-01 11:15:30 -04002400summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002401summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2402summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002403summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002404summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
2405summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
2406summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2407summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2408summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2409summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002410summary_info += {'libcap-ng support': libcap_ng.found()}
Thomas Huthb54b82d2020-11-09 09:59:06 +01002411summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002412summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2413summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2414summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2415summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
Thomas Huthb54b82d2020-11-09 09:59:06 +01002416summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002417summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002418summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2419summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2420summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2421if config_host['TRACE_BACKENDS'].split().contains('simple')
2422 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2423endif
2424# TODO: add back protocol and server version
2425summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002426summary_info += {'rbd support': rbd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002427summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
2428summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02002429summary_info += {'U2F support': u2f.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002430summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
2431summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
2432summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
2433summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002434summary_info += {'libiscsi support': libiscsi.found()}
Paolo Bonzini30045c02020-11-17 13:11:25 +01002435summary_info += {'libnfs support': libnfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002436summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2437if targetos == 'windows'
2438 if 'WIN_SDK' in config_host
2439 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2440 endif
2441 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2442 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Stefan Hajnoczi4bad7c32020-09-14 10:52:31 +01002443 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002444endif
Paolo Bonzini90835c22020-11-17 14:22:24 +01002445summary_info += {'seccomp support': seccomp.found()}
Daniele Buono9e62ba42020-12-04 18:06:14 -05002446summary_info += {'CFI support': get_option('cfi')}
2447summary_info += {'CFI debug support': get_option('cfi_debug')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002448summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2449summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2450summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2451summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2452summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002453summary_info += {'GlusterFS support': glusterfs.found()}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +04002454summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002455summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2456summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
2457summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2458summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002459summary_info += {'lzo support': lzo.found()}
Paolo Bonzini241611e2020-11-17 13:32:34 +01002460summary_info += {'snappy support': snappy.found()}
Paolo Bonzini29ba6112020-11-17 13:07:52 +01002461summary_info += {'bzip2 support': libbzip2.found()}
Paolo Bonziniecea3692020-11-17 13:35:28 +01002462summary_info += {'lzfse support': liblzfse.found()}
Paolo Bonzinib1def332020-11-17 13:37:39 +01002463summary_info += {'zstd support': zstd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002464summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2465summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
Paolo Bonziniaa087962020-09-01 11:15:30 -04002466summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002467summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2468summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2469summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2470summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2471summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2472summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2473summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2474summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2475summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2476summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2477summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2478summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002479summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002480summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2481summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002482summary_info += {'libudev': libudev.found()}
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01002483summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002484summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2485summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2486if config_host.has_key('HAVE_GDB_BIN')
2487 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2488endif
2489summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2490summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2491summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
Max Reitza484a712020-10-27 20:05:41 +01002492summary_info += {'FUSE exports': fuse.found()}
Max Reitzdf4ea702020-10-27 20:05:46 +01002493summary_info += {'FUSE lseek': fuse_lseek.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002494summary(summary_info, bool_yn: true)
2495
2496if not supported_cpus.contains(cpu)
2497 message()
2498 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2499 message()
2500 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2501 message('The QEMU project intends to remove support for this host CPU in')
2502 message('a future release if nobody volunteers to maintain it and to')
2503 message('provide a build host for our continuous integration setup.')
2504 message('configure has succeeded and you can continue to build, but')
2505 message('if you care about QEMU on this platform you should contact')
2506 message('us upstream at qemu-devel@nongnu.org.')
2507endif
2508
2509if not supported_oses.contains(targetos)
2510 message()
2511 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2512 message()
2513 message('Host OS ' + targetos + 'support is not currently maintained.')
2514 message('The QEMU project intends to remove support for this host OS in')
2515 message('a future release if nobody volunteers to maintain it and to')
2516 message('provide a build host for our continuous integration setup.')
2517 message('configure has succeeded and you can continue to build, but')
2518 message('if you care about QEMU on this platform you should contact')
2519 message('us upstream at qemu-devel@nongnu.org.')
2520endif