blob: d4ce2ca57bbe84e0af091bffa366119ff0cec6ec [file] [log] [blame]
Paolo Bonzinia5665052019-06-10 12:05:14 +02001project('qemu', ['c'], meson_version: '>=0.55.0',
Richard Hendersond22797c2021-06-14 16:31:36 -07002 default_options: ['warning_level=1', 'c_std=gnu11', 'cpp_std=gnu++11', 'b_colorout=auto'] +
Paolo Bonzinia5cb7c52020-10-19 06:56:16 -04003 (meson.version().version_compare('>=0.56.0') ? [ 'b_staticpic=false' ] : []),
Paolo Bonzinia5665052019-06-10 12:05:14 +02004 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5
6not_found = dependency('', required: false)
Paolo Bonzinib29b40f2020-08-10 18:04:43 +02007if meson.version().version_compare('>=0.56.0')
8 keyval = import('keyval')
9else
10 keyval = import('unstable-keyval')
11endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040012ss = import('sourceset')
Richard Henderson8b18cdb2020-09-13 12:19:25 -070013fs = import('fs')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040014
Paolo Bonzinice1c1e72020-01-28 16:41:44 +010015sh = find_program('sh')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040016cc = meson.get_compiler('c')
Paolo Bonzinia5665052019-06-10 12:05:14 +020017config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Marc-André Lureau3154fee2019-08-29 22:07:01 +040018enable_modules = 'CONFIG_MODULES' in config_host
Paolo Bonzini35be72b2020-02-06 14:17:15 +010019enable_static = 'CONFIG_STATIC' in config_host
Yonggang Luoe3667662020-10-16 06:06:25 +080020
Paolo Bonzinid7dedf42021-01-26 11:15:33 +010021# Allow both shared and static libraries unless --enable-static
22static_kwargs = enable_static ? {'static': true} : {}
23
Yonggang Luoe3667662020-10-16 06:06:25 +080024# Temporary directory used for files created while
25# configure runs. Since it is in the build directory
26# we can safely blow away any previous version of it
27# (and we need not jump through hoops to try to delete
28# it when configure exits.)
29tmpdir = meson.current_build_dir() / 'meson-private/temp'
Marc-André Lureau8fe11232020-09-11 14:42:48 +020030
31if get_option('qemu_suffix').startswith('/')
32 error('qemu_suffix cannot start with a /')
33endif
34
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040035qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
Marc-André Lureauab4c0992020-08-26 15:04:16 +040036qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040037qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040038qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
39
40qemu_desktopdir = get_option('datadir') / 'applications'
41qemu_icondir = get_option('datadir') / 'icons'
42
Paolo Bonzini859aef02020-08-04 18:14:26 +020043config_host_data = configuration_data()
44genh = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020045
Paolo Bonzini760e4322020-08-26 08:09:48 +020046target_dirs = config_host['TARGET_DIRS'].split()
47have_user = false
48have_system = false
49foreach target : target_dirs
50 have_user = have_user or target.endswith('-user')
51 have_system = have_system or target.endswith('-softmmu')
52endforeach
53have_tools = 'CONFIG_TOOLS' in config_host
54have_block = have_system or have_tools
55
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040056python = import('python').find_installation()
57
58supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Sergei Trofimovich61256732020-10-12 18:57:19 +010059supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040060 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
61
62cpu = host_machine.cpu_family()
63targetos = host_machine.system()
64
Paolo Bonzini8a199802020-09-18 05:37:01 -040065if cpu in ['x86', 'x86_64']
66 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
67elif cpu == 'aarch64'
68 kvm_targets = ['aarch64-softmmu']
69elif cpu == 's390x'
70 kvm_targets = ['s390x-softmmu']
71elif cpu in ['ppc', 'ppc64']
72 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Huacai Chenfbc58842020-10-07 16:39:28 +080073elif cpu in ['mips', 'mips64']
74 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -040075else
76 kvm_targets = []
77endif
78
79accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alex Bennée0c3e41d2020-11-10 19:23:09 +000080if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
81 # i368 emulator provides xenpv machine type for multiple architectures
82 accelerator_targets += {
83 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
84 }
85endif
Paolo Bonzini8a199802020-09-18 05:37:01 -040086if cpu in ['x86', 'x86_64']
87 accelerator_targets += {
88 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -040089 'CONFIG_HVF': ['x86_64-softmmu'],
Reinoud Zandijk74a414a2021-04-02 22:25:32 +020090 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -040091 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
92 }
93endif
94
Philippe Mathieu-Daudéeae9a1d2021-01-14 18:45:08 +010095edk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ]
96install_edk2_blobs = false
97if get_option('install_blobs')
98 foreach target : target_dirs
99 install_edk2_blobs = install_edk2_blobs or target in edk2_targets
100 endforeach
101endif
102
Philippe Mathieu-Daudé45b545d2021-01-14 18:45:09 +0100103bzip2 = find_program('bzip2', required: install_edk2_blobs)
104
Paolo Bonzini201e8ed2020-09-01 07:45:54 -0400105##################
106# Compiler flags #
107##################
108
Alexander Bulekovff9ed622020-09-09 18:05:16 -0400109# Specify linker-script with add_project_link_arguments so that it is not placed
110# within a linker --start-group/--end-group pair
111if 'CONFIG_FUZZ' in config_host
112 add_project_link_arguments(['-Wl,-T,',
113 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
114 native: false, language: ['c', 'cpp', 'objc'])
115endif
116
Marc-André Lureau5fc06172021-01-14 16:56:02 +0400117add_global_arguments(config_host['QEMU_CFLAGS'].split(),
118 native: false, language: ['c', 'objc'])
119add_global_arguments(config_host['QEMU_CXXFLAGS'].split(),
120 native: false, language: 'cpp')
121add_global_link_arguments(config_host['QEMU_LDFLAGS'].split(),
122 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzinia5665052019-06-10 12:05:14 +0200123
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400124if targetos == 'linux'
125 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
126 '-isystem', 'linux-headers',
127 language: ['c', 'cpp'])
128endif
129
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100130add_project_arguments('-iquote', '.',
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400131 '-iquote', meson.current_source_dir(),
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400132 '-iquote', meson.current_source_dir() / 'include',
133 '-iquote', meson.current_source_dir() / 'disas/libvixl',
134 language: ['c', 'cpp', 'objc'])
Alexander Bulekovc46f76d2020-09-02 13:36:50 -0400135
Marc-André Lureaufc929892019-07-13 01:47:54 +0400136link_language = meson.get_external_property('link_language', 'cpp')
137if link_language == 'cpp'
138 add_languages('cpp', required: true, native: false)
139endif
Paolo Bonzinia5665052019-06-10 12:05:14 +0200140if host_machine.system() == 'darwin'
141 add_languages('objc', required: false, native: false)
142endif
143
Paolo Bonzinideb62372020-09-01 07:51:16 -0400144sparse = find_program('cgcc', required: get_option('sparse'))
145if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100146 run_target('sparse',
147 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400148 'compile_commands.json', sparse.full_path(), '-Wbitwise',
149 '-Wno-transparent-union', '-Wno-old-initializer',
150 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100151endif
152
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200153###########################################
154# Target-specific checks and dependencies #
155###########################################
156
157if targetos != 'linux' and get_option('mpath').enabled()
158 error('Multipath is supported only on Linux')
159endif
160
Paolo Bonzini106ad1f2021-02-17 16:24:25 +0100161if targetos != 'linux' and get_option('multiprocess').enabled()
162 error('Multiprocess QEMU is supported only on Linux')
163endif
164multiprocess_allowed = targetos == 'linux' and not get_option('multiprocess').disabled()
165
Paolo Bonzini7fa1c632021-06-01 10:00:48 +0200166libm = cc.find_library('m', required: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400167util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200168winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400169socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400170version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400171coref = []
172iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400173emulator_link_args = []
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200174nvmm =not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400175hvf = not_found
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400176if targetos == 'windows'
177 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200178 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400179
180 win = import('windows')
181 version_res = win.compile_resources('version.rc',
182 depend_files: files('pc-bios/qemu-nsis.ico'),
183 include_directories: include_directories('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400184elif targetos == 'darwin'
185 coref = dependency('appleframeworks', modules: 'CoreFoundation')
186 iokit = dependency('appleframeworks', modules: 'IOKit')
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200187elif targetos == 'sunos'
188 socket = [cc.find_library('socket'),
189 cc.find_library('nsl'),
190 cc.find_library('resolv')]
191elif targetos == 'haiku'
192 socket = [cc.find_library('posix_error_mapper'),
193 cc.find_library('network'),
194 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400195elif targetos == 'openbsd'
196 if not get_option('tcg').disabled() and target_dirs.length() > 0
197 # Disable OpenBSD W^X if available
198 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
199 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400200endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200201
Paolo Bonzini8a199802020-09-18 05:37:01 -0400202accelerators = []
203if not get_option('kvm').disabled() and targetos == 'linux'
204 accelerators += 'CONFIG_KVM'
205endif
206if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
207 accelerators += 'CONFIG_XEN'
208 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
209else
210 have_xen_pci_passthrough = false
211endif
212if not get_option('whpx').disabled() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000213 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400214 error('WHPX requires 64-bit host')
215 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
216 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
217 accelerators += 'CONFIG_WHPX'
218 endif
219endif
220if not get_option('hvf').disabled()
221 hvf = dependency('appleframeworks', modules: 'Hypervisor',
222 required: get_option('hvf'))
223 if hvf.found()
224 accelerators += 'CONFIG_HVF'
225 endif
226endif
227if not get_option('hax').disabled()
228 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
229 accelerators += 'CONFIG_HAX'
230 endif
231endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200232if targetos == 'netbsd'
233 if cc.has_header_symbol('nvmm.h', 'nvmm_cpu_stop', required: get_option('nvmm'))
234 nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
235 endif
236 if nvmm.found()
237 accelerators += 'CONFIG_NVMM'
238 endif
239endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100240
241tcg_arch = config_host['ARCH']
Paolo Bonzini8a199802020-09-18 05:37:01 -0400242if not get_option('tcg').disabled()
243 if cpu not in supported_cpus
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100244 if get_option('tcg_interpreter')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +0100245 warning('Unsupported CPU @0@, will use TCG with TCI (experimental and slow)'.format(cpu))
Paolo Bonzini8a199802020-09-18 05:37:01 -0400246 else
247 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
248 endif
Philippe Mathieu-Daudéfa2f7b02021-01-25 15:45:30 +0100249 elif get_option('tcg_interpreter')
250 warning('Use of the TCG interpretor is not recommended on this host')
251 warning('architecture. There is a native TCG execution backend available')
252 warning('which provides substantially better performance and reliability.')
253 warning('It is strongly recommended to remove the --enable-tcg-interpreter')
254 warning('configuration option on this architecture to use the native')
255 warning('backend.')
Paolo Bonzini8a199802020-09-18 05:37:01 -0400256 endif
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100257 if get_option('tcg_interpreter')
258 tcg_arch = 'tci'
259 elif config_host['ARCH'] == 'sparc64'
260 tcg_arch = 'sparc'
261 elif config_host['ARCH'] == 's390x'
262 tcg_arch = 's390'
263 elif config_host['ARCH'] in ['x86_64', 'x32']
264 tcg_arch = 'i386'
265 elif config_host['ARCH'] == 'ppc64'
266 tcg_arch = 'ppc'
267 elif config_host['ARCH'] in ['riscv32', 'riscv64']
268 tcg_arch = 'riscv'
269 endif
270 add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
Paolo Bonzini23a77b22020-12-14 12:01:45 +0100271 language: ['c', 'cpp', 'objc'])
272
Paolo Bonzini8a199802020-09-18 05:37:01 -0400273 accelerators += 'CONFIG_TCG'
274 config_host += { 'CONFIG_TCG': 'y' }
275endif
276
277if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
278 error('KVM not available on this platform')
279endif
280if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
281 error('HVF not available on this platform')
282endif
Reinoud Zandijk74a414a2021-04-02 22:25:32 +0200283if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
284 error('NVMM not available on this platform')
285endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400286if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
287 error('WHPX not available on this platform')
288endif
289if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
290 if 'CONFIG_XEN' in accelerators
291 error('Xen PCI passthrough not available on this platform')
292 else
293 error('Xen PCI passthrough requested but Xen not enabled')
294 endif
295endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400296
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200297################
298# Dependencies #
299################
300
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400301# The path to glib.h is added to all compilation commands. This was
302# grandfathered in from the QEMU Makefiles.
303add_project_arguments(config_host['GLIB_CFLAGS'].split(),
304 native: false, language: ['c', 'cpp', 'objc'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400305glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
306 link_args: config_host['GLIB_LIBS'].split())
307# override glib dep with the configure results (for subprojects)
308meson.override_dependency('glib-2.0', glib)
309
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400310gio = not_found
311if 'CONFIG_GIO' in config_host
312 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
313 link_args: config_host['GIO_LIBS'].split())
314endif
315lttng = not_found
316if 'CONFIG_TRACE_UST' in config_host
317 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
318endif
319urcubp = not_found
320if 'CONFIG_TRACE_UST' in config_host
321 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
322endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200323pixman = not_found
324if have_system or have_tools
325 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100326 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200327endif
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400328pam = not_found
329if 'CONFIG_AUTH_PAM' in config_host
330 pam = cc.find_library('pam')
331endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400332libaio = cc.find_library('aio', required: false)
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100333zlib = dependency('zlib', required: true, kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400334linux_io_uring = not_found
335if 'CONFIG_LINUX_IO_URING' in config_host
336 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
337 link_args: config_host['LINUX_IO_URING_LIBS'].split())
338endif
339libxml2 = not_found
340if 'CONFIG_LIBXML2' in config_host
341 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
342 link_args: config_host['LIBXML2_LIBS'].split())
343endif
344libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +0100345if not get_option('libnfs').auto() or have_block
346 libnfs = dependency('libnfs', version: '>=1.9.3',
347 required: get_option('libnfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100348 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400349endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100350
351libattr_test = '''
352 #include <stddef.h>
353 #include <sys/types.h>
354 #ifdef CONFIG_LIBATTR
355 #include <attr/xattr.h>
356 #else
357 #include <sys/xattr.h>
358 #endif
359 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
360
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400361libattr = not_found
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100362have_old_libattr = false
363if not get_option('attr').disabled()
364 if cc.links(libattr_test)
365 libattr = declare_dependency()
366 else
367 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
368 required: get_option('attr'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100369 kwargs: static_kwargs)
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100370 if libattr.found() and not \
371 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
372 libattr = not_found
373 if get_option('attr').enabled()
374 error('could not link libattr')
375 else
376 warning('could not link libattr, disabling')
377 endif
378 else
379 have_old_libattr = libattr.found()
380 endif
381 endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400382endif
Paolo Bonzinif7f2d652020-11-17 14:45:24 +0100383
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100384cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
385if cocoa.found() and get_option('sdl').enabled()
386 error('Cocoa and SDL cannot be enabled at the same time')
387endif
388if cocoa.found() and get_option('gtk').enabled()
389 error('Cocoa and GTK+ cannot be enabled at the same time')
390endif
391
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100392seccomp = not_found
Paolo Bonzini90835c22020-11-17 14:22:24 +0100393if not get_option('seccomp').auto() or have_system or have_tools
394 seccomp = dependency('libseccomp', version: '>=2.3.0',
395 required: get_option('seccomp'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100396 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100397endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100398
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100399libcap_ng = not_found
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100400if not get_option('cap_ng').auto() or have_system or have_tools
401 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
402 required: get_option('cap_ng'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100403 kwargs: static_kwargs)
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100404endif
Paolo Bonzini727c8bb2020-11-17 14:46:58 +0100405if libcap_ng.found() and not cc.links('''
406 #include <cap-ng.h>
407 int main(void)
408 {
409 capng_capability_to_name(CAPNG_EFFECTIVE);
410 return 0;
411 }''', dependencies: libcap_ng)
412 libcap_ng = not_found
413 if get_option('cap_ng').enabled()
414 error('could not link libcap-ng')
415 else
416 warning('could not link libcap-ng, disabling')
417 endif
418endif
419
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400420if get_option('xkbcommon').auto() and not have_system and not have_tools
421 xkbcommon = not_found
422else
423 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100424 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400425endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400426vde = not_found
427if config_host.has_key('CONFIG_VDE')
428 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
429endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200430pulse = not_found
431if 'CONFIG_LIBPULSE' in config_host
432 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
433 link_args: config_host['PULSE_LIBS'].split())
434endif
435alsa = not_found
436if 'CONFIG_ALSA' in config_host
437 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
438 link_args: config_host['ALSA_LIBS'].split())
439endif
440jack = not_found
441if 'CONFIG_LIBJACK' in config_host
442 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
443endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200444spice = not_found
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200445spice_headers = not_found
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200446spice_protocol = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200447if 'CONFIG_SPICE' in config_host
448 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
449 link_args: config_host['SPICE_LIBS'].split())
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200450 spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
Paolo Bonzini26347332019-07-29 15:40:07 +0200451endif
Gerd Hoffmann58d3f3f2021-05-19 07:39:32 +0200452if 'CONFIG_SPICE_PROTOCOL' in config_host
453 spice_protocol = declare_dependency(compile_args: config_host['SPICE_PROTOCOL_CFLAGS'].split())
454endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400455rt = cc.find_library('rt', required: false)
Paolo Bonziniccf7afa2020-09-01 06:44:23 -0400456libdl = not_found
457if 'CONFIG_PLUGIN' in config_host
458 libdl = cc.find_library('dl', required: true)
459endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200460libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100461if not get_option('libiscsi').auto() or have_block
462 libiscsi = dependency('libiscsi', version: '>=1.9.0',
463 required: get_option('libiscsi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100464 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini99650b62019-06-10 12:21:14 +0200465endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400466zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +0100467if not get_option('zstd').auto() or have_block
468 zstd = dependency('libzstd', version: '>=1.4.0',
469 required: get_option('zstd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100470 method: 'pkg-config', kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400471endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400472gbm = not_found
473if 'CONFIG_GBM' in config_host
474 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
475 link_args: config_host['GBM_LIBS'].split())
476endif
477virgl = not_found
478if 'CONFIG_VIRGL' in config_host
479 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
480 link_args: config_host['VIRGL_LIBS'].split())
481endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400482curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100483if not get_option('curl').auto() or have_block
484 curl = dependency('libcurl', version: '>=7.29.0',
485 method: 'pkg-config',
486 required: get_option('curl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100487 kwargs: static_kwargs)
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400488endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200489libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200490if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200491 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +0100492 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400493 required: get_option('libudev'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100494 kwargs: static_kwargs)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200495endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200496
Paolo Bonzini5c530152020-10-15 06:09:27 -0400497mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200498mpathpersist = not_found
499mpathpersist_new_api = false
500if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
501 mpath_test_source_new = '''
502 #include <libudev.h>
503 #include <mpath_persist.h>
504 unsigned mpath_mx_alloc_len = 1024;
505 int logsink;
506 static struct config *multipath_conf;
507 extern struct udev *udev;
508 extern struct config *get_multipath_config(void);
509 extern void put_multipath_config(struct config *conf);
510 struct udev *udev;
511 struct config *get_multipath_config(void) { return multipath_conf; }
512 void put_multipath_config(struct config *conf) { }
513 int main(void) {
514 udev = udev_new();
515 multipath_conf = mpath_lib_init();
516 return 0;
517 }'''
518 mpath_test_source_old = '''
519 #include <libudev.h>
520 #include <mpath_persist.h>
521 unsigned mpath_mx_alloc_len = 1024;
522 int logsink;
523 int main(void) {
524 struct udev *udev = udev_new();
525 mpath_lib_init(udev);
526 return 0;
527 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400528 libmpathpersist = cc.find_library('mpathpersist',
529 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100530 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400531 if libmpathpersist.found()
532 mpathlibs += libmpathpersist
533 if enable_static
534 mpathlibs += cc.find_library('devmapper',
535 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100536 kwargs: static_kwargs)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200537 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400538 mpathlibs += cc.find_library('multipath',
539 required: get_option('mpath'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100540 kwargs: static_kwargs)
Paolo Bonzini5c530152020-10-15 06:09:27 -0400541 foreach lib: mpathlibs
542 if not lib.found()
543 mpathlibs = []
544 break
545 endif
546 endforeach
547 if mpathlibs.length() == 0
548 msg = 'Dependencies missing for libmpathpersist'
549 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200550 mpathpersist = declare_dependency(dependencies: mpathlibs)
551 mpathpersist_new_api = true
552 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
553 mpathpersist = declare_dependency(dependencies: mpathlibs)
554 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400555 msg = 'Cannot detect libmpathpersist API'
556 endif
557 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200558 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400559 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200560 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400561 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200562 endif
563 endif
564 endif
565endif
566
Yonggang Luo5285e592020-10-13 07:43:48 +0800567iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800568curses = not_found
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400569if have_system and not get_option('curses').disabled()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400570 curses_test = '''
571 #include <locale.h>
572 #include <curses.h>
573 #include <wchar.h>
574 int main(void) {
575 wchar_t wch = L'w';
576 setlocale(LC_ALL, "");
577 resize_term(0, 0);
578 addwstr(L"wide chars\n");
579 addnwstr(&wch, 1);
580 add_wch(WACS_DEGREE);
581 return 0;
582 }'''
583
Yonggang Luoca31e302020-11-17 05:31:06 +0800584 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
585 foreach curses_dep : curses_dep_list
586 if not curses.found()
587 curses = dependency(curses_dep,
588 required: false,
589 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100590 kwargs: static_kwargs)
Yonggang Luoca31e302020-11-17 05:31:06 +0800591 endif
592 endforeach
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400593 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500594 curses_compile_args = ['-DNCURSES_WIDECHAR']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400595 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500596 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
597 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400598 else
599 msg = 'curses package not usable'
600 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800601 endif
602 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400603 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400604 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
605 if targetos != 'windows' and not has_curses_h
606 message('Trying with /usr/include/ncursesw')
607 curses_compile_args += ['-I/usr/include/ncursesw']
608 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
609 endif
610 if has_curses_h
611 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
612 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800613 libcurses = cc.find_library(curses_libname,
614 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100615 kwargs: static_kwargs)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400616 if libcurses.found()
617 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
618 curses = declare_dependency(compile_args: curses_compile_args,
619 dependencies: [libcurses])
620 break
621 else
622 msg = 'curses library not usable'
623 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800624 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400625 endforeach
626 endif
627 endif
628 if not get_option('iconv').disabled()
629 foreach link_args : [ ['-liconv'], [] ]
630 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
631 # We need to use libiconv if available because mixing libiconv's headers with
632 # the system libc does not work.
633 # However, without adding glib to the dependencies -L/usr/local/lib will not be
634 # included in the command line and libiconv will not be found.
635 if cc.links('''
636 #include <iconv.h>
637 int main(void) {
638 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
639 return conv != (iconv_t) -1;
640 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
641 iconv = declare_dependency(link_args: link_args, dependencies: glib)
642 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800643 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400644 endforeach
645 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400646 if curses.found() and not iconv.found()
647 if get_option('iconv').enabled()
648 error('iconv not available')
649 endif
650 msg = 'iconv required for curses UI but not available'
651 curses = not_found
652 endif
653 if not curses.found() and msg != ''
654 if get_option('curses').enabled()
655 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400656 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400657 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400658 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800659 endif
660endif
661
Paolo Bonzini26347332019-07-29 15:40:07 +0200662brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100663if not get_option('brlapi').auto() or have_system
664 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
665 required: get_option('brlapi'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100666 kwargs: static_kwargs)
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100667 if brlapi.found() and not cc.links('''
668 #include <brlapi.h>
669 #include <stddef.h>
670 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
671 brlapi = not_found
672 if get_option('brlapi').enabled()
673 error('could not link brlapi')
674 else
675 warning('could not link brlapi, disabling')
676 endif
677 endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200678endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100679
Paolo Bonzini760e4322020-08-26 08:09:48 +0200680sdl = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100681if not get_option('sdl').auto() or (have_system and not cocoa.found())
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100682 sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200683 sdl_image = not_found
684endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100685if sdl.found()
686 # work around 2.0.8 bug
687 sdl = declare_dependency(compile_args: '-Wno-undef',
688 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200689 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100690 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100691else
692 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100693 error('sdl-image required, but SDL was @0@'.format(
694 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100695 endif
696 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200697endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100698
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400699rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100700if not get_option('rbd').auto() or have_block
701 librados = cc.find_library('rados', required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100702 kwargs: static_kwargs)
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100703 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
704 required: get_option('rbd'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100705 kwargs: static_kwargs)
Paolo Bonzinic518d6c2021-01-26 11:20:35 +0100706 if librados.found() and librbd.found()
707 if cc.links('''
708 #include <stdio.h>
709 #include <rbd/librbd.h>
710 int main(void) {
711 rados_t cluster;
712 rados_create(&cluster, NULL);
713 return 0;
714 }''', dependencies: [librbd, librados])
715 rbd = declare_dependency(dependencies: [librbd, librados])
716 elif get_option('rbd').enabled()
717 error('could not link librados')
718 else
719 warning('could not link librados, disabling')
720 endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100721 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400722endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100723
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400724glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100725glusterfs_ftruncate_has_stat = false
726glusterfs_iocb_has_stat = false
727if not get_option('glusterfs').auto() or have_block
728 glusterfs = dependency('glusterfs-api', version: '>=3',
729 required: get_option('glusterfs'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100730 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100731 if glusterfs.found()
732 glusterfs_ftruncate_has_stat = cc.links('''
733 #include <glusterfs/api/glfs.h>
734
735 int
736 main(void)
737 {
738 /* new glfs_ftruncate() passes two additional args */
739 return glfs_ftruncate(NULL, 0, NULL, NULL);
740 }
741 ''', dependencies: glusterfs)
742 glusterfs_iocb_has_stat = cc.links('''
743 #include <glusterfs/api/glfs.h>
744
745 /* new glfs_io_cbk() passes two additional glfs_stat structs */
746 static void
747 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
748 {}
749
750 int
751 main(void)
752 {
753 glfs_io_cbk iocb = &glusterfs_iocb;
754 iocb(NULL, 0 , NULL, NULL, NULL);
755 return 0;
756 }
757 ''', dependencies: glusterfs)
758 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400759endif
760libssh = not_found
761if 'CONFIG_LIBSSH' in config_host
762 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
763 link_args: config_host['LIBSSH_LIBS'].split())
764endif
765libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100766if not get_option('bzip2').auto() or have_block
767 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
768 required: get_option('bzip2'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100769 kwargs: static_kwargs)
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100770 if libbzip2.found() and not cc.links('''
771 #include <bzlib.h>
772 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
773 libbzip2 = not_found
774 if get_option('bzip2').enabled()
775 error('could not link libbzip2')
776 else
777 warning('could not link libbzip2, disabling')
778 endif
779 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400780endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100781
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400782liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +0100783if not get_option('lzfse').auto() or have_block
784 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
785 required: get_option('lzfse'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100786 kwargs: static_kwargs)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400787endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100788if liblzfse.found() and not cc.links('''
789 #include <lzfse.h>
790 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
791 liblzfse = not_found
792 if get_option('lzfse').enabled()
793 error('could not link liblzfse')
794 else
795 warning('could not link liblzfse, disabling')
796 endif
797endif
798
Paolo Bonzini478e9432020-08-17 12:47:55 +0200799oss = not_found
800if 'CONFIG_AUDIO_OSS' in config_host
801 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
802endif
803dsound = not_found
804if 'CONFIG_AUDIO_DSOUND' in config_host
805 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
806endif
807coreaudio = not_found
808if 'CONFIG_AUDIO_COREAUDIO' in config_host
809 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
810endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400811opengl = not_found
812if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400813 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
814 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400815endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100816
Paolo Bonzini57612512021-06-03 11:15:26 +0200817gnutls = not_found
818if not get_option('gnutls').auto() or have_system
819 gnutls = dependency('gnutls', version: '>=3.5.18',
820 method: 'pkg-config',
821 required: get_option('gnutls'),
822 kwargs: static_kwargs)
823endif
824
825# Nettle has priority over gcrypt
826gcrypt = not_found
827nettle = not_found
828xts = 'private'
829if get_option('nettle').enabled() and get_option('gcrypt').enabled()
830 error('Only one of gcrypt & nettle can be enabled')
831elif (not get_option('nettle').auto() or have_system) and not get_option('gcrypt').enabled()
832 nettle = dependency('nettle', version: '>=3.4',
833 method: 'pkg-config',
834 required: get_option('nettle'),
835 kwargs: static_kwargs)
836 if nettle.found() and cc.has_header('nettle/xts.h', dependencies: nettle)
837 xts = 'nettle'
838 endif
839endif
840if (not get_option('gcrypt').auto() or have_system) and not nettle.found()
841 gcrypt = dependency('libgcrypt', version: '>=1.5',
842 method: 'config-tool',
843 required: get_option('gcrypt'),
844 kwargs: static_kwargs)
845 if gcrypt.found() and cc.compiles('''
846 #include <gcrypt.h>
847 int main(void) {
848 gcry_cipher_hd_t handle;
849 gcry_cipher_open(&handle, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_XTS, 0);
850 return 0;
851 }
852 ''', dependencies: gcrypt)
853 xts = 'gcrypt'
854 endif
855 # Debian has removed -lgpg-error from libgcrypt-config
856 # as it "spreads unnecessary dependencies" which in
857 # turn breaks static builds...
858 if gcrypt.found() and enable_static
859 gcrypt = declare_dependency(dependencies: [
860 gcrypt,
861 cc.find_library('gpg-error', required: true, kwargs: static_kwargs)])
862 endif
863endif
864
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400865gtk = not_found
Paolo Bonzini1b695472021-01-07 14:02:29 +0100866gtkx11 = not_found
Paolo Bonzinic1ec4942021-01-07 14:04:00 +0100867if not get_option('gtk').auto() or (have_system and not cocoa.found())
Paolo Bonzini1b695472021-01-07 14:02:29 +0100868 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
869 method: 'pkg-config',
870 required: get_option('gtk'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100871 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +0100872 if gtk.found()
873 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
874 method: 'pkg-config',
875 required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100876 kwargs: static_kwargs)
Paolo Bonzini1b695472021-01-07 14:02:29 +0100877 gtk = declare_dependency(dependencies: [gtk, gtkx11])
878 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400879endif
Paolo Bonzini1b695472021-01-07 14:02:29 +0100880
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400881vte = not_found
882if 'CONFIG_VTE' in config_host
883 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
884 link_args: config_host['VTE_LIBS'].split())
885endif
886x11 = not_found
Markus Armbruster9d49bcf2021-05-03 10:40:33 +0200887if gtkx11.found()
Paolo Bonzini1b695472021-01-07 14:02:29 +0100888 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100889 kwargs: static_kwargs)
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400890endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100891vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400892png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400893jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400894sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100895if get_option('vnc').enabled()
896 vnc = declare_dependency() # dummy dependency
897 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100898 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzini8e242b32020-11-23 13:34:02 -0500899 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100900 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100901 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
902 required: get_option('vnc_sasl'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100903 kwargs: static_kwargs)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100904 if sasl.found()
905 sasl = declare_dependency(dependencies: sasl,
906 compile_args: '-DSTRUCT_IOVEC_DEFINED')
907 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400908endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100909
Marc-André Lureau708eab42019-09-03 16:59:33 +0400910snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +0100911if not get_option('snappy').auto() or have_system
912 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
913 required: get_option('snappy'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100914 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400915endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100916if snappy.found() and not cc.links('''
917 #include <snappy-c.h>
918 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
919 snappy = not_found
920 if get_option('snappy').enabled()
921 error('could not link libsnappy')
922 else
923 warning('could not link libsnappy, disabling')
924 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400925endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100926
Marc-André Lureau708eab42019-09-03 16:59:33 +0400927lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100928if not get_option('lzo').auto() or have_system
929 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
930 required: get_option('lzo'),
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100931 kwargs: static_kwargs)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400932endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100933if lzo.found() and not cc.links('''
934 #include <lzo/lzo1x.h>
935 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
936 lzo = not_found
937 if get_option('lzo').enabled()
938 error('could not link liblzo2')
939 else
940 warning('could not link liblzo2, disabling')
941 endif
942endif
943
Marc-André Lureau55166232019-07-24 19:16:22 +0400944rdma = not_found
945if 'CONFIG_RDMA' in config_host
946 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
947endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400948numa = not_found
949if 'CONFIG_NUMA' in config_host
950 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
951endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400952xen = not_found
953if 'CONFIG_XEN_BACKEND' in config_host
954 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
955 link_args: config_host['XEN_LIBS'].split())
956endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200957cacard = not_found
958if 'CONFIG_SMARTCARD' in config_host
959 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
960 link_args: config_host['SMARTCARD_LIBS'].split())
961endif
César Belley0a40bcb2020-08-26 13:42:04 +0200962u2f = not_found
963if have_system
964 u2f = dependency('u2f-emu', required: get_option('u2f'),
965 method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100966 kwargs: static_kwargs)
César Belley0a40bcb2020-08-26 13:42:04 +0200967endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200968usbredir = not_found
969if 'CONFIG_USB_REDIR' in config_host
970 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
971 link_args: config_host['USB_REDIR_LIBS'].split())
972endif
973libusb = not_found
974if 'CONFIG_USB_LIBUSB' in config_host
975 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
976 link_args: config_host['LIBUSB_LIBS'].split())
977endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400978libpmem = not_found
979if 'CONFIG_LIBPMEM' in config_host
980 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
981 link_args: config_host['LIBPMEM_LIBS'].split())
982endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600983libdaxctl = not_found
984if 'CONFIG_LIBDAXCTL' in config_host
985 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
986endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +0400987tasn1 = not_found
Paolo Bonziniba7ed402021-06-03 11:15:26 +0200988if gnutls.found()
989 tasn1 = dependency('libtasn1',
990 method: 'pkg-config',
991 kwargs: static_kwargs)
Marc-André Lureau8ce0a452020-08-28 15:07:20 +0400992endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400993keyutils = dependency('libkeyutils', required: false,
Paolo Bonzinid7dedf42021-01-26 11:15:33 +0100994 method: 'pkg-config', kwargs: static_kwargs)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400995
Marc-André Lureau3909def2020-08-28 15:07:33 +0400996has_gettid = cc.has_function('gettid')
997
Paolo Bonziniaa087962020-09-01 11:15:30 -0400998# Malloc tests
999
1000malloc = []
1001if get_option('malloc') == 'system'
1002 has_malloc_trim = \
1003 not get_option('malloc_trim').disabled() and \
1004 cc.links('''#include <malloc.h>
1005 int main(void) { malloc_trim(0); return 0; }''')
1006else
1007 has_malloc_trim = false
1008 malloc = cc.find_library(get_option('malloc'), required: true)
1009endif
1010if not has_malloc_trim and get_option('malloc_trim').enabled()
1011 if get_option('malloc') == 'system'
1012 error('malloc_trim not available on this platform.')
1013 else
1014 error('malloc_trim not available with non-libc memory allocator')
1015 endif
1016endif
1017
Max Reitz84e319a2020-11-02 17:18:55 +01001018# Check whether the glibc provides statx()
1019
1020statx_test = '''
1021 #ifndef _GNU_SOURCE
1022 #define _GNU_SOURCE
1023 #endif
1024 #include <sys/stat.h>
1025 int main(void) {
1026 struct statx statxbuf;
1027 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
1028 return 0;
1029 }'''
1030
1031has_statx = cc.links(statx_test)
1032
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +00001033have_vhost_user_blk_server = (targetos == 'linux' and
1034 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001035
1036if get_option('vhost_user_blk_server').enabled()
1037 if targetos != 'linux'
1038 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +00001039 elif 'CONFIG_VHOST_USER' not in config_host
1040 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001041 endif
1042elif get_option('vhost_user_blk_server').disabled() or not have_system
1043 have_vhost_user_blk_server = false
1044endif
1045
Daniele Buono9e62ba42020-12-04 18:06:14 -05001046
Max Reitzdf4ea702020-10-27 20:05:46 +01001047if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
1048 error('Cannot enable fuse-lseek while fuse is disabled')
1049endif
1050
Max Reitza484a712020-10-27 20:05:41 +01001051fuse = dependency('fuse3', required: get_option('fuse'),
1052 version: '>=3.1', method: 'pkg-config',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001053 kwargs: static_kwargs)
Max Reitza484a712020-10-27 20:05:41 +01001054
Max Reitzdf4ea702020-10-27 20:05:46 +01001055fuse_lseek = not_found
1056if not get_option('fuse_lseek').disabled()
1057 if fuse.version().version_compare('>=3.8')
1058 # Dummy dependency
1059 fuse_lseek = declare_dependency()
1060 elif get_option('fuse_lseek').enabled()
1061 if fuse.found()
1062 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
1063 else
1064 error('fuse-lseek requires libfuse, which was not found')
1065 endif
1066 endif
1067endif
1068
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001069# libbpf
1070libbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config')
1071if libbpf.found() and not cc.links('''
1072 #include <bpf/libbpf.h>
1073 int main(void)
1074 {
1075 bpf_object__destroy_skeleton(NULL);
1076 return 0;
1077 }''', dependencies: libbpf)
1078 libbpf = not_found
1079 if get_option('bpf').enabled()
1080 error('libbpf skeleton test failed')
1081 else
1082 warning('libbpf skeleton test failed, disabling')
1083 endif
1084endif
1085
Daniele Buono9e62ba42020-12-04 18:06:14 -05001086if get_option('cfi')
1087 cfi_flags=[]
1088 # Check for dependency on LTO
1089 if not get_option('b_lto')
1090 error('Selected Control-Flow Integrity but LTO is disabled')
1091 endif
1092 if config_host.has_key('CONFIG_MODULES')
1093 error('Selected Control-Flow Integrity is not compatible with modules')
1094 endif
1095 # Check for cfi flags. CFI requires LTO so we can't use
1096 # get_supported_arguments, but need a more complex "compiles" which allows
1097 # custom arguments
1098 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
1099 args: ['-flto', '-fsanitize=cfi-icall'] )
1100 cfi_flags += '-fsanitize=cfi-icall'
1101 else
1102 error('-fsanitize=cfi-icall is not supported by the compiler')
1103 endif
1104 if cc.compiles('int main () { return 0; }',
1105 name: '-fsanitize-cfi-icall-generalize-pointers',
1106 args: ['-flto', '-fsanitize=cfi-icall',
1107 '-fsanitize-cfi-icall-generalize-pointers'] )
1108 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1109 else
1110 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1111 endif
1112 if get_option('cfi_debug')
1113 if cc.compiles('int main () { return 0; }',
1114 name: '-fno-sanitize-trap=cfi-icall',
1115 args: ['-flto', '-fsanitize=cfi-icall',
1116 '-fno-sanitize-trap=cfi-icall'] )
1117 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1118 else
1119 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1120 endif
1121 endif
Marc-André Lureau5fc06172021-01-14 16:56:02 +04001122 add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1123 add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
Daniele Buono9e62ba42020-12-04 18:06:14 -05001124endif
1125
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001126#################
1127# config-host.h #
1128#################
Paolo Bonzini859aef02020-08-04 18:14:26 +02001129
Paolo Bonzini69202b42020-11-17 14:46:21 +01001130have_virtfs = (targetos == 'linux' and
1131 have_system and
1132 libattr.found() and
1133 libcap_ng.found())
1134
Philippe Mathieu-Daudé3a489d32021-01-20 16:15:39 +01001135have_virtfs_proxy_helper = have_virtfs and have_tools
1136
Paolo Bonzini69202b42020-11-17 14:46:21 +01001137if get_option('virtfs').enabled()
1138 if not have_virtfs
1139 if targetos != 'linux'
1140 error('virtio-9p (virtfs) requires Linux')
1141 elif not libcap_ng.found() or not libattr.found()
1142 error('virtio-9p (virtfs) requires libcap-ng-devel and libattr-devel')
1143 elif not have_system
1144 error('virtio-9p (virtfs) needs system emulation support')
1145 endif
1146 endif
1147elif get_option('virtfs').disabled()
1148 have_virtfs = false
1149endif
1150
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001151config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1152config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1153config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1154config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1155config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
1156config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
1157config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1158config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1159config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1160config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1161config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1162config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1163
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001164config_host_data.set('CONFIG_ATTR', libattr.found())
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01001165config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -04001166config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinif01496a2020-09-16 17:54:14 +02001167config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01001168config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001169config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1170config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01001171config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +08001172config_host_data.set('CONFIG_CURSES', curses.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +01001173config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1174if glusterfs.found()
1175 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1176 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1177 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1178 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1179 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1180 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1181endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01001182config_host_data.set('CONFIG_GTK', gtk.found())
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01001183config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01001184config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001185config_host_data.set('CONFIG_EBPF', libbpf.found())
Paolo Bonzini9db405a2020-11-17 13:11:25 +01001186config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +01001187config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01001188config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001189config_host_data.set('CONFIG_SDL', sdl.found())
1190config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini90835c22020-11-17 14:22:24 +01001191config_host_data.set('CONFIG_SECCOMP', seccomp.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01001192config_host_data.set('CONFIG_SNAPPY', snappy.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001193config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001194config_host_data.set('CONFIG_VNC', vnc.found())
1195config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1196config_host_data.set('CONFIG_VNC_PNG', png.found())
1197config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Paolo Bonzini69202b42020-11-17 14:46:21 +01001198config_host_data.set('CONFIG_VIRTFS', have_virtfs)
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001199config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001200config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04001201config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini57612512021-06-03 11:15:26 +02001202config_host_data.set('CONFIG_GNUTLS', gnutls.found())
1203config_host_data.set('CONFIG_GCRYPT', gcrypt.found())
1204config_host_data.set('CONFIG_NETTLE', nettle.found())
1205config_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private')
Paolo Bonziniaa087962020-09-01 11:15:30 -04001206config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01001207config_host_data.set('CONFIG_STATX', has_statx)
Paolo Bonzinib1def332020-11-17 13:37:39 +01001208config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01001209config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01001210config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Paolo Bonzini9d710372021-01-07 13:54:22 +01001211config_host_data.set('CONFIG_X11', x11.found())
Daniele Buono9e62ba42020-12-04 18:06:14 -05001212config_host_data.set('CONFIG_CFI', get_option('cfi'))
Paolo Bonzini859aef02020-08-04 18:14:26 +02001213config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1214config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1215config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1216config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1217
Thomas Huth48f670e2020-11-18 18:10:52 +01001218config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001219config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001220config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001221config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001222config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Joelle van Dyne1ad27f72021-01-25 17:24:51 -08001223config_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>'))
Thomas Huthded5d782020-11-14 11:10:11 +01001224
Peter Maydell2b9f74e2021-01-26 15:58:46 +00001225config_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>'))
1226
Paolo Bonzini765686d2020-09-18 06:37:21 -04001227ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
Paolo Bonzini859aef02020-08-04 18:14:26 +02001228arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001229strings = ['HOST_DSOSUF', 'CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001230foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -04001231 if ignored.contains(k)
1232 # do nothing
1233 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001234 if v != ''
1235 v = '"' + '", "'.join(v.split()) + '", '
1236 endif
1237 config_host_data.set(k, v)
1238 elif k == 'ARCH'
1239 config_host_data.set('HOST_' + v.to_upper(), 1)
1240 elif strings.contains(k)
1241 if not k.startswith('CONFIG_')
1242 k = 'CONFIG_' + k.to_upper()
1243 endif
1244 config_host_data.set_quoted(k, v)
1245 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
1246 config_host_data.set(k, v == 'y' ? 1 : v)
1247 endif
1248endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02001249
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001250########################
1251# Target configuration #
1252########################
1253
Paolo Bonzini2becc362020-02-03 11:42:03 +01001254minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04001255config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001256config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001257config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001258config_devices_mak_list = []
1259config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02001260config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001261config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001262
1263disassemblers = {
1264 'alpha' : ['CONFIG_ALPHA_DIS'],
1265 'arm' : ['CONFIG_ARM_DIS'],
1266 'avr' : ['CONFIG_AVR_DIS'],
1267 'cris' : ['CONFIG_CRIS_DIS'],
Taylor Simpson3e7a84e2021-02-07 23:46:24 -06001268 'hexagon' : ['CONFIG_HEXAGON_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001269 'hppa' : ['CONFIG_HPPA_DIS'],
1270 'i386' : ['CONFIG_I386_DIS'],
1271 'x86_64' : ['CONFIG_I386_DIS'],
1272 'x32' : ['CONFIG_I386_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001273 'm68k' : ['CONFIG_M68K_DIS'],
1274 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1275 'mips' : ['CONFIG_MIPS_DIS'],
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001276 'nios2' : ['CONFIG_NIOS2_DIS'],
1277 'or1k' : ['CONFIG_OPENRISC_DIS'],
1278 'ppc' : ['CONFIG_PPC_DIS'],
1279 'riscv' : ['CONFIG_RISCV_DIS'],
1280 'rx' : ['CONFIG_RX_DIS'],
1281 's390' : ['CONFIG_S390_DIS'],
1282 'sh4' : ['CONFIG_SH4_DIS'],
1283 'sparc' : ['CONFIG_SPARC_DIS'],
1284 'xtensa' : ['CONFIG_XTENSA_DIS'],
1285}
1286if link_language == 'cpp'
1287 disassemblers += {
1288 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1289 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1290 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1291 }
1292endif
1293
Paolo Bonzini0a189112020-11-17 14:58:32 +01001294host_kconfig = \
1295 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
1296 ('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
1297 ('CONFIG_IVSHMEM' in config_host ? ['CONFIG_IVSHMEM=y'] : []) + \
1298 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
Paolo Bonzini9d710372021-01-07 13:54:22 +01001299 (x11.found() ? ['CONFIG_X11=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001300 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1301 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1302 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
Paolo Bonzini69202b42020-11-17 14:46:21 +01001303 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
Paolo Bonzini0a189112020-11-17 14:58:32 +01001304 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
Jagannathan Raman3090de62021-01-29 11:46:05 -05001305 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : []) + \
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01001306 (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : [])
Paolo Bonzini0a189112020-11-17 14:58:32 +01001307
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001308ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001309
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001310default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1311actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001312fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001313foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04001314 config_target = { 'TARGET_NAME': target.split('-')[0] }
1315 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001316 if targetos != 'linux'
1317 if default_targets
1318 continue
1319 endif
1320 error('Target @0@ is only available on a Linux host'.format(target))
1321 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001322 config_target += { 'CONFIG_LINUX_USER': 'y' }
1323 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001324 if 'CONFIG_BSD' not in config_host
1325 if default_targets
1326 continue
1327 endif
1328 error('Target @0@ is only available on a BSD host'.format(target))
1329 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001330 config_target += { 'CONFIG_BSD_USER': 'y' }
1331 elif target.endswith('softmmu')
1332 config_target += { 'CONFIG_SOFTMMU': 'y' }
1333 endif
1334 if target.endswith('-user')
1335 config_target += {
1336 'CONFIG_USER_ONLY': 'y',
1337 'CONFIG_QEMU_INTERP_PREFIX':
1338 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1339 }
1340 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001341
Paolo Bonzini0a189112020-11-17 14:58:32 +01001342 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04001343 foreach sym: accelerators
1344 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1345 config_target += { sym: 'y' }
1346 config_all += { sym: 'y' }
Paolo Bonzini23a77b22020-12-14 12:01:45 +01001347 if sym == 'CONFIG_TCG' and tcg_arch == 'tci'
1348 config_target += { 'CONFIG_TCG_INTERPRETER': 'y' }
1349 elif sym == 'CONFIG_XEN' and have_xen_pci_passthrough
Paolo Bonzini8a199802020-09-18 05:37:01 -04001350 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1351 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01001352 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04001353 endif
1354 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01001355 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001356 if default_targets
1357 continue
1358 endif
1359 error('No accelerator available for target @0@'.format(target))
1360 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001361
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001362 actual_target_dirs += target
Paolo Bonzini765686d2020-09-18 06:37:21 -04001363 config_target += keyval.load('default-configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001364 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001365
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001366 if 'TARGET_NEED_FDT' in config_target
1367 fdt_required += target
1368 endif
1369
Paolo Bonzinifa731682020-09-21 05:19:07 -04001370 # Add default keys
1371 if 'TARGET_BASE_ARCH' not in config_target
1372 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1373 endif
1374 if 'TARGET_ABI_DIR' not in config_target
1375 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1376 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001377
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001378 foreach k, v: disassemblers
1379 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1380 foreach sym: v
1381 config_target += { sym: 'y' }
1382 config_all_disas += { sym: 'y' }
1383 endforeach
1384 endif
1385 endforeach
1386
Paolo Bonzini859aef02020-08-04 18:14:26 +02001387 config_target_data = configuration_data()
1388 foreach k, v: config_target
1389 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1390 # do nothing
1391 elif ignored.contains(k)
1392 # do nothing
1393 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001394 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1395 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001396 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001397 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001398 config_target_data.set_quoted(k, v)
1399 elif v == 'y'
1400 config_target_data.set(k, 1)
1401 else
1402 config_target_data.set(k, v)
1403 endif
1404 endforeach
1405 config_target_h += {target: configure_file(output: target + '-config-target.h',
1406 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001407
1408 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001409 config_devices_mak = target + '-config-devices.mak'
1410 config_devices_mak = configure_file(
Paolo Bonzini1bb4cb12020-09-18 06:06:09 -04001411 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001412 output: config_devices_mak,
1413 depfile: config_devices_mak + '.d',
1414 capture: true,
Paolo Bonzini7bc3ca72020-11-20 08:38:22 +01001415 command: [minikconf,
1416 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
Paolo Bonzini2becc362020-02-03 11:42:03 +01001417 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzini0a189112020-11-17 14:58:32 +01001418 host_kconfig, accel_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02001419
1420 config_devices_data = configuration_data()
1421 config_devices = keyval.load(config_devices_mak)
1422 foreach k, v: config_devices
1423 config_devices_data.set(k, 1)
1424 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001425 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001426 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1427 configuration: config_devices_data)}
1428 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001429 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001430 endif
1431 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001432endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001433target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001434
Paolo Bonzini2becc362020-02-03 11:42:03 +01001435# This configuration is used to build files that are shared by
1436# multiple binaries, and then extracted out of the "common"
1437# static_library target.
1438#
1439# We do not use all_sources()/all_dependencies(), because it would
1440# build literally all source files, including devices only used by
1441# targets that are not built for this compilation. The CONFIG_ALL
1442# pseudo symbol replaces it.
1443
Paolo Bonzini05512f52020-09-16 15:31:11 -04001444config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001445config_all += config_host
1446config_all += config_all_disas
1447config_all += {
1448 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1449 'CONFIG_SOFTMMU': have_system,
1450 'CONFIG_USER_ONLY': have_user,
1451 'CONFIG_ALL': true,
1452}
1453
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001454##############
1455# Submodules #
1456##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001457
1458capstone = not_found
1459capstone_opt = get_option('capstone')
1460if capstone_opt in ['enabled', 'auto', 'system']
1461 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07001462 capstone = dependency('capstone', version: '>=4.0',
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001463 kwargs: static_kwargs, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001464 required: capstone_opt == 'system' or
1465 capstone_opt == 'enabled' and not have_internal)
1466 if capstone.found()
1467 capstone_opt = 'system'
1468 elif have_internal
1469 capstone_opt = 'internal'
1470 else
1471 capstone_opt = 'disabled'
1472 endif
1473endif
1474if capstone_opt == 'internal'
1475 capstone_data = configuration_data()
1476 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1477
1478 capstone_files = files(
1479 'capstone/cs.c',
1480 'capstone/MCInst.c',
1481 'capstone/MCInstrDesc.c',
1482 'capstone/MCRegisterInfo.c',
1483 'capstone/SStream.c',
1484 'capstone/utils.c'
1485 )
1486
1487 if 'CONFIG_ARM_DIS' in config_all_disas
1488 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1489 capstone_files += files(
1490 'capstone/arch/ARM/ARMDisassembler.c',
1491 'capstone/arch/ARM/ARMInstPrinter.c',
1492 'capstone/arch/ARM/ARMMapping.c',
1493 'capstone/arch/ARM/ARMModule.c'
1494 )
1495 endif
1496
1497 # FIXME: This config entry currently depends on a c++ compiler.
1498 # Which is needed for building libvixl, but not for capstone.
1499 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1500 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1501 capstone_files += files(
1502 'capstone/arch/AArch64/AArch64BaseInfo.c',
1503 'capstone/arch/AArch64/AArch64Disassembler.c',
1504 'capstone/arch/AArch64/AArch64InstPrinter.c',
1505 'capstone/arch/AArch64/AArch64Mapping.c',
1506 'capstone/arch/AArch64/AArch64Module.c'
1507 )
1508 endif
1509
1510 if 'CONFIG_PPC_DIS' in config_all_disas
1511 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1512 capstone_files += files(
1513 'capstone/arch/PowerPC/PPCDisassembler.c',
1514 'capstone/arch/PowerPC/PPCInstPrinter.c',
1515 'capstone/arch/PowerPC/PPCMapping.c',
1516 'capstone/arch/PowerPC/PPCModule.c'
1517 )
1518 endif
1519
Richard Henderson3d562842020-01-04 07:24:59 +10001520 if 'CONFIG_S390_DIS' in config_all_disas
1521 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1522 capstone_files += files(
1523 'capstone/arch/SystemZ/SystemZDisassembler.c',
1524 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1525 'capstone/arch/SystemZ/SystemZMapping.c',
1526 'capstone/arch/SystemZ/SystemZModule.c',
1527 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1528 )
1529 endif
1530
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001531 if 'CONFIG_I386_DIS' in config_all_disas
1532 capstone_data.set('CAPSTONE_HAS_X86', 1)
1533 capstone_files += files(
1534 'capstone/arch/X86/X86Disassembler.c',
1535 'capstone/arch/X86/X86DisassemblerDecoder.c',
1536 'capstone/arch/X86/X86ATTInstPrinter.c',
1537 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07001538 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001539 'capstone/arch/X86/X86Mapping.c',
1540 'capstone/arch/X86/X86Module.c'
1541 )
1542 endif
1543
1544 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1545
1546 capstone_cargs = [
1547 # FIXME: There does not seem to be a way to completely replace the c_args
1548 # that come from add_project_arguments() -- we can only add to them.
1549 # So: disable all warnings with a big hammer.
1550 '-Wno-error', '-w',
1551
1552 # Include all configuration defines via a header file, which will wind up
1553 # as a dependency on the object file, and thus changes here will result
1554 # in a rebuild.
1555 '-include', 'capstone-defs.h'
1556 ]
1557
1558 libcapstone = static_library('capstone',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001559 build_by_default: false,
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001560 sources: capstone_files,
1561 c_args: capstone_cargs,
1562 include_directories: 'capstone/include')
1563 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07001564 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001565endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001566
1567slirp = not_found
1568slirp_opt = 'disabled'
1569if have_system
1570 slirp_opt = get_option('slirp')
1571 if slirp_opt in ['enabled', 'auto', 'system']
1572 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001573 slirp = dependency('slirp', kwargs: static_kwargs,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001574 method: 'pkg-config',
1575 required: slirp_opt == 'system' or
1576 slirp_opt == 'enabled' and not have_internal)
1577 if slirp.found()
1578 slirp_opt = 'system'
1579 elif have_internal
1580 slirp_opt = 'internal'
1581 else
1582 slirp_opt = 'disabled'
1583 endif
1584 endif
1585 if slirp_opt == 'internal'
1586 slirp_deps = []
1587 if targetos == 'windows'
1588 slirp_deps = cc.find_library('iphlpapi')
1589 endif
1590 slirp_conf = configuration_data()
1591 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1592 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1593 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1594 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1595 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1596 slirp_files = [
1597 'slirp/src/arp_table.c',
1598 'slirp/src/bootp.c',
1599 'slirp/src/cksum.c',
1600 'slirp/src/dhcpv6.c',
1601 'slirp/src/dnssearch.c',
1602 'slirp/src/if.c',
1603 'slirp/src/ip6_icmp.c',
1604 'slirp/src/ip6_input.c',
1605 'slirp/src/ip6_output.c',
1606 'slirp/src/ip_icmp.c',
1607 'slirp/src/ip_input.c',
1608 'slirp/src/ip_output.c',
1609 'slirp/src/mbuf.c',
1610 'slirp/src/misc.c',
1611 'slirp/src/ncsi.c',
1612 'slirp/src/ndp_table.c',
1613 'slirp/src/sbuf.c',
1614 'slirp/src/slirp.c',
1615 'slirp/src/socket.c',
1616 'slirp/src/state.c',
1617 'slirp/src/stream.c',
1618 'slirp/src/tcp_input.c',
1619 'slirp/src/tcp_output.c',
1620 'slirp/src/tcp_subr.c',
1621 'slirp/src/tcp_timer.c',
1622 'slirp/src/tftp.c',
1623 'slirp/src/udp.c',
1624 'slirp/src/udp6.c',
1625 'slirp/src/util.c',
1626 'slirp/src/version.c',
1627 'slirp/src/vmstate.c',
1628 ]
1629
1630 configure_file(
1631 input : 'slirp/src/libslirp-version.h.in',
1632 output : 'libslirp-version.h',
1633 configuration: slirp_conf)
1634
1635 slirp_inc = include_directories('slirp', 'slirp/src')
1636 libslirp = static_library('slirp',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001637 build_by_default: false,
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001638 sources: slirp_files,
1639 c_args: slirp_cargs,
1640 include_directories: slirp_inc)
1641 slirp = declare_dependency(link_with: libslirp,
1642 dependencies: slirp_deps,
1643 include_directories: slirp_inc)
1644 endif
1645endif
1646
Daniele Buonoc7153432021-03-03 21:59:38 -05001647# For CFI, we need to compile slirp as a static library together with qemu.
1648# This is because we register slirp functions as callbacks for QEMU Timers.
1649# When using a system-wide shared libslirp, the type information for the
1650# callback is missing and the timer call produces a false positive with CFI.
1651#
1652# Now that slirp_opt has been defined, check if the selected slirp is compatible
1653# with control-flow integrity.
1654if get_option('cfi') and slirp_opt == 'system'
1655 error('Control-Flow Integrity is not compatible with system-wide slirp.' \
1656 + ' Please configure with --enable-slirp=git')
1657endif
1658
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001659fdt = not_found
1660fdt_opt = get_option('fdt')
1661if have_system
1662 if fdt_opt in ['enabled', 'auto', 'system']
1663 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
Paolo Bonzinid7dedf42021-01-26 11:15:33 +01001664 fdt = cc.find_library('fdt', kwargs: static_kwargs,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001665 required: fdt_opt == 'system' or
1666 fdt_opt == 'enabled' and not have_internal)
1667 if fdt.found() and cc.links('''
1668 #include <libfdt.h>
1669 #include <libfdt_env.h>
1670 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1671 dependencies: fdt)
1672 fdt_opt = 'system'
1673 elif have_internal
1674 fdt_opt = 'internal'
1675 else
1676 fdt_opt = 'disabled'
1677 endif
1678 endif
1679 if fdt_opt == 'internal'
1680 fdt_files = files(
1681 'dtc/libfdt/fdt.c',
1682 'dtc/libfdt/fdt_ro.c',
1683 'dtc/libfdt/fdt_wip.c',
1684 'dtc/libfdt/fdt_sw.c',
1685 'dtc/libfdt/fdt_rw.c',
1686 'dtc/libfdt/fdt_strerror.c',
1687 'dtc/libfdt/fdt_empty_tree.c',
1688 'dtc/libfdt/fdt_addresses.c',
1689 'dtc/libfdt/fdt_overlay.c',
1690 'dtc/libfdt/fdt_check.c',
1691 )
1692
1693 fdt_inc = include_directories('dtc/libfdt')
1694 libfdt = static_library('fdt',
Philippe Mathieu-Daudé610e7e02021-01-22 21:44:33 +01001695 build_by_default: false,
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001696 sources: fdt_files,
1697 include_directories: fdt_inc)
1698 fdt = declare_dependency(link_with: libfdt,
1699 include_directories: fdt_inc)
1700 endif
1701endif
1702if not fdt.found() and fdt_required.length() > 0
1703 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1704endif
1705
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001706config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001707config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001708config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001709
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001710#####################
1711# Generated sources #
1712#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001713
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001714genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001715
Marc-André Lureau3f885652019-07-15 18:06:04 +04001716hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04001717shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001718qapi_gen = find_program('scripts/qapi-gen.py')
1719qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1720 meson.source_root() / 'scripts/qapi/commands.py',
1721 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001722 meson.source_root() / 'scripts/qapi/error.py',
1723 meson.source_root() / 'scripts/qapi/events.py',
1724 meson.source_root() / 'scripts/qapi/expr.py',
1725 meson.source_root() / 'scripts/qapi/gen.py',
1726 meson.source_root() / 'scripts/qapi/introspect.py',
1727 meson.source_root() / 'scripts/qapi/parser.py',
1728 meson.source_root() / 'scripts/qapi/schema.py',
1729 meson.source_root() / 'scripts/qapi/source.py',
1730 meson.source_root() / 'scripts/qapi/types.py',
1731 meson.source_root() / 'scripts/qapi/visit.py',
1732 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001733 meson.source_root() / 'scripts/qapi-gen.py'
1734]
1735
1736tracetool = [
1737 python, files('scripts/tracetool.py'),
1738 '--backend=' + config_host['TRACE_BACKENDS']
1739]
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00001740tracetool_depends = files(
1741 'scripts/tracetool/backend/log.py',
1742 'scripts/tracetool/backend/__init__.py',
1743 'scripts/tracetool/backend/dtrace.py',
1744 'scripts/tracetool/backend/ftrace.py',
1745 'scripts/tracetool/backend/simple.py',
1746 'scripts/tracetool/backend/syslog.py',
1747 'scripts/tracetool/backend/ust.py',
1748 'scripts/tracetool/format/tcg_h.py',
1749 'scripts/tracetool/format/ust_events_c.py',
1750 'scripts/tracetool/format/ust_events_h.py',
1751 'scripts/tracetool/format/__init__.py',
1752 'scripts/tracetool/format/d.py',
1753 'scripts/tracetool/format/tcg_helper_c.py',
1754 'scripts/tracetool/format/simpletrace_stap.py',
1755 'scripts/tracetool/format/c.py',
1756 'scripts/tracetool/format/h.py',
1757 'scripts/tracetool/format/tcg_helper_h.py',
1758 'scripts/tracetool/format/log_stap.py',
1759 'scripts/tracetool/format/stap.py',
1760 'scripts/tracetool/format/tcg_helper_wrapper_h.py',
1761 'scripts/tracetool/__init__.py',
1762 'scripts/tracetool/transform.py',
1763 'scripts/tracetool/vcpu.py'
1764)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001765
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001766qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1767 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02001768 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001769qemu_version = custom_target('qemu-version.h',
1770 output: 'qemu-version.h',
1771 command: qemu_version_cmd,
1772 capture: true,
1773 build_by_default: true,
1774 build_always_stale: true)
1775genh += qemu_version
1776
Marc-André Lureau3f885652019-07-15 18:06:04 +04001777hxdep = []
1778hx_headers = [
1779 ['qemu-options.hx', 'qemu-options.def'],
1780 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1781]
1782if have_system
1783 hx_headers += [
1784 ['hmp-commands.hx', 'hmp-commands.h'],
1785 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1786 ]
1787endif
1788foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001789 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04001790 input: files(d[0]),
1791 output: d[1],
1792 capture: true,
1793 build_by_default: true, # to be removed when added to a target
1794 command: [hxtool, '-h', '@INPUT0@'])
1795endforeach
1796genh += hxdep
1797
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001798###################
1799# Collect sources #
1800###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001801
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001802authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001803blockdev_ss = ss.source_set()
1804block_ss = ss.source_set()
1805bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001806chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001807common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001808crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001809io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001810linux_user_ss = ss.source_set()
1811qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001812qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001813softmmu_ss = ss.source_set()
1814specific_fuzz_ss = ss.source_set()
1815specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001816stub_ss = ss.source_set()
1817trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001818user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001819util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001820
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001821modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001822hw_arch = {}
1823target_arch = {}
1824target_softmmu_arch = {}
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02001825target_user_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001826
1827###############
1828# Trace files #
1829###############
1830
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001831# TODO: add each directory to the subdirs from its own meson.build, once
1832# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001833trace_events_subdirs = [
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001834 'crypto',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01001835 'qapi',
1836 'qom',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001837 'monitor',
Philippe Mathieu-Daudé69ff4d02021-01-22 21:44:35 +01001838 'util',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001839]
1840if have_user
1841 trace_events_subdirs += [ 'linux-user' ]
1842endif
1843if have_block
1844 trace_events_subdirs += [
1845 'authz',
1846 'block',
1847 'io',
1848 'nbd',
1849 'scsi',
1850 ]
1851endif
1852if have_system
1853 trace_events_subdirs += [
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01001854 'accel/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001855 'audio',
1856 'backends',
1857 'backends/tpm',
1858 'chardev',
Andrew Melnychenko46627f42021-05-14 14:48:32 +03001859 'ebpf',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001860 'hw/9pfs',
1861 'hw/acpi',
Hao Wu77c05b02021-01-08 11:09:42 -08001862 'hw/adc',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001863 'hw/alpha',
1864 'hw/arm',
1865 'hw/audio',
1866 'hw/block',
1867 'hw/block/dataplane',
1868 'hw/char',
1869 'hw/display',
1870 'hw/dma',
1871 'hw/hppa',
1872 'hw/hyperv',
1873 'hw/i2c',
1874 'hw/i386',
1875 'hw/i386/xen',
1876 'hw/ide',
1877 'hw/input',
1878 'hw/intc',
1879 'hw/isa',
1880 'hw/mem',
1881 'hw/mips',
1882 'hw/misc',
1883 'hw/misc/macio',
1884 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08001885 'hw/net/can',
Klaus Jensen88eea452021-04-14 22:14:30 +02001886 'hw/nvme',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001887 'hw/nvram',
1888 'hw/pci',
1889 'hw/pci-host',
1890 'hw/ppc',
1891 'hw/rdma',
1892 'hw/rdma/vmw',
1893 'hw/rtc',
1894 'hw/s390x',
1895 'hw/scsi',
1896 'hw/sd',
1897 'hw/sparc',
1898 'hw/sparc64',
1899 'hw/ssi',
1900 'hw/timer',
1901 'hw/tpm',
1902 'hw/usb',
1903 'hw/vfio',
1904 'hw/virtio',
1905 'hw/watchdog',
1906 'hw/xen',
1907 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001908 'migration',
1909 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02001910 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001911 'ui',
Elena Ufimtsevaad22c302021-01-29 11:46:10 -05001912 'hw/remote',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001913 ]
1914endif
Philippe Mathieu-Daudé8985db22021-01-22 21:44:36 +01001915if have_system or have_user
1916 trace_events_subdirs += [
1917 'accel/tcg',
1918 'hw/core',
1919 'target/arm',
1920 'target/hppa',
1921 'target/i386',
1922 'target/i386/kvm',
1923 'target/mips',
1924 'target/ppc',
1925 'target/riscv',
1926 'target/s390x',
1927 'target/sparc',
1928 ]
1929endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001930
Marc-André Lureau0df750e2020-11-25 14:06:37 +04001931vhost_user = not_found
1932if 'CONFIG_VHOST_USER' in config_host
1933 libvhost_user = subproject('libvhost-user')
1934 vhost_user = libvhost_user.get_variable('vhost_user_dep')
1935endif
1936
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001937subdir('qapi')
1938subdir('qobject')
1939subdir('stubs')
1940subdir('trace')
1941subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04001942subdir('qom')
1943subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001944subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04001945subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001946
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001947
1948if enable_modules
1949 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1950 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1951endif
1952
Paolo Bonzini2becc362020-02-03 11:42:03 +01001953stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001954
1955util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01001956util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001957libqemuutil = static_library('qemuutil',
1958 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonzini7fa1c632021-06-01 10:00:48 +02001959 dependencies: [util_ss.dependencies(), libm, glib, socket, malloc, pixman])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001960qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04001961 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001962
Philippe Mathieu-Daudé957b31f2021-01-22 21:44:37 +01001963if have_system or have_user
1964 decodetree = generator(find_program('scripts/decodetree.py'),
1965 output: 'decode-@BASENAME@.c.inc',
1966 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1967 subdir('libdecnumber')
1968 subdir('target')
1969endif
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001970
Paolo Bonzini478e9432020-08-17 12:47:55 +02001971subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04001972subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04001973subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001974subdir('fsdev')
Marc-André Lureau708eab42019-09-03 16:59:33 +04001975subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001976
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01001977if have_block
1978 block_ss.add(files(
1979 'block.c',
1980 'blockjob.c',
1981 'job.c',
1982 'qemu-io-cmds.c',
1983 ))
1984 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001985
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01001986 subdir('nbd')
1987 subdir('scsi')
1988 subdir('block')
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001989
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01001990 blockdev_ss.add(files(
1991 'blockdev.c',
1992 'blockdev-nbd.c',
1993 'iothread.c',
1994 'job-qmp.c',
1995 ), gnutls)
Paolo Bonzini4a963372020-08-03 16:22:28 +02001996
Philippe Mathieu-Daudéf285bd32021-01-22 21:44:34 +01001997 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1998 # os-win32.c does not
1999 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
2000 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
2001endif
Paolo Bonzini4a963372020-08-03 16:22:28 +02002002
2003common_ss.add(files('cpus-common.c'))
2004
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02002005subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002006
Richard Hendersonf3433462020-09-12 10:47:33 -07002007common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02002008specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002009
Richard Henderson44b99a62021-03-22 12:24:26 +01002010# Work around a gcc bug/misfeature wherein constant propagation looks
2011# through an alias:
2012# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696
2013# to guess that a const variable is always zero. Without lto, this is
2014# impossible, as the alias is restricted to page-vary-common.c. Indeed,
2015# without lto, not even the alias is required -- we simply use different
2016# declarations in different compilation units.
2017pagevary = files('page-vary-common.c')
2018if get_option('b_lto')
2019 pagevary_flags = ['-fno-lto']
2020 if get_option('cfi')
2021 pagevary_flags += '-fno-sanitize=cfi-icall'
2022 endif
2023 pagevary = static_library('page-vary-common', sources: pagevary,
2024 c_args: pagevary_flags)
2025 pagevary = declare_dependency(link_with: pagevary)
2026endif
2027common_ss.add(pagevary)
Richard Henderson6670d4d2021-03-22 12:24:24 +01002028specific_ss.add(files('page-vary.c'))
2029
Marc-André Lureauab318052019-07-24 19:23:16 +04002030subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04002031subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04002032subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002033subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04002034subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04002035subdir('replay')
Philippe Mathieu-Daudé8df9f0c2021-03-05 13:54:50 +00002036subdir('semihosting')
Marc-André Lureau582ea952019-08-15 15:15:32 +04002037subdir('hw')
Richard Henderson104cc2c2021-03-08 12:04:33 -08002038subdir('tcg')
Richard Hendersonc6347542021-03-08 12:15:06 -08002039subdir('fpu')
Marc-André Lureau1a828782019-08-18 16:13:08 +04002040subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002041subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04002042subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04002043subdir('linux-user')
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002044subdir('ebpf')
2045
2046common_ss.add(libbpf)
Marc-André Lureau3a304462019-08-18 16:13:08 +04002047
Marc-André Lureaub309c322019-08-18 19:20:37 +04002048bsd_user_ss.add(files('gdbstub.c'))
2049specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
2050
Marc-André Lureau3a304462019-08-18 16:13:08 +04002051linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
2052specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02002053
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002054# needed for fuzzing binaries
2055subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002056subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02002057
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002058########################
2059# Library dependencies #
2060########################
2061
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002062block_mods = []
2063softmmu_mods = []
2064foreach d, list : modules
2065 foreach m, module_ss : list
2066 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02002067 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002068 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
2069 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
2070 if d == 'block'
2071 block_mods += sl
2072 else
2073 softmmu_mods += sl
2074 endif
2075 else
2076 if d == 'block'
2077 block_ss.add_all(module_ss)
2078 else
2079 softmmu_ss.add_all(module_ss)
2080 endif
2081 endif
2082 endforeach
2083endforeach
2084
2085nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08002086undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002087block_syms = custom_target('block.syms', output: 'block.syms',
2088 input: [libqemuutil, block_mods],
2089 capture: true,
2090 command: [undefsym, nm, '@INPUT@'])
2091qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
2092 input: [libqemuutil, softmmu_mods],
2093 capture: true,
2094 command: [undefsym, nm, '@INPUT@'])
2095
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02002096qom_ss = qom_ss.apply(config_host, strict: false)
2097libqom = static_library('qom', qom_ss.sources() + genh,
2098 dependencies: [qom_ss.dependencies()],
2099 name_suffix: 'fa')
2100
2101qom = declare_dependency(link_whole: libqom)
2102
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02002103authz_ss = authz_ss.apply(config_host, strict: false)
2104libauthz = static_library('authz', authz_ss.sources() + genh,
2105 dependencies: [authz_ss.dependencies()],
2106 name_suffix: 'fa',
2107 build_by_default: false)
2108
2109authz = declare_dependency(link_whole: libauthz,
2110 dependencies: qom)
2111
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02002112crypto_ss = crypto_ss.apply(config_host, strict: false)
2113libcrypto = static_library('crypto', crypto_ss.sources() + genh,
2114 dependencies: [crypto_ss.dependencies()],
2115 name_suffix: 'fa',
2116 build_by_default: false)
2117
2118crypto = declare_dependency(link_whole: libcrypto,
2119 dependencies: [authz, qom])
2120
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02002121io_ss = io_ss.apply(config_host, strict: false)
2122libio = static_library('io', io_ss.sources() + genh,
2123 dependencies: [io_ss.dependencies()],
2124 link_with: libqemuutil,
2125 name_suffix: 'fa',
2126 build_by_default: false)
2127
2128io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
2129
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02002130libmigration = static_library('migration', sources: migration_files + genh,
2131 name_suffix: 'fa',
2132 build_by_default: false)
2133migration = declare_dependency(link_with: libmigration,
2134 dependencies: [zlib, qom, io])
2135softmmu_ss.add(migration)
2136
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002137block_ss = block_ss.apply(config_host, strict: false)
2138libblock = static_library('block', block_ss.sources() + genh,
2139 dependencies: block_ss.dependencies(),
2140 link_depends: block_syms,
2141 name_suffix: 'fa',
2142 build_by_default: false)
2143
2144block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002145 link_args: '@block.syms',
2146 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04002147
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002148blockdev_ss = blockdev_ss.apply(config_host, strict: false)
2149libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
2150 dependencies: blockdev_ss.dependencies(),
2151 name_suffix: 'fa',
2152 build_by_default: false)
2153
2154blockdev = declare_dependency(link_whole: [libblockdev],
2155 dependencies: [block])
2156
Paolo Bonziniff219dc2020-08-04 21:14:26 +02002157qmp_ss = qmp_ss.apply(config_host, strict: false)
2158libqmp = static_library('qmp', qmp_ss.sources() + genh,
2159 dependencies: qmp_ss.dependencies(),
2160 name_suffix: 'fa',
2161 build_by_default: false)
2162
2163qmp = declare_dependency(link_whole: [libqmp])
2164
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002165libchardev = static_library('chardev', chardev_ss.sources() + genh,
2166 name_suffix: 'fa',
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002167 dependencies: [gnutls],
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02002168 build_by_default: false)
2169
2170chardev = declare_dependency(link_whole: libchardev)
2171
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02002172libhwcore = static_library('hwcore', sources: hwcore_files + genh,
2173 name_suffix: 'fa',
2174 build_by_default: false)
2175hwcore = declare_dependency(link_whole: libhwcore)
2176common_ss.add(hwcore)
2177
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02002178###########
2179# Targets #
2180###########
2181
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002182foreach m : block_mods + softmmu_mods
2183 shared_module(m.name(),
2184 name_prefix: '',
2185 link_whole: m,
2186 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002187 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04002188endforeach
2189
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01002190softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002191common_ss.add(qom, qemuutil)
2192
2193common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01002194common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
2195
2196common_all = common_ss.apply(config_all, strict: false)
2197common_all = static_library('common',
2198 build_by_default: false,
2199 sources: common_all.sources() + genh,
Katsuhiro Ueno75eebe02021-04-29 11:43:07 +09002200 implicit_include_directories: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002201 dependencies: common_all.dependencies(),
2202 name_suffix: 'fa')
2203
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002204feature_to_c = find_program('scripts/feature_to_c.sh')
2205
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002206emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01002207foreach target : target_dirs
2208 config_target = config_target_mak[target]
2209 target_name = config_target['TARGET_NAME']
2210 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02002211 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002212 arch_deps = []
2213 c_args = ['-DNEED_CPU_H',
2214 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2215 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04002216 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01002217
Paolo Bonzini859aef02020-08-04 18:14:26 +02002218 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01002219 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2220 if targetos == 'linux'
2221 target_inc += include_directories('linux-headers', is_system: true)
2222 endif
2223 if target.endswith('-softmmu')
2224 qemu_target_name = 'qemu-system-' + target_name
2225 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002226 t = target_softmmu_arch[arch].apply(config_target, strict: false)
2227 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002228 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002229
Marc-André Lureau2c442202019-08-17 13:55:58 +04002230 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
2231 hw = hw_arch[hw_dir].apply(config_target, strict: false)
2232 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002233 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04002234
Paolo Bonzini2becc362020-02-03 11:42:03 +01002235 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002236 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002237 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04002238 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01002239 target_type='user'
2240 qemu_target_name = 'qemu-' + target_name
Philippe Mathieu-Daudé46369b52021-04-13 11:27:09 +02002241 if arch in target_user_arch
2242 t = target_user_arch[arch].apply(config_target, strict: false)
2243 arch_srcs += t.sources()
2244 arch_deps += t.dependencies()
2245 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002246 if 'CONFIG_LINUX_USER' in config_target
2247 base_dir = 'linux-user'
2248 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
2249 else
2250 base_dir = 'bsd-user'
Stacey Sonea1ab4c2020-12-18 13:54:50 -07002251 target_inc += include_directories('bsd-user/freebsd')
Paolo Bonzini2becc362020-02-03 11:42:03 +01002252 endif
2253 target_inc += include_directories(
2254 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04002255 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002256 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04002257 if 'CONFIG_LINUX_USER' in config_target
2258 dir = base_dir / abi
2259 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
2260 if config_target.has_key('TARGET_SYSTBL_ABI')
2261 arch_srcs += \
2262 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
2263 extra_args : config_target['TARGET_SYSTBL_ABI'])
2264 endif
2265 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01002266 endif
2267
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04002268 if 'TARGET_XML_FILES' in config_target
2269 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
2270 output: target + '-gdbstub-xml.c',
2271 input: files(config_target['TARGET_XML_FILES'].split()),
2272 command: [feature_to_c, '@INPUT@'],
2273 capture: true)
2274 arch_srcs += gdbstub_xml
2275 endif
2276
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002277 t = target_arch[arch].apply(config_target, strict: false)
2278 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002279 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002280
Paolo Bonzini2becc362020-02-03 11:42:03 +01002281 target_common = common_ss.apply(config_target, strict: false)
2282 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002283 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002284
Paolo Bonzini2becc362020-02-03 11:42:03 +01002285 target_specific = specific_ss.apply(config_target, strict: false)
2286 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002287 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002288
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002289 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02002290 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002291 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002292 objects: objects,
2293 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002294 c_args: c_args,
2295 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002296 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002297
2298 if target.endswith('-softmmu')
2299 execs = [{
2300 'name': 'qemu-system-' + target_name,
2301 'gui': false,
2302 'sources': files('softmmu/main.c'),
2303 'dependencies': []
2304 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002305 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002306 execs += [{
2307 'name': 'qemu-system-' + target_name + 'w',
2308 'gui': true,
2309 'sources': files('softmmu/main.c'),
2310 'dependencies': []
2311 }]
2312 endif
2313 if config_host.has_key('CONFIG_FUZZ')
2314 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
2315 execs += [{
2316 'name': 'qemu-fuzz-' + target_name,
2317 'gui': false,
2318 'sources': specific_fuzz.sources(),
2319 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002320 }]
2321 endif
2322 else
2323 execs = [{
2324 'name': 'qemu-' + target_name,
2325 'gui': false,
2326 'sources': [],
2327 'dependencies': []
2328 }]
2329 endif
2330 foreach exe: execs
Alexander Graf8a74ce62021-01-20 23:44:34 +01002331 exe_name = exe['name']
2332 exe_sign = 'CONFIG_HVF' in config_target
2333 if exe_sign
2334 exe_name += '-unsigned'
2335 endif
2336
2337 emulator = executable(exe_name, exe['sources'],
Akihiko Odaki237377a2021-02-25 09:06:14 +09002338 install: true,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002339 c_args: c_args,
2340 dependencies: arch_deps + deps + exe['dependencies'],
2341 objects: lib.extract_all_objects(recursive: true),
2342 link_language: link_language,
2343 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
2344 link_args: link_args,
2345 gui_app: exe['gui'])
Alexander Graf8a74ce62021-01-20 23:44:34 +01002346
2347 if exe_sign
2348 emulators += {exe['name'] : custom_target(exe['name'],
Alexander Graf8a74ce62021-01-20 23:44:34 +01002349 depends: emulator,
2350 output: exe['name'],
2351 command: [
2352 meson.current_source_dir() / 'scripts/entitlement.sh',
2353 meson.current_build_dir() / exe_name,
2354 meson.current_build_dir() / exe['name'],
2355 meson.current_source_dir() / 'accel/hvf/entitlements.plist'
2356 ])
2357 }
Akihiko Odaki237377a2021-02-25 09:06:14 +09002358
2359 meson.add_install_script('scripts/entitlement.sh', '--install',
2360 get_option('bindir') / exe_name,
2361 get_option('bindir') / exe['name'],
2362 meson.current_source_dir() / 'accel/hvf/entitlements.plist')
Alexander Graf8a74ce62021-01-20 23:44:34 +01002363 else
2364 emulators += {exe['name']: emulator}
2365 endif
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002366
2367 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
2368 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002369 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
2370 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002371 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
2372 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
2373 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002374 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002375 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002376 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002377 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002378 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002379 command: [
2380 tracetool, '--group=all', '--format=' + stp['fmt'],
2381 '--binary=' + stp['bin'],
2382 '--target-name=' + target_name,
2383 '--target-type=' + target_type,
2384 '--probe-prefix=qemu.' + target_type + '.' + target_name,
Stefan Hajnoczic05012a2020-08-27 15:29:12 +01002385 '@INPUT@', '@OUTPUT@'
Stefan Hajnoczi0572d6c2021-01-25 11:09:58 +00002386 ],
2387 depend_files: tracetool_depends)
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002388 endforeach
2389 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002390 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002391endforeach
2392
Paolo Bonzini931049b2020-02-05 09:44:24 +01002393# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002394
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002395if 'CONFIG_PLUGIN' in config_host
2396 install_headers('include/qemu/qemu-plugin.h')
2397endif
2398
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002399if 'CONFIG_GUEST_AGENT' in config_host
2400 subdir('qga')
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002401elif get_option('guest_agent_msi').enabled()
2402 error('Guest agent MSI requested, but the guest agent is not being built')
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002403endif
2404
Laurent Vivier9755c942020-08-24 17:24:30 +02002405# Don't build qemu-keymap if xkbcommon is not explicitly enabled
2406# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002407if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04002408 # used for the update-keymaps target, so include rules even if !have_tools
2409 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
2410 dependencies: [qemuutil, xkbcommon], install: have_tools)
2411endif
2412
Paolo Bonzini931049b2020-02-05 09:44:24 +01002413if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002414 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
2415 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
2416 qemu_io = executable('qemu-io', files('qemu-io.c'),
2417 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01002418 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Roman Bolshakov3eacf702021-01-02 15:52:13 +03002419 dependencies: [blockdev, qemuutil, gnutls], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002420
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02002421 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002422 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04002423 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002424
Marc-André Lureau157e7b12019-07-15 14:50:58 +04002425 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
2426 dependencies: qemuutil,
2427 install: true)
2428
Paolo Bonzini931049b2020-02-05 09:44:24 +01002429 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02002430 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002431 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04002432 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02002433 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01002434 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002435
2436 if targetos == 'linux'
2437 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2438 dependencies: [qemuutil, libcap_ng],
2439 install: true,
2440 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002441
2442 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2443 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002444 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002445 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002446 endif
2447
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04002448 if 'CONFIG_IVSHMEM' in config_host
2449 subdir('contrib/ivshmem-client')
2450 subdir('contrib/ivshmem-server')
2451 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01002452endif
2453
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04002454subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002455subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04002456subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02002457subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08002458subdir('tests')
Paolo Bonzini1b695472021-01-07 14:02:29 +01002459if gtk.found()
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04002460 subdir('po')
2461endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002462
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002463if host_machine.system() == 'windows'
2464 nsis_cmd = [
2465 find_program('scripts/nsis.py'),
2466 '@OUTPUT@',
2467 get_option('prefix'),
2468 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01002469 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002470 '--',
2471 '-DDISPLAYVERSION=' + meson.project_version(),
2472 ]
2473 if build_docs
2474 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2475 endif
Paolo Bonzini1b695472021-01-07 14:02:29 +01002476 if gtk.found()
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002477 nsis_cmd += '-DCONFIG_GTK=y'
2478 endif
2479
2480 nsis = custom_target('nsis',
2481 output: 'qemu-setup-' + meson.project_version() + '.exe',
2482 input: files('qemu.nsi'),
2483 build_always_stale: true,
2484 command: nsis_cmd + ['@INPUT@'])
2485 alias_target('installer', nsis)
2486endif
2487
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002488#########################
2489# Configuration summary #
2490#########################
2491
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002492# Directories
Paolo Bonzinif9332752020-02-03 13:28:38 +01002493summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002494summary_info += {'Install prefix': get_option('prefix')}
2495summary_info += {'BIOS directory': qemu_datadir}
2496summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2497summary_info += {'binary directory': get_option('bindir')}
2498summary_info += {'library directory': get_option('libdir')}
2499summary_info += {'module directory': qemu_moddir}
2500summary_info += {'libexec directory': get_option('libexecdir')}
2501summary_info += {'include directory': get_option('includedir')}
2502summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002503if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002504 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04002505 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002506else
2507 summary_info += {'local state directory': 'queried at runtime'}
2508endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04002509summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002510summary_info += {'Build directory': meson.current_build_dir()}
2511summary_info += {'Source path': meson.current_source_dir()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002512summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002513summary(summary_info, bool_yn: true, section: 'Directories')
2514
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002515# Host binaries
Philippe Mathieu-Daudé983d0a72021-01-21 10:56:09 +01002516summary_info = {}
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002517summary_info += {'git': config_host['GIT']}
2518summary_info += {'make': config_host['MAKE']}
2519summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
2520summary_info += {'sphinx-build': sphinx_build.found()}
2521if config_host.has_key('HAVE_GDB_BIN')
2522 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2523endif
2524summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2525if targetos == 'windows' and config_host.has_key('CONFIG_GUEST_AGENT')
2526 summary_info += {'wixl': wixl.found() ? wixl.full_path() : false}
2527endif
Joelle van Dyneb8e0c492021-03-15 11:03:41 -07002528if slirp_opt != 'disabled' and 'CONFIG_SLIRP_SMBD' in config_host
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002529 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2530endif
2531summary(summary_info, bool_yn: true, section: 'Host binaries')
2532
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01002533# Configurable features
2534summary_info = {}
2535summary_info += {'Documentation': build_docs}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002536summary_info += {'system-mode emulation': have_system}
2537summary_info += {'user-mode emulation': have_user}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002538summary_info += {'block layer': have_block}
Philippe Mathieu-Daudé1d718862021-01-21 10:56:11 +01002539summary_info += {'Install blobs': get_option('install_blobs')}
2540summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2541if config_host.has_key('CONFIG_MODULES')
2542 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2543endif
2544summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2545summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2546if have_system
2547 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2548endif
2549summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2550if config_host['TRACE_BACKENDS'].split().contains('simple')
2551 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2552endif
2553summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2554summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
2555summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2556summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2557summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2558summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
2559summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
2560summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
2561summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2562summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2563summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2564summary(summary_info, bool_yn: true, section: 'Configurable features')
2565
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002566# Compilation information
Philippe Mathieu-Daudée11a0e12021-01-21 10:56:10 +01002567summary_info = {}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002568summary_info += {'host CPU': cpu}
2569summary_info += {'host endianness': build_machine.endian()}
Alex Bennée63de9352021-05-27 17:03:15 +01002570summary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())}
2571summary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002572if link_language == 'cpp'
Alex Bennée63de9352021-05-27 17:03:15 +01002573 summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002574else
2575 summary_info += {'C++ compiler': false}
2576endif
2577if targetos == 'darwin'
Alex Bennée63de9352021-05-27 17:03:15 +01002578 summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002579endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002580if targetos == 'windows'
2581 if 'WIN_SDK' in config_host
2582 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2583 endif
2584endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002585summary_info += {'ARFLAGS': config_host['ARFLAGS']}
Paolo Bonzini47b30832020-09-23 05:26:17 -04002586summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2587 + ['-O' + get_option('optimization')]
2588 + (get_option('debug') ? ['-g'] : []))}
2589if link_language == 'cpp'
2590 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2591 + ['-O' + get_option('optimization')]
2592 + (get_option('debug') ? ['-g'] : []))}
2593endif
2594link_args = get_option(link_language + '_link_args')
2595if link_args.length() > 0
2596 summary_info += {'LDFLAGS': ' '.join(link_args)}
2597endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002598summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2599summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002600summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05002601summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002602summary_info += {'PIE': get_option('b_pie')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02002603summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002604summary_info += {'malloc trim support': has_malloc_trim}
2605summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002606summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2607summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2608summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2609summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
2610summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2611summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2612summary_info += {'memory allocator': get_option('malloc')}
2613summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2614summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2615summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
2616summary_info += {'gcov': get_option('b_coverage')}
2617summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2618summary_info += {'CFI support': get_option('cfi')}
2619if get_option('cfi')
2620 summary_info += {'CFI debug support': get_option('cfi_debug')}
2621endif
2622summary_info += {'strip binaries': get_option('strip')}
2623summary_info += {'sparse': sparse.found() ? sparse.full_path() : false}
2624summary_info += {'mingw32 support': targetos == 'windows'}
Alex Bennée49e85652021-02-22 10:14:50 +00002625
2626# snarf the cross-compilation information for tests
2627foreach target: target_dirs
2628 tcg_mak = meson.current_build_dir() / 'tests/tcg' / 'config-' + target + '.mak'
2629 if fs.exists(tcg_mak)
2630 config_cross_tcg = keyval.load(tcg_mak)
2631 target = config_cross_tcg['TARGET_NAME']
2632 compiler = ''
2633 if 'DOCKER_CROSS_CC_GUEST' in config_cross_tcg
2634 summary_info += {target + ' tests': config_cross_tcg['DOCKER_CROSS_CC_GUEST'] +
2635 ' via ' + config_cross_tcg['DOCKER_IMAGE']}
2636 elif 'CROSS_CC_GUEST' in config_cross_tcg
2637 summary_info += {target + ' tests'
2638 : config_cross_tcg['CROSS_CC_GUEST'] }
2639 endif
2640 endif
2641endforeach
2642
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002643summary(summary_info, bool_yn: true, section: 'Compilation')
2644
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002645# Targets and accelerators
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002646summary_info = {}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002647if have_system
2648 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2649 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2650 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2651 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
Reinoud Zandijk74a414a2021-04-02 22:25:32 +02002652 summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002653 summary_info += {'Xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2654 if config_host.has_key('CONFIG_XEN_BACKEND')
2655 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2656 endif
2657endif
2658summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2659if config_all.has_key('CONFIG_TCG')
Philippe Mathieu-Daudé39687ac2021-01-25 15:45:29 +01002660 if get_option('tcg_interpreter')
2661 summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, experimental and slow)'}
2662 else
2663 summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
2664 endif
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002665 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002666endif
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002667summary_info += {'target list': ' '.join(target_dirs)}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002668if have_system
2669 summary_info += {'default devices': get_option('default_devices')}
Paolo Bonzini106ad1f2021-02-17 16:24:25 +01002670 summary_info += {'out of process emulation': multiprocess_allowed}
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002671endif
2672summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
2673
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002674# Block layer
2675summary_info = {}
2676summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2677summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2678if have_block
2679 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2680 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
2681 summary_info += {'VirtFS support': have_virtfs}
2682 summary_info += {'build virtiofs daemon': have_virtiofsd}
2683 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
2684 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2685 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2686 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2687 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2688 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2689 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2690 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2691 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2692 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
Philippe Mathieu-Daudé813803a2021-01-21 10:56:14 +01002693 summary_info += {'FUSE exports': fuse.found()}
2694endif
2695summary(summary_info, bool_yn: true, section: 'Block layer support')
2696
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002697# Crypto
Philippe Mathieu-Daudéaa3ca632021-01-21 10:56:13 +01002698summary_info = {}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002699summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
Paolo Bonzini57612512021-06-03 11:15:26 +02002700summary_info += {'GNUTLS support': gnutls.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002701# TODO: add back version
Paolo Bonzini57612512021-06-03 11:15:26 +02002702summary_info += {'libgcrypt': gcrypt.found()}
2703if gcrypt.found()
2704 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002705endif
2706# TODO: add back version
Paolo Bonzini57612512021-06-03 11:15:26 +02002707summary_info += {'nettle': nettle.found()}
2708if nettle.found()
2709 summary_info += {' XTS': xts != 'private'}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002710endif
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002711summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
2712summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2713summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
2714summary(summary_info, bool_yn: true, section: 'Crypto')
2715
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01002716# Libraries
Philippe Mathieu-Daudéaa580282021-01-21 10:56:15 +01002717summary_info = {}
2718if targetos == 'darwin'
2719 summary_info += {'Cocoa support': cocoa.found()}
2720endif
2721# TODO: add back version
2722summary_info += {'SDL support': sdl.found()}
2723summary_info += {'SDL image support': sdl_image.found()}
2724# TODO: add back version
2725summary_info += {'GTK support': gtk.found()}
2726summary_info += {'pixman': pixman.found()}
2727# TODO: add back version
2728summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
Philippe Mathieu-Daudé2e864b82021-01-21 10:56:12 +01002729# TODO: add back version
2730summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
Paolo Bonziniba7ed402021-06-03 11:15:26 +02002731summary_info += {'libtasn1': tasn1.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002732summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
Yonggang Luo5285e592020-10-13 07:43:48 +08002733summary_info += {'iconv support': iconv.found()}
2734summary_info += {'curses support': curses.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002735# TODO: add back version
2736summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002737summary_info += {'curl support': curl.found()}
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002738summary_info += {'Multipath support': mpathpersist.found()}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002739summary_info += {'VNC support': vnc.found()}
2740if vnc.found()
2741 summary_info += {'VNC SASL support': sasl.found()}
2742 summary_info += {'VNC JPEG support': jpeg.found()}
2743 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002744endif
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002745summary_info += {'brlapi support': brlapi.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002746summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2747summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2748summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2749summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
Paolo Bonzinif7f2d652020-11-17 14:45:24 +01002750summary_info += {'ATTR/XATTR support': libattr.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002751summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2752summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002753summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzini727c8bb2020-11-17 14:46:58 +01002754summary_info += {'libcap-ng support': libcap_ng.found()}
Andrew Melnychenko46627f42021-05-14 14:48:32 +03002755summary_info += {'bpf support': libbpf.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002756# TODO: add back protocol and server version
2757summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002758summary_info += {'rbd support': rbd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002759summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
2760summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02002761summary_info += {'U2F support': u2f.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002762summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
2763summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
2764summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
Akihiko Odakibc6a3562021-02-23 15:03:07 +09002765summary_info += {'GBM': config_host.has_key('CONFIG_GBM')}
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002766summary_info += {'libiscsi support': libiscsi.found()}
Paolo Bonzini30045c02020-11-17 13:11:25 +01002767summary_info += {'libnfs support': libnfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002768if targetos == 'windows'
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002769 if config_host.has_key('CONFIG_GUEST_AGENT')
2770 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2771 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Paolo Bonzinib846ab72021-01-21 11:49:04 +01002772 endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002773endif
Paolo Bonzini90835c22020-11-17 14:22:24 +01002774summary_info += {'seccomp support': seccomp.found()}
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002775summary_info += {'GlusterFS support': glusterfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002776summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2777summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002778summary_info += {'lzo support': lzo.found()}
Paolo Bonzini241611e2020-11-17 13:32:34 +01002779summary_info += {'snappy support': snappy.found()}
Paolo Bonzini29ba6112020-11-17 13:07:52 +01002780summary_info += {'bzip2 support': libbzip2.found()}
Paolo Bonziniecea3692020-11-17 13:35:28 +01002781summary_info += {'lzfse support': liblzfse.found()}
Paolo Bonzinib1def332020-11-17 13:37:39 +01002782summary_info += {'zstd support': zstd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002783summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2784summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002785summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002786summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2787summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002788summary_info += {'libudev': libudev.found()}
Max Reitzdf4ea702020-10-27 20:05:46 +01002789summary_info += {'FUSE lseek': fuse_lseek.found()}
Philippe Mathieu-Daudé69a78cc2021-01-21 10:56:16 +01002790summary(summary_info, bool_yn: true, section: 'Dependencies')
Paolo Bonzinif9332752020-02-03 13:28:38 +01002791
2792if not supported_cpus.contains(cpu)
2793 message()
2794 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2795 message()
2796 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2797 message('The QEMU project intends to remove support for this host CPU in')
2798 message('a future release if nobody volunteers to maintain it and to')
2799 message('provide a build host for our continuous integration setup.')
2800 message('configure has succeeded and you can continue to build, but')
2801 message('if you care about QEMU on this platform you should contact')
2802 message('us upstream at qemu-devel@nongnu.org.')
2803endif
2804
2805if not supported_oses.contains(targetos)
2806 message()
2807 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2808 message()
2809 message('Host OS ' + targetos + 'support is not currently maintained.')
2810 message('The QEMU project intends to remove support for this host OS in')
2811 message('a future release if nobody volunteers to maintain it and to')
2812 message('provide a build host for our continuous integration setup.')
2813 message('configure has succeeded and you can continue to build, but')
2814 message('if you care about QEMU on this platform you should contact')
2815 message('us upstream at qemu-devel@nongnu.org.')
2816endif