blob: e1f922f073646ea4481411478600c3ad1cada19e [file] [log] [blame]
Paolo Bonzinia5665052019-06-10 12:05:14 +02001project('qemu', ['c'], meson_version: '>=0.55.0',
Paolo Bonzinia5cb7c52020-10-19 06:56:16 -04002 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_colorout=auto'] +
3 (meson.version().version_compare('>=0.56.0') ? [ 'b_staticpic=false' ] : []),
Paolo Bonzinia5665052019-06-10 12:05:14 +02004 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5
6not_found = dependency('', required: false)
Paolo Bonzinib29b40f2020-08-10 18:04:43 +02007if meson.version().version_compare('>=0.56.0')
8 keyval = import('keyval')
9else
10 keyval = import('unstable-keyval')
11endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040012ss = import('sourceset')
Richard Henderson8b18cdb2020-09-13 12:19:25 -070013fs = import('fs')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040014
Paolo Bonzinice1c1e72020-01-28 16:41:44 +010015sh = find_program('sh')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040016cc = meson.get_compiler('c')
Paolo Bonzinia5665052019-06-10 12:05:14 +020017config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Marc-André Lureau3154fee2019-08-29 22:07:01 +040018enable_modules = 'CONFIG_MODULES' in config_host
Paolo Bonzini35be72b2020-02-06 14:17:15 +010019enable_static = 'CONFIG_STATIC' in config_host
Yonggang Luoe3667662020-10-16 06:06:25 +080020
21# Temporary directory used for files created while
22# configure runs. Since it is in the build directory
23# we can safely blow away any previous version of it
24# (and we need not jump through hoops to try to delete
25# it when configure exits.)
26tmpdir = meson.current_build_dir() / 'meson-private/temp'
Marc-André Lureau8fe11232020-09-11 14:42:48 +020027
28if get_option('qemu_suffix').startswith('/')
29 error('qemu_suffix cannot start with a /')
30endif
31
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040032qemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix')
Marc-André Lureauab4c0992020-08-26 15:04:16 +040033qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040034qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini16bf7a32020-10-16 03:19:14 -040035qemu_moddir = get_option('libdir') / get_option('qemu_suffix')
36
37qemu_desktopdir = get_option('datadir') / 'applications'
38qemu_icondir = get_option('datadir') / 'icons'
39
Paolo Bonzini859aef02020-08-04 18:14:26 +020040config_host_data = configuration_data()
41genh = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020042
Paolo Bonzini760e4322020-08-26 08:09:48 +020043target_dirs = config_host['TARGET_DIRS'].split()
44have_user = false
45have_system = false
46foreach target : target_dirs
47 have_user = have_user or target.endswith('-user')
48 have_system = have_system or target.endswith('-softmmu')
49endforeach
50have_tools = 'CONFIG_TOOLS' in config_host
51have_block = have_system or have_tools
52
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040053python = import('python').find_installation()
54
55supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
Sergei Trofimovich61256732020-10-12 18:57:19 +010056supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040057 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
58
59cpu = host_machine.cpu_family()
60targetos = host_machine.system()
61
Paolo Bonzini8a199802020-09-18 05:37:01 -040062if cpu in ['x86', 'x86_64']
63 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
64elif cpu == 'aarch64'
65 kvm_targets = ['aarch64-softmmu']
66elif cpu == 's390x'
67 kvm_targets = ['s390x-softmmu']
68elif cpu in ['ppc', 'ppc64']
69 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Huacai Chenfbc58842020-10-07 16:39:28 +080070elif cpu in ['mips', 'mips64']
71 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -040072else
73 kvm_targets = []
74endif
75
76accelerator_targets = { 'CONFIG_KVM': kvm_targets }
Alex Bennée0c3e41d2020-11-10 19:23:09 +000077if cpu in ['x86', 'x86_64', 'arm', 'aarch64']
78 # i368 emulator provides xenpv machine type for multiple architectures
79 accelerator_targets += {
80 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
81 }
82endif
Paolo Bonzini8a199802020-09-18 05:37:01 -040083if cpu in ['x86', 'x86_64']
84 accelerator_targets += {
85 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
Paolo Bonzini8a199802020-09-18 05:37:01 -040086 'CONFIG_HVF': ['x86_64-softmmu'],
87 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
88 }
89endif
90
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040091##################
92# Compiler flags #
93##################
94
Alexander Bulekovff9ed622020-09-09 18:05:16 -040095# Specify linker-script with add_project_link_arguments so that it is not placed
96# within a linker --start-group/--end-group pair
97if 'CONFIG_FUZZ' in config_host
98 add_project_link_arguments(['-Wl,-T,',
99 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
100 native: false, language: ['c', 'cpp', 'objc'])
101endif
102
Paolo Bonzinia5665052019-06-10 12:05:14 +0200103add_project_arguments(config_host['QEMU_CFLAGS'].split(),
104 native: false, language: ['c', 'objc'])
105add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
106 native: false, language: 'cpp')
107add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
108 native: false, language: ['c', 'cpp', 'objc'])
Paolo Bonzinia5665052019-06-10 12:05:14 +0200109
Paolo Bonzini1e6e6162020-10-14 08:45:42 -0400110if targetos == 'linux'
111 add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers',
112 '-isystem', 'linux-headers',
113 language: ['c', 'cpp'])
114endif
115
116if 'CONFIG_TCG_INTERPRETER' in config_host
117 tcg_arch = 'tci'
118elif config_host['ARCH'] == 'sparc64'
119 tcg_arch = 'sparc'
120elif config_host['ARCH'] == 's390x'
121 tcg_arch = 's390'
122elif config_host['ARCH'] in ['x86_64', 'x32']
123 tcg_arch = 'i386'
124elif config_host['ARCH'] == 'ppc64'
125 tcg_arch = 'ppc'
126elif config_host['ARCH'] in ['riscv32', 'riscv64']
127 tcg_arch = 'riscv'
128else
129 tcg_arch = config_host['ARCH']
130endif
131add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch,
132 '-iquote', '.',
133 '-iquote', meson.current_source_dir(),
134 '-iquote', meson.current_source_dir() / 'accel/tcg',
135 '-iquote', meson.current_source_dir() / 'include',
136 '-iquote', meson.current_source_dir() / 'disas/libvixl',
137 language: ['c', 'cpp', 'objc'])
Alexander Bulekovc46f76d2020-09-02 13:36:50 -0400138
Marc-André Lureaufc929892019-07-13 01:47:54 +0400139link_language = meson.get_external_property('link_language', 'cpp')
140if link_language == 'cpp'
141 add_languages('cpp', required: true, native: false)
142endif
Paolo Bonzinia5665052019-06-10 12:05:14 +0200143if host_machine.system() == 'darwin'
144 add_languages('objc', required: false, native: false)
145endif
146
Paolo Bonzinideb62372020-09-01 07:51:16 -0400147sparse = find_program('cgcc', required: get_option('sparse'))
148if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100149 run_target('sparse',
150 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400151 'compile_commands.json', sparse.full_path(), '-Wbitwise',
152 '-Wno-transparent-union', '-Wno-old-initializer',
153 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100154endif
155
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200156###########################################
157# Target-specific checks and dependencies #
158###########################################
159
160if targetos != 'linux' and get_option('mpath').enabled()
161 error('Multipath is supported only on Linux')
162endif
163
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400164m = cc.find_library('m', required: false)
165util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200166winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400167socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400168version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400169coref = []
170iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400171emulator_link_args = []
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400172cocoa = not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400173hvf = not_found
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400174if targetos == 'windows'
175 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200176 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400177
178 win = import('windows')
179 version_res = win.compile_resources('version.rc',
180 depend_files: files('pc-bios/qemu-nsis.ico'),
181 include_directories: include_directories('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400182elif targetos == 'darwin'
183 coref = dependency('appleframeworks', modules: 'CoreFoundation')
184 iokit = dependency('appleframeworks', modules: 'IOKit')
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400185 cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200186elif targetos == 'sunos'
187 socket = [cc.find_library('socket'),
188 cc.find_library('nsl'),
189 cc.find_library('resolv')]
190elif targetos == 'haiku'
191 socket = [cc.find_library('posix_error_mapper'),
192 cc.find_library('network'),
193 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400194elif targetos == 'openbsd'
195 if not get_option('tcg').disabled() and target_dirs.length() > 0
196 # Disable OpenBSD W^X if available
197 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
198 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400199endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200200
Paolo Bonzini8a199802020-09-18 05:37:01 -0400201accelerators = []
202if not get_option('kvm').disabled() and targetos == 'linux'
203 accelerators += 'CONFIG_KVM'
204endif
205if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
206 accelerators += 'CONFIG_XEN'
207 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
208else
209 have_xen_pci_passthrough = false
210endif
211if not get_option('whpx').disabled() and targetos == 'windows'
Sunil Muthuswamy57e2a1f2020-10-22 00:27:55 +0000212 if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64'
Paolo Bonzini8a199802020-09-18 05:37:01 -0400213 error('WHPX requires 64-bit host')
214 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
215 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
216 accelerators += 'CONFIG_WHPX'
217 endif
218endif
219if not get_option('hvf').disabled()
220 hvf = dependency('appleframeworks', modules: 'Hypervisor',
221 required: get_option('hvf'))
222 if hvf.found()
223 accelerators += 'CONFIG_HVF'
224 endif
225endif
226if not get_option('hax').disabled()
227 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
228 accelerators += 'CONFIG_HAX'
229 endif
230endif
231if not get_option('tcg').disabled()
232 if cpu not in supported_cpus
233 if 'CONFIG_TCG_INTERPRETER' in config_host
234 warning('Unsupported CPU @0@, will use TCG with TCI (experimental)'.format(cpu))
235 else
236 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
237 endif
238 endif
239 accelerators += 'CONFIG_TCG'
240 config_host += { 'CONFIG_TCG': 'y' }
241endif
242
243if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
244 error('KVM not available on this platform')
245endif
246if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
247 error('HVF not available on this platform')
248endif
249if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
250 error('WHPX not available on this platform')
251endif
252if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
253 if 'CONFIG_XEN' in accelerators
254 error('Xen PCI passthrough not available on this platform')
255 else
256 error('Xen PCI passthrough requested but Xen not enabled')
257 endif
258endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400259if not cocoa.found() and get_option('cocoa').enabled()
260 error('Cocoa not available on this platform')
261endif
262
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200263################
264# Dependencies #
265################
266
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400267# The path to glib.h is added to all compilation commands. This was
268# grandfathered in from the QEMU Makefiles.
269add_project_arguments(config_host['GLIB_CFLAGS'].split(),
270 native: false, language: ['c', 'cpp', 'objc'])
Marc-André Lureau953d5a92020-12-15 12:03:19 +0400271glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
272 link_args: config_host['GLIB_LIBS'].split())
273# override glib dep with the configure results (for subprojects)
274meson.override_dependency('glib-2.0', glib)
275
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400276gio = not_found
277if 'CONFIG_GIO' in config_host
278 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
279 link_args: config_host['GIO_LIBS'].split())
280endif
281lttng = not_found
282if 'CONFIG_TRACE_UST' in config_host
283 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
284endif
285urcubp = not_found
286if 'CONFIG_TRACE_UST' in config_host
287 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
288endif
Daniel P. Berrangé46859d92020-09-01 14:30:49 +0100289gcrypt = not_found
290if 'CONFIG_GCRYPT' in config_host
291 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
292 link_args: config_host['GCRYPT_LIBS'].split())
293endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400294nettle = not_found
295if 'CONFIG_NETTLE' in config_host
296 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
297 link_args: config_host['NETTLE_LIBS'].split())
298endif
299gnutls = not_found
300if 'CONFIG_GNUTLS' in config_host
301 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
302 link_args: config_host['GNUTLS_LIBS'].split())
303endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200304pixman = not_found
305if have_system or have_tools
306 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzini1a949332020-08-31 06:27:00 -0400307 method: 'pkg-config', static: enable_static)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200308endif
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400309pam = not_found
310if 'CONFIG_AUTH_PAM' in config_host
311 pam = cc.find_library('pam')
312endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400313libaio = cc.find_library('aio', required: false)
Paolo Bonzini1ffb3bb2020-08-28 19:33:54 +0200314zlib = dependency('zlib', required: true, static: enable_static)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400315linux_io_uring = not_found
316if 'CONFIG_LINUX_IO_URING' in config_host
317 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
318 link_args: config_host['LINUX_IO_URING_LIBS'].split())
319endif
320libxml2 = not_found
321if 'CONFIG_LIBXML2' in config_host
322 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
323 link_args: config_host['LIBXML2_LIBS'].split())
324endif
325libnfs = not_found
Paolo Bonzini30045c02020-11-17 13:11:25 +0100326if not get_option('libnfs').auto() or have_block
327 libnfs = dependency('libnfs', version: '>=1.9.3',
328 required: get_option('libnfs'),
329 method: 'pkg-config', static: enable_static)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400330endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400331libattr = not_found
332if 'CONFIG_ATTR' in config_host
333 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
334endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100335seccomp = not_found
336if 'CONFIG_SECCOMP' in config_host
337 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
338 link_args: config_host['SECCOMP_LIBS'].split())
339endif
340libcap_ng = not_found
341if 'CONFIG_LIBCAP_NG' in config_host
342 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
343endif
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400344if get_option('xkbcommon').auto() and not have_system and not have_tools
345 xkbcommon = not_found
346else
347 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400348 method: 'pkg-config', static: enable_static)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400349endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400350vde = not_found
351if config_host.has_key('CONFIG_VDE')
352 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
353endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200354pulse = not_found
355if 'CONFIG_LIBPULSE' in config_host
356 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
357 link_args: config_host['PULSE_LIBS'].split())
358endif
359alsa = not_found
360if 'CONFIG_ALSA' in config_host
361 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
362 link_args: config_host['ALSA_LIBS'].split())
363endif
364jack = not_found
365if 'CONFIG_LIBJACK' in config_host
366 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
367endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200368spice = not_found
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200369spice_headers = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200370if 'CONFIG_SPICE' in config_host
371 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
372 link_args: config_host['SPICE_LIBS'].split())
Gerd Hoffmannd72c34c2020-10-14 14:11:18 +0200373 spice_headers = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split())
Paolo Bonzini26347332019-07-29 15:40:07 +0200374endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400375rt = cc.find_library('rt', required: false)
Paolo Bonziniccf7afa2020-09-01 06:44:23 -0400376libdl = not_found
377if 'CONFIG_PLUGIN' in config_host
378 libdl = cc.find_library('dl', required: true)
379endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200380libiscsi = not_found
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100381if not get_option('libiscsi').auto() or have_block
382 libiscsi = dependency('libiscsi', version: '>=1.9.0',
383 required: get_option('libiscsi'),
384 method: 'pkg-config', static: enable_static)
Paolo Bonzini99650b62019-06-10 12:21:14 +0200385endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400386zstd = not_found
387if 'CONFIG_ZSTD' in config_host
388 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
389 link_args: config_host['ZSTD_LIBS'].split())
390endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400391gbm = not_found
392if 'CONFIG_GBM' in config_host
393 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
394 link_args: config_host['GBM_LIBS'].split())
395endif
396virgl = not_found
397if 'CONFIG_VIRGL' in config_host
398 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
399 link_args: config_host['VIRGL_LIBS'].split())
400endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400401curl = not_found
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100402if not get_option('curl').auto() or have_block
403 curl = dependency('libcurl', version: '>=7.29.0',
404 method: 'pkg-config',
405 required: get_option('curl'),
406 static: enable_static)
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400407endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200408libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200409if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200410 libudev = dependency('libudev',
Paolo Bonzinia0fbbb62020-11-17 12:36:15 +0100411 method: 'pkg-config',
Paolo Bonzini5c530152020-10-15 06:09:27 -0400412 required: get_option('libudev'),
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200413 static: enable_static)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200414endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200415
Paolo Bonzini5c530152020-10-15 06:09:27 -0400416mpathlibs = [libudev]
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200417mpathpersist = not_found
418mpathpersist_new_api = false
419if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
420 mpath_test_source_new = '''
421 #include <libudev.h>
422 #include <mpath_persist.h>
423 unsigned mpath_mx_alloc_len = 1024;
424 int logsink;
425 static struct config *multipath_conf;
426 extern struct udev *udev;
427 extern struct config *get_multipath_config(void);
428 extern void put_multipath_config(struct config *conf);
429 struct udev *udev;
430 struct config *get_multipath_config(void) { return multipath_conf; }
431 void put_multipath_config(struct config *conf) { }
432 int main(void) {
433 udev = udev_new();
434 multipath_conf = mpath_lib_init();
435 return 0;
436 }'''
437 mpath_test_source_old = '''
438 #include <libudev.h>
439 #include <mpath_persist.h>
440 unsigned mpath_mx_alloc_len = 1024;
441 int logsink;
442 int main(void) {
443 struct udev *udev = udev_new();
444 mpath_lib_init(udev);
445 return 0;
446 }'''
Paolo Bonzini5c530152020-10-15 06:09:27 -0400447 libmpathpersist = cc.find_library('mpathpersist',
448 required: get_option('mpath'),
449 static: enable_static)
450 if libmpathpersist.found()
451 mpathlibs += libmpathpersist
452 if enable_static
453 mpathlibs += cc.find_library('devmapper',
454 required: get_option('mpath'),
455 static: enable_static)
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200456 endif
Paolo Bonzini5c530152020-10-15 06:09:27 -0400457 mpathlibs += cc.find_library('multipath',
458 required: get_option('mpath'),
459 static: enable_static)
460 foreach lib: mpathlibs
461 if not lib.found()
462 mpathlibs = []
463 break
464 endif
465 endforeach
466 if mpathlibs.length() == 0
467 msg = 'Dependencies missing for libmpathpersist'
468 elif cc.links(mpath_test_source_new, dependencies: mpathlibs)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200469 mpathpersist = declare_dependency(dependencies: mpathlibs)
470 mpathpersist_new_api = true
471 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
472 mpathpersist = declare_dependency(dependencies: mpathlibs)
473 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400474 msg = 'Cannot detect libmpathpersist API'
475 endif
476 if not mpathpersist.found()
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200477 if get_option('mpath').enabled()
Paolo Bonzini5c530152020-10-15 06:09:27 -0400478 error(msg)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200479 else
Paolo Bonzini5c530152020-10-15 06:09:27 -0400480 warning(msg + ', disabling')
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200481 endif
482 endif
483 endif
484endif
485
Yonggang Luo5285e592020-10-13 07:43:48 +0800486iconv = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800487curses = not_found
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400488if have_system and not get_option('curses').disabled()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400489 curses_test = '''
490 #include <locale.h>
491 #include <curses.h>
492 #include <wchar.h>
493 int main(void) {
494 wchar_t wch = L'w';
495 setlocale(LC_ALL, "");
496 resize_term(0, 0);
497 addwstr(L"wide chars\n");
498 addnwstr(&wch, 1);
499 add_wch(WACS_DEGREE);
500 return 0;
501 }'''
502
Yonggang Luoca31e302020-11-17 05:31:06 +0800503 curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw']
504 foreach curses_dep : curses_dep_list
505 if not curses.found()
506 curses = dependency(curses_dep,
507 required: false,
508 method: 'pkg-config',
509 static: enable_static)
510 endif
511 endforeach
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400512 msg = get_option('curses').enabled() ? 'curses library not found' : ''
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500513 curses_compile_args = ['-DNCURSES_WIDECHAR']
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400514 if curses.found()
Paolo Bonzini0dbce6e2020-11-30 08:07:48 -0500515 if cc.links(curses_test, args: curses_compile_args, dependencies: [curses])
516 curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses])
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400517 else
518 msg = 'curses package not usable'
519 curses = not_found
Yonggang Luo5285e592020-10-13 07:43:48 +0800520 endif
521 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400522 if not curses.found()
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400523 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
524 if targetos != 'windows' and not has_curses_h
525 message('Trying with /usr/include/ncursesw')
526 curses_compile_args += ['-I/usr/include/ncursesw']
527 has_curses_h = cc.has_header('curses.h', args: curses_compile_args)
528 endif
529 if has_curses_h
530 curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw'])
531 foreach curses_libname : curses_libname_list
Yonggang Luo5285e592020-10-13 07:43:48 +0800532 libcurses = cc.find_library(curses_libname,
533 required: false,
Yonggang Luo5285e592020-10-13 07:43:48 +0800534 static: enable_static)
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400535 if libcurses.found()
536 if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses)
537 curses = declare_dependency(compile_args: curses_compile_args,
538 dependencies: [libcurses])
539 break
540 else
541 msg = 'curses library not usable'
542 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800543 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400544 endforeach
545 endif
546 endif
547 if not get_option('iconv').disabled()
548 foreach link_args : [ ['-liconv'], [] ]
549 # Programs will be linked with glib and this will bring in libiconv on FreeBSD.
550 # We need to use libiconv if available because mixing libiconv's headers with
551 # the system libc does not work.
552 # However, without adding glib to the dependencies -L/usr/local/lib will not be
553 # included in the command line and libiconv will not be found.
554 if cc.links('''
555 #include <iconv.h>
556 int main(void) {
557 iconv_t conv = iconv_open("WCHAR_T", "UCS-2");
558 return conv != (iconv_t) -1;
559 }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args)
560 iconv = declare_dependency(link_args: link_args, dependencies: glib)
561 break
Yonggang Luo5285e592020-10-13 07:43:48 +0800562 endif
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400563 endforeach
564 endif
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400565 if curses.found() and not iconv.found()
566 if get_option('iconv').enabled()
567 error('iconv not available')
568 endif
569 msg = 'iconv required for curses UI but not available'
570 curses = not_found
571 endif
572 if not curses.found() and msg != ''
573 if get_option('curses').enabled()
574 error(msg)
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400575 else
Paolo Bonzini925a40d2020-10-19 04:42:11 -0400576 warning(msg + ', disabling')
Paolo Bonzini30fe76b2020-10-15 13:26:50 -0400577 endif
Yonggang Luo5285e592020-10-13 07:43:48 +0800578 endif
579endif
580
Paolo Bonzini26347332019-07-29 15:40:07 +0200581brlapi = not_found
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100582if not get_option('brlapi').auto() or have_system
583 brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'],
584 required: get_option('brlapi'),
585 static: enable_static)
586 if brlapi.found() and not cc.links('''
587 #include <brlapi.h>
588 #include <stddef.h>
589 int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi)
590 brlapi = not_found
591 if get_option('brlapi').enabled()
592 error('could not link brlapi')
593 else
594 warning('could not link brlapi, disabling')
595 endif
596 endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200597endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100598
Paolo Bonzini760e4322020-08-26 08:09:48 +0200599sdl = not_found
600if have_system
Yonggang Luo363743d2020-08-26 23:10:03 +0800601 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200602 sdl_image = not_found
603endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100604if sdl.found()
605 # work around 2.0.8 bug
606 sdl = declare_dependency(compile_args: '-Wno-undef',
607 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200608 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400609 method: 'pkg-config', static: enable_static)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100610else
611 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100612 error('sdl-image required, but SDL was @0@'.format(
613 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100614 endif
615 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200616endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100617
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400618rbd = not_found
619if 'CONFIG_RBD' in config_host
620 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
621endif
622glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100623glusterfs_ftruncate_has_stat = false
624glusterfs_iocb_has_stat = false
625if not get_option('glusterfs').auto() or have_block
626 glusterfs = dependency('glusterfs-api', version: '>=3',
627 required: get_option('glusterfs'),
628 method: 'pkg-config', static: enable_static)
629 if glusterfs.found()
630 glusterfs_ftruncate_has_stat = cc.links('''
631 #include <glusterfs/api/glfs.h>
632
633 int
634 main(void)
635 {
636 /* new glfs_ftruncate() passes two additional args */
637 return glfs_ftruncate(NULL, 0, NULL, NULL);
638 }
639 ''', dependencies: glusterfs)
640 glusterfs_iocb_has_stat = cc.links('''
641 #include <glusterfs/api/glfs.h>
642
643 /* new glfs_io_cbk() passes two additional glfs_stat structs */
644 static void
645 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
646 {}
647
648 int
649 main(void)
650 {
651 glfs_io_cbk iocb = &glusterfs_iocb;
652 iocb(NULL, 0 , NULL, NULL, NULL);
653 return 0;
654 }
655 ''', dependencies: glusterfs)
656 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400657endif
658libssh = not_found
659if 'CONFIG_LIBSSH' in config_host
660 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
661 link_args: config_host['LIBSSH_LIBS'].split())
662endif
663libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100664if not get_option('bzip2').auto() or have_block
665 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
666 required: get_option('bzip2'),
667 static: enable_static)
668 if libbzip2.found() and not cc.links('''
669 #include <bzlib.h>
670 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
671 libbzip2 = not_found
672 if get_option('bzip2').enabled()
673 error('could not link libbzip2')
674 else
675 warning('could not link libbzip2, disabling')
676 endif
677 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400678endif
679liblzfse = not_found
680if 'CONFIG_LZFSE' in config_host
681 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
682endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200683oss = not_found
684if 'CONFIG_AUDIO_OSS' in config_host
685 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
686endif
687dsound = not_found
688if 'CONFIG_AUDIO_DSOUND' in config_host
689 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
690endif
691coreaudio = not_found
692if 'CONFIG_AUDIO_COREAUDIO' in config_host
693 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
694endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400695opengl = not_found
696if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400697 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
698 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400699endif
700gtk = not_found
701if 'CONFIG_GTK' in config_host
702 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
703 link_args: config_host['GTK_LIBS'].split())
704endif
705vte = not_found
706if 'CONFIG_VTE' in config_host
707 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
708 link_args: config_host['VTE_LIBS'].split())
709endif
710x11 = not_found
711if 'CONFIG_X11' in config_host
712 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
713 link_args: config_host['X11_LIBS'].split())
714endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100715vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400716png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400717jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400718sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100719if get_option('vnc').enabled()
720 vnc = declare_dependency() # dummy dependency
721 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400722 method: 'pkg-config', static: enable_static)
Paolo Bonzini8e242b32020-11-23 13:34:02 -0500723 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
724 method: 'pkg-config', static: enable_static)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100725 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
726 required: get_option('vnc_sasl'),
727 static: enable_static)
728 if sasl.found()
729 sasl = declare_dependency(dependencies: sasl,
730 compile_args: '-DSTRUCT_IOVEC_DEFINED')
731 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400732endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400733snappy = not_found
734if 'CONFIG_SNAPPY' in config_host
735 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
736endif
737lzo = not_found
738if 'CONFIG_LZO' in config_host
739 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
740endif
Marc-André Lureau55166232019-07-24 19:16:22 +0400741rdma = not_found
742if 'CONFIG_RDMA' in config_host
743 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
744endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400745numa = not_found
746if 'CONFIG_NUMA' in config_host
747 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
748endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400749xen = not_found
750if 'CONFIG_XEN_BACKEND' in config_host
751 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
752 link_args: config_host['XEN_LIBS'].split())
753endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200754cacard = not_found
755if 'CONFIG_SMARTCARD' in config_host
756 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
757 link_args: config_host['SMARTCARD_LIBS'].split())
758endif
César Belley0a40bcb2020-08-26 13:42:04 +0200759u2f = not_found
760if have_system
761 u2f = dependency('u2f-emu', required: get_option('u2f'),
762 method: 'pkg-config',
763 static: enable_static)
764endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200765usbredir = not_found
766if 'CONFIG_USB_REDIR' in config_host
767 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
768 link_args: config_host['USB_REDIR_LIBS'].split())
769endif
770libusb = not_found
771if 'CONFIG_USB_LIBUSB' in config_host
772 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
773 link_args: config_host['LIBUSB_LIBS'].split())
774endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400775libpmem = not_found
776if 'CONFIG_LIBPMEM' in config_host
777 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
778 link_args: config_host['LIBPMEM_LIBS'].split())
779endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600780libdaxctl = not_found
781if 'CONFIG_LIBDAXCTL' in config_host
782 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
783endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +0400784tasn1 = not_found
785if 'CONFIG_TASN1' in config_host
786 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
787 link_args: config_host['TASN1_LIBS'].split())
788endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400789keyutils = dependency('libkeyutils', required: false,
790 method: 'pkg-config', static: enable_static)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400791
Marc-André Lureau3909def2020-08-28 15:07:33 +0400792has_gettid = cc.has_function('gettid')
793
Paolo Bonziniaa087962020-09-01 11:15:30 -0400794# Malloc tests
795
796malloc = []
797if get_option('malloc') == 'system'
798 has_malloc_trim = \
799 not get_option('malloc_trim').disabled() and \
800 cc.links('''#include <malloc.h>
801 int main(void) { malloc_trim(0); return 0; }''')
802else
803 has_malloc_trim = false
804 malloc = cc.find_library(get_option('malloc'), required: true)
805endif
806if not has_malloc_trim and get_option('malloc_trim').enabled()
807 if get_option('malloc') == 'system'
808 error('malloc_trim not available on this platform.')
809 else
810 error('malloc_trim not available with non-libc memory allocator')
811 endif
812endif
813
Max Reitz84e319a2020-11-02 17:18:55 +0100814# Check whether the glibc provides statx()
815
816statx_test = '''
817 #ifndef _GNU_SOURCE
818 #define _GNU_SOURCE
819 #endif
820 #include <sys/stat.h>
821 int main(void) {
822 struct statx statxbuf;
823 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
824 return 0;
825 }'''
826
827has_statx = cc.links(statx_test)
828
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000829have_vhost_user_blk_server = (targetos == 'linux' and
830 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000831
832if get_option('vhost_user_blk_server').enabled()
833 if targetos != 'linux'
834 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000835 elif 'CONFIG_VHOST_USER' not in config_host
836 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000837 endif
838elif get_option('vhost_user_blk_server').disabled() or not have_system
839 have_vhost_user_blk_server = false
840endif
841
Daniele Buono9e62ba42020-12-04 18:06:14 -0500842
Max Reitzdf4ea702020-10-27 20:05:46 +0100843if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
844 error('Cannot enable fuse-lseek while fuse is disabled')
845endif
846
Max Reitza484a712020-10-27 20:05:41 +0100847fuse = dependency('fuse3', required: get_option('fuse'),
848 version: '>=3.1', method: 'pkg-config',
849 static: enable_static)
850
Max Reitzdf4ea702020-10-27 20:05:46 +0100851fuse_lseek = not_found
852if not get_option('fuse_lseek').disabled()
853 if fuse.version().version_compare('>=3.8')
854 # Dummy dependency
855 fuse_lseek = declare_dependency()
856 elif get_option('fuse_lseek').enabled()
857 if fuse.found()
858 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
859 else
860 error('fuse-lseek requires libfuse, which was not found')
861 endif
862 endif
863endif
864
Daniele Buono9e62ba42020-12-04 18:06:14 -0500865if get_option('cfi')
866 cfi_flags=[]
867 # Check for dependency on LTO
868 if not get_option('b_lto')
869 error('Selected Control-Flow Integrity but LTO is disabled')
870 endif
871 if config_host.has_key('CONFIG_MODULES')
872 error('Selected Control-Flow Integrity is not compatible with modules')
873 endif
874 # Check for cfi flags. CFI requires LTO so we can't use
875 # get_supported_arguments, but need a more complex "compiles" which allows
876 # custom arguments
877 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
878 args: ['-flto', '-fsanitize=cfi-icall'] )
879 cfi_flags += '-fsanitize=cfi-icall'
880 else
881 error('-fsanitize=cfi-icall is not supported by the compiler')
882 endif
883 if cc.compiles('int main () { return 0; }',
884 name: '-fsanitize-cfi-icall-generalize-pointers',
885 args: ['-flto', '-fsanitize=cfi-icall',
886 '-fsanitize-cfi-icall-generalize-pointers'] )
887 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
888 else
889 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
890 endif
891 if get_option('cfi_debug')
892 if cc.compiles('int main () { return 0; }',
893 name: '-fno-sanitize-trap=cfi-icall',
894 args: ['-flto', '-fsanitize=cfi-icall',
895 '-fno-sanitize-trap=cfi-icall'] )
896 cfi_flags += '-fno-sanitize-trap=cfi-icall'
897 else
898 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
899 endif
900 endif
901 add_project_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
902 add_project_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
903endif
904
Paolo Bonzinia0c91622020-10-07 11:01:51 -0400905#################
906# config-host.h #
907#################
Paolo Bonzini859aef02020-08-04 18:14:26 +0200908
Paolo Bonzini16bf7a32020-10-16 03:19:14 -0400909config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
910config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
911config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
912config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
913config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
914config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
915config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
916config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
917config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
918config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
919config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
920config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
921
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100922config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400923config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200924config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200925config_host_data.set('CONFIG_MPATH', mpathpersist.found())
926config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100927config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +0800928config_host_data.set('CONFIG_CURSES', curses.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100929config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
930if glusterfs.found()
931 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
932 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
933 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
934 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
935 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
936 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
937endif
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100938config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +0100939config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100940config_host_data.set('CONFIG_SDL', sdl.found())
941config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000942config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100943config_host_data.set('CONFIG_VNC', vnc.found())
944config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
945config_host_data.set('CONFIG_VNC_PNG', png.found())
946config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +0200947config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400948config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +0400949config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonziniaa087962020-09-01 11:15:30 -0400950config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +0100951config_host_data.set('CONFIG_STATX', has_statx)
Max Reitza484a712020-10-27 20:05:41 +0100952config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +0100953config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Daniele Buono9e62ba42020-12-04 18:06:14 -0500954config_host_data.set('CONFIG_CFI', get_option('cfi'))
Paolo Bonzini859aef02020-08-04 18:14:26 +0200955config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
956config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
957config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
958config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
959
Thomas Huth48f670e2020-11-18 18:10:52 +0100960config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +0100961config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +0100962config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Thomas Huthded5d782020-11-14 11:10:11 +0100963config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +0100964config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Thomas Huth88c78f12020-11-18 18:10:50 +0100965config_host_data.set('HAVE_SYS_SIGNAL_H', cc.has_header('sys/signal.h'))
Thomas Huthded5d782020-11-14 11:10:11 +0100966
Paolo Bonzini765686d2020-09-18 06:37:21 -0400967ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
Paolo Bonzini859aef02020-08-04 18:14:26 +0200968arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzini16bf7a32020-10-16 03:19:14 -0400969strings = ['HOST_DSOSUF', 'CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +0200970foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -0400971 if ignored.contains(k)
972 # do nothing
973 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +0200974 if v != ''
975 v = '"' + '", "'.join(v.split()) + '", '
976 endif
977 config_host_data.set(k, v)
978 elif k == 'ARCH'
979 config_host_data.set('HOST_' + v.to_upper(), 1)
980 elif strings.contains(k)
981 if not k.startswith('CONFIG_')
982 k = 'CONFIG_' + k.to_upper()
983 endif
984 config_host_data.set_quoted(k, v)
985 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
986 config_host_data.set(k, v == 'y' ? 1 : v)
987 endif
988endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +0200989
Paolo Bonzinia0c91622020-10-07 11:01:51 -0400990########################
991# Target configuration #
992########################
993
Paolo Bonzini2becc362020-02-03 11:42:03 +0100994minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -0400995config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -0400996config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400997config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100998config_devices_mak_list = []
999config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02001000config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001001config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001002
1003disassemblers = {
1004 'alpha' : ['CONFIG_ALPHA_DIS'],
1005 'arm' : ['CONFIG_ARM_DIS'],
1006 'avr' : ['CONFIG_AVR_DIS'],
1007 'cris' : ['CONFIG_CRIS_DIS'],
1008 'hppa' : ['CONFIG_HPPA_DIS'],
1009 'i386' : ['CONFIG_I386_DIS'],
1010 'x86_64' : ['CONFIG_I386_DIS'],
1011 'x32' : ['CONFIG_I386_DIS'],
1012 'lm32' : ['CONFIG_LM32_DIS'],
1013 'm68k' : ['CONFIG_M68K_DIS'],
1014 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1015 'mips' : ['CONFIG_MIPS_DIS'],
1016 'moxie' : ['CONFIG_MOXIE_DIS'],
1017 'nios2' : ['CONFIG_NIOS2_DIS'],
1018 'or1k' : ['CONFIG_OPENRISC_DIS'],
1019 'ppc' : ['CONFIG_PPC_DIS'],
1020 'riscv' : ['CONFIG_RISCV_DIS'],
1021 'rx' : ['CONFIG_RX_DIS'],
1022 's390' : ['CONFIG_S390_DIS'],
1023 'sh4' : ['CONFIG_SH4_DIS'],
1024 'sparc' : ['CONFIG_SPARC_DIS'],
1025 'xtensa' : ['CONFIG_XTENSA_DIS'],
1026}
1027if link_language == 'cpp'
1028 disassemblers += {
1029 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1030 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1031 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1032 }
1033endif
1034
Paolo Bonzini0a189112020-11-17 14:58:32 +01001035host_kconfig = \
1036 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
1037 ('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
1038 ('CONFIG_IVSHMEM' in config_host ? ['CONFIG_IVSHMEM=y'] : []) + \
1039 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
1040 ('CONFIG_X11' in config_host ? ['CONFIG_X11=y'] : []) + \
1041 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1042 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1043 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
1044 ('CONFIG_VIRTFS' in config_host ? ['CONFIG_VIRTFS=y'] : []) + \
1045 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
1046 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : [])
1047
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001048ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001049
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001050default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1051actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001052fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001053foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04001054 config_target = { 'TARGET_NAME': target.split('-')[0] }
1055 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001056 if targetos != 'linux'
1057 if default_targets
1058 continue
1059 endif
1060 error('Target @0@ is only available on a Linux host'.format(target))
1061 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001062 config_target += { 'CONFIG_LINUX_USER': 'y' }
1063 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001064 if 'CONFIG_BSD' not in config_host
1065 if default_targets
1066 continue
1067 endif
1068 error('Target @0@ is only available on a BSD host'.format(target))
1069 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001070 config_target += { 'CONFIG_BSD_USER': 'y' }
1071 elif target.endswith('softmmu')
1072 config_target += { 'CONFIG_SOFTMMU': 'y' }
1073 endif
1074 if target.endswith('-user')
1075 config_target += {
1076 'CONFIG_USER_ONLY': 'y',
1077 'CONFIG_QEMU_INTERP_PREFIX':
1078 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1079 }
1080 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001081
Paolo Bonzini0a189112020-11-17 14:58:32 +01001082 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04001083 foreach sym: accelerators
1084 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1085 config_target += { sym: 'y' }
1086 config_all += { sym: 'y' }
1087 if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
1088 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1089 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01001090 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04001091 endif
1092 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01001093 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001094 if default_targets
1095 continue
1096 endif
1097 error('No accelerator available for target @0@'.format(target))
1098 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001099
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001100 actual_target_dirs += target
Paolo Bonzini765686d2020-09-18 06:37:21 -04001101 config_target += keyval.load('default-configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001102 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001103
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001104 if 'TARGET_NEED_FDT' in config_target
1105 fdt_required += target
1106 endif
1107
Paolo Bonzinifa731682020-09-21 05:19:07 -04001108 # Add default keys
1109 if 'TARGET_BASE_ARCH' not in config_target
1110 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1111 endif
1112 if 'TARGET_ABI_DIR' not in config_target
1113 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1114 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001115
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001116 foreach k, v: disassemblers
1117 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1118 foreach sym: v
1119 config_target += { sym: 'y' }
1120 config_all_disas += { sym: 'y' }
1121 endforeach
1122 endif
1123 endforeach
1124
Paolo Bonzini859aef02020-08-04 18:14:26 +02001125 config_target_data = configuration_data()
1126 foreach k, v: config_target
1127 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1128 # do nothing
1129 elif ignored.contains(k)
1130 # do nothing
1131 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001132 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1133 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001134 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001135 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001136 config_target_data.set_quoted(k, v)
1137 elif v == 'y'
1138 config_target_data.set(k, 1)
1139 else
1140 config_target_data.set(k, v)
1141 endif
1142 endforeach
1143 config_target_h += {target: configure_file(output: target + '-config-target.h',
1144 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001145
1146 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001147 config_devices_mak = target + '-config-devices.mak'
1148 config_devices_mak = configure_file(
Paolo Bonzini1bb4cb12020-09-18 06:06:09 -04001149 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001150 output: config_devices_mak,
1151 depfile: config_devices_mak + '.d',
1152 capture: true,
1153 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
1154 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzini0a189112020-11-17 14:58:32 +01001155 host_kconfig, accel_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02001156
1157 config_devices_data = configuration_data()
1158 config_devices = keyval.load(config_devices_mak)
1159 foreach k, v: config_devices
1160 config_devices_data.set(k, 1)
1161 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001162 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001163 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1164 configuration: config_devices_data)}
1165 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001166 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001167 endif
1168 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001169endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001170target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001171
Paolo Bonzini2becc362020-02-03 11:42:03 +01001172# This configuration is used to build files that are shared by
1173# multiple binaries, and then extracted out of the "common"
1174# static_library target.
1175#
1176# We do not use all_sources()/all_dependencies(), because it would
1177# build literally all source files, including devices only used by
1178# targets that are not built for this compilation. The CONFIG_ALL
1179# pseudo symbol replaces it.
1180
Paolo Bonzini05512f52020-09-16 15:31:11 -04001181config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001182config_all += config_host
1183config_all += config_all_disas
1184config_all += {
1185 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1186 'CONFIG_SOFTMMU': have_system,
1187 'CONFIG_USER_ONLY': have_user,
1188 'CONFIG_ALL': true,
1189}
1190
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001191##############
1192# Submodules #
1193##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001194
1195capstone = not_found
1196capstone_opt = get_option('capstone')
1197if capstone_opt in ['enabled', 'auto', 'system']
1198 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07001199 capstone = dependency('capstone', version: '>=4.0',
1200 static: enable_static, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001201 required: capstone_opt == 'system' or
1202 capstone_opt == 'enabled' and not have_internal)
1203 if capstone.found()
1204 capstone_opt = 'system'
1205 elif have_internal
1206 capstone_opt = 'internal'
1207 else
1208 capstone_opt = 'disabled'
1209 endif
1210endif
1211if capstone_opt == 'internal'
1212 capstone_data = configuration_data()
1213 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1214
1215 capstone_files = files(
1216 'capstone/cs.c',
1217 'capstone/MCInst.c',
1218 'capstone/MCInstrDesc.c',
1219 'capstone/MCRegisterInfo.c',
1220 'capstone/SStream.c',
1221 'capstone/utils.c'
1222 )
1223
1224 if 'CONFIG_ARM_DIS' in config_all_disas
1225 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1226 capstone_files += files(
1227 'capstone/arch/ARM/ARMDisassembler.c',
1228 'capstone/arch/ARM/ARMInstPrinter.c',
1229 'capstone/arch/ARM/ARMMapping.c',
1230 'capstone/arch/ARM/ARMModule.c'
1231 )
1232 endif
1233
1234 # FIXME: This config entry currently depends on a c++ compiler.
1235 # Which is needed for building libvixl, but not for capstone.
1236 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1237 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1238 capstone_files += files(
1239 'capstone/arch/AArch64/AArch64BaseInfo.c',
1240 'capstone/arch/AArch64/AArch64Disassembler.c',
1241 'capstone/arch/AArch64/AArch64InstPrinter.c',
1242 'capstone/arch/AArch64/AArch64Mapping.c',
1243 'capstone/arch/AArch64/AArch64Module.c'
1244 )
1245 endif
1246
1247 if 'CONFIG_PPC_DIS' in config_all_disas
1248 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1249 capstone_files += files(
1250 'capstone/arch/PowerPC/PPCDisassembler.c',
1251 'capstone/arch/PowerPC/PPCInstPrinter.c',
1252 'capstone/arch/PowerPC/PPCMapping.c',
1253 'capstone/arch/PowerPC/PPCModule.c'
1254 )
1255 endif
1256
Richard Henderson3d562842020-01-04 07:24:59 +10001257 if 'CONFIG_S390_DIS' in config_all_disas
1258 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1259 capstone_files += files(
1260 'capstone/arch/SystemZ/SystemZDisassembler.c',
1261 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1262 'capstone/arch/SystemZ/SystemZMapping.c',
1263 'capstone/arch/SystemZ/SystemZModule.c',
1264 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1265 )
1266 endif
1267
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001268 if 'CONFIG_I386_DIS' in config_all_disas
1269 capstone_data.set('CAPSTONE_HAS_X86', 1)
1270 capstone_files += files(
1271 'capstone/arch/X86/X86Disassembler.c',
1272 'capstone/arch/X86/X86DisassemblerDecoder.c',
1273 'capstone/arch/X86/X86ATTInstPrinter.c',
1274 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07001275 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001276 'capstone/arch/X86/X86Mapping.c',
1277 'capstone/arch/X86/X86Module.c'
1278 )
1279 endif
1280
1281 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1282
1283 capstone_cargs = [
1284 # FIXME: There does not seem to be a way to completely replace the c_args
1285 # that come from add_project_arguments() -- we can only add to them.
1286 # So: disable all warnings with a big hammer.
1287 '-Wno-error', '-w',
1288
1289 # Include all configuration defines via a header file, which will wind up
1290 # as a dependency on the object file, and thus changes here will result
1291 # in a rebuild.
1292 '-include', 'capstone-defs.h'
1293 ]
1294
1295 libcapstone = static_library('capstone',
1296 sources: capstone_files,
1297 c_args: capstone_cargs,
1298 include_directories: 'capstone/include')
1299 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07001300 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001301endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001302
1303slirp = not_found
1304slirp_opt = 'disabled'
1305if have_system
1306 slirp_opt = get_option('slirp')
1307 if slirp_opt in ['enabled', 'auto', 'system']
1308 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
1309 slirp = dependency('slirp', static: enable_static,
1310 method: 'pkg-config',
1311 required: slirp_opt == 'system' or
1312 slirp_opt == 'enabled' and not have_internal)
1313 if slirp.found()
1314 slirp_opt = 'system'
1315 elif have_internal
1316 slirp_opt = 'internal'
1317 else
1318 slirp_opt = 'disabled'
1319 endif
1320 endif
1321 if slirp_opt == 'internal'
1322 slirp_deps = []
1323 if targetos == 'windows'
1324 slirp_deps = cc.find_library('iphlpapi')
1325 endif
1326 slirp_conf = configuration_data()
1327 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1328 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1329 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1330 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1331 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1332 slirp_files = [
1333 'slirp/src/arp_table.c',
1334 'slirp/src/bootp.c',
1335 'slirp/src/cksum.c',
1336 'slirp/src/dhcpv6.c',
1337 'slirp/src/dnssearch.c',
1338 'slirp/src/if.c',
1339 'slirp/src/ip6_icmp.c',
1340 'slirp/src/ip6_input.c',
1341 'slirp/src/ip6_output.c',
1342 'slirp/src/ip_icmp.c',
1343 'slirp/src/ip_input.c',
1344 'slirp/src/ip_output.c',
1345 'slirp/src/mbuf.c',
1346 'slirp/src/misc.c',
1347 'slirp/src/ncsi.c',
1348 'slirp/src/ndp_table.c',
1349 'slirp/src/sbuf.c',
1350 'slirp/src/slirp.c',
1351 'slirp/src/socket.c',
1352 'slirp/src/state.c',
1353 'slirp/src/stream.c',
1354 'slirp/src/tcp_input.c',
1355 'slirp/src/tcp_output.c',
1356 'slirp/src/tcp_subr.c',
1357 'slirp/src/tcp_timer.c',
1358 'slirp/src/tftp.c',
1359 'slirp/src/udp.c',
1360 'slirp/src/udp6.c',
1361 'slirp/src/util.c',
1362 'slirp/src/version.c',
1363 'slirp/src/vmstate.c',
1364 ]
1365
1366 configure_file(
1367 input : 'slirp/src/libslirp-version.h.in',
1368 output : 'libslirp-version.h',
1369 configuration: slirp_conf)
1370
1371 slirp_inc = include_directories('slirp', 'slirp/src')
1372 libslirp = static_library('slirp',
1373 sources: slirp_files,
1374 c_args: slirp_cargs,
1375 include_directories: slirp_inc)
1376 slirp = declare_dependency(link_with: libslirp,
1377 dependencies: slirp_deps,
1378 include_directories: slirp_inc)
1379 endif
1380endif
1381
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001382fdt = not_found
1383fdt_opt = get_option('fdt')
1384if have_system
1385 if fdt_opt in ['enabled', 'auto', 'system']
1386 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
1387 fdt = cc.find_library('fdt', static: enable_static,
1388 required: fdt_opt == 'system' or
1389 fdt_opt == 'enabled' and not have_internal)
1390 if fdt.found() and cc.links('''
1391 #include <libfdt.h>
1392 #include <libfdt_env.h>
1393 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1394 dependencies: fdt)
1395 fdt_opt = 'system'
1396 elif have_internal
1397 fdt_opt = 'internal'
1398 else
1399 fdt_opt = 'disabled'
1400 endif
1401 endif
1402 if fdt_opt == 'internal'
1403 fdt_files = files(
1404 'dtc/libfdt/fdt.c',
1405 'dtc/libfdt/fdt_ro.c',
1406 'dtc/libfdt/fdt_wip.c',
1407 'dtc/libfdt/fdt_sw.c',
1408 'dtc/libfdt/fdt_rw.c',
1409 'dtc/libfdt/fdt_strerror.c',
1410 'dtc/libfdt/fdt_empty_tree.c',
1411 'dtc/libfdt/fdt_addresses.c',
1412 'dtc/libfdt/fdt_overlay.c',
1413 'dtc/libfdt/fdt_check.c',
1414 )
1415
1416 fdt_inc = include_directories('dtc/libfdt')
1417 libfdt = static_library('fdt',
1418 sources: fdt_files,
1419 include_directories: fdt_inc)
1420 fdt = declare_dependency(link_with: libfdt,
1421 include_directories: fdt_inc)
1422 endif
1423endif
1424if not fdt.found() and fdt_required.length() > 0
1425 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1426endif
1427
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001428config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001429config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001430config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001431
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001432#####################
1433# Generated sources #
1434#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001435
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001436genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001437
Marc-André Lureau3f885652019-07-15 18:06:04 +04001438hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04001439shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001440qapi_gen = find_program('scripts/qapi-gen.py')
1441qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1442 meson.source_root() / 'scripts/qapi/commands.py',
1443 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001444 meson.source_root() / 'scripts/qapi/error.py',
1445 meson.source_root() / 'scripts/qapi/events.py',
1446 meson.source_root() / 'scripts/qapi/expr.py',
1447 meson.source_root() / 'scripts/qapi/gen.py',
1448 meson.source_root() / 'scripts/qapi/introspect.py',
1449 meson.source_root() / 'scripts/qapi/parser.py',
1450 meson.source_root() / 'scripts/qapi/schema.py',
1451 meson.source_root() / 'scripts/qapi/source.py',
1452 meson.source_root() / 'scripts/qapi/types.py',
1453 meson.source_root() / 'scripts/qapi/visit.py',
1454 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001455 meson.source_root() / 'scripts/qapi-gen.py'
1456]
1457
1458tracetool = [
1459 python, files('scripts/tracetool.py'),
1460 '--backend=' + config_host['TRACE_BACKENDS']
1461]
1462
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001463qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1464 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02001465 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001466qemu_version = custom_target('qemu-version.h',
1467 output: 'qemu-version.h',
1468 command: qemu_version_cmd,
1469 capture: true,
1470 build_by_default: true,
1471 build_always_stale: true)
1472genh += qemu_version
1473
Marc-André Lureau3f885652019-07-15 18:06:04 +04001474hxdep = []
1475hx_headers = [
1476 ['qemu-options.hx', 'qemu-options.def'],
1477 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1478]
1479if have_system
1480 hx_headers += [
1481 ['hmp-commands.hx', 'hmp-commands.h'],
1482 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1483 ]
1484endif
1485foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001486 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04001487 input: files(d[0]),
1488 output: d[1],
1489 capture: true,
1490 build_by_default: true, # to be removed when added to a target
1491 command: [hxtool, '-h', '@INPUT0@'])
1492endforeach
1493genh += hxdep
1494
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001495###################
1496# Collect sources #
1497###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001498
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001499authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001500blockdev_ss = ss.source_set()
1501block_ss = ss.source_set()
1502bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001503chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001504common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001505crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001506io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001507linux_user_ss = ss.source_set()
1508qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001509qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001510softmmu_ss = ss.source_set()
1511specific_fuzz_ss = ss.source_set()
1512specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001513stub_ss = ss.source_set()
1514trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001515user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001516util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001517
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001518modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001519hw_arch = {}
1520target_arch = {}
1521target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001522
1523###############
1524# Trace files #
1525###############
1526
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001527# TODO: add each directory to the subdirs from its own meson.build, once
1528# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001529trace_events_subdirs = [
1530 'accel/kvm',
1531 'accel/tcg',
1532 'crypto',
1533 'monitor',
1534]
1535if have_user
1536 trace_events_subdirs += [ 'linux-user' ]
1537endif
1538if have_block
1539 trace_events_subdirs += [
1540 'authz',
1541 'block',
1542 'io',
1543 'nbd',
1544 'scsi',
1545 ]
1546endif
1547if have_system
1548 trace_events_subdirs += [
1549 'audio',
1550 'backends',
1551 'backends/tpm',
1552 'chardev',
1553 'hw/9pfs',
1554 'hw/acpi',
1555 'hw/alpha',
1556 'hw/arm',
1557 'hw/audio',
1558 'hw/block',
1559 'hw/block/dataplane',
1560 'hw/char',
1561 'hw/display',
1562 'hw/dma',
1563 'hw/hppa',
1564 'hw/hyperv',
1565 'hw/i2c',
1566 'hw/i386',
1567 'hw/i386/xen',
1568 'hw/ide',
1569 'hw/input',
1570 'hw/intc',
1571 'hw/isa',
1572 'hw/mem',
1573 'hw/mips',
1574 'hw/misc',
1575 'hw/misc/macio',
1576 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08001577 'hw/net/can',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001578 'hw/nvram',
1579 'hw/pci',
1580 'hw/pci-host',
1581 'hw/ppc',
1582 'hw/rdma',
1583 'hw/rdma/vmw',
1584 'hw/rtc',
1585 'hw/s390x',
1586 'hw/scsi',
1587 'hw/sd',
1588 'hw/sparc',
1589 'hw/sparc64',
1590 'hw/ssi',
1591 'hw/timer',
1592 'hw/tpm',
1593 'hw/usb',
1594 'hw/vfio',
1595 'hw/virtio',
1596 'hw/watchdog',
1597 'hw/xen',
1598 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001599 'migration',
1600 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02001601 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001602 'ui',
1603 ]
1604endif
1605trace_events_subdirs += [
1606 'hw/core',
1607 'qapi',
1608 'qom',
1609 'target/arm',
1610 'target/hppa',
1611 'target/i386',
Claudio Fontanaa9dc68d2020-12-12 16:55:08 +01001612 'target/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001613 'target/mips',
1614 'target/ppc',
1615 'target/riscv',
1616 'target/s390x',
1617 'target/sparc',
1618 'util',
1619]
1620
Marc-André Lureau0df750e2020-11-25 14:06:37 +04001621vhost_user = not_found
1622if 'CONFIG_VHOST_USER' in config_host
1623 libvhost_user = subproject('libvhost-user')
1624 vhost_user = libvhost_user.get_variable('vhost_user_dep')
1625endif
1626
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001627subdir('qapi')
1628subdir('qobject')
1629subdir('stubs')
1630subdir('trace')
1631subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04001632subdir('qom')
1633subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001634subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04001635subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001636
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001637
1638if enable_modules
1639 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1640 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1641endif
1642
Paolo Bonzini2becc362020-02-03 11:42:03 +01001643stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001644
1645util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01001646util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001647libqemuutil = static_library('qemuutil',
1648 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonziniaa087962020-09-01 11:15:30 -04001649 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001650qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04001651 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001652
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001653decodetree = generator(find_program('scripts/decodetree.py'),
1654 output: 'decode-@BASENAME@.c.inc',
1655 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1656
Paolo Bonzini478e9432020-08-17 12:47:55 +02001657subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04001658subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04001659subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001660subdir('fsdev')
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001661subdir('libdecnumber')
Marc-André Lureaud3b18482019-08-17 14:55:32 +04001662subdir('target')
Marc-André Lureau708eab42019-09-03 16:59:33 +04001663subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001664
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001665block_ss.add(files(
1666 'block.c',
1667 'blockjob.c',
1668 'job.c',
1669 'qemu-io-cmds.c',
1670))
1671block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
1672
1673subdir('nbd')
1674subdir('scsi')
1675subdir('block')
1676
Paolo Bonzini4a963372020-08-03 16:22:28 +02001677blockdev_ss.add(files(
1678 'blockdev.c',
Stefan Hajnoczicbc20bf2020-09-29 13:55:15 +01001679 'blockdev-nbd.c',
Paolo Bonzini4a963372020-08-03 16:22:28 +02001680 'iothread.c',
1681 'job-qmp.c',
1682))
1683
1684# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1685# os-win32.c does not
1686blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1687softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
Paolo Bonzini4a963372020-08-03 16:22:28 +02001688
1689common_ss.add(files('cpus-common.c'))
1690
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001691subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001692
Richard Hendersonf3433462020-09-12 10:47:33 -07001693common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02001694specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001695specific_ss.add(files('exec-vary.c'))
1696specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1697 'fpu/softfloat.c',
1698 'tcg/optimize.c',
1699 'tcg/tcg-common.c',
1700 'tcg/tcg-op-gvec.c',
1701 'tcg/tcg-op-vec.c',
1702 'tcg/tcg-op.c',
1703 'tcg/tcg.c',
1704))
1705specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1706
Marc-André Lureauab318052019-07-24 19:23:16 +04001707subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04001708subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04001709subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001710subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001711subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04001712subdir('replay')
Marc-André Lureau582ea952019-08-15 15:15:32 +04001713subdir('hw')
Marc-André Lureau1a828782019-08-18 16:13:08 +04001714subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001715subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04001716subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04001717subdir('linux-user')
1718
Marc-André Lureaub309c322019-08-18 19:20:37 +04001719bsd_user_ss.add(files('gdbstub.c'))
1720specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1721
Marc-André Lureau3a304462019-08-18 16:13:08 +04001722linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1723specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001724
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001725# needed for fuzzing binaries
1726subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001727subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001728
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001729########################
1730# Library dependencies #
1731########################
1732
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001733block_mods = []
1734softmmu_mods = []
1735foreach d, list : modules
1736 foreach m, module_ss : list
1737 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02001738 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001739 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1740 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1741 if d == 'block'
1742 block_mods += sl
1743 else
1744 softmmu_mods += sl
1745 endif
1746 else
1747 if d == 'block'
1748 block_ss.add_all(module_ss)
1749 else
1750 softmmu_ss.add_all(module_ss)
1751 endif
1752 endif
1753 endforeach
1754endforeach
1755
1756nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08001757undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001758block_syms = custom_target('block.syms', output: 'block.syms',
1759 input: [libqemuutil, block_mods],
1760 capture: true,
1761 command: [undefsym, nm, '@INPUT@'])
1762qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1763 input: [libqemuutil, softmmu_mods],
1764 capture: true,
1765 command: [undefsym, nm, '@INPUT@'])
1766
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001767qom_ss = qom_ss.apply(config_host, strict: false)
1768libqom = static_library('qom', qom_ss.sources() + genh,
1769 dependencies: [qom_ss.dependencies()],
1770 name_suffix: 'fa')
1771
1772qom = declare_dependency(link_whole: libqom)
1773
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001774authz_ss = authz_ss.apply(config_host, strict: false)
1775libauthz = static_library('authz', authz_ss.sources() + genh,
1776 dependencies: [authz_ss.dependencies()],
1777 name_suffix: 'fa',
1778 build_by_default: false)
1779
1780authz = declare_dependency(link_whole: libauthz,
1781 dependencies: qom)
1782
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001783crypto_ss = crypto_ss.apply(config_host, strict: false)
1784libcrypto = static_library('crypto', crypto_ss.sources() + genh,
1785 dependencies: [crypto_ss.dependencies()],
1786 name_suffix: 'fa',
1787 build_by_default: false)
1788
1789crypto = declare_dependency(link_whole: libcrypto,
1790 dependencies: [authz, qom])
1791
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001792io_ss = io_ss.apply(config_host, strict: false)
1793libio = static_library('io', io_ss.sources() + genh,
1794 dependencies: [io_ss.dependencies()],
1795 link_with: libqemuutil,
1796 name_suffix: 'fa',
1797 build_by_default: false)
1798
1799io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
1800
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02001801libmigration = static_library('migration', sources: migration_files + genh,
1802 name_suffix: 'fa',
1803 build_by_default: false)
1804migration = declare_dependency(link_with: libmigration,
1805 dependencies: [zlib, qom, io])
1806softmmu_ss.add(migration)
1807
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001808block_ss = block_ss.apply(config_host, strict: false)
1809libblock = static_library('block', block_ss.sources() + genh,
1810 dependencies: block_ss.dependencies(),
1811 link_depends: block_syms,
1812 name_suffix: 'fa',
1813 build_by_default: false)
1814
1815block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001816 link_args: '@block.syms',
1817 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001818
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01001819blockdev_ss = blockdev_ss.apply(config_host, strict: false)
1820libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
1821 dependencies: blockdev_ss.dependencies(),
1822 name_suffix: 'fa',
1823 build_by_default: false)
1824
1825blockdev = declare_dependency(link_whole: [libblockdev],
1826 dependencies: [block])
1827
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001828qmp_ss = qmp_ss.apply(config_host, strict: false)
1829libqmp = static_library('qmp', qmp_ss.sources() + genh,
1830 dependencies: qmp_ss.dependencies(),
1831 name_suffix: 'fa',
1832 build_by_default: false)
1833
1834qmp = declare_dependency(link_whole: [libqmp])
1835
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001836libchardev = static_library('chardev', chardev_ss.sources() + genh,
1837 name_suffix: 'fa',
1838 build_by_default: false)
1839
1840chardev = declare_dependency(link_whole: libchardev)
1841
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02001842libhwcore = static_library('hwcore', sources: hwcore_files + genh,
1843 name_suffix: 'fa',
1844 build_by_default: false)
1845hwcore = declare_dependency(link_whole: libhwcore)
1846common_ss.add(hwcore)
1847
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02001848###########
1849# Targets #
1850###########
1851
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001852foreach m : block_mods + softmmu_mods
1853 shared_module(m.name(),
1854 name_prefix: '',
1855 link_whole: m,
1856 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001857 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001858endforeach
1859
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01001860softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001861common_ss.add(qom, qemuutil)
1862
1863common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01001864common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
1865
1866common_all = common_ss.apply(config_all, strict: false)
1867common_all = static_library('common',
1868 build_by_default: false,
1869 sources: common_all.sources() + genh,
1870 dependencies: common_all.dependencies(),
1871 name_suffix: 'fa')
1872
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001873feature_to_c = find_program('scripts/feature_to_c.sh')
1874
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04001875emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001876foreach target : target_dirs
1877 config_target = config_target_mak[target]
1878 target_name = config_target['TARGET_NAME']
1879 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001880 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001881 arch_deps = []
1882 c_args = ['-DNEED_CPU_H',
1883 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
1884 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04001885 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01001886
Paolo Bonzini859aef02020-08-04 18:14:26 +02001887 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01001888 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
1889 if targetos == 'linux'
1890 target_inc += include_directories('linux-headers', is_system: true)
1891 endif
1892 if target.endswith('-softmmu')
1893 qemu_target_name = 'qemu-system-' + target_name
1894 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001895 t = target_softmmu_arch[arch].apply(config_target, strict: false)
1896 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001897 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001898
Marc-André Lureau2c442202019-08-17 13:55:58 +04001899 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
1900 hw = hw_arch[hw_dir].apply(config_target, strict: false)
1901 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001902 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04001903
Paolo Bonzini2becc362020-02-03 11:42:03 +01001904 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001905 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001906 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04001907 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001908 target_type='user'
1909 qemu_target_name = 'qemu-' + target_name
1910 if 'CONFIG_LINUX_USER' in config_target
1911 base_dir = 'linux-user'
1912 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1913 else
1914 base_dir = 'bsd-user'
1915 endif
1916 target_inc += include_directories(
1917 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04001918 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001919 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04001920 if 'CONFIG_LINUX_USER' in config_target
1921 dir = base_dir / abi
1922 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1923 if config_target.has_key('TARGET_SYSTBL_ABI')
1924 arch_srcs += \
1925 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1926 extra_args : config_target['TARGET_SYSTBL_ABI'])
1927 endif
1928 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01001929 endif
1930
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001931 if 'TARGET_XML_FILES' in config_target
1932 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1933 output: target + '-gdbstub-xml.c',
1934 input: files(config_target['TARGET_XML_FILES'].split()),
1935 command: [feature_to_c, '@INPUT@'],
1936 capture: true)
1937 arch_srcs += gdbstub_xml
1938 endif
1939
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001940 t = target_arch[arch].apply(config_target, strict: false)
1941 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001942 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001943
Paolo Bonzini2becc362020-02-03 11:42:03 +01001944 target_common = common_ss.apply(config_target, strict: false)
1945 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001946 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001947
Paolo Bonzini2becc362020-02-03 11:42:03 +01001948 target_specific = specific_ss.apply(config_target, strict: false)
1949 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001950 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001951
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001952 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02001953 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001954 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001955 objects: objects,
1956 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001957 c_args: c_args,
1958 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001959 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001960
1961 if target.endswith('-softmmu')
1962 execs = [{
1963 'name': 'qemu-system-' + target_name,
1964 'gui': false,
1965 'sources': files('softmmu/main.c'),
1966 'dependencies': []
1967 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001968 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001969 execs += [{
1970 'name': 'qemu-system-' + target_name + 'w',
1971 'gui': true,
1972 'sources': files('softmmu/main.c'),
1973 'dependencies': []
1974 }]
1975 endif
1976 if config_host.has_key('CONFIG_FUZZ')
1977 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1978 execs += [{
1979 'name': 'qemu-fuzz-' + target_name,
1980 'gui': false,
1981 'sources': specific_fuzz.sources(),
1982 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001983 }]
1984 endif
1985 else
1986 execs = [{
1987 'name': 'qemu-' + target_name,
1988 'gui': false,
1989 'sources': [],
1990 'dependencies': []
1991 }]
1992 endif
1993 foreach exe: execs
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04001994 emulators += {exe['name']:
1995 executable(exe['name'], exe['sources'],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001996 install: true,
1997 c_args: c_args,
1998 dependencies: arch_deps + deps + exe['dependencies'],
1999 objects: lib.extract_all_objects(recursive: true),
2000 link_language: link_language,
2001 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
2002 link_args: link_args,
2003 gui_app: exe['gui'])
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002004 }
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002005
2006 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
2007 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002008 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
2009 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002010 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
2011 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
2012 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002013 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002014 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002015 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002016 capture: true,
2017 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002018 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002019 command: [
2020 tracetool, '--group=all', '--format=' + stp['fmt'],
2021 '--binary=' + stp['bin'],
2022 '--target-name=' + target_name,
2023 '--target-type=' + target_type,
2024 '--probe-prefix=qemu.' + target_type + '.' + target_name,
2025 '@INPUT@',
2026 ])
2027 endforeach
2028 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002029 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002030endforeach
2031
Paolo Bonzini931049b2020-02-05 09:44:24 +01002032# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002033
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002034if 'CONFIG_PLUGIN' in config_host
2035 install_headers('include/qemu/qemu-plugin.h')
2036endif
2037
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002038if 'CONFIG_GUEST_AGENT' in config_host
2039 subdir('qga')
2040endif
2041
Laurent Vivier9755c942020-08-24 17:24:30 +02002042# Don't build qemu-keymap if xkbcommon is not explicitly enabled
2043# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002044if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04002045 # used for the update-keymaps target, so include rules even if !have_tools
2046 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
2047 dependencies: [qemuutil, xkbcommon], install: have_tools)
2048endif
2049
Paolo Bonzini931049b2020-02-05 09:44:24 +01002050if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002051 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
2052 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
2053 qemu_io = executable('qemu-io', files('qemu-io.c'),
2054 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01002055 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Stefan Hajnoczicbc20bf2020-09-29 13:55:15 +01002056 dependencies: [blockdev, qemuutil], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002057
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02002058 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002059 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04002060 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002061
Marc-André Lureau157e7b12019-07-15 14:50:58 +04002062 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
2063 dependencies: qemuutil,
2064 install: true)
2065
Paolo Bonzini931049b2020-02-05 09:44:24 +01002066 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02002067 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002068 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04002069 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02002070 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01002071 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002072
2073 if targetos == 'linux'
2074 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2075 dependencies: [qemuutil, libcap_ng],
2076 install: true,
2077 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002078
2079 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2080 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002081 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002082 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002083 endif
2084
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04002085 if 'CONFIG_IVSHMEM' in config_host
2086 subdir('contrib/ivshmem-client')
2087 subdir('contrib/ivshmem-server')
2088 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01002089endif
2090
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04002091subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002092subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04002093subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02002094subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08002095subdir('tests')
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04002096if 'CONFIG_GTK' in config_host
2097 subdir('po')
2098endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002099
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002100if host_machine.system() == 'windows'
2101 nsis_cmd = [
2102 find_program('scripts/nsis.py'),
2103 '@OUTPUT@',
2104 get_option('prefix'),
2105 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01002106 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002107 '--',
2108 '-DDISPLAYVERSION=' + meson.project_version(),
2109 ]
2110 if build_docs
2111 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2112 endif
2113 if 'CONFIG_GTK' in config_host
2114 nsis_cmd += '-DCONFIG_GTK=y'
2115 endif
2116
2117 nsis = custom_target('nsis',
2118 output: 'qemu-setup-' + meson.project_version() + '.exe',
2119 input: files('qemu.nsi'),
2120 build_always_stale: true,
2121 command: nsis_cmd + ['@INPUT@'])
2122 alias_target('installer', nsis)
2123endif
2124
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002125#########################
2126# Configuration summary #
2127#########################
2128
Paolo Bonzinif9332752020-02-03 13:28:38 +01002129summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002130summary_info += {'Install prefix': get_option('prefix')}
2131summary_info += {'BIOS directory': qemu_datadir}
2132summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2133summary_info += {'binary directory': get_option('bindir')}
2134summary_info += {'library directory': get_option('libdir')}
2135summary_info += {'module directory': qemu_moddir}
2136summary_info += {'libexec directory': get_option('libexecdir')}
2137summary_info += {'include directory': get_option('includedir')}
2138summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002139if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002140 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04002141 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002142else
2143 summary_info += {'local state directory': 'queried at runtime'}
2144endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04002145summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002146summary_info += {'Build directory': meson.current_build_dir()}
2147summary_info += {'Source path': meson.current_source_dir()}
2148summary_info += {'GIT binary': config_host['GIT']}
2149summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
2150summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
2151summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
2152if link_language == 'cpp'
2153 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
2154else
2155 summary_info += {'C++ compiler': false}
2156endif
2157if targetos == 'darwin'
2158 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
2159endif
2160summary_info += {'ARFLAGS': config_host['ARFLAGS']}
Paolo Bonzini47b30832020-09-23 05:26:17 -04002161summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2162 + ['-O' + get_option('optimization')]
2163 + (get_option('debug') ? ['-g'] : []))}
2164if link_language == 'cpp'
2165 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2166 + ['-O' + get_option('optimization')]
2167 + (get_option('debug') ? ['-g'] : []))}
2168endif
2169link_args = get_option(link_language + '_link_args')
2170if link_args.length() > 0
2171 summary_info += {'LDFLAGS': ' '.join(link_args)}
2172endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002173summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2174summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
2175summary_info += {'make': config_host['MAKE']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002176summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Yonggang Luoe3667662020-10-16 06:06:25 +08002177summary_info += {'sphinx-build': sphinx_build.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002178summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2179# TODO: add back version
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002180summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
2181if slirp_opt != 'disabled'
Paolo Bonzinif9332752020-02-03 13:28:38 +01002182 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2183endif
2184summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2185if config_host.has_key('CONFIG_MODULES')
2186 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2187endif
2188summary_info += {'host CPU': cpu}
2189summary_info += {'host endianness': build_machine.endian()}
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002190summary_info += {'target list': ' '.join(target_dirs)}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002191summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
Paolo Bonzinideb62372020-09-01 07:51:16 -04002192summary_info += {'sparse enabled': sparse.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002193summary_info += {'strip binaries': get_option('strip')}
2194summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05002195summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02002196summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002197if targetos == 'darwin'
2198 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
2199endif
2200# TODO: add back version
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002201summary_info += {'SDL support': sdl.found()}
2202summary_info += {'SDL image support': sdl_image.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002203# TODO: add back version
2204summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
2205summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002206summary_info += {'pixman': pixman.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002207# TODO: add back version
2208summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
2209summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
2210summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
2211# TODO: add back version
2212summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
2213if config_host.has_key('CONFIG_GCRYPT')
2214 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
2215 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2216endif
2217# TODO: add back version
2218summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
2219if config_host.has_key('CONFIG_NETTLE')
2220 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2221endif
2222summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
2223summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
Yonggang Luo5285e592020-10-13 07:43:48 +08002224summary_info += {'iconv support': iconv.found()}
2225summary_info += {'curses support': curses.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002226# TODO: add back version
2227summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002228summary_info += {'curl support': curl.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002229summary_info += {'mingw32 support': targetos == 'windows'}
2230summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2231summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2232summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
2233summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
Misono Tomohirocece1162020-10-08 19:31:33 +09002234summary_info += {'build virtiofs daemon': have_virtiofsd}
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002235summary_info += {'Multipath support': mpathpersist.found()}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002236summary_info += {'VNC support': vnc.found()}
2237if vnc.found()
2238 summary_info += {'VNC SASL support': sasl.found()}
2239 summary_info += {'VNC JPEG support': jpeg.found()}
2240 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002241endif
2242summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2243if config_host.has_key('CONFIG_XEN_BACKEND')
2244 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2245endif
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002246summary_info += {'brlapi support': brlapi.found()}
Yonggang Luoe3667662020-10-16 06:06:25 +08002247summary_info += {'Documentation': build_docs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002248summary_info += {'PIE': get_option('b_pie')}
2249summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2250summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2251summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2252summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
2253summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
Paolo Bonzinic8d54502020-10-16 03:32:52 -04002254summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini05512f52020-09-16 15:31:11 -04002255summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2256summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2257summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2258summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
2259summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2260if config_all.has_key('CONFIG_TCG')
2261 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
2262 summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
2263endif
Paolo Bonziniaa087962020-09-01 11:15:30 -04002264summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002265summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2266summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002267summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002268summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
2269summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
2270summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2271summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2272summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2273summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
2274summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
Thomas Huthb54b82d2020-11-09 09:59:06 +01002275summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002276summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2277summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2278summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2279summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
Thomas Huthb54b82d2020-11-09 09:59:06 +01002280summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002281summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002282summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2283summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2284summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2285if config_host['TRACE_BACKENDS'].split().contains('simple')
2286 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2287endif
2288# TODO: add back protocol and server version
2289summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
2290summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
2291summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
2292summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02002293summary_info += {'U2F support': u2f.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002294summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
2295summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
2296summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
2297summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002298summary_info += {'libiscsi support': libiscsi.found()}
Paolo Bonzini30045c02020-11-17 13:11:25 +01002299summary_info += {'libnfs support': libnfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002300summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2301if targetos == 'windows'
2302 if 'WIN_SDK' in config_host
2303 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2304 endif
2305 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2306 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Stefan Hajnoczi4bad7c32020-09-14 10:52:31 +01002307 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002308endif
2309summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
Daniele Buono9e62ba42020-12-04 18:06:14 -05002310summary_info += {'CFI support': get_option('cfi')}
2311summary_info += {'CFI debug support': get_option('cfi_debug')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002312summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2313summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2314summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2315summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2316summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002317summary_info += {'GlusterFS support': glusterfs.found()}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +04002318summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002319summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2320summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
2321summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2322summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
2323summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
2324summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
Paolo Bonzini29ba6112020-11-17 13:07:52 +01002325summary_info += {'bzip2 support': libbzip2.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002326summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
2327summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
2328summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2329summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
Paolo Bonziniaa087962020-09-01 11:15:30 -04002330summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002331summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2332summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2333summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2334summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2335summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2336summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2337summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2338summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2339summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2340summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2341summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2342summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002343summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002344summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2345summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002346summary_info += {'libudev': libudev.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002347summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
2348summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2349summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2350if config_host.has_key('HAVE_GDB_BIN')
2351 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2352endif
2353summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2354summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2355summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
Max Reitza484a712020-10-27 20:05:41 +01002356summary_info += {'FUSE exports': fuse.found()}
Max Reitzdf4ea702020-10-27 20:05:46 +01002357summary_info += {'FUSE lseek': fuse_lseek.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002358summary(summary_info, bool_yn: true)
2359
2360if not supported_cpus.contains(cpu)
2361 message()
2362 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2363 message()
2364 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2365 message('The QEMU project intends to remove support for this host CPU in')
2366 message('a future release if nobody volunteers to maintain it and to')
2367 message('provide a build host for our continuous integration setup.')
2368 message('configure has succeeded and you can continue to build, but')
2369 message('if you care about QEMU on this platform you should contact')
2370 message('us upstream at qemu-devel@nongnu.org.')
2371endif
2372
2373if not supported_oses.contains(targetos)
2374 message()
2375 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2376 message()
2377 message('Host OS ' + targetos + 'support is not currently maintained.')
2378 message('The QEMU project intends to remove support for this host OS in')
2379 message('a future release if nobody volunteers to maintain it and to')
2380 message('provide a build host for our continuous integration setup.')
2381 message('configure has succeeded and you can continue to build, but')
2382 message('if you care about QEMU on this platform you should contact')
2383 message('us upstream at qemu-devel@nongnu.org.')
2384endif