blob: 4ff3f7bccb58b0d4412607b343e8c7c4ad20a30f [file] [log] [blame]
Paolo Bonzinia5665052019-06-10 12:05:14 +02001project('qemu', ['c'], meson_version: '>=0.55.0',
2 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_lundef=false'],
3 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
4
5not_found = dependency('', required: false)
6keyval = import('unstable-keyval')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04007ss = import('sourceset')
8
Paolo Bonzinice1c1e72020-01-28 16:41:44 +01009sh = find_program('sh')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040010cc = meson.get_compiler('c')
Paolo Bonzinia5665052019-06-10 12:05:14 +020011config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Paolo Bonzini2becc362020-02-03 11:42:03 +010012config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
Marc-André Lureau3154fee2019-08-29 22:07:01 +040013enable_modules = 'CONFIG_MODULES' in config_host
Paolo Bonzinia5665052019-06-10 12:05:14 +020014
15add_project_arguments(config_host['QEMU_CFLAGS'].split(),
16 native: false, language: ['c', 'objc'])
17add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
18 native: false, language: 'cpp')
19add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
20 native: false, language: ['c', 'cpp', 'objc'])
21add_project_arguments(config_host['QEMU_INCLUDES'].split(),
22 language: ['c', 'cpp', 'objc'])
23
Marc-André Lureaufc929892019-07-13 01:47:54 +040024python = import('python').find_installation()
25
26link_language = meson.get_external_property('link_language', 'cpp')
27if link_language == 'cpp'
28 add_languages('cpp', required: true, native: false)
29endif
Paolo Bonzinia5665052019-06-10 12:05:14 +020030if host_machine.system() == 'darwin'
31 add_languages('objc', required: false, native: false)
32endif
33
Paolo Bonzini968b4db2020-02-03 14:45:33 +010034if 'SPARSE_CFLAGS' in config_host
35 run_target('sparse',
36 command: [find_program('scripts/check_sparse.py'),
37 config_host['SPARSE_CFLAGS'].split(),
38 'compile_commands.json'])
39endif
40
Paolo Bonzinia5665052019-06-10 12:05:14 +020041configure_file(input: files('scripts/ninjatool.py'),
42 output: 'ninjatool',
43 configuration: config_host)
Paolo Bonzinif9332752020-02-03 13:28:38 +010044
45supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
46supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
47 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
48
49cpu = host_machine.cpu_family()
50targetos = host_machine.system()
51
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040052m = cc.find_library('m', required: false)
53util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +020054winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040055socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +040056version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +040057coref = []
58iokit = []
59cocoa = []
60hvf = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040061if targetos == 'windows'
62 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +020063 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +040064
65 win = import('windows')
66 version_res = win.compile_resources('version.rc',
67 depend_files: files('pc-bios/qemu-nsis.ico'),
68 include_directories: include_directories('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +040069elif targetos == 'darwin'
70 coref = dependency('appleframeworks', modules: 'CoreFoundation')
71 iokit = dependency('appleframeworks', modules: 'IOKit')
72 cocoa = dependency('appleframeworks', modules: 'Cocoa')
73 hvf = dependency('appleframeworks', modules: 'Hypervisor')
Paolo Bonzinicfad62f2020-08-09 23:47:45 +020074elif targetos == 'sunos'
75 socket = [cc.find_library('socket'),
76 cc.find_library('nsl'),
77 cc.find_library('resolv')]
78elif targetos == 'haiku'
79 socket = [cc.find_library('posix_error_mapper'),
80 cc.find_library('network'),
81 cc.find_library('bsd')]
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040082endif
83glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
84 link_args: config_host['GLIB_LIBS'].split())
85gio = not_found
86if 'CONFIG_GIO' in config_host
87 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
88 link_args: config_host['GIO_LIBS'].split())
89endif
90lttng = not_found
91if 'CONFIG_TRACE_UST' in config_host
92 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
93endif
94urcubp = not_found
95if 'CONFIG_TRACE_UST' in config_host
96 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
97endif
98nettle = not_found
99if 'CONFIG_NETTLE' in config_host
100 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
101 link_args: config_host['NETTLE_LIBS'].split())
102endif
103gnutls = not_found
104if 'CONFIG_GNUTLS' in config_host
105 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
106 link_args: config_host['GNUTLS_LIBS'].split())
107endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400108pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
109 link_args: config_host['PIXMAN_LIBS'].split())
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400110pam = not_found
111if 'CONFIG_AUTH_PAM' in config_host
112 pam = cc.find_library('pam')
113endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400114libaio = cc.find_library('aio', required: false)
115zlib = not_found
116if 'CONFIG_ZLIB' in config_host
117 zlib = declare_dependency(compile_args: config_host['ZLIB_CFLAGS'].split(),
118 link_args: config_host['ZLIB_LIBS'].split())
119endif
120linux_io_uring = not_found
121if 'CONFIG_LINUX_IO_URING' in config_host
122 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
123 link_args: config_host['LINUX_IO_URING_LIBS'].split())
124endif
125libxml2 = not_found
126if 'CONFIG_LIBXML2' in config_host
127 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
128 link_args: config_host['LIBXML2_LIBS'].split())
129endif
130libnfs = not_found
131if 'CONFIG_LIBNFS' in config_host
132 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
133endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400134libattr = not_found
135if 'CONFIG_ATTR' in config_host
136 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
137endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100138seccomp = not_found
139if 'CONFIG_SECCOMP' in config_host
140 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
141 link_args: config_host['SECCOMP_LIBS'].split())
142endif
143libcap_ng = not_found
144if 'CONFIG_LIBCAP_NG' in config_host
145 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
146endif
Marc-André Lureauade60d42019-07-15 14:48:31 +0400147xkbcommon = not_found
148if 'CONFIG_XKBCOMMON' in config_host
149 xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(),
150 link_args: config_host['XKBCOMMON_LIBS'].split())
151endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200152pulse = not_found
153if 'CONFIG_LIBPULSE' in config_host
154 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
155 link_args: config_host['PULSE_LIBS'].split())
156endif
157alsa = not_found
158if 'CONFIG_ALSA' in config_host
159 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
160 link_args: config_host['ALSA_LIBS'].split())
161endif
162jack = not_found
163if 'CONFIG_LIBJACK' in config_host
164 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
165endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200166spice = not_found
167if 'CONFIG_SPICE' in config_host
168 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
169 link_args: config_host['SPICE_LIBS'].split())
170endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400171rt = cc.find_library('rt', required: false)
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400172libmpathpersist = not_found
173if config_host.has_key('CONFIG_MPATH')
174 libmpathpersist = cc.find_library('mpathpersist')
175endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200176libiscsi = not_found
177if 'CONFIG_LIBISCSI' in config_host
178 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
179 link_args: config_host['LIBISCSI_LIBS'].split())
180endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400181zstd = not_found
182if 'CONFIG_ZSTD' in config_host
183 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
184 link_args: config_host['ZSTD_LIBS'].split())
185endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400186gbm = not_found
187if 'CONFIG_GBM' in config_host
188 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
189 link_args: config_host['GBM_LIBS'].split())
190endif
191virgl = not_found
192if 'CONFIG_VIRGL' in config_host
193 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
194 link_args: config_host['VIRGL_LIBS'].split())
195endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400196curl = not_found
197if 'CONFIG_CURL' in config_host
198 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
199 link_args: config_host['CURL_LIBS'].split())
200endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200201libudev = not_found
202if 'CONFIG_LIBUDEV' in config_host
203 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
204endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200205brlapi = not_found
206if 'CONFIG_BRLAPI' in config_host
207 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
208endif
209sdl = not_found
210if 'CONFIG_SDL' in config_host
211 sdl = declare_dependency(compile_args: config_host['SDL_CFLAGS'].split(),
212 link_args: config_host['SDL_LIBS'].split())
213endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400214rbd = not_found
215if 'CONFIG_RBD' in config_host
216 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
217endif
218glusterfs = not_found
219if 'CONFIG_GLUSTERFS' in config_host
220 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
221 link_args: config_host['GLUSTERFS_LIBS'].split())
222endif
223libssh = not_found
224if 'CONFIG_LIBSSH' in config_host
225 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
226 link_args: config_host['LIBSSH_LIBS'].split())
227endif
228libbzip2 = not_found
229if 'CONFIG_BZIP2' in config_host
230 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
231endif
232liblzfse = not_found
233if 'CONFIG_LZFSE' in config_host
234 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
235endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200236oss = not_found
237if 'CONFIG_AUDIO_OSS' in config_host
238 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
239endif
240dsound = not_found
241if 'CONFIG_AUDIO_DSOUND' in config_host
242 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
243endif
244coreaudio = not_found
245if 'CONFIG_AUDIO_COREAUDIO' in config_host
246 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
247endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400248opengl = not_found
249if 'CONFIG_OPENGL' in config_host
250 opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
251else
252endif
253gtk = not_found
254if 'CONFIG_GTK' in config_host
255 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
256 link_args: config_host['GTK_LIBS'].split())
257endif
258vte = not_found
259if 'CONFIG_VTE' in config_host
260 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
261 link_args: config_host['VTE_LIBS'].split())
262endif
263x11 = not_found
264if 'CONFIG_X11' in config_host
265 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
266 link_args: config_host['X11_LIBS'].split())
267endif
268curses = not_found
269if 'CONFIG_CURSES' in config_host
270 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
271 link_args: config_host['CURSES_LIBS'].split())
272endif
273iconv = not_found
274if 'CONFIG_ICONV' in config_host
275 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
276 link_args: config_host['ICONV_LIBS'].split())
277endif
278gio = not_found
279if 'CONFIG_GIO' in config_host
280 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
281 link_args: config_host['GIO_LIBS'].split())
282endif
283png = not_found
284if 'CONFIG_VNC_PNG' in config_host
285 png = declare_dependency(compile_args: config_host['PNG_CFLAGS'].split(),
286 link_args: config_host['PNG_LIBS'].split())
287endif
288jpeg = not_found
289if 'CONFIG_VNC_JPEG' in config_host
290 jpeg = declare_dependency(compile_args: config_host['JPEG_CFLAGS'].split(),
291 link_args: config_host['JPEG_LIBS'].split())
292endif
293sasl = not_found
294if 'CONFIG_VNC_SASL' in config_host
295 sasl = declare_dependency(compile_args: config_host['SASL_CFLAGS'].split(),
296 link_args: config_host['SASL_LIBS'].split())
297endif
Paolo Bonzini4a963372020-08-03 16:22:28 +0200298fdt = not_found
299if 'CONFIG_FDT' in config_host
300 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
301 link_args: config_host['FDT_LIBS'].split())
302endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400303snappy = not_found
304if 'CONFIG_SNAPPY' in config_host
305 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
306endif
307lzo = not_found
308if 'CONFIG_LZO' in config_host
309 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
310endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400311
Paolo Bonzini2becc362020-02-03 11:42:03 +0100312create_config = find_program('scripts/create_config')
313minikconf = find_program('scripts/minikconf.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400314target_dirs = config_host['TARGET_DIRS'].split()
315have_user = false
316have_system = false
Paolo Bonzini2becc362020-02-03 11:42:03 +0100317config_devices_mak_list = []
318config_devices_h = {}
319config_target_mak = {}
320kconfig_external_symbols = [
321 'CONFIG_KVM',
322 'CONFIG_XEN',
323 'CONFIG_TPM',
324 'CONFIG_SPICE',
325 'CONFIG_IVSHMEM',
326 'CONFIG_OPENGL',
327 'CONFIG_X11',
328 'CONFIG_VHOST_USER',
329 'CONFIG_VHOST_KERNEL',
330 'CONFIG_VIRTFS',
331 'CONFIG_LINUX',
332 'CONFIG_PVRDMA',
333]
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400334foreach target : target_dirs
335 have_user = have_user or target.endswith('-user')
Paolo Bonzini2becc362020-02-03 11:42:03 +0100336 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
337
338 if target.endswith('-softmmu')
339 have_system = true
340
341 base_kconfig = []
342 foreach sym : kconfig_external_symbols
343 if sym in config_target
344 base_kconfig += '@0@=y'.format(sym)
345 endif
346 endforeach
347
348 config_devices_mak = target + '-config-devices.mak'
349 config_devices_mak = configure_file(
350 input: ['default-configs' / target + '.mak', 'Kconfig'],
351 output: config_devices_mak,
352 depfile: config_devices_mak + '.d',
353 capture: true,
354 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
355 config_devices_mak, '@DEPFILE@', '@INPUT@',
356 base_kconfig])
357 config_devices_h += {target: custom_target(
358 target + '-config-devices.h',
359 input: config_devices_mak,
360 output: target + '-config-devices.h',
361 capture: true,
362 command: [create_config, '@INPUT@'])}
363 config_devices_mak_list += config_devices_mak
364 config_target += keyval.load(config_devices_mak)
365 endif
366 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400367endforeach
368have_tools = 'CONFIG_TOOLS' in config_host
369have_block = have_system or have_tools
370
Paolo Bonzini2becc362020-02-03 11:42:03 +0100371grepy = find_program('scripts/grepy.sh')
372# This configuration is used to build files that are shared by
373# multiple binaries, and then extracted out of the "common"
374# static_library target.
375#
376# We do not use all_sources()/all_dependencies(), because it would
377# build literally all source files, including devices only used by
378# targets that are not built for this compilation. The CONFIG_ALL
379# pseudo symbol replaces it.
380
381if have_system
382 config_all_devices_mak = configure_file(
383 output: 'config-all-devices.mak',
384 input: config_devices_mak_list,
385 capture: true,
386 command: [grepy, '@INPUT@'],
387 )
388 config_all_devices = keyval.load(config_all_devices_mak)
389else
390 config_all_devices = {}
391endif
392config_all = config_all_devices
393config_all += config_host
394config_all += config_all_disas
395config_all += {
396 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
397 'CONFIG_SOFTMMU': have_system,
398 'CONFIG_USER_ONLY': have_user,
399 'CONFIG_ALL': true,
400}
401
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400402# Generators
403
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400404genh = []
Marc-André Lureau3f885652019-07-15 18:06:04 +0400405hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +0400406shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400407qapi_gen = find_program('scripts/qapi-gen.py')
408qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
409 meson.source_root() / 'scripts/qapi/commands.py',
410 meson.source_root() / 'scripts/qapi/common.py',
411 meson.source_root() / 'scripts/qapi/doc.py',
412 meson.source_root() / 'scripts/qapi/error.py',
413 meson.source_root() / 'scripts/qapi/events.py',
414 meson.source_root() / 'scripts/qapi/expr.py',
415 meson.source_root() / 'scripts/qapi/gen.py',
416 meson.source_root() / 'scripts/qapi/introspect.py',
417 meson.source_root() / 'scripts/qapi/parser.py',
418 meson.source_root() / 'scripts/qapi/schema.py',
419 meson.source_root() / 'scripts/qapi/source.py',
420 meson.source_root() / 'scripts/qapi/types.py',
421 meson.source_root() / 'scripts/qapi/visit.py',
422 meson.source_root() / 'scripts/qapi/common.py',
423 meson.source_root() / 'scripts/qapi/doc.py',
424 meson.source_root() / 'scripts/qapi-gen.py'
425]
426
427tracetool = [
428 python, files('scripts/tracetool.py'),
429 '--backend=' + config_host['TRACE_BACKENDS']
430]
431
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400432qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
433 meson.current_source_dir(),
434 config_host['PKGVERSION'], config_host['VERSION']]
435qemu_version = custom_target('qemu-version.h',
436 output: 'qemu-version.h',
437 command: qemu_version_cmd,
438 capture: true,
439 build_by_default: true,
440 build_always_stale: true)
441genh += qemu_version
442
Paolo Bonzini2becc362020-02-03 11:42:03 +0100443config_host_h = custom_target('config-host.h',
444 input: meson.current_build_dir() / 'config-host.mak',
445 output: 'config-host.h',
446 capture: true,
447 command: [create_config, '@INPUT@'])
448genh += config_host_h
449
Marc-André Lureau3f885652019-07-15 18:06:04 +0400450hxdep = []
451hx_headers = [
452 ['qemu-options.hx', 'qemu-options.def'],
453 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
454]
455if have_system
456 hx_headers += [
457 ['hmp-commands.hx', 'hmp-commands.h'],
458 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
459 ]
460endif
461foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400462 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +0400463 input: files(d[0]),
464 output: d[1],
465 capture: true,
466 build_by_default: true, # to be removed when added to a target
467 command: [hxtool, '-h', '@INPUT0@'])
468endforeach
469genh += hxdep
470
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400471# Collect sourcesets.
472
473util_ss = ss.source_set()
474stub_ss = ss.source_set()
475trace_ss = ss.source_set()
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400476block_ss = ss.source_set()
Paolo Bonzini4a963372020-08-03 16:22:28 +0200477blockdev_ss = ss.source_set()
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200478qmp_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +0100479common_ss = ss.source_set()
480softmmu_ss = ss.source_set()
481user_ss = ss.source_set()
482bsd_user_ss = ss.source_set()
483linux_user_ss = ss.source_set()
484specific_ss = ss.source_set()
485
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400486modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100487hw_arch = {}
488target_arch = {}
489target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400490
491###############
492# Trace files #
493###############
494
495trace_events_subdirs = [
496 'accel/kvm',
497 'accel/tcg',
498 'crypto',
499 'monitor',
500]
501if have_user
502 trace_events_subdirs += [ 'linux-user' ]
503endif
504if have_block
505 trace_events_subdirs += [
506 'authz',
507 'block',
508 'io',
509 'nbd',
510 'scsi',
511 ]
512endif
513if have_system
514 trace_events_subdirs += [
515 'audio',
516 'backends',
517 'backends/tpm',
518 'chardev',
519 'hw/9pfs',
520 'hw/acpi',
521 'hw/alpha',
522 'hw/arm',
523 'hw/audio',
524 'hw/block',
525 'hw/block/dataplane',
526 'hw/char',
527 'hw/display',
528 'hw/dma',
529 'hw/hppa',
530 'hw/hyperv',
531 'hw/i2c',
532 'hw/i386',
533 'hw/i386/xen',
534 'hw/ide',
535 'hw/input',
536 'hw/intc',
537 'hw/isa',
538 'hw/mem',
539 'hw/mips',
540 'hw/misc',
541 'hw/misc/macio',
542 'hw/net',
543 'hw/nvram',
544 'hw/pci',
545 'hw/pci-host',
546 'hw/ppc',
547 'hw/rdma',
548 'hw/rdma/vmw',
549 'hw/rtc',
550 'hw/s390x',
551 'hw/scsi',
552 'hw/sd',
553 'hw/sparc',
554 'hw/sparc64',
555 'hw/ssi',
556 'hw/timer',
557 'hw/tpm',
558 'hw/usb',
559 'hw/vfio',
560 'hw/virtio',
561 'hw/watchdog',
562 'hw/xen',
563 'hw/gpio',
564 'hw/riscv',
565 'migration',
566 'net',
567 'ui',
568 ]
569endif
570trace_events_subdirs += [
571 'hw/core',
572 'qapi',
573 'qom',
574 'target/arm',
575 'target/hppa',
576 'target/i386',
577 'target/mips',
578 'target/ppc',
579 'target/riscv',
580 'target/s390x',
581 'target/sparc',
582 'util',
583]
584
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400585subdir('qapi')
586subdir('qobject')
587subdir('stubs')
588subdir('trace')
589subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +0400590subdir('qom')
591subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400592subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +0400593subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400594
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400595
596if enable_modules
597 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
598 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
599endif
600
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400601# Build targets from sourcesets
602
Paolo Bonzini2becc362020-02-03 11:42:03 +0100603stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400604
605util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +0100606util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400607libqemuutil = static_library('qemuutil',
608 sources: util_ss.sources() + stub_ss.sources() + genh,
609 dependencies: [util_ss.dependencies(), m, glib, socket])
610qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400611 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400612
Paolo Bonzini478e9432020-08-17 12:47:55 +0200613subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +0400614subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +0400615subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400616subdir('fsdev')
Marc-André Lureaud3b18482019-08-17 14:55:32 +0400617subdir('target')
Marc-André Lureau708eab42019-09-03 16:59:33 +0400618subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400619
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400620block_ss.add(files(
621 'block.c',
622 'blockjob.c',
623 'job.c',
624 'qemu-io-cmds.c',
625))
626block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
627
628subdir('nbd')
629subdir('scsi')
630subdir('block')
631
Paolo Bonzini4a963372020-08-03 16:22:28 +0200632blockdev_ss.add(files(
633 'blockdev.c',
634 'blockdev-nbd.c',
635 'iothread.c',
636 'job-qmp.c',
637))
638
639# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
640# os-win32.c does not
641blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
642softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
643
644softmmu_ss.add_all(blockdev_ss)
645softmmu_ss.add(files(
646 'bootdevice.c',
647 'dma-helpers.c',
648 'qdev-monitor.c',
649), sdl)
650
651softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
652softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
653softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
654
655common_ss.add(files('cpus-common.c'))
656
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +0200657subdir('softmmu')
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200658subdir('monitor')
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +0200659
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +0200660# needed for fuzzing binaries
661subdir('tests/qtest/libqos')
662
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400663block_mods = []
664softmmu_mods = []
665foreach d, list : modules
666 foreach m, module_ss : list
667 if enable_modules and targetos != 'windows'
668 module_ss = module_ss.apply(config_host, strict: false)
669 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
670 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
671 if d == 'block'
672 block_mods += sl
673 else
674 softmmu_mods += sl
675 endif
676 else
677 if d == 'block'
678 block_ss.add_all(module_ss)
679 else
680 softmmu_ss.add_all(module_ss)
681 endif
682 endif
683 endforeach
684endforeach
685
686nm = find_program('nm')
687undefsym = find_program('scripts/undefsym.sh')
688block_syms = custom_target('block.syms', output: 'block.syms',
689 input: [libqemuutil, block_mods],
690 capture: true,
691 command: [undefsym, nm, '@INPUT@'])
692qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
693 input: [libqemuutil, softmmu_mods],
694 capture: true,
695 command: [undefsym, nm, '@INPUT@'])
696
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400697block_ss = block_ss.apply(config_host, strict: false)
698libblock = static_library('block', block_ss.sources() + genh,
699 dependencies: block_ss.dependencies(),
700 link_depends: block_syms,
701 name_suffix: 'fa',
702 build_by_default: false)
703
704block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400705 link_args: '@block.syms',
706 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400707
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200708qmp_ss = qmp_ss.apply(config_host, strict: false)
709libqmp = static_library('qmp', qmp_ss.sources() + genh,
710 dependencies: qmp_ss.dependencies(),
711 name_suffix: 'fa',
712 build_by_default: false)
713
714qmp = declare_dependency(link_whole: [libqmp])
715
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400716foreach m : block_mods + softmmu_mods
717 shared_module(m.name(),
718 name_prefix: '',
719 link_whole: m,
720 install: true,
721 install_dir: config_host['qemu_moddir'])
722endforeach
723
Paolo Bonzini2becc362020-02-03 11:42:03 +0100724common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
725common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
726
727common_all = common_ss.apply(config_all, strict: false)
728common_all = static_library('common',
729 build_by_default: false,
730 sources: common_all.sources() + genh,
731 dependencies: common_all.dependencies(),
732 name_suffix: 'fa')
733
734foreach target : target_dirs
735 config_target = config_target_mak[target]
736 target_name = config_target['TARGET_NAME']
737 arch = config_target['TARGET_BASE_ARCH']
738 arch_srcs = []
739
740 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
741 if targetos == 'linux'
742 target_inc += include_directories('linux-headers', is_system: true)
743 endif
744 if target.endswith('-softmmu')
745 qemu_target_name = 'qemu-system-' + target_name
746 target_type='system'
747 arch_srcs += config_devices_h[target]
748 else
749 target_type='user'
750 qemu_target_name = 'qemu-' + target_name
751 if 'CONFIG_LINUX_USER' in config_target
752 base_dir = 'linux-user'
753 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
754 else
755 base_dir = 'bsd-user'
756 endif
757 target_inc += include_directories(
758 base_dir,
759 base_dir / config_target['TARGET_ABI_DIR'],
760 )
761 endif
762
763 target_common = common_ss.apply(config_target, strict: false)
764 objects = common_all.extract_objects(target_common.sources())
765
766 # TODO: Change to generator once obj-y goes away
767 config_target_h = custom_target(target + '-config-target.h',
768 input: meson.current_build_dir() / target / 'config-target.mak',
769 output: target + '-config-target.h',
770 capture: true,
771 command: [create_config, '@INPUT@'])
772
773 target_specific = specific_ss.apply(config_target, strict: false)
774 arch_srcs += target_specific.sources()
775
776 static_library('qemu-' + target,
777 sources: arch_srcs + [config_target_h] + genh,
778 objects: objects,
779 include_directories: target_inc,
780 c_args: ['-DNEED_CPU_H',
781 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
782 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
783 name_suffix: 'fa')
784endforeach
785
Paolo Bonzini931049b2020-02-05 09:44:24 +0100786# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400787
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200788if 'CONFIG_GUEST_AGENT' in config_host
789 subdir('qga')
790endif
791
Paolo Bonzini931049b2020-02-05 09:44:24 +0100792if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400793 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
794 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
795 qemu_io = executable('qemu-io', files('qemu-io.c'),
796 dependencies: [block, qemuutil], install: true)
797 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
798 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
799 dependencies: [block, qemuutil], install: true)
800 endif
801
Paolo Bonzini7c58bb72020-08-04 20:18:36 +0200802 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +0200803 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400804 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +0200805
Marc-André Lureauade60d42019-07-15 14:48:31 +0400806 if 'CONFIG_XKBCOMMON' in config_host
807 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
808 dependencies: [qemuutil, xkbcommon], install: true)
809 endif
810
Marc-André Lureau157e7b12019-07-15 14:50:58 +0400811 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
812 dependencies: qemuutil,
813 install: true)
814
Paolo Bonzini931049b2020-02-05 09:44:24 +0100815 if 'CONFIG_VHOST_USER' in config_host
816 subdir('contrib/libvhost-user')
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +0200817 subdir('contrib/vhost-user-blk')
Marc-André Lureauea458962019-07-12 22:23:46 +0400818 if 'CONFIG_LINUX' in config_host
819 subdir('contrib/vhost-user-gpu')
820 endif
Marc-André Lureau32fcc622019-07-12 22:11:20 +0400821 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +0200822 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +0100823 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +0400824
825 if targetos == 'linux'
826 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
827 dependencies: [qemuutil, libcap_ng],
828 install: true,
829 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400830
831 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
832 dependencies: [authz, crypto, io, qom, qemuutil,
833 libcap_ng, libudev, libmpathpersist],
834 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +0400835 endif
836
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400837 if 'CONFIG_IVSHMEM' in config_host
838 subdir('contrib/ivshmem-client')
839 subdir('contrib/ivshmem-server')
840 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +0100841endif
842
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100843subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +0400844subdir('pc-bios')
Paolo Bonzinice1c1e72020-01-28 16:41:44 +0100845subdir('tests')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100846
Paolo Bonzinif9332752020-02-03 13:28:38 +0100847summary_info = {}
848summary_info += {'Install prefix': config_host['prefix']}
849summary_info += {'BIOS directory': config_host['qemu_datadir']}
850summary_info += {'firmware path': config_host['qemu_firmwarepath']}
851summary_info += {'binary directory': config_host['bindir']}
852summary_info += {'library directory': config_host['libdir']}
853summary_info += {'module directory': config_host['qemu_moddir']}
854summary_info += {'libexec directory': config_host['libexecdir']}
855summary_info += {'include directory': config_host['includedir']}
856summary_info += {'config directory': config_host['sysconfdir']}
857if targetos != 'windows'
858 summary_info += {'local state directory': config_host['qemu_localstatedir']}
859 summary_info += {'Manual directory': config_host['mandir']}
860else
861 summary_info += {'local state directory': 'queried at runtime'}
862endif
863summary_info += {'Build directory': meson.current_build_dir()}
864summary_info += {'Source path': meson.current_source_dir()}
865summary_info += {'GIT binary': config_host['GIT']}
866summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
867summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
868summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
869if link_language == 'cpp'
870 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
871else
872 summary_info += {'C++ compiler': false}
873endif
874if targetos == 'darwin'
875 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
876endif
877summary_info += {'ARFLAGS': config_host['ARFLAGS']}
878summary_info += {'CFLAGS': config_host['CFLAGS']}
879summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
880summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
881summary_info += {'make': config_host['MAKE']}
882summary_info += {'install': config_host['INSTALL']}
883summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
884summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
885summary_info += {'genisoimage': config_host['GENISOIMAGE']}
886# TODO: add back version
887summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
888if config_host.has_key('CONFIG_SLIRP')
889 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
890endif
891summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
892if config_host.has_key('CONFIG_MODULES')
893 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
894endif
895summary_info += {'host CPU': cpu}
896summary_info += {'host endianness': build_machine.endian()}
897summary_info += {'target list': config_host['TARGET_DIRS']}
898summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
899summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
900summary_info += {'strip binaries': get_option('strip')}
901summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
902summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
903if targetos == 'darwin'
904 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
905endif
906# TODO: add back version
907summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
908summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
909# TODO: add back version
910summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
911summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
912# TODO: add back version
913summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
914summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
915summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
916# TODO: add back version
917summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
918if config_host.has_key('CONFIG_GCRYPT')
919 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
920 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
921endif
922# TODO: add back version
923summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
924if config_host.has_key('CONFIG_NETTLE')
925 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
926endif
927summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
928summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
929summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
930summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
931# TODO: add back version
932summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
933summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
934summary_info += {'mingw32 support': targetos == 'windows'}
935summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
936summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
937summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
938summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
939summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
940summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
941if config_host.has_key('CONFIG_VNC')
942 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
943 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
944 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
945endif
946summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
947if config_host.has_key('CONFIG_XEN_BACKEND')
948 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
949endif
950summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
951summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
952summary_info += {'PIE': get_option('b_pie')}
953summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
954summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
955summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
956summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
957summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
958summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
959# TODO: add back KVM/HAX/HVF/WHPX/TCG
960#summary_info += {'KVM support': have_kvm'}
961#summary_info += {'HAX support': have_hax'}
962#summary_info += {'HVF support': have_hvf'}
963#summary_info += {'WHPX support': have_whpx'}
964#summary_info += {'TCG support': have_tcg'}
965#if get_option('tcg')
966# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
967# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
968#endif
969summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
970summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
971summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
972summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
973summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
974summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
975summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
976summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
977summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
978summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
979summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
980summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
981summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
982summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
983summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
984summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
985summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
986summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
987summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
988if config_host['TRACE_BACKENDS'].split().contains('simple')
989 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
990endif
991# TODO: add back protocol and server version
992summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
993summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
994summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
995summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
996summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
997summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
998summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
999summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1000summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1001summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1002summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1003if targetos == 'windows'
1004 if 'WIN_SDK' in config_host
1005 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1006 endif
1007 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1008 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1009 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1010endif
1011summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1012summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1013summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1014summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1015summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1016summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1017summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +04001018summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001019summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1020summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1021summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1022summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1023summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1024summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1025summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1026summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1027summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1028summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1029summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1030summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1031summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1032summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1033summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1034summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1035summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1036summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1037summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1038summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1039summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1040summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1041summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1042summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1043summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1044summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1045summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1046summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1047summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1048summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1049summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1050summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1051if config_host.has_key('HAVE_GDB_BIN')
1052 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1053endif
1054summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1055summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1056summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1057summary(summary_info, bool_yn: true)
1058
1059if not supported_cpus.contains(cpu)
1060 message()
1061 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1062 message()
1063 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1064 message('The QEMU project intends to remove support for this host CPU in')
1065 message('a future release if nobody volunteers to maintain it and to')
1066 message('provide a build host for our continuous integration setup.')
1067 message('configure has succeeded and you can continue to build, but')
1068 message('if you care about QEMU on this platform you should contact')
1069 message('us upstream at qemu-devel@nongnu.org.')
1070endif
1071
1072if not supported_oses.contains(targetos)
1073 message()
1074 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1075 message()
1076 message('Host OS ' + targetos + 'support is not currently maintained.')
1077 message('The QEMU project intends to remove support for this host OS in')
1078 message('a future release if nobody volunteers to maintain it and to')
1079 message('provide a build host for our continuous integration setup.')
1080 message('configure has succeeded and you can continue to build, but')
1081 message('if you care about QEMU on this platform you should contact')
1082 message('us upstream at qemu-devel@nongnu.org.')
1083endif