blob: 20a4705b3f969003b8eacc40c6ed3bd013e14467 [file] [log] [blame]
Paolo Bonzinia5665052019-06-10 12:05:14 +02001project('qemu', ['c'], meson_version: '>=0.55.0',
Paolo Bonzinia5cb7c52020-10-19 06:56:16 -04002 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' ] : []),
Paolo Bonzinia5665052019-06-10 12:05:14 +02004 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5
6not_found = dependency('', required: false)
Paolo Bonzinib29b40f2020-08-10 18:04:43 +02007if meson.version().version_compare('>=0.56.0')
8 keyval = import('keyval')
9else
10 keyval = import('unstable-keyval')
11endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040012ss = import('sourceset')
Richard Henderson8b18cdb2020-09-13 12:19:25 -070013fs = import('fs')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040014
Paolo Bonzinice1c1e72020-01-28 16:41:44 +010015sh = find_program('sh')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040016cc = meson.get_compiler('c')
Paolo Bonzinia5665052019-06-10 12:05:14 +020017config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Marc-André Lureau3154fee2019-08-29 22:07:01 +040018enable_modules = 'CONFIG_MODULES' in config_host
Paolo Bonzini35be72b2020-02-06 14:17:15 +010019enable_static = 'CONFIG_STATIC' in config_host
Yonggang Luoe3667662020-10-16 06:06:25 +080020
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'
Marc-André Lureau8fe11232020-09-11 14:42:48 +020027
28if get_option('qemu_suffix').startswith('/')
29 error('qemu_suffix cannot start with a /')
30endif
31
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040032qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
Marc-André Lureauab4c0992020-08-26 15:04:16 +040033qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040034qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040035qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
36
37qemu_desktopdir = get_option('datadir') / 'applications'
38qemu_icondir = get_option('datadir') / 'icons'
39
Paolo Bonzini859aef02020-08-04 18:14:26 +020040config_host_data = configuration_data()
41genh = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020042
Paolo Bonzini760e4322020-08-26 08:09:48 +020043target_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
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040053python = import('python').find_installation()
54
55supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Sergei Trofimovich61256732020-10-12 18:57:19 +010056supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040057 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
58
59cpu = host_machine.cpu_family()
60targetos = host_machine.system()
61
Paolo Bonzini8a199802020-09-18 05:37:01 -040062if 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']
Huacai Chenfbc58842020-10-07 16:39:28 +080070elif cpu in ['mips', 'mips64']
71 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -040072else
73 kvm_targets = []
74endif
75
76accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alex Bennée0c3e41d2020-11-10 19:23:09 +000077if 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
Paolo Bonzini8a199802020-09-18 05:37:01 -040083if cpu in ['x86', 'x86_64']
84 accelerator_targets += {
85 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -040086 'CONFIG_HVF': ['x86_64-softmmu'],
87 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
88 }
89endif
90
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040091##################
92# Compiler flags #
93##################
94
Alexander Bulekovff9ed622020-09-09 18:05:16 -040095# 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
Paolo Bonzinia5665052019-06-10 12:05:14 +0200103add_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'])
Paolo Bonzinia5665052019-06-10 12:05:14 +0200109
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400110if 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'])
Alexander Bulekovc46f76d2020-09-02 13:36:50 -0400138
Marc-André Lureaufc929892019-07-13 01:47:54 +0400139link_language = meson.get_external_property('link_language', 'cpp')
140if link_language == 'cpp'
141 add_languages('cpp', required: true, native: false)
142endif
Paolo Bonzinia5665052019-06-10 12:05:14 +0200143if host_machine.system() == 'darwin'
144 add_languages('objc', required: false, native: false)
145endif
146
Paolo Bonzinideb62372020-09-01 07:51:16 -0400147sparse = find_program('cgcc', required: get_option('sparse'))
148if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100149 run_target('sparse',
150 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400151 'compile_commands.json', sparse.full_path(), '-Wbitwise',
152 '-Wno-transparent-union', '-Wno-old-initializer',
153 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100154endif
155
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200156###########################################
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
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400164m = cc.find_library('m', required: false)
165util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200166winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400167socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400168version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400169coref = []
170iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400171emulator_link_args = []
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400172cocoa = not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400173hvf = not_found
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400174if targetos == 'windows'
175 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200176 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400177
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('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400182elif targetos == 'darwin'
183 coref = dependency('appleframeworks', modules: 'CoreFoundation')
184 iokit = dependency('appleframeworks', modules: 'IOKit')
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400185 cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200186elif 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')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400194elif 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
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400199endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200200
Paolo Bonzini8a199802020-09-18 05:37:01 -0400201accelerators = []
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'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000212 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400213 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
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400259if not cocoa.found() and get_option('cocoa').enabled()
260 error('Cocoa not available on this platform')
261endif
262
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200263################
264# Dependencies #
265################
266
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400267# 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'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400271glib = 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
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400276gio = 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
Daniel P. Berrangé46859d92020-09-01 14:30:49 +0100289gcrypt = 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
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400294nettle = 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
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200304pixman = not_found
305if have_system or have_tools
306 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzini1a949332020-08-31 06:27:00 -0400307 method: 'pkg-config', static: enable_static)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200308endif
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400309pam = not_found
310if 'CONFIG_AUTH_PAM' in config_host
311 pam = cc.find_library('pam')
312endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400313libaio = cc.find_library('aio', required: false)
Paolo Bonzini1ffb3bb2020-08-28 19:33:54 +0200314zlib = dependency('zlib', required: true, static: enable_static)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400315linux_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
Paolo Bonzini30045c02020-11-17 13:11:25 +0100326if 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)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400330endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400331libattr = not_found
332if 'CONFIG_ATTR' in config_host
333 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
334endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100335seccomp = 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
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400344if 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'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400348 method: 'pkg-config', static: enable_static)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400349endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400350vde = not_found
351if config_host.has_key('CONFIG_VDE')
352 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
353endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200354pulse = 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
Paolo Bonzini26347332019-07-29 15:40:07 +0200368spice = not_found
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200369spice_headers = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200370if 'CONFIG_SPICE' in config_host
371 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
372 link_args: config_host['SPICE_LIBS'].split())
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200373 spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
Paolo Bonzini26347332019-07-29 15:40:07 +0200374endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400375rt = cc.find_library('rt', required: false)
Paolo Bonziniccf7afa2020-09-01 06:44:23 -0400376libdl = not_found
377if 'CONFIG_PLUGIN' in config_host
378 libdl = cc.find_library('dl', required: true)
379endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200380libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100381if 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)
Paolo Bonzini99650b62019-06-10 12:21:14 +0200385endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400386zstd = not_found
Paolo Bonzinib1def332020-11-17 13:37:39 +0100387if not get_option('zstd').auto() or have_block
388 zstd = dependency('libzstd', version: '>=1.4.0',
389 required: get_option('zstd'),
390 method: 'pkg-config', static: enable_static)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400391endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400392gbm = not_found
393if 'CONFIG_GBM' in config_host
394 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
395 link_args: config_host['GBM_LIBS'].split())
396endif
397virgl = not_found
398if 'CONFIG_VIRGL' in config_host
399 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
400 link_args: config_host['VIRGL_LIBS'].split())
401endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400402curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100403if not get_option('curl').auto() or have_block
404 curl = dependency('libcurl', version: '>=7.29.0',
405 method: 'pkg-config',
406 required: get_option('curl'),
407 static: enable_static)
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400408endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200409libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200410if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200411 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +0100412 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400413 required: get_option('libudev'),
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200414 static: enable_static)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200415endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200416
Paolo Bonzini5c530152020-10-15 06:09:27 -0400417mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200418mpathpersist = not_found
419mpathpersist_new_api = false
420if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
421 mpath_test_source_new = '''
422 #include <libudev.h>
423 #include <mpath_persist.h>
424 unsigned mpath_mx_alloc_len = 1024;
425 int logsink;
426 static struct config *multipath_conf;
427 extern struct udev *udev;
428 extern struct config *get_multipath_config(void);
429 extern void put_multipath_config(struct config *conf);
430 struct udev *udev;
431 struct config *get_multipath_config(void) { return multipath_conf; }
432 void put_multipath_config(struct config *conf) { }
433 int main(void) {
434 udev = udev_new();
435 multipath_conf = mpath_lib_init();
436 return 0;
437 }'''
438 mpath_test_source_old = '''
439 #include <libudev.h>
440 #include <mpath_persist.h>
441 unsigned mpath_mx_alloc_len = 1024;
442 int logsink;
443 int main(void) {
444 struct udev *udev = udev_new();
445 mpath_lib_init(udev);
446 return 0;
447 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400448 libmpathpersist = cc.find_library('mpathpersist',
449 required: get_option('mpath'),
450 static: enable_static)
451 if libmpathpersist.found()
452 mpathlibs += libmpathpersist
453 if enable_static
454 mpathlibs += cc.find_library('devmapper',
455 required: get_option('mpath'),
456 static: enable_static)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200457 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400458 mpathlibs += cc.find_library('multipath',
459 required: get_option('mpath'),
460 static: enable_static)
461 foreach lib: mpathlibs
462 if not lib.found()
463 mpathlibs = []
464 break
465 endif
466 endforeach
467 if mpathlibs.length() == 0
468 msg = 'Dependencies missing for libmpathpersist'
469 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200470 mpathpersist = declare_dependency(dependencies: mpathlibs)
471 mpathpersist_new_api = true
472 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
473 mpathpersist = declare_dependency(dependencies: mpathlibs)
474 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400475 msg = 'Cannot detect libmpathpersist API'
476 endif
477 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200478 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400479 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200480 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400481 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200482 endif
483 endif
484 endif
485endif
486
Yonggang Luo5285e592020-10-13 07:43:48 +0800487iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800488curses = not_found
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400489if have_system and not get_option('curses').disabled()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400490 curses_test = '''
491 #include <locale.h>
492 #include <curses.h>
493 #include <wchar.h>
494 int main(void) {
495 wchar_t wch = L'w';
496 setlocale(LC_ALL, "");
497 resize_term(0, 0);
498 addwstr(L"wide chars\n");
499 addnwstr(&wch, 1);
500 add_wch(WACS_DEGREE);
501 return 0;
502 }'''
503
Yonggang Luoca31e302020-11-17 05:31:06 +0800504 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
505 foreach curses_dep : curses_dep_list
506 if not curses.found()
507 curses = dependency(curses_dep,
508 required: false,
509 method: 'pkg-config',
510 static: enable_static)
511 endif
512 endforeach
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400513 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500514 curses_compile_args = ['-DNCURSES_WIDECHAR']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400515 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500516 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
517 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400518 else
519 msg = 'curses package not usable'
520 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800521 endif
522 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400523 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400524 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
525 if targetos != 'windows' and not has_curses_h
526 message('Trying with /usr/include/ncursesw')
527 curses_compile_args += ['-I/usr/include/ncursesw']
528 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
529 endif
530 if has_curses_h
531 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
532 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800533 libcurses = cc.find_library(curses_libname,
534 required: false,
Yonggang Luo5285e592020-10-13 07:43:48 +0800535 static: enable_static)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400536 if libcurses.found()
537 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
538 curses = declare_dependency(compile_args: curses_compile_args,
539 dependencies: [libcurses])
540 break
541 else
542 msg = 'curses library not usable'
543 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800544 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400545 endforeach
546 endif
547 endif
548 if not get_option('iconv').disabled()
549 foreach link_args : [ ['-liconv'], [] ]
550 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
551 # We need to use libiconv if available because mixing libiconv's headers with
552 # the system libc does not work.
553 # However, without adding glib to the dependencies -L/usr/local/lib will not be
554 # included in the command line and libiconv will not be found.
555 if cc.links('''
556 #include <iconv.h>
557 int main(void) {
558 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
559 return conv != (iconv_t) -1;
560 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
561 iconv = declare_dependency(link_args: link_args, dependencies: glib)
562 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800563 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400564 endforeach
565 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400566 if curses.found() and not iconv.found()
567 if get_option('iconv').enabled()
568 error('iconv not available')
569 endif
570 msg = 'iconv required for curses UI but not available'
571 curses = not_found
572 endif
573 if not curses.found() and msg != ''
574 if get_option('curses').enabled()
575 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400576 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400577 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400578 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800579 endif
580endif
581
Paolo Bonzini26347332019-07-29 15:40:07 +0200582brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100583if not get_option('brlapi').auto() or have_system
584 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
585 required: get_option('brlapi'),
586 static: enable_static)
587 if brlapi.found() and not cc.links('''
588 #include <brlapi.h>
589 #include <stddef.h>
590 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
591 brlapi = not_found
592 if get_option('brlapi').enabled()
593 error('could not link brlapi')
594 else
595 warning('could not link brlapi, disabling')
596 endif
597 endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200598endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100599
Paolo Bonzini760e4322020-08-26 08:09:48 +0200600sdl = not_found
601if have_system
Yonggang Luo363743d2020-08-26 23:10:03 +0800602 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200603 sdl_image = not_found
604endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100605if sdl.found()
606 # work around 2.0.8 bug
607 sdl = declare_dependency(compile_args: '-Wno-undef',
608 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200609 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400610 method: 'pkg-config', static: enable_static)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100611else
612 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100613 error('sdl-image required, but SDL was @0@'.format(
614 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100615 endif
616 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200617endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100618
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400619rbd = not_found
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100620if not get_option('rbd').auto() or have_block
621 librados = cc.find_library('rados', required: get_option('rbd'),
622 static: enable_static)
623 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
624 required: get_option('rbd'),
625 static: enable_static)
626 if librados.found() and librbd.found() and cc.links('''
627 #include <stdio.h>
628 #include <rbd/librbd.h>
629 int main(void) {
630 rados_t cluster;
631 rados_create(&cluster, NULL);
632 return 0;
633 }''', dependencies: [librbd, librados])
634 rbd = declare_dependency(dependencies: [librbd, librados])
635 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400636endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100637
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400638glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100639glusterfs_ftruncate_has_stat = false
640glusterfs_iocb_has_stat = false
641if not get_option('glusterfs').auto() or have_block
642 glusterfs = dependency('glusterfs-api', version: '>=3',
643 required: get_option('glusterfs'),
644 method: 'pkg-config', static: enable_static)
645 if glusterfs.found()
646 glusterfs_ftruncate_has_stat = cc.links('''
647 #include <glusterfs/api/glfs.h>
648
649 int
650 main(void)
651 {
652 /* new glfs_ftruncate() passes two additional args */
653 return glfs_ftruncate(NULL, 0, NULL, NULL);
654 }
655 ''', dependencies: glusterfs)
656 glusterfs_iocb_has_stat = cc.links('''
657 #include <glusterfs/api/glfs.h>
658
659 /* new glfs_io_cbk() passes two additional glfs_stat structs */
660 static void
661 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
662 {}
663
664 int
665 main(void)
666 {
667 glfs_io_cbk iocb = &glusterfs_iocb;
668 iocb(NULL, 0 , NULL, NULL, NULL);
669 return 0;
670 }
671 ''', dependencies: glusterfs)
672 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400673endif
674libssh = not_found
675if 'CONFIG_LIBSSH' in config_host
676 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
677 link_args: config_host['LIBSSH_LIBS'].split())
678endif
679libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100680if not get_option('bzip2').auto() or have_block
681 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
682 required: get_option('bzip2'),
683 static: enable_static)
684 if libbzip2.found() and not cc.links('''
685 #include <bzlib.h>
686 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
687 libbzip2 = not_found
688 if get_option('bzip2').enabled()
689 error('could not link libbzip2')
690 else
691 warning('could not link libbzip2, disabling')
692 endif
693 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400694endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100695
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400696liblzfse = not_found
Paolo Bonziniecea3692020-11-17 13:35:28 +0100697if not get_option('lzfse').auto() or have_block
698 liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'],
699 required: get_option('lzfse'),
700 static: enable_static)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400701endif
Paolo Bonziniecea3692020-11-17 13:35:28 +0100702if liblzfse.found() and not cc.links('''
703 #include <lzfse.h>
704 int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse)
705 liblzfse = not_found
706 if get_option('lzfse').enabled()
707 error('could not link liblzfse')
708 else
709 warning('could not link liblzfse, disabling')
710 endif
711endif
712
Paolo Bonzini478e9432020-08-17 12:47:55 +0200713oss = not_found
714if 'CONFIG_AUDIO_OSS' in config_host
715 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
716endif
717dsound = not_found
718if 'CONFIG_AUDIO_DSOUND' in config_host
719 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
720endif
721coreaudio = not_found
722if 'CONFIG_AUDIO_COREAUDIO' in config_host
723 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
724endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400725opengl = not_found
726if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400727 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
728 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400729endif
730gtk = not_found
731if 'CONFIG_GTK' in config_host
732 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
733 link_args: config_host['GTK_LIBS'].split())
734endif
735vte = not_found
736if 'CONFIG_VTE' in config_host
737 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
738 link_args: config_host['VTE_LIBS'].split())
739endif
740x11 = not_found
741if 'CONFIG_X11' in config_host
742 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
743 link_args: config_host['X11_LIBS'].split())
744endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100745vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400746png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400747jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400748sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100749if get_option('vnc').enabled()
750 vnc = declare_dependency() # dummy dependency
751 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400752 method: 'pkg-config', static: enable_static)
Paolo Bonzini8e242b32020-11-23 13:34:02 -0500753 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
754 method: 'pkg-config', static: enable_static)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100755 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
756 required: get_option('vnc_sasl'),
757 static: enable_static)
758 if sasl.found()
759 sasl = declare_dependency(dependencies: sasl,
760 compile_args: '-DSTRUCT_IOVEC_DEFINED')
761 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400762endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100763
Marc-André Lureau708eab42019-09-03 16:59:33 +0400764snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +0100765if not get_option('snappy').auto() or have_system
766 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
767 required: get_option('snappy'),
768 static: enable_static)
769endif
770if snappy.found() and not cc.links('''
771 #include <snappy-c.h>
772 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
773 snappy = not_found
774 if get_option('snappy').enabled()
775 error('could not link libsnappy')
776 else
777 warning('could not link libsnappy, disabling')
778 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400779endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100780
Marc-André Lureau708eab42019-09-03 16:59:33 +0400781lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100782if not get_option('lzo').auto() or have_system
783 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
784 required: get_option('lzo'),
785 static: enable_static)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400786endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100787if lzo.found() and not cc.links('''
788 #include <lzo/lzo1x.h>
789 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
790 lzo = not_found
791 if get_option('lzo').enabled()
792 error('could not link liblzo2')
793 else
794 warning('could not link liblzo2, disabling')
795 endif
796endif
797
Marc-André Lureau55166232019-07-24 19:16:22 +0400798rdma = not_found
799if 'CONFIG_RDMA' in config_host
800 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
801endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400802numa = not_found
803if 'CONFIG_NUMA' in config_host
804 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
805endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400806xen = not_found
807if 'CONFIG_XEN_BACKEND' in config_host
808 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
809 link_args: config_host['XEN_LIBS'].split())
810endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200811cacard = not_found
812if 'CONFIG_SMARTCARD' in config_host
813 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
814 link_args: config_host['SMARTCARD_LIBS'].split())
815endif
César Belley0a40bcb2020-08-26 13:42:04 +0200816u2f = not_found
817if have_system
818 u2f = dependency('u2f-emu', required: get_option('u2f'),
819 method: 'pkg-config',
820 static: enable_static)
821endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200822usbredir = not_found
823if 'CONFIG_USB_REDIR' in config_host
824 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
825 link_args: config_host['USB_REDIR_LIBS'].split())
826endif
827libusb = not_found
828if 'CONFIG_USB_LIBUSB' in config_host
829 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
830 link_args: config_host['LIBUSB_LIBS'].split())
831endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400832libpmem = not_found
833if 'CONFIG_LIBPMEM' in config_host
834 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
835 link_args: config_host['LIBPMEM_LIBS'].split())
836endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600837libdaxctl = not_found
838if 'CONFIG_LIBDAXCTL' in config_host
839 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
840endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +0400841tasn1 = not_found
842if 'CONFIG_TASN1' in config_host
843 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
844 link_args: config_host['TASN1_LIBS'].split())
845endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400846keyutils = dependency('libkeyutils', required: false,
847 method: 'pkg-config', static: enable_static)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400848
Marc-André Lureau3909def2020-08-28 15:07:33 +0400849has_gettid = cc.has_function('gettid')
850
Paolo Bonziniaa087962020-09-01 11:15:30 -0400851# Malloc tests
852
853malloc = []
854if get_option('malloc') == 'system'
855 has_malloc_trim = \
856 not get_option('malloc_trim').disabled() and \
857 cc.links('''#include <malloc.h>
858 int main(void) { malloc_trim(0); return 0; }''')
859else
860 has_malloc_trim = false
861 malloc = cc.find_library(get_option('malloc'), required: true)
862endif
863if not has_malloc_trim and get_option('malloc_trim').enabled()
864 if get_option('malloc') == 'system'
865 error('malloc_trim not available on this platform.')
866 else
867 error('malloc_trim not available with non-libc memory allocator')
868 endif
869endif
870
Max Reitz84e319a2020-11-02 17:18:55 +0100871# Check whether the glibc provides statx()
872
873statx_test = '''
874 #ifndef _GNU_SOURCE
875 #define _GNU_SOURCE
876 #endif
877 #include <sys/stat.h>
878 int main(void) {
879 struct statx statxbuf;
880 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
881 return 0;
882 }'''
883
884has_statx = cc.links(statx_test)
885
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000886have_vhost_user_blk_server = (targetos == 'linux' and
887 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000888
889if get_option('vhost_user_blk_server').enabled()
890 if targetos != 'linux'
891 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000892 elif 'CONFIG_VHOST_USER' not in config_host
893 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000894 endif
895elif get_option('vhost_user_blk_server').disabled() or not have_system
896 have_vhost_user_blk_server = false
897endif
898
Daniele Buono9e62ba42020-12-04 18:06:14 -0500899
Max Reitzdf4ea702020-10-27 20:05:46 +0100900if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
901 error('Cannot enable fuse-lseek while fuse is disabled')
902endif
903
Max Reitza484a712020-10-27 20:05:41 +0100904fuse = dependency('fuse3', required: get_option('fuse'),
905 version: '>=3.1', method: 'pkg-config',
906 static: enable_static)
907
Max Reitzdf4ea702020-10-27 20:05:46 +0100908fuse_lseek = not_found
909if not get_option('fuse_lseek').disabled()
910 if fuse.version().version_compare('>=3.8')
911 # Dummy dependency
912 fuse_lseek = declare_dependency()
913 elif get_option('fuse_lseek').enabled()
914 if fuse.found()
915 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
916 else
917 error('fuse-lseek requires libfuse, which was not found')
918 endif
919 endif
920endif
921
Daniele Buono9e62ba42020-12-04 18:06:14 -0500922if get_option('cfi')
923 cfi_flags=[]
924 # Check for dependency on LTO
925 if not get_option('b_lto')
926 error('Selected Control-Flow Integrity but LTO is disabled')
927 endif
928 if config_host.has_key('CONFIG_MODULES')
929 error('Selected Control-Flow Integrity is not compatible with modules')
930 endif
931 # Check for cfi flags. CFI requires LTO so we can't use
932 # get_supported_arguments, but need a more complex "compiles" which allows
933 # custom arguments
934 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
935 args: ['-flto', '-fsanitize=cfi-icall'] )
936 cfi_flags += '-fsanitize=cfi-icall'
937 else
938 error('-fsanitize=cfi-icall is not supported by the compiler')
939 endif
940 if cc.compiles('int main () { return 0; }',
941 name: '-fsanitize-cfi-icall-generalize-pointers',
942 args: ['-flto', '-fsanitize=cfi-icall',
943 '-fsanitize-cfi-icall-generalize-pointers'] )
944 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
945 else
946 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
947 endif
948 if get_option('cfi_debug')
949 if cc.compiles('int main () { return 0; }',
950 name: '-fno-sanitize-trap=cfi-icall',
951 args: ['-flto', '-fsanitize=cfi-icall',
952 '-fno-sanitize-trap=cfi-icall'] )
953 cfi_flags += '-fno-sanitize-trap=cfi-icall'
954 else
955 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
956 endif
957 endif
958 add_project_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
959 add_project_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
960endif
961
Paolo Bonzinia0c91622020-10-07 11:01:51 -0400962#################
963# config-host.h #
964#################
Paolo Bonzini859aef02020-08-04 18:14:26 +0200965
Paolo Bonzini16bf7a32020-10-16 03:19:14 -0400966config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
967config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
968config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
969config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
970config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
971config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
972config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
973config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
974config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
975config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
976config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
977config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
978
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100979config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400980config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200981config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100982config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200983config_host_data.set('CONFIG_MPATH', mpathpersist.found())
984config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100985config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +0800986config_host_data.set('CONFIG_CURSES', curses.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100987config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
988if glusterfs.found()
989 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
990 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
991 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
992 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
993 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
994 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
995endif
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100996config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +0100997config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100998config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100999config_host_data.set('CONFIG_SDL', sdl.found())
1000config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +01001001config_host_data.set('CONFIG_SNAPPY', snappy.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00001002config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001003config_host_data.set('CONFIG_VNC', vnc.found())
1004config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
1005config_host_data.set('CONFIG_VNC_PNG', png.found())
1006config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001007config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +04001008config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +04001009config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonziniaa087962020-09-01 11:15:30 -04001010config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +01001011config_host_data.set('CONFIG_STATX', has_statx)
Paolo Bonzinib1def332020-11-17 13:37:39 +01001012config_host_data.set('CONFIG_ZSTD', zstd.found())
Max Reitza484a712020-10-27 20:05:41 +01001013config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +01001014config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Daniele Buono9e62ba42020-12-04 18:06:14 -05001015config_host_data.set('CONFIG_CFI', get_option('cfi'))
Paolo Bonzini859aef02020-08-04 18:14:26 +02001016config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1017config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1018config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1019config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1020
Thomas Huth48f670e2020-11-18 18:10:52 +01001021config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001022config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001023config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001024config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001025config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Thomas Huth88c78f12020-11-18 18:10:50 +01001026config_host_data.set('HAVE_SYS_SIGNAL_H', cc.has_header('sys/signal.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001027
Paolo Bonzini765686d2020-09-18 06:37:21 -04001028ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
Paolo Bonzini859aef02020-08-04 18:14:26 +02001029arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001030strings = ['HOST_DSOSUF', 'CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001031foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -04001032 if ignored.contains(k)
1033 # do nothing
1034 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001035 if v != ''
1036 v = '"' + '", "'.join(v.split()) + '", '
1037 endif
1038 config_host_data.set(k, v)
1039 elif k == 'ARCH'
1040 config_host_data.set('HOST_' + v.to_upper(), 1)
1041 elif strings.contains(k)
1042 if not k.startswith('CONFIG_')
1043 k = 'CONFIG_' + k.to_upper()
1044 endif
1045 config_host_data.set_quoted(k, v)
1046 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
1047 config_host_data.set(k, v == 'y' ? 1 : v)
1048 endif
1049endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02001050
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001051########################
1052# Target configuration #
1053########################
1054
Paolo Bonzini2becc362020-02-03 11:42:03 +01001055minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04001056config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001057config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001058config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001059config_devices_mak_list = []
1060config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02001061config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001062config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001063
1064disassemblers = {
1065 'alpha' : ['CONFIG_ALPHA_DIS'],
1066 'arm' : ['CONFIG_ARM_DIS'],
1067 'avr' : ['CONFIG_AVR_DIS'],
1068 'cris' : ['CONFIG_CRIS_DIS'],
1069 'hppa' : ['CONFIG_HPPA_DIS'],
1070 'i386' : ['CONFIG_I386_DIS'],
1071 'x86_64' : ['CONFIG_I386_DIS'],
1072 'x32' : ['CONFIG_I386_DIS'],
1073 'lm32' : ['CONFIG_LM32_DIS'],
1074 'm68k' : ['CONFIG_M68K_DIS'],
1075 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1076 'mips' : ['CONFIG_MIPS_DIS'],
1077 'moxie' : ['CONFIG_MOXIE_DIS'],
1078 'nios2' : ['CONFIG_NIOS2_DIS'],
1079 'or1k' : ['CONFIG_OPENRISC_DIS'],
1080 'ppc' : ['CONFIG_PPC_DIS'],
1081 'riscv' : ['CONFIG_RISCV_DIS'],
1082 'rx' : ['CONFIG_RX_DIS'],
1083 's390' : ['CONFIG_S390_DIS'],
1084 'sh4' : ['CONFIG_SH4_DIS'],
1085 'sparc' : ['CONFIG_SPARC_DIS'],
1086 'xtensa' : ['CONFIG_XTENSA_DIS'],
1087}
1088if link_language == 'cpp'
1089 disassemblers += {
1090 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1091 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1092 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1093 }
1094endif
1095
Paolo Bonzini0a189112020-11-17 14:58:32 +01001096host_kconfig = \
1097 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
1098 ('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
1099 ('CONFIG_IVSHMEM' in config_host ? ['CONFIG_IVSHMEM=y'] : []) + \
1100 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
1101 ('CONFIG_X11' in config_host ? ['CONFIG_X11=y'] : []) + \
1102 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1103 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1104 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
1105 ('CONFIG_VIRTFS' in config_host ? ['CONFIG_VIRTFS=y'] : []) + \
1106 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
1107 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : [])
1108
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001109ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001110
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001111default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1112actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001113fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001114foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04001115 config_target = { 'TARGET_NAME': target.split('-')[0] }
1116 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001117 if targetos != 'linux'
1118 if default_targets
1119 continue
1120 endif
1121 error('Target @0@ is only available on a Linux host'.format(target))
1122 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001123 config_target += { 'CONFIG_LINUX_USER': 'y' }
1124 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001125 if 'CONFIG_BSD' not in config_host
1126 if default_targets
1127 continue
1128 endif
1129 error('Target @0@ is only available on a BSD host'.format(target))
1130 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001131 config_target += { 'CONFIG_BSD_USER': 'y' }
1132 elif target.endswith('softmmu')
1133 config_target += { 'CONFIG_SOFTMMU': 'y' }
1134 endif
1135 if target.endswith('-user')
1136 config_target += {
1137 'CONFIG_USER_ONLY': 'y',
1138 'CONFIG_QEMU_INTERP_PREFIX':
1139 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1140 }
1141 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001142
Paolo Bonzini0a189112020-11-17 14:58:32 +01001143 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04001144 foreach sym: accelerators
1145 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1146 config_target += { sym: 'y' }
1147 config_all += { sym: 'y' }
1148 if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
1149 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1150 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01001151 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04001152 endif
1153 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01001154 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001155 if default_targets
1156 continue
1157 endif
1158 error('No accelerator available for target @0@'.format(target))
1159 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001160
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001161 actual_target_dirs += target
Paolo Bonzini765686d2020-09-18 06:37:21 -04001162 config_target += keyval.load('default-configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001163 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001164
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001165 if 'TARGET_NEED_FDT' in config_target
1166 fdt_required += target
1167 endif
1168
Paolo Bonzinifa731682020-09-21 05:19:07 -04001169 # Add default keys
1170 if 'TARGET_BASE_ARCH' not in config_target
1171 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1172 endif
1173 if 'TARGET_ABI_DIR' not in config_target
1174 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1175 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001176
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001177 foreach k, v: disassemblers
1178 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1179 foreach sym: v
1180 config_target += { sym: 'y' }
1181 config_all_disas += { sym: 'y' }
1182 endforeach
1183 endif
1184 endforeach
1185
Paolo Bonzini859aef02020-08-04 18:14:26 +02001186 config_target_data = configuration_data()
1187 foreach k, v: config_target
1188 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1189 # do nothing
1190 elif ignored.contains(k)
1191 # do nothing
1192 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001193 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1194 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001195 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001196 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001197 config_target_data.set_quoted(k, v)
1198 elif v == 'y'
1199 config_target_data.set(k, 1)
1200 else
1201 config_target_data.set(k, v)
1202 endif
1203 endforeach
1204 config_target_h += {target: configure_file(output: target + '-config-target.h',
1205 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001206
1207 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001208 config_devices_mak = target + '-config-devices.mak'
1209 config_devices_mak = configure_file(
Paolo Bonzini1bb4cb12020-09-18 06:06:09 -04001210 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001211 output: config_devices_mak,
1212 depfile: config_devices_mak + '.d',
1213 capture: true,
1214 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
1215 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzini0a189112020-11-17 14:58:32 +01001216 host_kconfig, accel_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02001217
1218 config_devices_data = configuration_data()
1219 config_devices = keyval.load(config_devices_mak)
1220 foreach k, v: config_devices
1221 config_devices_data.set(k, 1)
1222 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001223 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001224 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1225 configuration: config_devices_data)}
1226 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001227 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001228 endif
1229 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001230endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001231target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001232
Paolo Bonzini2becc362020-02-03 11:42:03 +01001233# This configuration is used to build files that are shared by
1234# multiple binaries, and then extracted out of the "common"
1235# static_library target.
1236#
1237# We do not use all_sources()/all_dependencies(), because it would
1238# build literally all source files, including devices only used by
1239# targets that are not built for this compilation. The CONFIG_ALL
1240# pseudo symbol replaces it.
1241
Paolo Bonzini05512f52020-09-16 15:31:11 -04001242config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001243config_all += config_host
1244config_all += config_all_disas
1245config_all += {
1246 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1247 'CONFIG_SOFTMMU': have_system,
1248 'CONFIG_USER_ONLY': have_user,
1249 'CONFIG_ALL': true,
1250}
1251
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001252##############
1253# Submodules #
1254##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001255
1256capstone = not_found
1257capstone_opt = get_option('capstone')
1258if capstone_opt in ['enabled', 'auto', 'system']
1259 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07001260 capstone = dependency('capstone', version: '>=4.0',
1261 static: enable_static, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001262 required: capstone_opt == 'system' or
1263 capstone_opt == 'enabled' and not have_internal)
1264 if capstone.found()
1265 capstone_opt = 'system'
1266 elif have_internal
1267 capstone_opt = 'internal'
1268 else
1269 capstone_opt = 'disabled'
1270 endif
1271endif
1272if capstone_opt == 'internal'
1273 capstone_data = configuration_data()
1274 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1275
1276 capstone_files = files(
1277 'capstone/cs.c',
1278 'capstone/MCInst.c',
1279 'capstone/MCInstrDesc.c',
1280 'capstone/MCRegisterInfo.c',
1281 'capstone/SStream.c',
1282 'capstone/utils.c'
1283 )
1284
1285 if 'CONFIG_ARM_DIS' in config_all_disas
1286 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1287 capstone_files += files(
1288 'capstone/arch/ARM/ARMDisassembler.c',
1289 'capstone/arch/ARM/ARMInstPrinter.c',
1290 'capstone/arch/ARM/ARMMapping.c',
1291 'capstone/arch/ARM/ARMModule.c'
1292 )
1293 endif
1294
1295 # FIXME: This config entry currently depends on a c++ compiler.
1296 # Which is needed for building libvixl, but not for capstone.
1297 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1298 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1299 capstone_files += files(
1300 'capstone/arch/AArch64/AArch64BaseInfo.c',
1301 'capstone/arch/AArch64/AArch64Disassembler.c',
1302 'capstone/arch/AArch64/AArch64InstPrinter.c',
1303 'capstone/arch/AArch64/AArch64Mapping.c',
1304 'capstone/arch/AArch64/AArch64Module.c'
1305 )
1306 endif
1307
1308 if 'CONFIG_PPC_DIS' in config_all_disas
1309 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1310 capstone_files += files(
1311 'capstone/arch/PowerPC/PPCDisassembler.c',
1312 'capstone/arch/PowerPC/PPCInstPrinter.c',
1313 'capstone/arch/PowerPC/PPCMapping.c',
1314 'capstone/arch/PowerPC/PPCModule.c'
1315 )
1316 endif
1317
Richard Henderson3d562842020-01-04 07:24:59 +10001318 if 'CONFIG_S390_DIS' in config_all_disas
1319 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1320 capstone_files += files(
1321 'capstone/arch/SystemZ/SystemZDisassembler.c',
1322 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1323 'capstone/arch/SystemZ/SystemZMapping.c',
1324 'capstone/arch/SystemZ/SystemZModule.c',
1325 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1326 )
1327 endif
1328
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001329 if 'CONFIG_I386_DIS' in config_all_disas
1330 capstone_data.set('CAPSTONE_HAS_X86', 1)
1331 capstone_files += files(
1332 'capstone/arch/X86/X86Disassembler.c',
1333 'capstone/arch/X86/X86DisassemblerDecoder.c',
1334 'capstone/arch/X86/X86ATTInstPrinter.c',
1335 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07001336 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001337 'capstone/arch/X86/X86Mapping.c',
1338 'capstone/arch/X86/X86Module.c'
1339 )
1340 endif
1341
1342 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1343
1344 capstone_cargs = [
1345 # FIXME: There does not seem to be a way to completely replace the c_args
1346 # that come from add_project_arguments() -- we can only add to them.
1347 # So: disable all warnings with a big hammer.
1348 '-Wno-error', '-w',
1349
1350 # Include all configuration defines via a header file, which will wind up
1351 # as a dependency on the object file, and thus changes here will result
1352 # in a rebuild.
1353 '-include', 'capstone-defs.h'
1354 ]
1355
1356 libcapstone = static_library('capstone',
1357 sources: capstone_files,
1358 c_args: capstone_cargs,
1359 include_directories: 'capstone/include')
1360 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07001361 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001362endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001363
1364slirp = not_found
1365slirp_opt = 'disabled'
1366if have_system
1367 slirp_opt = get_option('slirp')
1368 if slirp_opt in ['enabled', 'auto', 'system']
1369 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
1370 slirp = dependency('slirp', static: enable_static,
1371 method: 'pkg-config',
1372 required: slirp_opt == 'system' or
1373 slirp_opt == 'enabled' and not have_internal)
1374 if slirp.found()
1375 slirp_opt = 'system'
1376 elif have_internal
1377 slirp_opt = 'internal'
1378 else
1379 slirp_opt = 'disabled'
1380 endif
1381 endif
1382 if slirp_opt == 'internal'
1383 slirp_deps = []
1384 if targetos == 'windows'
1385 slirp_deps = cc.find_library('iphlpapi')
1386 endif
1387 slirp_conf = configuration_data()
1388 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1389 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1390 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1391 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1392 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1393 slirp_files = [
1394 'slirp/src/arp_table.c',
1395 'slirp/src/bootp.c',
1396 'slirp/src/cksum.c',
1397 'slirp/src/dhcpv6.c',
1398 'slirp/src/dnssearch.c',
1399 'slirp/src/if.c',
1400 'slirp/src/ip6_icmp.c',
1401 'slirp/src/ip6_input.c',
1402 'slirp/src/ip6_output.c',
1403 'slirp/src/ip_icmp.c',
1404 'slirp/src/ip_input.c',
1405 'slirp/src/ip_output.c',
1406 'slirp/src/mbuf.c',
1407 'slirp/src/misc.c',
1408 'slirp/src/ncsi.c',
1409 'slirp/src/ndp_table.c',
1410 'slirp/src/sbuf.c',
1411 'slirp/src/slirp.c',
1412 'slirp/src/socket.c',
1413 'slirp/src/state.c',
1414 'slirp/src/stream.c',
1415 'slirp/src/tcp_input.c',
1416 'slirp/src/tcp_output.c',
1417 'slirp/src/tcp_subr.c',
1418 'slirp/src/tcp_timer.c',
1419 'slirp/src/tftp.c',
1420 'slirp/src/udp.c',
1421 'slirp/src/udp6.c',
1422 'slirp/src/util.c',
1423 'slirp/src/version.c',
1424 'slirp/src/vmstate.c',
1425 ]
1426
1427 configure_file(
1428 input : 'slirp/src/libslirp-version.h.in',
1429 output : 'libslirp-version.h',
1430 configuration: slirp_conf)
1431
1432 slirp_inc = include_directories('slirp', 'slirp/src')
1433 libslirp = static_library('slirp',
1434 sources: slirp_files,
1435 c_args: slirp_cargs,
1436 include_directories: slirp_inc)
1437 slirp = declare_dependency(link_with: libslirp,
1438 dependencies: slirp_deps,
1439 include_directories: slirp_inc)
1440 endif
1441endif
1442
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001443fdt = not_found
1444fdt_opt = get_option('fdt')
1445if have_system
1446 if fdt_opt in ['enabled', 'auto', 'system']
1447 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
1448 fdt = cc.find_library('fdt', static: enable_static,
1449 required: fdt_opt == 'system' or
1450 fdt_opt == 'enabled' and not have_internal)
1451 if fdt.found() and cc.links('''
1452 #include <libfdt.h>
1453 #include <libfdt_env.h>
1454 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1455 dependencies: fdt)
1456 fdt_opt = 'system'
1457 elif have_internal
1458 fdt_opt = 'internal'
1459 else
1460 fdt_opt = 'disabled'
1461 endif
1462 endif
1463 if fdt_opt == 'internal'
1464 fdt_files = files(
1465 'dtc/libfdt/fdt.c',
1466 'dtc/libfdt/fdt_ro.c',
1467 'dtc/libfdt/fdt_wip.c',
1468 'dtc/libfdt/fdt_sw.c',
1469 'dtc/libfdt/fdt_rw.c',
1470 'dtc/libfdt/fdt_strerror.c',
1471 'dtc/libfdt/fdt_empty_tree.c',
1472 'dtc/libfdt/fdt_addresses.c',
1473 'dtc/libfdt/fdt_overlay.c',
1474 'dtc/libfdt/fdt_check.c',
1475 )
1476
1477 fdt_inc = include_directories('dtc/libfdt')
1478 libfdt = static_library('fdt',
1479 sources: fdt_files,
1480 include_directories: fdt_inc)
1481 fdt = declare_dependency(link_with: libfdt,
1482 include_directories: fdt_inc)
1483 endif
1484endif
1485if not fdt.found() and fdt_required.length() > 0
1486 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1487endif
1488
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001489config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001490config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001491config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001492
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001493#####################
1494# Generated sources #
1495#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001496
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001497genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001498
Marc-André Lureau3f885652019-07-15 18:06:04 +04001499hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04001500shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001501qapi_gen = find_program('scripts/qapi-gen.py')
1502qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1503 meson.source_root() / 'scripts/qapi/commands.py',
1504 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001505 meson.source_root() / 'scripts/qapi/error.py',
1506 meson.source_root() / 'scripts/qapi/events.py',
1507 meson.source_root() / 'scripts/qapi/expr.py',
1508 meson.source_root() / 'scripts/qapi/gen.py',
1509 meson.source_root() / 'scripts/qapi/introspect.py',
1510 meson.source_root() / 'scripts/qapi/parser.py',
1511 meson.source_root() / 'scripts/qapi/schema.py',
1512 meson.source_root() / 'scripts/qapi/source.py',
1513 meson.source_root() / 'scripts/qapi/types.py',
1514 meson.source_root() / 'scripts/qapi/visit.py',
1515 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001516 meson.source_root() / 'scripts/qapi-gen.py'
1517]
1518
1519tracetool = [
1520 python, files('scripts/tracetool.py'),
1521 '--backend=' + config_host['TRACE_BACKENDS']
1522]
1523
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001524qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1525 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02001526 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001527qemu_version = custom_target('qemu-version.h',
1528 output: 'qemu-version.h',
1529 command: qemu_version_cmd,
1530 capture: true,
1531 build_by_default: true,
1532 build_always_stale: true)
1533genh += qemu_version
1534
Marc-André Lureau3f885652019-07-15 18:06:04 +04001535hxdep = []
1536hx_headers = [
1537 ['qemu-options.hx', 'qemu-options.def'],
1538 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1539]
1540if have_system
1541 hx_headers += [
1542 ['hmp-commands.hx', 'hmp-commands.h'],
1543 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1544 ]
1545endif
1546foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001547 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04001548 input: files(d[0]),
1549 output: d[1],
1550 capture: true,
1551 build_by_default: true, # to be removed when added to a target
1552 command: [hxtool, '-h', '@INPUT0@'])
1553endforeach
1554genh += hxdep
1555
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001556###################
1557# Collect sources #
1558###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001559
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001560authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001561blockdev_ss = ss.source_set()
1562block_ss = ss.source_set()
1563bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001564chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001565common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001566crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001567io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001568linux_user_ss = ss.source_set()
1569qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001570qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001571softmmu_ss = ss.source_set()
1572specific_fuzz_ss = ss.source_set()
1573specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001574stub_ss = ss.source_set()
1575trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001576user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001577util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001578
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001579modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001580hw_arch = {}
1581target_arch = {}
1582target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001583
1584###############
1585# Trace files #
1586###############
1587
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001588# TODO: add each directory to the subdirs from its own meson.build, once
1589# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001590trace_events_subdirs = [
1591 'accel/kvm',
1592 'accel/tcg',
1593 'crypto',
1594 'monitor',
1595]
1596if have_user
1597 trace_events_subdirs += [ 'linux-user' ]
1598endif
1599if have_block
1600 trace_events_subdirs += [
1601 'authz',
1602 'block',
1603 'io',
1604 'nbd',
1605 'scsi',
1606 ]
1607endif
1608if have_system
1609 trace_events_subdirs += [
1610 'audio',
1611 'backends',
1612 'backends/tpm',
1613 'chardev',
1614 'hw/9pfs',
1615 'hw/acpi',
1616 'hw/alpha',
1617 'hw/arm',
1618 'hw/audio',
1619 'hw/block',
1620 'hw/block/dataplane',
1621 'hw/char',
1622 'hw/display',
1623 'hw/dma',
1624 'hw/hppa',
1625 'hw/hyperv',
1626 'hw/i2c',
1627 'hw/i386',
1628 'hw/i386/xen',
1629 'hw/ide',
1630 'hw/input',
1631 'hw/intc',
1632 'hw/isa',
1633 'hw/mem',
1634 'hw/mips',
1635 'hw/misc',
1636 'hw/misc/macio',
1637 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08001638 'hw/net/can',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001639 'hw/nvram',
1640 'hw/pci',
1641 'hw/pci-host',
1642 'hw/ppc',
1643 'hw/rdma',
1644 'hw/rdma/vmw',
1645 'hw/rtc',
1646 'hw/s390x',
1647 'hw/scsi',
1648 'hw/sd',
1649 'hw/sparc',
1650 'hw/sparc64',
1651 'hw/ssi',
1652 'hw/timer',
1653 'hw/tpm',
1654 'hw/usb',
1655 'hw/vfio',
1656 'hw/virtio',
1657 'hw/watchdog',
1658 'hw/xen',
1659 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001660 'migration',
1661 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02001662 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001663 'ui',
1664 ]
1665endif
1666trace_events_subdirs += [
1667 'hw/core',
1668 'qapi',
1669 'qom',
1670 'target/arm',
1671 'target/hppa',
1672 'target/i386',
Claudio Fontanaa9dc68d2020-12-12 16:55:08 +01001673 'target/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001674 'target/mips',
1675 'target/ppc',
1676 'target/riscv',
1677 'target/s390x',
1678 'target/sparc',
1679 'util',
1680]
1681
Marc-André Lureau0df750e2020-11-25 14:06:37 +04001682vhost_user = not_found
1683if 'CONFIG_VHOST_USER' in config_host
1684 libvhost_user = subproject('libvhost-user')
1685 vhost_user = libvhost_user.get_variable('vhost_user_dep')
1686endif
1687
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001688subdir('qapi')
1689subdir('qobject')
1690subdir('stubs')
1691subdir('trace')
1692subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04001693subdir('qom')
1694subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001695subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04001696subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001697
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001698
1699if enable_modules
1700 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1701 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1702endif
1703
Paolo Bonzini2becc362020-02-03 11:42:03 +01001704stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001705
1706util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01001707util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001708libqemuutil = static_library('qemuutil',
1709 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonziniaa087962020-09-01 11:15:30 -04001710 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001711qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04001712 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001713
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001714decodetree = generator(find_program('scripts/decodetree.py'),
1715 output: 'decode-@BASENAME@.c.inc',
1716 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1717
Paolo Bonzini478e9432020-08-17 12:47:55 +02001718subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04001719subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04001720subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001721subdir('fsdev')
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001722subdir('libdecnumber')
Marc-André Lureaud3b18482019-08-17 14:55:32 +04001723subdir('target')
Marc-André Lureau708eab42019-09-03 16:59:33 +04001724subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001725
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001726block_ss.add(files(
1727 'block.c',
1728 'blockjob.c',
1729 'job.c',
1730 'qemu-io-cmds.c',
1731))
1732block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
1733
1734subdir('nbd')
1735subdir('scsi')
1736subdir('block')
1737
Paolo Bonzini4a963372020-08-03 16:22:28 +02001738blockdev_ss.add(files(
1739 'blockdev.c',
Stefan Hajnoczicbc20bf2020-09-29 13:55:15 +01001740 'blockdev-nbd.c',
Paolo Bonzini4a963372020-08-03 16:22:28 +02001741 'iothread.c',
1742 'job-qmp.c',
1743))
1744
1745# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1746# os-win32.c does not
1747blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1748softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
Paolo Bonzini4a963372020-08-03 16:22:28 +02001749
1750common_ss.add(files('cpus-common.c'))
1751
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001752subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001753
Richard Hendersonf3433462020-09-12 10:47:33 -07001754common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02001755specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001756specific_ss.add(files('exec-vary.c'))
1757specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1758 'fpu/softfloat.c',
1759 'tcg/optimize.c',
1760 'tcg/tcg-common.c',
1761 'tcg/tcg-op-gvec.c',
1762 'tcg/tcg-op-vec.c',
1763 'tcg/tcg-op.c',
1764 'tcg/tcg.c',
1765))
1766specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1767
Marc-André Lureauab318052019-07-24 19:23:16 +04001768subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04001769subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04001770subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001771subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001772subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04001773subdir('replay')
Marc-André Lureau582ea952019-08-15 15:15:32 +04001774subdir('hw')
Marc-André Lureau1a828782019-08-18 16:13:08 +04001775subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001776subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04001777subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04001778subdir('linux-user')
1779
Marc-André Lureaub309c322019-08-18 19:20:37 +04001780bsd_user_ss.add(files('gdbstub.c'))
1781specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1782
Marc-André Lureau3a304462019-08-18 16:13:08 +04001783linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1784specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001785
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001786# needed for fuzzing binaries
1787subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001788subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001789
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001790########################
1791# Library dependencies #
1792########################
1793
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001794block_mods = []
1795softmmu_mods = []
1796foreach d, list : modules
1797 foreach m, module_ss : list
1798 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02001799 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001800 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1801 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1802 if d == 'block'
1803 block_mods += sl
1804 else
1805 softmmu_mods += sl
1806 endif
1807 else
1808 if d == 'block'
1809 block_ss.add_all(module_ss)
1810 else
1811 softmmu_ss.add_all(module_ss)
1812 endif
1813 endif
1814 endforeach
1815endforeach
1816
1817nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08001818undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001819block_syms = custom_target('block.syms', output: 'block.syms',
1820 input: [libqemuutil, block_mods],
1821 capture: true,
1822 command: [undefsym, nm, '@INPUT@'])
1823qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1824 input: [libqemuutil, softmmu_mods],
1825 capture: true,
1826 command: [undefsym, nm, '@INPUT@'])
1827
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001828qom_ss = qom_ss.apply(config_host, strict: false)
1829libqom = static_library('qom', qom_ss.sources() + genh,
1830 dependencies: [qom_ss.dependencies()],
1831 name_suffix: 'fa')
1832
1833qom = declare_dependency(link_whole: libqom)
1834
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001835authz_ss = authz_ss.apply(config_host, strict: false)
1836libauthz = static_library('authz', authz_ss.sources() + genh,
1837 dependencies: [authz_ss.dependencies()],
1838 name_suffix: 'fa',
1839 build_by_default: false)
1840
1841authz = declare_dependency(link_whole: libauthz,
1842 dependencies: qom)
1843
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001844crypto_ss = crypto_ss.apply(config_host, strict: false)
1845libcrypto = static_library('crypto', crypto_ss.sources() + genh,
1846 dependencies: [crypto_ss.dependencies()],
1847 name_suffix: 'fa',
1848 build_by_default: false)
1849
1850crypto = declare_dependency(link_whole: libcrypto,
1851 dependencies: [authz, qom])
1852
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001853io_ss = io_ss.apply(config_host, strict: false)
1854libio = static_library('io', io_ss.sources() + genh,
1855 dependencies: [io_ss.dependencies()],
1856 link_with: libqemuutil,
1857 name_suffix: 'fa',
1858 build_by_default: false)
1859
1860io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
1861
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02001862libmigration = static_library('migration', sources: migration_files + genh,
1863 name_suffix: 'fa',
1864 build_by_default: false)
1865migration = declare_dependency(link_with: libmigration,
1866 dependencies: [zlib, qom, io])
1867softmmu_ss.add(migration)
1868
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001869block_ss = block_ss.apply(config_host, strict: false)
1870libblock = static_library('block', block_ss.sources() + genh,
1871 dependencies: block_ss.dependencies(),
1872 link_depends: block_syms,
1873 name_suffix: 'fa',
1874 build_by_default: false)
1875
1876block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001877 link_args: '@block.syms',
1878 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001879
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01001880blockdev_ss = blockdev_ss.apply(config_host, strict: false)
1881libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
1882 dependencies: blockdev_ss.dependencies(),
1883 name_suffix: 'fa',
1884 build_by_default: false)
1885
1886blockdev = declare_dependency(link_whole: [libblockdev],
1887 dependencies: [block])
1888
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001889qmp_ss = qmp_ss.apply(config_host, strict: false)
1890libqmp = static_library('qmp', qmp_ss.sources() + genh,
1891 dependencies: qmp_ss.dependencies(),
1892 name_suffix: 'fa',
1893 build_by_default: false)
1894
1895qmp = declare_dependency(link_whole: [libqmp])
1896
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001897libchardev = static_library('chardev', chardev_ss.sources() + genh,
1898 name_suffix: 'fa',
1899 build_by_default: false)
1900
1901chardev = declare_dependency(link_whole: libchardev)
1902
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02001903libhwcore = static_library('hwcore', sources: hwcore_files + genh,
1904 name_suffix: 'fa',
1905 build_by_default: false)
1906hwcore = declare_dependency(link_whole: libhwcore)
1907common_ss.add(hwcore)
1908
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02001909###########
1910# Targets #
1911###########
1912
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001913foreach m : block_mods + softmmu_mods
1914 shared_module(m.name(),
1915 name_prefix: '',
1916 link_whole: m,
1917 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001918 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001919endforeach
1920
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01001921softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001922common_ss.add(qom, qemuutil)
1923
1924common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01001925common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
1926
1927common_all = common_ss.apply(config_all, strict: false)
1928common_all = static_library('common',
1929 build_by_default: false,
1930 sources: common_all.sources() + genh,
1931 dependencies: common_all.dependencies(),
1932 name_suffix: 'fa')
1933
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001934feature_to_c = find_program('scripts/feature_to_c.sh')
1935
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04001936emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001937foreach target : target_dirs
1938 config_target = config_target_mak[target]
1939 target_name = config_target['TARGET_NAME']
1940 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001941 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001942 arch_deps = []
1943 c_args = ['-DNEED_CPU_H',
1944 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
1945 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04001946 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01001947
Paolo Bonzini859aef02020-08-04 18:14:26 +02001948 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01001949 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
1950 if targetos == 'linux'
1951 target_inc += include_directories('linux-headers', is_system: true)
1952 endif
1953 if target.endswith('-softmmu')
1954 qemu_target_name = 'qemu-system-' + target_name
1955 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001956 t = target_softmmu_arch[arch].apply(config_target, strict: false)
1957 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001958 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001959
Marc-André Lureau2c442202019-08-17 13:55:58 +04001960 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
1961 hw = hw_arch[hw_dir].apply(config_target, strict: false)
1962 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001963 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04001964
Paolo Bonzini2becc362020-02-03 11:42:03 +01001965 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001966 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001967 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04001968 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001969 target_type='user'
1970 qemu_target_name = 'qemu-' + target_name
1971 if 'CONFIG_LINUX_USER' in config_target
1972 base_dir = 'linux-user'
1973 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1974 else
1975 base_dir = 'bsd-user'
1976 endif
1977 target_inc += include_directories(
1978 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04001979 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001980 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04001981 if 'CONFIG_LINUX_USER' in config_target
1982 dir = base_dir / abi
1983 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1984 if config_target.has_key('TARGET_SYSTBL_ABI')
1985 arch_srcs += \
1986 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1987 extra_args : config_target['TARGET_SYSTBL_ABI'])
1988 endif
1989 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01001990 endif
1991
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001992 if 'TARGET_XML_FILES' in config_target
1993 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1994 output: target + '-gdbstub-xml.c',
1995 input: files(config_target['TARGET_XML_FILES'].split()),
1996 command: [feature_to_c, '@INPUT@'],
1997 capture: true)
1998 arch_srcs += gdbstub_xml
1999 endif
2000
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002001 t = target_arch[arch].apply(config_target, strict: false)
2002 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002003 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02002004
Paolo Bonzini2becc362020-02-03 11:42:03 +01002005 target_common = common_ss.apply(config_target, strict: false)
2006 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002007 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002008
Paolo Bonzini2becc362020-02-03 11:42:03 +01002009 target_specific = specific_ss.apply(config_target, strict: false)
2010 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002011 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01002012
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002013 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02002014 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002015 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002016 objects: objects,
2017 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002018 c_args: c_args,
2019 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002020 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002021
2022 if target.endswith('-softmmu')
2023 execs = [{
2024 'name': 'qemu-system-' + target_name,
2025 'gui': false,
2026 'sources': files('softmmu/main.c'),
2027 'dependencies': []
2028 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002029 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002030 execs += [{
2031 'name': 'qemu-system-' + target_name + 'w',
2032 'gui': true,
2033 'sources': files('softmmu/main.c'),
2034 'dependencies': []
2035 }]
2036 endif
2037 if config_host.has_key('CONFIG_FUZZ')
2038 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
2039 execs += [{
2040 'name': 'qemu-fuzz-' + target_name,
2041 'gui': false,
2042 'sources': specific_fuzz.sources(),
2043 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002044 }]
2045 endif
2046 else
2047 execs = [{
2048 'name': 'qemu-' + target_name,
2049 'gui': false,
2050 'sources': [],
2051 'dependencies': []
2052 }]
2053 endif
2054 foreach exe: execs
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002055 emulators += {exe['name']:
2056 executable(exe['name'], exe['sources'],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002057 install: true,
2058 c_args: c_args,
2059 dependencies: arch_deps + deps + exe['dependencies'],
2060 objects: lib.extract_all_objects(recursive: true),
2061 link_language: link_language,
2062 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
2063 link_args: link_args,
2064 gui_app: exe['gui'])
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002065 }
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002066
2067 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
2068 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002069 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
2070 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002071 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
2072 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
2073 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002074 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002075 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002076 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002077 capture: true,
2078 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002079 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002080 command: [
2081 tracetool, '--group=all', '--format=' + stp['fmt'],
2082 '--binary=' + stp['bin'],
2083 '--target-name=' + target_name,
2084 '--target-type=' + target_type,
2085 '--probe-prefix=qemu.' + target_type + '.' + target_name,
2086 '@INPUT@',
2087 ])
2088 endforeach
2089 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002090 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002091endforeach
2092
Paolo Bonzini931049b2020-02-05 09:44:24 +01002093# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002094
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002095if 'CONFIG_PLUGIN' in config_host
2096 install_headers('include/qemu/qemu-plugin.h')
2097endif
2098
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002099if 'CONFIG_GUEST_AGENT' in config_host
2100 subdir('qga')
2101endif
2102
Laurent Vivier9755c942020-08-24 17:24:30 +02002103# Don't build qemu-keymap if xkbcommon is not explicitly enabled
2104# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002105if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04002106 # used for the update-keymaps target, so include rules even if !have_tools
2107 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
2108 dependencies: [qemuutil, xkbcommon], install: have_tools)
2109endif
2110
Paolo Bonzini931049b2020-02-05 09:44:24 +01002111if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002112 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
2113 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
2114 qemu_io = executable('qemu-io', files('qemu-io.c'),
2115 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01002116 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Stefan Hajnoczicbc20bf2020-09-29 13:55:15 +01002117 dependencies: [blockdev, qemuutil], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002118
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02002119 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002120 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04002121 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002122
Marc-André Lureau157e7b12019-07-15 14:50:58 +04002123 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
2124 dependencies: qemuutil,
2125 install: true)
2126
Paolo Bonzini931049b2020-02-05 09:44:24 +01002127 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02002128 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002129 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04002130 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02002131 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01002132 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002133
2134 if targetos == 'linux'
2135 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2136 dependencies: [qemuutil, libcap_ng],
2137 install: true,
2138 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002139
2140 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2141 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002142 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002143 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002144 endif
2145
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04002146 if 'CONFIG_IVSHMEM' in config_host
2147 subdir('contrib/ivshmem-client')
2148 subdir('contrib/ivshmem-server')
2149 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01002150endif
2151
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04002152subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002153subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04002154subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02002155subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08002156subdir('tests')
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04002157if 'CONFIG_GTK' in config_host
2158 subdir('po')
2159endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002160
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002161if host_machine.system() == 'windows'
2162 nsis_cmd = [
2163 find_program('scripts/nsis.py'),
2164 '@OUTPUT@',
2165 get_option('prefix'),
2166 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01002167 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002168 '--',
2169 '-DDISPLAYVERSION=' + meson.project_version(),
2170 ]
2171 if build_docs
2172 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2173 endif
2174 if 'CONFIG_GTK' in config_host
2175 nsis_cmd += '-DCONFIG_GTK=y'
2176 endif
2177
2178 nsis = custom_target('nsis',
2179 output: 'qemu-setup-' + meson.project_version() + '.exe',
2180 input: files('qemu.nsi'),
2181 build_always_stale: true,
2182 command: nsis_cmd + ['@INPUT@'])
2183 alias_target('installer', nsis)
2184endif
2185
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002186#########################
2187# Configuration summary #
2188#########################
2189
Paolo Bonzinif9332752020-02-03 13:28:38 +01002190summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002191summary_info += {'Install prefix': get_option('prefix')}
2192summary_info += {'BIOS directory': qemu_datadir}
2193summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2194summary_info += {'binary directory': get_option('bindir')}
2195summary_info += {'library directory': get_option('libdir')}
2196summary_info += {'module directory': qemu_moddir}
2197summary_info += {'libexec directory': get_option('libexecdir')}
2198summary_info += {'include directory': get_option('includedir')}
2199summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002200if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002201 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04002202 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002203else
2204 summary_info += {'local state directory': 'queried at runtime'}
2205endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04002206summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002207summary_info += {'Build directory': meson.current_build_dir()}
2208summary_info += {'Source path': meson.current_source_dir()}
2209summary_info += {'GIT binary': config_host['GIT']}
2210summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
2211summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
2212summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
2213if link_language == 'cpp'
2214 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
2215else
2216 summary_info += {'C++ compiler': false}
2217endif
2218if targetos == 'darwin'
2219 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
2220endif
2221summary_info += {'ARFLAGS': config_host['ARFLAGS']}
Paolo Bonzini47b30832020-09-23 05:26:17 -04002222summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2223 + ['-O' + get_option('optimization')]
2224 + (get_option('debug') ? ['-g'] : []))}
2225if link_language == 'cpp'
2226 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2227 + ['-O' + get_option('optimization')]
2228 + (get_option('debug') ? ['-g'] : []))}
2229endif
2230link_args = get_option(link_language + '_link_args')
2231if link_args.length() > 0
2232 summary_info += {'LDFLAGS': ' '.join(link_args)}
2233endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002234summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2235summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
2236summary_info += {'make': config_host['MAKE']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002237summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Yonggang Luoe3667662020-10-16 06:06:25 +08002238summary_info += {'sphinx-build': sphinx_build.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002239summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2240# TODO: add back version
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002241summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
2242if slirp_opt != 'disabled'
Paolo Bonzinif9332752020-02-03 13:28:38 +01002243 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2244endif
2245summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2246if config_host.has_key('CONFIG_MODULES')
2247 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2248endif
2249summary_info += {'host CPU': cpu}
2250summary_info += {'host endianness': build_machine.endian()}
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002251summary_info += {'target list': ' '.join(target_dirs)}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002252summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
Paolo Bonzinideb62372020-09-01 07:51:16 -04002253summary_info += {'sparse enabled': sparse.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002254summary_info += {'strip binaries': get_option('strip')}
2255summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05002256summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02002257summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002258if targetos == 'darwin'
2259 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
2260endif
2261# TODO: add back version
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002262summary_info += {'SDL support': sdl.found()}
2263summary_info += {'SDL image support': sdl_image.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002264# TODO: add back version
2265summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
2266summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002267summary_info += {'pixman': pixman.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002268# TODO: add back version
2269summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
2270summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
2271summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
2272# TODO: add back version
2273summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
2274if config_host.has_key('CONFIG_GCRYPT')
2275 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
2276 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2277endif
2278# TODO: add back version
2279summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
2280if config_host.has_key('CONFIG_NETTLE')
2281 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2282endif
2283summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
2284summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
Yonggang Luo5285e592020-10-13 07:43:48 +08002285summary_info += {'iconv support': iconv.found()}
2286summary_info += {'curses support': curses.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002287# TODO: add back version
2288summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002289summary_info += {'curl support': curl.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002290summary_info += {'mingw32 support': targetos == 'windows'}
2291summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2292summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2293summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
2294summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
Misono Tomohirocece1162020-10-08 19:31:33 +09002295summary_info += {'build virtiofs daemon': have_virtiofsd}
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002296summary_info += {'Multipath support': mpathpersist.found()}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002297summary_info += {'VNC support': vnc.found()}
2298if vnc.found()
2299 summary_info += {'VNC SASL support': sasl.found()}
2300 summary_info += {'VNC JPEG support': jpeg.found()}
2301 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002302endif
2303summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2304if config_host.has_key('CONFIG_XEN_BACKEND')
2305 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2306endif
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002307summary_info += {'brlapi support': brlapi.found()}
Yonggang Luoe3667662020-10-16 06:06:25 +08002308summary_info += {'Documentation': build_docs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002309summary_info += {'PIE': get_option('b_pie')}
2310summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2311summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2312summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2313summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
2314summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
Paolo Bonzinic8d54502020-10-16 03:32:52 -04002315summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini05512f52020-09-16 15:31:11 -04002316summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2317summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2318summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2319summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
2320summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2321if config_all.has_key('CONFIG_TCG')
2322 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
2323 summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
2324endif
Paolo Bonziniaa087962020-09-01 11:15:30 -04002325summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002326summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2327summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002328summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002329summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
2330summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
2331summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2332summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2333summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2334summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
2335summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
Thomas Huthb54b82d2020-11-09 09:59:06 +01002336summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002337summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2338summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2339summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2340summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
Thomas Huthb54b82d2020-11-09 09:59:06 +01002341summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002342summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002343summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2344summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2345summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2346if config_host['TRACE_BACKENDS'].split().contains('simple')
2347 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2348endif
2349# TODO: add back protocol and server version
2350summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002351summary_info += {'rbd support': rbd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002352summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
2353summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02002354summary_info += {'U2F support': u2f.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002355summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
2356summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
2357summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
2358summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002359summary_info += {'libiscsi support': libiscsi.found()}
Paolo Bonzini30045c02020-11-17 13:11:25 +01002360summary_info += {'libnfs support': libnfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002361summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2362if targetos == 'windows'
2363 if 'WIN_SDK' in config_host
2364 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2365 endif
2366 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2367 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Stefan Hajnoczi4bad7c32020-09-14 10:52:31 +01002368 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002369endif
2370summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
Daniele Buono9e62ba42020-12-04 18:06:14 -05002371summary_info += {'CFI support': get_option('cfi')}
2372summary_info += {'CFI debug support': get_option('cfi_debug')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002373summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2374summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2375summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2376summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2377summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002378summary_info += {'GlusterFS support': glusterfs.found()}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +04002379summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002380summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2381summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
2382summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2383summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002384summary_info += {'lzo support': lzo.found()}
Paolo Bonzini241611e2020-11-17 13:32:34 +01002385summary_info += {'snappy support': snappy.found()}
Paolo Bonzini29ba6112020-11-17 13:07:52 +01002386summary_info += {'bzip2 support': libbzip2.found()}
Paolo Bonziniecea3692020-11-17 13:35:28 +01002387summary_info += {'lzfse support': liblzfse.found()}
Paolo Bonzinib1def332020-11-17 13:37:39 +01002388summary_info += {'zstd support': zstd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002389summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2390summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
Paolo Bonziniaa087962020-09-01 11:15:30 -04002391summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002392summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2393summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2394summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2395summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2396summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2397summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2398summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2399summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2400summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2401summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2402summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2403summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002404summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002405summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2406summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002407summary_info += {'libudev': libudev.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002408summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
2409summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2410summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2411if config_host.has_key('HAVE_GDB_BIN')
2412 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2413endif
2414summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2415summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2416summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
Max Reitza484a712020-10-27 20:05:41 +01002417summary_info += {'FUSE exports': fuse.found()}
Max Reitzdf4ea702020-10-27 20:05:46 +01002418summary_info += {'FUSE lseek': fuse_lseek.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002419summary(summary_info, bool_yn: true)
2420
2421if not supported_cpus.contains(cpu)
2422 message()
2423 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2424 message()
2425 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2426 message('The QEMU project intends to remove support for this host CPU in')
2427 message('a future release if nobody volunteers to maintain it and to')
2428 message('provide a build host for our continuous integration setup.')
2429 message('configure has succeeded and you can continue to build, but')
2430 message('if you care about QEMU on this platform you should contact')
2431 message('us upstream at qemu-devel@nongnu.org.')
2432endif
2433
2434if not supported_oses.contains(targetos)
2435 message()
2436 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2437 message()
2438 message('Host OS ' + targetos + 'support is not currently maintained.')
2439 message('The QEMU project intends to remove support for this host OS in')
2440 message('a future release if nobody volunteers to maintain it and to')
2441 message('provide a build host for our continuous integration setup.')
2442 message('configure has succeeded and you can continue to build, but')
2443 message('if you care about QEMU on this platform you should contact')
2444 message('us upstream at qemu-devel@nongnu.org.')
2445endif