blob: bcbce8e1641013f3672c8d76cfc4fd13ed1972e7 [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'],
Reinoud Zandijk74a414a2021-04-02 22:25:32 +020090 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -040091 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
92 }
93endif
94
Philippe Mathieu-Daudéeae9a1d2021-01-14 18:45:08 +010095edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
96install_edk2_blobs = false
97if get_option('install_blobs')
98 foreach target : target_dirs
99 install_edk2_blobs = install_edk2_blobs or target in edk2_targets
100 endforeach
101endif
102
Philippe Mathieu-Daudé45b545d2021-01-14 18:45:09 +0100103bzip2 = find_program('bzip2', required: install_edk2_blobs)
104
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400105##################
106# Compiler flags #
107##################
108
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400109# Specify linker-script with add_project_link_arguments so that it is not placed
110# within a linker --start-group/--end-group pair
111if 'CONFIG_FUZZ' in config_host
112 add_project_link_arguments(['-Wl,-T,',
113 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
114 native: false, language: ['c', 'cpp', 'objc'])
115endif
116
Marc-André Lureau5fc06172021-01-14 16:56:02 +0400117add_global_arguments(config_host['QEMU_CFLAGS'].split(),
118 native: false, language: ['c', 'objc'])
119add_global_arguments(config_host['QEMU_CXXFLAGS'].split(),
120 native: false, language: 'cpp')
121add_global_link_arguments(config_host['QEMU_LDFLAGS'].split(),
122 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzinia5665052019-06-10 12:05:14 +0200123
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400124if targetos == 'linux'
125 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
126 '-isystem', 'linux-headers',
127 language: ['c', 'cpp'])
128endif
129
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100130add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400131 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400132 '-iquote', meson.current_source_dir() / 'include',
133 '-iquote', meson.current_source_dir() / 'disas/libvixl',
134 language: ['c', 'cpp', 'objc'])
Alexander Bulekovc46f76d2020-09-02 13:36:50 -0400135
Marc-André Lureaufc929892019-07-13 01:47:54 +0400136link_language = meson.get_external_property('link_language', 'cpp')
137if link_language == 'cpp'
138 add_languages('cpp', required: true, native: false)
139endif
Paolo Bonzinia5665052019-06-10 12:05:14 +0200140if host_machine.system() == 'darwin'
141 add_languages('objc', required: false, native: false)
142endif
143
Paolo Bonzinideb62372020-09-01 07:51:16 -0400144sparse = find_program('cgcc', required: get_option('sparse'))
145if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100146 run_target('sparse',
147 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400148 'compile_commands.json', sparse.full_path(), '-Wbitwise',
149 '-Wno-transparent-union', '-Wno-old-initializer',
150 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100151endif
152
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200153###########################################
154# Target-specific checks and dependencies #
155###########################################
156
157if targetos != 'linux' and get_option('mpath').enabled()
158 error('Multipath is supported only on Linux')
159endif
160
Paolo Bonzini106ad1f2021-02-17 16:24:25 +0100161if targetos != 'linux' and get_option('multiprocess').enabled()
162 error('Multiprocess QEMU is supported only on Linux')
163endif
164multiprocess_allowed = targetos == 'linux' and not get_option('multiprocess').disabled()
165
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400166m = cc.find_library('m', required: false)
167util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200168winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400169socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400170version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400171coref = []
172iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400173emulator_link_args = []
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200174nvmm =not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400175hvf = not_found
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400176if targetos == 'windows'
177 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200178 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400179
180 win = import('windows')
181 version_res = win.compile_resources('version.rc',
182 depend_files: files('pc-bios/qemu-nsis.ico'),
183 include_directories: include_directories('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400184elif targetos == 'darwin'
185 coref = dependency('appleframeworks', modules: 'CoreFoundation')
186 iokit = dependency('appleframeworks', modules: 'IOKit')
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200187elif targetos == 'sunos'
188 socket = [cc.find_library('socket'),
189 cc.find_library('nsl'),
190 cc.find_library('resolv')]
191elif targetos == 'haiku'
192 socket = [cc.find_library('posix_error_mapper'),
193 cc.find_library('network'),
194 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400195elif targetos == 'openbsd'
196 if not get_option('tcg').disabled() and target_dirs.length() > 0
197 # Disable OpenBSD W^X if available
198 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
199 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400200endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200201
Paolo Bonzini8a199802020-09-18 05:37:01 -0400202accelerators = []
203if not get_option('kvm').disabled() and targetos == 'linux'
204 accelerators += 'CONFIG_KVM'
205endif
206if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
207 accelerators += 'CONFIG_XEN'
208 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
209else
210 have_xen_pci_passthrough = false
211endif
212if not get_option('whpx').disabled() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000213 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400214 error('WHPX requires 64-bit host')
215 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
216 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
217 accelerators += 'CONFIG_WHPX'
218 endif
219endif
220if not get_option('hvf').disabled()
221 hvf = dependency('appleframeworks', modules: 'Hypervisor',
222 required: get_option('hvf'))
223 if hvf.found()
224 accelerators += 'CONFIG_HVF'
225 endif
226endif
227if not get_option('hax').disabled()
228 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
229 accelerators += 'CONFIG_HAX'
230 endif
231endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200232if targetos == 'netbsd'
233 if cc.has_header_symbol('nvmm.h', 'nvmm_cpu_stop', required: get_option('nvmm'))
234 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
235 endif
236 if nvmm.found()
237 accelerators += 'CONFIG_NVMM'
238 endif
239endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100240
241tcg_arch = config_host['ARCH']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400242if not get_option('tcg').disabled()
243 if cpu not in supported_cpus
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100244 if get_option('tcg_interpreter')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +0100245 warning('Unsupported CPU @0@, will use TCG with TCI (experimental and slow)'.format(cpu))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400246 else
247 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
248 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100249 elif get_option('tcg_interpreter')
250 warning('Use of the TCG interpretor is not recommended on this host')
251 warning('architecture. There is a native TCG execution backend available')
252 warning('which provides substantially better performance and reliability.')
253 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
254 warning('configuration option on this architecture to use the native')
255 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400256 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100257 if get_option('tcg_interpreter')
258 tcg_arch = 'tci'
259 elif config_host['ARCH'] == 'sparc64'
260 tcg_arch = 'sparc'
261 elif config_host['ARCH'] == 's390x'
262 tcg_arch = 's390'
263 elif config_host['ARCH'] in ['x86_64', 'x32']
264 tcg_arch = 'i386'
265 elif config_host['ARCH'] == 'ppc64'
266 tcg_arch = 'ppc'
267 elif config_host['ARCH'] in ['riscv32', 'riscv64']
268 tcg_arch = 'riscv'
269 endif
270 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100271 language: ['c', 'cpp', 'objc'])
272
Paolo Bonzini8a199802020-09-18 05:37:01 -0400273 accelerators += 'CONFIG_TCG'
274 config_host += { 'CONFIG_TCG': 'y' }
275endif
276
277if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
278 error('KVM not available on this platform')
279endif
280if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
281 error('HVF not available on this platform')
282endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200283if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
284 error('NVMM not available on this platform')
285endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400286if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
287 error('WHPX not available on this platform')
288endif
289if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
290 if 'CONFIG_XEN' in accelerators
291 error('Xen PCI passthrough not available on this platform')
292 else
293 error('Xen PCI passthrough requested but Xen not enabled')
294 endif
295endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400296
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200297################
298# Dependencies #
299################
300
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400301# The path to glib.h is added to all compilation commands. This was
302# grandfathered in from the QEMU Makefiles.
303add_project_arguments(config_host['GLIB_CFLAGS'].split(),
304 native: false, language: ['c', 'cpp', 'objc'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400305glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
306 link_args: config_host['GLIB_LIBS'].split())
307# override glib dep with the configure results (for subprojects)
308meson.override_dependency('glib-2.0', glib)
309
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400310gio = not_found
311if 'CONFIG_GIO' in config_host
312 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
313 link_args: config_host['GIO_LIBS'].split())
314endif
315lttng = not_found
316if 'CONFIG_TRACE_UST' in config_host
317 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
318endif
319urcubp = not_found
320if 'CONFIG_TRACE_UST' in config_host
321 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
322endif
Daniel P. Berrangé46859d92020-09-01 14:30:49 +0100323gcrypt = not_found
324if 'CONFIG_GCRYPT' in config_host
325 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
326 link_args: config_host['GCRYPT_LIBS'].split())
327endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400328nettle = not_found
329if 'CONFIG_NETTLE' in config_host
330 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
331 link_args: config_host['NETTLE_LIBS'].split())
332endif
333gnutls = not_found
334if 'CONFIG_GNUTLS' in config_host
335 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
336 link_args: config_host['GNUTLS_LIBS'].split())
337endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200338pixman = not_found
339if have_system or have_tools
340 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100341 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200342endif
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400343pam = not_found
344if 'CONFIG_AUTH_PAM' in config_host
345 pam = cc.find_library('pam')
346endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400347libaio = cc.find_library('aio', required: false)
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100348zlib = dependency('zlib', required: true, kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400349linux_io_uring = not_found
350if 'CONFIG_LINUX_IO_URING' in config_host
351 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
352 link_args: config_host['LINUX_IO_URING_LIBS'].split())
353endif
354libxml2 = not_found
355if 'CONFIG_LIBXML2' in config_host
356 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
357 link_args: config_host['LIBXML2_LIBS'].split())
358endif
359libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +0100360if not get_option('libnfs').auto() or have_block
361 libnfs = dependency('libnfs', version: '>=1.9.3',
362 required: get_option('libnfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100363 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400364endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100365
366libattr_test = '''
367 #include <stddef.h>
368 #include <sys/types.h>
369 #ifdef CONFIG_LIBATTR
370 #include <attr/xattr.h>
371 #else
372 #include <sys/xattr.h>
373 #endif
374 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
375
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400376libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100377have_old_libattr = false
378if not get_option('attr').disabled()
379 if cc.links(libattr_test)
380 libattr = declare_dependency()
381 else
382 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
383 required: get_option('attr'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100384 kwargs: static_kwargs)
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100385 if libattr.found() and not \
386 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
387 libattr = not_found
388 if get_option('attr').enabled()
389 error('could not link libattr')
390 else
391 warning('could not link libattr, disabling')
392 endif
393 else
394 have_old_libattr = libattr.found()
395 endif
396 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400397endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100398
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100399cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
400if cocoa.found() and get_option('sdl').enabled()
401 error('Cocoa and SDL cannot be enabled at the same time')
402endif
403if cocoa.found() and get_option('gtk').enabled()
404 error('Cocoa and GTK+ cannot be enabled at the same time')
405endif
406
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100407seccomp = not_found
Paolo Bonzini90835c22020-11-17 14:22:24 +0100408if not get_option('seccomp').auto() or have_system or have_tools
409 seccomp = dependency('libseccomp', version: '>=2.3.0',
410 required: get_option('seccomp'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100411 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100412endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100413
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100414libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100415if not get_option('cap_ng').auto() or have_system or have_tools
416 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
417 required: get_option('cap_ng'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100418 kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100419endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100420if libcap_ng.found() and not cc.links('''
421 #include <cap-ng.h>
422 int main(void)
423 {
424 capng_capability_to_name(CAPNG_EFFECTIVE);
425 return 0;
426 }''', dependencies: libcap_ng)
427 libcap_ng = not_found
428 if get_option('cap_ng').enabled()
429 error('could not link libcap-ng')
430 else
431 warning('could not link libcap-ng, disabling')
432 endif
433endif
434
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400435if get_option('xkbcommon').auto() and not have_system and not have_tools
436 xkbcommon = not_found
437else
438 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100439 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400440endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400441vde = not_found
442if config_host.has_key('CONFIG_VDE')
443 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
444endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200445pulse = not_found
446if 'CONFIG_LIBPULSE' in config_host
447 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
448 link_args: config_host['PULSE_LIBS'].split())
449endif
450alsa = not_found
451if 'CONFIG_ALSA' in config_host
452 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
453 link_args: config_host['ALSA_LIBS'].split())
454endif
455jack = not_found
456if 'CONFIG_LIBJACK' in config_host
457 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
458endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200459spice = not_found
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200460spice_headers = not_found
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200461spice_protocol = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200462if 'CONFIG_SPICE' in config_host
463 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
464 link_args: config_host['SPICE_LIBS'].split())
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200465 spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
Paolo Bonzini26347332019-07-29 15:40:07 +0200466endif
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200467if 'CONFIG_SPICE_PROTOCOL' in config_host
468 spice_protocol = declare_dependency(compile_args: config_host['SPICE_PROTOCOL_CFLAGS'].split())
469endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400470rt = cc.find_library('rt', required: false)
Paolo Bonziniccf7afa2020-09-01 06:44:23 -0400471libdl = not_found
472if 'CONFIG_PLUGIN' in config_host
473 libdl = cc.find_library('dl', required: true)
474endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200475libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100476if not get_option('libiscsi').auto() or have_block
477 libiscsi = dependency('libiscsi', version: '>=1.9.0',
478 required: get_option('libiscsi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100479 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini99650b62019-06-10 12:21:14 +0200480endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400481zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +0100482if not get_option('zstd').auto() or have_block
483 zstd = dependency('libzstd', version: '>=1.4.0',
484 required: get_option('zstd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100485 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400486endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400487gbm = not_found
488if 'CONFIG_GBM' in config_host
489 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
490 link_args: config_host['GBM_LIBS'].split())
491endif
492virgl = not_found
493if 'CONFIG_VIRGL' in config_host
494 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
495 link_args: config_host['VIRGL_LIBS'].split())
496endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400497curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100498if not get_option('curl').auto() or have_block
499 curl = dependency('libcurl', version: '>=7.29.0',
500 method: 'pkg-config',
501 required: get_option('curl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100502 kwargs: static_kwargs)
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400503endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200504libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200505if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200506 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +0100507 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400508 required: get_option('libudev'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100509 kwargs: static_kwargs)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200510endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200511
Paolo Bonzini5c530152020-10-15 06:09:27 -0400512mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200513mpathpersist = not_found
514mpathpersist_new_api = false
515if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
516 mpath_test_source_new = '''
517 #include <libudev.h>
518 #include <mpath_persist.h>
519 unsigned mpath_mx_alloc_len = 1024;
520 int logsink;
521 static struct config *multipath_conf;
522 extern struct udev *udev;
523 extern struct config *get_multipath_config(void);
524 extern void put_multipath_config(struct config *conf);
525 struct udev *udev;
526 struct config *get_multipath_config(void) { return multipath_conf; }
527 void put_multipath_config(struct config *conf) { }
528 int main(void) {
529 udev = udev_new();
530 multipath_conf = mpath_lib_init();
531 return 0;
532 }'''
533 mpath_test_source_old = '''
534 #include <libudev.h>
535 #include <mpath_persist.h>
536 unsigned mpath_mx_alloc_len = 1024;
537 int logsink;
538 int main(void) {
539 struct udev *udev = udev_new();
540 mpath_lib_init(udev);
541 return 0;
542 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400543 libmpathpersist = cc.find_library('mpathpersist',
544 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100545 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400546 if libmpathpersist.found()
547 mpathlibs += libmpathpersist
548 if enable_static
549 mpathlibs += cc.find_library('devmapper',
550 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100551 kwargs: static_kwargs)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200552 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400553 mpathlibs += cc.find_library('multipath',
554 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100555 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400556 foreach lib: mpathlibs
557 if not lib.found()
558 mpathlibs = []
559 break
560 endif
561 endforeach
562 if mpathlibs.length() == 0
563 msg = 'Dependencies missing for libmpathpersist'
564 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200565 mpathpersist = declare_dependency(dependencies: mpathlibs)
566 mpathpersist_new_api = true
567 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
568 mpathpersist = declare_dependency(dependencies: mpathlibs)
569 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400570 msg = 'Cannot detect libmpathpersist API'
571 endif
572 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200573 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400574 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200575 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400576 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200577 endif
578 endif
579 endif
580endif
581
Yonggang Luo5285e592020-10-13 07:43:48 +0800582iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800583curses = not_found
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400584if have_system and not get_option('curses').disabled()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400585 curses_test = '''
586 #include <locale.h>
587 #include <curses.h>
588 #include <wchar.h>
589 int main(void) {
590 wchar_t wch = L'w';
591 setlocale(LC_ALL, "");
592 resize_term(0, 0);
593 addwstr(L"wide chars\n");
594 addnwstr(&wch, 1);
595 add_wch(WACS_DEGREE);
596 return 0;
597 }'''
598
Yonggang Luoca31e302020-11-17 05:31:06 +0800599 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
600 foreach curses_dep : curses_dep_list
601 if not curses.found()
602 curses = dependency(curses_dep,
603 required: false,
604 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100605 kwargs: static_kwargs)
Yonggang Luoca31e302020-11-17 05:31:06 +0800606 endif
607 endforeach
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400608 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500609 curses_compile_args = ['-DNCURSES_WIDECHAR']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400610 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500611 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
612 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400613 else
614 msg = 'curses package not usable'
615 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800616 endif
617 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400618 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400619 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
620 if targetos != 'windows' and not has_curses_h
621 message('Trying with /usr/include/ncursesw')
622 curses_compile_args += ['-I/usr/include/ncursesw']
623 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
624 endif
625 if has_curses_h
626 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
627 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800628 libcurses = cc.find_library(curses_libname,
629 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100630 kwargs: static_kwargs)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400631 if libcurses.found()
632 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
633 curses = declare_dependency(compile_args: curses_compile_args,
634 dependencies: [libcurses])
635 break
636 else
637 msg = 'curses library not usable'
638 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800639 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400640 endforeach
641 endif
642 endif
643 if not get_option('iconv').disabled()
644 foreach link_args : [ ['-liconv'], [] ]
645 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
646 # We need to use libiconv if available because mixing libiconv's headers with
647 # the system libc does not work.
648 # However, without adding glib to the dependencies -L/usr/local/lib will not be
649 # included in the command line and libiconv will not be found.
650 if cc.links('''
651 #include <iconv.h>
652 int main(void) {
653 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
654 return conv != (iconv_t) -1;
655 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
656 iconv = declare_dependency(link_args: link_args, dependencies: glib)
657 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800658 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400659 endforeach
660 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400661 if curses.found() and not iconv.found()
662 if get_option('iconv').enabled()
663 error('iconv not available')
664 endif
665 msg = 'iconv required for curses UI but not available'
666 curses = not_found
667 endif
668 if not curses.found() and msg != ''
669 if get_option('curses').enabled()
670 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400671 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400672 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400673 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800674 endif
675endif
676
Paolo Bonzini26347332019-07-29 15:40:07 +0200677brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100678if not get_option('brlapi').auto() or have_system
679 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
680 required: get_option('brlapi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100681 kwargs: static_kwargs)
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100682 if brlapi.found() and not cc.links('''
683 #include <brlapi.h>
684 #include <stddef.h>
685 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
686 brlapi = not_found
687 if get_option('brlapi').enabled()
688 error('could not link brlapi')
689 else
690 warning('could not link brlapi, disabling')
691 endif
692 endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200693endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100694
Paolo Bonzini760e4322020-08-26 08:09:48 +0200695sdl = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100696if not get_option('sdl').auto() or (have_system and not cocoa.found())
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100697 sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200698 sdl_image = not_found
699endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100700if sdl.found()
701 # work around 2.0.8 bug
702 sdl = declare_dependency(compile_args: '-Wno-undef',
703 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200704 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100705 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100706else
707 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100708 error('sdl-image required, but SDL was @0@'.format(
709 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100710 endif
711 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200712endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100713
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400714rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100715if not get_option('rbd').auto() or have_block
716 librados = cc.find_library('rados', required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100717 kwargs: static_kwargs)
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100718 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
719 required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100720 kwargs: static_kwargs)
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100721 if librados.found() and librbd.found()
722 if cc.links('''
723 #include <stdio.h>
724 #include <rbd/librbd.h>
725 int main(void) {
726 rados_t cluster;
727 rados_create(&cluster, NULL);
728 return 0;
729 }''', dependencies: [librbd, librados])
730 rbd = declare_dependency(dependencies: [librbd, librados])
731 elif get_option('rbd').enabled()
732 error('could not link librados')
733 else
734 warning('could not link librados, disabling')
735 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100736 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400737endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100738
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400739glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100740glusterfs_ftruncate_has_stat = false
741glusterfs_iocb_has_stat = false
742if not get_option('glusterfs').auto() or have_block
743 glusterfs = dependency('glusterfs-api', version: '>=3',
744 required: get_option('glusterfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100745 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100746 if glusterfs.found()
747 glusterfs_ftruncate_has_stat = cc.links('''
748 #include <glusterfs/api/glfs.h>
749
750 int
751 main(void)
752 {
753 /* new glfs_ftruncate() passes two additional args */
754 return glfs_ftruncate(NULL, 0, NULL, NULL);
755 }
756 ''', dependencies: glusterfs)
757 glusterfs_iocb_has_stat = cc.links('''
758 #include <glusterfs/api/glfs.h>
759
760 /* new glfs_io_cbk() passes two additional glfs_stat structs */
761 static void
762 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
763 {}
764
765 int
766 main(void)
767 {
768 glfs_io_cbk iocb = &glusterfs_iocb;
769 iocb(NULL, 0 , NULL, NULL, NULL);
770 return 0;
771 }
772 ''', dependencies: glusterfs)
773 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400774endif
775libssh = not_found
776if 'CONFIG_LIBSSH' in config_host
777 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
778 link_args: config_host['LIBSSH_LIBS'].split())
779endif
780libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100781if not get_option('bzip2').auto() or have_block
782 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
783 required: get_option('bzip2'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100784 kwargs: static_kwargs)
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100785 if libbzip2.found() and not cc.links('''
786 #include <bzlib.h>
787 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
788 libbzip2 = not_found
789 if get_option('bzip2').enabled()
790 error('could not link libbzip2')
791 else
792 warning('could not link libbzip2, disabling')
793 endif
794 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400795endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100796
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400797liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +0100798if not get_option('lzfse').auto() or have_block
799 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
800 required: get_option('lzfse'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100801 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400802endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100803if liblzfse.found() and not cc.links('''
804 #include <lzfse.h>
805 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
806 liblzfse = not_found
807 if get_option('lzfse').enabled()
808 error('could not link liblzfse')
809 else
810 warning('could not link liblzfse, disabling')
811 endif
812endif
813
Paolo Bonzini478e9432020-08-17 12:47:55 +0200814oss = not_found
815if 'CONFIG_AUDIO_OSS' in config_host
816 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
817endif
818dsound = not_found
819if 'CONFIG_AUDIO_DSOUND' in config_host
820 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
821endif
822coreaudio = not_found
823if 'CONFIG_AUDIO_COREAUDIO' in config_host
824 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
825endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400826opengl = not_found
827if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400828 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
829 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400830endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100831
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400832gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +0100833gtkx11 = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100834if not get_option('gtk').auto() or (have_system and not cocoa.found())
Paolo Bonzini1b695472021-01-07 14:02:29 +0100835 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
836 method: 'pkg-config',
837 required: get_option('gtk'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100838 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +0100839 if gtk.found()
840 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
841 method: 'pkg-config',
842 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100843 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +0100844 gtk = declare_dependency(dependencies: [gtk, gtkx11])
845 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400846endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100847
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400848vte = not_found
849if 'CONFIG_VTE' in config_host
850 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
851 link_args: config_host['VTE_LIBS'].split())
852endif
853x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +0200854if gtkx11.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +0100855 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100856 kwargs: static_kwargs)
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400857endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100858vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400859png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400860jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400861sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100862if get_option('vnc').enabled()
863 vnc = declare_dependency() # dummy dependency
864 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100865 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini8e242b32020-11-23 13:34:02 -0500866 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100867 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100868 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
869 required: get_option('vnc_sasl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100870 kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100871 if sasl.found()
872 sasl = declare_dependency(dependencies: sasl,
873 compile_args: '-DSTRUCT_IOVEC_DEFINED')
874 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400875endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100876
Marc-André Lureau708eab42019-09-03 16:59:33 +0400877snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +0100878if not get_option('snappy').auto() or have_system
879 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
880 required: get_option('snappy'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100881 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400882endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100883if snappy.found() and not cc.links('''
884 #include <snappy-c.h>
885 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
886 snappy = not_found
887 if get_option('snappy').enabled()
888 error('could not link libsnappy')
889 else
890 warning('could not link libsnappy, disabling')
891 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400892endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100893
Marc-André Lureau708eab42019-09-03 16:59:33 +0400894lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100895if not get_option('lzo').auto() or have_system
896 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
897 required: get_option('lzo'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100898 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400899endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100900if lzo.found() and not cc.links('''
901 #include <lzo/lzo1x.h>
902 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
903 lzo = not_found
904 if get_option('lzo').enabled()
905 error('could not link liblzo2')
906 else
907 warning('could not link liblzo2, disabling')
908 endif
909endif
910
Marc-André Lureau55166232019-07-24 19:16:22 +0400911rdma = not_found
912if 'CONFIG_RDMA' in config_host
913 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
914endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400915numa = not_found
916if 'CONFIG_NUMA' in config_host
917 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
918endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400919xen = not_found
920if 'CONFIG_XEN_BACKEND' in config_host
921 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
922 link_args: config_host['XEN_LIBS'].split())
923endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200924cacard = not_found
925if 'CONFIG_SMARTCARD' in config_host
926 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
927 link_args: config_host['SMARTCARD_LIBS'].split())
928endif
César Belley0a40bcb2020-08-26 13:42:04 +0200929u2f = not_found
930if have_system
931 u2f = dependency('u2f-emu', required: get_option('u2f'),
932 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100933 kwargs: static_kwargs)
César Belley0a40bcb2020-08-26 13:42:04 +0200934endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200935usbredir = not_found
936if 'CONFIG_USB_REDIR' in config_host
937 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
938 link_args: config_host['USB_REDIR_LIBS'].split())
939endif
940libusb = not_found
941if 'CONFIG_USB_LIBUSB' in config_host
942 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
943 link_args: config_host['LIBUSB_LIBS'].split())
944endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400945libpmem = not_found
946if 'CONFIG_LIBPMEM' in config_host
947 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
948 link_args: config_host['LIBPMEM_LIBS'].split())
949endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600950libdaxctl = not_found
951if 'CONFIG_LIBDAXCTL' in config_host
952 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
953endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +0400954tasn1 = not_found
955if 'CONFIG_TASN1' in config_host
956 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
957 link_args: config_host['TASN1_LIBS'].split())
958endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400959keyutils = dependency('libkeyutils', required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100960 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400961
Marc-André Lureau3909def2020-08-28 15:07:33 +0400962has_gettid = cc.has_function('gettid')
963
Paolo Bonziniaa087962020-09-01 11:15:30 -0400964# Malloc tests
965
966malloc = []
967if get_option('malloc') == 'system'
968 has_malloc_trim = \
969 not get_option('malloc_trim').disabled() and \
970 cc.links('''#include <malloc.h>
971 int main(void) { malloc_trim(0); return 0; }''')
972else
973 has_malloc_trim = false
974 malloc = cc.find_library(get_option('malloc'), required: true)
975endif
976if not has_malloc_trim and get_option('malloc_trim').enabled()
977 if get_option('malloc') == 'system'
978 error('malloc_trim not available on this platform.')
979 else
980 error('malloc_trim not available with non-libc memory allocator')
981 endif
982endif
983
Max Reitz84e319a2020-11-02 17:18:55 +0100984# Check whether the glibc provides statx()
985
986statx_test = '''
987 #ifndef _GNU_SOURCE
988 #define _GNU_SOURCE
989 #endif
990 #include <sys/stat.h>
991 int main(void) {
992 struct statx statxbuf;
993 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
994 return 0;
995 }'''
996
997has_statx = cc.links(statx_test)
998
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000999have_vhost_user_blk_server = (targetos == 'linux' and
1000 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001001
1002if get_option('vhost_user_blk_server').enabled()
1003 if targetos != 'linux'
1004 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +00001005 elif 'CONFIG_VHOST_USER' not in config_host
1006 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001007 endif
1008elif get_option('vhost_user_blk_server').disabled() or not have_system
1009 have_vhost_user_blk_server = false
1010endif
1011
Daniele Buono9e62ba42020-12-04 18:06:14 -05001012
Max Reitzdf4ea702020-10-27 20:05:46 +01001013if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1014 error('Cannot enable fuse-lseek while fuse is disabled')
1015endif
1016
Max Reitza484a712020-10-27 20:05:41 +01001017fuse = dependency('fuse3', required: get_option('fuse'),
1018 version: '>=3.1', method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001019 kwargs: static_kwargs)
Max Reitza484a712020-10-27 20:05:41 +01001020
Max Reitzdf4ea702020-10-27 20:05:46 +01001021fuse_lseek = not_found
1022if not get_option('fuse_lseek').disabled()
1023 if fuse.version().version_compare('>=3.8')
1024 # Dummy dependency
1025 fuse_lseek = declare_dependency()
1026 elif get_option('fuse_lseek').enabled()
1027 if fuse.found()
1028 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1029 else
1030 error('fuse-lseek requires libfuse, which was not found')
1031 endif
1032 endif
1033endif
1034
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001035# libbpf
1036libbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
1037if libbpf.found() and not cc.links('''
1038 #include <bpf/libbpf.h>
1039 int main(void)
1040 {
1041 bpf_object__destroy_skeleton(NULL);
1042 return 0;
1043 }''', dependencies: libbpf)
1044 libbpf = not_found
1045 if get_option('bpf').enabled()
1046 error('libbpf skeleton test failed')
1047 else
1048 warning('libbpf skeleton test failed, disabling')
1049 endif
1050endif
1051
Daniele Buono9e62ba42020-12-04 18:06:14 -05001052if get_option('cfi')
1053 cfi_flags=[]
1054 # Check for dependency on LTO
1055 if not get_option('b_lto')
1056 error('Selected Control-Flow Integrity but LTO is disabled')
1057 endif
1058 if config_host.has_key('CONFIG_MODULES')
1059 error('Selected Control-Flow Integrity is not compatible with modules')
1060 endif
1061 # Check for cfi flags. CFI requires LTO so we can't use
1062 # get_supported_arguments, but need a more complex "compiles" which allows
1063 # custom arguments
1064 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1065 args: ['-flto', '-fsanitize=cfi-icall'] )
1066 cfi_flags += '-fsanitize=cfi-icall'
1067 else
1068 error('-fsanitize=cfi-icall is not supported by the compiler')
1069 endif
1070 if cc.compiles('int main () { return 0; }',
1071 name: '-fsanitize-cfi-icall-generalize-pointers',
1072 args: ['-flto', '-fsanitize=cfi-icall',
1073 '-fsanitize-cfi-icall-generalize-pointers'] )
1074 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1075 else
1076 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1077 endif
1078 if get_option('cfi_debug')
1079 if cc.compiles('int main () { return 0; }',
1080 name: '-fno-sanitize-trap=cfi-icall',
1081 args: ['-flto', '-fsanitize=cfi-icall',
1082 '-fno-sanitize-trap=cfi-icall'] )
1083 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1084 else
1085 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1086 endif
1087 endif
Marc-André Lureau5fc06172021-01-14 16:56:02 +04001088 add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1089 add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
Daniele Buono9e62ba42020-12-04 18:06:14 -05001090endif
1091
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001092#################
1093# config-host.h #
1094#################
Paolo Bonzini859aef02020-08-04 18:14:26 +02001095
Paolo Bonzini69202b42020-11-17 14:46:21 +01001096have_virtfs = (targetos == 'linux' and
1097 have_system and
1098 libattr.found() and
1099 libcap_ng.found())
1100
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01001101have_virtfs_proxy_helper = have_virtfs and have_tools
1102
Paolo Bonzini69202b42020-11-17 14:46:21 +01001103if get_option('virtfs').enabled()
1104 if not have_virtfs
1105 if targetos != 'linux'
1106 error('virtio-9p (virtfs) requires Linux')
1107 elif not libcap_ng.found() or not libattr.found()
1108 error('virtio-9p (virtfs) requires libcap-ng-devel and libattr-devel')
1109 elif not have_system
1110 error('virtio-9p (virtfs) needs system emulation support')
1111 endif
1112 endif
1113elif get_option('virtfs').disabled()
1114 have_virtfs = false
1115endif
1116
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001117config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1118config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1119config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1120config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1121config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
1122config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
1123config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1124config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1125config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1126config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1127config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1128config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1129
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001130config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001131config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04001132config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001133config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001134config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001135config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1136config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001137config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08001138config_host_data.set('CONFIG_CURSES', curses.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001139config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1140if glusterfs.found()
1141 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1142 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1143 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1144 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1145 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1146 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1147endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001148config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001149config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001150config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001151config_host_data.set('CONFIG_EBPF', libbpf.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001152config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01001153config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001154config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001155config_host_data.set('CONFIG_SDL', sdl.found())
1156config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01001157config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01001158config_host_data.set('CONFIG_SNAPPY', snappy.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001159config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001160config_host_data.set('CONFIG_VNC', vnc.found())
1161config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1162config_host_data.set('CONFIG_VNC_PNG', png.found())
1163config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01001164config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001165config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001166config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04001167config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonziniaa087962020-09-01 11:15:30 -04001168config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01001169config_host_data.set('CONFIG_STATX', has_statx)
Paolo Bonzinib1def332020-11-17 13:37:39 +01001170config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01001171config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01001172config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01001173config_host_data.set('CONFIG_X11', x11.found())
Daniele Buono9e62ba42020-12-04 18:06:14 -05001174config_host_data.set('CONFIG_CFI', get_option('cfi'))
Paolo Bonzini859aef02020-08-04 18:14:26 +02001175config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1176config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1177config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1178config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1179
Thomas Huth48f670e2020-11-18 18:10:52 +01001180config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001181config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001182config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001183config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001184config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Joelle van Dyne1ad27f72021-01-25 17:24:51 -08001185config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Thomas Huthded5d782020-11-14 11:10:11 +01001186
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001187config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
1188
Paolo Bonzini765686d2020-09-18 06:37:21 -04001189ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
Paolo Bonzini859aef02020-08-04 18:14:26 +02001190arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001191strings = ['HOST_DSOSUF', 'CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001192foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -04001193 if ignored.contains(k)
1194 # do nothing
1195 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001196 if v != ''
1197 v = '"' + '", "'.join(v.split()) + '", '
1198 endif
1199 config_host_data.set(k, v)
1200 elif k == 'ARCH'
1201 config_host_data.set('HOST_' + v.to_upper(), 1)
1202 elif strings.contains(k)
1203 if not k.startswith('CONFIG_')
1204 k = 'CONFIG_' + k.to_upper()
1205 endif
1206 config_host_data.set_quoted(k, v)
1207 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
1208 config_host_data.set(k, v == 'y' ? 1 : v)
1209 endif
1210endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02001211
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001212########################
1213# Target configuration #
1214########################
1215
Paolo Bonzini2becc362020-02-03 11:42:03 +01001216minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04001217config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001218config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001219config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001220config_devices_mak_list = []
1221config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02001222config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001223config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001224
1225disassemblers = {
1226 'alpha' : ['CONFIG_ALPHA_DIS'],
1227 'arm' : ['CONFIG_ARM_DIS'],
1228 'avr' : ['CONFIG_AVR_DIS'],
1229 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06001230 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001231 'hppa' : ['CONFIG_HPPA_DIS'],
1232 'i386' : ['CONFIG_I386_DIS'],
1233 'x86_64' : ['CONFIG_I386_DIS'],
1234 'x32' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001235 'm68k' : ['CONFIG_M68K_DIS'],
1236 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1237 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001238 'nios2' : ['CONFIG_NIOS2_DIS'],
1239 'or1k' : ['CONFIG_OPENRISC_DIS'],
1240 'ppc' : ['CONFIG_PPC_DIS'],
1241 'riscv' : ['CONFIG_RISCV_DIS'],
1242 'rx' : ['CONFIG_RX_DIS'],
1243 's390' : ['CONFIG_S390_DIS'],
1244 'sh4' : ['CONFIG_SH4_DIS'],
1245 'sparc' : ['CONFIG_SPARC_DIS'],
1246 'xtensa' : ['CONFIG_XTENSA_DIS'],
1247}
1248if link_language == 'cpp'
1249 disassemblers += {
1250 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1251 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1252 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1253 }
1254endif
1255
Paolo Bonzini0a189112020-11-17 14:58:32 +01001256host_kconfig = \
1257 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
1258 ('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
1259 ('CONFIG_IVSHMEM' in config_host ? ['CONFIG_IVSHMEM=y'] : []) + \
1260 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01001261 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001262 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1263 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1264 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01001265 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001266 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman3090de62021-01-29 11:46:05 -05001267 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : []) + \
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01001268 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01001269
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001270ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001271
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001272default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1273actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001274fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001275foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04001276 config_target = { 'TARGET_NAME': target.split('-')[0] }
1277 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001278 if targetos != 'linux'
1279 if default_targets
1280 continue
1281 endif
1282 error('Target @0@ is only available on a Linux host'.format(target))
1283 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001284 config_target += { 'CONFIG_LINUX_USER': 'y' }
1285 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001286 if 'CONFIG_BSD' not in config_host
1287 if default_targets
1288 continue
1289 endif
1290 error('Target @0@ is only available on a BSD host'.format(target))
1291 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001292 config_target += { 'CONFIG_BSD_USER': 'y' }
1293 elif target.endswith('softmmu')
1294 config_target += { 'CONFIG_SOFTMMU': 'y' }
1295 endif
1296 if target.endswith('-user')
1297 config_target += {
1298 'CONFIG_USER_ONLY': 'y',
1299 'CONFIG_QEMU_INTERP_PREFIX':
1300 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1301 }
1302 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001303
Paolo Bonzini0a189112020-11-17 14:58:32 +01001304 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04001305 foreach sym: accelerators
1306 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1307 config_target += { sym: 'y' }
1308 config_all += { sym: 'y' }
Paolo Bonzini23a77b22020-12-14 12:01:45 +01001309 if sym == 'CONFIG_TCG' and tcg_arch == 'tci'
1310 config_target += { 'CONFIG_TCG_INTERPRETER': 'y' }
1311 elif sym == 'CONFIG_XEN' and have_xen_pci_passthrough
Paolo Bonzini8a199802020-09-18 05:37:01 -04001312 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1313 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01001314 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04001315 endif
1316 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01001317 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001318 if default_targets
1319 continue
1320 endif
1321 error('No accelerator available for target @0@'.format(target))
1322 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001323
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001324 actual_target_dirs += target
Paolo Bonzini765686d2020-09-18 06:37:21 -04001325 config_target += keyval.load('default-configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001326 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001327
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001328 if 'TARGET_NEED_FDT' in config_target
1329 fdt_required += target
1330 endif
1331
Paolo Bonzinifa731682020-09-21 05:19:07 -04001332 # Add default keys
1333 if 'TARGET_BASE_ARCH' not in config_target
1334 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1335 endif
1336 if 'TARGET_ABI_DIR' not in config_target
1337 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1338 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001339
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001340 foreach k, v: disassemblers
1341 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1342 foreach sym: v
1343 config_target += { sym: 'y' }
1344 config_all_disas += { sym: 'y' }
1345 endforeach
1346 endif
1347 endforeach
1348
Paolo Bonzini859aef02020-08-04 18:14:26 +02001349 config_target_data = configuration_data()
1350 foreach k, v: config_target
1351 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1352 # do nothing
1353 elif ignored.contains(k)
1354 # do nothing
1355 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001356 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1357 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001358 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001359 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001360 config_target_data.set_quoted(k, v)
1361 elif v == 'y'
1362 config_target_data.set(k, 1)
1363 else
1364 config_target_data.set(k, v)
1365 endif
1366 endforeach
1367 config_target_h += {target: configure_file(output: target + '-config-target.h',
1368 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001369
1370 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001371 config_devices_mak = target + '-config-devices.mak'
1372 config_devices_mak = configure_file(
Paolo Bonzini1bb4cb12020-09-18 06:06:09 -04001373 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001374 output: config_devices_mak,
1375 depfile: config_devices_mak + '.d',
1376 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01001377 command: [minikconf,
1378 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01001379 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzini0a189112020-11-17 14:58:32 +01001380 host_kconfig, accel_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02001381
1382 config_devices_data = configuration_data()
1383 config_devices = keyval.load(config_devices_mak)
1384 foreach k, v: config_devices
1385 config_devices_data.set(k, 1)
1386 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001387 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001388 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1389 configuration: config_devices_data)}
1390 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001391 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001392 endif
1393 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001394endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001395target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001396
Paolo Bonzini2becc362020-02-03 11:42:03 +01001397# This configuration is used to build files that are shared by
1398# multiple binaries, and then extracted out of the "common"
1399# static_library target.
1400#
1401# We do not use all_sources()/all_dependencies(), because it would
1402# build literally all source files, including devices only used by
1403# targets that are not built for this compilation. The CONFIG_ALL
1404# pseudo symbol replaces it.
1405
Paolo Bonzini05512f52020-09-16 15:31:11 -04001406config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001407config_all += config_host
1408config_all += config_all_disas
1409config_all += {
1410 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1411 'CONFIG_SOFTMMU': have_system,
1412 'CONFIG_USER_ONLY': have_user,
1413 'CONFIG_ALL': true,
1414}
1415
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001416##############
1417# Submodules #
1418##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001419
1420capstone = not_found
1421capstone_opt = get_option('capstone')
1422if capstone_opt in ['enabled', 'auto', 'system']
1423 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07001424 capstone = dependency('capstone', version: '>=4.0',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001425 kwargs: static_kwargs, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001426 required: capstone_opt == 'system' or
1427 capstone_opt == 'enabled' and not have_internal)
1428 if capstone.found()
1429 capstone_opt = 'system'
1430 elif have_internal
1431 capstone_opt = 'internal'
1432 else
1433 capstone_opt = 'disabled'
1434 endif
1435endif
1436if capstone_opt == 'internal'
1437 capstone_data = configuration_data()
1438 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1439
1440 capstone_files = files(
1441 'capstone/cs.c',
1442 'capstone/MCInst.c',
1443 'capstone/MCInstrDesc.c',
1444 'capstone/MCRegisterInfo.c',
1445 'capstone/SStream.c',
1446 'capstone/utils.c'
1447 )
1448
1449 if 'CONFIG_ARM_DIS' in config_all_disas
1450 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1451 capstone_files += files(
1452 'capstone/arch/ARM/ARMDisassembler.c',
1453 'capstone/arch/ARM/ARMInstPrinter.c',
1454 'capstone/arch/ARM/ARMMapping.c',
1455 'capstone/arch/ARM/ARMModule.c'
1456 )
1457 endif
1458
1459 # FIXME: This config entry currently depends on a c++ compiler.
1460 # Which is needed for building libvixl, but not for capstone.
1461 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1462 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1463 capstone_files += files(
1464 'capstone/arch/AArch64/AArch64BaseInfo.c',
1465 'capstone/arch/AArch64/AArch64Disassembler.c',
1466 'capstone/arch/AArch64/AArch64InstPrinter.c',
1467 'capstone/arch/AArch64/AArch64Mapping.c',
1468 'capstone/arch/AArch64/AArch64Module.c'
1469 )
1470 endif
1471
1472 if 'CONFIG_PPC_DIS' in config_all_disas
1473 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1474 capstone_files += files(
1475 'capstone/arch/PowerPC/PPCDisassembler.c',
1476 'capstone/arch/PowerPC/PPCInstPrinter.c',
1477 'capstone/arch/PowerPC/PPCMapping.c',
1478 'capstone/arch/PowerPC/PPCModule.c'
1479 )
1480 endif
1481
Richard Henderson3d562842020-01-04 07:24:59 +10001482 if 'CONFIG_S390_DIS' in config_all_disas
1483 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1484 capstone_files += files(
1485 'capstone/arch/SystemZ/SystemZDisassembler.c',
1486 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1487 'capstone/arch/SystemZ/SystemZMapping.c',
1488 'capstone/arch/SystemZ/SystemZModule.c',
1489 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1490 )
1491 endif
1492
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001493 if 'CONFIG_I386_DIS' in config_all_disas
1494 capstone_data.set('CAPSTONE_HAS_X86', 1)
1495 capstone_files += files(
1496 'capstone/arch/X86/X86Disassembler.c',
1497 'capstone/arch/X86/X86DisassemblerDecoder.c',
1498 'capstone/arch/X86/X86ATTInstPrinter.c',
1499 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07001500 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001501 'capstone/arch/X86/X86Mapping.c',
1502 'capstone/arch/X86/X86Module.c'
1503 )
1504 endif
1505
1506 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1507
1508 capstone_cargs = [
1509 # FIXME: There does not seem to be a way to completely replace the c_args
1510 # that come from add_project_arguments() -- we can only add to them.
1511 # So: disable all warnings with a big hammer.
1512 '-Wno-error', '-w',
1513
1514 # Include all configuration defines via a header file, which will wind up
1515 # as a dependency on the object file, and thus changes here will result
1516 # in a rebuild.
1517 '-include', 'capstone-defs.h'
1518 ]
1519
1520 libcapstone = static_library('capstone',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001521 build_by_default: false,
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001522 sources: capstone_files,
1523 c_args: capstone_cargs,
1524 include_directories: 'capstone/include')
1525 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07001526 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001527endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001528
1529slirp = not_found
1530slirp_opt = 'disabled'
1531if have_system
1532 slirp_opt = get_option('slirp')
1533 if slirp_opt in ['enabled', 'auto', 'system']
1534 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001535 slirp = dependency('slirp', kwargs: static_kwargs,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001536 method: 'pkg-config',
1537 required: slirp_opt == 'system' or
1538 slirp_opt == 'enabled' and not have_internal)
1539 if slirp.found()
1540 slirp_opt = 'system'
1541 elif have_internal
1542 slirp_opt = 'internal'
1543 else
1544 slirp_opt = 'disabled'
1545 endif
1546 endif
1547 if slirp_opt == 'internal'
1548 slirp_deps = []
1549 if targetos == 'windows'
1550 slirp_deps = cc.find_library('iphlpapi')
1551 endif
1552 slirp_conf = configuration_data()
1553 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1554 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1555 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1556 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1557 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1558 slirp_files = [
1559 'slirp/src/arp_table.c',
1560 'slirp/src/bootp.c',
1561 'slirp/src/cksum.c',
1562 'slirp/src/dhcpv6.c',
1563 'slirp/src/dnssearch.c',
1564 'slirp/src/if.c',
1565 'slirp/src/ip6_icmp.c',
1566 'slirp/src/ip6_input.c',
1567 'slirp/src/ip6_output.c',
1568 'slirp/src/ip_icmp.c',
1569 'slirp/src/ip_input.c',
1570 'slirp/src/ip_output.c',
1571 'slirp/src/mbuf.c',
1572 'slirp/src/misc.c',
1573 'slirp/src/ncsi.c',
1574 'slirp/src/ndp_table.c',
1575 'slirp/src/sbuf.c',
1576 'slirp/src/slirp.c',
1577 'slirp/src/socket.c',
1578 'slirp/src/state.c',
1579 'slirp/src/stream.c',
1580 'slirp/src/tcp_input.c',
1581 'slirp/src/tcp_output.c',
1582 'slirp/src/tcp_subr.c',
1583 'slirp/src/tcp_timer.c',
1584 'slirp/src/tftp.c',
1585 'slirp/src/udp.c',
1586 'slirp/src/udp6.c',
1587 'slirp/src/util.c',
1588 'slirp/src/version.c',
1589 'slirp/src/vmstate.c',
1590 ]
1591
1592 configure_file(
1593 input : 'slirp/src/libslirp-version.h.in',
1594 output : 'libslirp-version.h',
1595 configuration: slirp_conf)
1596
1597 slirp_inc = include_directories('slirp', 'slirp/src')
1598 libslirp = static_library('slirp',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001599 build_by_default: false,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001600 sources: slirp_files,
1601 c_args: slirp_cargs,
1602 include_directories: slirp_inc)
1603 slirp = declare_dependency(link_with: libslirp,
1604 dependencies: slirp_deps,
1605 include_directories: slirp_inc)
1606 endif
1607endif
1608
Daniele Buonoc7153432021-03-03 21:59:38 -05001609# For CFI, we need to compile slirp as a static library together with qemu.
1610# This is because we register slirp functions as callbacks for QEMU Timers.
1611# When using a system-wide shared libslirp, the type information for the
1612# callback is missing and the timer call produces a false positive with CFI.
1613#
1614# Now that slirp_opt has been defined, check if the selected slirp is compatible
1615# with control-flow integrity.
1616if get_option('cfi') and slirp_opt == 'system'
1617 error('Control-Flow Integrity is not compatible with system-wide slirp.' \
1618 + ' Please configure with --enable-slirp=git')
1619endif
1620
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001621fdt = not_found
1622fdt_opt = get_option('fdt')
1623if have_system
1624 if fdt_opt in ['enabled', 'auto', 'system']
1625 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001626 fdt = cc.find_library('fdt', kwargs: static_kwargs,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001627 required: fdt_opt == 'system' or
1628 fdt_opt == 'enabled' and not have_internal)
1629 if fdt.found() and cc.links('''
1630 #include <libfdt.h>
1631 #include <libfdt_env.h>
1632 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1633 dependencies: fdt)
1634 fdt_opt = 'system'
1635 elif have_internal
1636 fdt_opt = 'internal'
1637 else
1638 fdt_opt = 'disabled'
1639 endif
1640 endif
1641 if fdt_opt == 'internal'
1642 fdt_files = files(
1643 'dtc/libfdt/fdt.c',
1644 'dtc/libfdt/fdt_ro.c',
1645 'dtc/libfdt/fdt_wip.c',
1646 'dtc/libfdt/fdt_sw.c',
1647 'dtc/libfdt/fdt_rw.c',
1648 'dtc/libfdt/fdt_strerror.c',
1649 'dtc/libfdt/fdt_empty_tree.c',
1650 'dtc/libfdt/fdt_addresses.c',
1651 'dtc/libfdt/fdt_overlay.c',
1652 'dtc/libfdt/fdt_check.c',
1653 )
1654
1655 fdt_inc = include_directories('dtc/libfdt')
1656 libfdt = static_library('fdt',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001657 build_by_default: false,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001658 sources: fdt_files,
1659 include_directories: fdt_inc)
1660 fdt = declare_dependency(link_with: libfdt,
1661 include_directories: fdt_inc)
1662 endif
1663endif
1664if not fdt.found() and fdt_required.length() > 0
1665 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1666endif
1667
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001668config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001669config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001670config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001671
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001672#####################
1673# Generated sources #
1674#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001675
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001676genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001677
Marc-André Lureau3f885652019-07-15 18:06:04 +04001678hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04001679shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001680qapi_gen = find_program('scripts/qapi-gen.py')
1681qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1682 meson.source_root() / 'scripts/qapi/commands.py',
1683 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001684 meson.source_root() / 'scripts/qapi/error.py',
1685 meson.source_root() / 'scripts/qapi/events.py',
1686 meson.source_root() / 'scripts/qapi/expr.py',
1687 meson.source_root() / 'scripts/qapi/gen.py',
1688 meson.source_root() / 'scripts/qapi/introspect.py',
1689 meson.source_root() / 'scripts/qapi/parser.py',
1690 meson.source_root() / 'scripts/qapi/schema.py',
1691 meson.source_root() / 'scripts/qapi/source.py',
1692 meson.source_root() / 'scripts/qapi/types.py',
1693 meson.source_root() / 'scripts/qapi/visit.py',
1694 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001695 meson.source_root() / 'scripts/qapi-gen.py'
1696]
1697
1698tracetool = [
1699 python, files('scripts/tracetool.py'),
1700 '--backend=' + config_host['TRACE_BACKENDS']
1701]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00001702tracetool_depends = files(
1703 'scripts/tracetool/backend/log.py',
1704 'scripts/tracetool/backend/__init__.py',
1705 'scripts/tracetool/backend/dtrace.py',
1706 'scripts/tracetool/backend/ftrace.py',
1707 'scripts/tracetool/backend/simple.py',
1708 'scripts/tracetool/backend/syslog.py',
1709 'scripts/tracetool/backend/ust.py',
1710 'scripts/tracetool/format/tcg_h.py',
1711 'scripts/tracetool/format/ust_events_c.py',
1712 'scripts/tracetool/format/ust_events_h.py',
1713 'scripts/tracetool/format/__init__.py',
1714 'scripts/tracetool/format/d.py',
1715 'scripts/tracetool/format/tcg_helper_c.py',
1716 'scripts/tracetool/format/simpletrace_stap.py',
1717 'scripts/tracetool/format/c.py',
1718 'scripts/tracetool/format/h.py',
1719 'scripts/tracetool/format/tcg_helper_h.py',
1720 'scripts/tracetool/format/log_stap.py',
1721 'scripts/tracetool/format/stap.py',
1722 'scripts/tracetool/format/tcg_helper_wrapper_h.py',
1723 'scripts/tracetool/__init__.py',
1724 'scripts/tracetool/transform.py',
1725 'scripts/tracetool/vcpu.py'
1726)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001727
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001728qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1729 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02001730 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001731qemu_version = custom_target('qemu-version.h',
1732 output: 'qemu-version.h',
1733 command: qemu_version_cmd,
1734 capture: true,
1735 build_by_default: true,
1736 build_always_stale: true)
1737genh += qemu_version
1738
Marc-André Lureau3f885652019-07-15 18:06:04 +04001739hxdep = []
1740hx_headers = [
1741 ['qemu-options.hx', 'qemu-options.def'],
1742 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1743]
1744if have_system
1745 hx_headers += [
1746 ['hmp-commands.hx', 'hmp-commands.h'],
1747 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1748 ]
1749endif
1750foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001751 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04001752 input: files(d[0]),
1753 output: d[1],
1754 capture: true,
1755 build_by_default: true, # to be removed when added to a target
1756 command: [hxtool, '-h', '@INPUT0@'])
1757endforeach
1758genh += hxdep
1759
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001760###################
1761# Collect sources #
1762###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001763
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001764authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001765blockdev_ss = ss.source_set()
1766block_ss = ss.source_set()
1767bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001768chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001769common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001770crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001771io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001772linux_user_ss = ss.source_set()
1773qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001774qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001775softmmu_ss = ss.source_set()
1776specific_fuzz_ss = ss.source_set()
1777specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001778stub_ss = ss.source_set()
1779trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001780user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001781util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001782
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001783modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001784hw_arch = {}
1785target_arch = {}
1786target_softmmu_arch = {}
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02001787target_user_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001788
1789###############
1790# Trace files #
1791###############
1792
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001793# TODO: add each directory to the subdirs from its own meson.build, once
1794# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001795trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001796 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01001797 'qapi',
1798 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001799 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01001800 'util',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001801]
1802if have_user
1803 trace_events_subdirs += [ 'linux-user' ]
1804endif
1805if have_block
1806 trace_events_subdirs += [
1807 'authz',
1808 'block',
1809 'io',
1810 'nbd',
1811 'scsi',
1812 ]
1813endif
1814if have_system
1815 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01001816 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001817 'audio',
1818 'backends',
1819 'backends/tpm',
1820 'chardev',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001821 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001822 'hw/9pfs',
1823 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08001824 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001825 'hw/alpha',
1826 'hw/arm',
1827 'hw/audio',
1828 'hw/block',
1829 'hw/block/dataplane',
1830 'hw/char',
1831 'hw/display',
1832 'hw/dma',
1833 'hw/hppa',
1834 'hw/hyperv',
1835 'hw/i2c',
1836 'hw/i386',
1837 'hw/i386/xen',
1838 'hw/ide',
1839 'hw/input',
1840 'hw/intc',
1841 'hw/isa',
1842 'hw/mem',
1843 'hw/mips',
1844 'hw/misc',
1845 'hw/misc/macio',
1846 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08001847 'hw/net/can',
Klaus Jensen88eea452021-04-14 22:14:30 +02001848 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001849 'hw/nvram',
1850 'hw/pci',
1851 'hw/pci-host',
1852 'hw/ppc',
1853 'hw/rdma',
1854 'hw/rdma/vmw',
1855 'hw/rtc',
1856 'hw/s390x',
1857 'hw/scsi',
1858 'hw/sd',
1859 'hw/sparc',
1860 'hw/sparc64',
1861 'hw/ssi',
1862 'hw/timer',
1863 'hw/tpm',
1864 'hw/usb',
1865 'hw/vfio',
1866 'hw/virtio',
1867 'hw/watchdog',
1868 'hw/xen',
1869 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001870 'migration',
1871 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02001872 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001873 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05001874 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001875 ]
1876endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01001877if have_system or have_user
1878 trace_events_subdirs += [
1879 'accel/tcg',
1880 'hw/core',
1881 'target/arm',
1882 'target/hppa',
1883 'target/i386',
1884 'target/i386/kvm',
1885 'target/mips',
1886 'target/ppc',
1887 'target/riscv',
1888 'target/s390x',
1889 'target/sparc',
1890 ]
1891endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001892
Marc-André Lureau0df750e2020-11-25 14:06:37 +04001893vhost_user = not_found
1894if 'CONFIG_VHOST_USER' in config_host
1895 libvhost_user = subproject('libvhost-user')
1896 vhost_user = libvhost_user.get_variable('vhost_user_dep')
1897endif
1898
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001899subdir('qapi')
1900subdir('qobject')
1901subdir('stubs')
1902subdir('trace')
1903subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04001904subdir('qom')
1905subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001906subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04001907subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001908
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001909
1910if enable_modules
1911 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1912 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1913endif
1914
Paolo Bonzini2becc362020-02-03 11:42:03 +01001915stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001916
1917util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01001918util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001919libqemuutil = static_library('qemuutil',
1920 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonziniaa087962020-09-01 11:15:30 -04001921 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001922qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04001923 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001924
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01001925if have_system or have_user
1926 decodetree = generator(find_program('scripts/decodetree.py'),
1927 output: 'decode-@BASENAME@.c.inc',
1928 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1929 subdir('libdecnumber')
1930 subdir('target')
1931endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001932
Paolo Bonzini478e9432020-08-17 12:47:55 +02001933subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04001934subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04001935subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001936subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04001937subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001938
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01001939if have_block
1940 block_ss.add(files(
1941 'block.c',
1942 'blockjob.c',
1943 'job.c',
1944 'qemu-io-cmds.c',
1945 ))
1946 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001947
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01001948 subdir('nbd')
1949 subdir('scsi')
1950 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001951
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01001952 blockdev_ss.add(files(
1953 'blockdev.c',
1954 'blockdev-nbd.c',
1955 'iothread.c',
1956 'job-qmp.c',
1957 ), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02001958
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01001959 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1960 # os-win32.c does not
1961 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1962 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
1963endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02001964
1965common_ss.add(files('cpus-common.c'))
1966
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001967subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001968
Richard Hendersonf3433462020-09-12 10:47:33 -07001969common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02001970specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001971specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1972 'fpu/softfloat.c',
1973 'tcg/optimize.c',
1974 'tcg/tcg-common.c',
1975 'tcg/tcg-op-gvec.c',
1976 'tcg/tcg-op-vec.c',
1977 'tcg/tcg-op.c',
1978 'tcg/tcg.c',
1979))
Richard Henderson59964b42021-01-30 17:48:19 -08001980specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('tcg/tci.c'))
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001981
Richard Henderson44b99a62021-03-22 12:24:26 +01001982# Work around a gcc bug/misfeature wherein constant propagation looks
1983# through an alias:
1984# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
1985# to guess that a const variable is always zero. Without lto, this is
1986# impossible, as the alias is restricted to page-vary-common.c. Indeed,
1987# without lto, not even the alias is required -- we simply use different
1988# declarations in different compilation units.
1989pagevary = files('page-vary-common.c')
1990if get_option('b_lto')
1991 pagevary_flags = ['-fno-lto']
1992 if get_option('cfi')
1993 pagevary_flags += '-fno-sanitize=cfi-icall'
1994 endif
1995 pagevary = static_library('page-vary-common', sources: pagevary,
1996 c_args: pagevary_flags)
1997 pagevary = declare_dependency(link_with: pagevary)
1998endif
1999common_ss.add(pagevary)
Richard Henderson6670d4d2021-03-22 12:24:24 +01002000specific_ss.add(files('page-vary.c'))
2001
Marc-André Lureauab318052019-07-24 19:23:16 +04002002subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04002003subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04002004subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002005subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04002006subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04002007subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00002008subdir('semihosting')
Marc-André Lureau582ea952019-08-15 15:15:32 +04002009subdir('hw')
Marc-André Lureau1a828782019-08-18 16:13:08 +04002010subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002011subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04002012subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04002013subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002014subdir('ebpf')
2015
2016common_ss.add(libbpf)
Marc-André Lureau3a304462019-08-18 16:13:08 +04002017
Marc-André Lureaub309c322019-08-18 19:20:37 +04002018bsd_user_ss.add(files('gdbstub.c'))
2019specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
2020
Marc-André Lureau3a304462019-08-18 16:13:08 +04002021linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
2022specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02002023
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002024# needed for fuzzing binaries
2025subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002026subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002027
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002028########################
2029# Library dependencies #
2030########################
2031
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002032block_mods = []
2033softmmu_mods = []
2034foreach d, list : modules
2035 foreach m, module_ss : list
2036 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02002037 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002038 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
2039 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
2040 if d == 'block'
2041 block_mods += sl
2042 else
2043 softmmu_mods += sl
2044 endif
2045 else
2046 if d == 'block'
2047 block_ss.add_all(module_ss)
2048 else
2049 softmmu_ss.add_all(module_ss)
2050 endif
2051 endif
2052 endforeach
2053endforeach
2054
2055nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08002056undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002057block_syms = custom_target('block.syms', output: 'block.syms',
2058 input: [libqemuutil, block_mods],
2059 capture: true,
2060 command: [undefsym, nm, '@INPUT@'])
2061qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
2062 input: [libqemuutil, softmmu_mods],
2063 capture: true,
2064 command: [undefsym, nm, '@INPUT@'])
2065
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02002066qom_ss = qom_ss.apply(config_host, strict: false)
2067libqom = static_library('qom', qom_ss.sources() + genh,
2068 dependencies: [qom_ss.dependencies()],
2069 name_suffix: 'fa')
2070
2071qom = declare_dependency(link_whole: libqom)
2072
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02002073authz_ss = authz_ss.apply(config_host, strict: false)
2074libauthz = static_library('authz', authz_ss.sources() + genh,
2075 dependencies: [authz_ss.dependencies()],
2076 name_suffix: 'fa',
2077 build_by_default: false)
2078
2079authz = declare_dependency(link_whole: libauthz,
2080 dependencies: qom)
2081
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002082crypto_ss = crypto_ss.apply(config_host, strict: false)
2083libcrypto = static_library('crypto', crypto_ss.sources() + genh,
2084 dependencies: [crypto_ss.dependencies()],
2085 name_suffix: 'fa',
2086 build_by_default: false)
2087
2088crypto = declare_dependency(link_whole: libcrypto,
2089 dependencies: [authz, qom])
2090
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002091io_ss = io_ss.apply(config_host, strict: false)
2092libio = static_library('io', io_ss.sources() + genh,
2093 dependencies: [io_ss.dependencies()],
2094 link_with: libqemuutil,
2095 name_suffix: 'fa',
2096 build_by_default: false)
2097
2098io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
2099
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02002100libmigration = static_library('migration', sources: migration_files + genh,
2101 name_suffix: 'fa',
2102 build_by_default: false)
2103migration = declare_dependency(link_with: libmigration,
2104 dependencies: [zlib, qom, io])
2105softmmu_ss.add(migration)
2106
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002107block_ss = block_ss.apply(config_host, strict: false)
2108libblock = static_library('block', block_ss.sources() + genh,
2109 dependencies: block_ss.dependencies(),
2110 link_depends: block_syms,
2111 name_suffix: 'fa',
2112 build_by_default: false)
2113
2114block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002115 link_args: '@block.syms',
2116 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002117
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002118blockdev_ss = blockdev_ss.apply(config_host, strict: false)
2119libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
2120 dependencies: blockdev_ss.dependencies(),
2121 name_suffix: 'fa',
2122 build_by_default: false)
2123
2124blockdev = declare_dependency(link_whole: [libblockdev],
2125 dependencies: [block])
2126
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002127qmp_ss = qmp_ss.apply(config_host, strict: false)
2128libqmp = static_library('qmp', qmp_ss.sources() + genh,
2129 dependencies: qmp_ss.dependencies(),
2130 name_suffix: 'fa',
2131 build_by_default: false)
2132
2133qmp = declare_dependency(link_whole: [libqmp])
2134
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002135libchardev = static_library('chardev', chardev_ss.sources() + genh,
2136 name_suffix: 'fa',
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002137 dependencies: [gnutls],
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002138 build_by_default: false)
2139
2140chardev = declare_dependency(link_whole: libchardev)
2141
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02002142libhwcore = static_library('hwcore', sources: hwcore_files + genh,
2143 name_suffix: 'fa',
2144 build_by_default: false)
2145hwcore = declare_dependency(link_whole: libhwcore)
2146common_ss.add(hwcore)
2147
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02002148###########
2149# Targets #
2150###########
2151
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002152foreach m : block_mods + softmmu_mods
2153 shared_module(m.name(),
2154 name_prefix: '',
2155 link_whole: m,
2156 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002157 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002158endforeach
2159
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002160softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002161common_ss.add(qom, qemuutil)
2162
2163common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01002164common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
2165
2166common_all = common_ss.apply(config_all, strict: false)
2167common_all = static_library('common',
2168 build_by_default: false,
2169 sources: common_all.sources() + genh,
2170 dependencies: common_all.dependencies(),
2171 name_suffix: 'fa')
2172
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002173feature_to_c = find_program('scripts/feature_to_c.sh')
2174
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002175emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002176foreach target : target_dirs
2177 config_target = config_target_mak[target]
2178 target_name = config_target['TARGET_NAME']
2179 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02002180 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002181 arch_deps = []
2182 c_args = ['-DNEED_CPU_H',
2183 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2184 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04002185 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01002186
Paolo Bonzini859aef02020-08-04 18:14:26 +02002187 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01002188 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2189 if targetos == 'linux'
2190 target_inc += include_directories('linux-headers', is_system: true)
2191 endif
2192 if target.endswith('-softmmu')
2193 qemu_target_name = 'qemu-system-' + target_name
2194 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002195 t = target_softmmu_arch[arch].apply(config_target, strict: false)
2196 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002197 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002198
Marc-André Lureau2c442202019-08-17 13:55:58 +04002199 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
2200 hw = hw_arch[hw_dir].apply(config_target, strict: false)
2201 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002202 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04002203
Paolo Bonzini2becc362020-02-03 11:42:03 +01002204 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002205 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002206 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04002207 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002208 target_type='user'
2209 qemu_target_name = 'qemu-' + target_name
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02002210 if arch in target_user_arch
2211 t = target_user_arch[arch].apply(config_target, strict: false)
2212 arch_srcs += t.sources()
2213 arch_deps += t.dependencies()
2214 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002215 if 'CONFIG_LINUX_USER' in config_target
2216 base_dir = 'linux-user'
2217 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
2218 else
2219 base_dir = 'bsd-user'
Stacey Sonea1ab4c2020-12-18 13:54:50 -07002220 target_inc += include_directories('bsd-user/freebsd')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002221 endif
2222 target_inc += include_directories(
2223 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04002224 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002225 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04002226 if 'CONFIG_LINUX_USER' in config_target
2227 dir = base_dir / abi
2228 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
2229 if config_target.has_key('TARGET_SYSTBL_ABI')
2230 arch_srcs += \
2231 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
2232 extra_args : config_target['TARGET_SYSTBL_ABI'])
2233 endif
2234 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002235 endif
2236
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002237 if 'TARGET_XML_FILES' in config_target
2238 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
2239 output: target + '-gdbstub-xml.c',
2240 input: files(config_target['TARGET_XML_FILES'].split()),
2241 command: [feature_to_c, '@INPUT@'],
2242 capture: true)
2243 arch_srcs += gdbstub_xml
2244 endif
2245
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002246 t = target_arch[arch].apply(config_target, strict: false)
2247 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002248 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002249
Paolo Bonzini2becc362020-02-03 11:42:03 +01002250 target_common = common_ss.apply(config_target, strict: false)
2251 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002252 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002253
Paolo Bonzini2becc362020-02-03 11:42:03 +01002254 target_specific = specific_ss.apply(config_target, strict: false)
2255 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002256 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002257
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002258 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02002259 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002260 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002261 objects: objects,
2262 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002263 c_args: c_args,
2264 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002265 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002266
2267 if target.endswith('-softmmu')
2268 execs = [{
2269 'name': 'qemu-system-' + target_name,
2270 'gui': false,
2271 'sources': files('softmmu/main.c'),
2272 'dependencies': []
2273 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002274 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002275 execs += [{
2276 'name': 'qemu-system-' + target_name + 'w',
2277 'gui': true,
2278 'sources': files('softmmu/main.c'),
2279 'dependencies': []
2280 }]
2281 endif
2282 if config_host.has_key('CONFIG_FUZZ')
2283 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
2284 execs += [{
2285 'name': 'qemu-fuzz-' + target_name,
2286 'gui': false,
2287 'sources': specific_fuzz.sources(),
2288 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002289 }]
2290 endif
2291 else
2292 execs = [{
2293 'name': 'qemu-' + target_name,
2294 'gui': false,
2295 'sources': [],
2296 'dependencies': []
2297 }]
2298 endif
2299 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01002300 exe_name = exe['name']
2301 exe_sign = 'CONFIG_HVF' in config_target
2302 if exe_sign
2303 exe_name += '-unsigned'
2304 endif
2305
2306 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09002307 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002308 c_args: c_args,
2309 dependencies: arch_deps + deps + exe['dependencies'],
2310 objects: lib.extract_all_objects(recursive: true),
2311 link_language: link_language,
2312 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
2313 link_args: link_args,
2314 gui_app: exe['gui'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01002315
2316 if exe_sign
2317 emulators += {exe['name'] : custom_target(exe['name'],
Alexander Graf8a74ce62021-01-20 23:44:34 +01002318 depends: emulator,
2319 output: exe['name'],
2320 command: [
2321 meson.current_source_dir() / 'scripts/entitlement.sh',
2322 meson.current_build_dir() / exe_name,
2323 meson.current_build_dir() / exe['name'],
2324 meson.current_source_dir() / 'accel/hvf/entitlements.plist'
2325 ])
2326 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09002327
2328 meson.add_install_script('scripts/entitlement.sh', '--install',
2329 get_option('bindir') / exe_name,
2330 get_option('bindir') / exe['name'],
2331 meson.current_source_dir() / 'accel/hvf/entitlements.plist')
Alexander Graf8a74ce62021-01-20 23:44:34 +01002332 else
2333 emulators += {exe['name']: emulator}
2334 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002335
2336 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
2337 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002338 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
2339 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002340 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
2341 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
2342 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002343 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002344 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002345 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002346 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002347 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002348 command: [
2349 tracetool, '--group=all', '--format=' + stp['fmt'],
2350 '--binary=' + stp['bin'],
2351 '--target-name=' + target_name,
2352 '--target-type=' + target_type,
2353 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01002354 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002355 ],
2356 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002357 endforeach
2358 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002359 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002360endforeach
2361
Paolo Bonzini931049b2020-02-05 09:44:24 +01002362# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002363
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002364if 'CONFIG_PLUGIN' in config_host
2365 install_headers('include/qemu/qemu-plugin.h')
2366endif
2367
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002368if 'CONFIG_GUEST_AGENT' in config_host
2369 subdir('qga')
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002370elif get_option('guest_agent_msi').enabled()
2371 error('Guest agent MSI requested, but the guest agent is not being built')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002372endif
2373
Laurent Vivier9755c942020-08-24 17:24:30 +02002374# Don't build qemu-keymap if xkbcommon is not explicitly enabled
2375# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002376if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04002377 # used for the update-keymaps target, so include rules even if !have_tools
2378 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
2379 dependencies: [qemuutil, xkbcommon], install: have_tools)
2380endif
2381
Paolo Bonzini931049b2020-02-05 09:44:24 +01002382if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002383 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
2384 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
2385 qemu_io = executable('qemu-io', files('qemu-io.c'),
2386 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01002387 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002388 dependencies: [blockdev, qemuutil, gnutls], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002389
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02002390 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002391 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04002392 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002393
Marc-André Lureau157e7b12019-07-15 14:50:58 +04002394 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
2395 dependencies: qemuutil,
2396 install: true)
2397
Paolo Bonzini931049b2020-02-05 09:44:24 +01002398 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02002399 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002400 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04002401 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02002402 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01002403 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002404
2405 if targetos == 'linux'
2406 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2407 dependencies: [qemuutil, libcap_ng],
2408 install: true,
2409 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002410
2411 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2412 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002413 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002414 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002415 endif
2416
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04002417 if 'CONFIG_IVSHMEM' in config_host
2418 subdir('contrib/ivshmem-client')
2419 subdir('contrib/ivshmem-server')
2420 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01002421endif
2422
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04002423subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002424subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04002425subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02002426subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08002427subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01002428if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04002429 subdir('po')
2430endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002431
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002432if host_machine.system() == 'windows'
2433 nsis_cmd = [
2434 find_program('scripts/nsis.py'),
2435 '@OUTPUT@',
2436 get_option('prefix'),
2437 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01002438 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002439 '--',
2440 '-DDISPLAYVERSION=' + meson.project_version(),
2441 ]
2442 if build_docs
2443 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2444 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002445 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002446 nsis_cmd += '-DCONFIG_GTK=y'
2447 endif
2448
2449 nsis = custom_target('nsis',
2450 output: 'qemu-setup-' + meson.project_version() + '.exe',
2451 input: files('qemu.nsi'),
2452 build_always_stale: true,
2453 command: nsis_cmd + ['@INPUT@'])
2454 alias_target('installer', nsis)
2455endif
2456
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002457#########################
2458# Configuration summary #
2459#########################
2460
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002461# Directories
Paolo Bonzinif9332752020-02-03 13:28:38 +01002462summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002463summary_info += {'Install prefix': get_option('prefix')}
2464summary_info += {'BIOS directory': qemu_datadir}
2465summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2466summary_info += {'binary directory': get_option('bindir')}
2467summary_info += {'library directory': get_option('libdir')}
2468summary_info += {'module directory': qemu_moddir}
2469summary_info += {'libexec directory': get_option('libexecdir')}
2470summary_info += {'include directory': get_option('includedir')}
2471summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002472if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002473 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04002474 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002475else
2476 summary_info += {'local state directory': 'queried at runtime'}
2477endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04002478summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002479summary_info += {'Build directory': meson.current_build_dir()}
2480summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002481summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002482summary(summary_info, bool_yn: true, section: 'Directories')
2483
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002484# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002485summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002486summary_info += {'git': config_host['GIT']}
2487summary_info += {'make': config_host['MAKE']}
2488summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
2489summary_info += {'sphinx-build': sphinx_build.found()}
2490if config_host.has_key('HAVE_GDB_BIN')
2491 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2492endif
2493summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2494if targetos == 'windows' and config_host.has_key('CONFIG_GUEST_AGENT')
2495 summary_info += {'wixl': wixl.found() ? wixl.full_path() : false}
2496endif
Joelle van Dyneb8e0c492021-03-15 11:03:41 -07002497if slirp_opt != 'disabled' and 'CONFIG_SLIRP_SMBD' in config_host
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002498 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2499endif
2500summary(summary_info, bool_yn: true, section: 'Host binaries')
2501
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01002502# Configurable features
2503summary_info = {}
2504summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002505summary_info += {'system-mode emulation': have_system}
2506summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002507summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01002508summary_info += {'Install blobs': get_option('install_blobs')}
2509summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2510if config_host.has_key('CONFIG_MODULES')
2511 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2512endif
2513summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2514summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2515if have_system
2516 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2517endif
2518summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2519if config_host['TRACE_BACKENDS'].split().contains('simple')
2520 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2521endif
2522summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2523summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
2524summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2525summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2526summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2527summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
2528summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
2529summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
2530summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2531summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2532summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2533summary(summary_info, bool_yn: true, section: 'Configurable features')
2534
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002535# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002536summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002537summary_info += {'host CPU': cpu}
2538summary_info += {'host endianness': build_machine.endian()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002539summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
2540summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
2541if link_language == 'cpp'
2542 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
2543else
2544 summary_info += {'C++ compiler': false}
2545endif
2546if targetos == 'darwin'
2547 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
2548endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002549if targetos == 'windows'
2550 if 'WIN_SDK' in config_host
2551 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2552 endif
2553endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002554summary_info += {'ARFLAGS': config_host['ARFLAGS']}
Paolo Bonzini47b30832020-09-23 05:26:17 -04002555summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2556 + ['-O' + get_option('optimization')]
2557 + (get_option('debug') ? ['-g'] : []))}
2558if link_language == 'cpp'
2559 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2560 + ['-O' + get_option('optimization')]
2561 + (get_option('debug') ? ['-g'] : []))}
2562endif
2563link_args = get_option(link_language + '_link_args')
2564if link_args.length() > 0
2565 summary_info += {'LDFLAGS': ' '.join(link_args)}
2566endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002567summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2568summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002569summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05002570summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002571summary_info += {'PIE': get_option('b_pie')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02002572summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002573summary_info += {'malloc trim support': has_malloc_trim}
2574summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
Peter Maydell2b9f74e2021-01-26 15:58:46 +00002575summary_info += {'preadv support': config_host_data.get('CONFIG_PREADV')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002576summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2577summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2578summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2579summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
2580summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2581summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2582summary_info += {'memory allocator': get_option('malloc')}
2583summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2584summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2585summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
2586summary_info += {'gcov': get_option('b_coverage')}
2587summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2588summary_info += {'CFI support': get_option('cfi')}
2589if get_option('cfi')
2590 summary_info += {'CFI debug support': get_option('cfi_debug')}
2591endif
2592summary_info += {'strip binaries': get_option('strip')}
2593summary_info += {'sparse': sparse.found() ? sparse.full_path() : false}
2594summary_info += {'mingw32 support': targetos == 'windows'}
Alex Bennée49e85652021-02-22 10:14:50 +00002595
2596# snarf the cross-compilation information for tests
2597foreach target: target_dirs
2598 tcg_mak = meson.current_build_dir() / 'tests/tcg' / 'config-' + target + '.mak'
2599 if fs.exists(tcg_mak)
2600 config_cross_tcg = keyval.load(tcg_mak)
2601 target = config_cross_tcg['TARGET_NAME']
2602 compiler = ''
2603 if 'DOCKER_CROSS_CC_GUEST' in config_cross_tcg
2604 summary_info += {target + ' tests': config_cross_tcg['DOCKER_CROSS_CC_GUEST'] +
2605 ' via ' + config_cross_tcg['DOCKER_IMAGE']}
2606 elif 'CROSS_CC_GUEST' in config_cross_tcg
2607 summary_info += {target + ' tests'
2608 : config_cross_tcg['CROSS_CC_GUEST'] }
2609 endif
2610 endif
2611endforeach
2612
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002613summary(summary_info, bool_yn: true, section: 'Compilation')
2614
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002615# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002616summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002617if have_system
2618 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2619 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2620 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2621 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
Reinoud Zandijk74a414a2021-04-02 22:25:32 +02002622 summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002623 summary_info += {'Xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2624 if config_host.has_key('CONFIG_XEN_BACKEND')
2625 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2626 endif
2627endif
2628summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2629if config_all.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01002630 if get_option('tcg_interpreter')
2631 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, experimental and slow)'}
2632 else
2633 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
2634 endif
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002635 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002636endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002637summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002638if have_system
2639 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01002640 summary_info += {'out of process emulation': multiprocess_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002641endif
2642summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
2643
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002644# Block layer
2645summary_info = {}
2646summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2647summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2648if have_block
2649 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2650 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
2651 summary_info += {'VirtFS support': have_virtfs}
2652 summary_info += {'build virtiofs daemon': have_virtiofsd}
2653 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
2654 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2655 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2656 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2657 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2658 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2659 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2660 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2661 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2662 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002663 summary_info += {'FUSE exports': fuse.found()}
2664endif
2665summary(summary_info, bool_yn: true, section: 'Block layer support')
2666
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002667# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002668summary_info = {}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002669summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
2670summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
2671# TODO: add back version
2672summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
2673if config_host.has_key('CONFIG_GCRYPT')
2674 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
2675 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2676endif
2677# TODO: add back version
2678summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
2679if config_host.has_key('CONFIG_NETTLE')
2680 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2681endif
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002682summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
2683summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2684summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
2685summary(summary_info, bool_yn: true, section: 'Crypto')
2686
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01002687# Libraries
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002688summary_info = {}
2689if targetos == 'darwin'
2690 summary_info += {'Cocoa support': cocoa.found()}
2691endif
2692# TODO: add back version
2693summary_info += {'SDL support': sdl.found()}
2694summary_info += {'SDL image support': sdl_image.found()}
2695# TODO: add back version
2696summary_info += {'GTK support': gtk.found()}
2697summary_info += {'pixman': pixman.found()}
2698# TODO: add back version
2699summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002700# TODO: add back version
2701summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002702summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
2703summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
Yonggang Luo5285e592020-10-13 07:43:48 +08002704summary_info += {'iconv support': iconv.found()}
2705summary_info += {'curses support': curses.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002706# TODO: add back version
2707summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002708summary_info += {'curl support': curl.found()}
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002709summary_info += {'Multipath support': mpathpersist.found()}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002710summary_info += {'VNC support': vnc.found()}
2711if vnc.found()
2712 summary_info += {'VNC SASL support': sasl.found()}
2713 summary_info += {'VNC JPEG support': jpeg.found()}
2714 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002715endif
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002716summary_info += {'brlapi support': brlapi.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002717summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2718summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2719summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2720summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002721summary_info += {'ATTR/XATTR support': libattr.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002722summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2723summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002724summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002725summary_info += {'libcap-ng support': libcap_ng.found()}
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002726summary_info += {'bpf support': libbpf.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002727# TODO: add back protocol and server version
2728summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002729summary_info += {'rbd support': rbd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002730summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
2731summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02002732summary_info += {'U2F support': u2f.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002733summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
2734summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
2735summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
Akihiko Odakibc6a3562021-02-23 15:03:07 +09002736summary_info += {'GBM': config_host.has_key('CONFIG_GBM')}
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002737summary_info += {'libiscsi support': libiscsi.found()}
Paolo Bonzini30045c02020-11-17 13:11:25 +01002738summary_info += {'libnfs support': libnfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002739if targetos == 'windows'
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002740 if config_host.has_key('CONFIG_GUEST_AGENT')
2741 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2742 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002743 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002744endif
Paolo Bonzini90835c22020-11-17 14:22:24 +01002745summary_info += {'seccomp support': seccomp.found()}
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002746summary_info += {'GlusterFS support': glusterfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002747summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2748summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002749summary_info += {'lzo support': lzo.found()}
Paolo Bonzini241611e2020-11-17 13:32:34 +01002750summary_info += {'snappy support': snappy.found()}
Paolo Bonzini29ba6112020-11-17 13:07:52 +01002751summary_info += {'bzip2 support': libbzip2.found()}
Paolo Bonziniecea3692020-11-17 13:35:28 +01002752summary_info += {'lzfse support': liblzfse.found()}
Paolo Bonzinib1def332020-11-17 13:37:39 +01002753summary_info += {'zstd support': zstd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002754summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2755summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002756summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002757summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2758summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002759summary_info += {'libudev': libudev.found()}
Max Reitzdf4ea702020-10-27 20:05:46 +01002760summary_info += {'FUSE lseek': fuse_lseek.found()}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01002761summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01002762
2763if not supported_cpus.contains(cpu)
2764 message()
2765 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2766 message()
2767 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2768 message('The QEMU project intends to remove support for this host CPU in')
2769 message('a future release if nobody volunteers to maintain it and to')
2770 message('provide a build host for our continuous integration setup.')
2771 message('configure has succeeded and you can continue to build, but')
2772 message('if you care about QEMU on this platform you should contact')
2773 message('us upstream at qemu-devel@nongnu.org.')
2774endif
2775
2776if not supported_oses.contains(targetos)
2777 message()
2778 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2779 message()
2780 message('Host OS ' + targetos + 'support is not currently maintained.')
2781 message('The QEMU project intends to remove support for this host OS in')
2782 message('a future release if nobody volunteers to maintain it and to')
2783 message('provide a build host for our continuous integration setup.')
2784 message('configure has succeeded and you can continue to build, but')
2785 message('if you care about QEMU on this platform you should contact')
2786 message('us upstream at qemu-devel@nongnu.org.')
2787endif