blob: 30f86ddafbf3dbedb378813eaf43a3f00456f576 [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'])
271glib = declare_dependency(link_args: config_host['GLIB_LIBS'].split())
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400272gio = not_found
273if 'CONFIG_GIO' in config_host
274 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
275 link_args: config_host['GIO_LIBS'].split())
276endif
277lttng = not_found
278if 'CONFIG_TRACE_UST' in config_host
279 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
280endif
281urcubp = not_found
282if 'CONFIG_TRACE_UST' in config_host
283 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
284endif
Daniel P. Berrangé46859d92020-09-01 14:30:49 +0100285gcrypt = not_found
286if 'CONFIG_GCRYPT' in config_host
287 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
288 link_args: config_host['GCRYPT_LIBS'].split())
289endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400290nettle = not_found
291if 'CONFIG_NETTLE' in config_host
292 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
293 link_args: config_host['NETTLE_LIBS'].split())
294endif
295gnutls = not_found
296if 'CONFIG_GNUTLS' in config_host
297 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
298 link_args: config_host['GNUTLS_LIBS'].split())
299endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200300pixman = not_found
301if have_system or have_tools
302 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzini1a949332020-08-31 06:27:00 -0400303 method: 'pkg-config', static: enable_static)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200304endif
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400305pam = not_found
306if 'CONFIG_AUTH_PAM' in config_host
307 pam = cc.find_library('pam')
308endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400309libaio = cc.find_library('aio', required: false)
Paolo Bonzini1ffb3bb2020-08-28 19:33:54 +0200310zlib = dependency('zlib', required: true, static: enable_static)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400311linux_io_uring = not_found
312if 'CONFIG_LINUX_IO_URING' in config_host
313 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
314 link_args: config_host['LINUX_IO_URING_LIBS'].split())
315endif
316libxml2 = not_found
317if 'CONFIG_LIBXML2' in config_host
318 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
319 link_args: config_host['LIBXML2_LIBS'].split())
320endif
321libnfs = not_found
322if 'CONFIG_LIBNFS' in config_host
323 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
324endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400325libattr = not_found
326if 'CONFIG_ATTR' in config_host
327 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
328endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100329seccomp = not_found
330if 'CONFIG_SECCOMP' in config_host
331 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
332 link_args: config_host['SECCOMP_LIBS'].split())
333endif
334libcap_ng = not_found
335if 'CONFIG_LIBCAP_NG' in config_host
336 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
337endif
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400338if get_option('xkbcommon').auto() and not have_system and not have_tools
339 xkbcommon = not_found
340else
341 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400342 method: 'pkg-config', static: enable_static)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400343endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400344vde = not_found
345if config_host.has_key('CONFIG_VDE')
346 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
347endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200348pulse = not_found
349if 'CONFIG_LIBPULSE' in config_host
350 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
351 link_args: config_host['PULSE_LIBS'].split())
352endif
353alsa = not_found
354if 'CONFIG_ALSA' in config_host
355 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
356 link_args: config_host['ALSA_LIBS'].split())
357endif
358jack = not_found
359if 'CONFIG_LIBJACK' in config_host
360 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
361endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200362spice = not_found
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200363spice_headers = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200364if 'CONFIG_SPICE' in config_host
365 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
366 link_args: config_host['SPICE_LIBS'].split())
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200367 spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
Paolo Bonzini26347332019-07-29 15:40:07 +0200368endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400369rt = cc.find_library('rt', required: false)
Paolo Bonziniccf7afa2020-09-01 06:44:23 -0400370libdl = not_found
371if 'CONFIG_PLUGIN' in config_host
372 libdl = cc.find_library('dl', required: true)
373endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200374libiscsi = not_found
375if 'CONFIG_LIBISCSI' in config_host
376 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
377 link_args: config_host['LIBISCSI_LIBS'].split())
378endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400379zstd = not_found
380if 'CONFIG_ZSTD' in config_host
381 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
382 link_args: config_host['ZSTD_LIBS'].split())
383endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400384gbm = not_found
385if 'CONFIG_GBM' in config_host
386 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
387 link_args: config_host['GBM_LIBS'].split())
388endif
389virgl = not_found
390if 'CONFIG_VIRGL' in config_host
391 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
392 link_args: config_host['VIRGL_LIBS'].split())
393endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400394curl = not_found
395if 'CONFIG_CURL' in config_host
396 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
397 link_args: config_host['CURL_LIBS'].split())
398endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200399libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200400if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200401 libudev = dependency('libudev',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400402 required: get_option('libudev'),
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200403 static: enable_static)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200404endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200405
Paolo Bonzini5c530152020-10-15 06:09:27 -0400406mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200407mpathpersist = not_found
408mpathpersist_new_api = false
409if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
410 mpath_test_source_new = '''
411 #include <libudev.h>
412 #include <mpath_persist.h>
413 unsigned mpath_mx_alloc_len = 1024;
414 int logsink;
415 static struct config *multipath_conf;
416 extern struct udev *udev;
417 extern struct config *get_multipath_config(void);
418 extern void put_multipath_config(struct config *conf);
419 struct udev *udev;
420 struct config *get_multipath_config(void) { return multipath_conf; }
421 void put_multipath_config(struct config *conf) { }
422 int main(void) {
423 udev = udev_new();
424 multipath_conf = mpath_lib_init();
425 return 0;
426 }'''
427 mpath_test_source_old = '''
428 #include <libudev.h>
429 #include <mpath_persist.h>
430 unsigned mpath_mx_alloc_len = 1024;
431 int logsink;
432 int main(void) {
433 struct udev *udev = udev_new();
434 mpath_lib_init(udev);
435 return 0;
436 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400437 libmpathpersist = cc.find_library('mpathpersist',
438 required: get_option('mpath'),
439 static: enable_static)
440 if libmpathpersist.found()
441 mpathlibs += libmpathpersist
442 if enable_static
443 mpathlibs += cc.find_library('devmapper',
444 required: get_option('mpath'),
445 static: enable_static)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200446 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400447 mpathlibs += cc.find_library('multipath',
448 required: get_option('mpath'),
449 static: enable_static)
450 foreach lib: mpathlibs
451 if not lib.found()
452 mpathlibs = []
453 break
454 endif
455 endforeach
456 if mpathlibs.length() == 0
457 msg = 'Dependencies missing for libmpathpersist'
458 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200459 mpathpersist = declare_dependency(dependencies: mpathlibs)
460 mpathpersist_new_api = true
461 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
462 mpathpersist = declare_dependency(dependencies: mpathlibs)
463 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400464 msg = 'Cannot detect libmpathpersist API'
465 endif
466 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200467 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400468 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200469 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400470 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200471 endif
472 endif
473 endif
474endif
475
Yonggang Luo5285e592020-10-13 07:43:48 +0800476iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800477curses = not_found
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400478if have_system and not get_option('curses').disabled()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400479 curses_test = '''
480 #include <locale.h>
481 #include <curses.h>
482 #include <wchar.h>
483 int main(void) {
484 wchar_t wch = L'w';
485 setlocale(LC_ALL, "");
486 resize_term(0, 0);
487 addwstr(L"wide chars\n");
488 addnwstr(&wch, 1);
489 add_wch(WACS_DEGREE);
490 return 0;
491 }'''
492
493 curses = dependency((targetos == 'windows' ? 'ncurses' : 'ncursesw'),
494 required: false,
495 method: 'pkg-config',
496 static: enable_static)
497 msg = get_option('curses').enabled() ? 'curses library not found' : ''
498 if curses.found()
499 if cc.links(curses_test, dependencies: [curses])
500 curses = declare_dependency(compile_args: '-DNCURSES_WIDECHAR', dependencies: [curses])
501 else
502 msg = 'curses package not usable'
503 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800504 endif
505 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400506 if not curses.found()
507 curses_compile_args = ['-DNCURSES_WIDECHAR']
508 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
509 if targetos != 'windows' and not has_curses_h
510 message('Trying with /usr/include/ncursesw')
511 curses_compile_args += ['-I/usr/include/ncursesw']
512 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
513 endif
514 if has_curses_h
515 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
516 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800517 libcurses = cc.find_library(curses_libname,
518 required: false,
Yonggang Luo5285e592020-10-13 07:43:48 +0800519 static: enable_static)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400520 if libcurses.found()
521 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
522 curses = declare_dependency(compile_args: curses_compile_args,
523 dependencies: [libcurses])
524 break
525 else
526 msg = 'curses library not usable'
527 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800528 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400529 endforeach
530 endif
531 endif
532 if not get_option('iconv').disabled()
533 foreach link_args : [ ['-liconv'], [] ]
534 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
535 # We need to use libiconv if available because mixing libiconv's headers with
536 # the system libc does not work.
537 # However, without adding glib to the dependencies -L/usr/local/lib will not be
538 # included in the command line and libiconv will not be found.
539 if cc.links('''
540 #include <iconv.h>
541 int main(void) {
542 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
543 return conv != (iconv_t) -1;
544 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
545 iconv = declare_dependency(link_args: link_args, dependencies: glib)
546 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800547 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400548 endforeach
549 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400550 if curses.found() and not iconv.found()
551 if get_option('iconv').enabled()
552 error('iconv not available')
553 endif
554 msg = 'iconv required for curses UI but not available'
555 curses = not_found
556 endif
557 if not curses.found() and msg != ''
558 if get_option('curses').enabled()
559 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400560 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400561 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400562 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800563 endif
564endif
565
Paolo Bonzini26347332019-07-29 15:40:07 +0200566brlapi = not_found
567if 'CONFIG_BRLAPI' in config_host
568 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
569endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100570
Paolo Bonzini760e4322020-08-26 08:09:48 +0200571sdl = not_found
572if have_system
Yonggang Luo363743d2020-08-26 23:10:03 +0800573 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200574 sdl_image = not_found
575endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100576if sdl.found()
577 # work around 2.0.8 bug
578 sdl = declare_dependency(compile_args: '-Wno-undef',
579 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200580 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400581 method: 'pkg-config', static: enable_static)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100582else
583 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100584 error('sdl-image required, but SDL was @0@'.format(
585 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100586 endif
587 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200588endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100589
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400590rbd = not_found
591if 'CONFIG_RBD' in config_host
592 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
593endif
594glusterfs = not_found
595if 'CONFIG_GLUSTERFS' in config_host
596 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
597 link_args: config_host['GLUSTERFS_LIBS'].split())
598endif
599libssh = not_found
600if 'CONFIG_LIBSSH' in config_host
601 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
602 link_args: config_host['LIBSSH_LIBS'].split())
603endif
604libbzip2 = not_found
605if 'CONFIG_BZIP2' in config_host
606 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
607endif
608liblzfse = not_found
609if 'CONFIG_LZFSE' in config_host
610 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
611endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200612oss = not_found
613if 'CONFIG_AUDIO_OSS' in config_host
614 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
615endif
616dsound = not_found
617if 'CONFIG_AUDIO_DSOUND' in config_host
618 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
619endif
620coreaudio = not_found
621if 'CONFIG_AUDIO_COREAUDIO' in config_host
622 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
623endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400624opengl = not_found
625if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400626 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
627 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400628endif
629gtk = not_found
630if 'CONFIG_GTK' in config_host
631 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
632 link_args: config_host['GTK_LIBS'].split())
633endif
634vte = not_found
635if 'CONFIG_VTE' in config_host
636 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
637 link_args: config_host['VTE_LIBS'].split())
638endif
639x11 = not_found
640if 'CONFIG_X11' in config_host
641 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
642 link_args: config_host['X11_LIBS'].split())
643endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100644vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400645png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400646jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400647sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100648if get_option('vnc').enabled()
649 vnc = declare_dependency() # dummy dependency
650 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400651 method: 'pkg-config', static: enable_static)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100652 jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
653 required: get_option('vnc_jpeg'),
654 static: enable_static)
655 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
656 required: get_option('vnc_sasl'),
657 static: enable_static)
658 if sasl.found()
659 sasl = declare_dependency(dependencies: sasl,
660 compile_args: '-DSTRUCT_IOVEC_DEFINED')
661 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400662endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400663snappy = not_found
664if 'CONFIG_SNAPPY' in config_host
665 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
666endif
667lzo = not_found
668if 'CONFIG_LZO' in config_host
669 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
670endif
Marc-André Lureau55166232019-07-24 19:16:22 +0400671rdma = not_found
672if 'CONFIG_RDMA' in config_host
673 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
674endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400675numa = not_found
676if 'CONFIG_NUMA' in config_host
677 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
678endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400679xen = not_found
680if 'CONFIG_XEN_BACKEND' in config_host
681 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
682 link_args: config_host['XEN_LIBS'].split())
683endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200684cacard = not_found
685if 'CONFIG_SMARTCARD' in config_host
686 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
687 link_args: config_host['SMARTCARD_LIBS'].split())
688endif
César Belley0a40bcb2020-08-26 13:42:04 +0200689u2f = not_found
690if have_system
691 u2f = dependency('u2f-emu', required: get_option('u2f'),
692 method: 'pkg-config',
693 static: enable_static)
694endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200695usbredir = not_found
696if 'CONFIG_USB_REDIR' in config_host
697 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
698 link_args: config_host['USB_REDIR_LIBS'].split())
699endif
700libusb = not_found
701if 'CONFIG_USB_LIBUSB' in config_host
702 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
703 link_args: config_host['LIBUSB_LIBS'].split())
704endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400705libpmem = not_found
706if 'CONFIG_LIBPMEM' in config_host
707 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
708 link_args: config_host['LIBPMEM_LIBS'].split())
709endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600710libdaxctl = not_found
711if 'CONFIG_LIBDAXCTL' in config_host
712 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
713endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +0400714tasn1 = not_found
715if 'CONFIG_TASN1' in config_host
716 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
717 link_args: config_host['TASN1_LIBS'].split())
718endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400719keyutils = dependency('libkeyutils', required: false,
720 method: 'pkg-config', static: enable_static)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400721
Marc-André Lureau3909def2020-08-28 15:07:33 +0400722has_gettid = cc.has_function('gettid')
723
Paolo Bonziniaa087962020-09-01 11:15:30 -0400724# Malloc tests
725
726malloc = []
727if get_option('malloc') == 'system'
728 has_malloc_trim = \
729 not get_option('malloc_trim').disabled() and \
730 cc.links('''#include <malloc.h>
731 int main(void) { malloc_trim(0); return 0; }''')
732else
733 has_malloc_trim = false
734 malloc = cc.find_library(get_option('malloc'), required: true)
735endif
736if not has_malloc_trim and get_option('malloc_trim').enabled()
737 if get_option('malloc') == 'system'
738 error('malloc_trim not available on this platform.')
739 else
740 error('malloc_trim not available with non-libc memory allocator')
741 endif
742endif
743
Max Reitz84e319a2020-11-02 17:18:55 +0100744# Check whether the glibc provides statx()
745
746statx_test = '''
747 #ifndef _GNU_SOURCE
748 #define _GNU_SOURCE
749 #endif
750 #include <sys/stat.h>
751 int main(void) {
752 struct statx statxbuf;
753 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
754 return 0;
755 }'''
756
757has_statx = cc.links(statx_test)
758
Paolo Bonzinia0c91622020-10-07 11:01:51 -0400759#################
760# config-host.h #
761#################
Paolo Bonzini859aef02020-08-04 18:14:26 +0200762
Paolo Bonzini16bf7a32020-10-16 03:19:14 -0400763config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
764config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
765config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
766config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
767config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
768config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
769config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
770config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
771config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
772config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
773config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
774config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
775
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400776config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200777config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200778config_host_data.set('CONFIG_MPATH', mpathpersist.found())
779config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Yonggang Luo5285e592020-10-13 07:43:48 +0800780config_host_data.set('CONFIG_CURSES', curses.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100781config_host_data.set('CONFIG_SDL', sdl.found())
782config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100783config_host_data.set('CONFIG_VNC', vnc.found())
784config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
785config_host_data.set('CONFIG_VNC_PNG', png.found())
786config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +0200787config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400788config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +0400789config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonziniaa087962020-09-01 11:15:30 -0400790config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +0100791config_host_data.set('CONFIG_STATX', has_statx)
Paolo Bonzini859aef02020-08-04 18:14:26 +0200792config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
793config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
794config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
795config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
796
Thomas Huthded5d782020-11-14 11:10:11 +0100797config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
798
Paolo Bonzini765686d2020-09-18 06:37:21 -0400799ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
Paolo Bonzini859aef02020-08-04 18:14:26 +0200800arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzini16bf7a32020-10-16 03:19:14 -0400801strings = ['HOST_DSOSUF', 'CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +0200802foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -0400803 if ignored.contains(k)
804 # do nothing
805 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +0200806 if v != ''
807 v = '"' + '", "'.join(v.split()) + '", '
808 endif
809 config_host_data.set(k, v)
810 elif k == 'ARCH'
811 config_host_data.set('HOST_' + v.to_upper(), 1)
812 elif strings.contains(k)
813 if not k.startswith('CONFIG_')
814 k = 'CONFIG_' + k.to_upper()
815 endif
816 config_host_data.set_quoted(k, v)
817 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
818 config_host_data.set(k, v == 'y' ? 1 : v)
819 endif
820endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +0200821
Paolo Bonzinia0c91622020-10-07 11:01:51 -0400822########################
823# Target configuration #
824########################
825
Paolo Bonzini2becc362020-02-03 11:42:03 +0100826minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -0400827config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -0400828config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400829config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100830config_devices_mak_list = []
831config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +0200832config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100833config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400834
835disassemblers = {
836 'alpha' : ['CONFIG_ALPHA_DIS'],
837 'arm' : ['CONFIG_ARM_DIS'],
838 'avr' : ['CONFIG_AVR_DIS'],
839 'cris' : ['CONFIG_CRIS_DIS'],
840 'hppa' : ['CONFIG_HPPA_DIS'],
841 'i386' : ['CONFIG_I386_DIS'],
842 'x86_64' : ['CONFIG_I386_DIS'],
843 'x32' : ['CONFIG_I386_DIS'],
844 'lm32' : ['CONFIG_LM32_DIS'],
845 'm68k' : ['CONFIG_M68K_DIS'],
846 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
847 'mips' : ['CONFIG_MIPS_DIS'],
848 'moxie' : ['CONFIG_MOXIE_DIS'],
849 'nios2' : ['CONFIG_NIOS2_DIS'],
850 'or1k' : ['CONFIG_OPENRISC_DIS'],
851 'ppc' : ['CONFIG_PPC_DIS'],
852 'riscv' : ['CONFIG_RISCV_DIS'],
853 'rx' : ['CONFIG_RX_DIS'],
854 's390' : ['CONFIG_S390_DIS'],
855 'sh4' : ['CONFIG_SH4_DIS'],
856 'sparc' : ['CONFIG_SPARC_DIS'],
857 'xtensa' : ['CONFIG_XTENSA_DIS'],
858}
859if link_language == 'cpp'
860 disassemblers += {
861 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
862 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
863 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
864 }
865endif
866
Paolo Bonzini2becc362020-02-03 11:42:03 +0100867kconfig_external_symbols = [
868 'CONFIG_KVM',
869 'CONFIG_XEN',
870 'CONFIG_TPM',
871 'CONFIG_SPICE',
872 'CONFIG_IVSHMEM',
873 'CONFIG_OPENGL',
874 'CONFIG_X11',
875 'CONFIG_VHOST_USER',
Laurent Vivier40bc0ca2020-09-24 23:00:23 +0200876 'CONFIG_VHOST_VDPA',
Paolo Bonzini2becc362020-02-03 11:42:03 +0100877 'CONFIG_VHOST_KERNEL',
878 'CONFIG_VIRTFS',
879 'CONFIG_LINUX',
880 'CONFIG_PVRDMA',
881]
Paolo Bonzinia9a74902020-09-21 05:11:01 -0400882ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400883
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -0400884default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
885actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +0200886fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400887foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -0400888 config_target = { 'TARGET_NAME': target.split('-')[0] }
889 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -0400890 if targetos != 'linux'
891 if default_targets
892 continue
893 endif
894 error('Target @0@ is only available on a Linux host'.format(target))
895 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -0400896 config_target += { 'CONFIG_LINUX_USER': 'y' }
897 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -0400898 if 'CONFIG_BSD' not in config_host
899 if default_targets
900 continue
901 endif
902 error('Target @0@ is only available on a BSD host'.format(target))
903 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -0400904 config_target += { 'CONFIG_BSD_USER': 'y' }
905 elif target.endswith('softmmu')
906 config_target += { 'CONFIG_SOFTMMU': 'y' }
907 endif
908 if target.endswith('-user')
909 config_target += {
910 'CONFIG_USER_ONLY': 'y',
911 'CONFIG_QEMU_INTERP_PREFIX':
912 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
913 }
914 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +0200915
Paolo Bonzini8a199802020-09-18 05:37:01 -0400916 have_accel = false
917 foreach sym: accelerators
918 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
919 config_target += { sym: 'y' }
920 config_all += { sym: 'y' }
921 if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
922 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
923 endif
924 have_accel = true
925 endif
926 endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -0400927 if not have_accel
928 if default_targets
929 continue
930 endif
931 error('No accelerator available for target @0@'.format(target))
932 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400933
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -0400934 actual_target_dirs += target
Paolo Bonzini765686d2020-09-18 06:37:21 -0400935 config_target += keyval.load('default-configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -0400936 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -0400937
Paolo Bonzinifbb41212020-10-05 11:31:15 +0200938 if 'TARGET_NEED_FDT' in config_target
939 fdt_required += target
940 endif
941
Paolo Bonzinifa731682020-09-21 05:19:07 -0400942 # Add default keys
943 if 'TARGET_BASE_ARCH' not in config_target
944 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
945 endif
946 if 'TARGET_ABI_DIR' not in config_target
947 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
948 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +0200949
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400950 foreach k, v: disassemblers
951 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
952 foreach sym: v
953 config_target += { sym: 'y' }
954 config_all_disas += { sym: 'y' }
955 endforeach
956 endif
957 endforeach
958
Paolo Bonzini859aef02020-08-04 18:14:26 +0200959 config_target_data = configuration_data()
960 foreach k, v: config_target
961 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
962 # do nothing
963 elif ignored.contains(k)
964 # do nothing
965 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -0400966 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
967 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +0200968 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -0400969 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +0200970 config_target_data.set_quoted(k, v)
971 elif v == 'y'
972 config_target_data.set(k, 1)
973 else
974 config_target_data.set(k, v)
975 endif
976 endforeach
977 config_target_h += {target: configure_file(output: target + '-config-target.h',
978 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100979
980 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +0100981 base_kconfig = []
982 foreach sym : kconfig_external_symbols
Paolo Bonzini859aef02020-08-04 18:14:26 +0200983 if sym in config_target or sym in config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +0100984 base_kconfig += '@0@=y'.format(sym)
985 endif
986 endforeach
987
988 config_devices_mak = target + '-config-devices.mak'
989 config_devices_mak = configure_file(
Paolo Bonzini1bb4cb12020-09-18 06:06:09 -0400990 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +0100991 output: config_devices_mak,
992 depfile: config_devices_mak + '.d',
993 capture: true,
994 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
995 config_devices_mak, '@DEPFILE@', '@INPUT@',
996 base_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +0200997
998 config_devices_data = configuration_data()
999 config_devices = keyval.load(config_devices_mak)
1000 foreach k, v: config_devices
1001 config_devices_data.set(k, 1)
1002 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001003 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001004 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1005 configuration: config_devices_data)}
1006 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001007 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001008 endif
1009 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001010endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001011target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001012
Paolo Bonzini2becc362020-02-03 11:42:03 +01001013# This configuration is used to build files that are shared by
1014# multiple binaries, and then extracted out of the "common"
1015# static_library target.
1016#
1017# We do not use all_sources()/all_dependencies(), because it would
1018# build literally all source files, including devices only used by
1019# targets that are not built for this compilation. The CONFIG_ALL
1020# pseudo symbol replaces it.
1021
Paolo Bonzini05512f52020-09-16 15:31:11 -04001022config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001023config_all += config_host
1024config_all += config_all_disas
1025config_all += {
1026 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1027 'CONFIG_SOFTMMU': have_system,
1028 'CONFIG_USER_ONLY': have_user,
1029 'CONFIG_ALL': true,
1030}
1031
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001032##############
1033# Submodules #
1034##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001035
1036capstone = not_found
1037capstone_opt = get_option('capstone')
1038if capstone_opt in ['enabled', 'auto', 'system']
1039 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07001040 capstone = dependency('capstone', version: '>=4.0',
1041 static: enable_static, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001042 required: capstone_opt == 'system' or
1043 capstone_opt == 'enabled' and not have_internal)
1044 if capstone.found()
1045 capstone_opt = 'system'
1046 elif have_internal
1047 capstone_opt = 'internal'
1048 else
1049 capstone_opt = 'disabled'
1050 endif
1051endif
1052if capstone_opt == 'internal'
1053 capstone_data = configuration_data()
1054 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1055
1056 capstone_files = files(
1057 'capstone/cs.c',
1058 'capstone/MCInst.c',
1059 'capstone/MCInstrDesc.c',
1060 'capstone/MCRegisterInfo.c',
1061 'capstone/SStream.c',
1062 'capstone/utils.c'
1063 )
1064
1065 if 'CONFIG_ARM_DIS' in config_all_disas
1066 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1067 capstone_files += files(
1068 'capstone/arch/ARM/ARMDisassembler.c',
1069 'capstone/arch/ARM/ARMInstPrinter.c',
1070 'capstone/arch/ARM/ARMMapping.c',
1071 'capstone/arch/ARM/ARMModule.c'
1072 )
1073 endif
1074
1075 # FIXME: This config entry currently depends on a c++ compiler.
1076 # Which is needed for building libvixl, but not for capstone.
1077 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1078 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1079 capstone_files += files(
1080 'capstone/arch/AArch64/AArch64BaseInfo.c',
1081 'capstone/arch/AArch64/AArch64Disassembler.c',
1082 'capstone/arch/AArch64/AArch64InstPrinter.c',
1083 'capstone/arch/AArch64/AArch64Mapping.c',
1084 'capstone/arch/AArch64/AArch64Module.c'
1085 )
1086 endif
1087
1088 if 'CONFIG_PPC_DIS' in config_all_disas
1089 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1090 capstone_files += files(
1091 'capstone/arch/PowerPC/PPCDisassembler.c',
1092 'capstone/arch/PowerPC/PPCInstPrinter.c',
1093 'capstone/arch/PowerPC/PPCMapping.c',
1094 'capstone/arch/PowerPC/PPCModule.c'
1095 )
1096 endif
1097
Richard Henderson3d562842020-01-04 07:24:59 +10001098 if 'CONFIG_S390_DIS' in config_all_disas
1099 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1100 capstone_files += files(
1101 'capstone/arch/SystemZ/SystemZDisassembler.c',
1102 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1103 'capstone/arch/SystemZ/SystemZMapping.c',
1104 'capstone/arch/SystemZ/SystemZModule.c',
1105 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1106 )
1107 endif
1108
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001109 if 'CONFIG_I386_DIS' in config_all_disas
1110 capstone_data.set('CAPSTONE_HAS_X86', 1)
1111 capstone_files += files(
1112 'capstone/arch/X86/X86Disassembler.c',
1113 'capstone/arch/X86/X86DisassemblerDecoder.c',
1114 'capstone/arch/X86/X86ATTInstPrinter.c',
1115 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07001116 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001117 'capstone/arch/X86/X86Mapping.c',
1118 'capstone/arch/X86/X86Module.c'
1119 )
1120 endif
1121
1122 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1123
1124 capstone_cargs = [
1125 # FIXME: There does not seem to be a way to completely replace the c_args
1126 # that come from add_project_arguments() -- we can only add to them.
1127 # So: disable all warnings with a big hammer.
1128 '-Wno-error', '-w',
1129
1130 # Include all configuration defines via a header file, which will wind up
1131 # as a dependency on the object file, and thus changes here will result
1132 # in a rebuild.
1133 '-include', 'capstone-defs.h'
1134 ]
1135
1136 libcapstone = static_library('capstone',
1137 sources: capstone_files,
1138 c_args: capstone_cargs,
1139 include_directories: 'capstone/include')
1140 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07001141 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001142endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001143
1144slirp = not_found
1145slirp_opt = 'disabled'
1146if have_system
1147 slirp_opt = get_option('slirp')
1148 if slirp_opt in ['enabled', 'auto', 'system']
1149 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
1150 slirp = dependency('slirp', static: enable_static,
1151 method: 'pkg-config',
1152 required: slirp_opt == 'system' or
1153 slirp_opt == 'enabled' and not have_internal)
1154 if slirp.found()
1155 slirp_opt = 'system'
1156 elif have_internal
1157 slirp_opt = 'internal'
1158 else
1159 slirp_opt = 'disabled'
1160 endif
1161 endif
1162 if slirp_opt == 'internal'
1163 slirp_deps = []
1164 if targetos == 'windows'
1165 slirp_deps = cc.find_library('iphlpapi')
1166 endif
1167 slirp_conf = configuration_data()
1168 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1169 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1170 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1171 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1172 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1173 slirp_files = [
1174 'slirp/src/arp_table.c',
1175 'slirp/src/bootp.c',
1176 'slirp/src/cksum.c',
1177 'slirp/src/dhcpv6.c',
1178 'slirp/src/dnssearch.c',
1179 'slirp/src/if.c',
1180 'slirp/src/ip6_icmp.c',
1181 'slirp/src/ip6_input.c',
1182 'slirp/src/ip6_output.c',
1183 'slirp/src/ip_icmp.c',
1184 'slirp/src/ip_input.c',
1185 'slirp/src/ip_output.c',
1186 'slirp/src/mbuf.c',
1187 'slirp/src/misc.c',
1188 'slirp/src/ncsi.c',
1189 'slirp/src/ndp_table.c',
1190 'slirp/src/sbuf.c',
1191 'slirp/src/slirp.c',
1192 'slirp/src/socket.c',
1193 'slirp/src/state.c',
1194 'slirp/src/stream.c',
1195 'slirp/src/tcp_input.c',
1196 'slirp/src/tcp_output.c',
1197 'slirp/src/tcp_subr.c',
1198 'slirp/src/tcp_timer.c',
1199 'slirp/src/tftp.c',
1200 'slirp/src/udp.c',
1201 'slirp/src/udp6.c',
1202 'slirp/src/util.c',
1203 'slirp/src/version.c',
1204 'slirp/src/vmstate.c',
1205 ]
1206
1207 configure_file(
1208 input : 'slirp/src/libslirp-version.h.in',
1209 output : 'libslirp-version.h',
1210 configuration: slirp_conf)
1211
1212 slirp_inc = include_directories('slirp', 'slirp/src')
1213 libslirp = static_library('slirp',
1214 sources: slirp_files,
1215 c_args: slirp_cargs,
1216 include_directories: slirp_inc)
1217 slirp = declare_dependency(link_with: libslirp,
1218 dependencies: slirp_deps,
1219 include_directories: slirp_inc)
1220 endif
1221endif
1222
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001223fdt = not_found
1224fdt_opt = get_option('fdt')
1225if have_system
1226 if fdt_opt in ['enabled', 'auto', 'system']
1227 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
1228 fdt = cc.find_library('fdt', static: enable_static,
1229 required: fdt_opt == 'system' or
1230 fdt_opt == 'enabled' and not have_internal)
1231 if fdt.found() and cc.links('''
1232 #include <libfdt.h>
1233 #include <libfdt_env.h>
1234 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1235 dependencies: fdt)
1236 fdt_opt = 'system'
1237 elif have_internal
1238 fdt_opt = 'internal'
1239 else
1240 fdt_opt = 'disabled'
1241 endif
1242 endif
1243 if fdt_opt == 'internal'
1244 fdt_files = files(
1245 'dtc/libfdt/fdt.c',
1246 'dtc/libfdt/fdt_ro.c',
1247 'dtc/libfdt/fdt_wip.c',
1248 'dtc/libfdt/fdt_sw.c',
1249 'dtc/libfdt/fdt_rw.c',
1250 'dtc/libfdt/fdt_strerror.c',
1251 'dtc/libfdt/fdt_empty_tree.c',
1252 'dtc/libfdt/fdt_addresses.c',
1253 'dtc/libfdt/fdt_overlay.c',
1254 'dtc/libfdt/fdt_check.c',
1255 )
1256
1257 fdt_inc = include_directories('dtc/libfdt')
1258 libfdt = static_library('fdt',
1259 sources: fdt_files,
1260 include_directories: fdt_inc)
1261 fdt = declare_dependency(link_with: libfdt,
1262 include_directories: fdt_inc)
1263 endif
1264endif
1265if not fdt.found() and fdt_required.length() > 0
1266 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1267endif
1268
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001269config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001270config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001271config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001272
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001273#####################
1274# Generated sources #
1275#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001276
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001277genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001278
Marc-André Lureau3f885652019-07-15 18:06:04 +04001279hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04001280shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001281qapi_gen = find_program('scripts/qapi-gen.py')
1282qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1283 meson.source_root() / 'scripts/qapi/commands.py',
1284 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001285 meson.source_root() / 'scripts/qapi/error.py',
1286 meson.source_root() / 'scripts/qapi/events.py',
1287 meson.source_root() / 'scripts/qapi/expr.py',
1288 meson.source_root() / 'scripts/qapi/gen.py',
1289 meson.source_root() / 'scripts/qapi/introspect.py',
1290 meson.source_root() / 'scripts/qapi/parser.py',
1291 meson.source_root() / 'scripts/qapi/schema.py',
1292 meson.source_root() / 'scripts/qapi/source.py',
1293 meson.source_root() / 'scripts/qapi/types.py',
1294 meson.source_root() / 'scripts/qapi/visit.py',
1295 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001296 meson.source_root() / 'scripts/qapi-gen.py'
1297]
1298
1299tracetool = [
1300 python, files('scripts/tracetool.py'),
1301 '--backend=' + config_host['TRACE_BACKENDS']
1302]
1303
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001304qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1305 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02001306 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001307qemu_version = custom_target('qemu-version.h',
1308 output: 'qemu-version.h',
1309 command: qemu_version_cmd,
1310 capture: true,
1311 build_by_default: true,
1312 build_always_stale: true)
1313genh += qemu_version
1314
Marc-André Lureau3f885652019-07-15 18:06:04 +04001315hxdep = []
1316hx_headers = [
1317 ['qemu-options.hx', 'qemu-options.def'],
1318 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1319]
1320if have_system
1321 hx_headers += [
1322 ['hmp-commands.hx', 'hmp-commands.h'],
1323 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1324 ]
1325endif
1326foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001327 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04001328 input: files(d[0]),
1329 output: d[1],
1330 capture: true,
1331 build_by_default: true, # to be removed when added to a target
1332 command: [hxtool, '-h', '@INPUT0@'])
1333endforeach
1334genh += hxdep
1335
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001336###################
1337# Collect sources #
1338###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001339
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001340authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001341blockdev_ss = ss.source_set()
1342block_ss = ss.source_set()
1343bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001344chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001345common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001346crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001347io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001348linux_user_ss = ss.source_set()
1349qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001350qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001351softmmu_ss = ss.source_set()
1352specific_fuzz_ss = ss.source_set()
1353specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001354stub_ss = ss.source_set()
1355trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001356user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001357util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001358
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001359modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001360hw_arch = {}
1361target_arch = {}
1362target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001363
1364###############
1365# Trace files #
1366###############
1367
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001368# TODO: add each directory to the subdirs from its own meson.build, once
1369# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001370trace_events_subdirs = [
1371 'accel/kvm',
1372 'accel/tcg',
1373 'crypto',
1374 'monitor',
1375]
1376if have_user
1377 trace_events_subdirs += [ 'linux-user' ]
1378endif
1379if have_block
1380 trace_events_subdirs += [
1381 'authz',
1382 'block',
1383 'io',
1384 'nbd',
1385 'scsi',
1386 ]
1387endif
1388if have_system
1389 trace_events_subdirs += [
1390 'audio',
1391 'backends',
1392 'backends/tpm',
1393 'chardev',
1394 'hw/9pfs',
1395 'hw/acpi',
1396 'hw/alpha',
1397 'hw/arm',
1398 'hw/audio',
1399 'hw/block',
1400 'hw/block/dataplane',
1401 'hw/char',
1402 'hw/display',
1403 'hw/dma',
1404 'hw/hppa',
1405 'hw/hyperv',
1406 'hw/i2c',
1407 'hw/i386',
1408 'hw/i386/xen',
1409 'hw/ide',
1410 'hw/input',
1411 'hw/intc',
1412 'hw/isa',
1413 'hw/mem',
1414 'hw/mips',
1415 'hw/misc',
1416 'hw/misc/macio',
1417 'hw/net',
1418 'hw/nvram',
1419 'hw/pci',
1420 'hw/pci-host',
1421 'hw/ppc',
1422 'hw/rdma',
1423 'hw/rdma/vmw',
1424 'hw/rtc',
1425 'hw/s390x',
1426 'hw/scsi',
1427 'hw/sd',
1428 'hw/sparc',
1429 'hw/sparc64',
1430 'hw/ssi',
1431 'hw/timer',
1432 'hw/tpm',
1433 'hw/usb',
1434 'hw/vfio',
1435 'hw/virtio',
1436 'hw/watchdog',
1437 'hw/xen',
1438 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001439 'migration',
1440 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02001441 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001442 'ui',
1443 ]
1444endif
1445trace_events_subdirs += [
1446 'hw/core',
1447 'qapi',
1448 'qom',
1449 'target/arm',
1450 'target/hppa',
1451 'target/i386',
1452 'target/mips',
1453 'target/ppc',
1454 'target/riscv',
1455 'target/s390x',
1456 'target/sparc',
1457 'util',
1458]
1459
Stefan Hajnoczia3f6be82020-11-06 21:03:40 +00001460subdir('contrib/libvhost-user')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001461subdir('qapi')
1462subdir('qobject')
1463subdir('stubs')
1464subdir('trace')
1465subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04001466subdir('qom')
1467subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001468subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04001469subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001470
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001471
1472if enable_modules
1473 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1474 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1475endif
1476
Paolo Bonzini2becc362020-02-03 11:42:03 +01001477stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001478
1479util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01001480util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001481libqemuutil = static_library('qemuutil',
1482 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonziniaa087962020-09-01 11:15:30 -04001483 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001484qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04001485 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001486
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001487decodetree = generator(find_program('scripts/decodetree.py'),
1488 output: 'decode-@BASENAME@.c.inc',
1489 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1490
Paolo Bonzini478e9432020-08-17 12:47:55 +02001491subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04001492subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04001493subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001494subdir('fsdev')
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001495subdir('libdecnumber')
Marc-André Lureaud3b18482019-08-17 14:55:32 +04001496subdir('target')
Marc-André Lureau708eab42019-09-03 16:59:33 +04001497subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001498
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001499block_ss.add(files(
1500 'block.c',
1501 'blockjob.c',
1502 'job.c',
1503 'qemu-io-cmds.c',
1504))
1505block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
1506
1507subdir('nbd')
1508subdir('scsi')
1509subdir('block')
1510
Paolo Bonzini4a963372020-08-03 16:22:28 +02001511blockdev_ss.add(files(
1512 'blockdev.c',
Stefan Hajnoczicbc20bf2020-09-29 13:55:15 +01001513 'blockdev-nbd.c',
Paolo Bonzini4a963372020-08-03 16:22:28 +02001514 'iothread.c',
1515 'job-qmp.c',
1516))
1517
1518# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1519# os-win32.c does not
1520blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1521softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
Paolo Bonzini4a963372020-08-03 16:22:28 +02001522
1523common_ss.add(files('cpus-common.c'))
1524
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001525subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001526
Richard Hendersonf3433462020-09-12 10:47:33 -07001527common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02001528specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001529specific_ss.add(files('exec-vary.c'))
1530specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1531 'fpu/softfloat.c',
1532 'tcg/optimize.c',
1533 'tcg/tcg-common.c',
1534 'tcg/tcg-op-gvec.c',
1535 'tcg/tcg-op-vec.c',
1536 'tcg/tcg-op.c',
1537 'tcg/tcg.c',
1538))
1539specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1540
Marc-André Lureauab318052019-07-24 19:23:16 +04001541subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04001542subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04001543subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001544subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001545subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04001546subdir('replay')
Marc-André Lureau582ea952019-08-15 15:15:32 +04001547subdir('hw')
Marc-André Lureau1a828782019-08-18 16:13:08 +04001548subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001549subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04001550subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04001551subdir('linux-user')
1552
Marc-André Lureaub309c322019-08-18 19:20:37 +04001553bsd_user_ss.add(files('gdbstub.c'))
1554specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1555
Marc-André Lureau3a304462019-08-18 16:13:08 +04001556linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1557specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001558
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001559# needed for fuzzing binaries
1560subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001561subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001562
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001563########################
1564# Library dependencies #
1565########################
1566
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001567block_mods = []
1568softmmu_mods = []
1569foreach d, list : modules
1570 foreach m, module_ss : list
1571 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02001572 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001573 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1574 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1575 if d == 'block'
1576 block_mods += sl
1577 else
1578 softmmu_mods += sl
1579 endif
1580 else
1581 if d == 'block'
1582 block_ss.add_all(module_ss)
1583 else
1584 softmmu_ss.add_all(module_ss)
1585 endif
1586 endif
1587 endforeach
1588endforeach
1589
1590nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08001591undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001592block_syms = custom_target('block.syms', output: 'block.syms',
1593 input: [libqemuutil, block_mods],
1594 capture: true,
1595 command: [undefsym, nm, '@INPUT@'])
1596qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1597 input: [libqemuutil, softmmu_mods],
1598 capture: true,
1599 command: [undefsym, nm, '@INPUT@'])
1600
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001601qom_ss = qom_ss.apply(config_host, strict: false)
1602libqom = static_library('qom', qom_ss.sources() + genh,
1603 dependencies: [qom_ss.dependencies()],
1604 name_suffix: 'fa')
1605
1606qom = declare_dependency(link_whole: libqom)
1607
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001608authz_ss = authz_ss.apply(config_host, strict: false)
1609libauthz = static_library('authz', authz_ss.sources() + genh,
1610 dependencies: [authz_ss.dependencies()],
1611 name_suffix: 'fa',
1612 build_by_default: false)
1613
1614authz = declare_dependency(link_whole: libauthz,
1615 dependencies: qom)
1616
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001617crypto_ss = crypto_ss.apply(config_host, strict: false)
1618libcrypto = static_library('crypto', crypto_ss.sources() + genh,
1619 dependencies: [crypto_ss.dependencies()],
1620 name_suffix: 'fa',
1621 build_by_default: false)
1622
1623crypto = declare_dependency(link_whole: libcrypto,
1624 dependencies: [authz, qom])
1625
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001626io_ss = io_ss.apply(config_host, strict: false)
1627libio = static_library('io', io_ss.sources() + genh,
1628 dependencies: [io_ss.dependencies()],
1629 link_with: libqemuutil,
1630 name_suffix: 'fa',
1631 build_by_default: false)
1632
1633io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
1634
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02001635libmigration = static_library('migration', sources: migration_files + genh,
1636 name_suffix: 'fa',
1637 build_by_default: false)
1638migration = declare_dependency(link_with: libmigration,
1639 dependencies: [zlib, qom, io])
1640softmmu_ss.add(migration)
1641
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001642block_ss = block_ss.apply(config_host, strict: false)
1643libblock = static_library('block', block_ss.sources() + genh,
1644 dependencies: block_ss.dependencies(),
1645 link_depends: block_syms,
1646 name_suffix: 'fa',
1647 build_by_default: false)
1648
1649block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001650 link_args: '@block.syms',
1651 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001652
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01001653blockdev_ss = blockdev_ss.apply(config_host, strict: false)
1654libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
1655 dependencies: blockdev_ss.dependencies(),
1656 name_suffix: 'fa',
1657 build_by_default: false)
1658
1659blockdev = declare_dependency(link_whole: [libblockdev],
1660 dependencies: [block])
1661
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001662qmp_ss = qmp_ss.apply(config_host, strict: false)
1663libqmp = static_library('qmp', qmp_ss.sources() + genh,
1664 dependencies: qmp_ss.dependencies(),
1665 name_suffix: 'fa',
1666 build_by_default: false)
1667
1668qmp = declare_dependency(link_whole: [libqmp])
1669
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001670libchardev = static_library('chardev', chardev_ss.sources() + genh,
1671 name_suffix: 'fa',
1672 build_by_default: false)
1673
1674chardev = declare_dependency(link_whole: libchardev)
1675
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02001676libhwcore = static_library('hwcore', sources: hwcore_files + genh,
1677 name_suffix: 'fa',
1678 build_by_default: false)
1679hwcore = declare_dependency(link_whole: libhwcore)
1680common_ss.add(hwcore)
1681
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02001682###########
1683# Targets #
1684###########
1685
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001686foreach m : block_mods + softmmu_mods
1687 shared_module(m.name(),
1688 name_prefix: '',
1689 link_whole: m,
1690 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001691 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001692endforeach
1693
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01001694softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001695common_ss.add(qom, qemuutil)
1696
1697common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01001698common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
1699
1700common_all = common_ss.apply(config_all, strict: false)
1701common_all = static_library('common',
1702 build_by_default: false,
1703 sources: common_all.sources() + genh,
1704 dependencies: common_all.dependencies(),
1705 name_suffix: 'fa')
1706
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001707feature_to_c = find_program('scripts/feature_to_c.sh')
1708
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04001709emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001710foreach target : target_dirs
1711 config_target = config_target_mak[target]
1712 target_name = config_target['TARGET_NAME']
1713 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001714 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001715 arch_deps = []
1716 c_args = ['-DNEED_CPU_H',
1717 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
1718 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04001719 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01001720
Paolo Bonzini859aef02020-08-04 18:14:26 +02001721 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01001722 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
1723 if targetos == 'linux'
1724 target_inc += include_directories('linux-headers', is_system: true)
1725 endif
1726 if target.endswith('-softmmu')
1727 qemu_target_name = 'qemu-system-' + target_name
1728 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001729 t = target_softmmu_arch[arch].apply(config_target, strict: false)
1730 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001731 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001732
Marc-André Lureau2c442202019-08-17 13:55:58 +04001733 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
1734 hw = hw_arch[hw_dir].apply(config_target, strict: false)
1735 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001736 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04001737
Paolo Bonzini2becc362020-02-03 11:42:03 +01001738 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001739 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001740 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04001741 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001742 target_type='user'
1743 qemu_target_name = 'qemu-' + target_name
1744 if 'CONFIG_LINUX_USER' in config_target
1745 base_dir = 'linux-user'
1746 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1747 else
1748 base_dir = 'bsd-user'
1749 endif
1750 target_inc += include_directories(
1751 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04001752 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001753 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04001754 if 'CONFIG_LINUX_USER' in config_target
1755 dir = base_dir / abi
1756 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1757 if config_target.has_key('TARGET_SYSTBL_ABI')
1758 arch_srcs += \
1759 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1760 extra_args : config_target['TARGET_SYSTBL_ABI'])
1761 endif
1762 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01001763 endif
1764
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001765 if 'TARGET_XML_FILES' in config_target
1766 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1767 output: target + '-gdbstub-xml.c',
1768 input: files(config_target['TARGET_XML_FILES'].split()),
1769 command: [feature_to_c, '@INPUT@'],
1770 capture: true)
1771 arch_srcs += gdbstub_xml
1772 endif
1773
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001774 t = target_arch[arch].apply(config_target, strict: false)
1775 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001776 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001777
Paolo Bonzini2becc362020-02-03 11:42:03 +01001778 target_common = common_ss.apply(config_target, strict: false)
1779 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001780 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001781
Paolo Bonzini2becc362020-02-03 11:42:03 +01001782 target_specific = specific_ss.apply(config_target, strict: false)
1783 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001784 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001785
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001786 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02001787 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001788 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001789 objects: objects,
1790 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001791 c_args: c_args,
1792 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001793 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001794
1795 if target.endswith('-softmmu')
1796 execs = [{
1797 'name': 'qemu-system-' + target_name,
1798 'gui': false,
1799 'sources': files('softmmu/main.c'),
1800 'dependencies': []
1801 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001802 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001803 execs += [{
1804 'name': 'qemu-system-' + target_name + 'w',
1805 'gui': true,
1806 'sources': files('softmmu/main.c'),
1807 'dependencies': []
1808 }]
1809 endif
1810 if config_host.has_key('CONFIG_FUZZ')
1811 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1812 execs += [{
1813 'name': 'qemu-fuzz-' + target_name,
1814 'gui': false,
1815 'sources': specific_fuzz.sources(),
1816 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001817 }]
1818 endif
1819 else
1820 execs = [{
1821 'name': 'qemu-' + target_name,
1822 'gui': false,
1823 'sources': [],
1824 'dependencies': []
1825 }]
1826 endif
1827 foreach exe: execs
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04001828 emulators += {exe['name']:
1829 executable(exe['name'], exe['sources'],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001830 install: true,
1831 c_args: c_args,
1832 dependencies: arch_deps + deps + exe['dependencies'],
1833 objects: lib.extract_all_objects(recursive: true),
1834 link_language: link_language,
1835 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1836 link_args: link_args,
1837 gui_app: exe['gui'])
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04001838 }
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001839
1840 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1841 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001842 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1843 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001844 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1845 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1846 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001847 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001848 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001849 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001850 capture: true,
1851 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001852 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001853 command: [
1854 tracetool, '--group=all', '--format=' + stp['fmt'],
1855 '--binary=' + stp['bin'],
1856 '--target-name=' + target_name,
1857 '--target-type=' + target_type,
1858 '--probe-prefix=qemu.' + target_type + '.' + target_name,
1859 '@INPUT@',
1860 ])
1861 endforeach
1862 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001863 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001864endforeach
1865
Paolo Bonzini931049b2020-02-05 09:44:24 +01001866# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04001867
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001868if 'CONFIG_PLUGIN' in config_host
1869 install_headers('include/qemu/qemu-plugin.h')
1870endif
1871
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001872if 'CONFIG_GUEST_AGENT' in config_host
1873 subdir('qga')
1874endif
1875
Laurent Vivier9755c942020-08-24 17:24:30 +02001876# Don't build qemu-keymap if xkbcommon is not explicitly enabled
1877# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001878if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04001879 # used for the update-keymaps target, so include rules even if !have_tools
1880 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1881 dependencies: [qemuutil, xkbcommon], install: have_tools)
1882endif
1883
Paolo Bonzini931049b2020-02-05 09:44:24 +01001884if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001885 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1886 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1887 qemu_io = executable('qemu-io', files('qemu-io.c'),
1888 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01001889 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Stefan Hajnoczicbc20bf2020-09-29 13:55:15 +01001890 dependencies: [blockdev, qemuutil], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001891
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02001892 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02001893 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001894 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02001895
Marc-André Lureau157e7b12019-07-15 14:50:58 +04001896 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1897 dependencies: qemuutil,
1898 install: true)
1899
Paolo Bonzini931049b2020-02-05 09:44:24 +01001900 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02001901 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001902 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04001903 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02001904 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01001905 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04001906
1907 if targetos == 'linux'
1908 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1909 dependencies: [qemuutil, libcap_ng],
1910 install: true,
1911 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04001912
1913 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1914 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001915 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04001916 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04001917 endif
1918
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04001919 if 'CONFIG_IVSHMEM' in config_host
1920 subdir('contrib/ivshmem-client')
1921 subdir('contrib/ivshmem-server')
1922 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01001923endif
1924
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04001925subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001926subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04001927subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02001928subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08001929subdir('tests')
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04001930if 'CONFIG_GTK' in config_host
1931 subdir('po')
1932endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001933
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04001934if host_machine.system() == 'windows'
1935 nsis_cmd = [
1936 find_program('scripts/nsis.py'),
1937 '@OUTPUT@',
1938 get_option('prefix'),
1939 meson.current_source_dir(),
1940 host_machine.cpu_family(),
1941 '--',
1942 '-DDISPLAYVERSION=' + meson.project_version(),
1943 ]
1944 if build_docs
1945 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
1946 endif
1947 if 'CONFIG_GTK' in config_host
1948 nsis_cmd += '-DCONFIG_GTK=y'
1949 endif
1950
1951 nsis = custom_target('nsis',
1952 output: 'qemu-setup-' + meson.project_version() + '.exe',
1953 input: files('qemu.nsi'),
1954 build_always_stale: true,
1955 command: nsis_cmd + ['@INPUT@'])
1956 alias_target('installer', nsis)
1957endif
1958
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001959#########################
1960# Configuration summary #
1961#########################
1962
Paolo Bonzinif9332752020-02-03 13:28:38 +01001963summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001964summary_info += {'Install prefix': get_option('prefix')}
1965summary_info += {'BIOS directory': qemu_datadir}
1966summary_info += {'firmware path': get_option('qemu_firmwarepath')}
1967summary_info += {'binary directory': get_option('bindir')}
1968summary_info += {'library directory': get_option('libdir')}
1969summary_info += {'module directory': qemu_moddir}
1970summary_info += {'libexec directory': get_option('libexecdir')}
1971summary_info += {'include directory': get_option('includedir')}
1972summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001973if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001974 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04001975 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001976else
1977 summary_info += {'local state directory': 'queried at runtime'}
1978endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04001979summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001980summary_info += {'Build directory': meson.current_build_dir()}
1981summary_info += {'Source path': meson.current_source_dir()}
1982summary_info += {'GIT binary': config_host['GIT']}
1983summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
1984summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
1985summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
1986if link_language == 'cpp'
1987 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
1988else
1989 summary_info += {'C++ compiler': false}
1990endif
1991if targetos == 'darwin'
1992 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1993endif
1994summary_info += {'ARFLAGS': config_host['ARFLAGS']}
Paolo Bonzini47b30832020-09-23 05:26:17 -04001995summary_info += {'CFLAGS': ' '.join(get_option('c_args')
1996 + ['-O' + get_option('optimization')]
1997 + (get_option('debug') ? ['-g'] : []))}
1998if link_language == 'cpp'
1999 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2000 + ['-O' + get_option('optimization')]
2001 + (get_option('debug') ? ['-g'] : []))}
2002endif
2003link_args = get_option(link_language + '_link_args')
2004if link_args.length() > 0
2005 summary_info += {'LDFLAGS': ' '.join(link_args)}
2006endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002007summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2008summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
2009summary_info += {'make': config_host['MAKE']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002010summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Yonggang Luoe3667662020-10-16 06:06:25 +08002011summary_info += {'sphinx-build': sphinx_build.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002012summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2013# TODO: add back version
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002014summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
2015if slirp_opt != 'disabled'
Paolo Bonzinif9332752020-02-03 13:28:38 +01002016 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2017endif
2018summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2019if config_host.has_key('CONFIG_MODULES')
2020 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2021endif
2022summary_info += {'host CPU': cpu}
2023summary_info += {'host endianness': build_machine.endian()}
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002024summary_info += {'target list': ' '.join(target_dirs)}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002025summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
Paolo Bonzinideb62372020-09-01 07:51:16 -04002026summary_info += {'sparse enabled': sparse.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002027summary_info += {'strip binaries': get_option('strip')}
2028summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02002029summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002030if targetos == 'darwin'
2031 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
2032endif
2033# TODO: add back version
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002034summary_info += {'SDL support': sdl.found()}
2035summary_info += {'SDL image support': sdl_image.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002036# TODO: add back version
2037summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
2038summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002039summary_info += {'pixman': pixman.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002040# TODO: add back version
2041summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
2042summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
2043summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
2044# TODO: add back version
2045summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
2046if config_host.has_key('CONFIG_GCRYPT')
2047 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
2048 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2049endif
2050# TODO: add back version
2051summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
2052if config_host.has_key('CONFIG_NETTLE')
2053 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2054endif
2055summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
2056summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
Yonggang Luo5285e592020-10-13 07:43:48 +08002057summary_info += {'iconv support': iconv.found()}
2058summary_info += {'curses support': curses.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002059# TODO: add back version
2060summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
2061summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
2062summary_info += {'mingw32 support': targetos == 'windows'}
2063summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2064summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2065summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
2066summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
Misono Tomohirocece1162020-10-08 19:31:33 +09002067summary_info += {'build virtiofs daemon': have_virtiofsd}
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002068summary_info += {'Multipath support': mpathpersist.found()}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002069summary_info += {'VNC support': vnc.found()}
2070if vnc.found()
2071 summary_info += {'VNC SASL support': sasl.found()}
2072 summary_info += {'VNC JPEG support': jpeg.found()}
2073 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002074endif
2075summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2076if config_host.has_key('CONFIG_XEN_BACKEND')
2077 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2078endif
2079summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
Yonggang Luoe3667662020-10-16 06:06:25 +08002080summary_info += {'Documentation': build_docs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002081summary_info += {'PIE': get_option('b_pie')}
2082summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2083summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2084summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2085summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
2086summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
Paolo Bonzinic8d54502020-10-16 03:32:52 -04002087summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini05512f52020-09-16 15:31:11 -04002088summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2089summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2090summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2091summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
2092summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2093if config_all.has_key('CONFIG_TCG')
2094 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
2095 summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
2096endif
Paolo Bonziniaa087962020-09-01 11:15:30 -04002097summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002098summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2099summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002100summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002101summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
2102summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
2103summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2104summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2105summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2106summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
2107summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
Thomas Huthb54b82d2020-11-09 09:59:06 +01002108summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002109summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2110summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2111summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2112summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
Thomas Huthb54b82d2020-11-09 09:59:06 +01002113summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002114summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2115summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2116summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2117if config_host['TRACE_BACKENDS'].split().contains('simple')
2118 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2119endif
2120# TODO: add back protocol and server version
2121summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
2122summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
2123summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
2124summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02002125summary_info += {'U2F support': u2f.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002126summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
2127summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
2128summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
2129summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
2130summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
2131summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
2132summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2133if targetos == 'windows'
2134 if 'WIN_SDK' in config_host
2135 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2136 endif
2137 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2138 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Stefan Hajnoczi4bad7c32020-09-14 10:52:31 +01002139 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002140endif
2141summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
2142summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2143summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2144summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2145summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2146summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
2147summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +04002148summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002149summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2150summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
2151summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2152summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
2153summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
2154summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
2155summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
2156summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
2157summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
2158summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2159summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
Paolo Bonziniaa087962020-09-01 11:15:30 -04002160summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002161summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2162summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2163summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2164summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2165summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2166summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2167summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2168summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2169summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2170summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2171summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2172summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002173summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002174summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2175summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002176summary_info += {'libudev': libudev.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002177summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
2178summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2179summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2180if config_host.has_key('HAVE_GDB_BIN')
2181 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2182endif
2183summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2184summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2185summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
2186summary(summary_info, bool_yn: true)
2187
2188if not supported_cpus.contains(cpu)
2189 message()
2190 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2191 message()
2192 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2193 message('The QEMU project intends to remove support for this host CPU in')
2194 message('a future release if nobody volunteers to maintain it and to')
2195 message('provide a build host for our continuous integration setup.')
2196 message('configure has succeeded and you can continue to build, but')
2197 message('if you care about QEMU on this platform you should contact')
2198 message('us upstream at qemu-devel@nongnu.org.')
2199endif
2200
2201if not supported_oses.contains(targetos)
2202 message()
2203 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2204 message()
2205 message('Host OS ' + targetos + 'support is not currently maintained.')
2206 message('The QEMU project intends to remove support for this host OS in')
2207 message('a future release if nobody volunteers to maintain it and to')
2208 message('provide a build host for our continuous integration setup.')
2209 message('configure has succeeded and you can continue to build, but')
2210 message('if you care about QEMU on this platform you should contact')
2211 message('us upstream at qemu-devel@nongnu.org.')
2212endif