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