]> git.proxmox.com Git - mirror_qemu.git/blame - meson.build
target/mips: Convert Rel6 LLD/SCD opcodes to decodetree
[mirror_qemu.git] / meson.build
CommitLineData
a5665051 1project('qemu', ['c'], meson_version: '>=0.55.0',
a5cb7c5a
PB
2 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_colorout=auto'] +
3 (meson.version().version_compare('>=0.56.0') ? [ 'b_staticpic=false' ] : []),
a5665051
PB
4 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5
6not_found = dependency('', required: false)
b29b40f4
PB
7if meson.version().version_compare('>=0.56.0')
8 keyval = import('keyval')
9else
10 keyval = import('unstable-keyval')
11endif
a81df1b6 12ss = import('sourceset')
8b18cdbf 13fs = import('fs')
a81df1b6 14
ce1c1e7a 15sh = find_program('sh')
a81df1b6 16cc = meson.get_compiler('c')
a5665051 17config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
3154fee4 18enable_modules = 'CONFIG_MODULES' in config_host
35be72ba 19enable_static = 'CONFIG_STATIC' in config_host
e3667660
YL
20
21# Temporary directory used for files created while
22# configure runs. Since it is in the build directory
23# we can safely blow away any previous version of it
24# (and we need not jump through hoops to try to delete
25# it when configure exits.)
26tmpdir = meson.current_build_dir() / 'meson-private/temp'
8fe11232
MAL
27
28if get_option('qemu_suffix').startswith('/')
29 error('qemu_suffix cannot start with a /')
30endif
31
16bf7a33 32qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
ab4c0996 33qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
491e74c1 34qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
16bf7a33
PB
35qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
36
37qemu_desktopdir = get_option('datadir') / 'applications'
38qemu_icondir = get_option('datadir') / 'icons'
39
859aef02
PB
40config_host_data = configuration_data()
41genh = []
a5665051 42
760e4327
PB
43target_dirs = config_host['TARGET_DIRS'].split()
44have_user = false
45have_system = false
46foreach target : target_dirs
47 have_user = have_user or target.endswith('-user')
48 have_system = have_system or target.endswith('-softmmu')
49endforeach
50have_tools = 'CONFIG_TOOLS' in config_host
51have_block = have_system or have_tools
52
201e8ed7
PB
53python = import('python').find_installation()
54
55supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
6125673e 56supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
201e8ed7
PB
57 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
58
59cpu = host_machine.cpu_family()
60targetos = host_machine.system()
61
8a19980e
PB
62if cpu in ['x86', 'x86_64']
63 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
64elif cpu == 'aarch64'
65 kvm_targets = ['aarch64-softmmu']
66elif cpu == 's390x'
67 kvm_targets = ['s390x-softmmu']
68elif cpu in ['ppc', 'ppc64']
69 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
fbc5884c
HC
70elif cpu in ['mips', 'mips64']
71 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
8a19980e
PB
72else
73 kvm_targets = []
74endif
75
76accelerator_targets = { 'CONFIG_KVM': kvm_targets }
0c3e41d4
AB
77if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
78 # i368 emulator provides xenpv machine type for multiple architectures
79 accelerator_targets += {
80 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
81 }
82endif
8a19980e
PB
83if cpu in ['x86', 'x86_64']
84 accelerator_targets += {
85 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
8a19980e
PB
86 'CONFIG_HVF': ['x86_64-softmmu'],
87 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
88 }
89endif
90
201e8ed7
PB
91##################
92# Compiler flags #
93##################
94
ff9ed62b
AB
95# Specify linker-script with add_project_link_arguments so that it is not placed
96# within a linker --start-group/--end-group pair
97if 'CONFIG_FUZZ' in config_host
98 add_project_link_arguments(['-Wl,-T,',
99 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
100 native: false, language: ['c', 'cpp', 'objc'])
101endif
102
a5665051
PB
103add_project_arguments(config_host['QEMU_CFLAGS'].split(),
104 native: false, language: ['c', 'objc'])
105add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
106 native: false, language: 'cpp')
107add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
108 native: false, language: ['c', 'cpp', 'objc'])
a5665051 109
1e6e616d
PB
110if targetos == 'linux'
111 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
112 '-isystem', 'linux-headers',
113 language: ['c', 'cpp'])
114endif
115
116if 'CONFIG_TCG_INTERPRETER' in config_host
117 tcg_arch = 'tci'
118elif config_host['ARCH'] == 'sparc64'
119 tcg_arch = 'sparc'
120elif config_host['ARCH'] == 's390x'
121 tcg_arch = 's390'
122elif config_host['ARCH'] in ['x86_64', 'x32']
123 tcg_arch = 'i386'
124elif config_host['ARCH'] == 'ppc64'
125 tcg_arch = 'ppc'
126elif config_host['ARCH'] in ['riscv32', 'riscv64']
127 tcg_arch = 'riscv'
128else
129 tcg_arch = config_host['ARCH']
130endif
131add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
132 '-iquote', '.',
133 '-iquote', meson.current_source_dir(),
134 '-iquote', meson.current_source_dir() / 'accel/tcg',
135 '-iquote', meson.current_source_dir() / 'include',
136 '-iquote', meson.current_source_dir() / 'disas/libvixl',
137 language: ['c', 'cpp', 'objc'])
c46f76d1 138
fc929892
MAL
139link_language = meson.get_external_property('link_language', 'cpp')
140if link_language == 'cpp'
141 add_languages('cpp', required: true, native: false)
142endif
a5665051
PB
143if host_machine.system() == 'darwin'
144 add_languages('objc', required: false, native: false)
145endif
146
deb62371
PB
147sparse = find_program('cgcc', required: get_option('sparse'))
148if sparse.found()
968b4db3
PB
149 run_target('sparse',
150 command: [find_program('scripts/check_sparse.py'),
deb62371
PB
151 'compile_commands.json', sparse.full_path(), '-Wbitwise',
152 '-Wno-transparent-union', '-Wno-old-initializer',
153 '-Wno-non-pointer-null'])
968b4db3
PB
154endif
155
6ec0e15d
PB
156###########################################
157# Target-specific checks and dependencies #
158###########################################
159
160if targetos != 'linux' and get_option('mpath').enabled()
161 error('Multipath is supported only on Linux')
162endif
163
a81df1b6
PB
164m = cc.find_library('m', required: false)
165util = cc.find_library('util', required: false)
4a96337d 166winmm = []
a81df1b6 167socket = []
04c6f1e7 168version_res = []
d92989aa
MAL
169coref = []
170iokit = []
b6c7cfd4 171emulator_link_args = []
8a19980e 172hvf = not_found
a81df1b6
PB
173if targetos == 'windows'
174 socket = cc.find_library('ws2_32')
4a96337d 175 winmm = cc.find_library('winmm')
04c6f1e7
MAL
176
177 win = import('windows')
178 version_res = win.compile_resources('version.rc',
179 depend_files: files('pc-bios/qemu-nsis.ico'),
180 include_directories: include_directories('.'))
d92989aa
MAL
181elif targetos == 'darwin'
182 coref = dependency('appleframeworks', modules: 'CoreFoundation')
183 iokit = dependency('appleframeworks', modules: 'IOKit')
cfad62f1
PB
184elif targetos == 'sunos'
185 socket = [cc.find_library('socket'),
186 cc.find_library('nsl'),
187 cc.find_library('resolv')]
188elif targetos == 'haiku'
189 socket = [cc.find_library('posix_error_mapper'),
190 cc.find_library('network'),
191 cc.find_library('bsd')]
b6c7cfd4
PB
192elif targetos == 'openbsd'
193 if not get_option('tcg').disabled() and target_dirs.length() > 0
194 # Disable OpenBSD W^X if available
195 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
196 endif
a81df1b6 197endif
6ec0e15d 198
8a19980e
PB
199accelerators = []
200if not get_option('kvm').disabled() and targetos == 'linux'
201 accelerators += 'CONFIG_KVM'
202endif
203if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
204 accelerators += 'CONFIG_XEN'
205 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
206else
207 have_xen_pci_passthrough = false
208endif
209if not get_option('whpx').disabled() and targetos == 'windows'
57e2a1f8 210 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
8a19980e
PB
211 error('WHPX requires 64-bit host')
212 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
213 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
214 accelerators += 'CONFIG_WHPX'
215 endif
216endif
217if not get_option('hvf').disabled()
218 hvf = dependency('appleframeworks', modules: 'Hypervisor',
219 required: get_option('hvf'))
220 if hvf.found()
221 accelerators += 'CONFIG_HVF'
222 endif
223endif
224if not get_option('hax').disabled()
225 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
226 accelerators += 'CONFIG_HAX'
227 endif
228endif
229if not get_option('tcg').disabled()
230 if cpu not in supported_cpus
231 if 'CONFIG_TCG_INTERPRETER' in config_host
232 warning('Unsupported CPU @0@, will use TCG with TCI (experimental)'.format(cpu))
233 else
234 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
235 endif
236 endif
237 accelerators += 'CONFIG_TCG'
238 config_host += { 'CONFIG_TCG': 'y' }
239endif
240
241if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
242 error('KVM not available on this platform')
243endif
244if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
245 error('HVF not available on this platform')
246endif
247if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
248 error('WHPX not available on this platform')
249endif
250if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
251 if 'CONFIG_XEN' in accelerators
252 error('Xen PCI passthrough not available on this platform')
253 else
254 error('Xen PCI passthrough requested but Xen not enabled')
255 endif
256endif
b4e312e9 257
6ec0e15d
PB
258################
259# Dependencies #
260################
261
215b0c2f
PB
262# The path to glib.h is added to all compilation commands. This was
263# grandfathered in from the QEMU Makefiles.
264add_project_arguments(config_host['GLIB_CFLAGS'].split(),
265 native: false, language: ['c', 'cpp', 'objc'])
953d5a9e
MAL
266glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
267 link_args: config_host['GLIB_LIBS'].split())
268# override glib dep with the configure results (for subprojects)
269meson.override_dependency('glib-2.0', glib)
270
a81df1b6
PB
271gio = not_found
272if 'CONFIG_GIO' in config_host
273 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
274 link_args: config_host['GIO_LIBS'].split())
275endif
276lttng = not_found
277if 'CONFIG_TRACE_UST' in config_host
278 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
279endif
280urcubp = not_found
281if 'CONFIG_TRACE_UST' in config_host
282 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
283endif
46859d93
DB
284gcrypt = not_found
285if 'CONFIG_GCRYPT' in config_host
286 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
287 link_args: config_host['GCRYPT_LIBS'].split())
288endif
a81df1b6
PB
289nettle = not_found
290if 'CONFIG_NETTLE' in config_host
291 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
292 link_args: config_host['NETTLE_LIBS'].split())
293endif
294gnutls = not_found
295if 'CONFIG_GNUTLS' in config_host
296 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
297 link_args: config_host['GNUTLS_LIBS'].split())
298endif
b7612f45
PB
299pixman = not_found
300if have_system or have_tools
301 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
1a94933f 302 method: 'pkg-config', static: enable_static)
b7612f45 303endif
5e7fbd25
MAL
304pam = not_found
305if 'CONFIG_AUTH_PAM' in config_host
306 pam = cc.find_library('pam')
307endif
5e5733e5 308libaio = cc.find_library('aio', required: false)
1ffb3bbb 309zlib = dependency('zlib', required: true, static: enable_static)
5e5733e5
MAL
310linux_io_uring = not_found
311if 'CONFIG_LINUX_IO_URING' in config_host
312 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
313 link_args: config_host['LINUX_IO_URING_LIBS'].split())
314endif
315libxml2 = not_found
316if 'CONFIG_LIBXML2' in config_host
317 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
318 link_args: config_host['LIBXML2_LIBS'].split())
319endif
320libnfs = not_found
30045c05
PB
321if not get_option('libnfs').auto() or have_block
322 libnfs = dependency('libnfs', version: '>=1.9.3',
323 required: get_option('libnfs'),
324 method: 'pkg-config', static: enable_static)
5e5733e5 325endif
f7f2d651
PB
326
327libattr_test = '''
328 #include <stddef.h>
329 #include <sys/types.h>
330 #ifdef CONFIG_LIBATTR
331 #include <attr/xattr.h>
332 #else
333 #include <sys/xattr.h>
334 #endif
335 int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }'''
336
ec0d5893 337libattr = not_found
f7f2d651
PB
338have_old_libattr = false
339if not get_option('attr').disabled()
340 if cc.links(libattr_test)
341 libattr = declare_dependency()
342 else
343 libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'],
344 required: get_option('attr'),
345 static: enable_static)
346 if libattr.found() and not \
347 cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR')
348 libattr = not_found
349 if get_option('attr').enabled()
350 error('could not link libattr')
351 else
352 warning('could not link libattr, disabling')
353 endif
354 else
355 have_old_libattr = libattr.found()
356 endif
357 endif
ec0d5893 358endif
f7f2d651 359
c1ec4941
PB
360cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
361if cocoa.found() and get_option('sdl').enabled()
362 error('Cocoa and SDL cannot be enabled at the same time')
363endif
364if cocoa.found() and get_option('gtk').enabled()
365 error('Cocoa and GTK+ cannot be enabled at the same time')
366endif
367
3f99cf57 368seccomp = not_found
90835c2b
PB
369if not get_option('seccomp').auto() or have_system or have_tools
370 seccomp = dependency('libseccomp', version: '>=2.3.0',
371 required: get_option('seccomp'),
372 method: 'pkg-config', static: enable_static)
3f99cf57 373endif
727c8bb8 374
3f99cf57 375libcap_ng = not_found
727c8bb8
PB
376if not get_option('cap_ng').auto() or have_system or have_tools
377 libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'],
378 required: get_option('cap_ng'),
379 static: enable_static)
380endif
381if libcap_ng.found() and not cc.links('''
382 #include <cap-ng.h>
383 int main(void)
384 {
385 capng_capability_to_name(CAPNG_EFFECTIVE);
386 return 0;
387 }''', dependencies: libcap_ng)
388 libcap_ng = not_found
389 if get_option('cap_ng').enabled()
390 error('could not link libcap-ng')
391 else
392 warning('could not link libcap-ng, disabling')
393 endif
3f99cf57 394endif
727c8bb8 395
1917ec6d
PB
396if get_option('xkbcommon').auto() and not have_system and not have_tools
397 xkbcommon = not_found
398else
399 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
1a94933f 400 method: 'pkg-config', static: enable_static)
ade60d4f 401endif
cdaf0722
MAL
402vde = not_found
403if config_host.has_key('CONFIG_VDE')
404 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
405endif
478e943f
PB
406pulse = not_found
407if 'CONFIG_LIBPULSE' in config_host
408 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
409 link_args: config_host['PULSE_LIBS'].split())
410endif
411alsa = not_found
412if 'CONFIG_ALSA' in config_host
413 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
414 link_args: config_host['ALSA_LIBS'].split())
415endif
416jack = not_found
417if 'CONFIG_LIBJACK' in config_host
418 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
419endif
2634733c 420spice = not_found
d72c34cc 421spice_headers = not_found
2634733c
PB
422if 'CONFIG_SPICE' in config_host
423 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
424 link_args: config_host['SPICE_LIBS'].split())
d72c34cc 425 spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
2634733c 426endif
5ee24e78 427rt = cc.find_library('rt', required: false)
ccf7afa5
PB
428libdl = not_found
429if 'CONFIG_PLUGIN' in config_host
430 libdl = cc.find_library('dl', required: true)
431endif
99650b62 432libiscsi = not_found
9db405a3
PB
433if not get_option('libiscsi').auto() or have_block
434 libiscsi = dependency('libiscsi', version: '>=1.9.0',
435 required: get_option('libiscsi'),
436 method: 'pkg-config', static: enable_static)
99650b62 437endif
5e5733e5 438zstd = not_found
b1def33d
PB
439if not get_option('zstd').auto() or have_block
440 zstd = dependency('libzstd', version: '>=1.4.0',
441 required: get_option('zstd'),
442 method: 'pkg-config', static: enable_static)
5e5733e5 443endif
ea458960
MAL
444gbm = not_found
445if 'CONFIG_GBM' in config_host
446 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
447 link_args: config_host['GBM_LIBS'].split())
448endif
449virgl = not_found
450if 'CONFIG_VIRGL' in config_host
451 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
452 link_args: config_host['VIRGL_LIBS'].split())
453endif
1d7bb6ab 454curl = not_found
f9cd86fe
PB
455if not get_option('curl').auto() or have_block
456 curl = dependency('libcurl', version: '>=7.29.0',
457 method: 'pkg-config',
458 required: get_option('curl'),
459 static: enable_static)
1d7bb6ab 460endif
f15bff25 461libudev = not_found
f01496a3 462if targetos == 'linux' and (have_system or have_tools)
6ec0e15d 463 libudev = dependency('libudev',
a0fbbb6e 464 method: 'pkg-config',
5c53015a 465 required: get_option('libudev'),
6ec0e15d
PB
466 static: enable_static)
467endif
468
5c53015a 469mpathlibs = [libudev]
6ec0e15d
PB
470mpathpersist = not_found
471mpathpersist_new_api = false
472if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
473 mpath_test_source_new = '''
474 #include <libudev.h>
475 #include <mpath_persist.h>
476 unsigned mpath_mx_alloc_len = 1024;
477 int logsink;
478 static struct config *multipath_conf;
479 extern struct udev *udev;
480 extern struct config *get_multipath_config(void);
481 extern void put_multipath_config(struct config *conf);
482 struct udev *udev;
483 struct config *get_multipath_config(void) { return multipath_conf; }
484 void put_multipath_config(struct config *conf) { }
485 int main(void) {
486 udev = udev_new();
487 multipath_conf = mpath_lib_init();
488 return 0;
489 }'''
490 mpath_test_source_old = '''
491 #include <libudev.h>
492 #include <mpath_persist.h>
493 unsigned mpath_mx_alloc_len = 1024;
494 int logsink;
495 int main(void) {
496 struct udev *udev = udev_new();
497 mpath_lib_init(udev);
498 return 0;
499 }'''
5c53015a
PB
500 libmpathpersist = cc.find_library('mpathpersist',
501 required: get_option('mpath'),
502 static: enable_static)
503 if libmpathpersist.found()
504 mpathlibs += libmpathpersist
505 if enable_static
506 mpathlibs += cc.find_library('devmapper',
507 required: get_option('mpath'),
508 static: enable_static)
43b43a40 509 endif
5c53015a
PB
510 mpathlibs += cc.find_library('multipath',
511 required: get_option('mpath'),
512 static: enable_static)
513 foreach lib: mpathlibs
514 if not lib.found()
515 mpathlibs = []
516 break
517 endif
518 endforeach
519 if mpathlibs.length() == 0
520 msg = 'Dependencies missing for libmpathpersist'
521 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
6ec0e15d
PB
522 mpathpersist = declare_dependency(dependencies: mpathlibs)
523 mpathpersist_new_api = true
524 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
525 mpathpersist = declare_dependency(dependencies: mpathlibs)
526 else
5c53015a
PB
527 msg = 'Cannot detect libmpathpersist API'
528 endif
529 if not mpathpersist.found()
6ec0e15d 530 if get_option('mpath').enabled()
5c53015a 531 error(msg)
6ec0e15d 532 else
5c53015a 533 warning(msg + ', disabling')
6ec0e15d
PB
534 endif
535 endif
536 endif
f15bff25 537endif
6ec0e15d 538
5285e593 539iconv = not_found
5285e593 540curses = not_found
30fe76b1 541if have_system and not get_option('curses').disabled()
925a40df
PB
542 curses_test = '''
543 #include <locale.h>
544 #include <curses.h>
545 #include <wchar.h>
546 int main(void) {
547 wchar_t wch = L'w';
548 setlocale(LC_ALL, "");
549 resize_term(0, 0);
550 addwstr(L"wide chars\n");
551 addnwstr(&wch, 1);
552 add_wch(WACS_DEGREE);
553 return 0;
554 }'''
555
ca31e307
YL
556 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
557 foreach curses_dep : curses_dep_list
558 if not curses.found()
559 curses = dependency(curses_dep,
560 required: false,
561 method: 'pkg-config',
562 static: enable_static)
563 endif
564 endforeach
925a40df 565 msg = get_option('curses').enabled() ? 'curses library not found' : ''
0dbce6ef 566 curses_compile_args = ['-DNCURSES_WIDECHAR']
925a40df 567 if curses.found()
0dbce6ef
PB
568 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
569 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
925a40df
PB
570 else
571 msg = 'curses package not usable'
572 curses = not_found
5285e593
YL
573 endif
574 endif
925a40df 575 if not curses.found()
925a40df
PB
576 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
577 if targetos != 'windows' and not has_curses_h
578 message('Trying with /usr/include/ncursesw')
579 curses_compile_args += ['-I/usr/include/ncursesw']
580 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
581 endif
582 if has_curses_h
583 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
584 foreach curses_libname : curses_libname_list
5285e593
YL
585 libcurses = cc.find_library(curses_libname,
586 required: false,
5285e593 587 static: enable_static)
925a40df
PB
588 if libcurses.found()
589 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
590 curses = declare_dependency(compile_args: curses_compile_args,
591 dependencies: [libcurses])
592 break
593 else
594 msg = 'curses library not usable'
595 endif
5285e593 596 endif
925a40df
PB
597 endforeach
598 endif
599 endif
600 if not get_option('iconv').disabled()
601 foreach link_args : [ ['-liconv'], [] ]
602 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
603 # We need to use libiconv if available because mixing libiconv's headers with
604 # the system libc does not work.
605 # However, without adding glib to the dependencies -L/usr/local/lib will not be
606 # included in the command line and libiconv will not be found.
607 if cc.links('''
608 #include <iconv.h>
609 int main(void) {
610 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
611 return conv != (iconv_t) -1;
612 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
613 iconv = declare_dependency(link_args: link_args, dependencies: glib)
614 break
5285e593 615 endif
30fe76b1
PB
616 endforeach
617 endif
925a40df
PB
618 if curses.found() and not iconv.found()
619 if get_option('iconv').enabled()
620 error('iconv not available')
621 endif
622 msg = 'iconv required for curses UI but not available'
623 curses = not_found
624 endif
625 if not curses.found() and msg != ''
626 if get_option('curses').enabled()
627 error(msg)
30fe76b1 628 else
925a40df 629 warning(msg + ', disabling')
30fe76b1 630 endif
5285e593
YL
631 endif
632endif
633
2634733c 634brlapi = not_found
8c6d4ff4
PB
635if not get_option('brlapi').auto() or have_system
636 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
637 required: get_option('brlapi'),
638 static: enable_static)
639 if brlapi.found() and not cc.links('''
640 #include <brlapi.h>
641 #include <stddef.h>
642 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
643 brlapi = not_found
644 if get_option('brlapi').enabled()
645 error('could not link brlapi')
646 else
647 warning('could not link brlapi, disabling')
648 endif
649 endif
2634733c 650endif
35be72ba 651
760e4327 652sdl = not_found
c1ec4941 653if not get_option('sdl').auto() or (have_system and not cocoa.found())
363743da 654 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
760e4327
PB
655 sdl_image = not_found
656endif
35be72ba
PB
657if sdl.found()
658 # work around 2.0.8 bug
659 sdl = declare_dependency(compile_args: '-Wno-undef',
660 dependencies: sdl)
7161a433 661 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
1a94933f 662 method: 'pkg-config', static: enable_static)
35be72ba
PB
663else
664 if get_option('sdl_image').enabled()
a8dc2ace
ST
665 error('sdl-image required, but SDL was @0@'.format(
666 get_option('sdl').disabled() ? 'disabled' : 'not found'))
35be72ba
PB
667 endif
668 sdl_image = not_found
2634733c 669endif
35be72ba 670
5e5733e5 671rbd = not_found
fabd1e93
PB
672if not get_option('rbd').auto() or have_block
673 librados = cc.find_library('rados', required: get_option('rbd'),
674 static: enable_static)
675 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
676 required: get_option('rbd'),
677 static: enable_static)
678 if librados.found() and librbd.found() and cc.links('''
679 #include <stdio.h>
680 #include <rbd/librbd.h>
681 int main(void) {
682 rados_t cluster;
683 rados_create(&cluster, NULL);
684 return 0;
685 }''', dependencies: [librbd, librados])
686 rbd = declare_dependency(dependencies: [librbd, librados])
687 endif
5e5733e5 688endif
fabd1e93 689
5e5733e5 690glusterfs = not_found
08821ca2
PB
691glusterfs_ftruncate_has_stat = false
692glusterfs_iocb_has_stat = false
693if not get_option('glusterfs').auto() or have_block
694 glusterfs = dependency('glusterfs-api', version: '>=3',
695 required: get_option('glusterfs'),
696 method: 'pkg-config', static: enable_static)
697 if glusterfs.found()
698 glusterfs_ftruncate_has_stat = cc.links('''
699 #include <glusterfs/api/glfs.h>
700
701 int
702 main(void)
703 {
704 /* new glfs_ftruncate() passes two additional args */
705 return glfs_ftruncate(NULL, 0, NULL, NULL);
706 }
707 ''', dependencies: glusterfs)
708 glusterfs_iocb_has_stat = cc.links('''
709 #include <glusterfs/api/glfs.h>
710
711 /* new glfs_io_cbk() passes two additional glfs_stat structs */
712 static void
713 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
714 {}
715
716 int
717 main(void)
718 {
719 glfs_io_cbk iocb = &glusterfs_iocb;
720 iocb(NULL, 0 , NULL, NULL, NULL);
721 return 0;
722 }
723 ''', dependencies: glusterfs)
724 endif
5e5733e5
MAL
725endif
726libssh = not_found
727if 'CONFIG_LIBSSH' in config_host
728 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
729 link_args: config_host['LIBSSH_LIBS'].split())
730endif
731libbzip2 = not_found
29ba6116
PB
732if not get_option('bzip2').auto() or have_block
733 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
734 required: get_option('bzip2'),
735 static: enable_static)
736 if libbzip2.found() and not cc.links('''
737 #include <bzlib.h>
738 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
739 libbzip2 = not_found
740 if get_option('bzip2').enabled()
741 error('could not link libbzip2')
742 else
743 warning('could not link libbzip2, disabling')
744 endif
745 endif
5e5733e5 746endif
ecea3696 747
5e5733e5 748liblzfse = not_found
ecea3696
PB
749if not get_option('lzfse').auto() or have_block
750 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
751 required: get_option('lzfse'),
752 static: enable_static)
753endif
754if liblzfse.found() and not cc.links('''
755 #include <lzfse.h>
756 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
757 liblzfse = not_found
758 if get_option('lzfse').enabled()
759 error('could not link liblzfse')
760 else
761 warning('could not link liblzfse, disabling')
762 endif
5e5733e5 763endif
ecea3696 764
478e943f
PB
765oss = not_found
766if 'CONFIG_AUDIO_OSS' in config_host
767 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
768endif
769dsound = not_found
770if 'CONFIG_AUDIO_DSOUND' in config_host
771 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
772endif
773coreaudio = not_found
774if 'CONFIG_AUDIO_COREAUDIO' in config_host
775 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
2b1ccdf4
MAL
776endif
777opengl = not_found
778if 'CONFIG_OPENGL' in config_host
de2d3005
PB
779 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
780 link_args: config_host['OPENGL_LIBS'].split())
2b1ccdf4 781endif
1b695471 782
2b1ccdf4 783gtk = not_found
1b695471 784gtkx11 = not_found
c1ec4941 785if not get_option('gtk').auto() or (have_system and not cocoa.found())
1b695471
PB
786 gtk = dependency('gtk+-3.0', version: '>=3.22.0',
787 method: 'pkg-config',
788 required: get_option('gtk'),
789 static: enable_static)
790 if gtk.found()
791 gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0',
792 method: 'pkg-config',
793 required: false,
794 static: enable_static)
795 gtk = declare_dependency(dependencies: [gtk, gtkx11])
796 endif
2b1ccdf4 797endif
1b695471 798
2b1ccdf4
MAL
799vte = not_found
800if 'CONFIG_VTE' in config_host
801 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
802 link_args: config_host['VTE_LIBS'].split())
803endif
804x11 = not_found
1b695471
PB
805if gtkx11.found() or 'lm32-softmmu' in target_dirs
806 x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(),
9d71037f 807 static: enable_static)
2b1ccdf4 808endif
a0b93237 809vnc = not_found
2b1ccdf4 810png = not_found
2b1ccdf4 811jpeg = not_found
2b1ccdf4 812sasl = not_found
a0b93237
PB
813if get_option('vnc').enabled()
814 vnc = declare_dependency() # dummy dependency
815 png = dependency('libpng', required: get_option('vnc_png'),
1a94933f 816 method: 'pkg-config', static: enable_static)
8e242b3c
PB
817 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
818 method: 'pkg-config', static: enable_static)
a0b93237
PB
819 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
820 required: get_option('vnc_sasl'),
821 static: enable_static)
822 if sasl.found()
823 sasl = declare_dependency(dependencies: sasl,
824 compile_args: '-DSTRUCT_IOVEC_DEFINED')
825 endif
478e943f 826endif
241611ea 827
708eab42 828snappy = not_found
241611ea
PB
829if not get_option('snappy').auto() or have_system
830 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
831 required: get_option('snappy'),
832 static: enable_static)
833endif
834if snappy.found() and not cc.links('''
835 #include <snappy-c.h>
836 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
837 snappy = not_found
838 if get_option('snappy').enabled()
839 error('could not link libsnappy')
840 else
841 warning('could not link libsnappy, disabling')
842 endif
708eab42 843endif
0c32a0ae 844
708eab42 845lzo = not_found
0c32a0ae
PB
846if not get_option('lzo').auto() or have_system
847 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
848 required: get_option('lzo'),
849 static: enable_static)
850endif
851if lzo.found() and not cc.links('''
852 #include <lzo/lzo1x.h>
853 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
854 lzo = not_found
855 if get_option('lzo').enabled()
856 error('could not link liblzo2')
857 else
858 warning('could not link liblzo2, disabling')
859 endif
708eab42 860endif
0c32a0ae 861
55166230
MAL
862rdma = not_found
863if 'CONFIG_RDMA' in config_host
864 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
865endif
ab318051
MAL
866numa = not_found
867if 'CONFIG_NUMA' in config_host
868 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
869endif
582ea95f
MAL
870xen = not_found
871if 'CONFIG_XEN_BACKEND' in config_host
872 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
873 link_args: config_host['XEN_LIBS'].split())
874endif
06677ce1
PB
875cacard = not_found
876if 'CONFIG_SMARTCARD' in config_host
877 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
878 link_args: config_host['SMARTCARD_LIBS'].split())
879endif
0a40bcb7
CB
880u2f = not_found
881if have_system
882 u2f = dependency('u2f-emu', required: get_option('u2f'),
883 method: 'pkg-config',
884 static: enable_static)
885endif
06677ce1
PB
886usbredir = not_found
887if 'CONFIG_USB_REDIR' in config_host
888 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
889 link_args: config_host['USB_REDIR_LIBS'].split())
890endif
891libusb = not_found
892if 'CONFIG_USB_LIBUSB' in config_host
893 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
894 link_args: config_host['LIBUSB_LIBS'].split())
895endif
c9322ab5
MAL
896libpmem = not_found
897if 'CONFIG_LIBPMEM' in config_host
898 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
899 link_args: config_host['LIBPMEM_LIBS'].split())
900endif
c7c91a74
BR
901libdaxctl = not_found
902if 'CONFIG_LIBDAXCTL' in config_host
903 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
904endif
8ce0a45f
MAL
905tasn1 = not_found
906if 'CONFIG_TASN1' in config_host
907 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
908 link_args: config_host['TASN1_LIBS'].split())
909endif
af04e89d
MAL
910keyutils = dependency('libkeyutils', required: false,
911 method: 'pkg-config', static: enable_static)
a81df1b6 912
3909def8
MAL
913has_gettid = cc.has_function('gettid')
914
aa087962
PB
915# Malloc tests
916
917malloc = []
918if get_option('malloc') == 'system'
919 has_malloc_trim = \
920 not get_option('malloc_trim').disabled() and \
921 cc.links('''#include <malloc.h>
922 int main(void) { malloc_trim(0); return 0; }''')
923else
924 has_malloc_trim = false
925 malloc = cc.find_library(get_option('malloc'), required: true)
926endif
927if not has_malloc_trim and get_option('malloc_trim').enabled()
928 if get_option('malloc') == 'system'
929 error('malloc_trim not available on this platform.')
930 else
931 error('malloc_trim not available with non-libc memory allocator')
932 endif
933endif
934
84e319a5
HR
935# Check whether the glibc provides statx()
936
937statx_test = '''
938 #ifndef _GNU_SOURCE
939 #define _GNU_SOURCE
940 #endif
941 #include <sys/stat.h>
942 int main(void) {
943 struct statx statxbuf;
944 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
945 return 0;
946 }'''
947
948has_statx = cc.links(statx_test)
949
eb6a3886
SH
950have_vhost_user_blk_server = (targetos == 'linux' and
951 'CONFIG_VHOST_USER' in config_host)
e5e856c1
SH
952
953if get_option('vhost_user_blk_server').enabled()
954 if targetos != 'linux'
955 error('vhost_user_blk_server requires linux')
eb6a3886
SH
956 elif 'CONFIG_VHOST_USER' not in config_host
957 error('vhost_user_blk_server requires vhost-user support')
e5e856c1
SH
958 endif
959elif get_option('vhost_user_blk_server').disabled() or not have_system
960 have_vhost_user_blk_server = false
961endif
962
9e62ba48 963
df4ea709
HR
964if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
965 error('Cannot enable fuse-lseek while fuse is disabled')
966endif
967
a484a719
HR
968fuse = dependency('fuse3', required: get_option('fuse'),
969 version: '>=3.1', method: 'pkg-config',
970 static: enable_static)
971
df4ea709
HR
972fuse_lseek = not_found
973if not get_option('fuse_lseek').disabled()
974 if fuse.version().version_compare('>=3.8')
975 # Dummy dependency
976 fuse_lseek = declare_dependency()
977 elif get_option('fuse_lseek').enabled()
978 if fuse.found()
979 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
980 else
981 error('fuse-lseek requires libfuse, which was not found')
982 endif
983 endif
984endif
985
9e62ba48
DB
986if get_option('cfi')
987 cfi_flags=[]
988 # Check for dependency on LTO
989 if not get_option('b_lto')
990 error('Selected Control-Flow Integrity but LTO is disabled')
991 endif
992 if config_host.has_key('CONFIG_MODULES')
993 error('Selected Control-Flow Integrity is not compatible with modules')
994 endif
995 # Check for cfi flags. CFI requires LTO so we can't use
996 # get_supported_arguments, but need a more complex "compiles" which allows
997 # custom arguments
998 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
999 args: ['-flto', '-fsanitize=cfi-icall'] )
1000 cfi_flags += '-fsanitize=cfi-icall'
1001 else
1002 error('-fsanitize=cfi-icall is not supported by the compiler')
1003 endif
1004 if cc.compiles('int main () { return 0; }',
1005 name: '-fsanitize-cfi-icall-generalize-pointers',
1006 args: ['-flto', '-fsanitize=cfi-icall',
1007 '-fsanitize-cfi-icall-generalize-pointers'] )
1008 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
1009 else
1010 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
1011 endif
1012 if get_option('cfi_debug')
1013 if cc.compiles('int main () { return 0; }',
1014 name: '-fno-sanitize-trap=cfi-icall',
1015 args: ['-flto', '-fsanitize=cfi-icall',
1016 '-fno-sanitize-trap=cfi-icall'] )
1017 cfi_flags += '-fno-sanitize-trap=cfi-icall'
1018 else
1019 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
1020 endif
1021 endif
1022 add_project_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1023 add_project_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
1024endif
1025
a0c9162c
PB
1026#################
1027# config-host.h #
1028#################
859aef02 1029
69202b40
PB
1030have_virtfs = (targetos == 'linux' and
1031 have_system and
1032 libattr.found() and
1033 libcap_ng.found())
1034
1035if get_option('virtfs').enabled()
1036 if not have_virtfs
1037 if targetos != 'linux'
1038 error('virtio-9p (virtfs) requires Linux')
1039 elif not libcap_ng.found() or not libattr.found()
1040 error('virtio-9p (virtfs) requires libcap-ng-devel and libattr-devel')
1041 elif not have_system
1042 error('virtio-9p (virtfs) needs system emulation support')
1043 endif
1044 endif
1045elif get_option('virtfs').disabled()
1046 have_virtfs = false
1047endif
1048
16bf7a33
PB
1049config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
1050config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
1051config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
1052config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
1053config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
1054config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
1055config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
1056config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
1057config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
1058config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
1059config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
1060config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
1061
f7f2d651 1062config_host_data.set('CONFIG_ATTR', libattr.found())
8c6d4ff4 1063config_host_data.set('CONFIG_BRLAPI', brlapi.found())
b4e312e9 1064config_host_data.set('CONFIG_COCOA', cocoa.found())
f01496a3 1065config_host_data.set('CONFIG_LIBUDEV', libudev.found())
0c32a0ae 1066config_host_data.set('CONFIG_LZO', lzo.found())
6ec0e15d
PB
1067config_host_data.set('CONFIG_MPATH', mpathpersist.found())
1068config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
f9cd86fe 1069config_host_data.set('CONFIG_CURL', curl.found())
5285e593 1070config_host_data.set('CONFIG_CURSES', curses.found())
08821ca2
PB
1071config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
1072if glusterfs.found()
1073 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
1074 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
1075 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
1076 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
1077 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
1078 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
1079endif
1b695471 1080config_host_data.set('CONFIG_GTK', gtk.found())
f7f2d651 1081config_host_data.set('CONFIG_LIBATTR', have_old_libattr)
727c8bb8 1082config_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found())
9db405a3 1083config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
30045c05 1084config_host_data.set('CONFIG_LIBNFS', libnfs.found())
fabd1e93 1085config_host_data.set('CONFIG_RBD', rbd.found())
35be72ba
PB
1086config_host_data.set('CONFIG_SDL', sdl.found())
1087config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
90835c2b 1088config_host_data.set('CONFIG_SECCOMP', seccomp.found())
241611ea 1089config_host_data.set('CONFIG_SNAPPY', snappy.found())
e5e856c1 1090config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
a0b93237
PB
1091config_host_data.set('CONFIG_VNC', vnc.found())
1092config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1093config_host_data.set('CONFIG_VNC_PNG', png.found())
1094config_host_data.set('CONFIG_VNC_SASL', sasl.found())
69202b40 1095config_host_data.set('CONFIG_VIRTFS', have_virtfs)
4113f4cf 1096config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
af04e89d 1097config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
3909def8 1098config_host_data.set('CONFIG_GETTID', has_gettid)
aa087962 1099config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
84e319a5 1100config_host_data.set('CONFIG_STATX', has_statx)
b1def33d 1101config_host_data.set('CONFIG_ZSTD', zstd.found())
a484a719 1102config_host_data.set('CONFIG_FUSE', fuse.found())
df4ea709 1103config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
9d71037f 1104config_host_data.set('CONFIG_X11', x11.found())
9e62ba48 1105config_host_data.set('CONFIG_CFI', get_option('cfi'))
859aef02
PB
1106config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1107config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1108config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1109config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1110
48f670ec 1111config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
2964be52 1112config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
2802d91d 1113config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
ded5d78c 1114config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
4a9d5f89 1115config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
88c78f16 1116config_host_data.set('HAVE_SYS_SIGNAL_H', cc.has_header('sys/signal.h'))
ded5d78c 1117
765686d6 1118ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
859aef02 1119arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
16bf7a33 1120strings = ['HOST_DSOSUF', 'CONFIG_IASL']
859aef02 1121foreach k, v: config_host
765686d6
PB
1122 if ignored.contains(k)
1123 # do nothing
1124 elif arrays.contains(k)
859aef02
PB
1125 if v != ''
1126 v = '"' + '", "'.join(v.split()) + '", '
1127 endif
1128 config_host_data.set(k, v)
1129 elif k == 'ARCH'
1130 config_host_data.set('HOST_' + v.to_upper(), 1)
1131 elif strings.contains(k)
1132 if not k.startswith('CONFIG_')
1133 k = 'CONFIG_' + k.to_upper()
1134 endif
1135 config_host_data.set_quoted(k, v)
1136 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
1137 config_host_data.set(k, v == 'y' ? 1 : v)
1138 endif
1139endforeach
859aef02 1140
a0c9162c
PB
1141########################
1142# Target configuration #
1143########################
1144
2becc36a 1145minikconf = find_program('scripts/minikconf.py')
05512f55 1146config_all = {}
a98006bc 1147config_all_devices = {}
ca0fc784 1148config_all_disas = {}
2becc36a
PB
1149config_devices_mak_list = []
1150config_devices_h = {}
859aef02 1151config_target_h = {}
2becc36a 1152config_target_mak = {}
ca0fc784
PB
1153
1154disassemblers = {
1155 'alpha' : ['CONFIG_ALPHA_DIS'],
1156 'arm' : ['CONFIG_ARM_DIS'],
1157 'avr' : ['CONFIG_AVR_DIS'],
1158 'cris' : ['CONFIG_CRIS_DIS'],
1159 'hppa' : ['CONFIG_HPPA_DIS'],
1160 'i386' : ['CONFIG_I386_DIS'],
1161 'x86_64' : ['CONFIG_I386_DIS'],
1162 'x32' : ['CONFIG_I386_DIS'],
1163 'lm32' : ['CONFIG_LM32_DIS'],
1164 'm68k' : ['CONFIG_M68K_DIS'],
1165 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1166 'mips' : ['CONFIG_MIPS_DIS'],
1167 'moxie' : ['CONFIG_MOXIE_DIS'],
1168 'nios2' : ['CONFIG_NIOS2_DIS'],
1169 'or1k' : ['CONFIG_OPENRISC_DIS'],
1170 'ppc' : ['CONFIG_PPC_DIS'],
1171 'riscv' : ['CONFIG_RISCV_DIS'],
1172 'rx' : ['CONFIG_RX_DIS'],
1173 's390' : ['CONFIG_S390_DIS'],
1174 'sh4' : ['CONFIG_SH4_DIS'],
1175 'sparc' : ['CONFIG_SPARC_DIS'],
1176 'xtensa' : ['CONFIG_XTENSA_DIS'],
1177}
1178if link_language == 'cpp'
1179 disassemblers += {
1180 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1181 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1182 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1183 }
1184endif
1185
0a189110
PB
1186host_kconfig = \
1187 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
1188 ('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
1189 ('CONFIG_IVSHMEM' in config_host ? ['CONFIG_IVSHMEM=y'] : []) + \
1190 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
9d71037f 1191 (x11.found() ? ['CONFIG_X11=y'] : []) + \
0a189110
PB
1192 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1193 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1194 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
69202b40 1195 (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
0a189110
PB
1196 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
1197 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : [])
1198
a9a74907 1199ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
05512f55 1200
fdb75aef
PB
1201default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1202actual_target_dirs = []
fbb4121d 1203fdt_required = []
a81df1b6 1204foreach target : target_dirs
765686d6
PB
1205 config_target = { 'TARGET_NAME': target.split('-')[0] }
1206 if target.endswith('linux-user')
fdb75aef
PB
1207 if targetos != 'linux'
1208 if default_targets
1209 continue
1210 endif
1211 error('Target @0@ is only available on a Linux host'.format(target))
1212 endif
765686d6
PB
1213 config_target += { 'CONFIG_LINUX_USER': 'y' }
1214 elif target.endswith('bsd-user')
fdb75aef
PB
1215 if 'CONFIG_BSD' not in config_host
1216 if default_targets
1217 continue
1218 endif
1219 error('Target @0@ is only available on a BSD host'.format(target))
1220 endif
765686d6
PB
1221 config_target += { 'CONFIG_BSD_USER': 'y' }
1222 elif target.endswith('softmmu')
1223 config_target += { 'CONFIG_SOFTMMU': 'y' }
1224 endif
1225 if target.endswith('-user')
1226 config_target += {
1227 'CONFIG_USER_ONLY': 'y',
1228 'CONFIG_QEMU_INTERP_PREFIX':
1229 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1230 }
1231 endif
859aef02 1232
0a189110 1233 accel_kconfig = []
8a19980e
PB
1234 foreach sym: accelerators
1235 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1236 config_target += { sym: 'y' }
1237 config_all += { sym: 'y' }
1238 if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
1239 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1240 endif
0a189110 1241 accel_kconfig += [ sym + '=y' ]
8a19980e
PB
1242 endif
1243 endforeach
0a189110 1244 if accel_kconfig.length() == 0
fdb75aef
PB
1245 if default_targets
1246 continue
1247 endif
1248 error('No accelerator available for target @0@'.format(target))
1249 endif
8a19980e 1250
fdb75aef 1251 actual_target_dirs += target
765686d6 1252 config_target += keyval.load('default-configs/targets' / target + '.mak')
a9a74907 1253 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
765686d6 1254
fbb4121d
PB
1255 if 'TARGET_NEED_FDT' in config_target
1256 fdt_required += target
1257 endif
1258
fa73168b
PB
1259 # Add default keys
1260 if 'TARGET_BASE_ARCH' not in config_target
1261 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1262 endif
1263 if 'TARGET_ABI_DIR' not in config_target
1264 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1265 endif
859aef02 1266
ca0fc784
PB
1267 foreach k, v: disassemblers
1268 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1269 foreach sym: v
1270 config_target += { sym: 'y' }
1271 config_all_disas += { sym: 'y' }
1272 endforeach
1273 endif
1274 endforeach
1275
859aef02
PB
1276 config_target_data = configuration_data()
1277 foreach k, v: config_target
1278 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1279 # do nothing
1280 elif ignored.contains(k)
1281 # do nothing
1282 elif k == 'TARGET_BASE_ARCH'
a9a74907
PB
1283 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1284 # not used to select files from sourcesets.
859aef02 1285 config_target_data.set('TARGET_' + v.to_upper(), 1)
765686d6 1286 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
859aef02
PB
1287 config_target_data.set_quoted(k, v)
1288 elif v == 'y'
1289 config_target_data.set(k, 1)
1290 else
1291 config_target_data.set(k, v)
1292 endif
1293 endforeach
1294 config_target_h += {target: configure_file(output: target + '-config-target.h',
1295 configuration: config_target_data)}
2becc36a
PB
1296
1297 if target.endswith('-softmmu')
2becc36a
PB
1298 config_devices_mak = target + '-config-devices.mak'
1299 config_devices_mak = configure_file(
1bb4cb1c 1300 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
2becc36a
PB
1301 output: config_devices_mak,
1302 depfile: config_devices_mak + '.d',
1303 capture: true,
7bc3ca7f
PB
1304 command: [minikconf,
1305 get_option('default_devices') ? '--defconfig' : '--allnoconfig',
2becc36a 1306 config_devices_mak, '@DEPFILE@', '@INPUT@',
0a189110 1307 host_kconfig, accel_kconfig])
859aef02
PB
1308
1309 config_devices_data = configuration_data()
1310 config_devices = keyval.load(config_devices_mak)
1311 foreach k, v: config_devices
1312 config_devices_data.set(k, 1)
1313 endforeach
2becc36a 1314 config_devices_mak_list += config_devices_mak
859aef02
PB
1315 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1316 configuration: config_devices_data)}
1317 config_target += config_devices
a98006bc 1318 config_all_devices += config_devices
2becc36a
PB
1319 endif
1320 config_target_mak += {target: config_target}
a81df1b6 1321endforeach
fdb75aef 1322target_dirs = actual_target_dirs
a81df1b6 1323
2becc36a
PB
1324# This configuration is used to build files that are shared by
1325# multiple binaries, and then extracted out of the "common"
1326# static_library target.
1327#
1328# We do not use all_sources()/all_dependencies(), because it would
1329# build literally all source files, including devices only used by
1330# targets that are not built for this compilation. The CONFIG_ALL
1331# pseudo symbol replaces it.
1332
05512f55 1333config_all += config_all_devices
2becc36a
PB
1334config_all += config_host
1335config_all += config_all_disas
1336config_all += {
1337 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1338 'CONFIG_SOFTMMU': have_system,
1339 'CONFIG_USER_ONLY': have_user,
1340 'CONFIG_ALL': true,
1341}
1342
a0c9162c
PB
1343##############
1344# Submodules #
1345##############
8b18cdbf
RH
1346
1347capstone = not_found
1348capstone_opt = get_option('capstone')
1349if capstone_opt in ['enabled', 'auto', 'system']
1350 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
bcf36862
RH
1351 capstone = dependency('capstone', version: '>=4.0',
1352 static: enable_static, method: 'pkg-config',
8b18cdbf
RH
1353 required: capstone_opt == 'system' or
1354 capstone_opt == 'enabled' and not have_internal)
1355 if capstone.found()
1356 capstone_opt = 'system'
1357 elif have_internal
1358 capstone_opt = 'internal'
1359 else
1360 capstone_opt = 'disabled'
1361 endif
1362endif
1363if capstone_opt == 'internal'
1364 capstone_data = configuration_data()
1365 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1366
1367 capstone_files = files(
1368 'capstone/cs.c',
1369 'capstone/MCInst.c',
1370 'capstone/MCInstrDesc.c',
1371 'capstone/MCRegisterInfo.c',
1372 'capstone/SStream.c',
1373 'capstone/utils.c'
1374 )
1375
1376 if 'CONFIG_ARM_DIS' in config_all_disas
1377 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1378 capstone_files += files(
1379 'capstone/arch/ARM/ARMDisassembler.c',
1380 'capstone/arch/ARM/ARMInstPrinter.c',
1381 'capstone/arch/ARM/ARMMapping.c',
1382 'capstone/arch/ARM/ARMModule.c'
1383 )
1384 endif
1385
1386 # FIXME: This config entry currently depends on a c++ compiler.
1387 # Which is needed for building libvixl, but not for capstone.
1388 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1389 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1390 capstone_files += files(
1391 'capstone/arch/AArch64/AArch64BaseInfo.c',
1392 'capstone/arch/AArch64/AArch64Disassembler.c',
1393 'capstone/arch/AArch64/AArch64InstPrinter.c',
1394 'capstone/arch/AArch64/AArch64Mapping.c',
1395 'capstone/arch/AArch64/AArch64Module.c'
1396 )
1397 endif
1398
1399 if 'CONFIG_PPC_DIS' in config_all_disas
1400 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1401 capstone_files += files(
1402 'capstone/arch/PowerPC/PPCDisassembler.c',
1403 'capstone/arch/PowerPC/PPCInstPrinter.c',
1404 'capstone/arch/PowerPC/PPCMapping.c',
1405 'capstone/arch/PowerPC/PPCModule.c'
1406 )
1407 endif
1408
3d562845
RH
1409 if 'CONFIG_S390_DIS' in config_all_disas
1410 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1411 capstone_files += files(
1412 'capstone/arch/SystemZ/SystemZDisassembler.c',
1413 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1414 'capstone/arch/SystemZ/SystemZMapping.c',
1415 'capstone/arch/SystemZ/SystemZModule.c',
1416 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1417 )
1418 endif
1419
8b18cdbf
RH
1420 if 'CONFIG_I386_DIS' in config_all_disas
1421 capstone_data.set('CAPSTONE_HAS_X86', 1)
1422 capstone_files += files(
1423 'capstone/arch/X86/X86Disassembler.c',
1424 'capstone/arch/X86/X86DisassemblerDecoder.c',
1425 'capstone/arch/X86/X86ATTInstPrinter.c',
1426 'capstone/arch/X86/X86IntelInstPrinter.c',
eef20e40 1427 'capstone/arch/X86/X86InstPrinterCommon.c',
8b18cdbf
RH
1428 'capstone/arch/X86/X86Mapping.c',
1429 'capstone/arch/X86/X86Module.c'
1430 )
1431 endif
1432
1433 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1434
1435 capstone_cargs = [
1436 # FIXME: There does not seem to be a way to completely replace the c_args
1437 # that come from add_project_arguments() -- we can only add to them.
1438 # So: disable all warnings with a big hammer.
1439 '-Wno-error', '-w',
1440
1441 # Include all configuration defines via a header file, which will wind up
1442 # as a dependency on the object file, and thus changes here will result
1443 # in a rebuild.
1444 '-include', 'capstone-defs.h'
1445 ]
1446
1447 libcapstone = static_library('capstone',
1448 sources: capstone_files,
1449 c_args: capstone_cargs,
1450 include_directories: 'capstone/include')
1451 capstone = declare_dependency(link_with: libcapstone,
eef20e40 1452 include_directories: 'capstone/include/capstone')
8b18cdbf 1453endif
4d34a86b
PB
1454
1455slirp = not_found
1456slirp_opt = 'disabled'
1457if have_system
1458 slirp_opt = get_option('slirp')
1459 if slirp_opt in ['enabled', 'auto', 'system']
1460 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
1461 slirp = dependency('slirp', static: enable_static,
1462 method: 'pkg-config',
1463 required: slirp_opt == 'system' or
1464 slirp_opt == 'enabled' and not have_internal)
1465 if slirp.found()
1466 slirp_opt = 'system'
1467 elif have_internal
1468 slirp_opt = 'internal'
1469 else
1470 slirp_opt = 'disabled'
1471 endif
1472 endif
1473 if slirp_opt == 'internal'
1474 slirp_deps = []
1475 if targetos == 'windows'
1476 slirp_deps = cc.find_library('iphlpapi')
1477 endif
1478 slirp_conf = configuration_data()
1479 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1480 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1481 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1482 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1483 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1484 slirp_files = [
1485 'slirp/src/arp_table.c',
1486 'slirp/src/bootp.c',
1487 'slirp/src/cksum.c',
1488 'slirp/src/dhcpv6.c',
1489 'slirp/src/dnssearch.c',
1490 'slirp/src/if.c',
1491 'slirp/src/ip6_icmp.c',
1492 'slirp/src/ip6_input.c',
1493 'slirp/src/ip6_output.c',
1494 'slirp/src/ip_icmp.c',
1495 'slirp/src/ip_input.c',
1496 'slirp/src/ip_output.c',
1497 'slirp/src/mbuf.c',
1498 'slirp/src/misc.c',
1499 'slirp/src/ncsi.c',
1500 'slirp/src/ndp_table.c',
1501 'slirp/src/sbuf.c',
1502 'slirp/src/slirp.c',
1503 'slirp/src/socket.c',
1504 'slirp/src/state.c',
1505 'slirp/src/stream.c',
1506 'slirp/src/tcp_input.c',
1507 'slirp/src/tcp_output.c',
1508 'slirp/src/tcp_subr.c',
1509 'slirp/src/tcp_timer.c',
1510 'slirp/src/tftp.c',
1511 'slirp/src/udp.c',
1512 'slirp/src/udp6.c',
1513 'slirp/src/util.c',
1514 'slirp/src/version.c',
1515 'slirp/src/vmstate.c',
1516 ]
1517
1518 configure_file(
1519 input : 'slirp/src/libslirp-version.h.in',
1520 output : 'libslirp-version.h',
1521 configuration: slirp_conf)
1522
1523 slirp_inc = include_directories('slirp', 'slirp/src')
1524 libslirp = static_library('slirp',
1525 sources: slirp_files,
1526 c_args: slirp_cargs,
1527 include_directories: slirp_inc)
1528 slirp = declare_dependency(link_with: libslirp,
1529 dependencies: slirp_deps,
1530 include_directories: slirp_inc)
1531 endif
1532endif
1533
fbb4121d
PB
1534fdt = not_found
1535fdt_opt = get_option('fdt')
1536if have_system
1537 if fdt_opt in ['enabled', 'auto', 'system']
1538 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
1539 fdt = cc.find_library('fdt', static: enable_static,
1540 required: fdt_opt == 'system' or
1541 fdt_opt == 'enabled' and not have_internal)
1542 if fdt.found() and cc.links('''
1543 #include <libfdt.h>
1544 #include <libfdt_env.h>
1545 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1546 dependencies: fdt)
1547 fdt_opt = 'system'
1548 elif have_internal
1549 fdt_opt = 'internal'
1550 else
1551 fdt_opt = 'disabled'
1552 endif
1553 endif
1554 if fdt_opt == 'internal'
1555 fdt_files = files(
1556 'dtc/libfdt/fdt.c',
1557 'dtc/libfdt/fdt_ro.c',
1558 'dtc/libfdt/fdt_wip.c',
1559 'dtc/libfdt/fdt_sw.c',
1560 'dtc/libfdt/fdt_rw.c',
1561 'dtc/libfdt/fdt_strerror.c',
1562 'dtc/libfdt/fdt_empty_tree.c',
1563 'dtc/libfdt/fdt_addresses.c',
1564 'dtc/libfdt/fdt_overlay.c',
1565 'dtc/libfdt/fdt_check.c',
1566 )
1567
1568 fdt_inc = include_directories('dtc/libfdt')
1569 libfdt = static_library('fdt',
1570 sources: fdt_files,
1571 include_directories: fdt_inc)
1572 fdt = declare_dependency(link_with: libfdt,
1573 include_directories: fdt_inc)
1574 endif
1575endif
1576if not fdt.found() and fdt_required.length() > 0
1577 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1578endif
1579
8b18cdbf 1580config_host_data.set('CONFIG_CAPSTONE', capstone.found())
fbb4121d 1581config_host_data.set('CONFIG_FDT', fdt.found())
4d34a86b 1582config_host_data.set('CONFIG_SLIRP', slirp.found())
8b18cdbf 1583
a0c9162c
PB
1584#####################
1585# Generated sources #
1586#####################
8b18cdbf 1587
a0c9162c 1588genh += configure_file(output: 'config-host.h', configuration: config_host_data)
a81df1b6 1589
3f885659 1590hxtool = find_program('scripts/hxtool')
650b5d54 1591shaderinclude = find_program('scripts/shaderinclude.pl')
a81df1b6
PB
1592qapi_gen = find_program('scripts/qapi-gen.py')
1593qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1594 meson.source_root() / 'scripts/qapi/commands.py',
1595 meson.source_root() / 'scripts/qapi/common.py',
a81df1b6
PB
1596 meson.source_root() / 'scripts/qapi/error.py',
1597 meson.source_root() / 'scripts/qapi/events.py',
1598 meson.source_root() / 'scripts/qapi/expr.py',
1599 meson.source_root() / 'scripts/qapi/gen.py',
1600 meson.source_root() / 'scripts/qapi/introspect.py',
1601 meson.source_root() / 'scripts/qapi/parser.py',
1602 meson.source_root() / 'scripts/qapi/schema.py',
1603 meson.source_root() / 'scripts/qapi/source.py',
1604 meson.source_root() / 'scripts/qapi/types.py',
1605 meson.source_root() / 'scripts/qapi/visit.py',
1606 meson.source_root() / 'scripts/qapi/common.py',
a81df1b6
PB
1607 meson.source_root() / 'scripts/qapi-gen.py'
1608]
1609
1610tracetool = [
1611 python, files('scripts/tracetool.py'),
1612 '--backend=' + config_host['TRACE_BACKENDS']
1613]
1614
2c273f32
MAL
1615qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1616 meson.current_source_dir(),
859aef02 1617 config_host['PKGVERSION'], meson.project_version()]
2c273f32
MAL
1618qemu_version = custom_target('qemu-version.h',
1619 output: 'qemu-version.h',
1620 command: qemu_version_cmd,
1621 capture: true,
1622 build_by_default: true,
1623 build_always_stale: true)
1624genh += qemu_version
1625
3f885659
MAL
1626hxdep = []
1627hx_headers = [
1628 ['qemu-options.hx', 'qemu-options.def'],
1629 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1630]
1631if have_system
1632 hx_headers += [
1633 ['hmp-commands.hx', 'hmp-commands.h'],
1634 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1635 ]
1636endif
1637foreach d : hx_headers
b7c70bf2 1638 hxdep += custom_target(d[1],
3f885659
MAL
1639 input: files(d[0]),
1640 output: d[1],
1641 capture: true,
1642 build_by_default: true, # to be removed when added to a target
1643 command: [hxtool, '-h', '@INPUT0@'])
1644endforeach
1645genh += hxdep
1646
a0c9162c
PB
1647###################
1648# Collect sources #
1649###################
a81df1b6 1650
55567891 1651authz_ss = ss.source_set()
4a96337d 1652blockdev_ss = ss.source_set()
7e2b888f 1653block_ss = ss.source_set()
2becc36a 1654bsd_user_ss = ss.source_set()
c2306d71 1655chardev_ss = ss.source_set()
7e2b888f 1656common_ss = ss.source_set()
2389304a 1657crypto_ss = ss.source_set()
f78536b1 1658io_ss = ss.source_set()
2becc36a 1659linux_user_ss = ss.source_set()
7e2b888f 1660qmp_ss = ss.source_set()
da33fc09 1661qom_ss = ss.source_set()
7e2b888f 1662softmmu_ss = ss.source_set()
64ed6f92 1663specific_fuzz_ss = ss.source_set()
7e2b888f
PMD
1664specific_ss = ss.source_set()
1665stub_ss = ss.source_set()
1666trace_ss = ss.source_set()
1667user_ss = ss.source_set()
1668util_ss = ss.source_set()
2becc36a 1669
3154fee4 1670modules = {}
2becc36a
PB
1671hw_arch = {}
1672target_arch = {}
1673target_softmmu_arch = {}
a81df1b6
PB
1674
1675###############
1676# Trace files #
1677###############
1678
c9322ab5
MAL
1679# TODO: add each directory to the subdirs from its own meson.build, once
1680# we have those
a81df1b6
PB
1681trace_events_subdirs = [
1682 'accel/kvm',
1683 'accel/tcg',
1684 'crypto',
1685 'monitor',
1686]
1687if have_user
1688 trace_events_subdirs += [ 'linux-user' ]
1689endif
1690if have_block
1691 trace_events_subdirs += [
1692 'authz',
1693 'block',
1694 'io',
1695 'nbd',
1696 'scsi',
1697 ]
1698endif
1699if have_system
1700 trace_events_subdirs += [
1701 'audio',
1702 'backends',
1703 'backends/tpm',
1704 'chardev',
1705 'hw/9pfs',
1706 'hw/acpi',
77c05b0b 1707 'hw/adc',
a81df1b6
PB
1708 'hw/alpha',
1709 'hw/arm',
1710 'hw/audio',
1711 'hw/block',
1712 'hw/block/dataplane',
1713 'hw/char',
1714 'hw/display',
1715 'hw/dma',
1716 'hw/hppa',
1717 'hw/hyperv',
1718 'hw/i2c',
1719 'hw/i386',
1720 'hw/i386/xen',
1721 'hw/ide',
1722 'hw/input',
1723 'hw/intc',
1724 'hw/isa',
1725 'hw/mem',
1726 'hw/mips',
1727 'hw/misc',
1728 'hw/misc/macio',
1729 'hw/net',
98e5d7a2 1730 'hw/net/can',
a81df1b6
PB
1731 'hw/nvram',
1732 'hw/pci',
1733 'hw/pci-host',
1734 'hw/ppc',
1735 'hw/rdma',
1736 'hw/rdma/vmw',
1737 'hw/rtc',
1738 'hw/s390x',
1739 'hw/scsi',
1740 'hw/sd',
1741 'hw/sparc',
1742 'hw/sparc64',
1743 'hw/ssi',
1744 'hw/timer',
1745 'hw/tpm',
1746 'hw/usb',
1747 'hw/vfio',
1748 'hw/virtio',
1749 'hw/watchdog',
1750 'hw/xen',
1751 'hw/gpio',
a81df1b6
PB
1752 'migration',
1753 'net',
8b7a5507 1754 'softmmu',
a81df1b6
PB
1755 'ui',
1756 ]
1757endif
1758trace_events_subdirs += [
1759 'hw/core',
1760 'qapi',
1761 'qom',
1762 'target/arm',
1763 'target/hppa',
1764 'target/i386',
a9dc68d9 1765 'target/i386/kvm',
a81df1b6
PB
1766 'target/mips',
1767 'target/ppc',
1768 'target/riscv',
1769 'target/s390x',
1770 'target/sparc',
1771 'util',
1772]
1773
0df750e9
MAL
1774vhost_user = not_found
1775if 'CONFIG_VHOST_USER' in config_host
1776 libvhost_user = subproject('libvhost-user')
1777 vhost_user = libvhost_user.get_variable('vhost_user_dep')
1778endif
1779
a81df1b6
PB
1780subdir('qapi')
1781subdir('qobject')
1782subdir('stubs')
1783subdir('trace')
1784subdir('util')
5582c58f
MAL
1785subdir('qom')
1786subdir('authz')
a81df1b6 1787subdir('crypto')
2d78b56e 1788subdir('ui')
a81df1b6 1789
3154fee4
MAL
1790
1791if enable_modules
1792 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1793 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1794endif
1795
2becc36a 1796stub_ss = stub_ss.apply(config_all, strict: false)
a81df1b6
PB
1797
1798util_ss.add_all(trace_ss)
2becc36a 1799util_ss = util_ss.apply(config_all, strict: false)
a81df1b6
PB
1800libqemuutil = static_library('qemuutil',
1801 sources: util_ss.sources() + stub_ss.sources() + genh,
aa087962 1802 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
a81df1b6 1803qemuutil = declare_dependency(link_with: libqemuutil,
04c6f1e7 1804 sources: genh + version_res)
a81df1b6 1805
abff1abf
PB
1806decodetree = generator(find_program('scripts/decodetree.py'),
1807 output: 'decode-@BASENAME@.c.inc',
1808 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1809
478e943f 1810subdir('audio')
7fcfd456 1811subdir('io')
848e8ff6 1812subdir('chardev')
ec0d5893 1813subdir('fsdev')
abff1abf 1814subdir('libdecnumber')
d3b18480 1815subdir('target')
708eab42 1816subdir('dump')
ec0d5893 1817
5e5733e5
MAL
1818block_ss.add(files(
1819 'block.c',
1820 'blockjob.c',
1821 'job.c',
1822 'qemu-io-cmds.c',
1823))
1824block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
1825
1826subdir('nbd')
1827subdir('scsi')
1828subdir('block')
1829
4a96337d
PB
1830blockdev_ss.add(files(
1831 'blockdev.c',
cbc20bfb 1832 'blockdev-nbd.c',
4a96337d
PB
1833 'iothread.c',
1834 'job-qmp.c',
3eacf70b 1835), gnutls)
4a96337d
PB
1836
1837# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1838# os-win32.c does not
1839blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1840softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
4a96337d
PB
1841
1842common_ss.add(files('cpus-common.c'))
1843
5d3ea0e1 1844subdir('softmmu')
c9322ab5 1845
f343346b 1846common_ss.add(capstone)
d9f24bf5 1847specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
c9322ab5
MAL
1848specific_ss.add(files('exec-vary.c'))
1849specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1850 'fpu/softfloat.c',
1851 'tcg/optimize.c',
1852 'tcg/tcg-common.c',
1853 'tcg/tcg-op-gvec.c',
1854 'tcg/tcg-op-vec.c',
1855 'tcg/tcg-op.c',
1856 'tcg/tcg.c',
1857))
1858specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1859
ab318051 1860subdir('backends')
c574e161 1861subdir('disas')
55166230 1862subdir('migration')
ff219dca 1863subdir('monitor')
cdaf0722 1864subdir('net')
17ef2af6 1865subdir('replay')
582ea95f 1866subdir('hw')
1a82878a 1867subdir('accel')
f556b4a1 1868subdir('plugins')
b309c321 1869subdir('bsd-user')
3a30446a
MAL
1870subdir('linux-user')
1871
b309c321
MAL
1872bsd_user_ss.add(files('gdbstub.c'))
1873specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1874
3a30446a
MAL
1875linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1876specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
5d3ea0e1 1877
a2ce7dbd
PB
1878# needed for fuzzing binaries
1879subdir('tests/qtest/libqos')
64ed6f92 1880subdir('tests/qtest/fuzz')
a2ce7dbd 1881
a0c9162c
PB
1882########################
1883# Library dependencies #
1884########################
1885
3154fee4
MAL
1886block_mods = []
1887softmmu_mods = []
1888foreach d, list : modules
1889 foreach m, module_ss : list
1890 if enable_modules and targetos != 'windows'
3e292c51 1891 module_ss = module_ss.apply(config_all, strict: false)
3154fee4
MAL
1892 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1893 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1894 if d == 'block'
1895 block_mods += sl
1896 else
1897 softmmu_mods += sl
1898 endif
1899 else
1900 if d == 'block'
1901 block_ss.add_all(module_ss)
1902 else
1903 softmmu_ss.add_all(module_ss)
1904 endif
1905 endif
1906 endforeach
1907endforeach
1908
1909nm = find_program('nm')
604f3e4e 1910undefsym = find_program('scripts/undefsym.py')
3154fee4
MAL
1911block_syms = custom_target('block.syms', output: 'block.syms',
1912 input: [libqemuutil, block_mods],
1913 capture: true,
1914 command: [undefsym, nm, '@INPUT@'])
1915qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1916 input: [libqemuutil, softmmu_mods],
1917 capture: true,
1918 command: [undefsym, nm, '@INPUT@'])
1919
da33fc09
PMD
1920qom_ss = qom_ss.apply(config_host, strict: false)
1921libqom = static_library('qom', qom_ss.sources() + genh,
1922 dependencies: [qom_ss.dependencies()],
1923 name_suffix: 'fa')
1924
1925qom = declare_dependency(link_whole: libqom)
1926
55567891
PMD
1927authz_ss = authz_ss.apply(config_host, strict: false)
1928libauthz = static_library('authz', authz_ss.sources() + genh,
1929 dependencies: [authz_ss.dependencies()],
1930 name_suffix: 'fa',
1931 build_by_default: false)
1932
1933authz = declare_dependency(link_whole: libauthz,
1934 dependencies: qom)
1935
2389304a
PMD
1936crypto_ss = crypto_ss.apply(config_host, strict: false)
1937libcrypto = static_library('crypto', crypto_ss.sources() + genh,
1938 dependencies: [crypto_ss.dependencies()],
1939 name_suffix: 'fa',
1940 build_by_default: false)
1941
1942crypto = declare_dependency(link_whole: libcrypto,
1943 dependencies: [authz, qom])
1944
f78536b1
PMD
1945io_ss = io_ss.apply(config_host, strict: false)
1946libio = static_library('io', io_ss.sources() + genh,
1947 dependencies: [io_ss.dependencies()],
1948 link_with: libqemuutil,
1949 name_suffix: 'fa',
1950 build_by_default: false)
1951
1952io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
1953
7e6edef3
PMD
1954libmigration = static_library('migration', sources: migration_files + genh,
1955 name_suffix: 'fa',
1956 build_by_default: false)
1957migration = declare_dependency(link_with: libmigration,
1958 dependencies: [zlib, qom, io])
1959softmmu_ss.add(migration)
1960
5e5733e5
MAL
1961block_ss = block_ss.apply(config_host, strict: false)
1962libblock = static_library('block', block_ss.sources() + genh,
1963 dependencies: block_ss.dependencies(),
1964 link_depends: block_syms,
1965 name_suffix: 'fa',
1966 build_by_default: false)
1967
1968block = declare_dependency(link_whole: [libblock],
b7c70bf2
MAL
1969 link_args: '@block.syms',
1970 dependencies: [crypto, io])
5e5733e5 1971
4fb9071f
SH
1972blockdev_ss = blockdev_ss.apply(config_host, strict: false)
1973libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
1974 dependencies: blockdev_ss.dependencies(),
1975 name_suffix: 'fa',
1976 build_by_default: false)
1977
1978blockdev = declare_dependency(link_whole: [libblockdev],
1979 dependencies: [block])
1980
ff219dca
PB
1981qmp_ss = qmp_ss.apply(config_host, strict: false)
1982libqmp = static_library('qmp', qmp_ss.sources() + genh,
1983 dependencies: qmp_ss.dependencies(),
1984 name_suffix: 'fa',
1985 build_by_default: false)
1986
1987qmp = declare_dependency(link_whole: [libqmp])
1988
c2306d71
PMD
1989libchardev = static_library('chardev', chardev_ss.sources() + genh,
1990 name_suffix: 'fa',
3eacf70b 1991 dependencies: [gnutls],
c2306d71
PMD
1992 build_by_default: false)
1993
1994chardev = declare_dependency(link_whole: libchardev)
1995
e28ab096
PMD
1996libhwcore = static_library('hwcore', sources: hwcore_files + genh,
1997 name_suffix: 'fa',
1998 build_by_default: false)
1999hwcore = declare_dependency(link_whole: libhwcore)
2000common_ss.add(hwcore)
2001
064f8ee7
PMD
2002###########
2003# Targets #
2004###########
2005
3154fee4
MAL
2006foreach m : block_mods + softmmu_mods
2007 shared_module(m.name(),
2008 name_prefix: '',
2009 link_whole: m,
2010 install: true,
16bf7a33 2011 install_dir: qemu_moddir)
3154fee4
MAL
2012endforeach
2013
4fb9071f 2014softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
64ed6f92
PB
2015common_ss.add(qom, qemuutil)
2016
2017common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
2becc36a
PB
2018common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
2019
2020common_all = common_ss.apply(config_all, strict: false)
2021common_all = static_library('common',
2022 build_by_default: false,
2023 sources: common_all.sources() + genh,
2024 dependencies: common_all.dependencies(),
2025 name_suffix: 'fa')
2026
c9322ab5
MAL
2027feature_to_c = find_program('scripts/feature_to_c.sh')
2028
fd5eef85 2029emulators = {}
2becc36a
PB
2030foreach target : target_dirs
2031 config_target = config_target_mak[target]
2032 target_name = config_target['TARGET_NAME']
2033 arch = config_target['TARGET_BASE_ARCH']
859aef02 2034 arch_srcs = [config_target_h[target]]
64ed6f92
PB
2035 arch_deps = []
2036 c_args = ['-DNEED_CPU_H',
2037 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
2038 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
b6c7cfd4 2039 link_args = emulator_link_args
2becc36a 2040
859aef02 2041 config_target += config_host
2becc36a
PB
2042 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
2043 if targetos == 'linux'
2044 target_inc += include_directories('linux-headers', is_system: true)
2045 endif
2046 if target.endswith('-softmmu')
2047 qemu_target_name = 'qemu-system-' + target_name
2048 target_type='system'
abff1abf
PB
2049 t = target_softmmu_arch[arch].apply(config_target, strict: false)
2050 arch_srcs += t.sources()
64ed6f92 2051 arch_deps += t.dependencies()
abff1abf 2052
2c44220d
MAL
2053 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
2054 hw = hw_arch[hw_dir].apply(config_target, strict: false)
2055 arch_srcs += hw.sources()
64ed6f92 2056 arch_deps += hw.dependencies()
2c44220d 2057
2becc36a 2058 arch_srcs += config_devices_h[target]
64ed6f92 2059 link_args += ['@block.syms', '@qemu.syms']
2becc36a 2060 else
3a30446a 2061 abi = config_target['TARGET_ABI_DIR']
2becc36a
PB
2062 target_type='user'
2063 qemu_target_name = 'qemu-' + target_name
2064 if 'CONFIG_LINUX_USER' in config_target
2065 base_dir = 'linux-user'
2066 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
2067 else
2068 base_dir = 'bsd-user'
ea1ab4cf 2069 target_inc += include_directories('bsd-user/freebsd')
2becc36a
PB
2070 endif
2071 target_inc += include_directories(
2072 base_dir,
3a30446a 2073 base_dir / abi,
2becc36a 2074 )
3a30446a
MAL
2075 if 'CONFIG_LINUX_USER' in config_target
2076 dir = base_dir / abi
2077 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
2078 if config_target.has_key('TARGET_SYSTBL_ABI')
2079 arch_srcs += \
2080 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
2081 extra_args : config_target['TARGET_SYSTBL_ABI'])
2082 endif
2083 endif
2becc36a
PB
2084 endif
2085
c9322ab5
MAL
2086 if 'TARGET_XML_FILES' in config_target
2087 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
2088 output: target + '-gdbstub-xml.c',
2089 input: files(config_target['TARGET_XML_FILES'].split()),
2090 command: [feature_to_c, '@INPUT@'],
2091 capture: true)
2092 arch_srcs += gdbstub_xml
2093 endif
2094
abff1abf
PB
2095 t = target_arch[arch].apply(config_target, strict: false)
2096 arch_srcs += t.sources()
64ed6f92 2097 arch_deps += t.dependencies()
abff1abf 2098
2becc36a
PB
2099 target_common = common_ss.apply(config_target, strict: false)
2100 objects = common_all.extract_objects(target_common.sources())
64ed6f92 2101 deps = target_common.dependencies()
2becc36a 2102
2becc36a
PB
2103 target_specific = specific_ss.apply(config_target, strict: false)
2104 arch_srcs += target_specific.sources()
64ed6f92 2105 arch_deps += target_specific.dependencies()
2becc36a 2106
64ed6f92 2107 lib = static_library('qemu-' + target,
859aef02 2108 sources: arch_srcs + genh,
b7612f45 2109 dependencies: arch_deps,
2becc36a
PB
2110 objects: objects,
2111 include_directories: target_inc,
64ed6f92
PB
2112 c_args: c_args,
2113 build_by_default: false,
2becc36a 2114 name_suffix: 'fa')
64ed6f92
PB
2115
2116 if target.endswith('-softmmu')
2117 execs = [{
2118 'name': 'qemu-system-' + target_name,
2119 'gui': false,
2120 'sources': files('softmmu/main.c'),
2121 'dependencies': []
2122 }]
35be72ba 2123 if targetos == 'windows' and (sdl.found() or gtk.found())
64ed6f92
PB
2124 execs += [{
2125 'name': 'qemu-system-' + target_name + 'w',
2126 'gui': true,
2127 'sources': files('softmmu/main.c'),
2128 'dependencies': []
2129 }]
2130 endif
2131 if config_host.has_key('CONFIG_FUZZ')
2132 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
2133 execs += [{
2134 'name': 'qemu-fuzz-' + target_name,
2135 'gui': false,
2136 'sources': specific_fuzz.sources(),
2137 'dependencies': specific_fuzz.dependencies(),
64ed6f92
PB
2138 }]
2139 endif
2140 else
2141 execs = [{
2142 'name': 'qemu-' + target_name,
2143 'gui': false,
2144 'sources': [],
2145 'dependencies': []
2146 }]
2147 endif
2148 foreach exe: execs
fd5eef85
PB
2149 emulators += {exe['name']:
2150 executable(exe['name'], exe['sources'],
64ed6f92
PB
2151 install: true,
2152 c_args: c_args,
2153 dependencies: arch_deps + deps + exe['dependencies'],
2154 objects: lib.extract_all_objects(recursive: true),
2155 link_language: link_language,
2156 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
2157 link_args: link_args,
2158 gui_app: exe['gui'])
fd5eef85 2159 }
10e1d263
MAL
2160
2161 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
2162 foreach stp: [
bd5f973a
SH
2163 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
2164 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
10e1d263
MAL
2165 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
2166 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
2167 ]
bd5f973a 2168 custom_target(exe['name'] + stp['ext'],
10e1d263 2169 input: trace_events_all,
bd5f973a 2170 output: exe['name'] + stp['ext'],
10e1d263 2171 install: stp['install'],
16bf7a33 2172 install_dir: get_option('datadir') / 'systemtap/tapset',
10e1d263
MAL
2173 command: [
2174 tracetool, '--group=all', '--format=' + stp['fmt'],
2175 '--binary=' + stp['bin'],
2176 '--target-name=' + target_name,
2177 '--target-type=' + target_type,
2178 '--probe-prefix=qemu.' + target_type + '.' + target_name,
c05012a3 2179 '@INPUT@', '@OUTPUT@'
10e1d263
MAL
2180 ])
2181 endforeach
2182 endif
64ed6f92 2183 endforeach
2becc36a
PB
2184endforeach
2185
931049b4 2186# Other build targets
897b5afa 2187
f556b4a1
PB
2188if 'CONFIG_PLUGIN' in config_host
2189 install_headers('include/qemu/qemu-plugin.h')
2190endif
2191
f15bff25
PB
2192if 'CONFIG_GUEST_AGENT' in config_host
2193 subdir('qga')
2194endif
2195
9755c94a
LV
2196# Don't build qemu-keymap if xkbcommon is not explicitly enabled
2197# when we don't build tools or system
4113f4cf 2198if xkbcommon.found()
28742467
MAL
2199 # used for the update-keymaps target, so include rules even if !have_tools
2200 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
2201 dependencies: [qemuutil, xkbcommon], install: have_tools)
2202endif
2203
931049b4 2204if have_tools
b7c70bf2
MAL
2205 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
2206 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
2207 qemu_io = executable('qemu-io', files('qemu-io.c'),
2208 dependencies: [block, qemuutil], install: true)
eb705985 2209 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
3eacf70b 2210 dependencies: [blockdev, qemuutil, gnutls], install: true)
b7c70bf2 2211
7c58bb76 2212 subdir('storage-daemon')
a9c9727c 2213 subdir('contrib/rdmacm-mux')
1d7bb6ab 2214 subdir('contrib/elf2dmp')
a9c9727c 2215
157e7b13
MAL
2216 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
2217 dependencies: qemuutil,
2218 install: true)
2219
931049b4 2220 if 'CONFIG_VHOST_USER' in config_host
2d7ac0af 2221 subdir('contrib/vhost-user-blk')
b7612f45 2222 subdir('contrib/vhost-user-gpu')
32fcc624 2223 subdir('contrib/vhost-user-input')
99650b62 2224 subdir('contrib/vhost-user-scsi')
931049b4 2225 endif
8f51e01c
MAL
2226
2227 if targetos == 'linux'
2228 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2229 dependencies: [qemuutil, libcap_ng],
2230 install: true,
2231 install_dir: get_option('libexecdir'))
897b5afa
MAL
2232
2233 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2234 dependencies: [authz, crypto, io, qom, qemuutil,
6ec0e15d 2235 libcap_ng, mpathpersist],
897b5afa 2236 install: true)
8f51e01c
MAL
2237 endif
2238
5ee24e78
MAL
2239 if 'CONFIG_IVSHMEM' in config_host
2240 subdir('contrib/ivshmem-client')
2241 subdir('contrib/ivshmem-server')
2242 endif
931049b4
PB
2243endif
2244
f5aa6320 2245subdir('scripts')
3f99cf57 2246subdir('tools')
bdcbea7a 2247subdir('pc-bios')
f8aa24ea 2248subdir('docs')
e3667660 2249subdir('tests')
1b695471 2250if gtk.found()
e8f3bd71
MAL
2251 subdir('po')
2252endif
3f99cf57 2253
8adfeba9
MAL
2254if host_machine.system() == 'windows'
2255 nsis_cmd = [
2256 find_program('scripts/nsis.py'),
2257 '@OUTPUT@',
2258 get_option('prefix'),
2259 meson.current_source_dir(),
24bdcc96 2260 host_machine.cpu(),
8adfeba9
MAL
2261 '--',
2262 '-DDISPLAYVERSION=' + meson.project_version(),
2263 ]
2264 if build_docs
2265 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2266 endif
1b695471 2267 if gtk.found()
8adfeba9
MAL
2268 nsis_cmd += '-DCONFIG_GTK=y'
2269 endif
2270
2271 nsis = custom_target('nsis',
2272 output: 'qemu-setup-' + meson.project_version() + '.exe',
2273 input: files('qemu.nsi'),
2274 build_always_stale: true,
2275 command: nsis_cmd + ['@INPUT@'])
2276 alias_target('installer', nsis)
2277endif
2278
a0c9162c
PB
2279#########################
2280# Configuration summary #
2281#########################
2282
f9332757 2283summary_info = {}
16bf7a33
PB
2284summary_info += {'Install prefix': get_option('prefix')}
2285summary_info += {'BIOS directory': qemu_datadir}
2286summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2287summary_info += {'binary directory': get_option('bindir')}
2288summary_info += {'library directory': get_option('libdir')}
2289summary_info += {'module directory': qemu_moddir}
2290summary_info += {'libexec directory': get_option('libexecdir')}
2291summary_info += {'include directory': get_option('includedir')}
2292summary_info += {'config directory': get_option('sysconfdir')}
f9332757 2293if targetos != 'windows'
16bf7a33 2294 summary_info += {'local state directory': get_option('localstatedir')}
b81efab7 2295 summary_info += {'Manual directory': get_option('mandir')}
f9332757
PB
2296else
2297 summary_info += {'local state directory': 'queried at runtime'}
2298endif
491e74c1 2299summary_info += {'Doc directory': get_option('docdir')}
f9332757
PB
2300summary_info += {'Build directory': meson.current_build_dir()}
2301summary_info += {'Source path': meson.current_source_dir()}
2302summary_info += {'GIT binary': config_host['GIT']}
2303summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
2304summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
2305summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
2306if link_language == 'cpp'
2307 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
2308else
2309 summary_info += {'C++ compiler': false}
2310endif
2311if targetos == 'darwin'
2312 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
2313endif
2314summary_info += {'ARFLAGS': config_host['ARFLAGS']}
47b30835
PB
2315summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2316 + ['-O' + get_option('optimization')]
2317 + (get_option('debug') ? ['-g'] : []))}
2318if link_language == 'cpp'
2319 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2320 + ['-O' + get_option('optimization')]
2321 + (get_option('debug') ? ['-g'] : []))}
2322endif
2323link_args = get_option(link_language + '_link_args')
2324if link_args.length() > 0
2325 summary_info += {'LDFLAGS': ' '.join(link_args)}
2326endif
f9332757
PB
2327summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2328summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
2329summary_info += {'make': config_host['MAKE']}
f9332757 2330summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
e3667660 2331summary_info += {'sphinx-build': sphinx_build.found()}
f9332757
PB
2332summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2333# TODO: add back version
4d34a86b
PB
2334summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
2335if slirp_opt != 'disabled'
f9332757
PB
2336 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2337endif
2338summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2339if config_host.has_key('CONFIG_MODULES')
2340 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2341endif
2342summary_info += {'host CPU': cpu}
2343summary_info += {'host endianness': build_machine.endian()}
fdb75aef 2344summary_info += {'target list': ' '.join(target_dirs)}
f9332757 2345summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
deb62371 2346summary_info += {'sparse enabled': sparse.found()}
f9332757
PB
2347summary_info += {'strip binaries': get_option('strip')}
2348summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
cdad781d 2349summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
3e8529dd 2350summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
f9332757 2351if targetos == 'darwin'
cb7abd83 2352 summary_info += {'Cocoa support': cocoa.found()}
f9332757
PB
2353endif
2354# TODO: add back version
35be72ba
PB
2355summary_info += {'SDL support': sdl.found()}
2356summary_info += {'SDL image support': sdl_image.found()}
f9332757 2357# TODO: add back version
1b695471 2358summary_info += {'GTK support': gtk.found()}
b7612f45 2359summary_info += {'pixman': pixman.found()}
f9332757
PB
2360# TODO: add back version
2361summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
2362summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
2363summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
2364# TODO: add back version
2365summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
2366if config_host.has_key('CONFIG_GCRYPT')
2367 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
2368 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2369endif
2370# TODO: add back version
2371summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
2372if config_host.has_key('CONFIG_NETTLE')
2373 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2374endif
2375summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
2376summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
5285e593
YL
2377summary_info += {'iconv support': iconv.found()}
2378summary_info += {'curses support': curses.found()}
f9332757
PB
2379# TODO: add back version
2380summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
f9cd86fe 2381summary_info += {'curl support': curl.found()}
f9332757
PB
2382summary_info += {'mingw32 support': targetos == 'windows'}
2383summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2384summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2385summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
69202b40 2386summary_info += {'VirtFS support': have_virtfs}
cece116c 2387summary_info += {'build virtiofs daemon': have_virtiofsd}
6ec0e15d 2388summary_info += {'Multipath support': mpathpersist.found()}
a0b93237
PB
2389summary_info += {'VNC support': vnc.found()}
2390if vnc.found()
2391 summary_info += {'VNC SASL support': sasl.found()}
2392 summary_info += {'VNC JPEG support': jpeg.found()}
2393 summary_info += {'VNC PNG support': png.found()}
f9332757
PB
2394endif
2395summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2396if config_host.has_key('CONFIG_XEN_BACKEND')
2397 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2398endif
8c6d4ff4 2399summary_info += {'brlapi support': brlapi.found()}
e3667660 2400summary_info += {'Documentation': build_docs}
f9332757
PB
2401summary_info += {'PIE': get_option('b_pie')}
2402summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2403summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2404summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2405summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
f7f2d651 2406summary_info += {'ATTR/XATTR support': libattr.found()}
c8d5450b 2407summary_info += {'Install blobs': get_option('install_blobs')}
05512f55
PB
2408summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2409summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2410summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2411summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
2412summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2413if config_all.has_key('CONFIG_TCG')
2414 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
2415 summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
2416endif
aa087962 2417summary_info += {'malloc trim support': has_malloc_trim}
f9332757
PB
2418summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2419summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
fbb4121d 2420summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
f9332757
PB
2421summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
2422summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
2423summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2424summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2425summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2426summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
727c8bb8 2427summary_info += {'libcap-ng support': libcap_ng.found()}
b54b82df 2428summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
f9332757
PB
2429summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2430summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2431summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2432summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
b54b82df 2433summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
e5e856c1 2434summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
f9332757
PB
2435summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2436summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2437summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2438if config_host['TRACE_BACKENDS'].split().contains('simple')
2439 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2440endif
2441# TODO: add back protocol and server version
2442summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
fabd1e93 2443summary_info += {'rbd support': rbd.found()}
f9332757
PB
2444summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
2445summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
0a40bcb7 2446summary_info += {'U2F support': u2f.found()}
f9332757
PB
2447summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
2448summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
2449summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
2450summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
9db405a3 2451summary_info += {'libiscsi support': libiscsi.found()}
30045c05 2452summary_info += {'libnfs support': libnfs.found()}
f9332757
PB
2453summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2454if targetos == 'windows'
2455 if 'WIN_SDK' in config_host
2456 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2457 endif
2458 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2459 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
4bad7c3b 2460 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')}
f9332757 2461endif
90835c2b 2462summary_info += {'seccomp support': seccomp.found()}
9e62ba48
DB
2463summary_info += {'CFI support': get_option('cfi')}
2464summary_info += {'CFI debug support': get_option('cfi_debug')}
f9332757
PB
2465summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2466summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2467summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2468summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2469summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
08821ca2 2470summary_info += {'GlusterFS support': glusterfs.found()}
bf0e56a3 2471summary_info += {'gcov': get_option('b_coverage')}
f9332757
PB
2472summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2473summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
2474summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2475summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
0c32a0ae 2476summary_info += {'lzo support': lzo.found()}
241611ea 2477summary_info += {'snappy support': snappy.found()}
29ba6116 2478summary_info += {'bzip2 support': libbzip2.found()}
ecea3696 2479summary_info += {'lzfse support': liblzfse.found()}
b1def33d 2480summary_info += {'zstd support': zstd.found()}
f9332757
PB
2481summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2482summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
aa087962 2483summary_info += {'memory allocator': get_option('malloc')}
f9332757
PB
2484summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2485summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2486summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2487summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2488summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2489summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2490summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2491summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2492summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2493summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2494summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2495summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
8b18cdbf 2496summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
f9332757
PB
2497summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2498summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
f01496a3 2499summary_info += {'libudev': libudev.found()}
7bc3ca7f 2500summary_info += {'default devices': get_option('default_devices')}
f9332757
PB
2501summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2502summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2503if config_host.has_key('HAVE_GDB_BIN')
2504 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2505endif
2506summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2507summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2508summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
a484a719 2509summary_info += {'FUSE exports': fuse.found()}
df4ea709 2510summary_info += {'FUSE lseek': fuse_lseek.found()}
f9332757
PB
2511summary(summary_info, bool_yn: true)
2512
2513if not supported_cpus.contains(cpu)
2514 message()
2515 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2516 message()
2517 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2518 message('The QEMU project intends to remove support for this host CPU in')
2519 message('a future release if nobody volunteers to maintain it and to')
2520 message('provide a build host for our continuous integration setup.')
2521 message('configure has succeeded and you can continue to build, but')
2522 message('if you care about QEMU on this platform you should contact')
2523 message('us upstream at qemu-devel@nongnu.org.')
2524endif
2525
2526if not supported_oses.contains(targetos)
2527 message()
2528 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2529 message()
2530 message('Host OS ' + targetos + 'support is not currently maintained.')
2531 message('The QEMU project intends to remove support for this host OS in')
2532 message('a future release if nobody volunteers to maintain it and to')
2533 message('provide a build host for our continuous integration setup.')
2534 message('configure has succeeded and you can continue to build, but')
2535 message('if you care about QEMU on this platform you should contact')
2536 message('us upstream at qemu-devel@nongnu.org.')
2537endif