blob: 022272f4cfb9acc01663fada83fd2d7cb143eb13 [file] [log] [blame]
Paolo Bonzinia5665052019-06-10 12:05:14 +02001project('qemu', ['c'], meson_version: '>=0.55.0',
Paolo Bonzinia5cb7c52020-10-19 06:56:16 -04002 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_colorout=auto'] +
3 (meson.version().version_compare('>=0.56.0') ? [ 'b_staticpic=false' ] : []),
Paolo Bonzinia5665052019-06-10 12:05:14 +02004 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5
6not_found = dependency('', required: false)
Paolo Bonzinib29b40f2020-08-10 18:04:43 +02007if meson.version().version_compare('>=0.56.0')
8 keyval = import('keyval')
9else
10 keyval = import('unstable-keyval')
11endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040012ss = import('sourceset')
Richard Henderson8b18cdb2020-09-13 12:19:25 -070013fs = import('fs')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040014
Paolo Bonzinice1c1e72020-01-28 16:41:44 +010015sh = find_program('sh')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040016cc = meson.get_compiler('c')
Paolo Bonzinia5665052019-06-10 12:05:14 +020017config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Marc-André Lureau3154fee2019-08-29 22:07:01 +040018enable_modules = 'CONFIG_MODULES' in config_host
Paolo Bonzini35be72b2020-02-06 14:17:15 +010019enable_static = 'CONFIG_STATIC' in config_host
Yonggang Luoe3667662020-10-16 06:06:25 +080020
21# Temporary directory used for files created while
22# configure runs. Since it is in the build directory
23# we can safely blow away any previous version of it
24# (and we need not jump through hoops to try to delete
25# it when configure exits.)
26tmpdir = meson.current_build_dir() / 'meson-private/temp'
Marc-André Lureau8fe11232020-09-11 14:42:48 +020027
28if get_option('qemu_suffix').startswith('/')
29 error('qemu_suffix cannot start with a /')
30endif
31
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040032qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
Marc-André Lureauab4c0992020-08-26 15:04:16 +040033qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040034qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040035qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
36
37qemu_desktopdir = get_option('datadir') / 'applications'
38qemu_icondir = get_option('datadir') / 'icons'
39
Paolo Bonzini859aef02020-08-04 18:14:26 +020040config_host_data = configuration_data()
41genh = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020042
Paolo Bonzini760e4322020-08-26 08:09:48 +020043target_dirs = config_host['TARGET_DIRS'].split()
44have_user = false
45have_system = false
46foreach target : target_dirs
47 have_user = have_user or target.endswith('-user')
48 have_system = have_system or target.endswith('-softmmu')
49endforeach
50have_tools = 'CONFIG_TOOLS' in config_host
51have_block = have_system or have_tools
52
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040053python = import('python').find_installation()
54
55supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Sergei Trofimovich61256732020-10-12 18:57:19 +010056supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040057 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
58
59cpu = host_machine.cpu_family()
60targetos = host_machine.system()
61
Paolo Bonzini8a199802020-09-18 05:37:01 -040062if cpu in ['x86', 'x86_64']
63 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
64elif cpu == 'aarch64'
65 kvm_targets = ['aarch64-softmmu']
66elif cpu == 's390x'
67 kvm_targets = ['s390x-softmmu']
68elif cpu in ['ppc', 'ppc64']
69 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Huacai Chenfbc58842020-10-07 16:39:28 +080070elif cpu in ['mips', 'mips64']
71 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -040072else
73 kvm_targets = []
74endif
75
76accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alex Bennée0c3e41d2020-11-10 19:23:09 +000077if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
78 # i368 emulator provides xenpv machine type for multiple architectures
79 accelerator_targets += {
80 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
81 }
82endif
Paolo Bonzini8a199802020-09-18 05:37:01 -040083if cpu in ['x86', 'x86_64']
84 accelerator_targets += {
85 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -040086 'CONFIG_HVF': ['x86_64-softmmu'],
87 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
88 }
89endif
90
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040091##################
92# Compiler flags #
93##################
94
Alexander Bulekovff9ed622020-09-09 18:05:16 -040095# Specify linker-script with add_project_link_arguments so that it is not placed
96# within a linker --start-group/--end-group pair
97if 'CONFIG_FUZZ' in config_host
98 add_project_link_arguments(['-Wl,-T,',
99 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
100 native: false, language: ['c', 'cpp', 'objc'])
101endif
102
Paolo Bonzinia5665052019-06-10 12:05:14 +0200103add_project_arguments(config_host['QEMU_CFLAGS'].split(),
104 native: false, language: ['c', 'objc'])
105add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
106 native: false, language: 'cpp')
107add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
108 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzinia5665052019-06-10 12:05:14 +0200109
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400110if targetos == 'linux'
111 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
112 '-isystem', 'linux-headers',
113 language: ['c', 'cpp'])
114endif
115
116if 'CONFIG_TCG_INTERPRETER' in config_host
117 tcg_arch = 'tci'
118elif config_host['ARCH'] == 'sparc64'
119 tcg_arch = 'sparc'
120elif config_host['ARCH'] == 's390x'
121 tcg_arch = 's390'
122elif config_host['ARCH'] in ['x86_64', 'x32']
123 tcg_arch = 'i386'
124elif config_host['ARCH'] == 'ppc64'
125 tcg_arch = 'ppc'
126elif config_host['ARCH'] in ['riscv32', 'riscv64']
127 tcg_arch = 'riscv'
128else
129 tcg_arch = config_host['ARCH']
130endif
131add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
132 '-iquote', '.',
133 '-iquote', meson.current_source_dir(),
134 '-iquote', meson.current_source_dir() / 'accel/tcg',
135 '-iquote', meson.current_source_dir() / 'include',
136 '-iquote', meson.current_source_dir() / 'disas/libvixl',
137 language: ['c', 'cpp', 'objc'])
Alexander Bulekovc46f76d2020-09-02 13:36:50 -0400138
Marc-André Lureaufc929892019-07-13 01:47:54 +0400139link_language = meson.get_external_property('link_language', 'cpp')
140if link_language == 'cpp'
141 add_languages('cpp', required: true, native: false)
142endif
Paolo Bonzinia5665052019-06-10 12:05:14 +0200143if host_machine.system() == 'darwin'
144 add_languages('objc', required: false, native: false)
145endif
146
Paolo Bonzinideb62372020-09-01 07:51:16 -0400147sparse = find_program('cgcc', required: get_option('sparse'))
148if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100149 run_target('sparse',
150 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400151 'compile_commands.json', sparse.full_path(), '-Wbitwise',
152 '-Wno-transparent-union', '-Wno-old-initializer',
153 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100154endif
155
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200156###########################################
157# Target-specific checks and dependencies #
158###########################################
159
160if targetos != 'linux' and get_option('mpath').enabled()
161 error('Multipath is supported only on Linux')
162endif
163
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400164m = cc.find_library('m', required: false)
165util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200166winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400167socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400168version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400169coref = []
170iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400171emulator_link_args = []
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400172cocoa = not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400173hvf = not_found
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400174if targetos == 'windows'
175 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200176 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400177
178 win = import('windows')
179 version_res = win.compile_resources('version.rc',
180 depend_files: files('pc-bios/qemu-nsis.ico'),
181 include_directories: include_directories('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400182elif targetos == 'darwin'
183 coref = dependency('appleframeworks', modules: 'CoreFoundation')
184 iokit = dependency('appleframeworks', modules: 'IOKit')
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400185 cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200186elif targetos == 'sunos'
187 socket = [cc.find_library('socket'),
188 cc.find_library('nsl'),
189 cc.find_library('resolv')]
190elif targetos == 'haiku'
191 socket = [cc.find_library('posix_error_mapper'),
192 cc.find_library('network'),
193 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400194elif targetos == 'openbsd'
195 if not get_option('tcg').disabled() and target_dirs.length() > 0
196 # Disable OpenBSD W^X if available
197 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
198 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400199endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200200
Paolo Bonzini8a199802020-09-18 05:37:01 -0400201accelerators = []
202if not get_option('kvm').disabled() and targetos == 'linux'
203 accelerators += 'CONFIG_KVM'
204endif
205if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
206 accelerators += 'CONFIG_XEN'
207 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
208else
209 have_xen_pci_passthrough = false
210endif
211if not get_option('whpx').disabled() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000212 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400213 error('WHPX requires 64-bit host')
214 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
215 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
216 accelerators += 'CONFIG_WHPX'
217 endif
218endif
219if not get_option('hvf').disabled()
220 hvf = dependency('appleframeworks', modules: 'Hypervisor',
221 required: get_option('hvf'))
222 if hvf.found()
223 accelerators += 'CONFIG_HVF'
224 endif
225endif
226if not get_option('hax').disabled()
227 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
228 accelerators += 'CONFIG_HAX'
229 endif
230endif
231if not get_option('tcg').disabled()
232 if cpu not in supported_cpus
233 if 'CONFIG_TCG_INTERPRETER' in config_host
234 warning('Unsupported CPU @0@, will use TCG with TCI (experimental)'.format(cpu))
235 else
236 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
237 endif
238 endif
239 accelerators += 'CONFIG_TCG'
240 config_host += { 'CONFIG_TCG': 'y' }
241endif
242
243if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
244 error('KVM not available on this platform')
245endif
246if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
247 error('HVF not available on this platform')
248endif
249if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
250 error('WHPX not available on this platform')
251endif
252if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
253 if 'CONFIG_XEN' in accelerators
254 error('Xen PCI passthrough not available on this platform')
255 else
256 error('Xen PCI passthrough requested but Xen not enabled')
257 endif
258endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400259if not cocoa.found() and get_option('cocoa').enabled()
260 error('Cocoa not available on this platform')
261endif
262
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200263################
264# Dependencies #
265################
266
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400267# The path to glib.h is added to all compilation commands. This was
268# grandfathered in from the QEMU Makefiles.
269add_project_arguments(config_host['GLIB_CFLAGS'].split(),
270 native: false, language: ['c', 'cpp', 'objc'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400271glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
272 link_args: config_host['GLIB_LIBS'].split())
273# override glib dep with the configure results (for subprojects)
274meson.override_dependency('glib-2.0', glib)
275
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400276gio = not_found
277if 'CONFIG_GIO' in config_host
278 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
279 link_args: config_host['GIO_LIBS'].split())
280endif
281lttng = not_found
282if 'CONFIG_TRACE_UST' in config_host
283 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
284endif
285urcubp = not_found
286if 'CONFIG_TRACE_UST' in config_host
287 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
288endif
Daniel P. Berrangé46859d92020-09-01 14:30:49 +0100289gcrypt = not_found
290if 'CONFIG_GCRYPT' in config_host
291 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
292 link_args: config_host['GCRYPT_LIBS'].split())
293endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400294nettle = not_found
295if 'CONFIG_NETTLE' in config_host
296 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
297 link_args: config_host['NETTLE_LIBS'].split())
298endif
299gnutls = not_found
300if 'CONFIG_GNUTLS' in config_host
301 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
302 link_args: config_host['GNUTLS_LIBS'].split())
303endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200304pixman = not_found
305if have_system or have_tools
306 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzini1a949332020-08-31 06:27:00 -0400307 method: 'pkg-config', static: enable_static)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200308endif
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400309pam = not_found
310if 'CONFIG_AUTH_PAM' in config_host
311 pam = cc.find_library('pam')
312endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400313libaio = cc.find_library('aio', required: false)
Paolo Bonzini1ffb3bb2020-08-28 19:33:54 +0200314zlib = dependency('zlib', required: true, static: enable_static)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400315linux_io_uring = not_found
316if 'CONFIG_LINUX_IO_URING' in config_host
317 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
318 link_args: config_host['LINUX_IO_URING_LIBS'].split())
319endif
320libxml2 = not_found
321if 'CONFIG_LIBXML2' in config_host
322 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
323 link_args: config_host['LIBXML2_LIBS'].split())
324endif
325libnfs = not_found
326if 'CONFIG_LIBNFS' in config_host
327 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
328endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400329libattr = not_found
330if 'CONFIG_ATTR' in config_host
331 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
332endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100333seccomp = not_found
334if 'CONFIG_SECCOMP' in config_host
335 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
336 link_args: config_host['SECCOMP_LIBS'].split())
337endif
338libcap_ng = not_found
339if 'CONFIG_LIBCAP_NG' in config_host
340 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
341endif
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400342if get_option('xkbcommon').auto() and not have_system and not have_tools
343 xkbcommon = not_found
344else
345 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400346 method: 'pkg-config', static: enable_static)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400347endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400348vde = not_found
349if config_host.has_key('CONFIG_VDE')
350 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
351endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200352pulse = not_found
353if 'CONFIG_LIBPULSE' in config_host
354 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
355 link_args: config_host['PULSE_LIBS'].split())
356endif
357alsa = not_found
358if 'CONFIG_ALSA' in config_host
359 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
360 link_args: config_host['ALSA_LIBS'].split())
361endif
362jack = not_found
363if 'CONFIG_LIBJACK' in config_host
364 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
365endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200366spice = not_found
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200367spice_headers = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200368if 'CONFIG_SPICE' in config_host
369 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
370 link_args: config_host['SPICE_LIBS'].split())
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200371 spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
Paolo Bonzini26347332019-07-29 15:40:07 +0200372endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400373rt = cc.find_library('rt', required: false)
Paolo Bonziniccf7afa2020-09-01 06:44:23 -0400374libdl = not_found
375if 'CONFIG_PLUGIN' in config_host
376 libdl = cc.find_library('dl', required: true)
377endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200378libiscsi = not_found
379if 'CONFIG_LIBISCSI' in config_host
380 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
381 link_args: config_host['LIBISCSI_LIBS'].split())
382endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400383zstd = not_found
384if 'CONFIG_ZSTD' in config_host
385 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
386 link_args: config_host['ZSTD_LIBS'].split())
387endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400388gbm = not_found
389if 'CONFIG_GBM' in config_host
390 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
391 link_args: config_host['GBM_LIBS'].split())
392endif
393virgl = not_found
394if 'CONFIG_VIRGL' in config_host
395 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
396 link_args: config_host['VIRGL_LIBS'].split())
397endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400398curl = not_found
399if 'CONFIG_CURL' in config_host
400 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
401 link_args: config_host['CURL_LIBS'].split())
402endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200403libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200404if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200405 libudev = dependency('libudev',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400406 required: get_option('libudev'),
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200407 static: enable_static)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200408endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200409
Paolo Bonzini5c530152020-10-15 06:09:27 -0400410mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200411mpathpersist = not_found
412mpathpersist_new_api = false
413if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
414 mpath_test_source_new = '''
415 #include <libudev.h>
416 #include <mpath_persist.h>
417 unsigned mpath_mx_alloc_len = 1024;
418 int logsink;
419 static struct config *multipath_conf;
420 extern struct udev *udev;
421 extern struct config *get_multipath_config(void);
422 extern void put_multipath_config(struct config *conf);
423 struct udev *udev;
424 struct config *get_multipath_config(void) { return multipath_conf; }
425 void put_multipath_config(struct config *conf) { }
426 int main(void) {
427 udev = udev_new();
428 multipath_conf = mpath_lib_init();
429 return 0;
430 }'''
431 mpath_test_source_old = '''
432 #include <libudev.h>
433 #include <mpath_persist.h>
434 unsigned mpath_mx_alloc_len = 1024;
435 int logsink;
436 int main(void) {
437 struct udev *udev = udev_new();
438 mpath_lib_init(udev);
439 return 0;
440 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400441 libmpathpersist = cc.find_library('mpathpersist',
442 required: get_option('mpath'),
443 static: enable_static)
444 if libmpathpersist.found()
445 mpathlibs += libmpathpersist
446 if enable_static
447 mpathlibs += cc.find_library('devmapper',
448 required: get_option('mpath'),
449 static: enable_static)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200450 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400451 mpathlibs += cc.find_library('multipath',
452 required: get_option('mpath'),
453 static: enable_static)
454 foreach lib: mpathlibs
455 if not lib.found()
456 mpathlibs = []
457 break
458 endif
459 endforeach
460 if mpathlibs.length() == 0
461 msg = 'Dependencies missing for libmpathpersist'
462 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200463 mpathpersist = declare_dependency(dependencies: mpathlibs)
464 mpathpersist_new_api = true
465 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
466 mpathpersist = declare_dependency(dependencies: mpathlibs)
467 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400468 msg = 'Cannot detect libmpathpersist API'
469 endif
470 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200471 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400472 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200473 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400474 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200475 endif
476 endif
477 endif
478endif
479
Yonggang Luo5285e592020-10-13 07:43:48 +0800480iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800481curses = not_found
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400482if have_system and not get_option('curses').disabled()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400483 curses_test = '''
484 #include <locale.h>
485 #include <curses.h>
486 #include <wchar.h>
487 int main(void) {
488 wchar_t wch = L'w';
489 setlocale(LC_ALL, "");
490 resize_term(0, 0);
491 addwstr(L"wide chars\n");
492 addnwstr(&wch, 1);
493 add_wch(WACS_DEGREE);
494 return 0;
495 }'''
496
Yonggang Luoca31e302020-11-17 05:31:06 +0800497 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
498 foreach curses_dep : curses_dep_list
499 if not curses.found()
500 curses = dependency(curses_dep,
501 required: false,
502 method: 'pkg-config',
503 static: enable_static)
504 endif
505 endforeach
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400506 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500507 curses_compile_args = ['-DNCURSES_WIDECHAR']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400508 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500509 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
510 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400511 else
512 msg = 'curses package not usable'
513 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800514 endif
515 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400516 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400517 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
518 if targetos != 'windows' and not has_curses_h
519 message('Trying with /usr/include/ncursesw')
520 curses_compile_args += ['-I/usr/include/ncursesw']
521 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
522 endif
523 if has_curses_h
524 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
525 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800526 libcurses = cc.find_library(curses_libname,
527 required: false,
Yonggang Luo5285e592020-10-13 07:43:48 +0800528 static: enable_static)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400529 if libcurses.found()
530 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
531 curses = declare_dependency(compile_args: curses_compile_args,
532 dependencies: [libcurses])
533 break
534 else
535 msg = 'curses library not usable'
536 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800537 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400538 endforeach
539 endif
540 endif
541 if not get_option('iconv').disabled()
542 foreach link_args : [ ['-liconv'], [] ]
543 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
544 # We need to use libiconv if available because mixing libiconv's headers with
545 # the system libc does not work.
546 # However, without adding glib to the dependencies -L/usr/local/lib will not be
547 # included in the command line and libiconv will not be found.
548 if cc.links('''
549 #include <iconv.h>
550 int main(void) {
551 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
552 return conv != (iconv_t) -1;
553 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
554 iconv = declare_dependency(link_args: link_args, dependencies: glib)
555 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800556 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400557 endforeach
558 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400559 if curses.found() and not iconv.found()
560 if get_option('iconv').enabled()
561 error('iconv not available')
562 endif
563 msg = 'iconv required for curses UI but not available'
564 curses = not_found
565 endif
566 if not curses.found() and msg != ''
567 if get_option('curses').enabled()
568 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400569 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400570 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400571 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800572 endif
573endif
574
Paolo Bonzini26347332019-07-29 15:40:07 +0200575brlapi = not_found
576if 'CONFIG_BRLAPI' in config_host
577 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
578endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100579
Paolo Bonzini760e4322020-08-26 08:09:48 +0200580sdl = not_found
581if have_system
Yonggang Luo363743d2020-08-26 23:10:03 +0800582 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200583 sdl_image = not_found
584endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100585if sdl.found()
586 # work around 2.0.8 bug
587 sdl = declare_dependency(compile_args: '-Wno-undef',
588 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200589 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400590 method: 'pkg-config', static: enable_static)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100591else
592 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100593 error('sdl-image required, but SDL was @0@'.format(
594 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100595 endif
596 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200597endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100598
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400599rbd = not_found
600if 'CONFIG_RBD' in config_host
601 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
602endif
603glusterfs = not_found
604if 'CONFIG_GLUSTERFS' in config_host
605 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
606 link_args: config_host['GLUSTERFS_LIBS'].split())
607endif
608libssh = not_found
609if 'CONFIG_LIBSSH' in config_host
610 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
611 link_args: config_host['LIBSSH_LIBS'].split())
612endif
613libbzip2 = not_found
614if 'CONFIG_BZIP2' in config_host
615 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
616endif
617liblzfse = not_found
618if 'CONFIG_LZFSE' in config_host
619 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
620endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200621oss = not_found
622if 'CONFIG_AUDIO_OSS' in config_host
623 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
624endif
625dsound = not_found
626if 'CONFIG_AUDIO_DSOUND' in config_host
627 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
628endif
629coreaudio = not_found
630if 'CONFIG_AUDIO_COREAUDIO' in config_host
631 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
632endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400633opengl = not_found
634if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400635 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
636 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400637endif
638gtk = not_found
639if 'CONFIG_GTK' in config_host
640 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
641 link_args: config_host['GTK_LIBS'].split())
642endif
643vte = not_found
644if 'CONFIG_VTE' in config_host
645 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
646 link_args: config_host['VTE_LIBS'].split())
647endif
648x11 = not_found
649if 'CONFIG_X11' in config_host
650 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
651 link_args: config_host['X11_LIBS'].split())
652endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100653vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400654png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400655jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400656sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100657if get_option('vnc').enabled()
658 vnc = declare_dependency() # dummy dependency
659 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400660 method: 'pkg-config', static: enable_static)
Paolo Bonzini8e242b32020-11-23 13:34:02 -0500661 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
662 method: 'pkg-config', static: enable_static)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100663 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
664 required: get_option('vnc_sasl'),
665 static: enable_static)
666 if sasl.found()
667 sasl = declare_dependency(dependencies: sasl,
668 compile_args: '-DSTRUCT_IOVEC_DEFINED')
669 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400670endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400671snappy = not_found
672if 'CONFIG_SNAPPY' in config_host
673 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
674endif
675lzo = not_found
676if 'CONFIG_LZO' in config_host
677 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
678endif
Marc-André Lureau55166232019-07-24 19:16:22 +0400679rdma = not_found
680if 'CONFIG_RDMA' in config_host
681 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
682endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400683numa = not_found
684if 'CONFIG_NUMA' in config_host
685 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
686endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400687xen = not_found
688if 'CONFIG_XEN_BACKEND' in config_host
689 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
690 link_args: config_host['XEN_LIBS'].split())
691endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200692cacard = not_found
693if 'CONFIG_SMARTCARD' in config_host
694 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
695 link_args: config_host['SMARTCARD_LIBS'].split())
696endif
César Belley0a40bcb2020-08-26 13:42:04 +0200697u2f = not_found
698if have_system
699 u2f = dependency('u2f-emu', required: get_option('u2f'),
700 method: 'pkg-config',
701 static: enable_static)
702endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200703usbredir = not_found
704if 'CONFIG_USB_REDIR' in config_host
705 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
706 link_args: config_host['USB_REDIR_LIBS'].split())
707endif
708libusb = not_found
709if 'CONFIG_USB_LIBUSB' in config_host
710 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
711 link_args: config_host['LIBUSB_LIBS'].split())
712endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400713libpmem = not_found
714if 'CONFIG_LIBPMEM' in config_host
715 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
716 link_args: config_host['LIBPMEM_LIBS'].split())
717endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600718libdaxctl = not_found
719if 'CONFIG_LIBDAXCTL' in config_host
720 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
721endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +0400722tasn1 = not_found
723if 'CONFIG_TASN1' in config_host
724 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
725 link_args: config_host['TASN1_LIBS'].split())
726endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400727keyutils = dependency('libkeyutils', required: false,
728 method: 'pkg-config', static: enable_static)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400729
Marc-André Lureau3909def2020-08-28 15:07:33 +0400730has_gettid = cc.has_function('gettid')
731
Paolo Bonziniaa087962020-09-01 11:15:30 -0400732# Malloc tests
733
734malloc = []
735if get_option('malloc') == 'system'
736 has_malloc_trim = \
737 not get_option('malloc_trim').disabled() and \
738 cc.links('''#include <malloc.h>
739 int main(void) { malloc_trim(0); return 0; }''')
740else
741 has_malloc_trim = false
742 malloc = cc.find_library(get_option('malloc'), required: true)
743endif
744if not has_malloc_trim and get_option('malloc_trim').enabled()
745 if get_option('malloc') == 'system'
746 error('malloc_trim not available on this platform.')
747 else
748 error('malloc_trim not available with non-libc memory allocator')
749 endif
750endif
751
Max Reitz84e319a2020-11-02 17:18:55 +0100752# Check whether the glibc provides statx()
753
754statx_test = '''
755 #ifndef _GNU_SOURCE
756 #define _GNU_SOURCE
757 #endif
758 #include <sys/stat.h>
759 int main(void) {
760 struct statx statxbuf;
761 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
762 return 0;
763 }'''
764
765has_statx = cc.links(statx_test)
766
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000767have_vhost_user_blk_server = (targetos == 'linux' and
768 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000769
770if get_option('vhost_user_blk_server').enabled()
771 if targetos != 'linux'
772 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000773 elif 'CONFIG_VHOST_USER' not in config_host
774 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000775 endif
776elif get_option('vhost_user_blk_server').disabled() or not have_system
777 have_vhost_user_blk_server = false
778endif
779
Daniele Buono9e62ba42020-12-04 18:06:14 -0500780
Max Reitzdf4ea702020-10-27 20:05:46 +0100781if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
782 error('Cannot enable fuse-lseek while fuse is disabled')
783endif
784
Max Reitza484a712020-10-27 20:05:41 +0100785fuse = dependency('fuse3', required: get_option('fuse'),
786 version: '>=3.1', method: 'pkg-config',
787 static: enable_static)
788
Max Reitzdf4ea702020-10-27 20:05:46 +0100789fuse_lseek = not_found
790if not get_option('fuse_lseek').disabled()
791 if fuse.version().version_compare('>=3.8')
792 # Dummy dependency
793 fuse_lseek = declare_dependency()
794 elif get_option('fuse_lseek').enabled()
795 if fuse.found()
796 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
797 else
798 error('fuse-lseek requires libfuse, which was not found')
799 endif
800 endif
801endif
802
Daniele Buono9e62ba42020-12-04 18:06:14 -0500803if get_option('cfi')
804 cfi_flags=[]
805 # Check for dependency on LTO
806 if not get_option('b_lto')
807 error('Selected Control-Flow Integrity but LTO is disabled')
808 endif
809 if config_host.has_key('CONFIG_MODULES')
810 error('Selected Control-Flow Integrity is not compatible with modules')
811 endif
812 # Check for cfi flags. CFI requires LTO so we can't use
813 # get_supported_arguments, but need a more complex "compiles" which allows
814 # custom arguments
815 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
816 args: ['-flto', '-fsanitize=cfi-icall'] )
817 cfi_flags += '-fsanitize=cfi-icall'
818 else
819 error('-fsanitize=cfi-icall is not supported by the compiler')
820 endif
821 if cc.compiles('int main () { return 0; }',
822 name: '-fsanitize-cfi-icall-generalize-pointers',
823 args: ['-flto', '-fsanitize=cfi-icall',
824 '-fsanitize-cfi-icall-generalize-pointers'] )
825 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
826 else
827 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
828 endif
829 if get_option('cfi_debug')
830 if cc.compiles('int main () { return 0; }',
831 name: '-fno-sanitize-trap=cfi-icall',
832 args: ['-flto', '-fsanitize=cfi-icall',
833 '-fno-sanitize-trap=cfi-icall'] )
834 cfi_flags += '-fno-sanitize-trap=cfi-icall'
835 else
836 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
837 endif
838 endif
839 add_project_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
840 add_project_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
841endif
842
Paolo Bonzinia0c91622020-10-07 11:01:51 -0400843#################
844# config-host.h #
845#################
Paolo Bonzini859aef02020-08-04 18:14:26 +0200846
Paolo Bonzini16bf7a32020-10-16 03:19:14 -0400847config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
848config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
849config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
850config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
851config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
852config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
853config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
854config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
855config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
856config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
857config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
858config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
859
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400860config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200861config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200862config_host_data.set('CONFIG_MPATH', mpathpersist.found())
863config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Yonggang Luo5285e592020-10-13 07:43:48 +0800864config_host_data.set('CONFIG_CURSES', curses.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100865config_host_data.set('CONFIG_SDL', sdl.found())
866config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000867config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100868config_host_data.set('CONFIG_VNC', vnc.found())
869config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
870config_host_data.set('CONFIG_VNC_PNG', png.found())
871config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +0200872config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400873config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +0400874config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonziniaa087962020-09-01 11:15:30 -0400875config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +0100876config_host_data.set('CONFIG_STATX', has_statx)
Max Reitza484a712020-10-27 20:05:41 +0100877config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +0100878config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Daniele Buono9e62ba42020-12-04 18:06:14 -0500879config_host_data.set('CONFIG_CFI', get_option('cfi'))
Paolo Bonzini859aef02020-08-04 18:14:26 +0200880config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
881config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
882config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
883config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
884
Thomas Huth48f670e2020-11-18 18:10:52 +0100885config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +0100886config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +0100887config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Thomas Huthded5d782020-11-14 11:10:11 +0100888config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +0100889config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Thomas Huth88c78f12020-11-18 18:10:50 +0100890config_host_data.set('HAVE_SYS_SIGNAL_H', cc.has_header('sys/signal.h'))
Thomas Huthded5d782020-11-14 11:10:11 +0100891
Paolo Bonzini765686d2020-09-18 06:37:21 -0400892ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
Paolo Bonzini859aef02020-08-04 18:14:26 +0200893arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzini16bf7a32020-10-16 03:19:14 -0400894strings = ['HOST_DSOSUF', 'CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +0200895foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -0400896 if ignored.contains(k)
897 # do nothing
898 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +0200899 if v != ''
900 v = '"' + '", "'.join(v.split()) + '", '
901 endif
902 config_host_data.set(k, v)
903 elif k == 'ARCH'
904 config_host_data.set('HOST_' + v.to_upper(), 1)
905 elif strings.contains(k)
906 if not k.startswith('CONFIG_')
907 k = 'CONFIG_' + k.to_upper()
908 endif
909 config_host_data.set_quoted(k, v)
910 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
911 config_host_data.set(k, v == 'y' ? 1 : v)
912 endif
913endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +0200914
Paolo Bonzinia0c91622020-10-07 11:01:51 -0400915########################
916# Target configuration #
917########################
918
Paolo Bonzini2becc362020-02-03 11:42:03 +0100919minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -0400920config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -0400921config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400922config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100923config_devices_mak_list = []
924config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +0200925config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100926config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400927
928disassemblers = {
929 'alpha' : ['CONFIG_ALPHA_DIS'],
930 'arm' : ['CONFIG_ARM_DIS'],
931 'avr' : ['CONFIG_AVR_DIS'],
932 'cris' : ['CONFIG_CRIS_DIS'],
933 'hppa' : ['CONFIG_HPPA_DIS'],
934 'i386' : ['CONFIG_I386_DIS'],
935 'x86_64' : ['CONFIG_I386_DIS'],
936 'x32' : ['CONFIG_I386_DIS'],
937 'lm32' : ['CONFIG_LM32_DIS'],
938 'm68k' : ['CONFIG_M68K_DIS'],
939 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
940 'mips' : ['CONFIG_MIPS_DIS'],
941 'moxie' : ['CONFIG_MOXIE_DIS'],
942 'nios2' : ['CONFIG_NIOS2_DIS'],
943 'or1k' : ['CONFIG_OPENRISC_DIS'],
944 'ppc' : ['CONFIG_PPC_DIS'],
945 'riscv' : ['CONFIG_RISCV_DIS'],
946 'rx' : ['CONFIG_RX_DIS'],
947 's390' : ['CONFIG_S390_DIS'],
948 'sh4' : ['CONFIG_SH4_DIS'],
949 'sparc' : ['CONFIG_SPARC_DIS'],
950 'xtensa' : ['CONFIG_XTENSA_DIS'],
951}
952if link_language == 'cpp'
953 disassemblers += {
954 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
955 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
956 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
957 }
958endif
959
Paolo Bonzini2becc362020-02-03 11:42:03 +0100960kconfig_external_symbols = [
961 'CONFIG_KVM',
962 'CONFIG_XEN',
963 'CONFIG_TPM',
964 'CONFIG_SPICE',
965 'CONFIG_IVSHMEM',
966 'CONFIG_OPENGL',
967 'CONFIG_X11',
968 'CONFIG_VHOST_USER',
Laurent Vivier40bc0ca2020-09-24 23:00:23 +0200969 'CONFIG_VHOST_VDPA',
Paolo Bonzini2becc362020-02-03 11:42:03 +0100970 'CONFIG_VHOST_KERNEL',
971 'CONFIG_VIRTFS',
972 'CONFIG_LINUX',
973 'CONFIG_PVRDMA',
974]
Paolo Bonzinia9a74902020-09-21 05:11:01 -0400975ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400976
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -0400977default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
978actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +0200979fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400980foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -0400981 config_target = { 'TARGET_NAME': target.split('-')[0] }
982 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -0400983 if targetos != 'linux'
984 if default_targets
985 continue
986 endif
987 error('Target @0@ is only available on a Linux host'.format(target))
988 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -0400989 config_target += { 'CONFIG_LINUX_USER': 'y' }
990 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -0400991 if 'CONFIG_BSD' not in config_host
992 if default_targets
993 continue
994 endif
995 error('Target @0@ is only available on a BSD host'.format(target))
996 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -0400997 config_target += { 'CONFIG_BSD_USER': 'y' }
998 elif target.endswith('softmmu')
999 config_target += { 'CONFIG_SOFTMMU': 'y' }
1000 endif
1001 if target.endswith('-user')
1002 config_target += {
1003 'CONFIG_USER_ONLY': 'y',
1004 'CONFIG_QEMU_INTERP_PREFIX':
1005 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1006 }
1007 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001008
Paolo Bonzini8a199802020-09-18 05:37:01 -04001009 have_accel = false
1010 foreach sym: accelerators
1011 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1012 config_target += { sym: 'y' }
1013 config_all += { sym: 'y' }
1014 if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
1015 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1016 endif
1017 have_accel = true
1018 endif
1019 endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001020 if not have_accel
1021 if default_targets
1022 continue
1023 endif
1024 error('No accelerator available for target @0@'.format(target))
1025 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001026
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001027 actual_target_dirs += target
Paolo Bonzini765686d2020-09-18 06:37:21 -04001028 config_target += keyval.load('default-configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001029 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001030
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001031 if 'TARGET_NEED_FDT' in config_target
1032 fdt_required += target
1033 endif
1034
Paolo Bonzinifa731682020-09-21 05:19:07 -04001035 # Add default keys
1036 if 'TARGET_BASE_ARCH' not in config_target
1037 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1038 endif
1039 if 'TARGET_ABI_DIR' not in config_target
1040 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1041 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001042
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001043 foreach k, v: disassemblers
1044 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1045 foreach sym: v
1046 config_target += { sym: 'y' }
1047 config_all_disas += { sym: 'y' }
1048 endforeach
1049 endif
1050 endforeach
1051
Paolo Bonzini859aef02020-08-04 18:14:26 +02001052 config_target_data = configuration_data()
1053 foreach k, v: config_target
1054 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1055 # do nothing
1056 elif ignored.contains(k)
1057 # do nothing
1058 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001059 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1060 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001061 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001062 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001063 config_target_data.set_quoted(k, v)
1064 elif v == 'y'
1065 config_target_data.set(k, 1)
1066 else
1067 config_target_data.set(k, v)
1068 endif
1069 endforeach
1070 config_target_h += {target: configure_file(output: target + '-config-target.h',
1071 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001072
1073 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001074 base_kconfig = []
1075 foreach sym : kconfig_external_symbols
Paolo Bonzini859aef02020-08-04 18:14:26 +02001076 if sym in config_target or sym in config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01001077 base_kconfig += '@0@=y'.format(sym)
1078 endif
1079 endforeach
1080
1081 config_devices_mak = target + '-config-devices.mak'
1082 config_devices_mak = configure_file(
Paolo Bonzini1bb4cb12020-09-18 06:06:09 -04001083 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001084 output: config_devices_mak,
1085 depfile: config_devices_mak + '.d',
1086 capture: true,
1087 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
1088 config_devices_mak, '@DEPFILE@', '@INPUT@',
1089 base_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02001090
1091 config_devices_data = configuration_data()
1092 config_devices = keyval.load(config_devices_mak)
1093 foreach k, v: config_devices
1094 config_devices_data.set(k, 1)
1095 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001096 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001097 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1098 configuration: config_devices_data)}
1099 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001100 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001101 endif
1102 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001103endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001104target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001105
Paolo Bonzini2becc362020-02-03 11:42:03 +01001106# This configuration is used to build files that are shared by
1107# multiple binaries, and then extracted out of the "common"
1108# static_library target.
1109#
1110# We do not use all_sources()/all_dependencies(), because it would
1111# build literally all source files, including devices only used by
1112# targets that are not built for this compilation. The CONFIG_ALL
1113# pseudo symbol replaces it.
1114
Paolo Bonzini05512f52020-09-16 15:31:11 -04001115config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001116config_all += config_host
1117config_all += config_all_disas
1118config_all += {
1119 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1120 'CONFIG_SOFTMMU': have_system,
1121 'CONFIG_USER_ONLY': have_user,
1122 'CONFIG_ALL': true,
1123}
1124
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001125##############
1126# Submodules #
1127##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001128
1129capstone = not_found
1130capstone_opt = get_option('capstone')
1131if capstone_opt in ['enabled', 'auto', 'system']
1132 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07001133 capstone = dependency('capstone', version: '>=4.0',
1134 static: enable_static, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001135 required: capstone_opt == 'system' or
1136 capstone_opt == 'enabled' and not have_internal)
1137 if capstone.found()
1138 capstone_opt = 'system'
1139 elif have_internal
1140 capstone_opt = 'internal'
1141 else
1142 capstone_opt = 'disabled'
1143 endif
1144endif
1145if capstone_opt == 'internal'
1146 capstone_data = configuration_data()
1147 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1148
1149 capstone_files = files(
1150 'capstone/cs.c',
1151 'capstone/MCInst.c',
1152 'capstone/MCInstrDesc.c',
1153 'capstone/MCRegisterInfo.c',
1154 'capstone/SStream.c',
1155 'capstone/utils.c'
1156 )
1157
1158 if 'CONFIG_ARM_DIS' in config_all_disas
1159 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1160 capstone_files += files(
1161 'capstone/arch/ARM/ARMDisassembler.c',
1162 'capstone/arch/ARM/ARMInstPrinter.c',
1163 'capstone/arch/ARM/ARMMapping.c',
1164 'capstone/arch/ARM/ARMModule.c'
1165 )
1166 endif
1167
1168 # FIXME: This config entry currently depends on a c++ compiler.
1169 # Which is needed for building libvixl, but not for capstone.
1170 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1171 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1172 capstone_files += files(
1173 'capstone/arch/AArch64/AArch64BaseInfo.c',
1174 'capstone/arch/AArch64/AArch64Disassembler.c',
1175 'capstone/arch/AArch64/AArch64InstPrinter.c',
1176 'capstone/arch/AArch64/AArch64Mapping.c',
1177 'capstone/arch/AArch64/AArch64Module.c'
1178 )
1179 endif
1180
1181 if 'CONFIG_PPC_DIS' in config_all_disas
1182 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1183 capstone_files += files(
1184 'capstone/arch/PowerPC/PPCDisassembler.c',
1185 'capstone/arch/PowerPC/PPCInstPrinter.c',
1186 'capstone/arch/PowerPC/PPCMapping.c',
1187 'capstone/arch/PowerPC/PPCModule.c'
1188 )
1189 endif
1190
Richard Henderson3d562842020-01-04 07:24:59 +10001191 if 'CONFIG_S390_DIS' in config_all_disas
1192 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1193 capstone_files += files(
1194 'capstone/arch/SystemZ/SystemZDisassembler.c',
1195 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1196 'capstone/arch/SystemZ/SystemZMapping.c',
1197 'capstone/arch/SystemZ/SystemZModule.c',
1198 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1199 )
1200 endif
1201
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001202 if 'CONFIG_I386_DIS' in config_all_disas
1203 capstone_data.set('CAPSTONE_HAS_X86', 1)
1204 capstone_files += files(
1205 'capstone/arch/X86/X86Disassembler.c',
1206 'capstone/arch/X86/X86DisassemblerDecoder.c',
1207 'capstone/arch/X86/X86ATTInstPrinter.c',
1208 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07001209 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001210 'capstone/arch/X86/X86Mapping.c',
1211 'capstone/arch/X86/X86Module.c'
1212 )
1213 endif
1214
1215 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1216
1217 capstone_cargs = [
1218 # FIXME: There does not seem to be a way to completely replace the c_args
1219 # that come from add_project_arguments() -- we can only add to them.
1220 # So: disable all warnings with a big hammer.
1221 '-Wno-error', '-w',
1222
1223 # Include all configuration defines via a header file, which will wind up
1224 # as a dependency on the object file, and thus changes here will result
1225 # in a rebuild.
1226 '-include', 'capstone-defs.h'
1227 ]
1228
1229 libcapstone = static_library('capstone',
1230 sources: capstone_files,
1231 c_args: capstone_cargs,
1232 include_directories: 'capstone/include')
1233 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07001234 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001235endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001236
1237slirp = not_found
1238slirp_opt = 'disabled'
1239if have_system
1240 slirp_opt = get_option('slirp')
1241 if slirp_opt in ['enabled', 'auto', 'system']
1242 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
1243 slirp = dependency('slirp', static: enable_static,
1244 method: 'pkg-config',
1245 required: slirp_opt == 'system' or
1246 slirp_opt == 'enabled' and not have_internal)
1247 if slirp.found()
1248 slirp_opt = 'system'
1249 elif have_internal
1250 slirp_opt = 'internal'
1251 else
1252 slirp_opt = 'disabled'
1253 endif
1254 endif
1255 if slirp_opt == 'internal'
1256 slirp_deps = []
1257 if targetos == 'windows'
1258 slirp_deps = cc.find_library('iphlpapi')
1259 endif
1260 slirp_conf = configuration_data()
1261 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1262 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1263 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1264 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1265 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1266 slirp_files = [
1267 'slirp/src/arp_table.c',
1268 'slirp/src/bootp.c',
1269 'slirp/src/cksum.c',
1270 'slirp/src/dhcpv6.c',
1271 'slirp/src/dnssearch.c',
1272 'slirp/src/if.c',
1273 'slirp/src/ip6_icmp.c',
1274 'slirp/src/ip6_input.c',
1275 'slirp/src/ip6_output.c',
1276 'slirp/src/ip_icmp.c',
1277 'slirp/src/ip_input.c',
1278 'slirp/src/ip_output.c',
1279 'slirp/src/mbuf.c',
1280 'slirp/src/misc.c',
1281 'slirp/src/ncsi.c',
1282 'slirp/src/ndp_table.c',
1283 'slirp/src/sbuf.c',
1284 'slirp/src/slirp.c',
1285 'slirp/src/socket.c',
1286 'slirp/src/state.c',
1287 'slirp/src/stream.c',
1288 'slirp/src/tcp_input.c',
1289 'slirp/src/tcp_output.c',
1290 'slirp/src/tcp_subr.c',
1291 'slirp/src/tcp_timer.c',
1292 'slirp/src/tftp.c',
1293 'slirp/src/udp.c',
1294 'slirp/src/udp6.c',
1295 'slirp/src/util.c',
1296 'slirp/src/version.c',
1297 'slirp/src/vmstate.c',
1298 ]
1299
1300 configure_file(
1301 input : 'slirp/src/libslirp-version.h.in',
1302 output : 'libslirp-version.h',
1303 configuration: slirp_conf)
1304
1305 slirp_inc = include_directories('slirp', 'slirp/src')
1306 libslirp = static_library('slirp',
1307 sources: slirp_files,
1308 c_args: slirp_cargs,
1309 include_directories: slirp_inc)
1310 slirp = declare_dependency(link_with: libslirp,
1311 dependencies: slirp_deps,
1312 include_directories: slirp_inc)
1313 endif
1314endif
1315
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001316fdt = not_found
1317fdt_opt = get_option('fdt')
1318if have_system
1319 if fdt_opt in ['enabled', 'auto', 'system']
1320 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
1321 fdt = cc.find_library('fdt', static: enable_static,
1322 required: fdt_opt == 'system' or
1323 fdt_opt == 'enabled' and not have_internal)
1324 if fdt.found() and cc.links('''
1325 #include <libfdt.h>
1326 #include <libfdt_env.h>
1327 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1328 dependencies: fdt)
1329 fdt_opt = 'system'
1330 elif have_internal
1331 fdt_opt = 'internal'
1332 else
1333 fdt_opt = 'disabled'
1334 endif
1335 endif
1336 if fdt_opt == 'internal'
1337 fdt_files = files(
1338 'dtc/libfdt/fdt.c',
1339 'dtc/libfdt/fdt_ro.c',
1340 'dtc/libfdt/fdt_wip.c',
1341 'dtc/libfdt/fdt_sw.c',
1342 'dtc/libfdt/fdt_rw.c',
1343 'dtc/libfdt/fdt_strerror.c',
1344 'dtc/libfdt/fdt_empty_tree.c',
1345 'dtc/libfdt/fdt_addresses.c',
1346 'dtc/libfdt/fdt_overlay.c',
1347 'dtc/libfdt/fdt_check.c',
1348 )
1349
1350 fdt_inc = include_directories('dtc/libfdt')
1351 libfdt = static_library('fdt',
1352 sources: fdt_files,
1353 include_directories: fdt_inc)
1354 fdt = declare_dependency(link_with: libfdt,
1355 include_directories: fdt_inc)
1356 endif
1357endif
1358if not fdt.found() and fdt_required.length() > 0
1359 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1360endif
1361
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001362config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001363config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001364config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001365
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001366#####################
1367# Generated sources #
1368#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001369
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001370genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001371
Marc-André Lureau3f885652019-07-15 18:06:04 +04001372hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04001373shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001374qapi_gen = find_program('scripts/qapi-gen.py')
1375qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1376 meson.source_root() / 'scripts/qapi/commands.py',
1377 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001378 meson.source_root() / 'scripts/qapi/error.py',
1379 meson.source_root() / 'scripts/qapi/events.py',
1380 meson.source_root() / 'scripts/qapi/expr.py',
1381 meson.source_root() / 'scripts/qapi/gen.py',
1382 meson.source_root() / 'scripts/qapi/introspect.py',
1383 meson.source_root() / 'scripts/qapi/parser.py',
1384 meson.source_root() / 'scripts/qapi/schema.py',
1385 meson.source_root() / 'scripts/qapi/source.py',
1386 meson.source_root() / 'scripts/qapi/types.py',
1387 meson.source_root() / 'scripts/qapi/visit.py',
1388 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001389 meson.source_root() / 'scripts/qapi-gen.py'
1390]
1391
1392tracetool = [
1393 python, files('scripts/tracetool.py'),
1394 '--backend=' + config_host['TRACE_BACKENDS']
1395]
1396
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001397qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1398 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02001399 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001400qemu_version = custom_target('qemu-version.h',
1401 output: 'qemu-version.h',
1402 command: qemu_version_cmd,
1403 capture: true,
1404 build_by_default: true,
1405 build_always_stale: true)
1406genh += qemu_version
1407
Marc-André Lureau3f885652019-07-15 18:06:04 +04001408hxdep = []
1409hx_headers = [
1410 ['qemu-options.hx', 'qemu-options.def'],
1411 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1412]
1413if have_system
1414 hx_headers += [
1415 ['hmp-commands.hx', 'hmp-commands.h'],
1416 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1417 ]
1418endif
1419foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001420 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04001421 input: files(d[0]),
1422 output: d[1],
1423 capture: true,
1424 build_by_default: true, # to be removed when added to a target
1425 command: [hxtool, '-h', '@INPUT0@'])
1426endforeach
1427genh += hxdep
1428
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001429###################
1430# Collect sources #
1431###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001432
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001433authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001434blockdev_ss = ss.source_set()
1435block_ss = ss.source_set()
1436bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001437chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001438common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001439crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001440io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001441linux_user_ss = ss.source_set()
1442qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001443qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001444softmmu_ss = ss.source_set()
1445specific_fuzz_ss = ss.source_set()
1446specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001447stub_ss = ss.source_set()
1448trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001449user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001450util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001451
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001452modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001453hw_arch = {}
1454target_arch = {}
1455target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001456
1457###############
1458# Trace files #
1459###############
1460
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001461# TODO: add each directory to the subdirs from its own meson.build, once
1462# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001463trace_events_subdirs = [
1464 'accel/kvm',
1465 'accel/tcg',
1466 'crypto',
1467 'monitor',
1468]
1469if have_user
1470 trace_events_subdirs += [ 'linux-user' ]
1471endif
1472if have_block
1473 trace_events_subdirs += [
1474 'authz',
1475 'block',
1476 'io',
1477 'nbd',
1478 'scsi',
1479 ]
1480endif
1481if have_system
1482 trace_events_subdirs += [
1483 'audio',
1484 'backends',
1485 'backends/tpm',
1486 'chardev',
1487 'hw/9pfs',
1488 'hw/acpi',
1489 'hw/alpha',
1490 'hw/arm',
1491 'hw/audio',
1492 'hw/block',
1493 'hw/block/dataplane',
1494 'hw/char',
1495 'hw/display',
1496 'hw/dma',
1497 'hw/hppa',
1498 'hw/hyperv',
1499 'hw/i2c',
1500 'hw/i386',
1501 'hw/i386/xen',
1502 'hw/ide',
1503 'hw/input',
1504 'hw/intc',
1505 'hw/isa',
1506 'hw/mem',
1507 'hw/mips',
1508 'hw/misc',
1509 'hw/misc/macio',
1510 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08001511 'hw/net/can',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001512 'hw/nvram',
1513 'hw/pci',
1514 'hw/pci-host',
1515 'hw/ppc',
1516 'hw/rdma',
1517 'hw/rdma/vmw',
1518 'hw/rtc',
1519 'hw/s390x',
1520 'hw/scsi',
1521 'hw/sd',
1522 'hw/sparc',
1523 'hw/sparc64',
1524 'hw/ssi',
1525 'hw/timer',
1526 'hw/tpm',
1527 'hw/usb',
1528 'hw/vfio',
1529 'hw/virtio',
1530 'hw/watchdog',
1531 'hw/xen',
1532 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001533 'migration',
1534 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02001535 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001536 'ui',
1537 ]
1538endif
1539trace_events_subdirs += [
1540 'hw/core',
1541 'qapi',
1542 'qom',
1543 'target/arm',
1544 'target/hppa',
1545 'target/i386',
Claudio Fontanaa9dc68d2020-12-12 16:55:08 +01001546 'target/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001547 'target/mips',
1548 'target/ppc',
1549 'target/riscv',
1550 'target/s390x',
1551 'target/sparc',
1552 'util',
1553]
1554
Marc-André Lureau0df750e2020-11-25 14:06:37 +04001555vhost_user = not_found
1556if 'CONFIG_VHOST_USER' in config_host
1557 libvhost_user = subproject('libvhost-user')
1558 vhost_user = libvhost_user.get_variable('vhost_user_dep')
1559endif
1560
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001561subdir('qapi')
1562subdir('qobject')
1563subdir('stubs')
1564subdir('trace')
1565subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04001566subdir('qom')
1567subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001568subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04001569subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001570
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001571
1572if enable_modules
1573 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1574 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1575endif
1576
Paolo Bonzini2becc362020-02-03 11:42:03 +01001577stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001578
1579util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01001580util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001581libqemuutil = static_library('qemuutil',
1582 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonziniaa087962020-09-01 11:15:30 -04001583 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001584qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04001585 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001586
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001587decodetree = generator(find_program('scripts/decodetree.py'),
1588 output: 'decode-@BASENAME@.c.inc',
1589 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1590
Paolo Bonzini478e9432020-08-17 12:47:55 +02001591subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04001592subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04001593subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001594subdir('fsdev')
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001595subdir('libdecnumber')
Marc-André Lureaud3b18482019-08-17 14:55:32 +04001596subdir('target')
Marc-André Lureau708eab42019-09-03 16:59:33 +04001597subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001598
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001599block_ss.add(files(
1600 'block.c',
1601 'blockjob.c',
1602 'job.c',
1603 'qemu-io-cmds.c',
1604))
1605block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
1606
1607subdir('nbd')
1608subdir('scsi')
1609subdir('block')
1610
Paolo Bonzini4a963372020-08-03 16:22:28 +02001611blockdev_ss.add(files(
1612 'blockdev.c',
Stefan Hajnoczicbc20bf2020-09-29 13:55:15 +01001613 'blockdev-nbd.c',
Paolo Bonzini4a963372020-08-03 16:22:28 +02001614 'iothread.c',
1615 'job-qmp.c',
1616))
1617
1618# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1619# os-win32.c does not
1620blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1621softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
Paolo Bonzini4a963372020-08-03 16:22:28 +02001622
1623common_ss.add(files('cpus-common.c'))
1624
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001625subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001626
Richard Hendersonf3433462020-09-12 10:47:33 -07001627common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02001628specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001629specific_ss.add(files('exec-vary.c'))
1630specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1631 'fpu/softfloat.c',
1632 'tcg/optimize.c',
1633 'tcg/tcg-common.c',
1634 'tcg/tcg-op-gvec.c',
1635 'tcg/tcg-op-vec.c',
1636 'tcg/tcg-op.c',
1637 'tcg/tcg.c',
1638))
1639specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1640
Marc-André Lureauab318052019-07-24 19:23:16 +04001641subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04001642subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04001643subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001644subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001645subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04001646subdir('replay')
Marc-André Lureau582ea952019-08-15 15:15:32 +04001647subdir('hw')
Marc-André Lureau1a828782019-08-18 16:13:08 +04001648subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001649subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04001650subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04001651subdir('linux-user')
1652
Marc-André Lureaub309c322019-08-18 19:20:37 +04001653bsd_user_ss.add(files('gdbstub.c'))
1654specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1655
Marc-André Lureau3a304462019-08-18 16:13:08 +04001656linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1657specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001658
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001659# needed for fuzzing binaries
1660subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001661subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001662
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001663########################
1664# Library dependencies #
1665########################
1666
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001667block_mods = []
1668softmmu_mods = []
1669foreach d, list : modules
1670 foreach m, module_ss : list
1671 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02001672 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001673 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1674 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1675 if d == 'block'
1676 block_mods += sl
1677 else
1678 softmmu_mods += sl
1679 endif
1680 else
1681 if d == 'block'
1682 block_ss.add_all(module_ss)
1683 else
1684 softmmu_ss.add_all(module_ss)
1685 endif
1686 endif
1687 endforeach
1688endforeach
1689
1690nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08001691undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001692block_syms = custom_target('block.syms', output: 'block.syms',
1693 input: [libqemuutil, block_mods],
1694 capture: true,
1695 command: [undefsym, nm, '@INPUT@'])
1696qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1697 input: [libqemuutil, softmmu_mods],
1698 capture: true,
1699 command: [undefsym, nm, '@INPUT@'])
1700
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001701qom_ss = qom_ss.apply(config_host, strict: false)
1702libqom = static_library('qom', qom_ss.sources() + genh,
1703 dependencies: [qom_ss.dependencies()],
1704 name_suffix: 'fa')
1705
1706qom = declare_dependency(link_whole: libqom)
1707
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001708authz_ss = authz_ss.apply(config_host, strict: false)
1709libauthz = static_library('authz', authz_ss.sources() + genh,
1710 dependencies: [authz_ss.dependencies()],
1711 name_suffix: 'fa',
1712 build_by_default: false)
1713
1714authz = declare_dependency(link_whole: libauthz,
1715 dependencies: qom)
1716
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001717crypto_ss = crypto_ss.apply(config_host, strict: false)
1718libcrypto = static_library('crypto', crypto_ss.sources() + genh,
1719 dependencies: [crypto_ss.dependencies()],
1720 name_suffix: 'fa',
1721 build_by_default: false)
1722
1723crypto = declare_dependency(link_whole: libcrypto,
1724 dependencies: [authz, qom])
1725
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001726io_ss = io_ss.apply(config_host, strict: false)
1727libio = static_library('io', io_ss.sources() + genh,
1728 dependencies: [io_ss.dependencies()],
1729 link_with: libqemuutil,
1730 name_suffix: 'fa',
1731 build_by_default: false)
1732
1733io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
1734
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02001735libmigration = static_library('migration', sources: migration_files + genh,
1736 name_suffix: 'fa',
1737 build_by_default: false)
1738migration = declare_dependency(link_with: libmigration,
1739 dependencies: [zlib, qom, io])
1740softmmu_ss.add(migration)
1741
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001742block_ss = block_ss.apply(config_host, strict: false)
1743libblock = static_library('block', block_ss.sources() + genh,
1744 dependencies: block_ss.dependencies(),
1745 link_depends: block_syms,
1746 name_suffix: 'fa',
1747 build_by_default: false)
1748
1749block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001750 link_args: '@block.syms',
1751 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001752
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01001753blockdev_ss = blockdev_ss.apply(config_host, strict: false)
1754libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
1755 dependencies: blockdev_ss.dependencies(),
1756 name_suffix: 'fa',
1757 build_by_default: false)
1758
1759blockdev = declare_dependency(link_whole: [libblockdev],
1760 dependencies: [block])
1761
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001762qmp_ss = qmp_ss.apply(config_host, strict: false)
1763libqmp = static_library('qmp', qmp_ss.sources() + genh,
1764 dependencies: qmp_ss.dependencies(),
1765 name_suffix: 'fa',
1766 build_by_default: false)
1767
1768qmp = declare_dependency(link_whole: [libqmp])
1769
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001770libchardev = static_library('chardev', chardev_ss.sources() + genh,
1771 name_suffix: 'fa',
1772 build_by_default: false)
1773
1774chardev = declare_dependency(link_whole: libchardev)
1775
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02001776libhwcore = static_library('hwcore', sources: hwcore_files + genh,
1777 name_suffix: 'fa',
1778 build_by_default: false)
1779hwcore = declare_dependency(link_whole: libhwcore)
1780common_ss.add(hwcore)
1781
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02001782###########
1783# Targets #
1784###########
1785
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001786foreach m : block_mods + softmmu_mods
1787 shared_module(m.name(),
1788 name_prefix: '',
1789 link_whole: m,
1790 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001791 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001792endforeach
1793
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01001794softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001795common_ss.add(qom, qemuutil)
1796
1797common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01001798common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
1799
1800common_all = common_ss.apply(config_all, strict: false)
1801common_all = static_library('common',
1802 build_by_default: false,
1803 sources: common_all.sources() + genh,
1804 dependencies: common_all.dependencies(),
1805 name_suffix: 'fa')
1806
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001807feature_to_c = find_program('scripts/feature_to_c.sh')
1808
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04001809emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001810foreach target : target_dirs
1811 config_target = config_target_mak[target]
1812 target_name = config_target['TARGET_NAME']
1813 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001814 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001815 arch_deps = []
1816 c_args = ['-DNEED_CPU_H',
1817 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
1818 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04001819 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01001820
Paolo Bonzini859aef02020-08-04 18:14:26 +02001821 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01001822 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
1823 if targetos == 'linux'
1824 target_inc += include_directories('linux-headers', is_system: true)
1825 endif
1826 if target.endswith('-softmmu')
1827 qemu_target_name = 'qemu-system-' + target_name
1828 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001829 t = target_softmmu_arch[arch].apply(config_target, strict: false)
1830 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001831 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001832
Marc-André Lureau2c442202019-08-17 13:55:58 +04001833 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
1834 hw = hw_arch[hw_dir].apply(config_target, strict: false)
1835 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001836 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04001837
Paolo Bonzini2becc362020-02-03 11:42:03 +01001838 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001839 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001840 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04001841 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001842 target_type='user'
1843 qemu_target_name = 'qemu-' + target_name
1844 if 'CONFIG_LINUX_USER' in config_target
1845 base_dir = 'linux-user'
1846 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1847 else
1848 base_dir = 'bsd-user'
1849 endif
1850 target_inc += include_directories(
1851 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04001852 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001853 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04001854 if 'CONFIG_LINUX_USER' in config_target
1855 dir = base_dir / abi
1856 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1857 if config_target.has_key('TARGET_SYSTBL_ABI')
1858 arch_srcs += \
1859 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1860 extra_args : config_target['TARGET_SYSTBL_ABI'])
1861 endif
1862 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01001863 endif
1864
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001865 if 'TARGET_XML_FILES' in config_target
1866 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1867 output: target + '-gdbstub-xml.c',
1868 input: files(config_target['TARGET_XML_FILES'].split()),
1869 command: [feature_to_c, '@INPUT@'],
1870 capture: true)
1871 arch_srcs += gdbstub_xml
1872 endif
1873
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001874 t = target_arch[arch].apply(config_target, strict: false)
1875 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001876 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001877
Paolo Bonzini2becc362020-02-03 11:42:03 +01001878 target_common = common_ss.apply(config_target, strict: false)
1879 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001880 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001881
Paolo Bonzini2becc362020-02-03 11:42:03 +01001882 target_specific = specific_ss.apply(config_target, strict: false)
1883 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001884 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001885
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001886 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02001887 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001888 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001889 objects: objects,
1890 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001891 c_args: c_args,
1892 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001893 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001894
1895 if target.endswith('-softmmu')
1896 execs = [{
1897 'name': 'qemu-system-' + target_name,
1898 'gui': false,
1899 'sources': files('softmmu/main.c'),
1900 'dependencies': []
1901 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001902 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001903 execs += [{
1904 'name': 'qemu-system-' + target_name + 'w',
1905 'gui': true,
1906 'sources': files('softmmu/main.c'),
1907 'dependencies': []
1908 }]
1909 endif
1910 if config_host.has_key('CONFIG_FUZZ')
1911 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1912 execs += [{
1913 'name': 'qemu-fuzz-' + target_name,
1914 'gui': false,
1915 'sources': specific_fuzz.sources(),
1916 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001917 }]
1918 endif
1919 else
1920 execs = [{
1921 'name': 'qemu-' + target_name,
1922 'gui': false,
1923 'sources': [],
1924 'dependencies': []
1925 }]
1926 endif
1927 foreach exe: execs
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04001928 emulators += {exe['name']:
1929 executable(exe['name'], exe['sources'],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001930 install: true,
1931 c_args: c_args,
1932 dependencies: arch_deps + deps + exe['dependencies'],
1933 objects: lib.extract_all_objects(recursive: true),
1934 link_language: link_language,
1935 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1936 link_args: link_args,
1937 gui_app: exe['gui'])
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04001938 }
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001939
1940 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1941 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001942 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1943 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001944 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1945 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1946 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001947 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001948 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001949 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001950 capture: true,
1951 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001952 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001953 command: [
1954 tracetool, '--group=all', '--format=' + stp['fmt'],
1955 '--binary=' + stp['bin'],
1956 '--target-name=' + target_name,
1957 '--target-type=' + target_type,
1958 '--probe-prefix=qemu.' + target_type + '.' + target_name,
1959 '@INPUT@',
1960 ])
1961 endforeach
1962 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001963 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001964endforeach
1965
Paolo Bonzini931049b2020-02-05 09:44:24 +01001966# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04001967
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001968if 'CONFIG_PLUGIN' in config_host
1969 install_headers('include/qemu/qemu-plugin.h')
1970endif
1971
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001972if 'CONFIG_GUEST_AGENT' in config_host
1973 subdir('qga')
1974endif
1975
Laurent Vivier9755c942020-08-24 17:24:30 +02001976# Don't build qemu-keymap if xkbcommon is not explicitly enabled
1977# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001978if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04001979 # used for the update-keymaps target, so include rules even if !have_tools
1980 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1981 dependencies: [qemuutil, xkbcommon], install: have_tools)
1982endif
1983
Paolo Bonzini931049b2020-02-05 09:44:24 +01001984if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001985 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1986 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1987 qemu_io = executable('qemu-io', files('qemu-io.c'),
1988 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01001989 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Stefan Hajnoczicbc20bf2020-09-29 13:55:15 +01001990 dependencies: [blockdev, qemuutil], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001991
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02001992 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02001993 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001994 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02001995
Marc-André Lureau157e7b12019-07-15 14:50:58 +04001996 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1997 dependencies: qemuutil,
1998 install: true)
1999
Paolo Bonzini931049b2020-02-05 09:44:24 +01002000 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02002001 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002002 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04002003 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02002004 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01002005 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002006
2007 if targetos == 'linux'
2008 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2009 dependencies: [qemuutil, libcap_ng],
2010 install: true,
2011 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002012
2013 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2014 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002015 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002016 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002017 endif
2018
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04002019 if 'CONFIG_IVSHMEM' in config_host
2020 subdir('contrib/ivshmem-client')
2021 subdir('contrib/ivshmem-server')
2022 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01002023endif
2024
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04002025subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002026subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04002027subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02002028subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08002029subdir('tests')
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04002030if 'CONFIG_GTK' in config_host
2031 subdir('po')
2032endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002033
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002034if host_machine.system() == 'windows'
2035 nsis_cmd = [
2036 find_program('scripts/nsis.py'),
2037 '@OUTPUT@',
2038 get_option('prefix'),
2039 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01002040 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002041 '--',
2042 '-DDISPLAYVERSION=' + meson.project_version(),
2043 ]
2044 if build_docs
2045 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2046 endif
2047 if 'CONFIG_GTK' in config_host
2048 nsis_cmd += '-DCONFIG_GTK=y'
2049 endif
2050
2051 nsis = custom_target('nsis',
2052 output: 'qemu-setup-' + meson.project_version() + '.exe',
2053 input: files('qemu.nsi'),
2054 build_always_stale: true,
2055 command: nsis_cmd + ['@INPUT@'])
2056 alias_target('installer', nsis)
2057endif
2058
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002059#########################
2060# Configuration summary #
2061#########################
2062
Paolo Bonzinif9332752020-02-03 13:28:38 +01002063summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002064summary_info += {'Install prefix': get_option('prefix')}
2065summary_info += {'BIOS directory': qemu_datadir}
2066summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2067summary_info += {'binary directory': get_option('bindir')}
2068summary_info += {'library directory': get_option('libdir')}
2069summary_info += {'module directory': qemu_moddir}
2070summary_info += {'libexec directory': get_option('libexecdir')}
2071summary_info += {'include directory': get_option('includedir')}
2072summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002073if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002074 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04002075 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002076else
2077 summary_info += {'local state directory': 'queried at runtime'}
2078endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04002079summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002080summary_info += {'Build directory': meson.current_build_dir()}
2081summary_info += {'Source path': meson.current_source_dir()}
2082summary_info += {'GIT binary': config_host['GIT']}
2083summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
2084summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
2085summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
2086if link_language == 'cpp'
2087 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
2088else
2089 summary_info += {'C++ compiler': false}
2090endif
2091if targetos == 'darwin'
2092 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
2093endif
2094summary_info += {'ARFLAGS': config_host['ARFLAGS']}
Paolo Bonzini47b30832020-09-23 05:26:17 -04002095summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2096 + ['-O' + get_option('optimization')]
2097 + (get_option('debug') ? ['-g'] : []))}
2098if link_language == 'cpp'
2099 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2100 + ['-O' + get_option('optimization')]
2101 + (get_option('debug') ? ['-g'] : []))}
2102endif
2103link_args = get_option(link_language + '_link_args')
2104if link_args.length() > 0
2105 summary_info += {'LDFLAGS': ' '.join(link_args)}
2106endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002107summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2108summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
2109summary_info += {'make': config_host['MAKE']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002110summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Yonggang Luoe3667662020-10-16 06:06:25 +08002111summary_info += {'sphinx-build': sphinx_build.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002112summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2113# TODO: add back version
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002114summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
2115if slirp_opt != 'disabled'
Paolo Bonzinif9332752020-02-03 13:28:38 +01002116 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2117endif
2118summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2119if config_host.has_key('CONFIG_MODULES')
2120 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2121endif
2122summary_info += {'host CPU': cpu}
2123summary_info += {'host endianness': build_machine.endian()}
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002124summary_info += {'target list': ' '.join(target_dirs)}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002125summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
Paolo Bonzinideb62372020-09-01 07:51:16 -04002126summary_info += {'sparse enabled': sparse.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002127summary_info += {'strip binaries': get_option('strip')}
2128summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05002129summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02002130summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002131if targetos == 'darwin'
2132 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
2133endif
2134# TODO: add back version
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002135summary_info += {'SDL support': sdl.found()}
2136summary_info += {'SDL image support': sdl_image.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002137# TODO: add back version
2138summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
2139summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002140summary_info += {'pixman': pixman.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002141# TODO: add back version
2142summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
2143summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
2144summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
2145# TODO: add back version
2146summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
2147if config_host.has_key('CONFIG_GCRYPT')
2148 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
2149 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2150endif
2151# TODO: add back version
2152summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
2153if config_host.has_key('CONFIG_NETTLE')
2154 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2155endif
2156summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
2157summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
Yonggang Luo5285e592020-10-13 07:43:48 +08002158summary_info += {'iconv support': iconv.found()}
2159summary_info += {'curses support': curses.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002160# TODO: add back version
2161summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
2162summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
2163summary_info += {'mingw32 support': targetos == 'windows'}
2164summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2165summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2166summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
2167summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
Misono Tomohirocece1162020-10-08 19:31:33 +09002168summary_info += {'build virtiofs daemon': have_virtiofsd}
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002169summary_info += {'Multipath support': mpathpersist.found()}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002170summary_info += {'VNC support': vnc.found()}
2171if vnc.found()
2172 summary_info += {'VNC SASL support': sasl.found()}
2173 summary_info += {'VNC JPEG support': jpeg.found()}
2174 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002175endif
2176summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2177if config_host.has_key('CONFIG_XEN_BACKEND')
2178 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2179endif
2180summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
Yonggang Luoe3667662020-10-16 06:06:25 +08002181summary_info += {'Documentation': build_docs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002182summary_info += {'PIE': get_option('b_pie')}
2183summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2184summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2185summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2186summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
2187summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
Paolo Bonzinic8d54502020-10-16 03:32:52 -04002188summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini05512f52020-09-16 15:31:11 -04002189summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2190summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2191summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2192summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
2193summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2194if config_all.has_key('CONFIG_TCG')
2195 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
2196 summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
2197endif
Paolo Bonziniaa087962020-09-01 11:15:30 -04002198summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002199summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2200summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002201summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002202summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
2203summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
2204summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2205summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2206summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2207summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
2208summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
Thomas Huthb54b82d2020-11-09 09:59:06 +01002209summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002210summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2211summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2212summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2213summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
Thomas Huthb54b82d2020-11-09 09:59:06 +01002214summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002215summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002216summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2217summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2218summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2219if config_host['TRACE_BACKENDS'].split().contains('simple')
2220 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2221endif
2222# TODO: add back protocol and server version
2223summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
2224summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
2225summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
2226summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02002227summary_info += {'U2F support': u2f.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002228summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
2229summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
2230summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
2231summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
2232summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
2233summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
2234summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2235if targetos == 'windows'
2236 if 'WIN_SDK' in config_host
2237 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2238 endif
2239 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2240 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Stefan Hajnoczi4bad7c32020-09-14 10:52:31 +01002241 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002242endif
2243summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
Daniele Buono9e62ba42020-12-04 18:06:14 -05002244summary_info += {'CFI support': get_option('cfi')}
2245summary_info += {'CFI debug support': get_option('cfi_debug')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002246summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2247summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2248summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2249summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2250summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
2251summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +04002252summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002253summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2254summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
2255summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2256summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
2257summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
2258summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
2259summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
2260summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
2261summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
2262summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2263summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
Paolo Bonziniaa087962020-09-01 11:15:30 -04002264summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002265summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2266summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2267summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2268summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2269summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2270summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2271summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2272summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2273summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2274summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2275summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2276summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002277summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002278summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2279summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002280summary_info += {'libudev': libudev.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002281summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
2282summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2283summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2284if config_host.has_key('HAVE_GDB_BIN')
2285 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2286endif
2287summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2288summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2289summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
Max Reitza484a712020-10-27 20:05:41 +01002290summary_info += {'FUSE exports': fuse.found()}
Max Reitzdf4ea702020-10-27 20:05:46 +01002291summary_info += {'FUSE lseek': fuse_lseek.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002292summary(summary_info, bool_yn: true)
2293
2294if not supported_cpus.contains(cpu)
2295 message()
2296 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2297 message()
2298 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2299 message('The QEMU project intends to remove support for this host CPU in')
2300 message('a future release if nobody volunteers to maintain it and to')
2301 message('provide a build host for our continuous integration setup.')
2302 message('configure has succeeded and you can continue to build, but')
2303 message('if you care about QEMU on this platform you should contact')
2304 message('us upstream at qemu-devel@nongnu.org.')
2305endif
2306
2307if not supported_oses.contains(targetos)
2308 message()
2309 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2310 message()
2311 message('Host OS ' + targetos + 'support is not currently maintained.')
2312 message('The QEMU project intends to remove support for this host OS in')
2313 message('a future release if nobody volunteers to maintain it and to')
2314 message('provide a build host for our continuous integration setup.')
2315 message('configure has succeeded and you can continue to build, but')
2316 message('if you care about QEMU on this platform you should contact')
2317 message('us upstream at qemu-devel@nongnu.org.')
2318endif