blob: 0c676af1941a15c77f5e4a5846f8befc8a9958b3 [file] [log] [blame]
Paolo Bonzinia5665052019-06-10 12:05:14 +02001project('qemu', ['c'], meson_version: '>=0.55.0',
Gerd Hoffmann90756b22020-08-25 08:43:42 +02002 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11',
Paolo Bonzini3e0e5192020-09-01 12:48:00 -04003 'b_colorout=auto'],
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
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +020020build_docs = 'BUILD_DOCS' in config_host
Marc-André Lureau8fe11232020-09-11 14:42:48 +020021
22if get_option('qemu_suffix').startswith('/')
23 error('qemu_suffix cannot start with a /')
24endif
25
Marc-André Lureauab4c0992020-08-26 15:04:16 +040026qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040027qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini859aef02020-08-04 18:14:26 +020028config_host_data = configuration_data()
29genh = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020030
Paolo Bonzini760e4322020-08-26 08:09:48 +020031target_dirs = config_host['TARGET_DIRS'].split()
32have_user = false
33have_system = false
34foreach target : target_dirs
35 have_user = have_user or target.endswith('-user')
36 have_system = have_system or target.endswith('-softmmu')
37endforeach
38have_tools = 'CONFIG_TOOLS' in config_host
39have_block = have_system or have_tools
40
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040041python = import('python').find_installation()
42
43supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
44supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
45 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
46
47cpu = host_machine.cpu_family()
48targetos = host_machine.system()
49
50configure_file(input: files('scripts/ninjatool.py'),
51 output: 'ninjatool',
52 configuration: config_host)
53
Paolo Bonzini8a199802020-09-18 05:37:01 -040054if cpu in ['x86', 'x86_64']
55 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
56elif cpu == 'aarch64'
57 kvm_targets = ['aarch64-softmmu']
58elif cpu == 's390x'
59 kvm_targets = ['s390x-softmmu']
60elif cpu in ['ppc', 'ppc64']
61 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
Huacai Chenfbc58842020-10-07 16:39:28 +080062elif cpu in ['mips', 'mips64']
63 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
Paolo Bonzini8a199802020-09-18 05:37:01 -040064else
65 kvm_targets = []
66endif
67
68accelerator_targets = { 'CONFIG_KVM': kvm_targets }
69if cpu in ['x86', 'x86_64']
70 accelerator_targets += {
71 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
72 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
73 'CONFIG_HVF': ['x86_64-softmmu'],
74 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
75 }
76endif
77
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040078##################
79# Compiler flags #
80##################
81
Alexander Bulekovff9ed622020-09-09 18:05:16 -040082# Specify linker-script with add_project_link_arguments so that it is not placed
83# within a linker --start-group/--end-group pair
84if 'CONFIG_FUZZ' in config_host
85 add_project_link_arguments(['-Wl,-T,',
86 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
87 native: false, language: ['c', 'cpp', 'objc'])
88endif
89
Paolo Bonzinia5665052019-06-10 12:05:14 +020090add_project_arguments(config_host['QEMU_CFLAGS'].split(),
91 native: false, language: ['c', 'objc'])
92add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
93 native: false, language: 'cpp')
94add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
95 native: false, language: ['c', 'cpp', 'objc'])
96add_project_arguments(config_host['QEMU_INCLUDES'].split(),
97 language: ['c', 'cpp', 'objc'])
98
Alexander Bulekovc46f76d2020-09-02 13:36:50 -040099
Marc-André Lureaufc929892019-07-13 01:47:54 +0400100link_language = meson.get_external_property('link_language', 'cpp')
101if link_language == 'cpp'
102 add_languages('cpp', required: true, native: false)
103endif
Paolo Bonzinia5665052019-06-10 12:05:14 +0200104if host_machine.system() == 'darwin'
105 add_languages('objc', required: false, native: false)
106endif
107
Paolo Bonzinideb62372020-09-01 07:51:16 -0400108sparse = find_program('cgcc', required: get_option('sparse'))
109if sparse.found()
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100110 run_target('sparse',
111 command: [find_program('scripts/check_sparse.py'),
Paolo Bonzinideb62372020-09-01 07:51:16 -0400112 'compile_commands.json', sparse.full_path(), '-Wbitwise',
113 '-Wno-transparent-union', '-Wno-old-initializer',
114 '-Wno-non-pointer-null'])
Paolo Bonzini968b4db2020-02-03 14:45:33 +0100115endif
116
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200117###########################################
118# Target-specific checks and dependencies #
119###########################################
120
121if targetos != 'linux' and get_option('mpath').enabled()
122 error('Multipath is supported only on Linux')
123endif
124
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400125m = cc.find_library('m', required: false)
126util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +0200127winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400128socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400129version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400130coref = []
131iokit = []
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400132emulator_link_args = []
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400133cocoa = not_found
Paolo Bonzini8a199802020-09-18 05:37:01 -0400134hvf = not_found
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400135if targetos == 'windows'
136 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +0200137 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400138
139 win = import('windows')
140 version_res = win.compile_resources('version.rc',
141 depend_files: files('pc-bios/qemu-nsis.ico'),
142 include_directories: include_directories('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +0400143elif targetos == 'darwin'
144 coref = dependency('appleframeworks', modules: 'CoreFoundation')
145 iokit = dependency('appleframeworks', modules: 'IOKit')
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400146 cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
Paolo Bonzinicfad62f2020-08-09 23:47:45 +0200147elif targetos == 'sunos'
148 socket = [cc.find_library('socket'),
149 cc.find_library('nsl'),
150 cc.find_library('resolv')]
151elif targetos == 'haiku'
152 socket = [cc.find_library('posix_error_mapper'),
153 cc.find_library('network'),
154 cc.find_library('bsd')]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -0400155elif targetos == 'openbsd'
156 if not get_option('tcg').disabled() and target_dirs.length() > 0
157 # Disable OpenBSD W^X if available
158 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
159 endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400160endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200161
Paolo Bonzini8a199802020-09-18 05:37:01 -0400162accelerators = []
163if not get_option('kvm').disabled() and targetos == 'linux'
164 accelerators += 'CONFIG_KVM'
165endif
166if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
167 accelerators += 'CONFIG_XEN'
168 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
169else
170 have_xen_pci_passthrough = false
171endif
172if not get_option('whpx').disabled() and targetos == 'windows'
173 if get_option('whpx').enabled() and cpu != 'x86_64'
174 error('WHPX requires 64-bit host')
175 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
176 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
177 accelerators += 'CONFIG_WHPX'
178 endif
179endif
180if not get_option('hvf').disabled()
181 hvf = dependency('appleframeworks', modules: 'Hypervisor',
182 required: get_option('hvf'))
183 if hvf.found()
184 accelerators += 'CONFIG_HVF'
185 endif
186endif
187if not get_option('hax').disabled()
188 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
189 accelerators += 'CONFIG_HAX'
190 endif
191endif
192if not get_option('tcg').disabled()
193 if cpu not in supported_cpus
194 if 'CONFIG_TCG_INTERPRETER' in config_host
195 warning('Unsupported CPU @0@, will use TCG with TCI (experimental)'.format(cpu))
196 else
197 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
198 endif
199 endif
200 accelerators += 'CONFIG_TCG'
201 config_host += { 'CONFIG_TCG': 'y' }
202endif
203
204if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
205 error('KVM not available on this platform')
206endif
207if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
208 error('HVF not available on this platform')
209endif
210if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
211 error('WHPX not available on this platform')
212endif
213if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
214 if 'CONFIG_XEN' in accelerators
215 error('Xen PCI passthrough not available on this platform')
216 else
217 error('Xen PCI passthrough requested but Xen not enabled')
218 endif
219endif
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400220if not cocoa.found() and get_option('cocoa').enabled()
221 error('Cocoa not available on this platform')
222endif
223
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200224################
225# Dependencies #
226################
227
Paolo Bonzini215b0c22020-09-01 08:41:17 -0400228# The path to glib.h is added to all compilation commands. This was
229# grandfathered in from the QEMU Makefiles.
230add_project_arguments(config_host['GLIB_CFLAGS'].split(),
231 native: false, language: ['c', 'cpp', 'objc'])
232glib = declare_dependency(link_args: config_host['GLIB_LIBS'].split())
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400233gio = not_found
234if 'CONFIG_GIO' in config_host
235 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
236 link_args: config_host['GIO_LIBS'].split())
237endif
238lttng = not_found
239if 'CONFIG_TRACE_UST' in config_host
240 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
241endif
242urcubp = not_found
243if 'CONFIG_TRACE_UST' in config_host
244 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
245endif
Daniel P. Berrangé46859d92020-09-01 14:30:49 +0100246gcrypt = not_found
247if 'CONFIG_GCRYPT' in config_host
248 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
249 link_args: config_host['GCRYPT_LIBS'].split())
250endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400251nettle = not_found
252if 'CONFIG_NETTLE' in config_host
253 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
254 link_args: config_host['NETTLE_LIBS'].split())
255endif
256gnutls = not_found
257if 'CONFIG_GNUTLS' in config_host
258 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
259 link_args: config_host['GNUTLS_LIBS'].split())
260endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200261pixman = not_found
262if have_system or have_tools
263 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzini1a949332020-08-31 06:27:00 -0400264 method: 'pkg-config', static: enable_static)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200265endif
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400266pam = not_found
267if 'CONFIG_AUTH_PAM' in config_host
268 pam = cc.find_library('pam')
269endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400270libaio = cc.find_library('aio', required: false)
Paolo Bonzini1ffb3bb2020-08-28 19:33:54 +0200271zlib = dependency('zlib', required: true, static: enable_static)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400272linux_io_uring = not_found
273if 'CONFIG_LINUX_IO_URING' in config_host
274 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
275 link_args: config_host['LINUX_IO_URING_LIBS'].split())
276endif
277libxml2 = not_found
278if 'CONFIG_LIBXML2' in config_host
279 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
280 link_args: config_host['LIBXML2_LIBS'].split())
281endif
282libnfs = not_found
283if 'CONFIG_LIBNFS' in config_host
284 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
285endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400286libattr = not_found
287if 'CONFIG_ATTR' in config_host
288 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
289endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100290seccomp = not_found
291if 'CONFIG_SECCOMP' in config_host
292 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
293 link_args: config_host['SECCOMP_LIBS'].split())
294endif
295libcap_ng = not_found
296if 'CONFIG_LIBCAP_NG' in config_host
297 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
298endif
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400299if get_option('xkbcommon').auto() and not have_system and not have_tools
300 xkbcommon = not_found
301else
302 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400303 method: 'pkg-config', static: enable_static)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400304endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400305vde = not_found
306if config_host.has_key('CONFIG_VDE')
307 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
308endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200309pulse = not_found
310if 'CONFIG_LIBPULSE' in config_host
311 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
312 link_args: config_host['PULSE_LIBS'].split())
313endif
314alsa = not_found
315if 'CONFIG_ALSA' in config_host
316 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
317 link_args: config_host['ALSA_LIBS'].split())
318endif
319jack = not_found
320if 'CONFIG_LIBJACK' in config_host
321 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
322endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200323spice = not_found
324if 'CONFIG_SPICE' in config_host
325 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
326 link_args: config_host['SPICE_LIBS'].split())
327endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400328rt = cc.find_library('rt', required: false)
Paolo Bonziniccf7afa2020-09-01 06:44:23 -0400329libdl = not_found
330if 'CONFIG_PLUGIN' in config_host
331 libdl = cc.find_library('dl', required: true)
332endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200333libiscsi = not_found
334if 'CONFIG_LIBISCSI' in config_host
335 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
336 link_args: config_host['LIBISCSI_LIBS'].split())
337endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400338zstd = not_found
339if 'CONFIG_ZSTD' in config_host
340 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
341 link_args: config_host['ZSTD_LIBS'].split())
342endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400343gbm = not_found
344if 'CONFIG_GBM' in config_host
345 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
346 link_args: config_host['GBM_LIBS'].split())
347endif
348virgl = not_found
349if 'CONFIG_VIRGL' in config_host
350 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
351 link_args: config_host['VIRGL_LIBS'].split())
352endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400353curl = not_found
354if 'CONFIG_CURL' in config_host
355 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
356 link_args: config_host['CURL_LIBS'].split())
357endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200358libudev = not_found
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200359if targetos == 'linux' and (have_system or have_tools)
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200360 libudev = dependency('libudev',
361 required: get_option('mpath').enabled(),
362 static: enable_static)
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200363endif
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200364
365mpathpersist = not_found
366mpathpersist_new_api = false
367if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
368 mpath_test_source_new = '''
369 #include <libudev.h>
370 #include <mpath_persist.h>
371 unsigned mpath_mx_alloc_len = 1024;
372 int logsink;
373 static struct config *multipath_conf;
374 extern struct udev *udev;
375 extern struct config *get_multipath_config(void);
376 extern void put_multipath_config(struct config *conf);
377 struct udev *udev;
378 struct config *get_multipath_config(void) { return multipath_conf; }
379 void put_multipath_config(struct config *conf) { }
380 int main(void) {
381 udev = udev_new();
382 multipath_conf = mpath_lib_init();
383 return 0;
384 }'''
385 mpath_test_source_old = '''
386 #include <libudev.h>
387 #include <mpath_persist.h>
388 unsigned mpath_mx_alloc_len = 1024;
389 int logsink;
390 int main(void) {
391 struct udev *udev = udev_new();
392 mpath_lib_init(udev);
393 return 0;
394 }'''
Paolo Bonzini43b43a42020-09-17 12:25:09 +0200395 mpathlibs = [libudev]
396 if enable_static
397 mpathlibs += cc.find_library('devmapper',
398 required: get_option('mpath'),
399 static: enable_static)
400 endif
401 mpathlibs += cc.find_library('multipath',
402 required: get_option('mpath'),
403 static: enable_static)
404 mpathlibs += cc.find_library('mpathpersist',
405 required: get_option('mpath'),
406 static: enable_static)
407 foreach lib: mpathlibs
408 if not lib.found()
409 mpathlibs = []
410 break
411 endif
412 endforeach
413 if mpathlibs.length() > 0
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200414 if cc.links(mpath_test_source_new, dependencies: mpathlibs)
415 mpathpersist = declare_dependency(dependencies: mpathlibs)
416 mpathpersist_new_api = true
417 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
418 mpathpersist = declare_dependency(dependencies: mpathlibs)
419 else
420 if get_option('mpath').enabled()
421 error('Cannot detect libmpathpersist API')
422 else
423 warning('Cannot detect libmpathpersist API, disabling')
424 endif
425 endif
426 endif
427endif
428
Paolo Bonzini26347332019-07-29 15:40:07 +0200429brlapi = not_found
430if 'CONFIG_BRLAPI' in config_host
431 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
432endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100433
Paolo Bonzini760e4322020-08-26 08:09:48 +0200434sdl = not_found
435if have_system
Yonggang Luo363743d2020-08-26 23:10:03 +0800436 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200437 sdl_image = not_found
438endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100439if sdl.found()
440 # work around 2.0.8 bug
441 sdl = declare_dependency(compile_args: '-Wno-undef',
442 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200443 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400444 method: 'pkg-config', static: enable_static)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100445else
446 if get_option('sdl_image').enabled()
Sergei Trofimovicha8dc2ac2020-09-08 08:40:16 +0100447 error('sdl-image required, but SDL was @0@'.format(
448 get_option('sdl').disabled() ? 'disabled' : 'not found'))
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100449 endif
450 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200451endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100452
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400453rbd = not_found
454if 'CONFIG_RBD' in config_host
455 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
456endif
457glusterfs = not_found
458if 'CONFIG_GLUSTERFS' in config_host
459 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
460 link_args: config_host['GLUSTERFS_LIBS'].split())
461endif
462libssh = not_found
463if 'CONFIG_LIBSSH' in config_host
464 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
465 link_args: config_host['LIBSSH_LIBS'].split())
466endif
467libbzip2 = not_found
468if 'CONFIG_BZIP2' in config_host
469 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
470endif
471liblzfse = not_found
472if 'CONFIG_LZFSE' in config_host
473 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
474endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200475oss = not_found
476if 'CONFIG_AUDIO_OSS' in config_host
477 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
478endif
479dsound = not_found
480if 'CONFIG_AUDIO_DSOUND' in config_host
481 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
482endif
483coreaudio = not_found
484if 'CONFIG_AUDIO_COREAUDIO' in config_host
485 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
486endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400487opengl = not_found
488if 'CONFIG_OPENGL' in config_host
Paolo Bonzinide2d3002020-09-01 08:41:17 -0400489 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
490 link_args: config_host['OPENGL_LIBS'].split())
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400491endif
492gtk = not_found
493if 'CONFIG_GTK' in config_host
494 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
495 link_args: config_host['GTK_LIBS'].split())
496endif
497vte = not_found
498if 'CONFIG_VTE' in config_host
499 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
500 link_args: config_host['VTE_LIBS'].split())
501endif
502x11 = not_found
503if 'CONFIG_X11' in config_host
504 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
505 link_args: config_host['X11_LIBS'].split())
506endif
507curses = not_found
508if 'CONFIG_CURSES' in config_host
509 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
510 link_args: config_host['CURSES_LIBS'].split())
511endif
512iconv = not_found
513if 'CONFIG_ICONV' in config_host
514 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
515 link_args: config_host['ICONV_LIBS'].split())
516endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100517vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400518png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400519jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400520sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100521if get_option('vnc').enabled()
522 vnc = declare_dependency() # dummy dependency
523 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400524 method: 'pkg-config', static: enable_static)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100525 jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
526 required: get_option('vnc_jpeg'),
527 static: enable_static)
528 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
529 required: get_option('vnc_sasl'),
530 static: enable_static)
531 if sasl.found()
532 sasl = declare_dependency(dependencies: sasl,
533 compile_args: '-DSTRUCT_IOVEC_DEFINED')
534 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400535endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400536snappy = not_found
537if 'CONFIG_SNAPPY' in config_host
538 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
539endif
540lzo = not_found
541if 'CONFIG_LZO' in config_host
542 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
543endif
Marc-André Lureau55166232019-07-24 19:16:22 +0400544rdma = not_found
545if 'CONFIG_RDMA' in config_host
546 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
547endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400548numa = not_found
549if 'CONFIG_NUMA' in config_host
550 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
551endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400552xen = not_found
553if 'CONFIG_XEN_BACKEND' in config_host
554 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
555 link_args: config_host['XEN_LIBS'].split())
556endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200557cacard = not_found
558if 'CONFIG_SMARTCARD' in config_host
559 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
560 link_args: config_host['SMARTCARD_LIBS'].split())
561endif
César Belley0a40bcb2020-08-26 13:42:04 +0200562u2f = not_found
563if have_system
564 u2f = dependency('u2f-emu', required: get_option('u2f'),
565 method: 'pkg-config',
566 static: enable_static)
567endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200568usbredir = not_found
569if 'CONFIG_USB_REDIR' in config_host
570 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
571 link_args: config_host['USB_REDIR_LIBS'].split())
572endif
573libusb = not_found
574if 'CONFIG_USB_LIBUSB' in config_host
575 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
576 link_args: config_host['LIBUSB_LIBS'].split())
577endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400578libpmem = not_found
579if 'CONFIG_LIBPMEM' in config_host
580 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
581 link_args: config_host['LIBPMEM_LIBS'].split())
582endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600583libdaxctl = not_found
584if 'CONFIG_LIBDAXCTL' in config_host
585 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
586endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +0400587tasn1 = not_found
588if 'CONFIG_TASN1' in config_host
589 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
590 link_args: config_host['TASN1_LIBS'].split())
591endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400592keyutils = dependency('libkeyutils', required: false,
593 method: 'pkg-config', static: enable_static)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400594
Marc-André Lureau3909def2020-08-28 15:07:33 +0400595has_gettid = cc.has_function('gettid')
596
Paolo Bonziniaa087962020-09-01 11:15:30 -0400597# Malloc tests
598
599malloc = []
600if get_option('malloc') == 'system'
601 has_malloc_trim = \
602 not get_option('malloc_trim').disabled() and \
603 cc.links('''#include <malloc.h>
604 int main(void) { malloc_trim(0); return 0; }''')
605else
606 has_malloc_trim = false
607 malloc = cc.find_library(get_option('malloc'), required: true)
608endif
609if not has_malloc_trim and get_option('malloc_trim').enabled()
610 if get_option('malloc') == 'system'
611 error('malloc_trim not available on this platform.')
612 else
613 error('malloc_trim not available with non-libc memory allocator')
614 endif
615endif
616
Paolo Bonzini859aef02020-08-04 18:14:26 +0200617# Create config-host.h
618
Paolo Bonzinib4e312e2020-09-01 11:28:59 -0400619config_host_data.set('CONFIG_COCOA', cocoa.found())
Paolo Bonzinif01496a2020-09-16 17:54:14 +0200620config_host_data.set('CONFIG_LIBUDEV', libudev.found())
Paolo Bonzini6ec0e152020-09-16 18:07:29 +0200621config_host_data.set('CONFIG_MPATH', mpathpersist.found())
622config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100623config_host_data.set('CONFIG_SDL', sdl.found())
624config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100625config_host_data.set('CONFIG_VNC', vnc.found())
626config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
627config_host_data.set('CONFIG_VNC_PNG', png.found())
628config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +0200629config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400630config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +0400631config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonziniaa087962020-09-01 11:15:30 -0400632config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
Paolo Bonzini859aef02020-08-04 18:14:26 +0200633config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
634config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
635config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
636config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
637
Paolo Bonzini765686d2020-09-18 06:37:21 -0400638ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
Paolo Bonzini859aef02020-08-04 18:14:26 +0200639arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
Paolo Bonzinif4f5ed22020-08-18 11:55:47 +0200640strings = ['HOST_DSOSUF', 'CONFIG_IASL', 'bindir', 'prefix', 'qemu_confdir', 'qemu_datadir',
Paolo Bonzini859aef02020-08-04 18:14:26 +0200641 'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
Paolo Bonzinif4f5ed22020-08-18 11:55:47 +0200642 'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath', 'sysconfdir']
Paolo Bonzini859aef02020-08-04 18:14:26 +0200643foreach k, v: config_host
Paolo Bonzini765686d2020-09-18 06:37:21 -0400644 if ignored.contains(k)
645 # do nothing
646 elif arrays.contains(k)
Paolo Bonzini859aef02020-08-04 18:14:26 +0200647 if v != ''
648 v = '"' + '", "'.join(v.split()) + '", '
649 endif
650 config_host_data.set(k, v)
651 elif k == 'ARCH'
652 config_host_data.set('HOST_' + v.to_upper(), 1)
653 elif strings.contains(k)
654 if not k.startswith('CONFIG_')
655 k = 'CONFIG_' + k.to_upper()
656 endif
657 config_host_data.set_quoted(k, v)
658 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
659 config_host_data.set(k, v == 'y' ? 1 : v)
660 endif
661endforeach
Paolo Bonzini859aef02020-08-04 18:14:26 +0200662
Paolo Bonzini2becc362020-02-03 11:42:03 +0100663minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini05512f52020-09-16 15:31:11 -0400664config_all = {}
Paolo Bonzinia98006b2020-09-01 05:32:23 -0400665config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400666config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100667config_devices_mak_list = []
668config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +0200669config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100670config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400671
672disassemblers = {
673 'alpha' : ['CONFIG_ALPHA_DIS'],
674 'arm' : ['CONFIG_ARM_DIS'],
675 'avr' : ['CONFIG_AVR_DIS'],
676 'cris' : ['CONFIG_CRIS_DIS'],
677 'hppa' : ['CONFIG_HPPA_DIS'],
678 'i386' : ['CONFIG_I386_DIS'],
679 'x86_64' : ['CONFIG_I386_DIS'],
680 'x32' : ['CONFIG_I386_DIS'],
681 'lm32' : ['CONFIG_LM32_DIS'],
682 'm68k' : ['CONFIG_M68K_DIS'],
683 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
684 'mips' : ['CONFIG_MIPS_DIS'],
685 'moxie' : ['CONFIG_MOXIE_DIS'],
686 'nios2' : ['CONFIG_NIOS2_DIS'],
687 'or1k' : ['CONFIG_OPENRISC_DIS'],
688 'ppc' : ['CONFIG_PPC_DIS'],
689 'riscv' : ['CONFIG_RISCV_DIS'],
690 'rx' : ['CONFIG_RX_DIS'],
691 's390' : ['CONFIG_S390_DIS'],
692 'sh4' : ['CONFIG_SH4_DIS'],
693 'sparc' : ['CONFIG_SPARC_DIS'],
694 'xtensa' : ['CONFIG_XTENSA_DIS'],
695}
696if link_language == 'cpp'
697 disassemblers += {
698 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
699 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
700 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
701 }
702endif
703
Paolo Bonzini2becc362020-02-03 11:42:03 +0100704kconfig_external_symbols = [
705 'CONFIG_KVM',
706 'CONFIG_XEN',
707 'CONFIG_TPM',
708 'CONFIG_SPICE',
709 'CONFIG_IVSHMEM',
710 'CONFIG_OPENGL',
711 'CONFIG_X11',
712 'CONFIG_VHOST_USER',
Laurent Vivier40bc0ca2020-09-24 23:00:23 +0200713 'CONFIG_VHOST_VDPA',
Paolo Bonzini2becc362020-02-03 11:42:03 +0100714 'CONFIG_VHOST_KERNEL',
715 'CONFIG_VIRTFS',
716 'CONFIG_LINUX',
717 'CONFIG_PVRDMA',
718]
Paolo Bonzinia9a74902020-09-21 05:11:01 -0400719ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400720
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -0400721default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
722actual_target_dirs = []
Paolo Bonzinifbb41212020-10-05 11:31:15 +0200723fdt_required = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400724foreach target : target_dirs
Paolo Bonzini765686d2020-09-18 06:37:21 -0400725 config_target = { 'TARGET_NAME': target.split('-')[0] }
726 if target.endswith('linux-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -0400727 if targetos != 'linux'
728 if default_targets
729 continue
730 endif
731 error('Target @0@ is only available on a Linux host'.format(target))
732 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -0400733 config_target += { 'CONFIG_LINUX_USER': 'y' }
734 elif target.endswith('bsd-user')
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -0400735 if 'CONFIG_BSD' not in config_host
736 if default_targets
737 continue
738 endif
739 error('Target @0@ is only available on a BSD host'.format(target))
740 endif
Paolo Bonzini765686d2020-09-18 06:37:21 -0400741 config_target += { 'CONFIG_BSD_USER': 'y' }
742 elif target.endswith('softmmu')
743 config_target += { 'CONFIG_SOFTMMU': 'y' }
744 endif
745 if target.endswith('-user')
746 config_target += {
747 'CONFIG_USER_ONLY': 'y',
748 'CONFIG_QEMU_INTERP_PREFIX':
749 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
750 }
751 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +0200752
Paolo Bonzini8a199802020-09-18 05:37:01 -0400753 have_accel = false
754 foreach sym: accelerators
755 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
756 config_target += { sym: 'y' }
757 config_all += { sym: 'y' }
758 if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
759 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
760 endif
761 have_accel = true
762 endif
763 endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -0400764 if not have_accel
765 if default_targets
766 continue
767 endif
768 error('No accelerator available for target @0@'.format(target))
769 endif
Paolo Bonzini8a199802020-09-18 05:37:01 -0400770
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -0400771 actual_target_dirs += target
Paolo Bonzini765686d2020-09-18 06:37:21 -0400772 config_target += keyval.load('default-configs/targets' / target + '.mak')
Paolo Bonzinia9a74902020-09-21 05:11:01 -0400773 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
Paolo Bonzini765686d2020-09-18 06:37:21 -0400774
Paolo Bonzinifbb41212020-10-05 11:31:15 +0200775 if 'TARGET_NEED_FDT' in config_target
776 fdt_required += target
777 endif
778
Paolo Bonzinifa731682020-09-21 05:19:07 -0400779 # Add default keys
780 if 'TARGET_BASE_ARCH' not in config_target
781 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
782 endif
783 if 'TARGET_ABI_DIR' not in config_target
784 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
785 endif
Paolo Bonzini859aef02020-08-04 18:14:26 +0200786
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400787 foreach k, v: disassemblers
788 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
789 foreach sym: v
790 config_target += { sym: 'y' }
791 config_all_disas += { sym: 'y' }
792 endforeach
793 endif
794 endforeach
795
Paolo Bonzini859aef02020-08-04 18:14:26 +0200796 config_target_data = configuration_data()
797 foreach k, v: config_target
798 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
799 # do nothing
800 elif ignored.contains(k)
801 # do nothing
802 elif k == 'TARGET_BASE_ARCH'
Paolo Bonzinia9a74902020-09-21 05:11:01 -0400803 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
804 # not used to select files from sourcesets.
Paolo Bonzini859aef02020-08-04 18:14:26 +0200805 config_target_data.set('TARGET_' + v.to_upper(), 1)
Paolo Bonzini765686d2020-09-18 06:37:21 -0400806 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
Paolo Bonzini859aef02020-08-04 18:14:26 +0200807 config_target_data.set_quoted(k, v)
808 elif v == 'y'
809 config_target_data.set(k, 1)
810 else
811 config_target_data.set(k, v)
812 endif
813 endforeach
814 config_target_h += {target: configure_file(output: target + '-config-target.h',
815 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100816
817 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +0100818 base_kconfig = []
819 foreach sym : kconfig_external_symbols
Paolo Bonzini859aef02020-08-04 18:14:26 +0200820 if sym in config_target or sym in config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +0100821 base_kconfig += '@0@=y'.format(sym)
822 endif
823 endforeach
824
825 config_devices_mak = target + '-config-devices.mak'
826 config_devices_mak = configure_file(
Paolo Bonzini1bb4cb12020-09-18 06:06:09 -0400827 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
Paolo Bonzini2becc362020-02-03 11:42:03 +0100828 output: config_devices_mak,
829 depfile: config_devices_mak + '.d',
830 capture: true,
831 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
832 config_devices_mak, '@DEPFILE@', '@INPUT@',
833 base_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +0200834
835 config_devices_data = configuration_data()
836 config_devices = keyval.load(config_devices_mak)
837 foreach k, v: config_devices
838 config_devices_data.set(k, 1)
839 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +0100840 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +0200841 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
842 configuration: config_devices_data)}
843 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -0400844 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +0100845 endif
846 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400847endforeach
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -0400848target_dirs = actual_target_dirs
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400849
Paolo Bonzini2becc362020-02-03 11:42:03 +0100850# This configuration is used to build files that are shared by
851# multiple binaries, and then extracted out of the "common"
852# static_library target.
853#
854# We do not use all_sources()/all_dependencies(), because it would
855# build literally all source files, including devices only used by
856# targets that are not built for this compilation. The CONFIG_ALL
857# pseudo symbol replaces it.
858
Paolo Bonzini05512f52020-09-16 15:31:11 -0400859config_all += config_all_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +0100860config_all += config_host
861config_all += config_all_disas
862config_all += {
863 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
864 'CONFIG_SOFTMMU': have_system,
865 'CONFIG_USER_ONLY': have_user,
866 'CONFIG_ALL': true,
867}
868
Richard Henderson8b18cdb2020-09-13 12:19:25 -0700869# Submodules
870
871capstone = not_found
872capstone_opt = get_option('capstone')
873if capstone_opt in ['enabled', 'auto', 'system']
874 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
Richard Hendersonbcf36862020-09-21 09:46:16 -0700875 capstone = dependency('capstone', version: '>=4.0',
876 static: enable_static, method: 'pkg-config',
Richard Henderson8b18cdb2020-09-13 12:19:25 -0700877 required: capstone_opt == 'system' or
878 capstone_opt == 'enabled' and not have_internal)
879 if capstone.found()
880 capstone_opt = 'system'
881 elif have_internal
882 capstone_opt = 'internal'
883 else
884 capstone_opt = 'disabled'
885 endif
886endif
887if capstone_opt == 'internal'
888 capstone_data = configuration_data()
889 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
890
891 capstone_files = files(
892 'capstone/cs.c',
893 'capstone/MCInst.c',
894 'capstone/MCInstrDesc.c',
895 'capstone/MCRegisterInfo.c',
896 'capstone/SStream.c',
897 'capstone/utils.c'
898 )
899
900 if 'CONFIG_ARM_DIS' in config_all_disas
901 capstone_data.set('CAPSTONE_HAS_ARM', '1')
902 capstone_files += files(
903 'capstone/arch/ARM/ARMDisassembler.c',
904 'capstone/arch/ARM/ARMInstPrinter.c',
905 'capstone/arch/ARM/ARMMapping.c',
906 'capstone/arch/ARM/ARMModule.c'
907 )
908 endif
909
910 # FIXME: This config entry currently depends on a c++ compiler.
911 # Which is needed for building libvixl, but not for capstone.
912 if 'CONFIG_ARM_A64_DIS' in config_all_disas
913 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
914 capstone_files += files(
915 'capstone/arch/AArch64/AArch64BaseInfo.c',
916 'capstone/arch/AArch64/AArch64Disassembler.c',
917 'capstone/arch/AArch64/AArch64InstPrinter.c',
918 'capstone/arch/AArch64/AArch64Mapping.c',
919 'capstone/arch/AArch64/AArch64Module.c'
920 )
921 endif
922
923 if 'CONFIG_PPC_DIS' in config_all_disas
924 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
925 capstone_files += files(
926 'capstone/arch/PowerPC/PPCDisassembler.c',
927 'capstone/arch/PowerPC/PPCInstPrinter.c',
928 'capstone/arch/PowerPC/PPCMapping.c',
929 'capstone/arch/PowerPC/PPCModule.c'
930 )
931 endif
932
Richard Henderson3d562842020-01-04 07:24:59 +1000933 if 'CONFIG_S390_DIS' in config_all_disas
934 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
935 capstone_files += files(
936 'capstone/arch/SystemZ/SystemZDisassembler.c',
937 'capstone/arch/SystemZ/SystemZInstPrinter.c',
938 'capstone/arch/SystemZ/SystemZMapping.c',
939 'capstone/arch/SystemZ/SystemZModule.c',
940 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
941 )
942 endif
943
Richard Henderson8b18cdb2020-09-13 12:19:25 -0700944 if 'CONFIG_I386_DIS' in config_all_disas
945 capstone_data.set('CAPSTONE_HAS_X86', 1)
946 capstone_files += files(
947 'capstone/arch/X86/X86Disassembler.c',
948 'capstone/arch/X86/X86DisassemblerDecoder.c',
949 'capstone/arch/X86/X86ATTInstPrinter.c',
950 'capstone/arch/X86/X86IntelInstPrinter.c',
Richard Hendersoneef20e42020-09-14 16:02:02 -0700951 'capstone/arch/X86/X86InstPrinterCommon.c',
Richard Henderson8b18cdb2020-09-13 12:19:25 -0700952 'capstone/arch/X86/X86Mapping.c',
953 'capstone/arch/X86/X86Module.c'
954 )
955 endif
956
957 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
958
959 capstone_cargs = [
960 # FIXME: There does not seem to be a way to completely replace the c_args
961 # that come from add_project_arguments() -- we can only add to them.
962 # So: disable all warnings with a big hammer.
963 '-Wno-error', '-w',
964
965 # Include all configuration defines via a header file, which will wind up
966 # as a dependency on the object file, and thus changes here will result
967 # in a rebuild.
968 '-include', 'capstone-defs.h'
969 ]
970
971 libcapstone = static_library('capstone',
972 sources: capstone_files,
973 c_args: capstone_cargs,
974 include_directories: 'capstone/include')
975 capstone = declare_dependency(link_with: libcapstone,
Richard Hendersoneef20e42020-09-14 16:02:02 -0700976 include_directories: 'capstone/include/capstone')
Richard Henderson8b18cdb2020-09-13 12:19:25 -0700977endif
Paolo Bonzini4d34a862020-10-05 11:31:15 +0200978
979slirp = not_found
980slirp_opt = 'disabled'
981if have_system
982 slirp_opt = get_option('slirp')
983 if slirp_opt in ['enabled', 'auto', 'system']
984 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
985 slirp = dependency('slirp', static: enable_static,
986 method: 'pkg-config',
987 required: slirp_opt == 'system' or
988 slirp_opt == 'enabled' and not have_internal)
989 if slirp.found()
990 slirp_opt = 'system'
991 elif have_internal
992 slirp_opt = 'internal'
993 else
994 slirp_opt = 'disabled'
995 endif
996 endif
997 if slirp_opt == 'internal'
998 slirp_deps = []
999 if targetos == 'windows'
1000 slirp_deps = cc.find_library('iphlpapi')
1001 endif
1002 slirp_conf = configuration_data()
1003 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1004 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1005 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1006 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1007 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1008 slirp_files = [
1009 'slirp/src/arp_table.c',
1010 'slirp/src/bootp.c',
1011 'slirp/src/cksum.c',
1012 'slirp/src/dhcpv6.c',
1013 'slirp/src/dnssearch.c',
1014 'slirp/src/if.c',
1015 'slirp/src/ip6_icmp.c',
1016 'slirp/src/ip6_input.c',
1017 'slirp/src/ip6_output.c',
1018 'slirp/src/ip_icmp.c',
1019 'slirp/src/ip_input.c',
1020 'slirp/src/ip_output.c',
1021 'slirp/src/mbuf.c',
1022 'slirp/src/misc.c',
1023 'slirp/src/ncsi.c',
1024 'slirp/src/ndp_table.c',
1025 'slirp/src/sbuf.c',
1026 'slirp/src/slirp.c',
1027 'slirp/src/socket.c',
1028 'slirp/src/state.c',
1029 'slirp/src/stream.c',
1030 'slirp/src/tcp_input.c',
1031 'slirp/src/tcp_output.c',
1032 'slirp/src/tcp_subr.c',
1033 'slirp/src/tcp_timer.c',
1034 'slirp/src/tftp.c',
1035 'slirp/src/udp.c',
1036 'slirp/src/udp6.c',
1037 'slirp/src/util.c',
1038 'slirp/src/version.c',
1039 'slirp/src/vmstate.c',
1040 ]
1041
1042 configure_file(
1043 input : 'slirp/src/libslirp-version.h.in',
1044 output : 'libslirp-version.h',
1045 configuration: slirp_conf)
1046
1047 slirp_inc = include_directories('slirp', 'slirp/src')
1048 libslirp = static_library('slirp',
1049 sources: slirp_files,
1050 c_args: slirp_cargs,
1051 include_directories: slirp_inc)
1052 slirp = declare_dependency(link_with: libslirp,
1053 dependencies: slirp_deps,
1054 include_directories: slirp_inc)
1055 endif
1056endif
1057
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001058fdt = not_found
1059fdt_opt = get_option('fdt')
1060if have_system
1061 if fdt_opt in ['enabled', 'auto', 'system']
1062 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
1063 fdt = cc.find_library('fdt', static: enable_static,
1064 required: fdt_opt == 'system' or
1065 fdt_opt == 'enabled' and not have_internal)
1066 if fdt.found() and cc.links('''
1067 #include <libfdt.h>
1068 #include <libfdt_env.h>
1069 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1070 dependencies: fdt)
1071 fdt_opt = 'system'
1072 elif have_internal
1073 fdt_opt = 'internal'
1074 else
1075 fdt_opt = 'disabled'
1076 endif
1077 endif
1078 if fdt_opt == 'internal'
1079 fdt_files = files(
1080 'dtc/libfdt/fdt.c',
1081 'dtc/libfdt/fdt_ro.c',
1082 'dtc/libfdt/fdt_wip.c',
1083 'dtc/libfdt/fdt_sw.c',
1084 'dtc/libfdt/fdt_rw.c',
1085 'dtc/libfdt/fdt_strerror.c',
1086 'dtc/libfdt/fdt_empty_tree.c',
1087 'dtc/libfdt/fdt_addresses.c',
1088 'dtc/libfdt/fdt_overlay.c',
1089 'dtc/libfdt/fdt_check.c',
1090 )
1091
1092 fdt_inc = include_directories('dtc/libfdt')
1093 libfdt = static_library('fdt',
1094 sources: fdt_files,
1095 include_directories: fdt_inc)
1096 fdt = declare_dependency(link_with: libfdt,
1097 include_directories: fdt_inc)
1098 endif
1099endif
1100if not fdt.found() and fdt_required.length() > 0
1101 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1102endif
1103
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001104config_host_data.set('CONFIG_CAPSTONE', capstone.found())
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001105config_host_data.set('CONFIG_FDT', fdt.found())
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001106config_host_data.set('CONFIG_SLIRP', slirp.found())
Richard Henderson8b18cdb2020-09-13 12:19:25 -07001107
1108genh += configure_file(output: 'config-host.h', configuration: config_host_data)
1109
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001110# Generators
1111
Marc-André Lureau3f885652019-07-15 18:06:04 +04001112hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +04001113shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001114qapi_gen = find_program('scripts/qapi-gen.py')
1115qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1116 meson.source_root() / 'scripts/qapi/commands.py',
1117 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001118 meson.source_root() / 'scripts/qapi/error.py',
1119 meson.source_root() / 'scripts/qapi/events.py',
1120 meson.source_root() / 'scripts/qapi/expr.py',
1121 meson.source_root() / 'scripts/qapi/gen.py',
1122 meson.source_root() / 'scripts/qapi/introspect.py',
1123 meson.source_root() / 'scripts/qapi/parser.py',
1124 meson.source_root() / 'scripts/qapi/schema.py',
1125 meson.source_root() / 'scripts/qapi/source.py',
1126 meson.source_root() / 'scripts/qapi/types.py',
1127 meson.source_root() / 'scripts/qapi/visit.py',
1128 meson.source_root() / 'scripts/qapi/common.py',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001129 meson.source_root() / 'scripts/qapi-gen.py'
1130]
1131
1132tracetool = [
1133 python, files('scripts/tracetool.py'),
1134 '--backend=' + config_host['TRACE_BACKENDS']
1135]
1136
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001137qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1138 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +02001139 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +04001140qemu_version = custom_target('qemu-version.h',
1141 output: 'qemu-version.h',
1142 command: qemu_version_cmd,
1143 capture: true,
1144 build_by_default: true,
1145 build_always_stale: true)
1146genh += qemu_version
1147
Marc-André Lureau3f885652019-07-15 18:06:04 +04001148hxdep = []
1149hx_headers = [
1150 ['qemu-options.hx', 'qemu-options.def'],
1151 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1152]
1153if have_system
1154 hx_headers += [
1155 ['hmp-commands.hx', 'hmp-commands.h'],
1156 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1157 ]
1158endif
1159foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001160 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +04001161 input: files(d[0]),
1162 output: d[1],
1163 capture: true,
1164 build_by_default: true, # to be removed when added to a target
1165 command: [hxtool, '-h', '@INPUT0@'])
1166endforeach
1167genh += hxdep
1168
Peter Maydelleb937362020-09-25 17:23:08 +01001169SPHINX_ARGS = [config_host['SPHINX_BUILD'],
1170 '-Dversion=' + meson.project_version(),
1171 '-Drelease=' + config_host['PKGVERSION']]
1172
1173if get_option('werror')
1174 SPHINX_ARGS += [ '-W' ]
1175endif
1176
Peter Maydellb3f48302020-09-25 17:23:09 +01001177sphinx_extn_depends = [ meson.source_root() / 'docs/sphinx/depfile.py',
1178 meson.source_root() / 'docs/sphinx/hxtool.py',
1179 meson.source_root() / 'docs/sphinx/kerneldoc.py',
1180 meson.source_root() / 'docs/sphinx/kernellog.py',
1181 meson.source_root() / 'docs/sphinx/qapidoc.py',
1182 meson.source_root() / 'docs/sphinx/qmp_lexer.py',
1183 qapi_gen_depends ]
1184
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001185# Collect sourcesets.
1186
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001187authz_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001188blockdev_ss = ss.source_set()
1189block_ss = ss.source_set()
1190bsd_user_ss = ss.source_set()
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001191chardev_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001192common_ss = ss.source_set()
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001193crypto_ss = ss.source_set()
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001194io_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001195linux_user_ss = ss.source_set()
1196qmp_ss = ss.source_set()
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001197qom_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001198softmmu_ss = ss.source_set()
1199specific_fuzz_ss = ss.source_set()
1200specific_ss = ss.source_set()
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001201stub_ss = ss.source_set()
1202trace_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001203user_ss = ss.source_set()
Philippe Mathieu-Daudé7e2b8882020-10-06 14:55:55 +02001204util_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001205
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001206modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001207hw_arch = {}
1208target_arch = {}
1209target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001210
1211###############
1212# Trace files #
1213###############
1214
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001215# TODO: add each directory to the subdirs from its own meson.build, once
1216# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001217trace_events_subdirs = [
1218 'accel/kvm',
1219 'accel/tcg',
1220 'crypto',
1221 'monitor',
1222]
1223if have_user
1224 trace_events_subdirs += [ 'linux-user' ]
1225endif
1226if have_block
1227 trace_events_subdirs += [
1228 'authz',
1229 'block',
1230 'io',
1231 'nbd',
1232 'scsi',
1233 ]
1234endif
1235if have_system
1236 trace_events_subdirs += [
1237 'audio',
1238 'backends',
1239 'backends/tpm',
1240 'chardev',
1241 'hw/9pfs',
1242 'hw/acpi',
1243 'hw/alpha',
1244 'hw/arm',
1245 'hw/audio',
1246 'hw/block',
1247 'hw/block/dataplane',
1248 'hw/char',
1249 'hw/display',
1250 'hw/dma',
1251 'hw/hppa',
1252 'hw/hyperv',
1253 'hw/i2c',
1254 'hw/i386',
1255 'hw/i386/xen',
1256 'hw/ide',
1257 'hw/input',
1258 'hw/intc',
1259 'hw/isa',
1260 'hw/mem',
1261 'hw/mips',
1262 'hw/misc',
1263 'hw/misc/macio',
1264 'hw/net',
1265 'hw/nvram',
1266 'hw/pci',
1267 'hw/pci-host',
1268 'hw/ppc',
1269 'hw/rdma',
1270 'hw/rdma/vmw',
1271 'hw/rtc',
1272 'hw/s390x',
1273 'hw/scsi',
1274 'hw/sd',
1275 'hw/sparc',
1276 'hw/sparc64',
1277 'hw/ssi',
1278 'hw/timer',
1279 'hw/tpm',
1280 'hw/usb',
1281 'hw/vfio',
1282 'hw/virtio',
1283 'hw/watchdog',
1284 'hw/xen',
1285 'hw/gpio',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001286 'migration',
1287 'net',
Philippe Mathieu-Daudé8b7a5502020-08-05 15:02:20 +02001288 'softmmu',
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001289 'ui',
1290 ]
1291endif
1292trace_events_subdirs += [
1293 'hw/core',
1294 'qapi',
1295 'qom',
1296 'target/arm',
1297 'target/hppa',
1298 'target/i386',
1299 'target/mips',
1300 'target/ppc',
1301 'target/riscv',
1302 'target/s390x',
1303 'target/sparc',
1304 'util',
1305]
1306
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001307subdir('qapi')
1308subdir('qobject')
1309subdir('stubs')
1310subdir('trace')
1311subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +04001312subdir('qom')
1313subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001314subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +04001315subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001316
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001317
1318if enable_modules
1319 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1320 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1321endif
1322
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001323# Build targets from sourcesets
1324
Paolo Bonzini2becc362020-02-03 11:42:03 +01001325stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001326
1327util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +01001328util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001329libqemuutil = static_library('qemuutil',
1330 sources: util_ss.sources() + stub_ss.sources() + genh,
Paolo Bonziniaa087962020-09-01 11:15:30 -04001331 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001332qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +04001333 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04001334
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001335decodetree = generator(find_program('scripts/decodetree.py'),
1336 output: 'decode-@BASENAME@.c.inc',
1337 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1338
Paolo Bonzini478e9432020-08-17 12:47:55 +02001339subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +04001340subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +04001341subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001342subdir('fsdev')
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001343subdir('libdecnumber')
Marc-André Lureaud3b18482019-08-17 14:55:32 +04001344subdir('target')
Marc-André Lureau708eab42019-09-03 16:59:33 +04001345subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +04001346
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001347block_ss.add(files(
1348 'block.c',
Kevin Wolf56ee8622020-09-24 17:26:50 +02001349 'blockdev-nbd.c',
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001350 'blockjob.c',
1351 'job.c',
1352 'qemu-io-cmds.c',
1353))
1354block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
1355
1356subdir('nbd')
1357subdir('scsi')
1358subdir('block')
1359
Paolo Bonzini4a963372020-08-03 16:22:28 +02001360blockdev_ss.add(files(
1361 'blockdev.c',
Paolo Bonzini4a963372020-08-03 16:22:28 +02001362 'iothread.c',
1363 'job-qmp.c',
1364))
1365
1366# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1367# os-win32.c does not
1368blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1369softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
Paolo Bonzini4a963372020-08-03 16:22:28 +02001370softmmu_ss.add_all(blockdev_ss)
Paolo Bonzini4a963372020-08-03 16:22:28 +02001371
1372common_ss.add(files('cpus-common.c'))
1373
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001374subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001375
Richard Hendersonf3433462020-09-12 10:47:33 -07001376common_ss.add(capstone)
Paolo Bonzinid9f24bf2020-10-06 09:05:29 +02001377specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001378specific_ss.add(files('exec-vary.c'))
1379specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1380 'fpu/softfloat.c',
1381 'tcg/optimize.c',
1382 'tcg/tcg-common.c',
1383 'tcg/tcg-op-gvec.c',
1384 'tcg/tcg-op-vec.c',
1385 'tcg/tcg-op.c',
1386 'tcg/tcg.c',
1387))
1388specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1389
Marc-André Lureauab318052019-07-24 19:23:16 +04001390subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +04001391subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +04001392subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001393subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +04001394subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +04001395subdir('replay')
Marc-André Lureau582ea952019-08-15 15:15:32 +04001396subdir('hw')
Marc-André Lureau1a828782019-08-18 16:13:08 +04001397subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001398subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +04001399subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +04001400subdir('linux-user')
1401
Marc-André Lureaub309c322019-08-18 19:20:37 +04001402bsd_user_ss.add(files('gdbstub.c'))
1403specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1404
Marc-André Lureau3a304462019-08-18 16:13:08 +04001405linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1406specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +02001407
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001408# needed for fuzzing binaries
1409subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001410subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +02001411
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001412block_mods = []
1413softmmu_mods = []
1414foreach d, list : modules
1415 foreach m, module_ss : list
1416 if enable_modules and targetos != 'windows'
Gerd Hoffmann3e292c52020-09-14 15:42:20 +02001417 module_ss = module_ss.apply(config_all, strict: false)
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001418 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1419 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1420 if d == 'block'
1421 block_mods += sl
1422 else
1423 softmmu_mods += sl
1424 endif
1425 else
1426 if d == 'block'
1427 block_ss.add_all(module_ss)
1428 else
1429 softmmu_ss.add_all(module_ss)
1430 endif
1431 endif
1432 endforeach
1433endforeach
1434
1435nm = find_program('nm')
Yonggang Luo604f3e42020-09-03 01:00:50 +08001436undefsym = find_program('scripts/undefsym.py')
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001437block_syms = custom_target('block.syms', output: 'block.syms',
1438 input: [libqemuutil, block_mods],
1439 capture: true,
1440 command: [undefsym, nm, '@INPUT@'])
1441qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1442 input: [libqemuutil, softmmu_mods],
1443 capture: true,
1444 command: [undefsym, nm, '@INPUT@'])
1445
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02001446########################
1447# Library dependencies #
1448########################
1449
Philippe Mathieu-Daudéda33fc02020-10-06 14:56:02 +02001450qom_ss = qom_ss.apply(config_host, strict: false)
1451libqom = static_library('qom', qom_ss.sources() + genh,
1452 dependencies: [qom_ss.dependencies()],
1453 name_suffix: 'fa')
1454
1455qom = declare_dependency(link_whole: libqom)
1456
Philippe Mathieu-Daudé55567892020-10-06 14:56:01 +02001457authz_ss = authz_ss.apply(config_host, strict: false)
1458libauthz = static_library('authz', authz_ss.sources() + genh,
1459 dependencies: [authz_ss.dependencies()],
1460 name_suffix: 'fa',
1461 build_by_default: false)
1462
1463authz = declare_dependency(link_whole: libauthz,
1464 dependencies: qom)
1465
Philippe Mathieu-Daudé23893042020-10-06 14:56:00 +02001466crypto_ss = crypto_ss.apply(config_host, strict: false)
1467libcrypto = static_library('crypto', crypto_ss.sources() + genh,
1468 dependencies: [crypto_ss.dependencies()],
1469 name_suffix: 'fa',
1470 build_by_default: false)
1471
1472crypto = declare_dependency(link_whole: libcrypto,
1473 dependencies: [authz, qom])
1474
Philippe Mathieu-Daudéf78536b2020-10-06 14:55:59 +02001475io_ss = io_ss.apply(config_host, strict: false)
1476libio = static_library('io', io_ss.sources() + genh,
1477 dependencies: [io_ss.dependencies()],
1478 link_with: libqemuutil,
1479 name_suffix: 'fa',
1480 build_by_default: false)
1481
1482io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
1483
Philippe Mathieu-Daudé7e6edef2020-10-06 14:55:58 +02001484libmigration = static_library('migration', sources: migration_files + genh,
1485 name_suffix: 'fa',
1486 build_by_default: false)
1487migration = declare_dependency(link_with: libmigration,
1488 dependencies: [zlib, qom, io])
1489softmmu_ss.add(migration)
1490
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001491block_ss = block_ss.apply(config_host, strict: false)
1492libblock = static_library('block', block_ss.sources() + genh,
1493 dependencies: block_ss.dependencies(),
1494 link_depends: block_syms,
1495 name_suffix: 'fa',
1496 build_by_default: false)
1497
1498block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001499 link_args: '@block.syms',
1500 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +04001501
Paolo Bonziniff219dc2020-08-04 21:14:26 +02001502qmp_ss = qmp_ss.apply(config_host, strict: false)
1503libqmp = static_library('qmp', qmp_ss.sources() + genh,
1504 dependencies: qmp_ss.dependencies(),
1505 name_suffix: 'fa',
1506 build_by_default: false)
1507
1508qmp = declare_dependency(link_whole: [libqmp])
1509
Philippe Mathieu-Daudéc2306d72020-10-06 14:55:57 +02001510libchardev = static_library('chardev', chardev_ss.sources() + genh,
1511 name_suffix: 'fa',
1512 build_by_default: false)
1513
1514chardev = declare_dependency(link_whole: libchardev)
1515
Philippe Mathieu-Daudée28ab092020-10-06 14:55:56 +02001516libhwcore = static_library('hwcore', sources: hwcore_files + genh,
1517 name_suffix: 'fa',
1518 build_by_default: false)
1519hwcore = declare_dependency(link_whole: libhwcore)
1520common_ss.add(hwcore)
1521
Philippe Mathieu-Daudé064f8ee2020-10-06 14:55:54 +02001522###########
1523# Targets #
1524###########
1525
Marc-André Lureau3154fee2019-08-29 22:07:01 +04001526foreach m : block_mods + softmmu_mods
1527 shared_module(m.name(),
1528 name_prefix: '',
1529 link_whole: m,
1530 install: true,
1531 install_dir: config_host['qemu_moddir'])
1532endforeach
1533
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001534softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
1535common_ss.add(qom, qemuutil)
1536
1537common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +01001538common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
1539
1540common_all = common_ss.apply(config_all, strict: false)
1541common_all = static_library('common',
1542 build_by_default: false,
1543 sources: common_all.sources() + genh,
1544 dependencies: common_all.dependencies(),
1545 name_suffix: 'fa')
1546
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001547feature_to_c = find_program('scripts/feature_to_c.sh')
1548
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04001549emulators = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +01001550foreach target : target_dirs
1551 config_target = config_target_mak[target]
1552 target_name = config_target['TARGET_NAME']
1553 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +02001554 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001555 arch_deps = []
1556 c_args = ['-DNEED_CPU_H',
1557 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
1558 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
Paolo Bonzinib6c7cfd2020-09-21 04:49:50 -04001559 link_args = emulator_link_args
Paolo Bonzini2becc362020-02-03 11:42:03 +01001560
Paolo Bonzini859aef02020-08-04 18:14:26 +02001561 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +01001562 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
1563 if targetos == 'linux'
1564 target_inc += include_directories('linux-headers', is_system: true)
1565 endif
1566 if target.endswith('-softmmu')
1567 qemu_target_name = 'qemu-system-' + target_name
1568 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001569 t = target_softmmu_arch[arch].apply(config_target, strict: false)
1570 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001571 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001572
Marc-André Lureau2c442202019-08-17 13:55:58 +04001573 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
1574 hw = hw_arch[hw_dir].apply(config_target, strict: false)
1575 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001576 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +04001577
Paolo Bonzini2becc362020-02-03 11:42:03 +01001578 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001579 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001580 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04001581 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001582 target_type='user'
1583 qemu_target_name = 'qemu-' + target_name
1584 if 'CONFIG_LINUX_USER' in config_target
1585 base_dir = 'linux-user'
1586 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1587 else
1588 base_dir = 'bsd-user'
1589 endif
1590 target_inc += include_directories(
1591 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04001592 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001593 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04001594 if 'CONFIG_LINUX_USER' in config_target
1595 dir = base_dir / abi
1596 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1597 if config_target.has_key('TARGET_SYSTBL_ABI')
1598 arch_srcs += \
1599 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1600 extra_args : config_target['TARGET_SYSTBL_ABI'])
1601 endif
1602 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01001603 endif
1604
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001605 if 'TARGET_XML_FILES' in config_target
1606 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1607 output: target + '-gdbstub-xml.c',
1608 input: files(config_target['TARGET_XML_FILES'].split()),
1609 command: [feature_to_c, '@INPUT@'],
1610 capture: true)
1611 arch_srcs += gdbstub_xml
1612 endif
1613
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001614 t = target_arch[arch].apply(config_target, strict: false)
1615 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001616 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001617
Paolo Bonzini2becc362020-02-03 11:42:03 +01001618 target_common = common_ss.apply(config_target, strict: false)
1619 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001620 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001621
Paolo Bonzini2becc362020-02-03 11:42:03 +01001622 target_specific = specific_ss.apply(config_target, strict: false)
1623 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001624 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001625
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001626 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02001627 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001628 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001629 objects: objects,
1630 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001631 c_args: c_args,
1632 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001633 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001634
1635 if target.endswith('-softmmu')
1636 execs = [{
1637 'name': 'qemu-system-' + target_name,
1638 'gui': false,
1639 'sources': files('softmmu/main.c'),
1640 'dependencies': []
1641 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001642 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001643 execs += [{
1644 'name': 'qemu-system-' + target_name + 'w',
1645 'gui': true,
1646 'sources': files('softmmu/main.c'),
1647 'dependencies': []
1648 }]
1649 endif
1650 if config_host.has_key('CONFIG_FUZZ')
1651 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1652 execs += [{
1653 'name': 'qemu-fuzz-' + target_name,
1654 'gui': false,
1655 'sources': specific_fuzz.sources(),
1656 'dependencies': specific_fuzz.dependencies(),
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001657 }]
1658 endif
1659 else
1660 execs = [{
1661 'name': 'qemu-' + target_name,
1662 'gui': false,
1663 'sources': [],
1664 'dependencies': []
1665 }]
1666 endif
1667 foreach exe: execs
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04001668 emulators += {exe['name']:
1669 executable(exe['name'], exe['sources'],
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001670 install: true,
1671 c_args: c_args,
1672 dependencies: arch_deps + deps + exe['dependencies'],
1673 objects: lib.extract_all_objects(recursive: true),
1674 link_language: link_language,
1675 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1676 link_args: link_args,
1677 gui_app: exe['gui'])
Paolo Bonzinifd5eef82020-09-16 05:00:53 -04001678 }
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001679
1680 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1681 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001682 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1683 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001684 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1685 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1686 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001687 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001688 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001689 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001690 capture: true,
1691 install: stp['install'],
Marc-André Lureauab4c0992020-08-26 15:04:16 +04001692 install_dir: qemu_datadir / '../systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001693 command: [
1694 tracetool, '--group=all', '--format=' + stp['fmt'],
1695 '--binary=' + stp['bin'],
1696 '--target-name=' + target_name,
1697 '--target-type=' + target_type,
1698 '--probe-prefix=qemu.' + target_type + '.' + target_name,
1699 '@INPUT@',
1700 ])
1701 endforeach
1702 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001703 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001704endforeach
1705
Paolo Bonzini931049b2020-02-05 09:44:24 +01001706# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04001707
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001708if 'CONFIG_PLUGIN' in config_host
1709 install_headers('include/qemu/qemu-plugin.h')
1710endif
1711
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001712if 'CONFIG_GUEST_AGENT' in config_host
1713 subdir('qga')
1714endif
1715
Laurent Vivier9755c942020-08-24 17:24:30 +02001716# Don't build qemu-keymap if xkbcommon is not explicitly enabled
1717# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001718if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04001719 # used for the update-keymaps target, so include rules even if !have_tools
1720 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1721 dependencies: [qemuutil, xkbcommon], install: have_tools)
1722endif
1723
Paolo Bonzini931049b2020-02-05 09:44:24 +01001724if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001725 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1726 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1727 qemu_io = executable('qemu-io', files('qemu-io.c'),
1728 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01001729 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001730 dependencies: [block, qemuutil], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001731
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02001732 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02001733 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001734 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02001735
Marc-André Lureau157e7b12019-07-15 14:50:58 +04001736 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1737 dependencies: qemuutil,
1738 install: true)
1739
Paolo Bonzini931049b2020-02-05 09:44:24 +01001740 if 'CONFIG_VHOST_USER' in config_host
1741 subdir('contrib/libvhost-user')
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02001742 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001743 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04001744 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02001745 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01001746 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04001747
1748 if targetos == 'linux'
1749 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1750 dependencies: [qemuutil, libcap_ng],
1751 install: true,
1752 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04001753
1754 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1755 dependencies: [authz, crypto, io, qom, qemuutil,
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001756 libcap_ng, mpathpersist],
Marc-André Lureau897b5af2019-07-16 21:54:15 +04001757 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04001758 endif
1759
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04001760 if 'CONFIG_IVSHMEM' in config_host
1761 subdir('contrib/ivshmem-client')
1762 subdir('contrib/ivshmem-server')
1763 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01001764endif
1765
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04001766subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001767subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04001768subdir('pc-bios')
Paolo Bonzinice1c1e72020-01-28 16:41:44 +01001769subdir('tests')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02001770subdir('docs')
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04001771if 'CONFIG_GTK' in config_host
1772 subdir('po')
1773endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001774
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04001775if host_machine.system() == 'windows'
1776 nsis_cmd = [
1777 find_program('scripts/nsis.py'),
1778 '@OUTPUT@',
1779 get_option('prefix'),
1780 meson.current_source_dir(),
1781 host_machine.cpu_family(),
1782 '--',
1783 '-DDISPLAYVERSION=' + meson.project_version(),
1784 ]
1785 if build_docs
1786 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
1787 endif
1788 if 'CONFIG_GTK' in config_host
1789 nsis_cmd += '-DCONFIG_GTK=y'
1790 endif
1791
1792 nsis = custom_target('nsis',
1793 output: 'qemu-setup-' + meson.project_version() + '.exe',
1794 input: files('qemu.nsi'),
1795 build_always_stale: true,
1796 command: nsis_cmd + ['@INPUT@'])
1797 alias_target('installer', nsis)
1798endif
1799
Paolo Bonzinif9332752020-02-03 13:28:38 +01001800summary_info = {}
1801summary_info += {'Install prefix': config_host['prefix']}
1802summary_info += {'BIOS directory': config_host['qemu_datadir']}
1803summary_info += {'firmware path': config_host['qemu_firmwarepath']}
1804summary_info += {'binary directory': config_host['bindir']}
1805summary_info += {'library directory': config_host['libdir']}
1806summary_info += {'module directory': config_host['qemu_moddir']}
1807summary_info += {'libexec directory': config_host['libexecdir']}
1808summary_info += {'include directory': config_host['includedir']}
1809summary_info += {'config directory': config_host['sysconfdir']}
1810if targetos != 'windows'
1811 summary_info += {'local state directory': config_host['qemu_localstatedir']}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04001812 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001813else
1814 summary_info += {'local state directory': 'queried at runtime'}
1815endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04001816summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001817summary_info += {'Build directory': meson.current_build_dir()}
1818summary_info += {'Source path': meson.current_source_dir()}
1819summary_info += {'GIT binary': config_host['GIT']}
1820summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
1821summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
1822summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
1823if link_language == 'cpp'
1824 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
1825else
1826 summary_info += {'C++ compiler': false}
1827endif
1828if targetos == 'darwin'
1829 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1830endif
1831summary_info += {'ARFLAGS': config_host['ARFLAGS']}
Paolo Bonzini47b30832020-09-23 05:26:17 -04001832summary_info += {'CFLAGS': ' '.join(get_option('c_args')
1833 + ['-O' + get_option('optimization')]
1834 + (get_option('debug') ? ['-g'] : []))}
1835if link_language == 'cpp'
1836 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
1837 + ['-O' + get_option('optimization')]
1838 + (get_option('debug') ? ['-g'] : []))}
1839endif
1840link_args = get_option(link_language + '_link_args')
1841if link_args.length() > 0
1842 summary_info += {'LDFLAGS': ' '.join(link_args)}
1843endif
Paolo Bonzinif9332752020-02-03 13:28:38 +01001844summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
1845summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
1846summary_info += {'make': config_host['MAKE']}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001847summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1848summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
1849summary_info += {'genisoimage': config_host['GENISOIMAGE']}
1850# TODO: add back version
Paolo Bonzini4d34a862020-10-05 11:31:15 +02001851summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
1852if slirp_opt != 'disabled'
Paolo Bonzinif9332752020-02-03 13:28:38 +01001853 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
1854endif
1855summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
1856if config_host.has_key('CONFIG_MODULES')
1857 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1858endif
1859summary_info += {'host CPU': cpu}
1860summary_info += {'host endianness': build_machine.endian()}
Paolo Bonzinifdb75ae2020-09-21 04:37:49 -04001861summary_info += {'target list': ' '.join(target_dirs)}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001862summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
Paolo Bonzinideb62372020-09-01 07:51:16 -04001863summary_info += {'sparse enabled': sparse.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001864summary_info += {'strip binaries': get_option('strip')}
1865summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
Laurent Vivier3e8529d2020-09-17 16:07:00 +02001866summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001867if targetos == 'darwin'
1868 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1869endif
1870# TODO: add back version
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001871summary_info += {'SDL support': sdl.found()}
1872summary_info += {'SDL image support': sdl_image.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001873# TODO: add back version
1874summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
1875summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001876summary_info += {'pixman': pixman.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001877# TODO: add back version
1878summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
1879summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
1880summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
1881# TODO: add back version
1882summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
1883if config_host.has_key('CONFIG_GCRYPT')
1884 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
1885 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1886endif
1887# TODO: add back version
1888summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
1889if config_host.has_key('CONFIG_NETTLE')
1890 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1891endif
1892summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1893summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1894summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1895summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1896# TODO: add back version
1897summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1898summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1899summary_info += {'mingw32 support': targetos == 'windows'}
1900summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1901summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1902summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1903summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
Paolo Bonzini6ec0e152020-09-16 18:07:29 +02001904summary_info += {'Multipath support': mpathpersist.found()}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001905summary_info += {'VNC support': vnc.found()}
1906if vnc.found()
1907 summary_info += {'VNC SASL support': sasl.found()}
1908 summary_info += {'VNC JPEG support': jpeg.found()}
1909 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001910endif
1911summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1912if config_host.has_key('CONFIG_XEN_BACKEND')
1913 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1914endif
1915summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1916summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1917summary_info += {'PIE': get_option('b_pie')}
1918summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1919summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1920summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1921summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1922summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1923summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
Paolo Bonzini05512f52020-09-16 15:31:11 -04001924summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
1925summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
1926summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
1927summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
1928summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
1929if config_all.has_key('CONFIG_TCG')
1930 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1931 summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1932endif
Paolo Bonziniaa087962020-09-01 11:15:30 -04001933summary_info += {'malloc trim support': has_malloc_trim}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001934summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1935summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
Paolo Bonzinifbb41212020-10-05 11:31:15 +02001936summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001937summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1938summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1939summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1940summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1941summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1942summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1943summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1944summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1945summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1946summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1947summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1948summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1949summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1950summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1951summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1952if config_host['TRACE_BACKENDS'].split().contains('simple')
1953 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1954endif
1955# TODO: add back protocol and server version
1956summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1957summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1958summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1959summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02001960summary_info += {'U2F support': u2f.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001961summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1962summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1963summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1964summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1965summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1966summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1967summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1968if targetos == 'windows'
1969 if 'WIN_SDK' in config_host
1970 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1971 endif
1972 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1973 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
Stefan Hajnoczi4bad7c32020-09-14 10:52:31 +01001974 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001975endif
1976summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1977summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1978summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1979summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1980summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1981summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1982summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +04001983summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001984summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1985summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1986summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1987summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1988summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1989summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1990summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1991summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1992summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1993summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1994summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
Paolo Bonziniaa087962020-09-01 11:15:30 -04001995summary_info += {'memory allocator': get_option('malloc')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001996summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1997summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1998summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1999summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2000summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2001summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2002summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2003summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2004summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2005summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2006summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2007summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
Richard Henderson8b18cdb2020-09-13 12:19:25 -07002008summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002009summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2010summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
Paolo Bonzinif01496a2020-09-16 17:54:14 +02002011summary_info += {'libudev': libudev.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01002012summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
2013summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2014summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2015if config_host.has_key('HAVE_GDB_BIN')
2016 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2017endif
2018summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2019summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2020summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
2021summary(summary_info, bool_yn: true)
2022
2023if not supported_cpus.contains(cpu)
2024 message()
2025 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2026 message()
2027 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2028 message('The QEMU project intends to remove support for this host CPU in')
2029 message('a future release if nobody volunteers to maintain it and to')
2030 message('provide a build host for our continuous integration setup.')
2031 message('configure has succeeded and you can continue to build, but')
2032 message('if you care about QEMU on this platform you should contact')
2033 message('us upstream at qemu-devel@nongnu.org.')
2034endif
2035
2036if not supported_oses.contains(targetos)
2037 message()
2038 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2039 message()
2040 message('Host OS ' + targetos + 'support is not currently maintained.')
2041 message('The QEMU project intends to remove support for this host OS in')
2042 message('a future release if nobody volunteers to maintain it and to')
2043 message('provide a build host for our continuous integration setup.')
2044 message('configure has succeeded and you can continue to build, but')
2045 message('if you care about QEMU on this platform you should contact')
2046 message('us upstream at qemu-devel@nongnu.org.')
2047endif