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