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