blob: 34683d50301078f1b9ef87f7807a320704aaafb4 [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
Marc-André Lureau708eab42019-09-03 16:59:33 +0400748snappy = not_found
749if 'CONFIG_SNAPPY' in config_host
750 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
751endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100752
Marc-André Lureau708eab42019-09-03 16:59:33 +0400753lzo = not_found
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100754if not get_option('lzo').auto() or have_system
755 lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'],
756 required: get_option('lzo'),
757 static: enable_static)
Marc-André Lureau708eab42019-09-03 16:59:33 +0400758endif
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100759if lzo.found() and not cc.links('''
760 #include <lzo/lzo1x.h>
761 int main(void) { lzo_version(); return 0; }''', dependencies: lzo)
762 lzo = not_found
763 if get_option('lzo').enabled()
764 error('could not link liblzo2')
765 else
766 warning('could not link liblzo2, disabling')
767 endif
768endif
769
Marc-André Lureau55166232019-07-24 19:16:22 +0400770rdma = not_found
771if 'CONFIG_RDMA' in config_host
772 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
773endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400774numa = not_found
775if 'CONFIG_NUMA' in config_host
776 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
777endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400778xen = not_found
779if 'CONFIG_XEN_BACKEND' in config_host
780 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
781 link_args: config_host['XEN_LIBS'].split())
782endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200783cacard = not_found
784if 'CONFIG_SMARTCARD' in config_host
785 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
786 link_args: config_host['SMARTCARD_LIBS'].split())
787endif
César Belley0a40bcb2020-08-26 13:42:04 +0200788u2f = not_found
789if have_system
790 u2f = dependency('u2f-emu', required: get_option('u2f'),
791 method: 'pkg-config',
792 static: enable_static)
793endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200794usbredir = not_found
795if 'CONFIG_USB_REDIR' in config_host
796 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
797 link_args: config_host['USB_REDIR_LIBS'].split())
798endif
799libusb = not_found
800if 'CONFIG_USB_LIBUSB' in config_host
801 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
802 link_args: config_host['LIBUSB_LIBS'].split())
803endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400804libpmem = not_found
805if 'CONFIG_LIBPMEM' in config_host
806 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
807 link_args: config_host['LIBPMEM_LIBS'].split())
808endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600809libdaxctl = not_found
810if 'CONFIG_LIBDAXCTL' in config_host
811 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
812endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +0400813tasn1 = not_found
814if 'CONFIG_TASN1' in config_host
815 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
816 link_args: config_host['TASN1_LIBS'].split())
817endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400818keyutils = dependency('libkeyutils', required: false,
819 method: 'pkg-config', static: enable_static)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400820
Marc-André Lureau3909def2020-08-28 15:07:33 +0400821has_gettid = cc.has_function('gettid')
822
Paolo Bonziniaa087962020-09-01 11:15:30 -0400823# Malloc tests
824
825malloc = []
826if get_option('malloc') == 'system'
827 has_malloc_trim = \
828 not get_option('malloc_trim').disabled() and \
829 cc.links('''#include <malloc.h>
830 int main(void) { malloc_trim(0); return 0; }''')
831else
832 has_malloc_trim = false
833 malloc = cc.find_library(get_option('malloc'), required: true)
834endif
835if not has_malloc_trim and get_option('malloc_trim').enabled()
836 if get_option('malloc') == 'system'
837 error('malloc_trim not available on this platform.')
838 else
839 error('malloc_trim not available with non-libc memory allocator')
840 endif
841endif
842
Max Reitz84e319a2020-11-02 17:18:55 +0100843# Check whether the glibc provides statx()
844
845statx_test = '''
846 #ifndef _GNU_SOURCE
847 #define _GNU_SOURCE
848 #endif
849 #include <sys/stat.h>
850 int main(void) {
851 struct statx statxbuf;
852 statx(0, "", 0, STATX_BASIC_STATS, &statxbuf);
853 return 0;
854 }'''
855
856has_statx = cc.links(statx_test)
857
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000858have_vhost_user_blk_server = (targetos == 'linux' and
859 'CONFIG_VHOST_USER' in config_host)
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000860
861if get_option('vhost_user_blk_server').enabled()
862 if targetos != 'linux'
863 error('vhost_user_blk_server requires linux')
Stefan Hajnoczieb6a3882020-11-10 17:11:20 +0000864 elif 'CONFIG_VHOST_USER' not in config_host
865 error('vhost_user_blk_server requires vhost-user support')
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000866 endif
867elif get_option('vhost_user_blk_server').disabled() or not have_system
868 have_vhost_user_blk_server = false
869endif
870
Daniele Buono9e62ba42020-12-04 18:06:14 -0500871
Max Reitzdf4ea702020-10-27 20:05:46 +0100872if get_option('fuse').disabled() and get_option('fuse_lseek').enabled()
873 error('Cannot enable fuse-lseek while fuse is disabled')
874endif
875
Max Reitza484a712020-10-27 20:05:41 +0100876fuse = dependency('fuse3', required: get_option('fuse'),
877 version: '>=3.1', method: 'pkg-config',
878 static: enable_static)
879
Max Reitzdf4ea702020-10-27 20:05:46 +0100880fuse_lseek = not_found
881if not get_option('fuse_lseek').disabled()
882 if fuse.version().version_compare('>=3.8')
883 # Dummy dependency
884 fuse_lseek = declare_dependency()
885 elif get_option('fuse_lseek').enabled()
886 if fuse.found()
887 error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version())
888 else
889 error('fuse-lseek requires libfuse, which was not found')
890 endif
891 endif
892endif
893
Daniele Buono9e62ba42020-12-04 18:06:14 -0500894if get_option('cfi')
895 cfi_flags=[]
896 # Check for dependency on LTO
897 if not get_option('b_lto')
898 error('Selected Control-Flow Integrity but LTO is disabled')
899 endif
900 if config_host.has_key('CONFIG_MODULES')
901 error('Selected Control-Flow Integrity is not compatible with modules')
902 endif
903 # Check for cfi flags. CFI requires LTO so we can't use
904 # get_supported_arguments, but need a more complex "compiles" which allows
905 # custom arguments
906 if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall',
907 args: ['-flto', '-fsanitize=cfi-icall'] )
908 cfi_flags += '-fsanitize=cfi-icall'
909 else
910 error('-fsanitize=cfi-icall is not supported by the compiler')
911 endif
912 if cc.compiles('int main () { return 0; }',
913 name: '-fsanitize-cfi-icall-generalize-pointers',
914 args: ['-flto', '-fsanitize=cfi-icall',
915 '-fsanitize-cfi-icall-generalize-pointers'] )
916 cfi_flags += '-fsanitize-cfi-icall-generalize-pointers'
917 else
918 error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler')
919 endif
920 if get_option('cfi_debug')
921 if cc.compiles('int main () { return 0; }',
922 name: '-fno-sanitize-trap=cfi-icall',
923 args: ['-flto', '-fsanitize=cfi-icall',
924 '-fno-sanitize-trap=cfi-icall'] )
925 cfi_flags += '-fno-sanitize-trap=cfi-icall'
926 else
927 error('-fno-sanitize-trap=cfi-icall is not supported by the compiler')
928 endif
929 endif
930 add_project_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
931 add_project_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc'])
932endif
933
Paolo Bonzinia0c91622020-10-07 11:01:51 -0400934#################
935# config-host.h #
936#################
Paolo Bonzini859aef02020-08-04 18:14:26 +0200937
Paolo Bonzini16bf7a32020-10-16 03:19:14 -0400938config_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir'))
939config_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix'))
940config_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir)
941config_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir)
942config_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir)
943config_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath'))
944config_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir'))
945config_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir)
946config_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir'))
947config_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir'))
948config_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir)
949config_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir'))
950
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +0100951config_host_data.set('CONFIG_BRLAPI', brlapi.found())
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400952config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200953config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +0100954config_host_data.set('CONFIG_LZO', lzo.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200955config_host_data.set('CONFIG_MPATH', mpathpersist.found())
956config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +0100957config_host_data.set('CONFIG_CURL', curl.found())
Yonggang Luo5285e592020-10-13 07:43:48 +0800958config_host_data.set('CONFIG_CURSES', curses.found())
Paolo Bonzini08821ca2020-11-17 13:01:26 +0100959config_host_data.set('CONFIG_GLUSTERFS', glusterfs.found())
960if glusterfs.found()
961 config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4'))
962 config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5'))
963 config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6'))
964 config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6'))
965 config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat)
966 config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat)
967endif
Paolo Bonzini9db405a2020-11-17 13:11:25 +0100968config_host_data.set('CONFIG_LIBISCSI', libiscsi.found())
Paolo Bonzini30045c02020-11-17 13:11:25 +0100969config_host_data.set('CONFIG_LIBNFS', libnfs.found())
Paolo Bonzinifabd1e92020-11-17 13:11:25 +0100970config_host_data.set('CONFIG_RBD', rbd.found())
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100971config_host_data.set('CONFIG_SDL', sdl.found())
972config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +0000973config_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100974config_host_data.set('CONFIG_VNC', vnc.found())
975config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
976config_host_data.set('CONFIG_VNC_PNG', png.found())
977config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +0200978config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400979config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +0400980config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonziniaa087962020-09-01 11:15:30 -0400981config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Max Reitz84e319a2020-11-02 17:18:55 +0100982config_host_data.set('CONFIG_STATX', has_statx)
Max Reitza484a712020-10-27 20:05:41 +0100983config_host_data.set('CONFIG_FUSE', fuse.found())
Max Reitzdf4ea702020-10-27 20:05:46 +0100984config_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found())
Daniele Buono9e62ba42020-12-04 18:06:14 -0500985config_host_data.set('CONFIG_CFI', get_option('cfi'))
Paolo Bonzini859aef02020-08-04 18:14:26 +0200986config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
987config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
988config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
989config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
990
Thomas Huth48f670e2020-11-18 18:10:52 +0100991config_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h'))
Thomas Huth2964be52020-11-18 18:10:49 +0100992config_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h'))
Thomas Huth2802d912020-11-18 18:10:48 +0100993config_host_data.set('HAVE_PTY_H', cc.has_header('pty.h'))
Thomas Huthded5d782020-11-14 11:10:11 +0100994config_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h'))
Thomas Huth4a9d5f82020-11-18 18:10:51 +0100995config_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h'))
Thomas Huth88c78f12020-11-18 18:10:50 +0100996config_host_data.set('HAVE_SYS_SIGNAL_H', cc.has_header('sys/signal.h'))
Thomas Huthded5d782020-11-14 11:10:11 +0100997
Paolo Bonzini765686d2020-09-18 06:37:21 -0400998ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
Paolo Bonzini859aef02020-08-04 18:14:26 +0200999arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001000strings = ['HOST_DSOSUF', 'CONFIG_IASL']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001001foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -04001002 if ignored.contains(k)
1003 # do nothing
1004 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +02001005 if v != ''
1006 v = '"' + '", "'.join(v.split()) + '", '
1007 endif
1008 config_host_data.set(k, v)
1009 elif k == 'ARCH'
1010 config_host_data.set('HOST_' + v.to_upper(), 1)
1011 elif strings.contains(k)
1012 if not k.startswith('CONFIG_')
1013 k = 'CONFIG_' + k.to_upper()
1014 endif
1015 config_host_data.set_quoted(k, v)
1016 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
1017 config_host_data.set(k, v == 'y' ? 1 : v)
1018 endif
1019endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +02001020
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001021########################
1022# Target configuration #
1023########################
1024
Paolo Bonzini2becc362020-02-03 11:42:03 +01001025minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -04001026config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001027config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001028config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001029config_devices_mak_list = []
1030config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +02001031config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001032config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001033
1034disassemblers = {
1035 'alpha' : ['CONFIG_ALPHA_DIS'],
1036 'arm' : ['CONFIG_ARM_DIS'],
1037 'avr' : ['CONFIG_AVR_DIS'],
1038 'cris' : ['CONFIG_CRIS_DIS'],
1039 'hppa' : ['CONFIG_HPPA_DIS'],
1040 'i386' : ['CONFIG_I386_DIS'],
1041 'x86_64' : ['CONFIG_I386_DIS'],
1042 'x32' : ['CONFIG_I386_DIS'],
1043 'lm32' : ['CONFIG_LM32_DIS'],
1044 'm68k' : ['CONFIG_M68K_DIS'],
1045 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
1046 'mips' : ['CONFIG_MIPS_DIS'],
1047 'moxie' : ['CONFIG_MOXIE_DIS'],
1048 'nios2' : ['CONFIG_NIOS2_DIS'],
1049 'or1k' : ['CONFIG_OPENRISC_DIS'],
1050 'ppc' : ['CONFIG_PPC_DIS'],
1051 'riscv' : ['CONFIG_RISCV_DIS'],
1052 'rx' : ['CONFIG_RX_DIS'],
1053 's390' : ['CONFIG_S390_DIS'],
1054 'sh4' : ['CONFIG_SH4_DIS'],
1055 'sparc' : ['CONFIG_SPARC_DIS'],
1056 'xtensa' : ['CONFIG_XTENSA_DIS'],
1057}
1058if link_language == 'cpp'
1059 disassemblers += {
1060 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
1061 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
1062 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
1063 }
1064endif
1065
Paolo Bonzini0a189112020-11-17 14:58:32 +01001066host_kconfig = \
1067 ('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
1068 ('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
1069 ('CONFIG_IVSHMEM' in config_host ? ['CONFIG_IVSHMEM=y'] : []) + \
1070 ('CONFIG_OPENGL' in config_host ? ['CONFIG_OPENGL=y'] : []) + \
1071 ('CONFIG_X11' in config_host ? ['CONFIG_X11=y'] : []) + \
1072 ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \
1073 ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \
1074 ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
1075 ('CONFIG_VIRTFS' in config_host ? ['CONFIG_VIRTFS=y'] : []) + \
1076 ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
1077 ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : [])
1078
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001079ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001080
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001081default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
1082actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001083fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001084foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -04001085 config_target = { 'TARGET_NAME': target.split('-')[0] }
1086 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001087 if targetos != 'linux'
1088 if default_targets
1089 continue
1090 endif
1091 error('Target @0@ is only available on a Linux host'.format(target))
1092 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001093 config_target += { 'CONFIG_LINUX_USER': 'y' }
1094 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001095 if 'CONFIG_BSD' not in config_host
1096 if default_targets
1097 continue
1098 endif
1099 error('Target @0@ is only available on a BSD host'.format(target))
1100 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -04001101 config_target += { 'CONFIG_BSD_USER': 'y' }
1102 elif target.endswith('softmmu')
1103 config_target += { 'CONFIG_SOFTMMU': 'y' }
1104 endif
1105 if target.endswith('-user')
1106 config_target += {
1107 'CONFIG_USER_ONLY': 'y',
1108 'CONFIG_QEMU_INTERP_PREFIX':
1109 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
1110 }
1111 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001112
Paolo Bonzini0a189112020-11-17 14:58:32 +01001113 accel_kconfig = []
Paolo Bonzini8a199802020-09-18 05:37:01 -04001114 foreach sym: accelerators
1115 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
1116 config_target += { sym: 'y' }
1117 config_all += { sym: 'y' }
1118 if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
1119 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
1120 endif
Paolo Bonzini0a189112020-11-17 14:58:32 +01001121 accel_kconfig += [ sym + '=y' ]
Paolo Bonzini8a199802020-09-18 05:37:01 -04001122 endif
1123 endforeach
Paolo Bonzini0a189112020-11-17 14:58:32 +01001124 if accel_kconfig.length() == 0
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001125 if default_targets
1126 continue
1127 endif
1128 error('No accelerator available for target @0@'.format(target))
1129 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -04001130
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001131 actual_target_dirs += target
Paolo Bonzini765686d2020-09-18 06:37:21 -04001132 config_target += keyval.load('default-configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001133 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -04001134
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001135 if 'TARGET_NEED_FDT' in config_target
1136 fdt_required += target
1137 endif
1138
Paolo Bonzinifa731682020-09-21 05:19:07 -04001139 # Add default keys
1140 if 'TARGET_BASE_ARCH' not in config_target
1141 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
1142 endif
1143 if 'TARGET_ABI_DIR' not in config_target
1144 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
1145 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +02001146
Paolo Bonzinica0fc782020-09-01 06:04:28 -04001147 foreach k, v: disassemblers
1148 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
1149 foreach sym: v
1150 config_target += { sym: 'y' }
1151 config_all_disas += { sym: 'y' }
1152 endforeach
1153 endif
1154 endforeach
1155
Paolo Bonzini859aef02020-08-04 18:14:26 +02001156 config_target_data = configuration_data()
1157 foreach k, v: config_target
1158 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
1159 # do nothing
1160 elif ignored.contains(k)
1161 # do nothing
1162 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -04001163 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
1164 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +02001165 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -04001166 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +02001167 config_target_data.set_quoted(k, v)
1168 elif v == 'y'
1169 config_target_data.set(k, 1)
1170 else
1171 config_target_data.set(k, v)
1172 endif
1173 endforeach
1174 config_target_h += {target: configure_file(output: target + '-config-target.h',
1175 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001176
1177 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +01001178 config_devices_mak = target + '-config-devices.mak'
1179 config_devices_mak = configure_file(
Paolo Bonzini1bb4cb12020-09-18 06:06:09 -04001180 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +01001181 output: config_devices_mak,
1182 depfile: config_devices_mak + '.d',
1183 capture: true,
1184 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
1185 config_devices_mak, '@DEPFILE@', '@INPUT@',
Paolo Bonzini0a189112020-11-17 14:58:32 +01001186 host_kconfig, accel_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +02001187
1188 config_devices_data = configuration_data()
1189 config_devices = keyval.load(config_devices_mak)
1190 foreach k, v: config_devices
1191 config_devices_data.set(k, 1)
1192 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001193 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +02001194 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
1195 configuration: config_devices_data)}
1196 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -04001197 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001198 endif
1199 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001200endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001201target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001202
Paolo Bonzini2becc362020-02-03 11:42:03 +01001203# This configuration is used to build files that are shared by
1204# multiple binaries, and then extracted out of the "common"
1205# static_library target.
1206#
1207# We do not use all_sources()/all_dependencies(), because it would
1208# build literally all source files, including devices only used by
1209# targets that are not built for this compilation. The CONFIG_ALL
1210# pseudo symbol replaces it.
1211
Paolo Bonzini05512f52020-09-16 15:31:11 -04001212config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +01001213config_all += config_host
1214config_all += config_all_disas
1215config_all += {
1216 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
1217 'CONFIG_SOFTMMU': have_system,
1218 'CONFIG_USER_ONLY': have_user,
1219 'CONFIG_ALL': true,
1220}
1221
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001222##############
1223# Submodules #
1224##############
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001225
1226capstone = not_found
1227capstone_opt = get_option('capstone')
1228if capstone_opt in ['enabled', 'auto', 'system']
1229 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -07001230 capstone = dependency('capstone', version: '>=4.0',
1231 static: enable_static, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001232 required: capstone_opt == 'system' or
1233 capstone_opt == 'enabled' and not have_internal)
1234 if capstone.found()
1235 capstone_opt = 'system'
1236 elif have_internal
1237 capstone_opt = 'internal'
1238 else
1239 capstone_opt = 'disabled'
1240 endif
1241endif
1242if capstone_opt == 'internal'
1243 capstone_data = configuration_data()
1244 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
1245
1246 capstone_files = files(
1247 'capstone/cs.c',
1248 'capstone/MCInst.c',
1249 'capstone/MCInstrDesc.c',
1250 'capstone/MCRegisterInfo.c',
1251 'capstone/SStream.c',
1252 'capstone/utils.c'
1253 )
1254
1255 if 'CONFIG_ARM_DIS' in config_all_disas
1256 capstone_data.set('CAPSTONE_HAS_ARM', '1')
1257 capstone_files += files(
1258 'capstone/arch/ARM/ARMDisassembler.c',
1259 'capstone/arch/ARM/ARMInstPrinter.c',
1260 'capstone/arch/ARM/ARMMapping.c',
1261 'capstone/arch/ARM/ARMModule.c'
1262 )
1263 endif
1264
1265 # FIXME: This config entry currently depends on a c++ compiler.
1266 # Which is needed for building libvixl, but not for capstone.
1267 if 'CONFIG_ARM_A64_DIS' in config_all_disas
1268 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
1269 capstone_files += files(
1270 'capstone/arch/AArch64/AArch64BaseInfo.c',
1271 'capstone/arch/AArch64/AArch64Disassembler.c',
1272 'capstone/arch/AArch64/AArch64InstPrinter.c',
1273 'capstone/arch/AArch64/AArch64Mapping.c',
1274 'capstone/arch/AArch64/AArch64Module.c'
1275 )
1276 endif
1277
1278 if 'CONFIG_PPC_DIS' in config_all_disas
1279 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
1280 capstone_files += files(
1281 'capstone/arch/PowerPC/PPCDisassembler.c',
1282 'capstone/arch/PowerPC/PPCInstPrinter.c',
1283 'capstone/arch/PowerPC/PPCMapping.c',
1284 'capstone/arch/PowerPC/PPCModule.c'
1285 )
1286 endif
1287
Richard Henderson3d562842020-01-04 07:24:59 +10001288 if 'CONFIG_S390_DIS' in config_all_disas
1289 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
1290 capstone_files += files(
1291 'capstone/arch/SystemZ/SystemZDisassembler.c',
1292 'capstone/arch/SystemZ/SystemZInstPrinter.c',
1293 'capstone/arch/SystemZ/SystemZMapping.c',
1294 'capstone/arch/SystemZ/SystemZModule.c',
1295 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
1296 )
1297 endif
1298
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001299 if 'CONFIG_I386_DIS' in config_all_disas
1300 capstone_data.set('CAPSTONE_HAS_X86', 1)
1301 capstone_files += files(
1302 'capstone/arch/X86/X86Disassembler.c',
1303 'capstone/arch/X86/X86DisassemblerDecoder.c',
1304 'capstone/arch/X86/X86ATTInstPrinter.c',
1305 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -07001306 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001307 'capstone/arch/X86/X86Mapping.c',
1308 'capstone/arch/X86/X86Module.c'
1309 )
1310 endif
1311
1312 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
1313
1314 capstone_cargs = [
1315 # FIXME: There does not seem to be a way to completely replace the c_args
1316 # that come from add_project_arguments() -- we can only add to them.
1317 # So: disable all warnings with a big hammer.
1318 '-Wno-error', '-w',
1319
1320 # Include all configuration defines via a header file, which will wind up
1321 # as a dependency on the object file, and thus changes here will result
1322 # in a rebuild.
1323 '-include', 'capstone-defs.h'
1324 ]
1325
1326 libcapstone = static_library('capstone',
1327 sources: capstone_files,
1328 c_args: capstone_cargs,
1329 include_directories: 'capstone/include')
1330 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -07001331 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001332endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001333
1334slirp = not_found
1335slirp_opt = 'disabled'
1336if have_system
1337 slirp_opt = get_option('slirp')
1338 if slirp_opt in ['enabled', 'auto', 'system']
1339 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
1340 slirp = dependency('slirp', static: enable_static,
1341 method: 'pkg-config',
1342 required: slirp_opt == 'system' or
1343 slirp_opt == 'enabled' and not have_internal)
1344 if slirp.found()
1345 slirp_opt = 'system'
1346 elif have_internal
1347 slirp_opt = 'internal'
1348 else
1349 slirp_opt = 'disabled'
1350 endif
1351 endif
1352 if slirp_opt == 'internal'
1353 slirp_deps = []
1354 if targetos == 'windows'
1355 slirp_deps = cc.find_library('iphlpapi')
1356 endif
1357 slirp_conf = configuration_data()
1358 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1359 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1360 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1361 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1362 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1363 slirp_files = [
1364 'slirp/src/arp_table.c',
1365 'slirp/src/bootp.c',
1366 'slirp/src/cksum.c',
1367 'slirp/src/dhcpv6.c',
1368 'slirp/src/dnssearch.c',
1369 'slirp/src/if.c',
1370 'slirp/src/ip6_icmp.c',
1371 'slirp/src/ip6_input.c',
1372 'slirp/src/ip6_output.c',
1373 'slirp/src/ip_icmp.c',
1374 'slirp/src/ip_input.c',
1375 'slirp/src/ip_output.c',
1376 'slirp/src/mbuf.c',
1377 'slirp/src/misc.c',
1378 'slirp/src/ncsi.c',
1379 'slirp/src/ndp_table.c',
1380 'slirp/src/sbuf.c',
1381 'slirp/src/slirp.c',
1382 'slirp/src/socket.c',
1383 'slirp/src/state.c',
1384 'slirp/src/stream.c',
1385 'slirp/src/tcp_input.c',
1386 'slirp/src/tcp_output.c',
1387 'slirp/src/tcp_subr.c',
1388 'slirp/src/tcp_timer.c',
1389 'slirp/src/tftp.c',
1390 'slirp/src/udp.c',
1391 'slirp/src/udp6.c',
1392 'slirp/src/util.c',
1393 'slirp/src/version.c',
1394 'slirp/src/vmstate.c',
1395 ]
1396
1397 configure_file(
1398 input : 'slirp/src/libslirp-version.h.in',
1399 output : 'libslirp-version.h',
1400 configuration: slirp_conf)
1401
1402 slirp_inc = include_directories('slirp', 'slirp/src')
1403 libslirp = static_library('slirp',
1404 sources: slirp_files,
1405 c_args: slirp_cargs,
1406 include_directories: slirp_inc)
1407 slirp = declare_dependency(link_with: libslirp,
1408 dependencies: slirp_deps,
1409 include_directories: slirp_inc)
1410 endif
1411endif
1412
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001413fdt = not_found
1414fdt_opt = get_option('fdt')
1415if have_system
1416 if fdt_opt in ['enabled', 'auto', 'system']
1417 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
1418 fdt = cc.find_library('fdt', static: enable_static,
1419 required: fdt_opt == 'system' or
1420 fdt_opt == 'enabled' and not have_internal)
1421 if fdt.found() and cc.links('''
1422 #include <libfdt.h>
1423 #include <libfdt_env.h>
1424 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1425 dependencies: fdt)
1426 fdt_opt = 'system'
1427 elif have_internal
1428 fdt_opt = 'internal'
1429 else
1430 fdt_opt = 'disabled'
1431 endif
1432 endif
1433 if fdt_opt == 'internal'
1434 fdt_files = files(
1435 'dtc/libfdt/fdt.c',
1436 'dtc/libfdt/fdt_ro.c',
1437 'dtc/libfdt/fdt_wip.c',
1438 'dtc/libfdt/fdt_sw.c',
1439 'dtc/libfdt/fdt_rw.c',
1440 'dtc/libfdt/fdt_strerror.c',
1441 'dtc/libfdt/fdt_empty_tree.c',
1442 'dtc/libfdt/fdt_addresses.c',
1443 'dtc/libfdt/fdt_overlay.c',
1444 'dtc/libfdt/fdt_check.c',
1445 )
1446
1447 fdt_inc = include_directories('dtc/libfdt')
1448 libfdt = static_library('fdt',
1449 sources: fdt_files,
1450 include_directories: fdt_inc)
1451 fdt = declare_dependency(link_with: libfdt,
1452 include_directories: fdt_inc)
1453 endif
1454endif
1455if not fdt.found() and fdt_required.length() > 0
1456 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1457endif
1458
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001459config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001460config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001461config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001462
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001463#####################
1464# Generated sources #
1465#####################
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001466
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001467genh += configure_file(output: 'config-host.h', configuration: config_host_data)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001468
Marc-André Lureau3f885652019-07-15 18:06:04 +04001469hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04001470shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001471qapi_gen = find_program('scripts/qapi-gen.py')
1472qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1473 meson.source_root() / 'scripts/qapi/commands.py',
1474 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001475 meson.source_root() / 'scripts/qapi/error.py',
1476 meson.source_root() / 'scripts/qapi/events.py',
1477 meson.source_root() / 'scripts/qapi/expr.py',
1478 meson.source_root() / 'scripts/qapi/gen.py',
1479 meson.source_root() / 'scripts/qapi/introspect.py',
1480 meson.source_root() / 'scripts/qapi/parser.py',
1481 meson.source_root() / 'scripts/qapi/schema.py',
1482 meson.source_root() / 'scripts/qapi/source.py',
1483 meson.source_root() / 'scripts/qapi/types.py',
1484 meson.source_root() / 'scripts/qapi/visit.py',
1485 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001486 meson.source_root() / 'scripts/qapi-gen.py'
1487]
1488
1489tracetool = [
1490 python, files('scripts/tracetool.py'),
1491 '--backend=' + config_host['TRACE_BACKENDS']
1492]
1493
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001494qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1495 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02001496 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001497qemu_version = custom_target('qemu-version.h',
1498 output: 'qemu-version.h',
1499 command: qemu_version_cmd,
1500 capture: true,
1501 build_by_default: true,
1502 build_always_stale: true)
1503genh += qemu_version
1504
Marc-André Lureau3f885652019-07-15 18:06:04 +04001505hxdep = []
1506hx_headers = [
1507 ['qemu-options.hx', 'qemu-options.def'],
1508 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1509]
1510if have_system
1511 hx_headers += [
1512 ['hmp-commands.hx', 'hmp-commands.h'],
1513 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1514 ]
1515endif
1516foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001517 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04001518 input: files(d[0]),
1519 output: d[1],
1520 capture: true,
1521 build_by_default: true, # to be removed when added to a target
1522 command: [hxtool, '-h', '@INPUT0@'])
1523endforeach
1524genh += hxdep
1525
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001526###################
1527# Collect sources #
1528###################
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001529
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001530authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001531blockdev_ss = ss.source_set()
1532block_ss = ss.source_set()
1533bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001534chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001535common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001536crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001537io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001538linux_user_ss = ss.source_set()
1539qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001540qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001541softmmu_ss = ss.source_set()
1542specific_fuzz_ss = ss.source_set()
1543specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001544stub_ss = ss.source_set()
1545trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001546user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001547util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001548
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001549modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001550hw_arch = {}
1551target_arch = {}
1552target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001553
1554###############
1555# Trace files #
1556###############
1557
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001558# TODO: add each directory to the subdirs from its own meson.build, once
1559# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001560trace_events_subdirs = [
1561 'accel/kvm',
1562 'accel/tcg',
1563 'crypto',
1564 'monitor',
1565]
1566if have_user
1567 trace_events_subdirs += [ 'linux-user' ]
1568endif
1569if have_block
1570 trace_events_subdirs += [
1571 'authz',
1572 'block',
1573 'io',
1574 'nbd',
1575 'scsi',
1576 ]
1577endif
1578if have_system
1579 trace_events_subdirs += [
1580 'audio',
1581 'backends',
1582 'backends/tpm',
1583 'chardev',
1584 'hw/9pfs',
1585 'hw/acpi',
1586 'hw/alpha',
1587 'hw/arm',
1588 'hw/audio',
1589 'hw/block',
1590 'hw/block/dataplane',
1591 'hw/char',
1592 'hw/display',
1593 'hw/dma',
1594 'hw/hppa',
1595 'hw/hyperv',
1596 'hw/i2c',
1597 'hw/i386',
1598 'hw/i386/xen',
1599 'hw/ide',
1600 'hw/input',
1601 'hw/intc',
1602 'hw/isa',
1603 'hw/mem',
1604 'hw/mips',
1605 'hw/misc',
1606 'hw/misc/macio',
1607 'hw/net',
Vikram Garhwal98e5d7a2020-11-18 11:48:43 -08001608 'hw/net/can',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001609 'hw/nvram',
1610 'hw/pci',
1611 'hw/pci-host',
1612 'hw/ppc',
1613 'hw/rdma',
1614 'hw/rdma/vmw',
1615 'hw/rtc',
1616 'hw/s390x',
1617 'hw/scsi',
1618 'hw/sd',
1619 'hw/sparc',
1620 'hw/sparc64',
1621 'hw/ssi',
1622 'hw/timer',
1623 'hw/tpm',
1624 'hw/usb',
1625 'hw/vfio',
1626 'hw/virtio',
1627 'hw/watchdog',
1628 'hw/xen',
1629 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001630 'migration',
1631 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02001632 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001633 'ui',
1634 ]
1635endif
1636trace_events_subdirs += [
1637 'hw/core',
1638 'qapi',
1639 'qom',
1640 'target/arm',
1641 'target/hppa',
1642 'target/i386',
Claudio Fontanaa9dc68d2020-12-12 16:55:08 +01001643 'target/i386/kvm',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001644 'target/mips',
1645 'target/ppc',
1646 'target/riscv',
1647 'target/s390x',
1648 'target/sparc',
1649 'util',
1650]
1651
Marc-André Lureau0df750e2020-11-25 14:06:37 +04001652vhost_user = not_found
1653if 'CONFIG_VHOST_USER' in config_host
1654 libvhost_user = subproject('libvhost-user')
1655 vhost_user = libvhost_user.get_variable('vhost_user_dep')
1656endif
1657
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001658subdir('qapi')
1659subdir('qobject')
1660subdir('stubs')
1661subdir('trace')
1662subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04001663subdir('qom')
1664subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001665subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04001666subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001667
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001668
1669if enable_modules
1670 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1671 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1672endif
1673
Paolo Bonzini2becc362020-02-03 11:42:03 +01001674stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001675
1676util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01001677util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001678libqemuutil = static_library('qemuutil',
1679 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonziniaa087962020-09-01 11:15:30 -04001680 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001681qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04001682 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001683
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001684decodetree = generator(find_program('scripts/decodetree.py'),
1685 output: 'decode-@BASENAME@.c.inc',
1686 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1687
Paolo Bonzini478e9432020-08-17 12:47:55 +02001688subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04001689subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04001690subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001691subdir('fsdev')
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001692subdir('libdecnumber')
Marc-André Lureaud3b18482019-08-17 14:55:32 +04001693subdir('target')
Marc-André Lureau708eab42019-09-03 16:59:33 +04001694subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001695
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001696block_ss.add(files(
1697 'block.c',
1698 'blockjob.c',
1699 'job.c',
1700 'qemu-io-cmds.c',
1701))
1702block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
1703
1704subdir('nbd')
1705subdir('scsi')
1706subdir('block')
1707
Paolo Bonzini4a963372020-08-03 16:22:28 +02001708blockdev_ss.add(files(
1709 'blockdev.c',
Stefan Hajnoczicbc20bf2020-09-29 13:55:15 +01001710 'blockdev-nbd.c',
Paolo Bonzini4a963372020-08-03 16:22:28 +02001711 'iothread.c',
1712 'job-qmp.c',
1713))
1714
1715# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1716# os-win32.c does not
1717blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1718softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
Paolo Bonzini4a963372020-08-03 16:22:28 +02001719
1720common_ss.add(files('cpus-common.c'))
1721
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001722subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001723
Richard Hendersonf3433462020-09-12 10:47:33 -07001724common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02001725specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001726specific_ss.add(files('exec-vary.c'))
1727specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1728 'fpu/softfloat.c',
1729 'tcg/optimize.c',
1730 'tcg/tcg-common.c',
1731 'tcg/tcg-op-gvec.c',
1732 'tcg/tcg-op-vec.c',
1733 'tcg/tcg-op.c',
1734 'tcg/tcg.c',
1735))
1736specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1737
Marc-André Lureauab318052019-07-24 19:23:16 +04001738subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04001739subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04001740subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001741subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001742subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04001743subdir('replay')
Marc-André Lureau582ea952019-08-15 15:15:32 +04001744subdir('hw')
Marc-André Lureau1a828782019-08-18 16:13:08 +04001745subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001746subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04001747subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04001748subdir('linux-user')
1749
Marc-André Lureaub309c322019-08-18 19:20:37 +04001750bsd_user_ss.add(files('gdbstub.c'))
1751specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1752
Marc-André Lureau3a304462019-08-18 16:13:08 +04001753linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1754specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001755
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001756# needed for fuzzing binaries
1757subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001758subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001759
Paolo Bonzinia0c91622020-10-07 11:01:51 -04001760########################
1761# Library dependencies #
1762########################
1763
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001764block_mods = []
1765softmmu_mods = []
1766foreach d, list : modules
1767 foreach m, module_ss : list
1768 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02001769 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001770 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1771 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1772 if d == 'block'
1773 block_mods += sl
1774 else
1775 softmmu_mods += sl
1776 endif
1777 else
1778 if d == 'block'
1779 block_ss.add_all(module_ss)
1780 else
1781 softmmu_ss.add_all(module_ss)
1782 endif
1783 endif
1784 endforeach
1785endforeach
1786
1787nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08001788undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001789block_syms = custom_target('block.syms', output: 'block.syms',
1790 input: [libqemuutil, block_mods],
1791 capture: true,
1792 command: [undefsym, nm, '@INPUT@'])
1793qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1794 input: [libqemuutil, softmmu_mods],
1795 capture: true,
1796 command: [undefsym, nm, '@INPUT@'])
1797
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001798qom_ss = qom_ss.apply(config_host, strict: false)
1799libqom = static_library('qom', qom_ss.sources() + genh,
1800 dependencies: [qom_ss.dependencies()],
1801 name_suffix: 'fa')
1802
1803qom = declare_dependency(link_whole: libqom)
1804
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001805authz_ss = authz_ss.apply(config_host, strict: false)
1806libauthz = static_library('authz', authz_ss.sources() + genh,
1807 dependencies: [authz_ss.dependencies()],
1808 name_suffix: 'fa',
1809 build_by_default: false)
1810
1811authz = declare_dependency(link_whole: libauthz,
1812 dependencies: qom)
1813
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001814crypto_ss = crypto_ss.apply(config_host, strict: false)
1815libcrypto = static_library('crypto', crypto_ss.sources() + genh,
1816 dependencies: [crypto_ss.dependencies()],
1817 name_suffix: 'fa',
1818 build_by_default: false)
1819
1820crypto = declare_dependency(link_whole: libcrypto,
1821 dependencies: [authz, qom])
1822
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001823io_ss = io_ss.apply(config_host, strict: false)
1824libio = static_library('io', io_ss.sources() + genh,
1825 dependencies: [io_ss.dependencies()],
1826 link_with: libqemuutil,
1827 name_suffix: 'fa',
1828 build_by_default: false)
1829
1830io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
1831
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02001832libmigration = static_library('migration', sources: migration_files + genh,
1833 name_suffix: 'fa',
1834 build_by_default: false)
1835migration = declare_dependency(link_with: libmigration,
1836 dependencies: [zlib, qom, io])
1837softmmu_ss.add(migration)
1838
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001839block_ss = block_ss.apply(config_host, strict: false)
1840libblock = static_library('block', block_ss.sources() + genh,
1841 dependencies: block_ss.dependencies(),
1842 link_depends: block_syms,
1843 name_suffix: 'fa',
1844 build_by_default: false)
1845
1846block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001847 link_args: '@block.syms',
1848 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001849
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01001850blockdev_ss = blockdev_ss.apply(config_host, strict: false)
1851libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
1852 dependencies: blockdev_ss.dependencies(),
1853 name_suffix: 'fa',
1854 build_by_default: false)
1855
1856blockdev = declare_dependency(link_whole: [libblockdev],
1857 dependencies: [block])
1858
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001859qmp_ss = qmp_ss.apply(config_host, strict: false)
1860libqmp = static_library('qmp', qmp_ss.sources() + genh,
1861 dependencies: qmp_ss.dependencies(),
1862 name_suffix: 'fa',
1863 build_by_default: false)
1864
1865qmp = declare_dependency(link_whole: [libqmp])
1866
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001867libchardev = static_library('chardev', chardev_ss.sources() + genh,
1868 name_suffix: 'fa',
1869 build_by_default: false)
1870
1871chardev = declare_dependency(link_whole: libchardev)
1872
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02001873libhwcore = static_library('hwcore', sources: hwcore_files + genh,
1874 name_suffix: 'fa',
1875 build_by_default: false)
1876hwcore = declare_dependency(link_whole: libhwcore)
1877common_ss.add(hwcore)
1878
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02001879###########
1880# Targets #
1881###########
1882
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001883foreach m : block_mods + softmmu_mods
1884 shared_module(m.name(),
1885 name_prefix: '',
1886 link_whole: m,
1887 install: true,
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04001888 install_dir: qemu_moddir)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001889endforeach
1890
Stefan Hajnoczi4fb90712020-09-29 13:55:14 +01001891softmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp)
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001892common_ss.add(qom, qemuutil)
1893
1894common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01001895common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
1896
1897common_all = common_ss.apply(config_all, strict: false)
1898common_all = static_library('common',
1899 build_by_default: false,
1900 sources: common_all.sources() + genh,
1901 dependencies: common_all.dependencies(),
1902 name_suffix: 'fa')
1903
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001904feature_to_c = find_program('scripts/feature_to_c.sh')
1905
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04001906emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001907foreach target : target_dirs
1908 config_target = config_target_mak[target]
1909 target_name = config_target['TARGET_NAME']
1910 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001911 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001912 arch_deps = []
1913 c_args = ['-DNEED_CPU_H',
1914 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
1915 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04001916 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01001917
Paolo Bonzini859aef02020-08-04 18:14:26 +02001918 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01001919 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
1920 if targetos == 'linux'
1921 target_inc += include_directories('linux-headers', is_system: true)
1922 endif
1923 if target.endswith('-softmmu')
1924 qemu_target_name = 'qemu-system-' + target_name
1925 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001926 t = target_softmmu_arch[arch].apply(config_target, strict: false)
1927 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001928 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001929
Marc-André Lureau2c442202019-08-17 13:55:58 +04001930 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
1931 hw = hw_arch[hw_dir].apply(config_target, strict: false)
1932 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001933 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04001934
Paolo Bonzini2becc362020-02-03 11:42:03 +01001935 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001936 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001937 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04001938 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001939 target_type='user'
1940 qemu_target_name = 'qemu-' + target_name
1941 if 'CONFIG_LINUX_USER' in config_target
1942 base_dir = 'linux-user'
1943 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1944 else
1945 base_dir = 'bsd-user'
1946 endif
1947 target_inc += include_directories(
1948 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04001949 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001950 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04001951 if 'CONFIG_LINUX_USER' in config_target
1952 dir = base_dir / abi
1953 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1954 if config_target.has_key('TARGET_SYSTBL_ABI')
1955 arch_srcs += \
1956 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1957 extra_args : config_target['TARGET_SYSTBL_ABI'])
1958 endif
1959 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01001960 endif
1961
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001962 if 'TARGET_XML_FILES' in config_target
1963 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1964 output: target + '-gdbstub-xml.c',
1965 input: files(config_target['TARGET_XML_FILES'].split()),
1966 command: [feature_to_c, '@INPUT@'],
1967 capture: true)
1968 arch_srcs += gdbstub_xml
1969 endif
1970
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001971 t = target_arch[arch].apply(config_target, strict: false)
1972 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001973 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001974
Paolo Bonzini2becc362020-02-03 11:42:03 +01001975 target_common = common_ss.apply(config_target, strict: false)
1976 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001977 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001978
Paolo Bonzini2becc362020-02-03 11:42:03 +01001979 target_specific = specific_ss.apply(config_target, strict: false)
1980 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001981 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001982
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001983 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02001984 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001985 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001986 objects: objects,
1987 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001988 c_args: c_args,
1989 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001990 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001991
1992 if target.endswith('-softmmu')
1993 execs = [{
1994 'name': 'qemu-system-' + target_name,
1995 'gui': false,
1996 'sources': files('softmmu/main.c'),
1997 'dependencies': []
1998 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001999 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002000 execs += [{
2001 'name': 'qemu-system-' + target_name + 'w',
2002 'gui': true,
2003 'sources': files('softmmu/main.c'),
2004 'dependencies': []
2005 }]
2006 endif
2007 if config_host.has_key('CONFIG_FUZZ')
2008 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
2009 execs += [{
2010 'name': 'qemu-fuzz-' + target_name,
2011 'gui': false,
2012 'sources': specific_fuzz.sources(),
2013 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002014 }]
2015 endif
2016 else
2017 execs = [{
2018 'name': 'qemu-' + target_name,
2019 'gui': false,
2020 'sources': [],
2021 'dependencies': []
2022 }]
2023 endif
2024 foreach exe: execs
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002025 emulators += {exe['name']:
2026 executable(exe['name'], exe['sources'],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002027 install: true,
2028 c_args: c_args,
2029 dependencies: arch_deps + deps + exe['dependencies'],
2030 objects: lib.extract_all_objects(recursive: true),
2031 link_language: link_language,
2032 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
2033 link_args: link_args,
2034 gui_app: exe['gui'])
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04002035 }
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002036
2037 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
2038 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002039 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
2040 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002041 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
2042 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
2043 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002044 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002045 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02002046 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002047 capture: true,
2048 install: stp['install'],
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002049 install_dir: get_option('datadir') / 'systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04002050 command: [
2051 tracetool, '--group=all', '--format=' + stp['fmt'],
2052 '--binary=' + stp['bin'],
2053 '--target-name=' + target_name,
2054 '--target-type=' + target_type,
2055 '--probe-prefix=qemu.' + target_type + '.' + target_name,
2056 '@INPUT@',
2057 ])
2058 endforeach
2059 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02002060 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01002061endforeach
2062
Paolo Bonzini931049b2020-02-05 09:44:24 +01002063# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002064
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01002065if 'CONFIG_PLUGIN' in config_host
2066 install_headers('include/qemu/qemu-plugin.h')
2067endif
2068
Paolo Bonzinif15bff22019-07-18 13:19:02 +02002069if 'CONFIG_GUEST_AGENT' in config_host
2070 subdir('qga')
2071endif
2072
Laurent Vivier9755c942020-08-24 17:24:30 +02002073# Don't build qemu-keymap if xkbcommon is not explicitly enabled
2074# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02002075if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04002076 # used for the update-keymaps target, so include rules even if !have_tools
2077 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
2078 dependencies: [qemuutil, xkbcommon], install: have_tools)
2079endif
2080
Paolo Bonzini931049b2020-02-05 09:44:24 +01002081if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002082 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
2083 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
2084 qemu_io = executable('qemu-io', files('qemu-io.c'),
2085 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01002086 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Stefan Hajnoczicbc20bf2020-09-29 13:55:15 +01002087 dependencies: [blockdev, qemuutil], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04002088
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02002089 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002090 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04002091 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02002092
Marc-André Lureau157e7b12019-07-15 14:50:58 +04002093 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
2094 dependencies: qemuutil,
2095 install: true)
2096
Paolo Bonzini931049b2020-02-05 09:44:24 +01002097 if 'CONFIG_VHOST_USER' in config_host
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02002098 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002099 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04002100 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02002101 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01002102 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002103
2104 if targetos == 'linux'
2105 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
2106 dependencies: [qemuutil, libcap_ng],
2107 install: true,
2108 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002109
2110 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
2111 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002112 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04002113 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04002114 endif
2115
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04002116 if 'CONFIG_IVSHMEM' in config_host
2117 subdir('contrib/ivshmem-client')
2118 subdir('contrib/ivshmem-server')
2119 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01002120endif
2121
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04002122subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002123subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04002124subdir('pc-bios')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02002125subdir('docs')
Yonggang Luoe3667662020-10-16 06:06:25 +08002126subdir('tests')
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04002127if 'CONFIG_GTK' in config_host
2128 subdir('po')
2129endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01002130
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002131if host_machine.system() == 'windows'
2132 nsis_cmd = [
2133 find_program('scripts/nsis.py'),
2134 '@OUTPUT@',
2135 get_option('prefix'),
2136 meson.current_source_dir(),
Stefan Weil24bdcc92020-11-25 20:18:33 +01002137 host_machine.cpu(),
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04002138 '--',
2139 '-DDISPLAYVERSION=' + meson.project_version(),
2140 ]
2141 if build_docs
2142 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
2143 endif
2144 if 'CONFIG_GTK' in config_host
2145 nsis_cmd += '-DCONFIG_GTK=y'
2146 endif
2147
2148 nsis = custom_target('nsis',
2149 output: 'qemu-setup-' + meson.project_version() + '.exe',
2150 input: files('qemu.nsi'),
2151 build_always_stale: true,
2152 command: nsis_cmd + ['@INPUT@'])
2153 alias_target('installer', nsis)
2154endif
2155
Paolo Bonzinia0c91622020-10-07 11:01:51 -04002156#########################
2157# Configuration summary #
2158#########################
2159
Paolo Bonzinif9332752020-02-03 13:28:38 +01002160summary_info = {}
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002161summary_info += {'Install prefix': get_option('prefix')}
2162summary_info += {'BIOS directory': qemu_datadir}
2163summary_info += {'firmware path': get_option('qemu_firmwarepath')}
2164summary_info += {'binary directory': get_option('bindir')}
2165summary_info += {'library directory': get_option('libdir')}
2166summary_info += {'module directory': qemu_moddir}
2167summary_info += {'libexec directory': get_option('libexecdir')}
2168summary_info += {'include directory': get_option('includedir')}
2169summary_info += {'config directory': get_option('sysconfdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002170if targetos != 'windows'
Paolo Bonzini16bf7a32020-10-16 03:19:14 -04002171 summary_info += {'local state directory': get_option('localstatedir')}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04002172 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002173else
2174 summary_info += {'local state directory': 'queried at runtime'}
2175endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04002176summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002177summary_info += {'Build directory': meson.current_build_dir()}
2178summary_info += {'Source path': meson.current_source_dir()}
2179summary_info += {'GIT binary': config_host['GIT']}
2180summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
2181summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
2182summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
2183if link_language == 'cpp'
2184 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
2185else
2186 summary_info += {'C++ compiler': false}
2187endif
2188if targetos == 'darwin'
2189 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
2190endif
2191summary_info += {'ARFLAGS': config_host['ARFLAGS']}
Paolo Bonzini47b30832020-09-23 05:26:17 -04002192summary_info += {'CFLAGS': ' '.join(get_option('c_args')
2193 + ['-O' + get_option('optimization')]
2194 + (get_option('debug') ? ['-g'] : []))}
2195if link_language == 'cpp'
2196 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
2197 + ['-O' + get_option('optimization')]
2198 + (get_option('debug') ? ['-g'] : []))}
2199endif
2200link_args = get_option(link_language + '_link_args')
2201if link_args.length() > 0
2202 summary_info += {'LDFLAGS': ' '.join(link_args)}
2203endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01002204summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
2205summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
2206summary_info += {'make': config_host['MAKE']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002207summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
Yonggang Luoe3667662020-10-16 06:06:25 +08002208summary_info += {'sphinx-build': sphinx_build.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002209summary_info += {'genisoimage': config_host['GENISOIMAGE']}
2210# TODO: add back version
Paolo Bonzini4d34a862020-10-05 11:31:15 +02002211summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
2212if slirp_opt != 'disabled'
Paolo Bonzinif9332752020-02-03 13:28:38 +01002213 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
2214endif
2215summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
2216if config_host.has_key('CONFIG_MODULES')
2217 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
2218endif
2219summary_info += {'host CPU': cpu}
2220summary_info += {'host endianness': build_machine.endian()}
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04002221summary_info += {'target list': ' '.join(target_dirs)}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002222summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
Paolo Bonzinideb62372020-09-01 07:51:16 -04002223summary_info += {'sparse enabled': sparse.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002224summary_info += {'strip binaries': get_option('strip')}
2225summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Daniele Buonocdad7812020-12-04 18:06:11 -05002226summary_info += {'link-time optimization (LTO)': get_option('b_lto')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02002227summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002228if targetos == 'darwin'
2229 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
2230endif
2231# TODO: add back version
Paolo Bonzini35be72b2020-02-06 14:17:15 +01002232summary_info += {'SDL support': sdl.found()}
2233summary_info += {'SDL image support': sdl_image.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002234# TODO: add back version
2235summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
2236summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
Paolo Bonzinib7612f42020-08-26 08:22:58 +02002237summary_info += {'pixman': pixman.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002238# TODO: add back version
2239summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
2240summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
2241summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
2242# TODO: add back version
2243summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
2244if config_host.has_key('CONFIG_GCRYPT')
2245 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
2246 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2247endif
2248# TODO: add back version
2249summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
2250if config_host.has_key('CONFIG_NETTLE')
2251 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
2252endif
2253summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
2254summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
Yonggang Luo5285e592020-10-13 07:43:48 +08002255summary_info += {'iconv support': iconv.found()}
2256summary_info += {'curses support': curses.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002257# TODO: add back version
2258summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
Paolo Bonzinif9cd86f2020-11-17 12:43:15 +01002259summary_info += {'curl support': curl.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002260summary_info += {'mingw32 support': targetos == 'windows'}
2261summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
2262summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
2263summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
2264summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
Misono Tomohirocece1162020-10-08 19:31:33 +09002265summary_info += {'build virtiofs daemon': have_virtiofsd}
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02002266summary_info += {'Multipath support': mpathpersist.found()}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01002267summary_info += {'VNC support': vnc.found()}
2268if vnc.found()
2269 summary_info += {'VNC SASL support': sasl.found()}
2270 summary_info += {'VNC JPEG support': jpeg.found()}
2271 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002272endif
2273summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
2274if config_host.has_key('CONFIG_XEN_BACKEND')
2275 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
2276endif
Paolo Bonzini8c6d4ff2020-11-17 13:02:17 +01002277summary_info += {'brlapi support': brlapi.found()}
Yonggang Luoe3667662020-10-16 06:06:25 +08002278summary_info += {'Documentation': build_docs}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002279summary_info += {'PIE': get_option('b_pie')}
2280summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
2281summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
2282summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
2283summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
2284summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
Paolo Bonzinic8d54502020-10-16 03:32:52 -04002285summary_info += {'Install blobs': get_option('install_blobs')}
Paolo Bonzini05512f52020-09-16 15:31:11 -04002286summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
2287summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
2288summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
2289summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
2290summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
2291if config_all.has_key('CONFIG_TCG')
2292 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
2293 summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
2294endif
Paolo Bonziniaa087962020-09-01 11:15:30 -04002295summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002296summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
2297summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02002298summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002299summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
2300summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
2301summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
2302summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
2303summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
2304summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
2305summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
Thomas Huthb54b82d2020-11-09 09:59:06 +01002306summary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002307summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
2308summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
2309summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
2310summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
Thomas Huthb54b82d2020-11-09 09:59:06 +01002311summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')}
Stefan Hajnoczie5e856c2020-11-10 17:11:19 +00002312summary_info += {'vhost-user-blk server support': have_vhost_user_blk_server}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002313summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
2314summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
2315summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
2316if config_host['TRACE_BACKENDS'].split().contains('simple')
2317 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
2318endif
2319# TODO: add back protocol and server version
2320summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
Paolo Bonzinifabd1e92020-11-17 13:11:25 +01002321summary_info += {'rbd support': rbd.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002322summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
2323summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02002324summary_info += {'U2F support': u2f.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002325summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
2326summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
2327summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
2328summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
Paolo Bonzini9db405a2020-11-17 13:11:25 +01002329summary_info += {'libiscsi support': libiscsi.found()}
Paolo Bonzini30045c02020-11-17 13:11:25 +01002330summary_info += {'libnfs support': libnfs.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002331summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
2332if targetos == 'windows'
2333 if 'WIN_SDK' in config_host
2334 summary_info += {'Windows SDK': config_host['WIN_SDK']}
2335 endif
2336 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
2337 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Stefan Hajnoczi4bad7c32020-09-14 10:52:31 +01002338 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002339endif
2340summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
Daniele Buono9e62ba42020-12-04 18:06:14 -05002341summary_info += {'CFI support': get_option('cfi')}
2342summary_info += {'CFI debug support': get_option('cfi_debug')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002343summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
2344summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
2345summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
2346summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
2347summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
Paolo Bonzini08821ca2020-11-17 13:01:26 +01002348summary_info += {'GlusterFS support': glusterfs.found()}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +04002349summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002350summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
2351summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
2352summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2353summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
Paolo Bonzini0c32a0a2020-11-17 13:11:25 +01002354summary_info += {'lzo support': lzo.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002355summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
Paolo Bonzini29ba6112020-11-17 13:07:52 +01002356summary_info += {'bzip2 support': libbzip2.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002357summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
2358summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
2359summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2360summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
Paolo Bonziniaa087962020-09-01 11:15:30 -04002361summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002362summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2363summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2364summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2365summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2366summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2367summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2368summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2369summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2370summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2371summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2372summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2373summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002374summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002375summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2376summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002377summary_info += {'libudev': libudev.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002378summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
2379summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2380summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2381if config_host.has_key('HAVE_GDB_BIN')
2382 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2383endif
2384summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2385summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2386summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
Max Reitza484a712020-10-27 20:05:41 +01002387summary_info += {'FUSE exports': fuse.found()}
Max Reitzdf4ea702020-10-27 20:05:46 +01002388summary_info += {'FUSE lseek': fuse_lseek.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002389summary(summary_info, bool_yn: true)
2390
2391if not supported_cpus.contains(cpu)
2392 message()
2393 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2394 message()
2395 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2396 message('The QEMU project intends to remove support for this host CPU in')
2397 message('a future release if nobody volunteers to maintain it and to')
2398 message('provide a build host for our continuous integration setup.')
2399 message('configure has succeeded and you can continue to build, but')
2400 message('if you care about QEMU on this platform you should contact')
2401 message('us upstream at qemu-devel@nongnu.org.')
2402endif
2403
2404if not supported_oses.contains(targetos)
2405 message()
2406 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2407 message()
2408 message('Host OS ' + targetos + 'support is not currently maintained.')
2409 message('The QEMU project intends to remove support for this host OS in')
2410 message('a future release if nobody volunteers to maintain it and to')
2411 message('provide a build host for our continuous integration setup.')
2412 message('configure has succeeded and you can continue to build, but')
2413 message('if you care about QEMU on this platform you should contact')
2414 message('us upstream at qemu-devel@nongnu.org.')
2415endif