blob: f3db83e974fdfe3c3a99db7d16e5900773d94f0d [file] [log] [blame]
Paolo Bonzinia5665052019-06-10 12:05:14 +02001project('qemu', ['c'], meson_version: '>=0.55.0',
Paolo Bonzinia5cb7c52020-10-19 06:56:16 -04002 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_colorout=auto'] +
3 (meson.version().version_compare('>=0.56.0') ? [ 'b_staticpic=false' ] : []),
Paolo Bonzinia5665052019-06-10 12:05:14 +02004 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5
6not_found = dependency('', required: false)
Paolo Bonzinib29b40f2020-08-10 18:04:43 +02007if meson.version().version_compare('>=0.56.0')
8 keyval = import('keyval')
9else
10 keyval = import('unstable-keyval')
11endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040012ss = import('sourceset')
Richard Henderson8b18cdb2020-09-13 12:19:25 -070013fs = import('fs')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040014
Paolo Bonzinice1c1e72020-01-28 16:41:44 +010015sh = find_program('sh')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040016cc = meson.get_compiler('c')
Paolo Bonzinia5665052019-06-10 12:05:14 +020017config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Marc-André Lureau3154fee2019-08-29 22:07:01 +040018enable_modules = 'CONFIG_MODULES' in config_host
Paolo Bonzini35be72b2020-02-06 14:17:15 +010019enable_static = 'CONFIG_STATIC' in config_host
Yonggang Luoe3667662020-10-16 06:06:25 +080020
Paolo Bonzinid7dedf42021-01-26 11:15:33 +010021# Allow both shared and static libraries unless --enable-static
22static_kwargs = enable_static ? {'static': true} : {}
23
Yonggang Luoe3667662020-10-16 06:06:25 +080024# Temporary directory used for files created while
25# configure runs. Since it is in the build directory
26# we can safely blow away any previous version of it
27# (and we need not jump through hoops to try to delete
28# it when configure exits.)
29tmpdir = meson.current_build_dir() / 'meson-private/temp'
Marc-André Lureau8fe11232020-09-11 14:42:48 +020030
31if get_option('qemu_suffix').startswith('/')
32 error('qemu_suffix cannot start with a /')
33endif
34
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040035qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
Marc-André Lureauab4c0992020-08-26 15:04:16 +040036qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040037qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040038qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
39
40qemu_desktopdir = get_option('datadir') / 'applications'
41qemu_icondir = get_option('datadir') / 'icons'
42
Paolo Bonzini859aef02020-08-04 18:14:26 +020043config_host_data = configuration_data()
44genh = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020045
Paolo Bonzini760e4322020-08-26 08:09:48 +020046target_dirs = config_host['TARGET_DIRS'].split()
47have_user = false
48have_system = false
49foreach target : target_dirs
50 have_user = have_user or target.endswith('-user')
51 have_system = have_system or target.endswith('-softmmu')
52endforeach
53have_tools = 'CONFIG_TOOLS' in config_host
54have_block = have_system or have_tools
55
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040056python = import('python').find_installation()
57
58supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Sergei Trofimovich61256732020-10-12 18:57:19 +010059supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040060 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
61
62cpu = host_machine.cpu_family()
63targetos = host_machine.system()
64
Paolo Bonzini8a199802020-09-18 05:37:01 -040065if cpu in ['x86', 'x86_64']
66 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
67elif cpu == 'aarch64'
68 kvm_targets = ['aarch64-softmmu']
69elif cpu == 's390x'
70 kvm_targets = ['s390x-softmmu']
71elif cpu in ['ppc', 'ppc64']
72 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Huacai Chenfbc58842020-10-07 16:39:28 +080073elif cpu in ['mips', 'mips64']
74 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -040075else
76 kvm_targets = []
77endif
78
79accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alex Bennée0c3e41d2020-11-10 19:23:09 +000080if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
81 # i368 emulator provides xenpv machine type for multiple architectures
82 accelerator_targets += {
83 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
84 }
85endif
Paolo Bonzini8a199802020-09-18 05:37:01 -040086if cpu in ['x86', 'x86_64']
87 accelerator_targets += {
88 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -040089 'CONFIG_HVF': ['x86_64-softmmu'],
90 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
91 }
92endif
93
Philippe Mathieu-Daudéeae9a1d2021-01-14 18:45:08 +010094edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
95install_edk2_blobs = false
96if get_option('install_blobs')
97 foreach target : target_dirs
98 install_edk2_blobs = install_edk2_blobs or target in edk2_targets
99 endforeach
100endif
101
Philippe Mathieu-Daudé45b545d2021-01-14 18:45:09 +0100102bzip2 = find_program('bzip2', required: install_edk2_blobs)
103
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400104##################
105# Compiler flags #
106##################
107
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400108# Specify linker-script with add_project_link_arguments so that it is not placed
109# within a linker --start-group/--end-group pair
110if 'CONFIG_FUZZ' in config_host
111 add_project_link_arguments(['-Wl,-T,',
112 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
113 native: false, language: ['c', 'cpp', 'objc'])
114endif
115
Marc-André Lureau5fc06172021-01-14 16:56:02 +0400116add_global_arguments(config_host['QEMU_CFLAGS'].split(),
117 native: false, language: ['c', 'objc'])
118add_global_arguments(config_host['QEMU_CXXFLAGS'].split(),
119 native: false, language: 'cpp')
120add_global_link_arguments(config_host['QEMU_LDFLAGS'].split(),
121 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzinia5665052019-06-10 12:05:14 +0200122
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400123if targetos == 'linux'
124 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
125 '-isystem', 'linux-headers',
126 language: ['c', 'cpp'])
127endif
128
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100129add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400130 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400131 '-iquote', meson.current_source_dir() / 'include',
132 '-iquote', meson.current_source_dir() / 'disas/libvixl',
133 language: ['c', 'cpp', 'objc'])
Alexander Bulekovc46f76d2020-09-02 13:36:50 -0400134
Marc-André Lureaufc929892019-07-13 01:47:54 +0400135link_language = meson.get_external_property('link_language', 'cpp')
136if link_language == 'cpp'
137 add_languages('cpp', required: true, native: false)
138endif
Paolo Bonzinia5665052019-06-10 12:05:14 +0200139if host_machine.system() == 'darwin'
140 add_languages('objc', required: false, native: false)
141endif
142
Paolo Bonzinideb62372020-09-01 07:51:16 -0400143sparse = find_program('cgcc', required: get_option('sparse'))
144if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100145 run_target('sparse',
146 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400147 'compile_commands.json', sparse.full_path(), '-Wbitwise',
148 '-Wno-transparent-union', '-Wno-old-initializer',
149 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100150endif
151
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200152###########################################
153# Target-specific checks and dependencies #
154###########################################
155
156if targetos != 'linux' and get_option('mpath').enabled()
157 error('Multipath is supported only on Linux')
158endif
159
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400160m = cc.find_library('m', required: false)
161util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200162winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400163socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400164version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400165coref = []
166iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400167emulator_link_args = []
Paolo Bonzini8a199802020-09-18 05:37:01 -0400168hvf = not_found
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400169if targetos == 'windows'
170 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200171 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400172
173 win = import('windows')
174 version_res = win.compile_resources('version.rc',
175 depend_files: files('pc-bios/qemu-nsis.ico'),
176 include_directories: include_directories('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400177elif targetos == 'darwin'
178 coref = dependency('appleframeworks', modules: 'CoreFoundation')
179 iokit = dependency('appleframeworks', modules: 'IOKit')
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200180elif targetos == 'sunos'
181 socket = [cc.find_library('socket'),
182 cc.find_library('nsl'),
183 cc.find_library('resolv')]
184elif targetos == 'haiku'
185 socket = [cc.find_library('posix_error_mapper'),
186 cc.find_library('network'),
187 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400188elif targetos == 'openbsd'
189 if not get_option('tcg').disabled() and target_dirs.length() > 0
190 # Disable OpenBSD W^X if available
191 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
192 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400193endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200194
Paolo Bonzini8a199802020-09-18 05:37:01 -0400195accelerators = []
196if not get_option('kvm').disabled() and targetos == 'linux'
197 accelerators += 'CONFIG_KVM'
198endif
199if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
200 accelerators += 'CONFIG_XEN'
201 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
202else
203 have_xen_pci_passthrough = false
204endif
205if not get_option('whpx').disabled() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000206 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400207 error('WHPX requires 64-bit host')
208 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
209 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
210 accelerators += 'CONFIG_WHPX'
211 endif
212endif
213if not get_option('hvf').disabled()
214 hvf = dependency('appleframeworks', modules: 'Hypervisor',
215 required: get_option('hvf'))
216 if hvf.found()
217 accelerators += 'CONFIG_HVF'
218 endif
219endif
220if not get_option('hax').disabled()
221 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
222 accelerators += 'CONFIG_HAX'
223 endif
224endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100225
226tcg_arch = config_host['ARCH']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400227if not get_option('tcg').disabled()
228 if cpu not in supported_cpus
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100229 if get_option('tcg_interpreter')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +0100230 warning('Unsupported CPU @0@, will use TCG with TCI (experimental and slow)'.format(cpu))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400231 else
232 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
233 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100234 elif get_option('tcg_interpreter')
235 warning('Use of the TCG interpretor is not recommended on this host')
236 warning('architecture. There is a native TCG execution backend available')
237 warning('which provides substantially better performance and reliability.')
238 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
239 warning('configuration option on this architecture to use the native')
240 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400241 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100242 if get_option('tcg_interpreter')
243 tcg_arch = 'tci'
244 elif config_host['ARCH'] == 'sparc64'
245 tcg_arch = 'sparc'
246 elif config_host['ARCH'] == 's390x'
247 tcg_arch = 's390'
248 elif config_host['ARCH'] in ['x86_64', 'x32']
249 tcg_arch = 'i386'
250 elif config_host['ARCH'] == 'ppc64'
251 tcg_arch = 'ppc'
252 elif config_host['ARCH'] in ['riscv32', 'riscv64']
253 tcg_arch = 'riscv'
254 endif
255 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
256 '-iquote', meson.current_source_dir() / 'accel/tcg',
257 language: ['c', 'cpp', 'objc'])
258
Paolo Bonzini8a199802020-09-18 05:37:01 -0400259 accelerators += 'CONFIG_TCG'
260 config_host += { 'CONFIG_TCG': 'y' }
261endif
262
263if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
264 error('KVM not available on this platform')
265endif
266if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
267 error('HVF not available on this platform')
268endif
269if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
270 error('WHPX not available on this platform')
271endif
272if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
273 if 'CONFIG_XEN' in accelerators
274 error('Xen PCI passthrough not available on this platform')
275 else
276 error('Xen PCI passthrough requested but Xen not enabled')
277 endif
278endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400279
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200280################
281# Dependencies #
282################
283
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400284# The path to glib.h is added to all compilation commands. This was
285# grandfathered in from the QEMU Makefiles.
286add_project_arguments(config_host['GLIB_CFLAGS'].split(),
287 native: false, language: ['c', 'cpp', 'objc'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400288glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
289 link_args: config_host['GLIB_LIBS'].split())
290# override glib dep with the configure results (for subprojects)
291meson.override_dependency('glib-2.0', glib)
292
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400293gio = not_found
294if 'CONFIG_GIO' in config_host
295 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
296 link_args: config_host['GIO_LIBS'].split())
297endif
298lttng = not_found
299if 'CONFIG_TRACE_UST' in config_host
300 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
301endif
302urcubp = not_found
303if 'CONFIG_TRACE_UST' in config_host
304 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
305endif
Daniel P. Berrangé46859d92020-09-01 14:30:49 +0100306gcrypt = not_found
307if 'CONFIG_GCRYPT' in config_host
308 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
309 link_args: config_host['GCRYPT_LIBS'].split())
310endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400311nettle = not_found
312if 'CONFIG_NETTLE' in config_host
313 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
314 link_args: config_host['NETTLE_LIBS'].split())
315endif
316gnutls = not_found
317if 'CONFIG_GNUTLS' in config_host
318 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
319 link_args: config_host['GNUTLS_LIBS'].split())
320endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200321pixman = not_found
322if have_system or have_tools
323 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100324 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200325endif
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400326pam = not_found
327if 'CONFIG_AUTH_PAM' in config_host
328 pam = cc.find_library('pam')
329endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400330libaio = cc.find_library('aio', required: false)
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100331zlib = dependency('zlib', required: true, kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400332linux_io_uring = not_found
333if 'CONFIG_LINUX_IO_URING' in config_host
334 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
335 link_args: config_host['LINUX_IO_URING_LIBS'].split())
336endif
337libxml2 = not_found
338if 'CONFIG_LIBXML2' in config_host
339 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
340 link_args: config_host['LIBXML2_LIBS'].split())
341endif
342libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +0100343if not get_option('libnfs').auto() or have_block
344 libnfs = dependency('libnfs', version: '>=1.9.3',
345 required: get_option('libnfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100346 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400347endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100348
349libattr_test = '''
350 #include <stddef.h>
351 #include <sys/types.h>
352 #ifdef CONFIG_LIBATTR
353 #include <attr/xattr.h>
354 #else
355 #include <sys/xattr.h>
356 #endif
357 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
358
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400359libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100360have_old_libattr = false
361if not get_option('attr').disabled()
362 if cc.links(libattr_test)
363 libattr = declare_dependency()
364 else
365 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
366 required: get_option('attr'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100367 kwargs: static_kwargs)
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100368 if libattr.found() and not \
369 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
370 libattr = not_found
371 if get_option('attr').enabled()
372 error('could not link libattr')
373 else
374 warning('could not link libattr, disabling')
375 endif
376 else
377 have_old_libattr = libattr.found()
378 endif
379 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400380endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100381
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100382cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
383if cocoa.found() and get_option('sdl').enabled()
384 error('Cocoa and SDL cannot be enabled at the same time')
385endif
386if cocoa.found() and get_option('gtk').enabled()
387 error('Cocoa and GTK+ cannot be enabled at the same time')
388endif
389
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100390seccomp = not_found
Paolo Bonzini90835c22020-11-17 14:22:24 +0100391if not get_option('seccomp').auto() or have_system or have_tools
392 seccomp = dependency('libseccomp', version: '>=2.3.0',
393 required: get_option('seccomp'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100394 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100395endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100396
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100397libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100398if not get_option('cap_ng').auto() or have_system or have_tools
399 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
400 required: get_option('cap_ng'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100401 kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100402endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100403if libcap_ng.found() and not cc.links('''
404 #include <cap-ng.h>
405 int main(void)
406 {
407 capng_capability_to_name(CAPNG_EFFECTIVE);
408 return 0;
409 }''', dependencies: libcap_ng)
410 libcap_ng = not_found
411 if get_option('cap_ng').enabled()
412 error('could not link libcap-ng')
413 else
414 warning('could not link libcap-ng, disabling')
415 endif
416endif
417
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400418if get_option('xkbcommon').auto() and not have_system and not have_tools
419 xkbcommon = not_found
420else
421 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100422 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400423endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400424vde = not_found
425if config_host.has_key('CONFIG_VDE')
426 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
427endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200428pulse = not_found
429if 'CONFIG_LIBPULSE' in config_host
430 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
431 link_args: config_host['PULSE_LIBS'].split())
432endif
433alsa = not_found
434if 'CONFIG_ALSA' in config_host
435 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
436 link_args: config_host['ALSA_LIBS'].split())
437endif
438jack = not_found
439if 'CONFIG_LIBJACK' in config_host
440 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
441endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200442spice = not_found
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200443spice_headers = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200444if 'CONFIG_SPICE' in config_host
445 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
446 link_args: config_host['SPICE_LIBS'].split())
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200447 spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
Paolo Bonzini26347332019-07-29 15:40:07 +0200448endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400449rt = cc.find_library('rt', required: false)
Paolo Bonziniccf7afa2020-09-01 06:44:23 -0400450libdl = not_found
451if 'CONFIG_PLUGIN' in config_host
452 libdl = cc.find_library('dl', required: true)
453endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200454libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100455if not get_option('libiscsi').auto() or have_block
456 libiscsi = dependency('libiscsi', version: '>=1.9.0',
457 required: get_option('libiscsi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100458 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini99650b62019-06-10 12:21:14 +0200459endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400460zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +0100461if not get_option('zstd').auto() or have_block
462 zstd = dependency('libzstd', version: '>=1.4.0',
463 required: get_option('zstd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100464 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400465endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400466gbm = not_found
467if 'CONFIG_GBM' in config_host
468 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
469 link_args: config_host['GBM_LIBS'].split())
470endif
471virgl = not_found
472if 'CONFIG_VIRGL' in config_host
473 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
474 link_args: config_host['VIRGL_LIBS'].split())
475endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400476curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100477if not get_option('curl').auto() or have_block
478 curl = dependency('libcurl', version: '>=7.29.0',
479 method: 'pkg-config',
480 required: get_option('curl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100481 kwargs: static_kwargs)
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400482endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200483libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200484if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200485 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +0100486 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400487 required: get_option('libudev'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100488 kwargs: static_kwargs)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200489endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200490
Paolo Bonzini5c530152020-10-15 06:09:27 -0400491mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200492mpathpersist = not_found
493mpathpersist_new_api = false
494if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
495 mpath_test_source_new = '''
496 #include <libudev.h>
497 #include <mpath_persist.h>
498 unsigned mpath_mx_alloc_len = 1024;
499 int logsink;
500 static struct config *multipath_conf;
501 extern struct udev *udev;
502 extern struct config *get_multipath_config(void);
503 extern void put_multipath_config(struct config *conf);
504 struct udev *udev;
505 struct config *get_multipath_config(void) { return multipath_conf; }
506 void put_multipath_config(struct config *conf) { }
507 int main(void) {
508 udev = udev_new();
509 multipath_conf = mpath_lib_init();
510 return 0;
511 }'''
512 mpath_test_source_old = '''
513 #include <libudev.h>
514 #include <mpath_persist.h>
515 unsigned mpath_mx_alloc_len = 1024;
516 int logsink;
517 int main(void) {
518 struct udev *udev = udev_new();
519 mpath_lib_init(udev);
520 return 0;
521 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400522 libmpathpersist = cc.find_library('mpathpersist',
523 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100524 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400525 if libmpathpersist.found()
526 mpathlibs += libmpathpersist
527 if enable_static
528 mpathlibs += cc.find_library('devmapper',
529 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100530 kwargs: static_kwargs)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200531 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400532 mpathlibs += cc.find_library('multipath',
533 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100534 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400535 foreach lib: mpathlibs
536 if not lib.found()
537 mpathlibs = []
538 break
539 endif
540 endforeach
541 if mpathlibs.length() == 0
542 msg = 'Dependencies missing for libmpathpersist'
543 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200544 mpathpersist = declare_dependency(dependencies: mpathlibs)
545 mpathpersist_new_api = true
546 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
547 mpathpersist = declare_dependency(dependencies: mpathlibs)
548 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400549 msg = 'Cannot detect libmpathpersist API'
550 endif
551 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200552 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400553 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200554 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400555 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200556 endif
557 endif
558 endif
559endif
560
Yonggang Luo5285e592020-10-13 07:43:48 +0800561iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800562curses = not_found
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400563if have_system and not get_option('curses').disabled()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400564 curses_test = '''
565 #include <locale.h>
566 #include <curses.h>
567 #include <wchar.h>
568 int main(void) {
569 wchar_t wch = L'w';
570 setlocale(LC_ALL, "");
571 resize_term(0, 0);
572 addwstr(L"wide chars\n");
573 addnwstr(&wch, 1);
574 add_wch(WACS_DEGREE);
575 return 0;
576 }'''
577
Yonggang Luoca31e302020-11-17 05:31:06 +0800578 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
579 foreach curses_dep : curses_dep_list
580 if not curses.found()
581 curses = dependency(curses_dep,
582 required: false,
583 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100584 kwargs: static_kwargs)
Yonggang Luoca31e302020-11-17 05:31:06 +0800585 endif
586 endforeach
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400587 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500588 curses_compile_args = ['-DNCURSES_WIDECHAR']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400589 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500590 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
591 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400592 else
593 msg = 'curses package not usable'
594 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800595 endif
596 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400597 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400598 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
599 if targetos != 'windows' and not has_curses_h
600 message('Trying with /usr/include/ncursesw')
601 curses_compile_args += ['-I/usr/include/ncursesw']
602 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
603 endif
604 if has_curses_h
605 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
606 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800607 libcurses = cc.find_library(curses_libname,
608 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100609 kwargs: static_kwargs)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400610 if libcurses.found()
611 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
612 curses = declare_dependency(compile_args: curses_compile_args,
613 dependencies: [libcurses])
614 break
615 else
616 msg = 'curses library not usable'
617 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800618 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400619 endforeach
620 endif
621 endif
622 if not get_option('iconv').disabled()
623 foreach link_args : [ ['-liconv'], [] ]
624 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
625 # We need to use libiconv if available because mixing libiconv's headers with
626 # the system libc does not work.
627 # However, without adding glib to the dependencies -L/usr/local/lib will not be
628 # included in the command line and libiconv will not be found.
629 if cc.links('''
630 #include <iconv.h>
631 int main(void) {
632 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
633 return conv != (iconv_t) -1;
634 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
635 iconv = declare_dependency(link_args: link_args, dependencies: glib)
636 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800637 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400638 endforeach
639 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400640 if curses.found() and not iconv.found()
641 if get_option('iconv').enabled()
642 error('iconv not available')
643 endif
644 msg = 'iconv required for curses UI but not available'
645 curses = not_found
646 endif
647 if not curses.found() and msg != ''
648 if get_option('curses').enabled()
649 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400650 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400651 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400652 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800653 endif
654endif
655
Paolo Bonzini26347332019-07-29 15:40:07 +0200656brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100657if not get_option('brlapi').auto() or have_system
658 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
659 required: get_option('brlapi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100660 kwargs: static_kwargs)
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100661 if brlapi.found() and not cc.links('''
662 #include <brlapi.h>
663 #include <stddef.h>
664 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
665 brlapi = not_found
666 if get_option('brlapi').enabled()
667 error('could not link brlapi')
668 else
669 warning('could not link brlapi, disabling')
670 endif
671 endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200672endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100673
Paolo Bonzini760e4322020-08-26 08:09:48 +0200674sdl = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100675if not get_option('sdl').auto() or (have_system and not cocoa.found())
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100676 sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200677 sdl_image = not_found
678endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100679if sdl.found()
680 # work around 2.0.8 bug
681 sdl = declare_dependency(compile_args: '-Wno-undef',
682 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200683 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100684 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100685else
686 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100687 error('sdl-image required, but SDL was @0@'.format(
688 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100689 endif
690 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200691endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100692
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400693rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100694if not get_option('rbd').auto() or have_block
695 librados = cc.find_library('rados', required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100696 kwargs: static_kwargs)
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100697 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
698 required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100699 kwargs: static_kwargs)
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100700 if librados.found() and librbd.found()
701 if cc.links('''
702 #include <stdio.h>
703 #include <rbd/librbd.h>
704 int main(void) {
705 rados_t cluster;
706 rados_create(&cluster, NULL);
707 return 0;
708 }''', dependencies: [librbd, librados])
709 rbd = declare_dependency(dependencies: [librbd, librados])
710 elif get_option('rbd').enabled()
711 error('could not link librados')
712 else
713 warning('could not link librados, disabling')
714 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100715 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400716endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100717
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400718glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100719glusterfs_ftruncate_has_stat = false
720glusterfs_iocb_has_stat = false
721if not get_option('glusterfs').auto() or have_block
722 glusterfs = dependency('glusterfs-api', version: '>=3',
723 required: get_option('glusterfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100724 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100725 if glusterfs.found()
726 glusterfs_ftruncate_has_stat = cc.links('''
727 #include <glusterfs/api/glfs.h>
728
729 int
730 main(void)
731 {
732 /* new glfs_ftruncate() passes two additional args */
733 return glfs_ftruncate(NULL, 0, NULL, NULL);
734 }
735 ''', dependencies: glusterfs)
736 glusterfs_iocb_has_stat = cc.links('''
737 #include <glusterfs/api/glfs.h>
738
739 /* new glfs_io_cbk() passes two additional glfs_stat structs */
740 static void
741 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
742 {}
743
744 int
745 main(void)
746 {
747 glfs_io_cbk iocb = &glusterfs_iocb;
748 iocb(NULL, 0 , NULL, NULL, NULL);
749 return 0;
750 }
751 ''', dependencies: glusterfs)
752 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400753endif
754libssh = not_found
755if 'CONFIG_LIBSSH' in config_host
756 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
757 link_args: config_host['LIBSSH_LIBS'].split())
758endif
759libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100760if not get_option('bzip2').auto() or have_block
761 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
762 required: get_option('bzip2'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100763 kwargs: static_kwargs)
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100764 if libbzip2.found() and not cc.links('''
765 #include <bzlib.h>
766 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
767 libbzip2 = not_found
768 if get_option('bzip2').enabled()
769 error('could not link libbzip2')
770 else
771 warning('could not link libbzip2, disabling')
772 endif
773 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400774endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100775
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400776liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +0100777if not get_option('lzfse').auto() or have_block
778 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
779 required: get_option('lzfse'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100780 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400781endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100782if liblzfse.found() and not cc.links('''
783 #include <lzfse.h>
784 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
785 liblzfse = not_found
786 if get_option('lzfse').enabled()
787 error('could not link liblzfse')
788 else
789 warning('could not link liblzfse, disabling')
790 endif
791endif
792
Paolo Bonzini478e9432020-08-17 12:47:55 +0200793oss = not_found
794if 'CONFIG_AUDIO_OSS' in config_host
795 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
796endif
797dsound = not_found
798if 'CONFIG_AUDIO_DSOUND' in config_host
799 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
800endif
801coreaudio = not_found
802if 'CONFIG_AUDIO_COREAUDIO' in config_host
803 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
804endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400805opengl = not_found
806if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400807 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
808 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400809endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100810
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400811gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +0100812gtkx11 = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100813if not get_option('gtk').auto() or (have_system and not cocoa.found())
Paolo Bonzini1b695472021-01-07 14:02:29 +0100814 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
815 method: 'pkg-config',
816 required: get_option('gtk'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100817 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +0100818 if gtk.found()
819 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
820 method: 'pkg-config',
821 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100822 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +0100823 gtk = declare_dependency(dependencies: [gtk, gtkx11])
824 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400825endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100826
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400827vte = not_found
828if 'CONFIG_VTE' in config_host
829 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
830 link_args: config_host['VTE_LIBS'].split())
831endif
832x11 = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +0100833if gtkx11.found() or 'lm32-softmmu' in target_dirs
834 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100835 kwargs: static_kwargs)
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400836endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100837vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400838png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400839jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400840sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100841if get_option('vnc').enabled()
842 vnc = declare_dependency() # dummy dependency
843 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100844 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini8e242b32020-11-23 13:34:02 -0500845 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100846 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100847 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
848 required: get_option('vnc_sasl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100849 kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100850 if sasl.found()
851 sasl = declare_dependency(dependencies: sasl,
852 compile_args: '-DSTRUCT_IOVEC_DEFINED')
853 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400854endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100855
Marc-André Lureau708eab42019-09-03 16:59:33 +0400856snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +0100857if not get_option('snappy').auto() or have_system
858 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
859 required: get_option('snappy'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100860 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400861endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100862if snappy.found() and not cc.links('''
863 #include <snappy-c.h>
864 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
865 snappy = not_found
866 if get_option('snappy').enabled()
867 error('could not link libsnappy')
868 else
869 warning('could not link libsnappy, disabling')
870 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400871endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100872
Marc-André Lureau708eab42019-09-03 16:59:33 +0400873lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100874if not get_option('lzo').auto() or have_system
875 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
876 required: get_option('lzo'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100877 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400878endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100879if lzo.found() and not cc.links('''
880 #include <lzo/lzo1x.h>
881 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
882 lzo = not_found
883 if get_option('lzo').enabled()
884 error('could not link liblzo2')
885 else
886 warning('could not link liblzo2, disabling')
887 endif
888endif
889
Marc-André Lureau55166232019-07-24 19:16:22 +0400890rdma = not_found
891if 'CONFIG_RDMA' in config_host
892 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
893endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400894numa = not_found
895if 'CONFIG_NUMA' in config_host
896 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
897endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400898xen = not_found
899if 'CONFIG_XEN_BACKEND' in config_host
900 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
901 link_args: config_host['XEN_LIBS'].split())
902endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200903cacard = not_found
904if 'CONFIG_SMARTCARD' in config_host
905 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
906 link_args: config_host['SMARTCARD_LIBS'].split())
907endif
César Belley0a40bcb2020-08-26 13:42:04 +0200908u2f = not_found
909if have_system
910 u2f = dependency('u2f-emu', required: get_option('u2f'),
911 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100912 kwargs: static_kwargs)
César Belley0a40bcb2020-08-26 13:42:04 +0200913endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200914usbredir = not_found
915if 'CONFIG_USB_REDIR' in config_host
916 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
917 link_args: config_host['USB_REDIR_LIBS'].split())
918endif
919libusb = not_found
920if 'CONFIG_USB_LIBUSB' in config_host
921 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
922 link_args: config_host['LIBUSB_LIBS'].split())
923endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400924libpmem = not_found
925if 'CONFIG_LIBPMEM' in config_host
926 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
927 link_args: config_host['LIBPMEM_LIBS'].split())
928endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600929libdaxctl = not_found
930if 'CONFIG_LIBDAXCTL' in config_host
931 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
932endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +0400933tasn1 = not_found
934if 'CONFIG_TASN1' in config_host
935 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
936 link_args: config_host['TASN1_LIBS'].split())
937endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400938keyutils = dependency('libkeyutils', required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100939 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400940
Marc-André Lureau3909def2020-08-28 15:07:33 +0400941has_gettid = cc.has_function('gettid')
942
Paolo Bonziniaa087962020-09-01 11:15:30 -0400943# Malloc tests
944
945malloc = []
946if get_option('malloc') == 'system'
947 has_malloc_trim = \
948 not get_option('malloc_trim').disabled() and \
949 cc.links('''#include <malloc.h>
950 int main(void) { malloc_trim(0); return 0; }''')
951else
952 has_malloc_trim = false
953 malloc = cc.find_library(get_option('malloc'), required: true)
954endif
955if not has_malloc_trim and get_option('malloc_trim').enabled()
956 if get_option('malloc') == 'system'
957 error('malloc_trim not available on this platform.')
958 else
959 error('malloc_trim not available with non-libc memory allocator')
960 endif
961endif
962
Max Reitz84e319a2020-11-02 17:18:55 +0100963# Check whether the glibc provides statx()
964
965statx_test = '''
966 #ifndef _GNU_SOURCE
967 #define _GNU_SOURCE
968 #endif
969 #include <sys/stat.h>
970 int main(void) {
971 struct statx statxbuf;
972 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
973 return 0;
974 }'''
975
976has_statx = cc.links(statx_test)
977
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000978have_vhost_user_blk_server = (targetos == 'linux' and
979 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000980
981if get_option('vhost_user_blk_server').enabled()
982 if targetos != 'linux'
983 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000984 elif 'CONFIG_VHOST_USER' not in config_host
985 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000986 endif
987elif get_option('vhost_user_blk_server').disabled() or not have_system
988 have_vhost_user_blk_server = false
989endif
990
Daniele Buono9e62ba42020-12-04 18:06:14 -0500991
Max Reitzdf4ea702020-10-27 20:05:46 +0100992if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
993 error('Cannot enable fuse-lseek while fuse is disabled')
994endif
995
Max Reitza484a712020-10-27 20:05:41 +0100996fuse = dependency('fuse3', required: get_option('fuse'),
997 version: '>=3.1', method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100998 kwargs: static_kwargs)
Max Reitza484a712020-10-27 20:05:41 +0100999
Max Reitzdf4ea702020-10-27 20:05:46 +01001000fuse_lseek = not_found
1001if not get_option('fuse_lseek').disabled()
1002 if fuse.version().version_compare('>=3.8')
1003 # Dummy dependency
1004 fuse_lseek = declare_dependency()
1005 elif get_option('fuse_lseek').enabled()
1006 if fuse.found()
1007 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1008 else
1009 error('fuse-lseek requires libfuse, which was not found')
1010 endif
1011 endif
1012endif
1013
Daniele Buono9e62ba42020-12-04 18:06:14 -05001014if get_option('cfi')
1015 cfi_flags=[]
1016 # Check for dependency on LTO
1017 if not get_option('b_lto')
1018 error('Selected Control-Flow Integrity but LTO is disabled')
1019 endif
1020 if config_host.has_key('CONFIG_MODULES')
1021 error('Selected Control-Flow Integrity is not compatible with modules')
1022 endif
1023 # Check for cfi flags. CFI requires LTO so we can't use
1024 # get_supported_arguments, but need a more complex "compiles" which allows
1025 # custom arguments
1026 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1027 args: ['-flto', '-fsanitize=cfi-icall'] )
1028 cfi_flags += '-fsanitize=cfi-icall'
1029 else
1030 error('-fsanitize=cfi-icall is not supported by the compiler')
1031 endif
1032 if cc.compiles('int main () { return 0; }',
1033 name: '-fsanitize-cfi-icall-generalize-pointers',
1034 args: ['-flto', '-fsanitize=cfi-icall',
1035 '-fsanitize-cfi-icall-generalize-pointers'] )
1036 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1037 else
1038 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1039 endif
1040 if get_option('cfi_debug')
1041 if cc.compiles('int main () { return 0; }',
1042 name: '-fno-sanitize-trap=cfi-icall',
1043 args: ['-flto', '-fsanitize=cfi-icall',
1044 '-fno-sanitize-trap=cfi-icall'] )
1045 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1046 else
1047 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1048 endif
1049 endif
Marc-André Lureau5fc06172021-01-14 16:56:02 +04001050 add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1051 add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
Daniele Buono9e62ba42020-12-04 18:06:14 -05001052endif
1053
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001054#################
1055# config-host.h #
1056#################
Paolo Bonzini859aef02020-08-04 18:14:26 +02001057
Paolo Bonzini69202b42020-11-17 14:46:21 +01001058have_virtfs = (targetos == 'linux' and
1059 have_system and
1060 libattr.found() and
1061 libcap_ng.found())
1062
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01001063have_virtfs_proxy_helper = have_virtfs and have_tools
1064
Paolo Bonzini69202b42020-11-17 14:46:21 +01001065if get_option('virtfs').enabled()
1066 if not have_virtfs
1067 if targetos != 'linux'
1068 error('virtio-9p (virtfs) requires Linux')
1069 elif not libcap_ng.found() or not libattr.found()
1070 error('virtio-9p (virtfs) requires libcap-ng-devel and libattr-devel')
1071 elif not have_system
1072 error('virtio-9p (virtfs) needs system emulation support')
1073 endif
1074 endif
1075elif get_option('virtfs').disabled()
1076 have_virtfs = false
1077endif
1078
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001079config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1080config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1081config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1082config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1083config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
1084config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
1085config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1086config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1087config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1088config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1089config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1090config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1091
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001092config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001093config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04001094config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001095config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001096config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001097config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1098config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001099config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08001100config_host_data.set('CONFIG_CURSES', curses.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001101config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1102if glusterfs.found()
1103 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1104 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1105 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1106 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1107 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1108 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1109endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001110config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001111config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001112config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001113config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01001114config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001115config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001116config_host_data.set('CONFIG_SDL', sdl.found())
1117config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01001118config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01001119config_host_data.set('CONFIG_SNAPPY', snappy.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001120config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001121config_host_data.set('CONFIG_VNC', vnc.found())
1122config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1123config_host_data.set('CONFIG_VNC_PNG', png.found())
1124config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01001125config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001126config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001127config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04001128config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonziniaa087962020-09-01 11:15:30 -04001129config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01001130config_host_data.set('CONFIG_STATX', has_statx)
Paolo Bonzinib1def332020-11-17 13:37:39 +01001131config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01001132config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01001133config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01001134config_host_data.set('CONFIG_X11', x11.found())
Daniele Buono9e62ba42020-12-04 18:06:14 -05001135config_host_data.set('CONFIG_CFI', get_option('cfi'))
Paolo Bonzini859aef02020-08-04 18:14:26 +02001136config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1137config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1138config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1139config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1140
Thomas Huth48f670e2020-11-18 18:10:52 +01001141config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001142config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001143config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001144config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001145config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Joelle van Dyne1ad27f72021-01-25 17:24:51 -08001146config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Thomas Huthded5d782020-11-14 11:10:11 +01001147
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001148config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
1149
Paolo Bonzini765686d2020-09-18 06:37:21 -04001150ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
Paolo Bonzini859aef02020-08-04 18:14:26 +02001151arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001152strings = ['HOST_DSOSUF', 'CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001153foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -04001154 if ignored.contains(k)
1155 # do nothing
1156 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001157 if v != ''
1158 v = '"' + '", "'.join(v.split()) + '", '
1159 endif
1160 config_host_data.set(k, v)
1161 elif k == 'ARCH'
1162 config_host_data.set('HOST_' + v.to_upper(), 1)
1163 elif strings.contains(k)
1164 if not k.startswith('CONFIG_')
1165 k = 'CONFIG_' + k.to_upper()
1166 endif
1167 config_host_data.set_quoted(k, v)
1168 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
1169 config_host_data.set(k, v == 'y' ? 1 : v)
1170 endif
1171endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02001172
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001173########################
1174# Target configuration #
1175########################
1176
Paolo Bonzini2becc362020-02-03 11:42:03 +01001177minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04001178config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001179config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001180config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001181config_devices_mak_list = []
1182config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02001183config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001184config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001185
1186disassemblers = {
1187 'alpha' : ['CONFIG_ALPHA_DIS'],
1188 'arm' : ['CONFIG_ARM_DIS'],
1189 'avr' : ['CONFIG_AVR_DIS'],
1190 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06001191 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001192 'hppa' : ['CONFIG_HPPA_DIS'],
1193 'i386' : ['CONFIG_I386_DIS'],
1194 'x86_64' : ['CONFIG_I386_DIS'],
1195 'x32' : ['CONFIG_I386_DIS'],
1196 'lm32' : ['CONFIG_LM32_DIS'],
1197 'm68k' : ['CONFIG_M68K_DIS'],
1198 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1199 'mips' : ['CONFIG_MIPS_DIS'],
1200 'moxie' : ['CONFIG_MOXIE_DIS'],
1201 'nios2' : ['CONFIG_NIOS2_DIS'],
1202 'or1k' : ['CONFIG_OPENRISC_DIS'],
1203 'ppc' : ['CONFIG_PPC_DIS'],
1204 'riscv' : ['CONFIG_RISCV_DIS'],
1205 'rx' : ['CONFIG_RX_DIS'],
1206 's390' : ['CONFIG_S390_DIS'],
1207 'sh4' : ['CONFIG_SH4_DIS'],
1208 'sparc' : ['CONFIG_SPARC_DIS'],
1209 'xtensa' : ['CONFIG_XTENSA_DIS'],
1210}
1211if link_language == 'cpp'
1212 disassemblers += {
1213 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1214 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1215 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1216 }
1217endif
1218
Paolo Bonzini0a189112020-11-17 14:58:32 +01001219host_kconfig = \
1220 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
1221 ('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
1222 ('CONFIG_IVSHMEM' in config_host ? ['CONFIG_IVSHMEM=y'] : []) + \
1223 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01001224 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001225 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1226 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1227 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01001228 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001229 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman3090de62021-01-29 11:46:05 -05001230 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : []) + \
1231 ('CONFIG_MULTIPROCESS_ALLOWED' in config_host ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01001232
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001233ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001234
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001235default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1236actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001237fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001238foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04001239 config_target = { 'TARGET_NAME': target.split('-')[0] }
1240 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001241 if targetos != 'linux'
1242 if default_targets
1243 continue
1244 endif
1245 error('Target @0@ is only available on a Linux host'.format(target))
1246 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001247 config_target += { 'CONFIG_LINUX_USER': 'y' }
1248 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001249 if 'CONFIG_BSD' not in config_host
1250 if default_targets
1251 continue
1252 endif
1253 error('Target @0@ is only available on a BSD host'.format(target))
1254 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001255 config_target += { 'CONFIG_BSD_USER': 'y' }
1256 elif target.endswith('softmmu')
1257 config_target += { 'CONFIG_SOFTMMU': 'y' }
1258 endif
1259 if target.endswith('-user')
1260 config_target += {
1261 'CONFIG_USER_ONLY': 'y',
1262 'CONFIG_QEMU_INTERP_PREFIX':
1263 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1264 }
1265 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001266
Paolo Bonzini0a189112020-11-17 14:58:32 +01001267 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04001268 foreach sym: accelerators
1269 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1270 config_target += { sym: 'y' }
1271 config_all += { sym: 'y' }
Paolo Bonzini23a77b22020-12-14 12:01:45 +01001272 if sym == 'CONFIG_TCG' and tcg_arch == 'tci'
1273 config_target += { 'CONFIG_TCG_INTERPRETER': 'y' }
1274 elif sym == 'CONFIG_XEN' and have_xen_pci_passthrough
Paolo Bonzini8a199802020-09-18 05:37:01 -04001275 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1276 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01001277 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04001278 endif
1279 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01001280 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001281 if default_targets
1282 continue
1283 endif
1284 error('No accelerator available for target @0@'.format(target))
1285 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001286
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001287 actual_target_dirs += target
Paolo Bonzini765686d2020-09-18 06:37:21 -04001288 config_target += keyval.load('default-configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001289 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001290
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001291 if 'TARGET_NEED_FDT' in config_target
1292 fdt_required += target
1293 endif
1294
Paolo Bonzinifa731682020-09-21 05:19:07 -04001295 # Add default keys
1296 if 'TARGET_BASE_ARCH' not in config_target
1297 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1298 endif
1299 if 'TARGET_ABI_DIR' not in config_target
1300 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1301 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001302
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001303 foreach k, v: disassemblers
1304 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1305 foreach sym: v
1306 config_target += { sym: 'y' }
1307 config_all_disas += { sym: 'y' }
1308 endforeach
1309 endif
1310 endforeach
1311
Paolo Bonzini859aef02020-08-04 18:14:26 +02001312 config_target_data = configuration_data()
1313 foreach k, v: config_target
1314 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1315 # do nothing
1316 elif ignored.contains(k)
1317 # do nothing
1318 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001319 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1320 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001321 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001322 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001323 config_target_data.set_quoted(k, v)
1324 elif v == 'y'
1325 config_target_data.set(k, 1)
1326 else
1327 config_target_data.set(k, v)
1328 endif
1329 endforeach
1330 config_target_h += {target: configure_file(output: target + '-config-target.h',
1331 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001332
1333 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001334 config_devices_mak = target + '-config-devices.mak'
1335 config_devices_mak = configure_file(
Paolo Bonzini1bb4cb12020-09-18 06:06:09 -04001336 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001337 output: config_devices_mak,
1338 depfile: config_devices_mak + '.d',
1339 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01001340 command: [minikconf,
1341 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01001342 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzini0a189112020-11-17 14:58:32 +01001343 host_kconfig, accel_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02001344
1345 config_devices_data = configuration_data()
1346 config_devices = keyval.load(config_devices_mak)
1347 foreach k, v: config_devices
1348 config_devices_data.set(k, 1)
1349 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001350 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001351 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1352 configuration: config_devices_data)}
1353 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001354 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001355 endif
1356 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001357endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001358target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001359
Paolo Bonzini2becc362020-02-03 11:42:03 +01001360# This configuration is used to build files that are shared by
1361# multiple binaries, and then extracted out of the "common"
1362# static_library target.
1363#
1364# We do not use all_sources()/all_dependencies(), because it would
1365# build literally all source files, including devices only used by
1366# targets that are not built for this compilation. The CONFIG_ALL
1367# pseudo symbol replaces it.
1368
Paolo Bonzini05512f52020-09-16 15:31:11 -04001369config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001370config_all += config_host
1371config_all += config_all_disas
1372config_all += {
1373 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1374 'CONFIG_SOFTMMU': have_system,
1375 'CONFIG_USER_ONLY': have_user,
1376 'CONFIG_ALL': true,
1377}
1378
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001379##############
1380# Submodules #
1381##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001382
1383capstone = not_found
1384capstone_opt = get_option('capstone')
1385if capstone_opt in ['enabled', 'auto', 'system']
1386 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07001387 capstone = dependency('capstone', version: '>=4.0',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001388 kwargs: static_kwargs, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001389 required: capstone_opt == 'system' or
1390 capstone_opt == 'enabled' and not have_internal)
1391 if capstone.found()
1392 capstone_opt = 'system'
1393 elif have_internal
1394 capstone_opt = 'internal'
1395 else
1396 capstone_opt = 'disabled'
1397 endif
1398endif
1399if capstone_opt == 'internal'
1400 capstone_data = configuration_data()
1401 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1402
1403 capstone_files = files(
1404 'capstone/cs.c',
1405 'capstone/MCInst.c',
1406 'capstone/MCInstrDesc.c',
1407 'capstone/MCRegisterInfo.c',
1408 'capstone/SStream.c',
1409 'capstone/utils.c'
1410 )
1411
1412 if 'CONFIG_ARM_DIS' in config_all_disas
1413 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1414 capstone_files += files(
1415 'capstone/arch/ARM/ARMDisassembler.c',
1416 'capstone/arch/ARM/ARMInstPrinter.c',
1417 'capstone/arch/ARM/ARMMapping.c',
1418 'capstone/arch/ARM/ARMModule.c'
1419 )
1420 endif
1421
1422 # FIXME: This config entry currently depends on a c++ compiler.
1423 # Which is needed for building libvixl, but not for capstone.
1424 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1425 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1426 capstone_files += files(
1427 'capstone/arch/AArch64/AArch64BaseInfo.c',
1428 'capstone/arch/AArch64/AArch64Disassembler.c',
1429 'capstone/arch/AArch64/AArch64InstPrinter.c',
1430 'capstone/arch/AArch64/AArch64Mapping.c',
1431 'capstone/arch/AArch64/AArch64Module.c'
1432 )
1433 endif
1434
1435 if 'CONFIG_PPC_DIS' in config_all_disas
1436 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1437 capstone_files += files(
1438 'capstone/arch/PowerPC/PPCDisassembler.c',
1439 'capstone/arch/PowerPC/PPCInstPrinter.c',
1440 'capstone/arch/PowerPC/PPCMapping.c',
1441 'capstone/arch/PowerPC/PPCModule.c'
1442 )
1443 endif
1444
Richard Henderson3d562842020-01-04 07:24:59 +10001445 if 'CONFIG_S390_DIS' in config_all_disas
1446 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1447 capstone_files += files(
1448 'capstone/arch/SystemZ/SystemZDisassembler.c',
1449 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1450 'capstone/arch/SystemZ/SystemZMapping.c',
1451 'capstone/arch/SystemZ/SystemZModule.c',
1452 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1453 )
1454 endif
1455
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001456 if 'CONFIG_I386_DIS' in config_all_disas
1457 capstone_data.set('CAPSTONE_HAS_X86', 1)
1458 capstone_files += files(
1459 'capstone/arch/X86/X86Disassembler.c',
1460 'capstone/arch/X86/X86DisassemblerDecoder.c',
1461 'capstone/arch/X86/X86ATTInstPrinter.c',
1462 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07001463 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001464 'capstone/arch/X86/X86Mapping.c',
1465 'capstone/arch/X86/X86Module.c'
1466 )
1467 endif
1468
1469 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1470
1471 capstone_cargs = [
1472 # FIXME: There does not seem to be a way to completely replace the c_args
1473 # that come from add_project_arguments() -- we can only add to them.
1474 # So: disable all warnings with a big hammer.
1475 '-Wno-error', '-w',
1476
1477 # Include all configuration defines via a header file, which will wind up
1478 # as a dependency on the object file, and thus changes here will result
1479 # in a rebuild.
1480 '-include', 'capstone-defs.h'
1481 ]
1482
1483 libcapstone = static_library('capstone',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001484 build_by_default: false,
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001485 sources: capstone_files,
1486 c_args: capstone_cargs,
1487 include_directories: 'capstone/include')
1488 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07001489 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001490endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001491
1492slirp = not_found
1493slirp_opt = 'disabled'
1494if have_system
1495 slirp_opt = get_option('slirp')
1496 if slirp_opt in ['enabled', 'auto', 'system']
1497 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001498 slirp = dependency('slirp', kwargs: static_kwargs,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001499 method: 'pkg-config',
1500 required: slirp_opt == 'system' or
1501 slirp_opt == 'enabled' and not have_internal)
1502 if slirp.found()
1503 slirp_opt = 'system'
1504 elif have_internal
1505 slirp_opt = 'internal'
1506 else
1507 slirp_opt = 'disabled'
1508 endif
1509 endif
1510 if slirp_opt == 'internal'
1511 slirp_deps = []
1512 if targetos == 'windows'
1513 slirp_deps = cc.find_library('iphlpapi')
1514 endif
1515 slirp_conf = configuration_data()
1516 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1517 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1518 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1519 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1520 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1521 slirp_files = [
1522 'slirp/src/arp_table.c',
1523 'slirp/src/bootp.c',
1524 'slirp/src/cksum.c',
1525 'slirp/src/dhcpv6.c',
1526 'slirp/src/dnssearch.c',
1527 'slirp/src/if.c',
1528 'slirp/src/ip6_icmp.c',
1529 'slirp/src/ip6_input.c',
1530 'slirp/src/ip6_output.c',
1531 'slirp/src/ip_icmp.c',
1532 'slirp/src/ip_input.c',
1533 'slirp/src/ip_output.c',
1534 'slirp/src/mbuf.c',
1535 'slirp/src/misc.c',
1536 'slirp/src/ncsi.c',
1537 'slirp/src/ndp_table.c',
1538 'slirp/src/sbuf.c',
1539 'slirp/src/slirp.c',
1540 'slirp/src/socket.c',
1541 'slirp/src/state.c',
1542 'slirp/src/stream.c',
1543 'slirp/src/tcp_input.c',
1544 'slirp/src/tcp_output.c',
1545 'slirp/src/tcp_subr.c',
1546 'slirp/src/tcp_timer.c',
1547 'slirp/src/tftp.c',
1548 'slirp/src/udp.c',
1549 'slirp/src/udp6.c',
1550 'slirp/src/util.c',
1551 'slirp/src/version.c',
1552 'slirp/src/vmstate.c',
1553 ]
1554
1555 configure_file(
1556 input : 'slirp/src/libslirp-version.h.in',
1557 output : 'libslirp-version.h',
1558 configuration: slirp_conf)
1559
1560 slirp_inc = include_directories('slirp', 'slirp/src')
1561 libslirp = static_library('slirp',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001562 build_by_default: false,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001563 sources: slirp_files,
1564 c_args: slirp_cargs,
1565 include_directories: slirp_inc)
1566 slirp = declare_dependency(link_with: libslirp,
1567 dependencies: slirp_deps,
1568 include_directories: slirp_inc)
1569 endif
1570endif
1571
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001572fdt = not_found
1573fdt_opt = get_option('fdt')
1574if have_system
1575 if fdt_opt in ['enabled', 'auto', 'system']
1576 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001577 fdt = cc.find_library('fdt', kwargs: static_kwargs,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001578 required: fdt_opt == 'system' or
1579 fdt_opt == 'enabled' and not have_internal)
1580 if fdt.found() and cc.links('''
1581 #include <libfdt.h>
1582 #include <libfdt_env.h>
1583 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1584 dependencies: fdt)
1585 fdt_opt = 'system'
1586 elif have_internal
1587 fdt_opt = 'internal'
1588 else
1589 fdt_opt = 'disabled'
1590 endif
1591 endif
1592 if fdt_opt == 'internal'
1593 fdt_files = files(
1594 'dtc/libfdt/fdt.c',
1595 'dtc/libfdt/fdt_ro.c',
1596 'dtc/libfdt/fdt_wip.c',
1597 'dtc/libfdt/fdt_sw.c',
1598 'dtc/libfdt/fdt_rw.c',
1599 'dtc/libfdt/fdt_strerror.c',
1600 'dtc/libfdt/fdt_empty_tree.c',
1601 'dtc/libfdt/fdt_addresses.c',
1602 'dtc/libfdt/fdt_overlay.c',
1603 'dtc/libfdt/fdt_check.c',
1604 )
1605
1606 fdt_inc = include_directories('dtc/libfdt')
1607 libfdt = static_library('fdt',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001608 build_by_default: false,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001609 sources: fdt_files,
1610 include_directories: fdt_inc)
1611 fdt = declare_dependency(link_with: libfdt,
1612 include_directories: fdt_inc)
1613 endif
1614endif
1615if not fdt.found() and fdt_required.length() > 0
1616 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1617endif
1618
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001619config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001620config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001621config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001622
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001623#####################
1624# Generated sources #
1625#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001626
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001627genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001628
Marc-André Lureau3f885652019-07-15 18:06:04 +04001629hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04001630shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001631qapi_gen = find_program('scripts/qapi-gen.py')
1632qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1633 meson.source_root() / 'scripts/qapi/commands.py',
1634 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001635 meson.source_root() / 'scripts/qapi/error.py',
1636 meson.source_root() / 'scripts/qapi/events.py',
1637 meson.source_root() / 'scripts/qapi/expr.py',
1638 meson.source_root() / 'scripts/qapi/gen.py',
1639 meson.source_root() / 'scripts/qapi/introspect.py',
1640 meson.source_root() / 'scripts/qapi/parser.py',
1641 meson.source_root() / 'scripts/qapi/schema.py',
1642 meson.source_root() / 'scripts/qapi/source.py',
1643 meson.source_root() / 'scripts/qapi/types.py',
1644 meson.source_root() / 'scripts/qapi/visit.py',
1645 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001646 meson.source_root() / 'scripts/qapi-gen.py'
1647]
1648
1649tracetool = [
1650 python, files('scripts/tracetool.py'),
1651 '--backend=' + config_host['TRACE_BACKENDS']
1652]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00001653tracetool_depends = files(
1654 'scripts/tracetool/backend/log.py',
1655 'scripts/tracetool/backend/__init__.py',
1656 'scripts/tracetool/backend/dtrace.py',
1657 'scripts/tracetool/backend/ftrace.py',
1658 'scripts/tracetool/backend/simple.py',
1659 'scripts/tracetool/backend/syslog.py',
1660 'scripts/tracetool/backend/ust.py',
1661 'scripts/tracetool/format/tcg_h.py',
1662 'scripts/tracetool/format/ust_events_c.py',
1663 'scripts/tracetool/format/ust_events_h.py',
1664 'scripts/tracetool/format/__init__.py',
1665 'scripts/tracetool/format/d.py',
1666 'scripts/tracetool/format/tcg_helper_c.py',
1667 'scripts/tracetool/format/simpletrace_stap.py',
1668 'scripts/tracetool/format/c.py',
1669 'scripts/tracetool/format/h.py',
1670 'scripts/tracetool/format/tcg_helper_h.py',
1671 'scripts/tracetool/format/log_stap.py',
1672 'scripts/tracetool/format/stap.py',
1673 'scripts/tracetool/format/tcg_helper_wrapper_h.py',
1674 'scripts/tracetool/__init__.py',
1675 'scripts/tracetool/transform.py',
1676 'scripts/tracetool/vcpu.py'
1677)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001678
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001679qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1680 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02001681 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001682qemu_version = custom_target('qemu-version.h',
1683 output: 'qemu-version.h',
1684 command: qemu_version_cmd,
1685 capture: true,
1686 build_by_default: true,
1687 build_always_stale: true)
1688genh += qemu_version
1689
Marc-André Lureau3f885652019-07-15 18:06:04 +04001690hxdep = []
1691hx_headers = [
1692 ['qemu-options.hx', 'qemu-options.def'],
1693 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1694]
1695if have_system
1696 hx_headers += [
1697 ['hmp-commands.hx', 'hmp-commands.h'],
1698 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1699 ]
1700endif
1701foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001702 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04001703 input: files(d[0]),
1704 output: d[1],
1705 capture: true,
1706 build_by_default: true, # to be removed when added to a target
1707 command: [hxtool, '-h', '@INPUT0@'])
1708endforeach
1709genh += hxdep
1710
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001711###################
1712# Collect sources #
1713###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001714
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001715authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001716blockdev_ss = ss.source_set()
1717block_ss = ss.source_set()
1718bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001719chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001720common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001721crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001722io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001723linux_user_ss = ss.source_set()
1724qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001725qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001726softmmu_ss = ss.source_set()
1727specific_fuzz_ss = ss.source_set()
1728specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001729stub_ss = ss.source_set()
1730trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001731user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001732util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001733
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001734modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001735hw_arch = {}
1736target_arch = {}
1737target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001738
1739###############
1740# Trace files #
1741###############
1742
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001743# TODO: add each directory to the subdirs from its own meson.build, once
1744# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001745trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001746 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01001747 'qapi',
1748 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001749 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01001750 'util',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001751]
1752if have_user
1753 trace_events_subdirs += [ 'linux-user' ]
1754endif
1755if have_block
1756 trace_events_subdirs += [
1757 'authz',
1758 'block',
1759 'io',
1760 'nbd',
1761 'scsi',
1762 ]
1763endif
1764if have_system
1765 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01001766 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001767 'audio',
1768 'backends',
1769 'backends/tpm',
1770 'chardev',
1771 'hw/9pfs',
1772 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08001773 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001774 'hw/alpha',
1775 'hw/arm',
1776 'hw/audio',
1777 'hw/block',
1778 'hw/block/dataplane',
1779 'hw/char',
1780 'hw/display',
1781 'hw/dma',
1782 'hw/hppa',
1783 'hw/hyperv',
1784 'hw/i2c',
1785 'hw/i386',
1786 'hw/i386/xen',
1787 'hw/ide',
1788 'hw/input',
1789 'hw/intc',
1790 'hw/isa',
1791 'hw/mem',
1792 'hw/mips',
1793 'hw/misc',
1794 'hw/misc/macio',
1795 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08001796 'hw/net/can',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001797 'hw/nvram',
1798 'hw/pci',
1799 'hw/pci-host',
1800 'hw/ppc',
1801 'hw/rdma',
1802 'hw/rdma/vmw',
1803 'hw/rtc',
1804 'hw/s390x',
1805 'hw/scsi',
1806 'hw/sd',
1807 'hw/sparc',
1808 'hw/sparc64',
1809 'hw/ssi',
1810 'hw/timer',
1811 'hw/tpm',
1812 'hw/usb',
1813 'hw/vfio',
1814 'hw/virtio',
1815 'hw/watchdog',
1816 'hw/xen',
1817 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001818 'migration',
1819 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02001820 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001821 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05001822 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001823 ]
1824endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01001825if have_system or have_user
1826 trace_events_subdirs += [
1827 'accel/tcg',
1828 'hw/core',
1829 'target/arm',
1830 'target/hppa',
1831 'target/i386',
1832 'target/i386/kvm',
1833 'target/mips',
1834 'target/ppc',
1835 'target/riscv',
1836 'target/s390x',
1837 'target/sparc',
1838 ]
1839endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001840
Marc-André Lureau0df750e2020-11-25 14:06:37 +04001841vhost_user = not_found
1842if 'CONFIG_VHOST_USER' in config_host
1843 libvhost_user = subproject('libvhost-user')
1844 vhost_user = libvhost_user.get_variable('vhost_user_dep')
1845endif
1846
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001847subdir('qapi')
1848subdir('qobject')
1849subdir('stubs')
1850subdir('trace')
1851subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04001852subdir('qom')
1853subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001854subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04001855subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001856
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001857
1858if enable_modules
1859 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1860 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1861endif
1862
Paolo Bonzini2becc362020-02-03 11:42:03 +01001863stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001864
1865util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01001866util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001867libqemuutil = static_library('qemuutil',
1868 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonziniaa087962020-09-01 11:15:30 -04001869 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001870qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04001871 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001872
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01001873if have_system or have_user
1874 decodetree = generator(find_program('scripts/decodetree.py'),
1875 output: 'decode-@BASENAME@.c.inc',
1876 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1877 subdir('libdecnumber')
1878 subdir('target')
1879endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001880
Paolo Bonzini478e9432020-08-17 12:47:55 +02001881subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04001882subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04001883subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001884subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04001885subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001886
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01001887if have_block
1888 block_ss.add(files(
1889 'block.c',
1890 'blockjob.c',
1891 'job.c',
1892 'qemu-io-cmds.c',
1893 ))
1894 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001895
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01001896 subdir('nbd')
1897 subdir('scsi')
1898 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001899
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01001900 blockdev_ss.add(files(
1901 'blockdev.c',
1902 'blockdev-nbd.c',
1903 'iothread.c',
1904 'job-qmp.c',
1905 ), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02001906
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01001907 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1908 # os-win32.c does not
1909 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1910 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
1911endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02001912
1913common_ss.add(files('cpus-common.c'))
1914
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001915subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001916
Richard Hendersonf3433462020-09-12 10:47:33 -07001917common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02001918specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001919specific_ss.add(files('exec-vary.c'))
1920specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1921 'fpu/softfloat.c',
1922 'tcg/optimize.c',
1923 'tcg/tcg-common.c',
1924 'tcg/tcg-op-gvec.c',
1925 'tcg/tcg-op-vec.c',
1926 'tcg/tcg-op.c',
1927 'tcg/tcg.c',
1928))
1929specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1930
Marc-André Lureauab318052019-07-24 19:23:16 +04001931subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04001932subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04001933subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001934subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001935subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04001936subdir('replay')
Marc-André Lureau582ea952019-08-15 15:15:32 +04001937subdir('hw')
Marc-André Lureau1a828782019-08-18 16:13:08 +04001938subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001939subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04001940subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04001941subdir('linux-user')
1942
Marc-André Lureaub309c322019-08-18 19:20:37 +04001943bsd_user_ss.add(files('gdbstub.c'))
1944specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1945
Marc-André Lureau3a304462019-08-18 16:13:08 +04001946linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1947specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001948
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001949# needed for fuzzing binaries
1950subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001951subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001952
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001953########################
1954# Library dependencies #
1955########################
1956
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001957block_mods = []
1958softmmu_mods = []
1959foreach d, list : modules
1960 foreach m, module_ss : list
1961 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02001962 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001963 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1964 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1965 if d == 'block'
1966 block_mods += sl
1967 else
1968 softmmu_mods += sl
1969 endif
1970 else
1971 if d == 'block'
1972 block_ss.add_all(module_ss)
1973 else
1974 softmmu_ss.add_all(module_ss)
1975 endif
1976 endif
1977 endforeach
1978endforeach
1979
1980nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08001981undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001982block_syms = custom_target('block.syms', output: 'block.syms',
1983 input: [libqemuutil, block_mods],
1984 capture: true,
1985 command: [undefsym, nm, '@INPUT@'])
1986qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1987 input: [libqemuutil, softmmu_mods],
1988 capture: true,
1989 command: [undefsym, nm, '@INPUT@'])
1990
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001991qom_ss = qom_ss.apply(config_host, strict: false)
1992libqom = static_library('qom', qom_ss.sources() + genh,
1993 dependencies: [qom_ss.dependencies()],
1994 name_suffix: 'fa')
1995
1996qom = declare_dependency(link_whole: libqom)
1997
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001998authz_ss = authz_ss.apply(config_host, strict: false)
1999libauthz = static_library('authz', authz_ss.sources() + genh,
2000 dependencies: [authz_ss.dependencies()],
2001 name_suffix: 'fa',
2002 build_by_default: false)
2003
2004authz = declare_dependency(link_whole: libauthz,
2005 dependencies: qom)
2006
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002007crypto_ss = crypto_ss.apply(config_host, strict: false)
2008libcrypto = static_library('crypto', crypto_ss.sources() + genh,
2009 dependencies: [crypto_ss.dependencies()],
2010 name_suffix: 'fa',
2011 build_by_default: false)
2012
2013crypto = declare_dependency(link_whole: libcrypto,
2014 dependencies: [authz, qom])
2015
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002016io_ss = io_ss.apply(config_host, strict: false)
2017libio = static_library('io', io_ss.sources() + genh,
2018 dependencies: [io_ss.dependencies()],
2019 link_with: libqemuutil,
2020 name_suffix: 'fa',
2021 build_by_default: false)
2022
2023io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
2024
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02002025libmigration = static_library('migration', sources: migration_files + genh,
2026 name_suffix: 'fa',
2027 build_by_default: false)
2028migration = declare_dependency(link_with: libmigration,
2029 dependencies: [zlib, qom, io])
2030softmmu_ss.add(migration)
2031
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002032block_ss = block_ss.apply(config_host, strict: false)
2033libblock = static_library('block', block_ss.sources() + genh,
2034 dependencies: block_ss.dependencies(),
2035 link_depends: block_syms,
2036 name_suffix: 'fa',
2037 build_by_default: false)
2038
2039block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002040 link_args: '@block.syms',
2041 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002042
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002043blockdev_ss = blockdev_ss.apply(config_host, strict: false)
2044libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
2045 dependencies: blockdev_ss.dependencies(),
2046 name_suffix: 'fa',
2047 build_by_default: false)
2048
2049blockdev = declare_dependency(link_whole: [libblockdev],
2050 dependencies: [block])
2051
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002052qmp_ss = qmp_ss.apply(config_host, strict: false)
2053libqmp = static_library('qmp', qmp_ss.sources() + genh,
2054 dependencies: qmp_ss.dependencies(),
2055 name_suffix: 'fa',
2056 build_by_default: false)
2057
2058qmp = declare_dependency(link_whole: [libqmp])
2059
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002060libchardev = static_library('chardev', chardev_ss.sources() + genh,
2061 name_suffix: 'fa',
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002062 dependencies: [gnutls],
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002063 build_by_default: false)
2064
2065chardev = declare_dependency(link_whole: libchardev)
2066
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02002067libhwcore = static_library('hwcore', sources: hwcore_files + genh,
2068 name_suffix: 'fa',
2069 build_by_default: false)
2070hwcore = declare_dependency(link_whole: libhwcore)
2071common_ss.add(hwcore)
2072
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02002073###########
2074# Targets #
2075###########
2076
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002077foreach m : block_mods + softmmu_mods
2078 shared_module(m.name(),
2079 name_prefix: '',
2080 link_whole: m,
2081 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002082 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002083endforeach
2084
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002085softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002086common_ss.add(qom, qemuutil)
2087
2088common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01002089common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
2090
2091common_all = common_ss.apply(config_all, strict: false)
2092common_all = static_library('common',
2093 build_by_default: false,
2094 sources: common_all.sources() + genh,
2095 dependencies: common_all.dependencies(),
2096 name_suffix: 'fa')
2097
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002098feature_to_c = find_program('scripts/feature_to_c.sh')
2099
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002100emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002101foreach target : target_dirs
2102 config_target = config_target_mak[target]
2103 target_name = config_target['TARGET_NAME']
2104 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02002105 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002106 arch_deps = []
2107 c_args = ['-DNEED_CPU_H',
2108 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2109 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04002110 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01002111
Paolo Bonzini859aef02020-08-04 18:14:26 +02002112 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01002113 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2114 if targetos == 'linux'
2115 target_inc += include_directories('linux-headers', is_system: true)
2116 endif
2117 if target.endswith('-softmmu')
2118 qemu_target_name = 'qemu-system-' + target_name
2119 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002120 t = target_softmmu_arch[arch].apply(config_target, strict: false)
2121 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002122 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002123
Marc-André Lureau2c442202019-08-17 13:55:58 +04002124 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
2125 hw = hw_arch[hw_dir].apply(config_target, strict: false)
2126 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002127 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04002128
Paolo Bonzini2becc362020-02-03 11:42:03 +01002129 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002130 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002131 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04002132 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002133 target_type='user'
2134 qemu_target_name = 'qemu-' + target_name
2135 if 'CONFIG_LINUX_USER' in config_target
2136 base_dir = 'linux-user'
2137 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
2138 else
2139 base_dir = 'bsd-user'
Stacey Sonea1ab4c2020-12-18 13:54:50 -07002140 target_inc += include_directories('bsd-user/freebsd')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002141 endif
2142 target_inc += include_directories(
2143 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04002144 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002145 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04002146 if 'CONFIG_LINUX_USER' in config_target
2147 dir = base_dir / abi
2148 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
2149 if config_target.has_key('TARGET_SYSTBL_ABI')
2150 arch_srcs += \
2151 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
2152 extra_args : config_target['TARGET_SYSTBL_ABI'])
2153 endif
2154 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002155 endif
2156
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002157 if 'TARGET_XML_FILES' in config_target
2158 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
2159 output: target + '-gdbstub-xml.c',
2160 input: files(config_target['TARGET_XML_FILES'].split()),
2161 command: [feature_to_c, '@INPUT@'],
2162 capture: true)
2163 arch_srcs += gdbstub_xml
2164 endif
2165
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002166 t = target_arch[arch].apply(config_target, strict: false)
2167 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002168 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002169
Paolo Bonzini2becc362020-02-03 11:42:03 +01002170 target_common = common_ss.apply(config_target, strict: false)
2171 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002172 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002173
Paolo Bonzini2becc362020-02-03 11:42:03 +01002174 target_specific = specific_ss.apply(config_target, strict: false)
2175 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002176 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002177
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002178 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02002179 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002180 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002181 objects: objects,
2182 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002183 c_args: c_args,
2184 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002185 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002186
2187 if target.endswith('-softmmu')
2188 execs = [{
2189 'name': 'qemu-system-' + target_name,
2190 'gui': false,
2191 'sources': files('softmmu/main.c'),
2192 'dependencies': []
2193 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002194 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002195 execs += [{
2196 'name': 'qemu-system-' + target_name + 'w',
2197 'gui': true,
2198 'sources': files('softmmu/main.c'),
2199 'dependencies': []
2200 }]
2201 endif
2202 if config_host.has_key('CONFIG_FUZZ')
2203 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
2204 execs += [{
2205 'name': 'qemu-fuzz-' + target_name,
2206 'gui': false,
2207 'sources': specific_fuzz.sources(),
2208 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002209 }]
2210 endif
2211 else
2212 execs = [{
2213 'name': 'qemu-' + target_name,
2214 'gui': false,
2215 'sources': [],
2216 'dependencies': []
2217 }]
2218 endif
2219 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01002220 exe_name = exe['name']
2221 exe_sign = 'CONFIG_HVF' in config_target
2222 if exe_sign
2223 exe_name += '-unsigned'
2224 endif
2225
2226 emulator = executable(exe_name, exe['sources'],
2227 install: not exe_sign,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002228 c_args: c_args,
2229 dependencies: arch_deps + deps + exe['dependencies'],
2230 objects: lib.extract_all_objects(recursive: true),
2231 link_language: link_language,
2232 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
2233 link_args: link_args,
2234 gui_app: exe['gui'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01002235
2236 if exe_sign
2237 emulators += {exe['name'] : custom_target(exe['name'],
2238 install: true,
2239 install_dir: get_option('bindir'),
2240 depends: emulator,
2241 output: exe['name'],
2242 command: [
2243 meson.current_source_dir() / 'scripts/entitlement.sh',
2244 meson.current_build_dir() / exe_name,
2245 meson.current_build_dir() / exe['name'],
2246 meson.current_source_dir() / 'accel/hvf/entitlements.plist'
2247 ])
2248 }
2249 else
2250 emulators += {exe['name']: emulator}
2251 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002252
2253 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
2254 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002255 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
2256 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002257 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
2258 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
2259 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002260 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002261 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002262 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002263 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002264 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002265 command: [
2266 tracetool, '--group=all', '--format=' + stp['fmt'],
2267 '--binary=' + stp['bin'],
2268 '--target-name=' + target_name,
2269 '--target-type=' + target_type,
2270 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01002271 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002272 ],
2273 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002274 endforeach
2275 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002276 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002277endforeach
2278
Paolo Bonzini931049b2020-02-05 09:44:24 +01002279# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002280
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002281if 'CONFIG_PLUGIN' in config_host
2282 install_headers('include/qemu/qemu-plugin.h')
2283endif
2284
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002285if 'CONFIG_GUEST_AGENT' in config_host
2286 subdir('qga')
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002287elif get_option('guest_agent_msi').enabled()
2288 error('Guest agent MSI requested, but the guest agent is not being built')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002289endif
2290
Laurent Vivier9755c942020-08-24 17:24:30 +02002291# Don't build qemu-keymap if xkbcommon is not explicitly enabled
2292# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002293if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04002294 # used for the update-keymaps target, so include rules even if !have_tools
2295 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
2296 dependencies: [qemuutil, xkbcommon], install: have_tools)
2297endif
2298
Paolo Bonzini931049b2020-02-05 09:44:24 +01002299if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002300 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
2301 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
2302 qemu_io = executable('qemu-io', files('qemu-io.c'),
2303 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01002304 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002305 dependencies: [blockdev, qemuutil, gnutls], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002306
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02002307 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002308 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04002309 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002310
Marc-André Lureau157e7b12019-07-15 14:50:58 +04002311 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
2312 dependencies: qemuutil,
2313 install: true)
2314
Paolo Bonzini931049b2020-02-05 09:44:24 +01002315 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02002316 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002317 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04002318 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02002319 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01002320 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002321
2322 if targetos == 'linux'
2323 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2324 dependencies: [qemuutil, libcap_ng],
2325 install: true,
2326 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002327
2328 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2329 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002330 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002331 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002332 endif
2333
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04002334 if 'CONFIG_IVSHMEM' in config_host
2335 subdir('contrib/ivshmem-client')
2336 subdir('contrib/ivshmem-server')
2337 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01002338endif
2339
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04002340subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002341subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04002342subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02002343subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08002344subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01002345if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04002346 subdir('po')
2347endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002348
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002349if host_machine.system() == 'windows'
2350 nsis_cmd = [
2351 find_program('scripts/nsis.py'),
2352 '@OUTPUT@',
2353 get_option('prefix'),
2354 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01002355 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002356 '--',
2357 '-DDISPLAYVERSION=' + meson.project_version(),
2358 ]
2359 if build_docs
2360 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2361 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002362 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002363 nsis_cmd += '-DCONFIG_GTK=y'
2364 endif
2365
2366 nsis = custom_target('nsis',
2367 output: 'qemu-setup-' + meson.project_version() + '.exe',
2368 input: files('qemu.nsi'),
2369 build_always_stale: true,
2370 command: nsis_cmd + ['@INPUT@'])
2371 alias_target('installer', nsis)
2372endif
2373
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002374#########################
2375# Configuration summary #
2376#########################
2377
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002378# Directories
Paolo Bonzinif9332752020-02-03 13:28:38 +01002379summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002380summary_info += {'Install prefix': get_option('prefix')}
2381summary_info += {'BIOS directory': qemu_datadir}
2382summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2383summary_info += {'binary directory': get_option('bindir')}
2384summary_info += {'library directory': get_option('libdir')}
2385summary_info += {'module directory': qemu_moddir}
2386summary_info += {'libexec directory': get_option('libexecdir')}
2387summary_info += {'include directory': get_option('includedir')}
2388summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002389if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002390 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04002391 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002392else
2393 summary_info += {'local state directory': 'queried at runtime'}
2394endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04002395summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002396summary_info += {'Build directory': meson.current_build_dir()}
2397summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002398summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002399summary(summary_info, bool_yn: true, section: 'Directories')
2400
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002401# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002402summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002403summary_info += {'git': config_host['GIT']}
2404summary_info += {'make': config_host['MAKE']}
2405summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
2406summary_info += {'sphinx-build': sphinx_build.found()}
2407if config_host.has_key('HAVE_GDB_BIN')
2408 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2409endif
2410summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2411if targetos == 'windows' and config_host.has_key('CONFIG_GUEST_AGENT')
2412 summary_info += {'wixl': wixl.found() ? wixl.full_path() : false}
2413endif
2414if slirp_opt != 'disabled'
2415 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2416endif
2417summary(summary_info, bool_yn: true, section: 'Host binaries')
2418
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01002419# Configurable features
2420summary_info = {}
2421summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002422summary_info += {'system-mode emulation': have_system}
2423summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002424summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01002425summary_info += {'Install blobs': get_option('install_blobs')}
2426summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2427if config_host.has_key('CONFIG_MODULES')
2428 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2429endif
2430summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2431summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2432if have_system
2433 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2434endif
2435summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2436if config_host['TRACE_BACKENDS'].split().contains('simple')
2437 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2438endif
2439summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2440summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
2441summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2442summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2443summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2444summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
2445summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
2446summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
2447summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2448summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2449summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2450summary(summary_info, bool_yn: true, section: 'Configurable features')
2451
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002452# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002453summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002454summary_info += {'host CPU': cpu}
2455summary_info += {'host endianness': build_machine.endian()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002456summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
2457summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
2458if link_language == 'cpp'
2459 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
2460else
2461 summary_info += {'C++ compiler': false}
2462endif
2463if targetos == 'darwin'
2464 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
2465endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002466if targetos == 'windows'
2467 if 'WIN_SDK' in config_host
2468 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2469 endif
2470endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002471summary_info += {'ARFLAGS': config_host['ARFLAGS']}
Paolo Bonzini47b30832020-09-23 05:26:17 -04002472summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2473 + ['-O' + get_option('optimization')]
2474 + (get_option('debug') ? ['-g'] : []))}
2475if link_language == 'cpp'
2476 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2477 + ['-O' + get_option('optimization')]
2478 + (get_option('debug') ? ['-g'] : []))}
2479endif
2480link_args = get_option(link_language + '_link_args')
2481if link_args.length() > 0
2482 summary_info += {'LDFLAGS': ' '.join(link_args)}
2483endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002484summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2485summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002486summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05002487summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002488summary_info += {'PIE': get_option('b_pie')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02002489summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002490summary_info += {'malloc trim support': has_malloc_trim}
2491summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002492summary_info += {'preadv support': config_host_data.get('CONFIG_PREADV')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002493summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2494summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2495summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2496summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
2497summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2498summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2499summary_info += {'memory allocator': get_option('malloc')}
2500summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2501summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2502summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
2503summary_info += {'gcov': get_option('b_coverage')}
2504summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2505summary_info += {'CFI support': get_option('cfi')}
2506if get_option('cfi')
2507 summary_info += {'CFI debug support': get_option('cfi_debug')}
2508endif
2509summary_info += {'strip binaries': get_option('strip')}
2510summary_info += {'sparse': sparse.found() ? sparse.full_path() : false}
2511summary_info += {'mingw32 support': targetos == 'windows'}
Alex Bennée49e85652021-02-22 10:14:50 +00002512
2513# snarf the cross-compilation information for tests
2514foreach target: target_dirs
2515 tcg_mak = meson.current_build_dir() / 'tests/tcg' / 'config-' + target + '.mak'
2516 if fs.exists(tcg_mak)
2517 config_cross_tcg = keyval.load(tcg_mak)
2518 target = config_cross_tcg['TARGET_NAME']
2519 compiler = ''
2520 if 'DOCKER_CROSS_CC_GUEST' in config_cross_tcg
2521 summary_info += {target + ' tests': config_cross_tcg['DOCKER_CROSS_CC_GUEST'] +
2522 ' via ' + config_cross_tcg['DOCKER_IMAGE']}
2523 elif 'CROSS_CC_GUEST' in config_cross_tcg
2524 summary_info += {target + ' tests'
2525 : config_cross_tcg['CROSS_CC_GUEST'] }
2526 endif
2527 endif
2528endforeach
2529
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002530summary(summary_info, bool_yn: true, section: 'Compilation')
2531
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002532# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002533summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002534if have_system
2535 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2536 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2537 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2538 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
2539 summary_info += {'Xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2540 if config_host.has_key('CONFIG_XEN_BACKEND')
2541 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2542 endif
2543endif
2544summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2545if config_all.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01002546 if get_option('tcg_interpreter')
2547 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, experimental and slow)'}
2548 else
2549 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
2550 endif
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002551 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002552endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002553summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002554if have_system
2555 summary_info += {'default devices': get_option('default_devices')}
2556endif
2557summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
2558
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002559# Block layer
2560summary_info = {}
2561summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2562summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2563if have_block
2564 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2565 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
2566 summary_info += {'VirtFS support': have_virtfs}
2567 summary_info += {'build virtiofs daemon': have_virtiofsd}
2568 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
2569 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2570 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2571 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2572 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2573 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2574 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2575 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2576 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2577 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2578 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
2579 summary_info += {'FUSE exports': fuse.found()}
2580endif
2581summary(summary_info, bool_yn: true, section: 'Block layer support')
2582
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002583# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002584summary_info = {}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002585summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
2586summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
2587# TODO: add back version
2588summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
2589if config_host.has_key('CONFIG_GCRYPT')
2590 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
2591 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2592endif
2593# TODO: add back version
2594summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
2595if config_host.has_key('CONFIG_NETTLE')
2596 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2597endif
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002598summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
2599summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2600summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
2601summary(summary_info, bool_yn: true, section: 'Crypto')
2602
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01002603# Libraries
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002604summary_info = {}
2605if targetos == 'darwin'
2606 summary_info += {'Cocoa support': cocoa.found()}
2607endif
2608# TODO: add back version
2609summary_info += {'SDL support': sdl.found()}
2610summary_info += {'SDL image support': sdl_image.found()}
2611# TODO: add back version
2612summary_info += {'GTK support': gtk.found()}
2613summary_info += {'pixman': pixman.found()}
2614# TODO: add back version
2615summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002616# TODO: add back version
2617summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002618summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
2619summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
Yonggang Luo5285e592020-10-13 07:43:48 +08002620summary_info += {'iconv support': iconv.found()}
2621summary_info += {'curses support': curses.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002622# TODO: add back version
2623summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002624summary_info += {'curl support': curl.found()}
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002625summary_info += {'Multipath support': mpathpersist.found()}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002626summary_info += {'VNC support': vnc.found()}
2627if vnc.found()
2628 summary_info += {'VNC SASL support': sasl.found()}
2629 summary_info += {'VNC JPEG support': jpeg.found()}
2630 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002631endif
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002632summary_info += {'brlapi support': brlapi.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002633summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2634summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2635summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2636summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002637summary_info += {'ATTR/XATTR support': libattr.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002638summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2639summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002640summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002641summary_info += {'libcap-ng support': libcap_ng.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002642# TODO: add back protocol and server version
2643summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002644summary_info += {'rbd support': rbd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002645summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
2646summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02002647summary_info += {'U2F support': u2f.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002648summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
2649summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
2650summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
2651summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002652summary_info += {'libiscsi support': libiscsi.found()}
Paolo Bonzini30045c02020-11-17 13:11:25 +01002653summary_info += {'libnfs support': libnfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002654if targetos == 'windows'
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002655 if config_host.has_key('CONFIG_GUEST_AGENT')
2656 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2657 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002658 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002659endif
Paolo Bonzini90835c22020-11-17 14:22:24 +01002660summary_info += {'seccomp support': seccomp.found()}
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002661summary_info += {'GlusterFS support': glusterfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002662summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2663summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002664summary_info += {'lzo support': lzo.found()}
Paolo Bonzini241611e2020-11-17 13:32:34 +01002665summary_info += {'snappy support': snappy.found()}
Paolo Bonzini29ba6112020-11-17 13:07:52 +01002666summary_info += {'bzip2 support': libbzip2.found()}
Paolo Bonziniecea3692020-11-17 13:35:28 +01002667summary_info += {'lzfse support': liblzfse.found()}
Paolo Bonzinib1def332020-11-17 13:37:39 +01002668summary_info += {'zstd support': zstd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002669summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2670summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002671summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002672summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2673summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002674summary_info += {'libudev': libudev.found()}
Max Reitzdf4ea702020-10-27 20:05:46 +01002675summary_info += {'FUSE lseek': fuse_lseek.found()}
Jagannathan Raman3090de62021-01-29 11:46:05 -05002676summary_info += {'Multiprocess QEMU': config_host.has_key('CONFIG_MULTIPROCESS_ALLOWED')}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01002677summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01002678
2679if not supported_cpus.contains(cpu)
2680 message()
2681 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2682 message()
2683 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2684 message('The QEMU project intends to remove support for this host CPU in')
2685 message('a future release if nobody volunteers to maintain it and to')
2686 message('provide a build host for our continuous integration setup.')
2687 message('configure has succeeded and you can continue to build, but')
2688 message('if you care about QEMU on this platform you should contact')
2689 message('us upstream at qemu-devel@nongnu.org.')
2690endif
2691
2692if not supported_oses.contains(targetos)
2693 message()
2694 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2695 message()
2696 message('Host OS ' + targetos + 'support is not currently maintained.')
2697 message('The QEMU project intends to remove support for this host OS in')
2698 message('a future release if nobody volunteers to maintain it and to')
2699 message('provide a build host for our continuous integration setup.')
2700 message('configure has succeeded and you can continue to build, but')
2701 message('if you care about QEMU on this platform you should contact')
2702 message('us upstream at qemu-devel@nongnu.org.')
2703endif