blob: 88614347215d1f1d3dfb6a0d2cf76f6f563065c8 [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
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100619if not get_option('rbd').auto() or have_block
620 librados = cc.find_library('rados', required: get_option('rbd'),
621 static: enable_static)
622 librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'],
623 required: get_option('rbd'),
624 static: enable_static)
625 if librados.found() and librbd.found() and cc.links('''
626 #include <stdio.h>
627 #include <rbd/librbd.h>
628 int main(void) {
629 rados_t cluster;
630 rados_create(&cluster, NULL);
631 return 0;
632 }''', dependencies: [librbd, librados])
633 rbd = declare_dependency(dependencies: [librbd, librados])
634 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400635endif
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100636
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400637glusterfs = not_found
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100638glusterfs_ftruncate_has_stat = false
639glusterfs_iocb_has_stat = false
640if not get_option('glusterfs').auto() or have_block
641 glusterfs = dependency('glusterfs-api', version: '>=3',
642 required: get_option('glusterfs'),
643 method: 'pkg-config', static: enable_static)
644 if glusterfs.found()
645 glusterfs_ftruncate_has_stat = cc.links('''
646 #include <glusterfs/api/glfs.h>
647
648 int
649 main(void)
650 {
651 /* new glfs_ftruncate() passes two additional args */
652 return glfs_ftruncate(NULL, 0, NULL, NULL);
653 }
654 ''', dependencies: glusterfs)
655 glusterfs_iocb_has_stat = cc.links('''
656 #include <glusterfs/api/glfs.h>
657
658 /* new glfs_io_cbk() passes two additional glfs_stat structs */
659 static void
660 glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data)
661 {}
662
663 int
664 main(void)
665 {
666 glfs_io_cbk iocb = &glusterfs_iocb;
667 iocb(NULL, 0 , NULL, NULL, NULL);
668 return 0;
669 }
670 ''', dependencies: glusterfs)
671 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400672endif
673libssh = not_found
674if 'CONFIG_LIBSSH' in config_host
675 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
676 link_args: config_host['LIBSSH_LIBS'].split())
677endif
678libbzip2 = not_found
Paolo Bonzini29ba6112020-11-17 13:07:52 +0100679if not get_option('bzip2').auto() or have_block
680 libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'],
681 required: get_option('bzip2'),
682 static: enable_static)
683 if libbzip2.found() and not cc.links('''
684 #include <bzlib.h>
685 int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2)
686 libbzip2 = not_found
687 if get_option('bzip2').enabled()
688 error('could not link libbzip2')
689 else
690 warning('could not link libbzip2, disabling')
691 endif
692 endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400693endif
694liblzfse = not_found
695if 'CONFIG_LZFSE' in config_host
696 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
697endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200698oss = not_found
699if 'CONFIG_AUDIO_OSS' in config_host
700 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
701endif
702dsound = not_found
703if 'CONFIG_AUDIO_DSOUND' in config_host
704 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
705endif
706coreaudio = not_found
707if 'CONFIG_AUDIO_COREAUDIO' in config_host
708 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
709endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400710opengl = not_found
711if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400712 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
713 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400714endif
715gtk = not_found
716if 'CONFIG_GTK' in config_host
717 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
718 link_args: config_host['GTK_LIBS'].split())
719endif
720vte = not_found
721if 'CONFIG_VTE' in config_host
722 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
723 link_args: config_host['VTE_LIBS'].split())
724endif
725x11 = not_found
726if 'CONFIG_X11' in config_host
727 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
728 link_args: config_host['X11_LIBS'].split())
729endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100730vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400731png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400732jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400733sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100734if get_option('vnc').enabled()
735 vnc = declare_dependency() # dummy dependency
736 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400737 method: 'pkg-config', static: enable_static)
Paolo Bonzini8e242b32020-11-23 13:34:02 -0500738 jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'),
739 method: 'pkg-config', static: enable_static)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100740 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
741 required: get_option('vnc_sasl'),
742 static: enable_static)
743 if sasl.found()
744 sasl = declare_dependency(dependencies: sasl,
745 compile_args: '-DSTRUCT_IOVEC_DEFINED')
746 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400747endif
Paolo Bonzini241611e2020-11-17 13:32:34 +0100748
Marc-André Lureau708eab42019-09-03 16:59:33 +0400749snappy = not_found
Paolo Bonzini241611e2020-11-17 13:32:34 +0100750if not get_option('snappy').auto() or have_system
751 snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'],
752 required: get_option('snappy'),
753 static: enable_static)
754endif
755if snappy.found() and not cc.links('''
756 #include <snappy-c.h>
757 int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy)
758 snappy = not_found
759 if get_option('snappy').enabled()
760 error('could not link libsnappy')
761 else
762 warning('could not link libsnappy, disabling')
763 endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400764endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100765
Marc-André Lureau708eab42019-09-03 16:59:33 +0400766lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100767if not get_option('lzo').auto() or have_system
768 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
769 required: get_option('lzo'),
770 static: enable_static)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400771endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100772if lzo.found() and not cc.links('''
773 #include <lzo/lzo1x.h>
774 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
775 lzo = not_found
776 if get_option('lzo').enabled()
777 error('could not link liblzo2')
778 else
779 warning('could not link liblzo2, disabling')
780 endif
781endif
782
Marc-André Lureau55166232019-07-24 19:16:22 +0400783rdma = not_found
784if 'CONFIG_RDMA' in config_host
785 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
786endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400787numa = not_found
788if 'CONFIG_NUMA' in config_host
789 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
790endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400791xen = not_found
792if 'CONFIG_XEN_BACKEND' in config_host
793 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
794 link_args: config_host['XEN_LIBS'].split())
795endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200796cacard = not_found
797if 'CONFIG_SMARTCARD' in config_host
798 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
799 link_args: config_host['SMARTCARD_LIBS'].split())
800endif
César Belley0a40bcb2020-08-26 13:42:04 +0200801u2f = not_found
802if have_system
803 u2f = dependency('u2f-emu', required: get_option('u2f'),
804 method: 'pkg-config',
805 static: enable_static)
806endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200807usbredir = not_found
808if 'CONFIG_USB_REDIR' in config_host
809 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
810 link_args: config_host['USB_REDIR_LIBS'].split())
811endif
812libusb = not_found
813if 'CONFIG_USB_LIBUSB' in config_host
814 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
815 link_args: config_host['LIBUSB_LIBS'].split())
816endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400817libpmem = not_found
818if 'CONFIG_LIBPMEM' in config_host
819 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
820 link_args: config_host['LIBPMEM_LIBS'].split())
821endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600822libdaxctl = not_found
823if 'CONFIG_LIBDAXCTL' in config_host
824 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
825endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +0400826tasn1 = not_found
827if 'CONFIG_TASN1' in config_host
828 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
829 link_args: config_host['TASN1_LIBS'].split())
830endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400831keyutils = dependency('libkeyutils', required: false,
832 method: 'pkg-config', static: enable_static)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400833
Marc-André Lureau3909def2020-08-28 15:07:33 +0400834has_gettid = cc.has_function('gettid')
835
Paolo Bonziniaa087962020-09-01 11:15:30 -0400836# Malloc tests
837
838malloc = []
839if get_option('malloc') == 'system'
840 has_malloc_trim = \
841 not get_option('malloc_trim').disabled() and \
842 cc.links('''#include <malloc.h>
843 int main(void) { malloc_trim(0); return 0; }''')
844else
845 has_malloc_trim = false
846 malloc = cc.find_library(get_option('malloc'), required: true)
847endif
848if not has_malloc_trim and get_option('malloc_trim').enabled()
849 if get_option('malloc') == 'system'
850 error('malloc_trim not available on this platform.')
851 else
852 error('malloc_trim not available with non-libc memory allocator')
853 endif
854endif
855
Max Reitz84e319a2020-11-02 17:18:55 +0100856# Check whether the glibc provides statx()
857
858statx_test = '''
859 #ifndef _GNU_SOURCE
860 #define _GNU_SOURCE
861 #endif
862 #include <sys/stat.h>
863 int main(void) {
864 struct statx statxbuf;
865 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
866 return 0;
867 }'''
868
869has_statx = cc.links(statx_test)
870
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000871have_vhost_user_blk_server = (targetos == 'linux' and
872 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000873
874if get_option('vhost_user_blk_server').enabled()
875 if targetos != 'linux'
876 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000877 elif 'CONFIG_VHOST_USER' not in config_host
878 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000879 endif
880elif get_option('vhost_user_blk_server').disabled() or not have_system
881 have_vhost_user_blk_server = false
882endif
883
Daniele Buono9e62ba42020-12-04 18:06:14 -0500884
Max Reitzdf4ea702020-10-27 20:05:46 +0100885if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
886 error('Cannot enable fuse-lseek while fuse is disabled')
887endif
888
Max Reitza484a712020-10-27 20:05:41 +0100889fuse = dependency('fuse3', required: get_option('fuse'),
890 version: '>=3.1', method: 'pkg-config',
891 static: enable_static)
892
Max Reitzdf4ea702020-10-27 20:05:46 +0100893fuse_lseek = not_found
894if not get_option('fuse_lseek').disabled()
895 if fuse.version().version_compare('>=3.8')
896 # Dummy dependency
897 fuse_lseek = declare_dependency()
898 elif get_option('fuse_lseek').enabled()
899 if fuse.found()
900 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
901 else
902 error('fuse-lseek requires libfuse, which was not found')
903 endif
904 endif
905endif
906
Daniele Buono9e62ba42020-12-04 18:06:14 -0500907if get_option('cfi')
908 cfi_flags=[]
909 # Check for dependency on LTO
910 if not get_option('b_lto')
911 error('Selected Control-Flow Integrity but LTO is disabled')
912 endif
913 if config_host.has_key('CONFIG_MODULES')
914 error('Selected Control-Flow Integrity is not compatible with modules')
915 endif
916 # Check for cfi flags. CFI requires LTO so we can't use
917 # get_supported_arguments, but need a more complex "compiles" which allows
918 # custom arguments
919 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
920 args: ['-flto', '-fsanitize=cfi-icall'] )
921 cfi_flags += '-fsanitize=cfi-icall'
922 else
923 error('-fsanitize=cfi-icall is not supported by the compiler')
924 endif
925 if cc.compiles('int main () { return 0; }',
926 name: '-fsanitize-cfi-icall-generalize-pointers',
927 args: ['-flto', '-fsanitize=cfi-icall',
928 '-fsanitize-cfi-icall-generalize-pointers'] )
929 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
930 else
931 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
932 endif
933 if get_option('cfi_debug')
934 if cc.compiles('int main () { return 0; }',
935 name: '-fno-sanitize-trap=cfi-icall',
936 args: ['-flto', '-fsanitize=cfi-icall',
937 '-fno-sanitize-trap=cfi-icall'] )
938 cfi_flags += '-fno-sanitize-trap=cfi-icall'
939 else
940 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
941 endif
942 endif
943 add_project_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
944 add_project_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
945endif
946
Paolo Bonzinia0c91622020-10-07 11:01:51 -0400947#################
948# config-host.h #
949#################
Paolo Bonzini859aef02020-08-04 18:14:26 +0200950
Paolo Bonzini16bf7a32020-10-16 03:19:14 -0400951config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
952config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
953config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
954config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
955config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
956config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
957config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
958config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
959config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
960config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
961config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
962config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
963
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100964config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400965config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200966config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100967config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200968config_host_data.set('CONFIG_MPATH', mpathpersist.found())
969config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100970config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +0800971config_host_data.set('CONFIG_CURSES', curses.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100972config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
973if glusterfs.found()
974 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
975 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
976 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
977 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
978 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
979 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
980endif
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100981config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +0100982config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100983config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100984config_host_data.set('CONFIG_SDL', sdl.found())
985config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzini241611e2020-11-17 13:32:34 +0100986config_host_data.set('CONFIG_SNAPPY', snappy.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000987config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100988config_host_data.set('CONFIG_VNC', vnc.found())
989config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
990config_host_data.set('CONFIG_VNC_PNG', png.found())
991config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +0200992config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400993config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +0400994config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonziniaa087962020-09-01 11:15:30 -0400995config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +0100996config_host_data.set('CONFIG_STATX', has_statx)
Max Reitza484a712020-10-27 20:05:41 +0100997config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +0100998config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Daniele Buono9e62ba42020-12-04 18:06:14 -0500999config_host_data.set('CONFIG_CFI', get_option('cfi'))
Paolo Bonzini859aef02020-08-04 18:14:26 +02001000config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
1001config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
1002config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
1003config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
1004
Thomas Huth48f670e2020-11-18 18:10:52 +01001005config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +01001006config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +01001007config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001008config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +01001009config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Thomas Huth88c78f12020-11-18 18:10:50 +01001010config_host_data.set('HAVE_SYS_SIGNAL_H', cc.has_header('sys/signal.h'))
Thomas Huthded5d782020-11-14 11:10:11 +01001011
Paolo Bonzini765686d2020-09-18 06:37:21 -04001012ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
Paolo Bonzini859aef02020-08-04 18:14:26 +02001013arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001014strings = ['HOST_DSOSUF', 'CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001015foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -04001016 if ignored.contains(k)
1017 # do nothing
1018 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001019 if v != ''
1020 v = '"' + '", "'.join(v.split()) + '", '
1021 endif
1022 config_host_data.set(k, v)
1023 elif k == 'ARCH'
1024 config_host_data.set('HOST_' + v.to_upper(), 1)
1025 elif strings.contains(k)
1026 if not k.startswith('CONFIG_')
1027 k = 'CONFIG_' + k.to_upper()
1028 endif
1029 config_host_data.set_quoted(k, v)
1030 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
1031 config_host_data.set(k, v == 'y' ? 1 : v)
1032 endif
1033endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02001034
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001035########################
1036# Target configuration #
1037########################
1038
Paolo Bonzini2becc362020-02-03 11:42:03 +01001039minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04001040config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001041config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001042config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001043config_devices_mak_list = []
1044config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02001045config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001046config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001047
1048disassemblers = {
1049 'alpha' : ['CONFIG_ALPHA_DIS'],
1050 'arm' : ['CONFIG_ARM_DIS'],
1051 'avr' : ['CONFIG_AVR_DIS'],
1052 'cris' : ['CONFIG_CRIS_DIS'],
1053 'hppa' : ['CONFIG_HPPA_DIS'],
1054 'i386' : ['CONFIG_I386_DIS'],
1055 'x86_64' : ['CONFIG_I386_DIS'],
1056 'x32' : ['CONFIG_I386_DIS'],
1057 'lm32' : ['CONFIG_LM32_DIS'],
1058 'm68k' : ['CONFIG_M68K_DIS'],
1059 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1060 'mips' : ['CONFIG_MIPS_DIS'],
1061 'moxie' : ['CONFIG_MOXIE_DIS'],
1062 'nios2' : ['CONFIG_NIOS2_DIS'],
1063 'or1k' : ['CONFIG_OPENRISC_DIS'],
1064 'ppc' : ['CONFIG_PPC_DIS'],
1065 'riscv' : ['CONFIG_RISCV_DIS'],
1066 'rx' : ['CONFIG_RX_DIS'],
1067 's390' : ['CONFIG_S390_DIS'],
1068 'sh4' : ['CONFIG_SH4_DIS'],
1069 'sparc' : ['CONFIG_SPARC_DIS'],
1070 'xtensa' : ['CONFIG_XTENSA_DIS'],
1071}
1072if link_language == 'cpp'
1073 disassemblers += {
1074 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1075 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1076 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1077 }
1078endif
1079
Paolo Bonzini0a189112020-11-17 14:58:32 +01001080host_kconfig = \
1081 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
1082 ('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
1083 ('CONFIG_IVSHMEM' in config_host ? ['CONFIG_IVSHMEM=y'] : []) + \
1084 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
1085 ('CONFIG_X11' in config_host ? ['CONFIG_X11=y'] : []) + \
1086 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1087 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1088 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
1089 ('CONFIG_VIRTFS' in config_host ? ['CONFIG_VIRTFS=y'] : []) + \
1090 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
1091 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : [])
1092
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001093ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001094
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001095default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1096actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001097fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001098foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04001099 config_target = { 'TARGET_NAME': target.split('-')[0] }
1100 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001101 if targetos != 'linux'
1102 if default_targets
1103 continue
1104 endif
1105 error('Target @0@ is only available on a Linux host'.format(target))
1106 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001107 config_target += { 'CONFIG_LINUX_USER': 'y' }
1108 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001109 if 'CONFIG_BSD' not in config_host
1110 if default_targets
1111 continue
1112 endif
1113 error('Target @0@ is only available on a BSD host'.format(target))
1114 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001115 config_target += { 'CONFIG_BSD_USER': 'y' }
1116 elif target.endswith('softmmu')
1117 config_target += { 'CONFIG_SOFTMMU': 'y' }
1118 endif
1119 if target.endswith('-user')
1120 config_target += {
1121 'CONFIG_USER_ONLY': 'y',
1122 'CONFIG_QEMU_INTERP_PREFIX':
1123 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1124 }
1125 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001126
Paolo Bonzini0a189112020-11-17 14:58:32 +01001127 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04001128 foreach sym: accelerators
1129 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1130 config_target += { sym: 'y' }
1131 config_all += { sym: 'y' }
1132 if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
1133 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1134 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01001135 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04001136 endif
1137 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01001138 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001139 if default_targets
1140 continue
1141 endif
1142 error('No accelerator available for target @0@'.format(target))
1143 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001144
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001145 actual_target_dirs += target
Paolo Bonzini765686d2020-09-18 06:37:21 -04001146 config_target += keyval.load('default-configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001147 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001148
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001149 if 'TARGET_NEED_FDT' in config_target
1150 fdt_required += target
1151 endif
1152
Paolo Bonzinifa731682020-09-21 05:19:07 -04001153 # Add default keys
1154 if 'TARGET_BASE_ARCH' not in config_target
1155 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1156 endif
1157 if 'TARGET_ABI_DIR' not in config_target
1158 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1159 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001160
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001161 foreach k, v: disassemblers
1162 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1163 foreach sym: v
1164 config_target += { sym: 'y' }
1165 config_all_disas += { sym: 'y' }
1166 endforeach
1167 endif
1168 endforeach
1169
Paolo Bonzini859aef02020-08-04 18:14:26 +02001170 config_target_data = configuration_data()
1171 foreach k, v: config_target
1172 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1173 # do nothing
1174 elif ignored.contains(k)
1175 # do nothing
1176 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001177 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1178 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001179 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001180 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001181 config_target_data.set_quoted(k, v)
1182 elif v == 'y'
1183 config_target_data.set(k, 1)
1184 else
1185 config_target_data.set(k, v)
1186 endif
1187 endforeach
1188 config_target_h += {target: configure_file(output: target + '-config-target.h',
1189 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001190
1191 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001192 config_devices_mak = target + '-config-devices.mak'
1193 config_devices_mak = configure_file(
Paolo Bonzini1bb4cb12020-09-18 06:06:09 -04001194 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001195 output: config_devices_mak,
1196 depfile: config_devices_mak + '.d',
1197 capture: true,
1198 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
1199 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzini0a189112020-11-17 14:58:32 +01001200 host_kconfig, accel_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02001201
1202 config_devices_data = configuration_data()
1203 config_devices = keyval.load(config_devices_mak)
1204 foreach k, v: config_devices
1205 config_devices_data.set(k, 1)
1206 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001207 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001208 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1209 configuration: config_devices_data)}
1210 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001211 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001212 endif
1213 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001214endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001215target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001216
Paolo Bonzini2becc362020-02-03 11:42:03 +01001217# This configuration is used to build files that are shared by
1218# multiple binaries, and then extracted out of the "common"
1219# static_library target.
1220#
1221# We do not use all_sources()/all_dependencies(), because it would
1222# build literally all source files, including devices only used by
1223# targets that are not built for this compilation. The CONFIG_ALL
1224# pseudo symbol replaces it.
1225
Paolo Bonzini05512f52020-09-16 15:31:11 -04001226config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001227config_all += config_host
1228config_all += config_all_disas
1229config_all += {
1230 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1231 'CONFIG_SOFTMMU': have_system,
1232 'CONFIG_USER_ONLY': have_user,
1233 'CONFIG_ALL': true,
1234}
1235
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001236##############
1237# Submodules #
1238##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001239
1240capstone = not_found
1241capstone_opt = get_option('capstone')
1242if capstone_opt in ['enabled', 'auto', 'system']
1243 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07001244 capstone = dependency('capstone', version: '>=4.0',
1245 static: enable_static, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001246 required: capstone_opt == 'system' or
1247 capstone_opt == 'enabled' and not have_internal)
1248 if capstone.found()
1249 capstone_opt = 'system'
1250 elif have_internal
1251 capstone_opt = 'internal'
1252 else
1253 capstone_opt = 'disabled'
1254 endif
1255endif
1256if capstone_opt == 'internal'
1257 capstone_data = configuration_data()
1258 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1259
1260 capstone_files = files(
1261 'capstone/cs.c',
1262 'capstone/MCInst.c',
1263 'capstone/MCInstrDesc.c',
1264 'capstone/MCRegisterInfo.c',
1265 'capstone/SStream.c',
1266 'capstone/utils.c'
1267 )
1268
1269 if 'CONFIG_ARM_DIS' in config_all_disas
1270 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1271 capstone_files += files(
1272 'capstone/arch/ARM/ARMDisassembler.c',
1273 'capstone/arch/ARM/ARMInstPrinter.c',
1274 'capstone/arch/ARM/ARMMapping.c',
1275 'capstone/arch/ARM/ARMModule.c'
1276 )
1277 endif
1278
1279 # FIXME: This config entry currently depends on a c++ compiler.
1280 # Which is needed for building libvixl, but not for capstone.
1281 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1282 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1283 capstone_files += files(
1284 'capstone/arch/AArch64/AArch64BaseInfo.c',
1285 'capstone/arch/AArch64/AArch64Disassembler.c',
1286 'capstone/arch/AArch64/AArch64InstPrinter.c',
1287 'capstone/arch/AArch64/AArch64Mapping.c',
1288 'capstone/arch/AArch64/AArch64Module.c'
1289 )
1290 endif
1291
1292 if 'CONFIG_PPC_DIS' in config_all_disas
1293 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1294 capstone_files += files(
1295 'capstone/arch/PowerPC/PPCDisassembler.c',
1296 'capstone/arch/PowerPC/PPCInstPrinter.c',
1297 'capstone/arch/PowerPC/PPCMapping.c',
1298 'capstone/arch/PowerPC/PPCModule.c'
1299 )
1300 endif
1301
Richard Henderson3d562842020-01-04 07:24:59 +10001302 if 'CONFIG_S390_DIS' in config_all_disas
1303 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1304 capstone_files += files(
1305 'capstone/arch/SystemZ/SystemZDisassembler.c',
1306 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1307 'capstone/arch/SystemZ/SystemZMapping.c',
1308 'capstone/arch/SystemZ/SystemZModule.c',
1309 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1310 )
1311 endif
1312
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001313 if 'CONFIG_I386_DIS' in config_all_disas
1314 capstone_data.set('CAPSTONE_HAS_X86', 1)
1315 capstone_files += files(
1316 'capstone/arch/X86/X86Disassembler.c',
1317 'capstone/arch/X86/X86DisassemblerDecoder.c',
1318 'capstone/arch/X86/X86ATTInstPrinter.c',
1319 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07001320 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001321 'capstone/arch/X86/X86Mapping.c',
1322 'capstone/arch/X86/X86Module.c'
1323 )
1324 endif
1325
1326 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1327
1328 capstone_cargs = [
1329 # FIXME: There does not seem to be a way to completely replace the c_args
1330 # that come from add_project_arguments() -- we can only add to them.
1331 # So: disable all warnings with a big hammer.
1332 '-Wno-error', '-w',
1333
1334 # Include all configuration defines via a header file, which will wind up
1335 # as a dependency on the object file, and thus changes here will result
1336 # in a rebuild.
1337 '-include', 'capstone-defs.h'
1338 ]
1339
1340 libcapstone = static_library('capstone',
1341 sources: capstone_files,
1342 c_args: capstone_cargs,
1343 include_directories: 'capstone/include')
1344 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07001345 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001346endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001347
1348slirp = not_found
1349slirp_opt = 'disabled'
1350if have_system
1351 slirp_opt = get_option('slirp')
1352 if slirp_opt in ['enabled', 'auto', 'system']
1353 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
1354 slirp = dependency('slirp', static: enable_static,
1355 method: 'pkg-config',
1356 required: slirp_opt == 'system' or
1357 slirp_opt == 'enabled' and not have_internal)
1358 if slirp.found()
1359 slirp_opt = 'system'
1360 elif have_internal
1361 slirp_opt = 'internal'
1362 else
1363 slirp_opt = 'disabled'
1364 endif
1365 endif
1366 if slirp_opt == 'internal'
1367 slirp_deps = []
1368 if targetos == 'windows'
1369 slirp_deps = cc.find_library('iphlpapi')
1370 endif
1371 slirp_conf = configuration_data()
1372 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1373 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1374 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1375 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1376 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1377 slirp_files = [
1378 'slirp/src/arp_table.c',
1379 'slirp/src/bootp.c',
1380 'slirp/src/cksum.c',
1381 'slirp/src/dhcpv6.c',
1382 'slirp/src/dnssearch.c',
1383 'slirp/src/if.c',
1384 'slirp/src/ip6_icmp.c',
1385 'slirp/src/ip6_input.c',
1386 'slirp/src/ip6_output.c',
1387 'slirp/src/ip_icmp.c',
1388 'slirp/src/ip_input.c',
1389 'slirp/src/ip_output.c',
1390 'slirp/src/mbuf.c',
1391 'slirp/src/misc.c',
1392 'slirp/src/ncsi.c',
1393 'slirp/src/ndp_table.c',
1394 'slirp/src/sbuf.c',
1395 'slirp/src/slirp.c',
1396 'slirp/src/socket.c',
1397 'slirp/src/state.c',
1398 'slirp/src/stream.c',
1399 'slirp/src/tcp_input.c',
1400 'slirp/src/tcp_output.c',
1401 'slirp/src/tcp_subr.c',
1402 'slirp/src/tcp_timer.c',
1403 'slirp/src/tftp.c',
1404 'slirp/src/udp.c',
1405 'slirp/src/udp6.c',
1406 'slirp/src/util.c',
1407 'slirp/src/version.c',
1408 'slirp/src/vmstate.c',
1409 ]
1410
1411 configure_file(
1412 input : 'slirp/src/libslirp-version.h.in',
1413 output : 'libslirp-version.h',
1414 configuration: slirp_conf)
1415
1416 slirp_inc = include_directories('slirp', 'slirp/src')
1417 libslirp = static_library('slirp',
1418 sources: slirp_files,
1419 c_args: slirp_cargs,
1420 include_directories: slirp_inc)
1421 slirp = declare_dependency(link_with: libslirp,
1422 dependencies: slirp_deps,
1423 include_directories: slirp_inc)
1424 endif
1425endif
1426
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001427fdt = not_found
1428fdt_opt = get_option('fdt')
1429if have_system
1430 if fdt_opt in ['enabled', 'auto', 'system']
1431 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
1432 fdt = cc.find_library('fdt', static: enable_static,
1433 required: fdt_opt == 'system' or
1434 fdt_opt == 'enabled' and not have_internal)
1435 if fdt.found() and cc.links('''
1436 #include <libfdt.h>
1437 #include <libfdt_env.h>
1438 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1439 dependencies: fdt)
1440 fdt_opt = 'system'
1441 elif have_internal
1442 fdt_opt = 'internal'
1443 else
1444 fdt_opt = 'disabled'
1445 endif
1446 endif
1447 if fdt_opt == 'internal'
1448 fdt_files = files(
1449 'dtc/libfdt/fdt.c',
1450 'dtc/libfdt/fdt_ro.c',
1451 'dtc/libfdt/fdt_wip.c',
1452 'dtc/libfdt/fdt_sw.c',
1453 'dtc/libfdt/fdt_rw.c',
1454 'dtc/libfdt/fdt_strerror.c',
1455 'dtc/libfdt/fdt_empty_tree.c',
1456 'dtc/libfdt/fdt_addresses.c',
1457 'dtc/libfdt/fdt_overlay.c',
1458 'dtc/libfdt/fdt_check.c',
1459 )
1460
1461 fdt_inc = include_directories('dtc/libfdt')
1462 libfdt = static_library('fdt',
1463 sources: fdt_files,
1464 include_directories: fdt_inc)
1465 fdt = declare_dependency(link_with: libfdt,
1466 include_directories: fdt_inc)
1467 endif
1468endif
1469if not fdt.found() and fdt_required.length() > 0
1470 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1471endif
1472
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001473config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001474config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001475config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001476
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001477#####################
1478# Generated sources #
1479#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001480
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001481genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001482
Marc-André Lureau3f885652019-07-15 18:06:04 +04001483hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04001484shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001485qapi_gen = find_program('scripts/qapi-gen.py')
1486qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1487 meson.source_root() / 'scripts/qapi/commands.py',
1488 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001489 meson.source_root() / 'scripts/qapi/error.py',
1490 meson.source_root() / 'scripts/qapi/events.py',
1491 meson.source_root() / 'scripts/qapi/expr.py',
1492 meson.source_root() / 'scripts/qapi/gen.py',
1493 meson.source_root() / 'scripts/qapi/introspect.py',
1494 meson.source_root() / 'scripts/qapi/parser.py',
1495 meson.source_root() / 'scripts/qapi/schema.py',
1496 meson.source_root() / 'scripts/qapi/source.py',
1497 meson.source_root() / 'scripts/qapi/types.py',
1498 meson.source_root() / 'scripts/qapi/visit.py',
1499 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001500 meson.source_root() / 'scripts/qapi-gen.py'
1501]
1502
1503tracetool = [
1504 python, files('scripts/tracetool.py'),
1505 '--backend=' + config_host['TRACE_BACKENDS']
1506]
1507
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001508qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1509 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02001510 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001511qemu_version = custom_target('qemu-version.h',
1512 output: 'qemu-version.h',
1513 command: qemu_version_cmd,
1514 capture: true,
1515 build_by_default: true,
1516 build_always_stale: true)
1517genh += qemu_version
1518
Marc-André Lureau3f885652019-07-15 18:06:04 +04001519hxdep = []
1520hx_headers = [
1521 ['qemu-options.hx', 'qemu-options.def'],
1522 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1523]
1524if have_system
1525 hx_headers += [
1526 ['hmp-commands.hx', 'hmp-commands.h'],
1527 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1528 ]
1529endif
1530foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001531 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04001532 input: files(d[0]),
1533 output: d[1],
1534 capture: true,
1535 build_by_default: true, # to be removed when added to a target
1536 command: [hxtool, '-h', '@INPUT0@'])
1537endforeach
1538genh += hxdep
1539
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001540###################
1541# Collect sources #
1542###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001543
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001544authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001545blockdev_ss = ss.source_set()
1546block_ss = ss.source_set()
1547bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001548chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001549common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001550crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001551io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001552linux_user_ss = ss.source_set()
1553qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001554qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001555softmmu_ss = ss.source_set()
1556specific_fuzz_ss = ss.source_set()
1557specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001558stub_ss = ss.source_set()
1559trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001560user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001561util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001562
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001563modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001564hw_arch = {}
1565target_arch = {}
1566target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001567
1568###############
1569# Trace files #
1570###############
1571
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001572# TODO: add each directory to the subdirs from its own meson.build, once
1573# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001574trace_events_subdirs = [
1575 'accel/kvm',
1576 'accel/tcg',
1577 'crypto',
1578 'monitor',
1579]
1580if have_user
1581 trace_events_subdirs += [ 'linux-user' ]
1582endif
1583if have_block
1584 trace_events_subdirs += [
1585 'authz',
1586 'block',
1587 'io',
1588 'nbd',
1589 'scsi',
1590 ]
1591endif
1592if have_system
1593 trace_events_subdirs += [
1594 'audio',
1595 'backends',
1596 'backends/tpm',
1597 'chardev',
1598 'hw/9pfs',
1599 'hw/acpi',
1600 'hw/alpha',
1601 'hw/arm',
1602 'hw/audio',
1603 'hw/block',
1604 'hw/block/dataplane',
1605 'hw/char',
1606 'hw/display',
1607 'hw/dma',
1608 'hw/hppa',
1609 'hw/hyperv',
1610 'hw/i2c',
1611 'hw/i386',
1612 'hw/i386/xen',
1613 'hw/ide',
1614 'hw/input',
1615 'hw/intc',
1616 'hw/isa',
1617 'hw/mem',
1618 'hw/mips',
1619 'hw/misc',
1620 'hw/misc/macio',
1621 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08001622 'hw/net/can',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001623 'hw/nvram',
1624 'hw/pci',
1625 'hw/pci-host',
1626 'hw/ppc',
1627 'hw/rdma',
1628 'hw/rdma/vmw',
1629 'hw/rtc',
1630 'hw/s390x',
1631 'hw/scsi',
1632 'hw/sd',
1633 'hw/sparc',
1634 'hw/sparc64',
1635 'hw/ssi',
1636 'hw/timer',
1637 'hw/tpm',
1638 'hw/usb',
1639 'hw/vfio',
1640 'hw/virtio',
1641 'hw/watchdog',
1642 'hw/xen',
1643 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001644 'migration',
1645 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02001646 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001647 'ui',
1648 ]
1649endif
1650trace_events_subdirs += [
1651 'hw/core',
1652 'qapi',
1653 'qom',
1654 'target/arm',
1655 'target/hppa',
1656 'target/i386',
Claudio Fontanaa9dc68d2020-12-12 16:55:08 +01001657 'target/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001658 'target/mips',
1659 'target/ppc',
1660 'target/riscv',
1661 'target/s390x',
1662 'target/sparc',
1663 'util',
1664]
1665
Marc-André Lureau0df750e2020-11-25 14:06:37 +04001666vhost_user = not_found
1667if 'CONFIG_VHOST_USER' in config_host
1668 libvhost_user = subproject('libvhost-user')
1669 vhost_user = libvhost_user.get_variable('vhost_user_dep')
1670endif
1671
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001672subdir('qapi')
1673subdir('qobject')
1674subdir('stubs')
1675subdir('trace')
1676subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04001677subdir('qom')
1678subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001679subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04001680subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001681
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001682
1683if enable_modules
1684 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1685 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1686endif
1687
Paolo Bonzini2becc362020-02-03 11:42:03 +01001688stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001689
1690util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01001691util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001692libqemuutil = static_library('qemuutil',
1693 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonziniaa087962020-09-01 11:15:30 -04001694 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001695qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04001696 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001697
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001698decodetree = generator(find_program('scripts/decodetree.py'),
1699 output: 'decode-@BASENAME@.c.inc',
1700 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1701
Paolo Bonzini478e9432020-08-17 12:47:55 +02001702subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04001703subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04001704subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001705subdir('fsdev')
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001706subdir('libdecnumber')
Marc-André Lureaud3b18482019-08-17 14:55:32 +04001707subdir('target')
Marc-André Lureau708eab42019-09-03 16:59:33 +04001708subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001709
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001710block_ss.add(files(
1711 'block.c',
1712 'blockjob.c',
1713 'job.c',
1714 'qemu-io-cmds.c',
1715))
1716block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
1717
1718subdir('nbd')
1719subdir('scsi')
1720subdir('block')
1721
Paolo Bonzini4a963372020-08-03 16:22:28 +02001722blockdev_ss.add(files(
1723 'blockdev.c',
Stefan Hajnoczicbc20bf2020-09-29 13:55:15 +01001724 'blockdev-nbd.c',
Paolo Bonzini4a963372020-08-03 16:22:28 +02001725 'iothread.c',
1726 'job-qmp.c',
1727))
1728
1729# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1730# os-win32.c does not
1731blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1732softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
Paolo Bonzini4a963372020-08-03 16:22:28 +02001733
1734common_ss.add(files('cpus-common.c'))
1735
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001736subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001737
Richard Hendersonf3433462020-09-12 10:47:33 -07001738common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02001739specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001740specific_ss.add(files('exec-vary.c'))
1741specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1742 'fpu/softfloat.c',
1743 'tcg/optimize.c',
1744 'tcg/tcg-common.c',
1745 'tcg/tcg-op-gvec.c',
1746 'tcg/tcg-op-vec.c',
1747 'tcg/tcg-op.c',
1748 'tcg/tcg.c',
1749))
1750specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1751
Marc-André Lureauab318052019-07-24 19:23:16 +04001752subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04001753subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04001754subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001755subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001756subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04001757subdir('replay')
Marc-André Lureau582ea952019-08-15 15:15:32 +04001758subdir('hw')
Marc-André Lureau1a828782019-08-18 16:13:08 +04001759subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001760subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04001761subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04001762subdir('linux-user')
1763
Marc-André Lureaub309c322019-08-18 19:20:37 +04001764bsd_user_ss.add(files('gdbstub.c'))
1765specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1766
Marc-André Lureau3a304462019-08-18 16:13:08 +04001767linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1768specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001769
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001770# needed for fuzzing binaries
1771subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001772subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001773
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001774########################
1775# Library dependencies #
1776########################
1777
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001778block_mods = []
1779softmmu_mods = []
1780foreach d, list : modules
1781 foreach m, module_ss : list
1782 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02001783 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001784 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1785 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1786 if d == 'block'
1787 block_mods += sl
1788 else
1789 softmmu_mods += sl
1790 endif
1791 else
1792 if d == 'block'
1793 block_ss.add_all(module_ss)
1794 else
1795 softmmu_ss.add_all(module_ss)
1796 endif
1797 endif
1798 endforeach
1799endforeach
1800
1801nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08001802undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001803block_syms = custom_target('block.syms', output: 'block.syms',
1804 input: [libqemuutil, block_mods],
1805 capture: true,
1806 command: [undefsym, nm, '@INPUT@'])
1807qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1808 input: [libqemuutil, softmmu_mods],
1809 capture: true,
1810 command: [undefsym, nm, '@INPUT@'])
1811
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001812qom_ss = qom_ss.apply(config_host, strict: false)
1813libqom = static_library('qom', qom_ss.sources() + genh,
1814 dependencies: [qom_ss.dependencies()],
1815 name_suffix: 'fa')
1816
1817qom = declare_dependency(link_whole: libqom)
1818
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001819authz_ss = authz_ss.apply(config_host, strict: false)
1820libauthz = static_library('authz', authz_ss.sources() + genh,
1821 dependencies: [authz_ss.dependencies()],
1822 name_suffix: 'fa',
1823 build_by_default: false)
1824
1825authz = declare_dependency(link_whole: libauthz,
1826 dependencies: qom)
1827
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001828crypto_ss = crypto_ss.apply(config_host, strict: false)
1829libcrypto = static_library('crypto', crypto_ss.sources() + genh,
1830 dependencies: [crypto_ss.dependencies()],
1831 name_suffix: 'fa',
1832 build_by_default: false)
1833
1834crypto = declare_dependency(link_whole: libcrypto,
1835 dependencies: [authz, qom])
1836
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001837io_ss = io_ss.apply(config_host, strict: false)
1838libio = static_library('io', io_ss.sources() + genh,
1839 dependencies: [io_ss.dependencies()],
1840 link_with: libqemuutil,
1841 name_suffix: 'fa',
1842 build_by_default: false)
1843
1844io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
1845
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02001846libmigration = static_library('migration', sources: migration_files + genh,
1847 name_suffix: 'fa',
1848 build_by_default: false)
1849migration = declare_dependency(link_with: libmigration,
1850 dependencies: [zlib, qom, io])
1851softmmu_ss.add(migration)
1852
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001853block_ss = block_ss.apply(config_host, strict: false)
1854libblock = static_library('block', block_ss.sources() + genh,
1855 dependencies: block_ss.dependencies(),
1856 link_depends: block_syms,
1857 name_suffix: 'fa',
1858 build_by_default: false)
1859
1860block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001861 link_args: '@block.syms',
1862 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001863
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01001864blockdev_ss = blockdev_ss.apply(config_host, strict: false)
1865libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
1866 dependencies: blockdev_ss.dependencies(),
1867 name_suffix: 'fa',
1868 build_by_default: false)
1869
1870blockdev = declare_dependency(link_whole: [libblockdev],
1871 dependencies: [block])
1872
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001873qmp_ss = qmp_ss.apply(config_host, strict: false)
1874libqmp = static_library('qmp', qmp_ss.sources() + genh,
1875 dependencies: qmp_ss.dependencies(),
1876 name_suffix: 'fa',
1877 build_by_default: false)
1878
1879qmp = declare_dependency(link_whole: [libqmp])
1880
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001881libchardev = static_library('chardev', chardev_ss.sources() + genh,
1882 name_suffix: 'fa',
1883 build_by_default: false)
1884
1885chardev = declare_dependency(link_whole: libchardev)
1886
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02001887libhwcore = static_library('hwcore', sources: hwcore_files + genh,
1888 name_suffix: 'fa',
1889 build_by_default: false)
1890hwcore = declare_dependency(link_whole: libhwcore)
1891common_ss.add(hwcore)
1892
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02001893###########
1894# Targets #
1895###########
1896
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001897foreach m : block_mods + softmmu_mods
1898 shared_module(m.name(),
1899 name_prefix: '',
1900 link_whole: m,
1901 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001902 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001903endforeach
1904
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01001905softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001906common_ss.add(qom, qemuutil)
1907
1908common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01001909common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
1910
1911common_all = common_ss.apply(config_all, strict: false)
1912common_all = static_library('common',
1913 build_by_default: false,
1914 sources: common_all.sources() + genh,
1915 dependencies: common_all.dependencies(),
1916 name_suffix: 'fa')
1917
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001918feature_to_c = find_program('scripts/feature_to_c.sh')
1919
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04001920emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001921foreach target : target_dirs
1922 config_target = config_target_mak[target]
1923 target_name = config_target['TARGET_NAME']
1924 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001925 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001926 arch_deps = []
1927 c_args = ['-DNEED_CPU_H',
1928 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
1929 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04001930 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01001931
Paolo Bonzini859aef02020-08-04 18:14:26 +02001932 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01001933 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
1934 if targetos == 'linux'
1935 target_inc += include_directories('linux-headers', is_system: true)
1936 endif
1937 if target.endswith('-softmmu')
1938 qemu_target_name = 'qemu-system-' + target_name
1939 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001940 t = target_softmmu_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
Marc-André Lureau2c442202019-08-17 13:55:58 +04001944 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
1945 hw = hw_arch[hw_dir].apply(config_target, strict: false)
1946 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001947 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04001948
Paolo Bonzini2becc362020-02-03 11:42:03 +01001949 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001950 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001951 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04001952 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001953 target_type='user'
1954 qemu_target_name = 'qemu-' + target_name
1955 if 'CONFIG_LINUX_USER' in config_target
1956 base_dir = 'linux-user'
1957 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1958 else
1959 base_dir = 'bsd-user'
1960 endif
1961 target_inc += include_directories(
1962 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04001963 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001964 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04001965 if 'CONFIG_LINUX_USER' in config_target
1966 dir = base_dir / abi
1967 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1968 if config_target.has_key('TARGET_SYSTBL_ABI')
1969 arch_srcs += \
1970 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1971 extra_args : config_target['TARGET_SYSTBL_ABI'])
1972 endif
1973 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01001974 endif
1975
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001976 if 'TARGET_XML_FILES' in config_target
1977 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1978 output: target + '-gdbstub-xml.c',
1979 input: files(config_target['TARGET_XML_FILES'].split()),
1980 command: [feature_to_c, '@INPUT@'],
1981 capture: true)
1982 arch_srcs += gdbstub_xml
1983 endif
1984
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001985 t = target_arch[arch].apply(config_target, strict: false)
1986 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001987 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001988
Paolo Bonzini2becc362020-02-03 11:42:03 +01001989 target_common = common_ss.apply(config_target, strict: false)
1990 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001991 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001992
Paolo Bonzini2becc362020-02-03 11:42:03 +01001993 target_specific = specific_ss.apply(config_target, strict: false)
1994 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001995 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001996
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001997 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02001998 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001999 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002000 objects: objects,
2001 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002002 c_args: c_args,
2003 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01002004 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002005
2006 if target.endswith('-softmmu')
2007 execs = [{
2008 'name': 'qemu-system-' + target_name,
2009 'gui': false,
2010 'sources': files('softmmu/main.c'),
2011 'dependencies': []
2012 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002013 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002014 execs += [{
2015 'name': 'qemu-system-' + target_name + 'w',
2016 'gui': true,
2017 'sources': files('softmmu/main.c'),
2018 'dependencies': []
2019 }]
2020 endif
2021 if config_host.has_key('CONFIG_FUZZ')
2022 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
2023 execs += [{
2024 'name': 'qemu-fuzz-' + target_name,
2025 'gui': false,
2026 'sources': specific_fuzz.sources(),
2027 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002028 }]
2029 endif
2030 else
2031 execs = [{
2032 'name': 'qemu-' + target_name,
2033 'gui': false,
2034 'sources': [],
2035 'dependencies': []
2036 }]
2037 endif
2038 foreach exe: execs
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002039 emulators += {exe['name']:
2040 executable(exe['name'], exe['sources'],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002041 install: true,
2042 c_args: c_args,
2043 dependencies: arch_deps + deps + exe['dependencies'],
2044 objects: lib.extract_all_objects(recursive: true),
2045 link_language: link_language,
2046 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
2047 link_args: link_args,
2048 gui_app: exe['gui'])
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002049 }
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002050
2051 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
2052 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002053 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
2054 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002055 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
2056 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
2057 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002058 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002059 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002060 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002061 capture: true,
2062 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002063 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002064 command: [
2065 tracetool, '--group=all', '--format=' + stp['fmt'],
2066 '--binary=' + stp['bin'],
2067 '--target-name=' + target_name,
2068 '--target-type=' + target_type,
2069 '--probe-prefix=qemu.' + target_type + '.' + target_name,
2070 '@INPUT@',
2071 ])
2072 endforeach
2073 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002074 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002075endforeach
2076
Paolo Bonzini931049b2020-02-05 09:44:24 +01002077# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002078
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002079if 'CONFIG_PLUGIN' in config_host
2080 install_headers('include/qemu/qemu-plugin.h')
2081endif
2082
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002083if 'CONFIG_GUEST_AGENT' in config_host
2084 subdir('qga')
2085endif
2086
Laurent Vivier9755c942020-08-24 17:24:30 +02002087# Don't build qemu-keymap if xkbcommon is not explicitly enabled
2088# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002089if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04002090 # used for the update-keymaps target, so include rules even if !have_tools
2091 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
2092 dependencies: [qemuutil, xkbcommon], install: have_tools)
2093endif
2094
Paolo Bonzini931049b2020-02-05 09:44:24 +01002095if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002096 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
2097 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
2098 qemu_io = executable('qemu-io', files('qemu-io.c'),
2099 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01002100 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Stefan Hajnoczicbc20bf2020-09-29 13:55:15 +01002101 dependencies: [blockdev, qemuutil], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002102
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02002103 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002104 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04002105 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002106
Marc-André Lureau157e7b12019-07-15 14:50:58 +04002107 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
2108 dependencies: qemuutil,
2109 install: true)
2110
Paolo Bonzini931049b2020-02-05 09:44:24 +01002111 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02002112 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002113 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04002114 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02002115 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01002116 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002117
2118 if targetos == 'linux'
2119 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2120 dependencies: [qemuutil, libcap_ng],
2121 install: true,
2122 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002123
2124 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2125 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002126 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002127 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002128 endif
2129
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04002130 if 'CONFIG_IVSHMEM' in config_host
2131 subdir('contrib/ivshmem-client')
2132 subdir('contrib/ivshmem-server')
2133 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01002134endif
2135
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04002136subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002137subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04002138subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02002139subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08002140subdir('tests')
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04002141if 'CONFIG_GTK' in config_host
2142 subdir('po')
2143endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002144
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002145if host_machine.system() == 'windows'
2146 nsis_cmd = [
2147 find_program('scripts/nsis.py'),
2148 '@OUTPUT@',
2149 get_option('prefix'),
2150 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01002151 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002152 '--',
2153 '-DDISPLAYVERSION=' + meson.project_version(),
2154 ]
2155 if build_docs
2156 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2157 endif
2158 if 'CONFIG_GTK' in config_host
2159 nsis_cmd += '-DCONFIG_GTK=y'
2160 endif
2161
2162 nsis = custom_target('nsis',
2163 output: 'qemu-setup-' + meson.project_version() + '.exe',
2164 input: files('qemu.nsi'),
2165 build_always_stale: true,
2166 command: nsis_cmd + ['@INPUT@'])
2167 alias_target('installer', nsis)
2168endif
2169
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002170#########################
2171# Configuration summary #
2172#########################
2173
Paolo Bonzinif9332752020-02-03 13:28:38 +01002174summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002175summary_info += {'Install prefix': get_option('prefix')}
2176summary_info += {'BIOS directory': qemu_datadir}
2177summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2178summary_info += {'binary directory': get_option('bindir')}
2179summary_info += {'library directory': get_option('libdir')}
2180summary_info += {'module directory': qemu_moddir}
2181summary_info += {'libexec directory': get_option('libexecdir')}
2182summary_info += {'include directory': get_option('includedir')}
2183summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002184if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002185 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04002186 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002187else
2188 summary_info += {'local state directory': 'queried at runtime'}
2189endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04002190summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002191summary_info += {'Build directory': meson.current_build_dir()}
2192summary_info += {'Source path': meson.current_source_dir()}
2193summary_info += {'GIT binary': config_host['GIT']}
2194summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
2195summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
2196summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
2197if link_language == 'cpp'
2198 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
2199else
2200 summary_info += {'C++ compiler': false}
2201endif
2202if targetos == 'darwin'
2203 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
2204endif
2205summary_info += {'ARFLAGS': config_host['ARFLAGS']}
Paolo Bonzini47b30832020-09-23 05:26:17 -04002206summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2207 + ['-O' + get_option('optimization')]
2208 + (get_option('debug') ? ['-g'] : []))}
2209if link_language == 'cpp'
2210 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2211 + ['-O' + get_option('optimization')]
2212 + (get_option('debug') ? ['-g'] : []))}
2213endif
2214link_args = get_option(link_language + '_link_args')
2215if link_args.length() > 0
2216 summary_info += {'LDFLAGS': ' '.join(link_args)}
2217endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002218summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2219summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
2220summary_info += {'make': config_host['MAKE']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002221summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Yonggang Luoe3667662020-10-16 06:06:25 +08002222summary_info += {'sphinx-build': sphinx_build.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002223summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2224# TODO: add back version
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002225summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
2226if slirp_opt != 'disabled'
Paolo Bonzinif9332752020-02-03 13:28:38 +01002227 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2228endif
2229summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2230if config_host.has_key('CONFIG_MODULES')
2231 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2232endif
2233summary_info += {'host CPU': cpu}
2234summary_info += {'host endianness': build_machine.endian()}
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002235summary_info += {'target list': ' '.join(target_dirs)}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002236summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
Paolo Bonzinideb62372020-09-01 07:51:16 -04002237summary_info += {'sparse enabled': sparse.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002238summary_info += {'strip binaries': get_option('strip')}
2239summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05002240summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02002241summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002242if targetos == 'darwin'
2243 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
2244endif
2245# TODO: add back version
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002246summary_info += {'SDL support': sdl.found()}
2247summary_info += {'SDL image support': sdl_image.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002248# TODO: add back version
2249summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
2250summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002251summary_info += {'pixman': pixman.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002252# TODO: add back version
2253summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
2254summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
2255summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
2256# TODO: add back version
2257summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
2258if config_host.has_key('CONFIG_GCRYPT')
2259 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
2260 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2261endif
2262# TODO: add back version
2263summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
2264if config_host.has_key('CONFIG_NETTLE')
2265 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2266endif
2267summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
2268summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
Yonggang Luo5285e592020-10-13 07:43:48 +08002269summary_info += {'iconv support': iconv.found()}
2270summary_info += {'curses support': curses.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002271# TODO: add back version
2272summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002273summary_info += {'curl support': curl.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002274summary_info += {'mingw32 support': targetos == 'windows'}
2275summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2276summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2277summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
2278summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
Misono Tomohirocece1162020-10-08 19:31:33 +09002279summary_info += {'build virtiofs daemon': have_virtiofsd}
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002280summary_info += {'Multipath support': mpathpersist.found()}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002281summary_info += {'VNC support': vnc.found()}
2282if vnc.found()
2283 summary_info += {'VNC SASL support': sasl.found()}
2284 summary_info += {'VNC JPEG support': jpeg.found()}
2285 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002286endif
2287summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2288if config_host.has_key('CONFIG_XEN_BACKEND')
2289 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2290endif
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002291summary_info += {'brlapi support': brlapi.found()}
Yonggang Luoe3667662020-10-16 06:06:25 +08002292summary_info += {'Documentation': build_docs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002293summary_info += {'PIE': get_option('b_pie')}
2294summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2295summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2296summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2297summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
2298summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
Paolo Bonzinic8d54502020-10-16 03:32:52 -04002299summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini05512f52020-09-16 15:31:11 -04002300summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2301summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2302summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2303summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
2304summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2305if config_all.has_key('CONFIG_TCG')
2306 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
2307 summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
2308endif
Paolo Bonziniaa087962020-09-01 11:15:30 -04002309summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002310summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2311summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002312summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002313summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
2314summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
2315summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2316summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2317summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2318summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
2319summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
Thomas Huthb54b82d2020-11-09 09:59:06 +01002320summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002321summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2322summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2323summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2324summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
Thomas Huthb54b82d2020-11-09 09:59:06 +01002325summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002326summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002327summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2328summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2329summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2330if config_host['TRACE_BACKENDS'].split().contains('simple')
2331 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2332endif
2333# TODO: add back protocol and server version
2334summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002335summary_info += {'rbd support': rbd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002336summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
2337summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02002338summary_info += {'U2F support': u2f.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002339summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
2340summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
2341summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
2342summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002343summary_info += {'libiscsi support': libiscsi.found()}
Paolo Bonzini30045c02020-11-17 13:11:25 +01002344summary_info += {'libnfs support': libnfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002345summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2346if targetos == 'windows'
2347 if 'WIN_SDK' in config_host
2348 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2349 endif
2350 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2351 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Stefan Hajnoczi4bad7c32020-09-14 10:52:31 +01002352 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002353endif
2354summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
Daniele Buono9e62ba42020-12-04 18:06:14 -05002355summary_info += {'CFI support': get_option('cfi')}
2356summary_info += {'CFI debug support': get_option('cfi_debug')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002357summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2358summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2359summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2360summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2361summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002362summary_info += {'GlusterFS support': glusterfs.found()}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +04002363summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002364summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2365summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
2366summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2367summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002368summary_info += {'lzo support': lzo.found()}
Paolo Bonzini241611e2020-11-17 13:32:34 +01002369summary_info += {'snappy support': snappy.found()}
Paolo Bonzini29ba6112020-11-17 13:07:52 +01002370summary_info += {'bzip2 support': libbzip2.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002371summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
2372summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
2373summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2374summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
Paolo Bonziniaa087962020-09-01 11:15:30 -04002375summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002376summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2377summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2378summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2379summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2380summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2381summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2382summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2383summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2384summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2385summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2386summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2387summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002388summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002389summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2390summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002391summary_info += {'libudev': libudev.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002392summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
2393summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2394summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2395if config_host.has_key('HAVE_GDB_BIN')
2396 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2397endif
2398summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2399summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2400summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
Max Reitza484a712020-10-27 20:05:41 +01002401summary_info += {'FUSE exports': fuse.found()}
Max Reitzdf4ea702020-10-27 20:05:46 +01002402summary_info += {'FUSE lseek': fuse_lseek.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002403summary(summary_info, bool_yn: true)
2404
2405if not supported_cpus.contains(cpu)
2406 message()
2407 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2408 message()
2409 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2410 message('The QEMU project intends to remove support for this host CPU in')
2411 message('a future release if nobody volunteers to maintain it and to')
2412 message('provide a build host for our continuous integration setup.')
2413 message('configure has succeeded and you can continue to build, but')
2414 message('if you care about QEMU on this platform you should contact')
2415 message('us upstream at qemu-devel@nongnu.org.')
2416endif
2417
2418if not supported_oses.contains(targetos)
2419 message()
2420 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2421 message()
2422 message('Host OS ' + targetos + 'support is not currently maintained.')
2423 message('The QEMU project intends to remove support for this host OS in')
2424 message('a future release if nobody volunteers to maintain it and to')
2425 message('provide a build host for our continuous integration setup.')
2426 message('configure has succeeded and you can continue to build, but')
2427 message('if you care about QEMU on this platform you should contact')
2428 message('us upstream at qemu-devel@nongnu.org.')
2429endif