blob: 0e70fe7a8941512310b37208dbe95008632ba07d [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 Bonzinia0fbbb62020-11-17 12:36:15 +0100406 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400407 required: get_option('libudev'),
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200408 static: enable_static)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200409endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200410
Paolo Bonzini5c530152020-10-15 06:09:27 -0400411mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200412mpathpersist = not_found
413mpathpersist_new_api = false
414if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
415 mpath_test_source_new = '''
416 #include <libudev.h>
417 #include <mpath_persist.h>
418 unsigned mpath_mx_alloc_len = 1024;
419 int logsink;
420 static struct config *multipath_conf;
421 extern struct udev *udev;
422 extern struct config *get_multipath_config(void);
423 extern void put_multipath_config(struct config *conf);
424 struct udev *udev;
425 struct config *get_multipath_config(void) { return multipath_conf; }
426 void put_multipath_config(struct config *conf) { }
427 int main(void) {
428 udev = udev_new();
429 multipath_conf = mpath_lib_init();
430 return 0;
431 }'''
432 mpath_test_source_old = '''
433 #include <libudev.h>
434 #include <mpath_persist.h>
435 unsigned mpath_mx_alloc_len = 1024;
436 int logsink;
437 int main(void) {
438 struct udev *udev = udev_new();
439 mpath_lib_init(udev);
440 return 0;
441 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400442 libmpathpersist = cc.find_library('mpathpersist',
443 required: get_option('mpath'),
444 static: enable_static)
445 if libmpathpersist.found()
446 mpathlibs += libmpathpersist
447 if enable_static
448 mpathlibs += cc.find_library('devmapper',
449 required: get_option('mpath'),
450 static: enable_static)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200451 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400452 mpathlibs += cc.find_library('multipath',
453 required: get_option('mpath'),
454 static: enable_static)
455 foreach lib: mpathlibs
456 if not lib.found()
457 mpathlibs = []
458 break
459 endif
460 endforeach
461 if mpathlibs.length() == 0
462 msg = 'Dependencies missing for libmpathpersist'
463 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200464 mpathpersist = declare_dependency(dependencies: mpathlibs)
465 mpathpersist_new_api = true
466 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
467 mpathpersist = declare_dependency(dependencies: mpathlibs)
468 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400469 msg = 'Cannot detect libmpathpersist API'
470 endif
471 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200472 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400473 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200474 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400475 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200476 endif
477 endif
478 endif
479endif
480
Yonggang Luo5285e592020-10-13 07:43:48 +0800481iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800482curses = not_found
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400483if have_system and not get_option('curses').disabled()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400484 curses_test = '''
485 #include <locale.h>
486 #include <curses.h>
487 #include <wchar.h>
488 int main(void) {
489 wchar_t wch = L'w';
490 setlocale(LC_ALL, "");
491 resize_term(0, 0);
492 addwstr(L"wide chars\n");
493 addnwstr(&wch, 1);
494 add_wch(WACS_DEGREE);
495 return 0;
496 }'''
497
Yonggang Luoca31e302020-11-17 05:31:06 +0800498 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
499 foreach curses_dep : curses_dep_list
500 if not curses.found()
501 curses = dependency(curses_dep,
502 required: false,
503 method: 'pkg-config',
504 static: enable_static)
505 endif
506 endforeach
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400507 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500508 curses_compile_args = ['-DNCURSES_WIDECHAR']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400509 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500510 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
511 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400512 else
513 msg = 'curses package not usable'
514 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800515 endif
516 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400517 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400518 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
519 if targetos != 'windows' and not has_curses_h
520 message('Trying with /usr/include/ncursesw')
521 curses_compile_args += ['-I/usr/include/ncursesw']
522 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
523 endif
524 if has_curses_h
525 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
526 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800527 libcurses = cc.find_library(curses_libname,
528 required: false,
Yonggang Luo5285e592020-10-13 07:43:48 +0800529 static: enable_static)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400530 if libcurses.found()
531 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
532 curses = declare_dependency(compile_args: curses_compile_args,
533 dependencies: [libcurses])
534 break
535 else
536 msg = 'curses library not usable'
537 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800538 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400539 endforeach
540 endif
541 endif
542 if not get_option('iconv').disabled()
543 foreach link_args : [ ['-liconv'], [] ]
544 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
545 # We need to use libiconv if available because mixing libiconv's headers with
546 # the system libc does not work.
547 # However, without adding glib to the dependencies -L/usr/local/lib will not be
548 # included in the command line and libiconv will not be found.
549 if cc.links('''
550 #include <iconv.h>
551 int main(void) {
552 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
553 return conv != (iconv_t) -1;
554 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
555 iconv = declare_dependency(link_args: link_args, dependencies: glib)
556 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800557 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400558 endforeach
559 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400560 if curses.found() and not iconv.found()
561 if get_option('iconv').enabled()
562 error('iconv not available')
563 endif
564 msg = 'iconv required for curses UI but not available'
565 curses = not_found
566 endif
567 if not curses.found() and msg != ''
568 if get_option('curses').enabled()
569 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400570 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400571 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400572 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800573 endif
574endif
575
Paolo Bonzini26347332019-07-29 15:40:07 +0200576brlapi = not_found
577if 'CONFIG_BRLAPI' in config_host
578 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
579endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100580
Paolo Bonzini760e4322020-08-26 08:09:48 +0200581sdl = not_found
582if have_system
Yonggang Luo363743d2020-08-26 23:10:03 +0800583 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200584 sdl_image = not_found
585endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100586if sdl.found()
587 # work around 2.0.8 bug
588 sdl = declare_dependency(compile_args: '-Wno-undef',
589 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200590 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400591 method: 'pkg-config', static: enable_static)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100592else
593 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100594 error('sdl-image required, but SDL was @0@'.format(
595 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100596 endif
597 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200598endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100599
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400600rbd = not_found
601if 'CONFIG_RBD' in config_host
602 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
603endif
604glusterfs = not_found
605if 'CONFIG_GLUSTERFS' in config_host
606 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
607 link_args: config_host['GLUSTERFS_LIBS'].split())
608endif
609libssh = not_found
610if 'CONFIG_LIBSSH' in config_host
611 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
612 link_args: config_host['LIBSSH_LIBS'].split())
613endif
614libbzip2 = not_found
615if 'CONFIG_BZIP2' in config_host
616 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
617endif
618liblzfse = not_found
619if 'CONFIG_LZFSE' in config_host
620 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
621endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200622oss = not_found
623if 'CONFIG_AUDIO_OSS' in config_host
624 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
625endif
626dsound = not_found
627if 'CONFIG_AUDIO_DSOUND' in config_host
628 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
629endif
630coreaudio = not_found
631if 'CONFIG_AUDIO_COREAUDIO' in config_host
632 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
633endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400634opengl = not_found
635if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400636 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
637 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400638endif
639gtk = not_found
640if 'CONFIG_GTK' in config_host
641 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
642 link_args: config_host['GTK_LIBS'].split())
643endif
644vte = not_found
645if 'CONFIG_VTE' in config_host
646 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
647 link_args: config_host['VTE_LIBS'].split())
648endif
649x11 = not_found
650if 'CONFIG_X11' in config_host
651 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
652 link_args: config_host['X11_LIBS'].split())
653endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100654vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400655png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400656jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400657sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100658if get_option('vnc').enabled()
659 vnc = declare_dependency() # dummy dependency
660 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400661 method: 'pkg-config', static: enable_static)
Paolo Bonzini8e242b32020-11-23 13:34:02 -0500662 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
663 method: 'pkg-config', static: enable_static)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100664 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
665 required: get_option('vnc_sasl'),
666 static: enable_static)
667 if sasl.found()
668 sasl = declare_dependency(dependencies: sasl,
669 compile_args: '-DSTRUCT_IOVEC_DEFINED')
670 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400671endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400672snappy = not_found
673if 'CONFIG_SNAPPY' in config_host
674 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
675endif
676lzo = not_found
677if 'CONFIG_LZO' in config_host
678 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
679endif
Marc-André Lureau55166232019-07-24 19:16:22 +0400680rdma = not_found
681if 'CONFIG_RDMA' in config_host
682 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
683endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400684numa = not_found
685if 'CONFIG_NUMA' in config_host
686 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
687endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400688xen = not_found
689if 'CONFIG_XEN_BACKEND' in config_host
690 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
691 link_args: config_host['XEN_LIBS'].split())
692endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200693cacard = not_found
694if 'CONFIG_SMARTCARD' in config_host
695 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
696 link_args: config_host['SMARTCARD_LIBS'].split())
697endif
César Belley0a40bcb2020-08-26 13:42:04 +0200698u2f = not_found
699if have_system
700 u2f = dependency('u2f-emu', required: get_option('u2f'),
701 method: 'pkg-config',
702 static: enable_static)
703endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200704usbredir = not_found
705if 'CONFIG_USB_REDIR' in config_host
706 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
707 link_args: config_host['USB_REDIR_LIBS'].split())
708endif
709libusb = not_found
710if 'CONFIG_USB_LIBUSB' in config_host
711 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
712 link_args: config_host['LIBUSB_LIBS'].split())
713endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400714libpmem = not_found
715if 'CONFIG_LIBPMEM' in config_host
716 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
717 link_args: config_host['LIBPMEM_LIBS'].split())
718endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600719libdaxctl = not_found
720if 'CONFIG_LIBDAXCTL' in config_host
721 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
722endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +0400723tasn1 = not_found
724if 'CONFIG_TASN1' in config_host
725 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
726 link_args: config_host['TASN1_LIBS'].split())
727endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400728keyutils = dependency('libkeyutils', required: false,
729 method: 'pkg-config', static: enable_static)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400730
Marc-André Lureau3909def2020-08-28 15:07:33 +0400731has_gettid = cc.has_function('gettid')
732
Paolo Bonziniaa087962020-09-01 11:15:30 -0400733# Malloc tests
734
735malloc = []
736if get_option('malloc') == 'system'
737 has_malloc_trim = \
738 not get_option('malloc_trim').disabled() and \
739 cc.links('''#include <malloc.h>
740 int main(void) { malloc_trim(0); return 0; }''')
741else
742 has_malloc_trim = false
743 malloc = cc.find_library(get_option('malloc'), required: true)
744endif
745if not has_malloc_trim and get_option('malloc_trim').enabled()
746 if get_option('malloc') == 'system'
747 error('malloc_trim not available on this platform.')
748 else
749 error('malloc_trim not available with non-libc memory allocator')
750 endif
751endif
752
Max Reitz84e319a2020-11-02 17:18:55 +0100753# Check whether the glibc provides statx()
754
755statx_test = '''
756 #ifndef _GNU_SOURCE
757 #define _GNU_SOURCE
758 #endif
759 #include <sys/stat.h>
760 int main(void) {
761 struct statx statxbuf;
762 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
763 return 0;
764 }'''
765
766has_statx = cc.links(statx_test)
767
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000768have_vhost_user_blk_server = (targetos == 'linux' and
769 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000770
771if get_option('vhost_user_blk_server').enabled()
772 if targetos != 'linux'
773 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000774 elif 'CONFIG_VHOST_USER' not in config_host
775 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000776 endif
777elif get_option('vhost_user_blk_server').disabled() or not have_system
778 have_vhost_user_blk_server = false
779endif
780
Daniele Buono9e62ba42020-12-04 18:06:14 -0500781
Max Reitzdf4ea702020-10-27 20:05:46 +0100782if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
783 error('Cannot enable fuse-lseek while fuse is disabled')
784endif
785
Max Reitza484a712020-10-27 20:05:41 +0100786fuse = dependency('fuse3', required: get_option('fuse'),
787 version: '>=3.1', method: 'pkg-config',
788 static: enable_static)
789
Max Reitzdf4ea702020-10-27 20:05:46 +0100790fuse_lseek = not_found
791if not get_option('fuse_lseek').disabled()
792 if fuse.version().version_compare('>=3.8')
793 # Dummy dependency
794 fuse_lseek = declare_dependency()
795 elif get_option('fuse_lseek').enabled()
796 if fuse.found()
797 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
798 else
799 error('fuse-lseek requires libfuse, which was not found')
800 endif
801 endif
802endif
803
Daniele Buono9e62ba42020-12-04 18:06:14 -0500804if get_option('cfi')
805 cfi_flags=[]
806 # Check for dependency on LTO
807 if not get_option('b_lto')
808 error('Selected Control-Flow Integrity but LTO is disabled')
809 endif
810 if config_host.has_key('CONFIG_MODULES')
811 error('Selected Control-Flow Integrity is not compatible with modules')
812 endif
813 # Check for cfi flags. CFI requires LTO so we can't use
814 # get_supported_arguments, but need a more complex "compiles" which allows
815 # custom arguments
816 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
817 args: ['-flto', '-fsanitize=cfi-icall'] )
818 cfi_flags += '-fsanitize=cfi-icall'
819 else
820 error('-fsanitize=cfi-icall is not supported by the compiler')
821 endif
822 if cc.compiles('int main () { return 0; }',
823 name: '-fsanitize-cfi-icall-generalize-pointers',
824 args: ['-flto', '-fsanitize=cfi-icall',
825 '-fsanitize-cfi-icall-generalize-pointers'] )
826 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
827 else
828 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
829 endif
830 if get_option('cfi_debug')
831 if cc.compiles('int main () { return 0; }',
832 name: '-fno-sanitize-trap=cfi-icall',
833 args: ['-flto', '-fsanitize=cfi-icall',
834 '-fno-sanitize-trap=cfi-icall'] )
835 cfi_flags += '-fno-sanitize-trap=cfi-icall'
836 else
837 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
838 endif
839 endif
840 add_project_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
841 add_project_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
842endif
843
Paolo Bonzinia0c91622020-10-07 11:01:51 -0400844#################
845# config-host.h #
846#################
Paolo Bonzini859aef02020-08-04 18:14:26 +0200847
Paolo Bonzini16bf7a32020-10-16 03:19:14 -0400848config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
849config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
850config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
851config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
852config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
853config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
854config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
855config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
856config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
857config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
858config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
859config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
860
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400861config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200862config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200863config_host_data.set('CONFIG_MPATH', mpathpersist.found())
864config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Yonggang Luo5285e592020-10-13 07:43:48 +0800865config_host_data.set('CONFIG_CURSES', curses.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100866config_host_data.set('CONFIG_SDL', sdl.found())
867config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000868config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100869config_host_data.set('CONFIG_VNC', vnc.found())
870config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
871config_host_data.set('CONFIG_VNC_PNG', png.found())
872config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +0200873config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400874config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +0400875config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonziniaa087962020-09-01 11:15:30 -0400876config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +0100877config_host_data.set('CONFIG_STATX', has_statx)
Max Reitza484a712020-10-27 20:05:41 +0100878config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +0100879config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Daniele Buono9e62ba42020-12-04 18:06:14 -0500880config_host_data.set('CONFIG_CFI', get_option('cfi'))
Paolo Bonzini859aef02020-08-04 18:14:26 +0200881config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
882config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
883config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
884config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
885
Thomas Huth48f670e2020-11-18 18:10:52 +0100886config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +0100887config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +0100888config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Thomas Huthded5d782020-11-14 11:10:11 +0100889config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +0100890config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Thomas Huth88c78f12020-11-18 18:10:50 +0100891config_host_data.set('HAVE_SYS_SIGNAL_H', cc.has_header('sys/signal.h'))
Thomas Huthded5d782020-11-14 11:10:11 +0100892
Paolo Bonzini765686d2020-09-18 06:37:21 -0400893ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
Paolo Bonzini859aef02020-08-04 18:14:26 +0200894arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzini16bf7a32020-10-16 03:19:14 -0400895strings = ['HOST_DSOSUF', 'CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +0200896foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -0400897 if ignored.contains(k)
898 # do nothing
899 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +0200900 if v != ''
901 v = '"' + '", "'.join(v.split()) + '", '
902 endif
903 config_host_data.set(k, v)
904 elif k == 'ARCH'
905 config_host_data.set('HOST_' + v.to_upper(), 1)
906 elif strings.contains(k)
907 if not k.startswith('CONFIG_')
908 k = 'CONFIG_' + k.to_upper()
909 endif
910 config_host_data.set_quoted(k, v)
911 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
912 config_host_data.set(k, v == 'y' ? 1 : v)
913 endif
914endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +0200915
Paolo Bonzinia0c91622020-10-07 11:01:51 -0400916########################
917# Target configuration #
918########################
919
Paolo Bonzini2becc362020-02-03 11:42:03 +0100920minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -0400921config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -0400922config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400923config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100924config_devices_mak_list = []
925config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +0200926config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100927config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400928
929disassemblers = {
930 'alpha' : ['CONFIG_ALPHA_DIS'],
931 'arm' : ['CONFIG_ARM_DIS'],
932 'avr' : ['CONFIG_AVR_DIS'],
933 'cris' : ['CONFIG_CRIS_DIS'],
934 'hppa' : ['CONFIG_HPPA_DIS'],
935 'i386' : ['CONFIG_I386_DIS'],
936 'x86_64' : ['CONFIG_I386_DIS'],
937 'x32' : ['CONFIG_I386_DIS'],
938 'lm32' : ['CONFIG_LM32_DIS'],
939 'm68k' : ['CONFIG_M68K_DIS'],
940 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
941 'mips' : ['CONFIG_MIPS_DIS'],
942 'moxie' : ['CONFIG_MOXIE_DIS'],
943 'nios2' : ['CONFIG_NIOS2_DIS'],
944 'or1k' : ['CONFIG_OPENRISC_DIS'],
945 'ppc' : ['CONFIG_PPC_DIS'],
946 'riscv' : ['CONFIG_RISCV_DIS'],
947 'rx' : ['CONFIG_RX_DIS'],
948 's390' : ['CONFIG_S390_DIS'],
949 'sh4' : ['CONFIG_SH4_DIS'],
950 'sparc' : ['CONFIG_SPARC_DIS'],
951 'xtensa' : ['CONFIG_XTENSA_DIS'],
952}
953if link_language == 'cpp'
954 disassemblers += {
955 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
956 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
957 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
958 }
959endif
960
Paolo Bonzini2becc362020-02-03 11:42:03 +0100961kconfig_external_symbols = [
962 'CONFIG_KVM',
963 'CONFIG_XEN',
964 'CONFIG_TPM',
965 'CONFIG_SPICE',
966 'CONFIG_IVSHMEM',
967 'CONFIG_OPENGL',
968 'CONFIG_X11',
969 'CONFIG_VHOST_USER',
Laurent Vivier40bc0ca2020-09-24 23:00:23 +0200970 'CONFIG_VHOST_VDPA',
Paolo Bonzini2becc362020-02-03 11:42:03 +0100971 'CONFIG_VHOST_KERNEL',
972 'CONFIG_VIRTFS',
973 'CONFIG_LINUX',
974 'CONFIG_PVRDMA',
975]
Paolo Bonzinia9a74902020-09-21 05:11:01 -0400976ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400977
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -0400978default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
979actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +0200980fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400981foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -0400982 config_target = { 'TARGET_NAME': target.split('-')[0] }
983 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -0400984 if targetos != 'linux'
985 if default_targets
986 continue
987 endif
988 error('Target @0@ is only available on a Linux host'.format(target))
989 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -0400990 config_target += { 'CONFIG_LINUX_USER': 'y' }
991 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -0400992 if 'CONFIG_BSD' not in config_host
993 if default_targets
994 continue
995 endif
996 error('Target @0@ is only available on a BSD host'.format(target))
997 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -0400998 config_target += { 'CONFIG_BSD_USER': 'y' }
999 elif target.endswith('softmmu')
1000 config_target += { 'CONFIG_SOFTMMU': 'y' }
1001 endif
1002 if target.endswith('-user')
1003 config_target += {
1004 'CONFIG_USER_ONLY': 'y',
1005 'CONFIG_QEMU_INTERP_PREFIX':
1006 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1007 }
1008 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001009
Paolo Bonzini8a199802020-09-18 05:37:01 -04001010 have_accel = false
1011 foreach sym: accelerators
1012 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1013 config_target += { sym: 'y' }
1014 config_all += { sym: 'y' }
1015 if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
1016 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1017 endif
1018 have_accel = true
1019 endif
1020 endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001021 if not have_accel
1022 if default_targets
1023 continue
1024 endif
1025 error('No accelerator available for target @0@'.format(target))
1026 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001027
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001028 actual_target_dirs += target
Paolo Bonzini765686d2020-09-18 06:37:21 -04001029 config_target += keyval.load('default-configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001030 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001031
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001032 if 'TARGET_NEED_FDT' in config_target
1033 fdt_required += target
1034 endif
1035
Paolo Bonzinifa731682020-09-21 05:19:07 -04001036 # Add default keys
1037 if 'TARGET_BASE_ARCH' not in config_target
1038 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1039 endif
1040 if 'TARGET_ABI_DIR' not in config_target
1041 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1042 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001043
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001044 foreach k, v: disassemblers
1045 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1046 foreach sym: v
1047 config_target += { sym: 'y' }
1048 config_all_disas += { sym: 'y' }
1049 endforeach
1050 endif
1051 endforeach
1052
Paolo Bonzini859aef02020-08-04 18:14:26 +02001053 config_target_data = configuration_data()
1054 foreach k, v: config_target
1055 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1056 # do nothing
1057 elif ignored.contains(k)
1058 # do nothing
1059 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001060 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1061 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001062 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001063 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001064 config_target_data.set_quoted(k, v)
1065 elif v == 'y'
1066 config_target_data.set(k, 1)
1067 else
1068 config_target_data.set(k, v)
1069 endif
1070 endforeach
1071 config_target_h += {target: configure_file(output: target + '-config-target.h',
1072 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001073
1074 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001075 base_kconfig = []
1076 foreach sym : kconfig_external_symbols
Paolo Bonzini859aef02020-08-04 18:14:26 +02001077 if sym in config_target or sym in config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01001078 base_kconfig += '@0@=y'.format(sym)
1079 endif
1080 endforeach
1081
1082 config_devices_mak = target + '-config-devices.mak'
1083 config_devices_mak = configure_file(
Paolo Bonzini1bb4cb12020-09-18 06:06:09 -04001084 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001085 output: config_devices_mak,
1086 depfile: config_devices_mak + '.d',
1087 capture: true,
1088 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
1089 config_devices_mak, '@DEPFILE@', '@INPUT@',
1090 base_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02001091
1092 config_devices_data = configuration_data()
1093 config_devices = keyval.load(config_devices_mak)
1094 foreach k, v: config_devices
1095 config_devices_data.set(k, 1)
1096 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001097 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001098 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1099 configuration: config_devices_data)}
1100 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001101 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001102 endif
1103 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001104endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001105target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001106
Paolo Bonzini2becc362020-02-03 11:42:03 +01001107# This configuration is used to build files that are shared by
1108# multiple binaries, and then extracted out of the "common"
1109# static_library target.
1110#
1111# We do not use all_sources()/all_dependencies(), because it would
1112# build literally all source files, including devices only used by
1113# targets that are not built for this compilation. The CONFIG_ALL
1114# pseudo symbol replaces it.
1115
Paolo Bonzini05512f52020-09-16 15:31:11 -04001116config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001117config_all += config_host
1118config_all += config_all_disas
1119config_all += {
1120 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1121 'CONFIG_SOFTMMU': have_system,
1122 'CONFIG_USER_ONLY': have_user,
1123 'CONFIG_ALL': true,
1124}
1125
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001126##############
1127# Submodules #
1128##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001129
1130capstone = not_found
1131capstone_opt = get_option('capstone')
1132if capstone_opt in ['enabled', 'auto', 'system']
1133 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07001134 capstone = dependency('capstone', version: '>=4.0',
1135 static: enable_static, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001136 required: capstone_opt == 'system' or
1137 capstone_opt == 'enabled' and not have_internal)
1138 if capstone.found()
1139 capstone_opt = 'system'
1140 elif have_internal
1141 capstone_opt = 'internal'
1142 else
1143 capstone_opt = 'disabled'
1144 endif
1145endif
1146if capstone_opt == 'internal'
1147 capstone_data = configuration_data()
1148 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1149
1150 capstone_files = files(
1151 'capstone/cs.c',
1152 'capstone/MCInst.c',
1153 'capstone/MCInstrDesc.c',
1154 'capstone/MCRegisterInfo.c',
1155 'capstone/SStream.c',
1156 'capstone/utils.c'
1157 )
1158
1159 if 'CONFIG_ARM_DIS' in config_all_disas
1160 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1161 capstone_files += files(
1162 'capstone/arch/ARM/ARMDisassembler.c',
1163 'capstone/arch/ARM/ARMInstPrinter.c',
1164 'capstone/arch/ARM/ARMMapping.c',
1165 'capstone/arch/ARM/ARMModule.c'
1166 )
1167 endif
1168
1169 # FIXME: This config entry currently depends on a c++ compiler.
1170 # Which is needed for building libvixl, but not for capstone.
1171 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1172 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1173 capstone_files += files(
1174 'capstone/arch/AArch64/AArch64BaseInfo.c',
1175 'capstone/arch/AArch64/AArch64Disassembler.c',
1176 'capstone/arch/AArch64/AArch64InstPrinter.c',
1177 'capstone/arch/AArch64/AArch64Mapping.c',
1178 'capstone/arch/AArch64/AArch64Module.c'
1179 )
1180 endif
1181
1182 if 'CONFIG_PPC_DIS' in config_all_disas
1183 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1184 capstone_files += files(
1185 'capstone/arch/PowerPC/PPCDisassembler.c',
1186 'capstone/arch/PowerPC/PPCInstPrinter.c',
1187 'capstone/arch/PowerPC/PPCMapping.c',
1188 'capstone/arch/PowerPC/PPCModule.c'
1189 )
1190 endif
1191
Richard Henderson3d562842020-01-04 07:24:59 +10001192 if 'CONFIG_S390_DIS' in config_all_disas
1193 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1194 capstone_files += files(
1195 'capstone/arch/SystemZ/SystemZDisassembler.c',
1196 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1197 'capstone/arch/SystemZ/SystemZMapping.c',
1198 'capstone/arch/SystemZ/SystemZModule.c',
1199 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1200 )
1201 endif
1202
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001203 if 'CONFIG_I386_DIS' in config_all_disas
1204 capstone_data.set('CAPSTONE_HAS_X86', 1)
1205 capstone_files += files(
1206 'capstone/arch/X86/X86Disassembler.c',
1207 'capstone/arch/X86/X86DisassemblerDecoder.c',
1208 'capstone/arch/X86/X86ATTInstPrinter.c',
1209 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07001210 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001211 'capstone/arch/X86/X86Mapping.c',
1212 'capstone/arch/X86/X86Module.c'
1213 )
1214 endif
1215
1216 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1217
1218 capstone_cargs = [
1219 # FIXME: There does not seem to be a way to completely replace the c_args
1220 # that come from add_project_arguments() -- we can only add to them.
1221 # So: disable all warnings with a big hammer.
1222 '-Wno-error', '-w',
1223
1224 # Include all configuration defines via a header file, which will wind up
1225 # as a dependency on the object file, and thus changes here will result
1226 # in a rebuild.
1227 '-include', 'capstone-defs.h'
1228 ]
1229
1230 libcapstone = static_library('capstone',
1231 sources: capstone_files,
1232 c_args: capstone_cargs,
1233 include_directories: 'capstone/include')
1234 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07001235 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001236endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001237
1238slirp = not_found
1239slirp_opt = 'disabled'
1240if have_system
1241 slirp_opt = get_option('slirp')
1242 if slirp_opt in ['enabled', 'auto', 'system']
1243 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
1244 slirp = dependency('slirp', static: enable_static,
1245 method: 'pkg-config',
1246 required: slirp_opt == 'system' or
1247 slirp_opt == 'enabled' and not have_internal)
1248 if slirp.found()
1249 slirp_opt = 'system'
1250 elif have_internal
1251 slirp_opt = 'internal'
1252 else
1253 slirp_opt = 'disabled'
1254 endif
1255 endif
1256 if slirp_opt == 'internal'
1257 slirp_deps = []
1258 if targetos == 'windows'
1259 slirp_deps = cc.find_library('iphlpapi')
1260 endif
1261 slirp_conf = configuration_data()
1262 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1263 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1264 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1265 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1266 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1267 slirp_files = [
1268 'slirp/src/arp_table.c',
1269 'slirp/src/bootp.c',
1270 'slirp/src/cksum.c',
1271 'slirp/src/dhcpv6.c',
1272 'slirp/src/dnssearch.c',
1273 'slirp/src/if.c',
1274 'slirp/src/ip6_icmp.c',
1275 'slirp/src/ip6_input.c',
1276 'slirp/src/ip6_output.c',
1277 'slirp/src/ip_icmp.c',
1278 'slirp/src/ip_input.c',
1279 'slirp/src/ip_output.c',
1280 'slirp/src/mbuf.c',
1281 'slirp/src/misc.c',
1282 'slirp/src/ncsi.c',
1283 'slirp/src/ndp_table.c',
1284 'slirp/src/sbuf.c',
1285 'slirp/src/slirp.c',
1286 'slirp/src/socket.c',
1287 'slirp/src/state.c',
1288 'slirp/src/stream.c',
1289 'slirp/src/tcp_input.c',
1290 'slirp/src/tcp_output.c',
1291 'slirp/src/tcp_subr.c',
1292 'slirp/src/tcp_timer.c',
1293 'slirp/src/tftp.c',
1294 'slirp/src/udp.c',
1295 'slirp/src/udp6.c',
1296 'slirp/src/util.c',
1297 'slirp/src/version.c',
1298 'slirp/src/vmstate.c',
1299 ]
1300
1301 configure_file(
1302 input : 'slirp/src/libslirp-version.h.in',
1303 output : 'libslirp-version.h',
1304 configuration: slirp_conf)
1305
1306 slirp_inc = include_directories('slirp', 'slirp/src')
1307 libslirp = static_library('slirp',
1308 sources: slirp_files,
1309 c_args: slirp_cargs,
1310 include_directories: slirp_inc)
1311 slirp = declare_dependency(link_with: libslirp,
1312 dependencies: slirp_deps,
1313 include_directories: slirp_inc)
1314 endif
1315endif
1316
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001317fdt = not_found
1318fdt_opt = get_option('fdt')
1319if have_system
1320 if fdt_opt in ['enabled', 'auto', 'system']
1321 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
1322 fdt = cc.find_library('fdt', static: enable_static,
1323 required: fdt_opt == 'system' or
1324 fdt_opt == 'enabled' and not have_internal)
1325 if fdt.found() and cc.links('''
1326 #include <libfdt.h>
1327 #include <libfdt_env.h>
1328 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1329 dependencies: fdt)
1330 fdt_opt = 'system'
1331 elif have_internal
1332 fdt_opt = 'internal'
1333 else
1334 fdt_opt = 'disabled'
1335 endif
1336 endif
1337 if fdt_opt == 'internal'
1338 fdt_files = files(
1339 'dtc/libfdt/fdt.c',
1340 'dtc/libfdt/fdt_ro.c',
1341 'dtc/libfdt/fdt_wip.c',
1342 'dtc/libfdt/fdt_sw.c',
1343 'dtc/libfdt/fdt_rw.c',
1344 'dtc/libfdt/fdt_strerror.c',
1345 'dtc/libfdt/fdt_empty_tree.c',
1346 'dtc/libfdt/fdt_addresses.c',
1347 'dtc/libfdt/fdt_overlay.c',
1348 'dtc/libfdt/fdt_check.c',
1349 )
1350
1351 fdt_inc = include_directories('dtc/libfdt')
1352 libfdt = static_library('fdt',
1353 sources: fdt_files,
1354 include_directories: fdt_inc)
1355 fdt = declare_dependency(link_with: libfdt,
1356 include_directories: fdt_inc)
1357 endif
1358endif
1359if not fdt.found() and fdt_required.length() > 0
1360 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1361endif
1362
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001363config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001364config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001365config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001366
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001367#####################
1368# Generated sources #
1369#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001370
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001371genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001372
Marc-André Lureau3f885652019-07-15 18:06:04 +04001373hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04001374shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001375qapi_gen = find_program('scripts/qapi-gen.py')
1376qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1377 meson.source_root() / 'scripts/qapi/commands.py',
1378 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001379 meson.source_root() / 'scripts/qapi/error.py',
1380 meson.source_root() / 'scripts/qapi/events.py',
1381 meson.source_root() / 'scripts/qapi/expr.py',
1382 meson.source_root() / 'scripts/qapi/gen.py',
1383 meson.source_root() / 'scripts/qapi/introspect.py',
1384 meson.source_root() / 'scripts/qapi/parser.py',
1385 meson.source_root() / 'scripts/qapi/schema.py',
1386 meson.source_root() / 'scripts/qapi/source.py',
1387 meson.source_root() / 'scripts/qapi/types.py',
1388 meson.source_root() / 'scripts/qapi/visit.py',
1389 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001390 meson.source_root() / 'scripts/qapi-gen.py'
1391]
1392
1393tracetool = [
1394 python, files('scripts/tracetool.py'),
1395 '--backend=' + config_host['TRACE_BACKENDS']
1396]
1397
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001398qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1399 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02001400 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001401qemu_version = custom_target('qemu-version.h',
1402 output: 'qemu-version.h',
1403 command: qemu_version_cmd,
1404 capture: true,
1405 build_by_default: true,
1406 build_always_stale: true)
1407genh += qemu_version
1408
Marc-André Lureau3f885652019-07-15 18:06:04 +04001409hxdep = []
1410hx_headers = [
1411 ['qemu-options.hx', 'qemu-options.def'],
1412 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1413]
1414if have_system
1415 hx_headers += [
1416 ['hmp-commands.hx', 'hmp-commands.h'],
1417 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1418 ]
1419endif
1420foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001421 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04001422 input: files(d[0]),
1423 output: d[1],
1424 capture: true,
1425 build_by_default: true, # to be removed when added to a target
1426 command: [hxtool, '-h', '@INPUT0@'])
1427endforeach
1428genh += hxdep
1429
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001430###################
1431# Collect sources #
1432###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001433
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001434authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001435blockdev_ss = ss.source_set()
1436block_ss = ss.source_set()
1437bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001438chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001439common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001440crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001441io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001442linux_user_ss = ss.source_set()
1443qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001444qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001445softmmu_ss = ss.source_set()
1446specific_fuzz_ss = ss.source_set()
1447specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001448stub_ss = ss.source_set()
1449trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001450user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001451util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001452
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001453modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001454hw_arch = {}
1455target_arch = {}
1456target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001457
1458###############
1459# Trace files #
1460###############
1461
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001462# TODO: add each directory to the subdirs from its own meson.build, once
1463# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001464trace_events_subdirs = [
1465 'accel/kvm',
1466 'accel/tcg',
1467 'crypto',
1468 'monitor',
1469]
1470if have_user
1471 trace_events_subdirs += [ 'linux-user' ]
1472endif
1473if have_block
1474 trace_events_subdirs += [
1475 'authz',
1476 'block',
1477 'io',
1478 'nbd',
1479 'scsi',
1480 ]
1481endif
1482if have_system
1483 trace_events_subdirs += [
1484 'audio',
1485 'backends',
1486 'backends/tpm',
1487 'chardev',
1488 'hw/9pfs',
1489 'hw/acpi',
1490 'hw/alpha',
1491 'hw/arm',
1492 'hw/audio',
1493 'hw/block',
1494 'hw/block/dataplane',
1495 'hw/char',
1496 'hw/display',
1497 'hw/dma',
1498 'hw/hppa',
1499 'hw/hyperv',
1500 'hw/i2c',
1501 'hw/i386',
1502 'hw/i386/xen',
1503 'hw/ide',
1504 'hw/input',
1505 'hw/intc',
1506 'hw/isa',
1507 'hw/mem',
1508 'hw/mips',
1509 'hw/misc',
1510 'hw/misc/macio',
1511 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08001512 'hw/net/can',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001513 'hw/nvram',
1514 'hw/pci',
1515 'hw/pci-host',
1516 'hw/ppc',
1517 'hw/rdma',
1518 'hw/rdma/vmw',
1519 'hw/rtc',
1520 'hw/s390x',
1521 'hw/scsi',
1522 'hw/sd',
1523 'hw/sparc',
1524 'hw/sparc64',
1525 'hw/ssi',
1526 'hw/timer',
1527 'hw/tpm',
1528 'hw/usb',
1529 'hw/vfio',
1530 'hw/virtio',
1531 'hw/watchdog',
1532 'hw/xen',
1533 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001534 'migration',
1535 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02001536 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001537 'ui',
1538 ]
1539endif
1540trace_events_subdirs += [
1541 'hw/core',
1542 'qapi',
1543 'qom',
1544 'target/arm',
1545 'target/hppa',
1546 'target/i386',
Claudio Fontanaa9dc68d2020-12-12 16:55:08 +01001547 'target/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001548 'target/mips',
1549 'target/ppc',
1550 'target/riscv',
1551 'target/s390x',
1552 'target/sparc',
1553 'util',
1554]
1555
Marc-André Lureau0df750e2020-11-25 14:06:37 +04001556vhost_user = not_found
1557if 'CONFIG_VHOST_USER' in config_host
1558 libvhost_user = subproject('libvhost-user')
1559 vhost_user = libvhost_user.get_variable('vhost_user_dep')
1560endif
1561
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001562subdir('qapi')
1563subdir('qobject')
1564subdir('stubs')
1565subdir('trace')
1566subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04001567subdir('qom')
1568subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001569subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04001570subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001571
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001572
1573if enable_modules
1574 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1575 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1576endif
1577
Paolo Bonzini2becc362020-02-03 11:42:03 +01001578stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001579
1580util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01001581util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001582libqemuutil = static_library('qemuutil',
1583 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonziniaa087962020-09-01 11:15:30 -04001584 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001585qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04001586 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001587
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001588decodetree = generator(find_program('scripts/decodetree.py'),
1589 output: 'decode-@BASENAME@.c.inc',
1590 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1591
Paolo Bonzini478e9432020-08-17 12:47:55 +02001592subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04001593subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04001594subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001595subdir('fsdev')
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001596subdir('libdecnumber')
Marc-André Lureaud3b18482019-08-17 14:55:32 +04001597subdir('target')
Marc-André Lureau708eab42019-09-03 16:59:33 +04001598subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001599
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001600block_ss.add(files(
1601 'block.c',
1602 'blockjob.c',
1603 'job.c',
1604 'qemu-io-cmds.c',
1605))
1606block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
1607
1608subdir('nbd')
1609subdir('scsi')
1610subdir('block')
1611
Paolo Bonzini4a963372020-08-03 16:22:28 +02001612blockdev_ss.add(files(
1613 'blockdev.c',
Stefan Hajnoczicbc20bf2020-09-29 13:55:15 +01001614 'blockdev-nbd.c',
Paolo Bonzini4a963372020-08-03 16:22:28 +02001615 'iothread.c',
1616 'job-qmp.c',
1617))
1618
1619# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1620# os-win32.c does not
1621blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1622softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
Paolo Bonzini4a963372020-08-03 16:22:28 +02001623
1624common_ss.add(files('cpus-common.c'))
1625
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001626subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001627
Richard Hendersonf3433462020-09-12 10:47:33 -07001628common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02001629specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001630specific_ss.add(files('exec-vary.c'))
1631specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1632 'fpu/softfloat.c',
1633 'tcg/optimize.c',
1634 'tcg/tcg-common.c',
1635 'tcg/tcg-op-gvec.c',
1636 'tcg/tcg-op-vec.c',
1637 'tcg/tcg-op.c',
1638 'tcg/tcg.c',
1639))
1640specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1641
Marc-André Lureauab318052019-07-24 19:23:16 +04001642subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04001643subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04001644subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001645subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001646subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04001647subdir('replay')
Marc-André Lureau582ea952019-08-15 15:15:32 +04001648subdir('hw')
Marc-André Lureau1a828782019-08-18 16:13:08 +04001649subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001650subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04001651subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04001652subdir('linux-user')
1653
Marc-André Lureaub309c322019-08-18 19:20:37 +04001654bsd_user_ss.add(files('gdbstub.c'))
1655specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1656
Marc-André Lureau3a304462019-08-18 16:13:08 +04001657linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1658specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001659
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001660# needed for fuzzing binaries
1661subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001662subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001663
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001664########################
1665# Library dependencies #
1666########################
1667
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001668block_mods = []
1669softmmu_mods = []
1670foreach d, list : modules
1671 foreach m, module_ss : list
1672 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02001673 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001674 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1675 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1676 if d == 'block'
1677 block_mods += sl
1678 else
1679 softmmu_mods += sl
1680 endif
1681 else
1682 if d == 'block'
1683 block_ss.add_all(module_ss)
1684 else
1685 softmmu_ss.add_all(module_ss)
1686 endif
1687 endif
1688 endforeach
1689endforeach
1690
1691nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08001692undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001693block_syms = custom_target('block.syms', output: 'block.syms',
1694 input: [libqemuutil, block_mods],
1695 capture: true,
1696 command: [undefsym, nm, '@INPUT@'])
1697qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1698 input: [libqemuutil, softmmu_mods],
1699 capture: true,
1700 command: [undefsym, nm, '@INPUT@'])
1701
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001702qom_ss = qom_ss.apply(config_host, strict: false)
1703libqom = static_library('qom', qom_ss.sources() + genh,
1704 dependencies: [qom_ss.dependencies()],
1705 name_suffix: 'fa')
1706
1707qom = declare_dependency(link_whole: libqom)
1708
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001709authz_ss = authz_ss.apply(config_host, strict: false)
1710libauthz = static_library('authz', authz_ss.sources() + genh,
1711 dependencies: [authz_ss.dependencies()],
1712 name_suffix: 'fa',
1713 build_by_default: false)
1714
1715authz = declare_dependency(link_whole: libauthz,
1716 dependencies: qom)
1717
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001718crypto_ss = crypto_ss.apply(config_host, strict: false)
1719libcrypto = static_library('crypto', crypto_ss.sources() + genh,
1720 dependencies: [crypto_ss.dependencies()],
1721 name_suffix: 'fa',
1722 build_by_default: false)
1723
1724crypto = declare_dependency(link_whole: libcrypto,
1725 dependencies: [authz, qom])
1726
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001727io_ss = io_ss.apply(config_host, strict: false)
1728libio = static_library('io', io_ss.sources() + genh,
1729 dependencies: [io_ss.dependencies()],
1730 link_with: libqemuutil,
1731 name_suffix: 'fa',
1732 build_by_default: false)
1733
1734io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
1735
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02001736libmigration = static_library('migration', sources: migration_files + genh,
1737 name_suffix: 'fa',
1738 build_by_default: false)
1739migration = declare_dependency(link_with: libmigration,
1740 dependencies: [zlib, qom, io])
1741softmmu_ss.add(migration)
1742
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001743block_ss = block_ss.apply(config_host, strict: false)
1744libblock = static_library('block', block_ss.sources() + genh,
1745 dependencies: block_ss.dependencies(),
1746 link_depends: block_syms,
1747 name_suffix: 'fa',
1748 build_by_default: false)
1749
1750block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001751 link_args: '@block.syms',
1752 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001753
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01001754blockdev_ss = blockdev_ss.apply(config_host, strict: false)
1755libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
1756 dependencies: blockdev_ss.dependencies(),
1757 name_suffix: 'fa',
1758 build_by_default: false)
1759
1760blockdev = declare_dependency(link_whole: [libblockdev],
1761 dependencies: [block])
1762
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001763qmp_ss = qmp_ss.apply(config_host, strict: false)
1764libqmp = static_library('qmp', qmp_ss.sources() + genh,
1765 dependencies: qmp_ss.dependencies(),
1766 name_suffix: 'fa',
1767 build_by_default: false)
1768
1769qmp = declare_dependency(link_whole: [libqmp])
1770
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001771libchardev = static_library('chardev', chardev_ss.sources() + genh,
1772 name_suffix: 'fa',
1773 build_by_default: false)
1774
1775chardev = declare_dependency(link_whole: libchardev)
1776
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02001777libhwcore = static_library('hwcore', sources: hwcore_files + genh,
1778 name_suffix: 'fa',
1779 build_by_default: false)
1780hwcore = declare_dependency(link_whole: libhwcore)
1781common_ss.add(hwcore)
1782
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02001783###########
1784# Targets #
1785###########
1786
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001787foreach m : block_mods + softmmu_mods
1788 shared_module(m.name(),
1789 name_prefix: '',
1790 link_whole: m,
1791 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001792 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001793endforeach
1794
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01001795softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001796common_ss.add(qom, qemuutil)
1797
1798common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01001799common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
1800
1801common_all = common_ss.apply(config_all, strict: false)
1802common_all = static_library('common',
1803 build_by_default: false,
1804 sources: common_all.sources() + genh,
1805 dependencies: common_all.dependencies(),
1806 name_suffix: 'fa')
1807
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001808feature_to_c = find_program('scripts/feature_to_c.sh')
1809
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04001810emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001811foreach target : target_dirs
1812 config_target = config_target_mak[target]
1813 target_name = config_target['TARGET_NAME']
1814 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001815 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001816 arch_deps = []
1817 c_args = ['-DNEED_CPU_H',
1818 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
1819 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04001820 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01001821
Paolo Bonzini859aef02020-08-04 18:14:26 +02001822 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01001823 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
1824 if targetos == 'linux'
1825 target_inc += include_directories('linux-headers', is_system: true)
1826 endif
1827 if target.endswith('-softmmu')
1828 qemu_target_name = 'qemu-system-' + target_name
1829 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001830 t = target_softmmu_arch[arch].apply(config_target, strict: false)
1831 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001832 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001833
Marc-André Lureau2c442202019-08-17 13:55:58 +04001834 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
1835 hw = hw_arch[hw_dir].apply(config_target, strict: false)
1836 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001837 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04001838
Paolo Bonzini2becc362020-02-03 11:42:03 +01001839 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001840 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001841 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04001842 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001843 target_type='user'
1844 qemu_target_name = 'qemu-' + target_name
1845 if 'CONFIG_LINUX_USER' in config_target
1846 base_dir = 'linux-user'
1847 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1848 else
1849 base_dir = 'bsd-user'
1850 endif
1851 target_inc += include_directories(
1852 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04001853 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001854 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04001855 if 'CONFIG_LINUX_USER' in config_target
1856 dir = base_dir / abi
1857 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1858 if config_target.has_key('TARGET_SYSTBL_ABI')
1859 arch_srcs += \
1860 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1861 extra_args : config_target['TARGET_SYSTBL_ABI'])
1862 endif
1863 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01001864 endif
1865
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001866 if 'TARGET_XML_FILES' in config_target
1867 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1868 output: target + '-gdbstub-xml.c',
1869 input: files(config_target['TARGET_XML_FILES'].split()),
1870 command: [feature_to_c, '@INPUT@'],
1871 capture: true)
1872 arch_srcs += gdbstub_xml
1873 endif
1874
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001875 t = target_arch[arch].apply(config_target, strict: false)
1876 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001877 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001878
Paolo Bonzini2becc362020-02-03 11:42:03 +01001879 target_common = common_ss.apply(config_target, strict: false)
1880 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001881 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001882
Paolo Bonzini2becc362020-02-03 11:42:03 +01001883 target_specific = specific_ss.apply(config_target, strict: false)
1884 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001885 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001886
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001887 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02001888 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001889 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001890 objects: objects,
1891 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001892 c_args: c_args,
1893 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001894 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001895
1896 if target.endswith('-softmmu')
1897 execs = [{
1898 'name': 'qemu-system-' + target_name,
1899 'gui': false,
1900 'sources': files('softmmu/main.c'),
1901 'dependencies': []
1902 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001903 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001904 execs += [{
1905 'name': 'qemu-system-' + target_name + 'w',
1906 'gui': true,
1907 'sources': files('softmmu/main.c'),
1908 'dependencies': []
1909 }]
1910 endif
1911 if config_host.has_key('CONFIG_FUZZ')
1912 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1913 execs += [{
1914 'name': 'qemu-fuzz-' + target_name,
1915 'gui': false,
1916 'sources': specific_fuzz.sources(),
1917 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001918 }]
1919 endif
1920 else
1921 execs = [{
1922 'name': 'qemu-' + target_name,
1923 'gui': false,
1924 'sources': [],
1925 'dependencies': []
1926 }]
1927 endif
1928 foreach exe: execs
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04001929 emulators += {exe['name']:
1930 executable(exe['name'], exe['sources'],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001931 install: true,
1932 c_args: c_args,
1933 dependencies: arch_deps + deps + exe['dependencies'],
1934 objects: lib.extract_all_objects(recursive: true),
1935 link_language: link_language,
1936 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1937 link_args: link_args,
1938 gui_app: exe['gui'])
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04001939 }
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001940
1941 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1942 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001943 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1944 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001945 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1946 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1947 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001948 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001949 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001950 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001951 capture: true,
1952 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001953 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001954 command: [
1955 tracetool, '--group=all', '--format=' + stp['fmt'],
1956 '--binary=' + stp['bin'],
1957 '--target-name=' + target_name,
1958 '--target-type=' + target_type,
1959 '--probe-prefix=qemu.' + target_type + '.' + target_name,
1960 '@INPUT@',
1961 ])
1962 endforeach
1963 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001964 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001965endforeach
1966
Paolo Bonzini931049b2020-02-05 09:44:24 +01001967# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04001968
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001969if 'CONFIG_PLUGIN' in config_host
1970 install_headers('include/qemu/qemu-plugin.h')
1971endif
1972
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001973if 'CONFIG_GUEST_AGENT' in config_host
1974 subdir('qga')
1975endif
1976
Laurent Vivier9755c942020-08-24 17:24:30 +02001977# Don't build qemu-keymap if xkbcommon is not explicitly enabled
1978# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001979if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04001980 # used for the update-keymaps target, so include rules even if !have_tools
1981 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1982 dependencies: [qemuutil, xkbcommon], install: have_tools)
1983endif
1984
Paolo Bonzini931049b2020-02-05 09:44:24 +01001985if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001986 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1987 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1988 qemu_io = executable('qemu-io', files('qemu-io.c'),
1989 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01001990 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Stefan Hajnoczicbc20bf2020-09-29 13:55:15 +01001991 dependencies: [blockdev, qemuutil], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001992
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02001993 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02001994 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001995 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02001996
Marc-André Lureau157e7b12019-07-15 14:50:58 +04001997 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1998 dependencies: qemuutil,
1999 install: true)
2000
Paolo Bonzini931049b2020-02-05 09:44:24 +01002001 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02002002 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002003 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04002004 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02002005 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01002006 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002007
2008 if targetos == 'linux'
2009 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2010 dependencies: [qemuutil, libcap_ng],
2011 install: true,
2012 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002013
2014 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2015 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002016 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002017 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002018 endif
2019
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04002020 if 'CONFIG_IVSHMEM' in config_host
2021 subdir('contrib/ivshmem-client')
2022 subdir('contrib/ivshmem-server')
2023 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01002024endif
2025
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04002026subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002027subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04002028subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02002029subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08002030subdir('tests')
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04002031if 'CONFIG_GTK' in config_host
2032 subdir('po')
2033endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002034
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002035if host_machine.system() == 'windows'
2036 nsis_cmd = [
2037 find_program('scripts/nsis.py'),
2038 '@OUTPUT@',
2039 get_option('prefix'),
2040 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01002041 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002042 '--',
2043 '-DDISPLAYVERSION=' + meson.project_version(),
2044 ]
2045 if build_docs
2046 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2047 endif
2048 if 'CONFIG_GTK' in config_host
2049 nsis_cmd += '-DCONFIG_GTK=y'
2050 endif
2051
2052 nsis = custom_target('nsis',
2053 output: 'qemu-setup-' + meson.project_version() + '.exe',
2054 input: files('qemu.nsi'),
2055 build_always_stale: true,
2056 command: nsis_cmd + ['@INPUT@'])
2057 alias_target('installer', nsis)
2058endif
2059
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002060#########################
2061# Configuration summary #
2062#########################
2063
Paolo Bonzinif9332752020-02-03 13:28:38 +01002064summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002065summary_info += {'Install prefix': get_option('prefix')}
2066summary_info += {'BIOS directory': qemu_datadir}
2067summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2068summary_info += {'binary directory': get_option('bindir')}
2069summary_info += {'library directory': get_option('libdir')}
2070summary_info += {'module directory': qemu_moddir}
2071summary_info += {'libexec directory': get_option('libexecdir')}
2072summary_info += {'include directory': get_option('includedir')}
2073summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002074if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002075 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04002076 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002077else
2078 summary_info += {'local state directory': 'queried at runtime'}
2079endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04002080summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002081summary_info += {'Build directory': meson.current_build_dir()}
2082summary_info += {'Source path': meson.current_source_dir()}
2083summary_info += {'GIT binary': config_host['GIT']}
2084summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
2085summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
2086summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
2087if link_language == 'cpp'
2088 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
2089else
2090 summary_info += {'C++ compiler': false}
2091endif
2092if targetos == 'darwin'
2093 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
2094endif
2095summary_info += {'ARFLAGS': config_host['ARFLAGS']}
Paolo Bonzini47b30832020-09-23 05:26:17 -04002096summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2097 + ['-O' + get_option('optimization')]
2098 + (get_option('debug') ? ['-g'] : []))}
2099if link_language == 'cpp'
2100 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2101 + ['-O' + get_option('optimization')]
2102 + (get_option('debug') ? ['-g'] : []))}
2103endif
2104link_args = get_option(link_language + '_link_args')
2105if link_args.length() > 0
2106 summary_info += {'LDFLAGS': ' '.join(link_args)}
2107endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002108summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2109summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
2110summary_info += {'make': config_host['MAKE']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002111summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Yonggang Luoe3667662020-10-16 06:06:25 +08002112summary_info += {'sphinx-build': sphinx_build.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002113summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2114# TODO: add back version
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002115summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
2116if slirp_opt != 'disabled'
Paolo Bonzinif9332752020-02-03 13:28:38 +01002117 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2118endif
2119summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2120if config_host.has_key('CONFIG_MODULES')
2121 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2122endif
2123summary_info += {'host CPU': cpu}
2124summary_info += {'host endianness': build_machine.endian()}
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002125summary_info += {'target list': ' '.join(target_dirs)}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002126summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
Paolo Bonzinideb62372020-09-01 07:51:16 -04002127summary_info += {'sparse enabled': sparse.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002128summary_info += {'strip binaries': get_option('strip')}
2129summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05002130summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02002131summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002132if targetos == 'darwin'
2133 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
2134endif
2135# TODO: add back version
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002136summary_info += {'SDL support': sdl.found()}
2137summary_info += {'SDL image support': sdl_image.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002138# TODO: add back version
2139summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
2140summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002141summary_info += {'pixman': pixman.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002142# TODO: add back version
2143summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
2144summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
2145summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
2146# TODO: add back version
2147summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
2148if config_host.has_key('CONFIG_GCRYPT')
2149 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
2150 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2151endif
2152# TODO: add back version
2153summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
2154if config_host.has_key('CONFIG_NETTLE')
2155 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2156endif
2157summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
2158summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
Yonggang Luo5285e592020-10-13 07:43:48 +08002159summary_info += {'iconv support': iconv.found()}
2160summary_info += {'curses support': curses.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002161# TODO: add back version
2162summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
2163summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
2164summary_info += {'mingw32 support': targetos == 'windows'}
2165summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2166summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2167summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
2168summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
Misono Tomohirocece1162020-10-08 19:31:33 +09002169summary_info += {'build virtiofs daemon': have_virtiofsd}
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002170summary_info += {'Multipath support': mpathpersist.found()}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002171summary_info += {'VNC support': vnc.found()}
2172if vnc.found()
2173 summary_info += {'VNC SASL support': sasl.found()}
2174 summary_info += {'VNC JPEG support': jpeg.found()}
2175 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002176endif
2177summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2178if config_host.has_key('CONFIG_XEN_BACKEND')
2179 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2180endif
2181summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
Yonggang Luoe3667662020-10-16 06:06:25 +08002182summary_info += {'Documentation': build_docs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002183summary_info += {'PIE': get_option('b_pie')}
2184summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2185summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2186summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2187summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
2188summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
Paolo Bonzinic8d54502020-10-16 03:32:52 -04002189summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini05512f52020-09-16 15:31:11 -04002190summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2191summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2192summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2193summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
2194summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2195if config_all.has_key('CONFIG_TCG')
2196 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
2197 summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
2198endif
Paolo Bonziniaa087962020-09-01 11:15:30 -04002199summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002200summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2201summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002202summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002203summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
2204summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
2205summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2206summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2207summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2208summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
2209summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
Thomas Huthb54b82d2020-11-09 09:59:06 +01002210summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002211summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2212summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2213summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2214summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
Thomas Huthb54b82d2020-11-09 09:59:06 +01002215summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002216summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002217summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2218summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2219summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2220if config_host['TRACE_BACKENDS'].split().contains('simple')
2221 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2222endif
2223# TODO: add back protocol and server version
2224summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
2225summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
2226summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
2227summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02002228summary_info += {'U2F support': u2f.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002229summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
2230summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
2231summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
2232summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
2233summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
2234summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
2235summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2236if targetos == 'windows'
2237 if 'WIN_SDK' in config_host
2238 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2239 endif
2240 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2241 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Stefan Hajnoczi4bad7c32020-09-14 10:52:31 +01002242 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002243endif
2244summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
Daniele Buono9e62ba42020-12-04 18:06:14 -05002245summary_info += {'CFI support': get_option('cfi')}
2246summary_info += {'CFI debug support': get_option('cfi_debug')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002247summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2248summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2249summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2250summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2251summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
2252summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +04002253summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002254summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2255summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
2256summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2257summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
2258summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
2259summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
2260summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
2261summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
2262summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
2263summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2264summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
Paolo Bonziniaa087962020-09-01 11:15:30 -04002265summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002266summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2267summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2268summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2269summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2270summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2271summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2272summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2273summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2274summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2275summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2276summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2277summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002278summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002279summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2280summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002281summary_info += {'libudev': libudev.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002282summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
2283summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2284summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2285if config_host.has_key('HAVE_GDB_BIN')
2286 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2287endif
2288summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2289summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2290summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
Max Reitza484a712020-10-27 20:05:41 +01002291summary_info += {'FUSE exports': fuse.found()}
Max Reitzdf4ea702020-10-27 20:05:46 +01002292summary_info += {'FUSE lseek': fuse_lseek.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002293summary(summary_info, bool_yn: true)
2294
2295if not supported_cpus.contains(cpu)
2296 message()
2297 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2298 message()
2299 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2300 message('The QEMU project intends to remove support for this host CPU in')
2301 message('a future release if nobody volunteers to maintain it and to')
2302 message('provide a build host for our continuous integration setup.')
2303 message('configure has succeeded and you can continue to build, but')
2304 message('if you care about QEMU on this platform you should contact')
2305 message('us upstream at qemu-devel@nongnu.org.')
2306endif
2307
2308if not supported_oses.contains(targetos)
2309 message()
2310 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2311 message()
2312 message('Host OS ' + targetos + 'support is not currently maintained.')
2313 message('The QEMU project intends to remove support for this host OS in')
2314 message('a future release if nobody volunteers to maintain it and to')
2315 message('provide a build host for our continuous integration setup.')
2316 message('configure has succeeded and you can continue to build, but')
2317 message('if you care about QEMU on this platform you should contact')
2318 message('us upstream at qemu-devel@nongnu.org.')
2319endif