]> Git Repo - qemu.git/blame - meson.build
qapi: Restrict balloon-related commands to machine code
[qemu.git] / meson.build
CommitLineData
a5665051 1project('qemu', ['c'], meson_version: '>=0.55.0',
90756b2f 2 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11',
3e0e5190 3 'b_colorout=auto'],
a5665051
PB
4 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5
6not_found = dependency('', required: false)
b29b40f4
PB
7if meson.version().version_compare('>=0.56.0')
8 keyval = import('keyval')
9else
10 keyval = import('unstable-keyval')
11endif
a81df1b6
PB
12ss = import('sourceset')
13
ce1c1e7a 14sh = find_program('sh')
a81df1b6 15cc = meson.get_compiler('c')
a5665051 16config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
3154fee4 17enable_modules = 'CONFIG_MODULES' in config_host
35be72ba 18enable_static = 'CONFIG_STATIC' in config_host
f8aa24ea 19build_docs = 'BUILD_DOCS' in config_host
ab4c0996 20qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
491e74c1 21qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
859aef02
PB
22config_host_data = configuration_data()
23genh = []
a5665051 24
760e4327
PB
25target_dirs = config_host['TARGET_DIRS'].split()
26have_user = false
27have_system = false
28foreach target : target_dirs
29 have_user = have_user or target.endswith('-user')
30 have_system = have_system or target.endswith('-softmmu')
31endforeach
32have_tools = 'CONFIG_TOOLS' in config_host
33have_block = have_system or have_tools
34
201e8ed7
PB
35python = import('python').find_installation()
36
37supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
38supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
39 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
40
41cpu = host_machine.cpu_family()
42targetos = host_machine.system()
43
44configure_file(input: files('scripts/ninjatool.py'),
45 output: 'ninjatool',
46 configuration: config_host)
47
48##################
49# Compiler flags #
50##################
51
a5665051
PB
52add_project_arguments(config_host['QEMU_CFLAGS'].split(),
53 native: false, language: ['c', 'objc'])
54add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
55 native: false, language: 'cpp')
56add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
57 native: false, language: ['c', 'cpp', 'objc'])
58add_project_arguments(config_host['QEMU_INCLUDES'].split(),
59 language: ['c', 'cpp', 'objc'])
60
c46f76d1
AB
61# Specify linker-script with add_project_link_arguments so that it is not placed
62# within a linker --start-group/--end-group pair
63if 'CONFIG_FUZZ' in config_host
64 add_project_link_arguments(['-Wl,-T,',
65 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
66 native: false, language: ['c', 'cpp', 'objc'])
67endif
68
fc929892
MAL
69link_language = meson.get_external_property('link_language', 'cpp')
70if link_language == 'cpp'
71 add_languages('cpp', required: true, native: false)
72endif
a5665051
PB
73if host_machine.system() == 'darwin'
74 add_languages('objc', required: false, native: false)
75endif
76
968b4db3
PB
77if 'SPARSE_CFLAGS' in config_host
78 run_target('sparse',
79 command: [find_program('scripts/check_sparse.py'),
80 config_host['SPARSE_CFLAGS'].split(),
81 'compile_commands.json'])
82endif
83
a81df1b6
PB
84m = cc.find_library('m', required: false)
85util = cc.find_library('util', required: false)
4a96337d 86winmm = []
a81df1b6 87socket = []
04c6f1e7 88version_res = []
d92989aa
MAL
89coref = []
90iokit = []
91cocoa = []
92hvf = []
a81df1b6
PB
93if targetos == 'windows'
94 socket = cc.find_library('ws2_32')
4a96337d 95 winmm = cc.find_library('winmm')
04c6f1e7
MAL
96
97 win = import('windows')
98 version_res = win.compile_resources('version.rc',
99 depend_files: files('pc-bios/qemu-nsis.ico'),
100 include_directories: include_directories('.'))
d92989aa
MAL
101elif targetos == 'darwin'
102 coref = dependency('appleframeworks', modules: 'CoreFoundation')
103 iokit = dependency('appleframeworks', modules: 'IOKit')
104 cocoa = dependency('appleframeworks', modules: 'Cocoa')
105 hvf = dependency('appleframeworks', modules: 'Hypervisor')
cfad62f1
PB
106elif targetos == 'sunos'
107 socket = [cc.find_library('socket'),
108 cc.find_library('nsl'),
109 cc.find_library('resolv')]
110elif targetos == 'haiku'
111 socket = [cc.find_library('posix_error_mapper'),
112 cc.find_library('network'),
113 cc.find_library('bsd')]
a81df1b6 114endif
215b0c2f
PB
115# The path to glib.h is added to all compilation commands. This was
116# grandfathered in from the QEMU Makefiles.
117add_project_arguments(config_host['GLIB_CFLAGS'].split(),
118 native: false, language: ['c', 'cpp', 'objc'])
119glib = declare_dependency(link_args: config_host['GLIB_LIBS'].split())
a81df1b6
PB
120gio = not_found
121if 'CONFIG_GIO' in config_host
122 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
123 link_args: config_host['GIO_LIBS'].split())
124endif
125lttng = not_found
126if 'CONFIG_TRACE_UST' in config_host
127 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
128endif
129urcubp = not_found
130if 'CONFIG_TRACE_UST' in config_host
131 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
132endif
46859d93
DB
133gcrypt = not_found
134if 'CONFIG_GCRYPT' in config_host
135 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
136 link_args: config_host['GCRYPT_LIBS'].split())
137endif
a81df1b6
PB
138nettle = not_found
139if 'CONFIG_NETTLE' in config_host
140 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
141 link_args: config_host['NETTLE_LIBS'].split())
142endif
143gnutls = not_found
144if 'CONFIG_GNUTLS' in config_host
145 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
146 link_args: config_host['GNUTLS_LIBS'].split())
147endif
b7612f45
PB
148pixman = not_found
149if have_system or have_tools
150 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
1a94933f 151 method: 'pkg-config', static: enable_static)
b7612f45 152endif
5e7fbd25
MAL
153pam = not_found
154if 'CONFIG_AUTH_PAM' in config_host
155 pam = cc.find_library('pam')
156endif
5e5733e5 157libaio = cc.find_library('aio', required: false)
1ffb3bbb 158zlib = dependency('zlib', required: true, static: enable_static)
5e5733e5
MAL
159linux_io_uring = not_found
160if 'CONFIG_LINUX_IO_URING' in config_host
161 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
162 link_args: config_host['LINUX_IO_URING_LIBS'].split())
163endif
164libxml2 = not_found
165if 'CONFIG_LIBXML2' in config_host
166 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
167 link_args: config_host['LIBXML2_LIBS'].split())
168endif
169libnfs = not_found
170if 'CONFIG_LIBNFS' in config_host
171 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
172endif
ec0d5893
MAL
173libattr = not_found
174if 'CONFIG_ATTR' in config_host
175 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
176endif
3f99cf57
PB
177seccomp = not_found
178if 'CONFIG_SECCOMP' in config_host
179 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
180 link_args: config_host['SECCOMP_LIBS'].split())
181endif
182libcap_ng = not_found
183if 'CONFIG_LIBCAP_NG' in config_host
184 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
185endif
1917ec6d
PB
186if get_option('xkbcommon').auto() and not have_system and not have_tools
187 xkbcommon = not_found
188else
189 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
1a94933f 190 method: 'pkg-config', static: enable_static)
ade60d4f 191endif
cdaf0722
MAL
192slirp = not_found
193if config_host.has_key('CONFIG_SLIRP')
194 slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
195 link_args: config_host['SLIRP_LIBS'].split())
196endif
197vde = not_found
198if config_host.has_key('CONFIG_VDE')
199 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
200endif
478e943f
PB
201pulse = not_found
202if 'CONFIG_LIBPULSE' in config_host
203 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
204 link_args: config_host['PULSE_LIBS'].split())
205endif
206alsa = not_found
207if 'CONFIG_ALSA' in config_host
208 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
209 link_args: config_host['ALSA_LIBS'].split())
210endif
211jack = not_found
212if 'CONFIG_LIBJACK' in config_host
213 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
214endif
2634733c
PB
215spice = not_found
216if 'CONFIG_SPICE' in config_host
217 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
218 link_args: config_host['SPICE_LIBS'].split())
219endif
5ee24e78 220rt = cc.find_library('rt', required: false)
897b5afa
MAL
221libmpathpersist = not_found
222if config_host.has_key('CONFIG_MPATH')
223 libmpathpersist = cc.find_library('mpathpersist')
224endif
ccf7afa5
PB
225libdl = not_found
226if 'CONFIG_PLUGIN' in config_host
227 libdl = cc.find_library('dl', required: true)
228endif
99650b62
PB
229libiscsi = not_found
230if 'CONFIG_LIBISCSI' in config_host
231 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
232 link_args: config_host['LIBISCSI_LIBS'].split())
233endif
5e5733e5
MAL
234zstd = not_found
235if 'CONFIG_ZSTD' in config_host
236 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
237 link_args: config_host['ZSTD_LIBS'].split())
238endif
ea458960
MAL
239gbm = not_found
240if 'CONFIG_GBM' in config_host
241 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
242 link_args: config_host['GBM_LIBS'].split())
243endif
244virgl = not_found
245if 'CONFIG_VIRGL' in config_host
246 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
247 link_args: config_host['VIRGL_LIBS'].split())
248endif
1d7bb6ab
MAL
249curl = not_found
250if 'CONFIG_CURL' in config_host
251 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
252 link_args: config_host['CURL_LIBS'].split())
253endif
f15bff25
PB
254libudev = not_found
255if 'CONFIG_LIBUDEV' in config_host
256 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
257endif
2634733c
PB
258brlapi = not_found
259if 'CONFIG_BRLAPI' in config_host
260 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
261endif
35be72ba 262
760e4327
PB
263sdl = not_found
264if have_system
363743da 265 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
760e4327
PB
266 sdl_image = not_found
267endif
35be72ba
PB
268if sdl.found()
269 # work around 2.0.8 bug
270 sdl = declare_dependency(compile_args: '-Wno-undef',
271 dependencies: sdl)
7161a433 272 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
1a94933f 273 method: 'pkg-config', static: enable_static)
35be72ba
PB
274else
275 if get_option('sdl_image').enabled()
a8dc2ace
ST
276 error('sdl-image required, but SDL was @0@'.format(
277 get_option('sdl').disabled() ? 'disabled' : 'not found'))
35be72ba
PB
278 endif
279 sdl_image = not_found
2634733c 280endif
35be72ba 281
5e5733e5
MAL
282rbd = not_found
283if 'CONFIG_RBD' in config_host
284 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
285endif
286glusterfs = not_found
287if 'CONFIG_GLUSTERFS' in config_host
288 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
289 link_args: config_host['GLUSTERFS_LIBS'].split())
290endif
291libssh = not_found
292if 'CONFIG_LIBSSH' in config_host
293 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
294 link_args: config_host['LIBSSH_LIBS'].split())
295endif
296libbzip2 = not_found
297if 'CONFIG_BZIP2' in config_host
298 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
299endif
300liblzfse = not_found
301if 'CONFIG_LZFSE' in config_host
302 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
303endif
478e943f
PB
304oss = not_found
305if 'CONFIG_AUDIO_OSS' in config_host
306 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
307endif
308dsound = not_found
309if 'CONFIG_AUDIO_DSOUND' in config_host
310 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
311endif
312coreaudio = not_found
313if 'CONFIG_AUDIO_COREAUDIO' in config_host
314 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
2b1ccdf4
MAL
315endif
316opengl = not_found
317if 'CONFIG_OPENGL' in config_host
de2d3005
PB
318 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
319 link_args: config_host['OPENGL_LIBS'].split())
2b1ccdf4
MAL
320endif
321gtk = not_found
322if 'CONFIG_GTK' in config_host
323 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
324 link_args: config_host['GTK_LIBS'].split())
325endif
326vte = not_found
327if 'CONFIG_VTE' in config_host
328 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
329 link_args: config_host['VTE_LIBS'].split())
330endif
331x11 = not_found
332if 'CONFIG_X11' in config_host
333 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
334 link_args: config_host['X11_LIBS'].split())
335endif
336curses = not_found
337if 'CONFIG_CURSES' in config_host
338 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
339 link_args: config_host['CURSES_LIBS'].split())
340endif
341iconv = not_found
342if 'CONFIG_ICONV' in config_host
343 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
344 link_args: config_host['ICONV_LIBS'].split())
345endif
a0b93237 346vnc = not_found
2b1ccdf4 347png = not_found
2b1ccdf4 348jpeg = not_found
2b1ccdf4 349sasl = not_found
a0b93237
PB
350if get_option('vnc').enabled()
351 vnc = declare_dependency() # dummy dependency
352 png = dependency('libpng', required: get_option('vnc_png'),
1a94933f 353 method: 'pkg-config', static: enable_static)
a0b93237
PB
354 jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
355 required: get_option('vnc_jpeg'),
356 static: enable_static)
357 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
358 required: get_option('vnc_sasl'),
359 static: enable_static)
360 if sasl.found()
361 sasl = declare_dependency(dependencies: sasl,
362 compile_args: '-DSTRUCT_IOVEC_DEFINED')
363 endif
478e943f 364endif
4a96337d
PB
365fdt = not_found
366if 'CONFIG_FDT' in config_host
367 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
368 link_args: config_host['FDT_LIBS'].split())
369endif
708eab42
MAL
370snappy = not_found
371if 'CONFIG_SNAPPY' in config_host
372 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
373endif
374lzo = not_found
375if 'CONFIG_LZO' in config_host
376 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
377endif
55166230
MAL
378rdma = not_found
379if 'CONFIG_RDMA' in config_host
380 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
381endif
ab318051
MAL
382numa = not_found
383if 'CONFIG_NUMA' in config_host
384 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
385endif
582ea95f
MAL
386xen = not_found
387if 'CONFIG_XEN_BACKEND' in config_host
388 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
389 link_args: config_host['XEN_LIBS'].split())
390endif
06677ce1
PB
391cacard = not_found
392if 'CONFIG_SMARTCARD' in config_host
393 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
394 link_args: config_host['SMARTCARD_LIBS'].split())
395endif
0a40bcb7
CB
396u2f = not_found
397if have_system
398 u2f = dependency('u2f-emu', required: get_option('u2f'),
399 method: 'pkg-config',
400 static: enable_static)
401endif
06677ce1
PB
402usbredir = not_found
403if 'CONFIG_USB_REDIR' in config_host
404 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
405 link_args: config_host['USB_REDIR_LIBS'].split())
406endif
407libusb = not_found
408if 'CONFIG_USB_LIBUSB' in config_host
409 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
410 link_args: config_host['LIBUSB_LIBS'].split())
411endif
c9322ab5
MAL
412capstone = not_found
413if 'CONFIG_CAPSTONE' in config_host
414 capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(),
415 link_args: config_host['CAPSTONE_LIBS'].split())
416endif
417libpmem = not_found
418if 'CONFIG_LIBPMEM' in config_host
419 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
420 link_args: config_host['LIBPMEM_LIBS'].split())
421endif
c7c91a74
BR
422libdaxctl = not_found
423if 'CONFIG_LIBDAXCTL' in config_host
424 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
425endif
8ce0a45f
MAL
426tasn1 = not_found
427if 'CONFIG_TASN1' in config_host
428 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
429 link_args: config_host['TASN1_LIBS'].split())
430endif
af04e89d
MAL
431keyutils = dependency('libkeyutils', required: false,
432 method: 'pkg-config', static: enable_static)
a81df1b6 433
3909def8
MAL
434has_gettid = cc.has_function('gettid')
435
859aef02
PB
436# Create config-host.h
437
35be72ba
PB
438config_host_data.set('CONFIG_SDL', sdl.found())
439config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
a0b93237
PB
440config_host_data.set('CONFIG_VNC', vnc.found())
441config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
442config_host_data.set('CONFIG_VNC_PNG', png.found())
443config_host_data.set('CONFIG_VNC_SASL', sasl.found())
4113f4cf 444config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
af04e89d 445config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
3909def8 446config_host_data.set('CONFIG_GETTID', has_gettid)
859aef02
PB
447config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
448config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
449config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
450config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
451
452arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
453strings = ['HOST_DSOSUF', 'CONFIG_IASL', 'qemu_confdir', 'qemu_datadir',
454 'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
455 'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath']
456foreach k, v: config_host
457 if arrays.contains(k)
458 if v != ''
459 v = '"' + '", "'.join(v.split()) + '", '
460 endif
461 config_host_data.set(k, v)
462 elif k == 'ARCH'
463 config_host_data.set('HOST_' + v.to_upper(), 1)
464 elif strings.contains(k)
465 if not k.startswith('CONFIG_')
466 k = 'CONFIG_' + k.to_upper()
467 endif
468 config_host_data.set_quoted(k, v)
469 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
470 config_host_data.set(k, v == 'y' ? 1 : v)
471 endif
472endforeach
473genh += configure_file(output: 'config-host.h', configuration: config_host_data)
474
2becc36a 475minikconf = find_program('scripts/minikconf.py')
a98006bc 476config_all_devices = {}
ca0fc784 477config_all_disas = {}
2becc36a
PB
478config_devices_mak_list = []
479config_devices_h = {}
859aef02 480config_target_h = {}
2becc36a 481config_target_mak = {}
ca0fc784
PB
482
483disassemblers = {
484 'alpha' : ['CONFIG_ALPHA_DIS'],
485 'arm' : ['CONFIG_ARM_DIS'],
486 'avr' : ['CONFIG_AVR_DIS'],
487 'cris' : ['CONFIG_CRIS_DIS'],
488 'hppa' : ['CONFIG_HPPA_DIS'],
489 'i386' : ['CONFIG_I386_DIS'],
490 'x86_64' : ['CONFIG_I386_DIS'],
491 'x32' : ['CONFIG_I386_DIS'],
492 'lm32' : ['CONFIG_LM32_DIS'],
493 'm68k' : ['CONFIG_M68K_DIS'],
494 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
495 'mips' : ['CONFIG_MIPS_DIS'],
496 'moxie' : ['CONFIG_MOXIE_DIS'],
497 'nios2' : ['CONFIG_NIOS2_DIS'],
498 'or1k' : ['CONFIG_OPENRISC_DIS'],
499 'ppc' : ['CONFIG_PPC_DIS'],
500 'riscv' : ['CONFIG_RISCV_DIS'],
501 'rx' : ['CONFIG_RX_DIS'],
502 's390' : ['CONFIG_S390_DIS'],
503 'sh4' : ['CONFIG_SH4_DIS'],
504 'sparc' : ['CONFIG_SPARC_DIS'],
505 'xtensa' : ['CONFIG_XTENSA_DIS'],
506}
507if link_language == 'cpp'
508 disassemblers += {
509 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
510 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
511 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
512 }
513endif
514
2becc36a
PB
515kconfig_external_symbols = [
516 'CONFIG_KVM',
517 'CONFIG_XEN',
518 'CONFIG_TPM',
519 'CONFIG_SPICE',
520 'CONFIG_IVSHMEM',
521 'CONFIG_OPENGL',
522 'CONFIG_X11',
523 'CONFIG_VHOST_USER',
40bc0ca9 524 'CONFIG_VHOST_VDPA',
2becc36a
PB
525 'CONFIG_VHOST_KERNEL',
526 'CONFIG_VIRTFS',
527 'CONFIG_LINUX',
528 'CONFIG_PVRDMA',
529]
859aef02 530ignored = ['TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_DIRS']
ca0fc784 531
a81df1b6 532foreach target : target_dirs
859aef02
PB
533 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak')
534
ca0fc784
PB
535 foreach k, v: disassemblers
536 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
537 foreach sym: v
538 config_target += { sym: 'y' }
539 config_all_disas += { sym: 'y' }
540 endforeach
541 endif
542 endforeach
543
859aef02
PB
544 config_target_data = configuration_data()
545 foreach k, v: config_target
546 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
547 # do nothing
548 elif ignored.contains(k)
549 # do nothing
550 elif k == 'TARGET_BASE_ARCH'
551 config_target_data.set('TARGET_' + v.to_upper(), 1)
552 elif k == 'TARGET_NAME'
553 config_target_data.set_quoted(k, v)
554 elif v == 'y'
555 config_target_data.set(k, 1)
556 else
557 config_target_data.set(k, v)
558 endif
559 endforeach
560 config_target_h += {target: configure_file(output: target + '-config-target.h',
561 configuration: config_target_data)}
2becc36a
PB
562
563 if target.endswith('-softmmu')
2becc36a
PB
564 base_kconfig = []
565 foreach sym : kconfig_external_symbols
859aef02 566 if sym in config_target or sym in config_host
2becc36a
PB
567 base_kconfig += '@0@=y'.format(sym)
568 endif
569 endforeach
570
571 config_devices_mak = target + '-config-devices.mak'
572 config_devices_mak = configure_file(
573 input: ['default-configs' / target + '.mak', 'Kconfig'],
574 output: config_devices_mak,
575 depfile: config_devices_mak + '.d',
576 capture: true,
577 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
578 config_devices_mak, '@DEPFILE@', '@INPUT@',
579 base_kconfig])
859aef02
PB
580
581 config_devices_data = configuration_data()
582 config_devices = keyval.load(config_devices_mak)
583 foreach k, v: config_devices
584 config_devices_data.set(k, 1)
585 endforeach
2becc36a 586 config_devices_mak_list += config_devices_mak
859aef02
PB
587 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
588 configuration: config_devices_data)}
589 config_target += config_devices
a98006bc 590 config_all_devices += config_devices
2becc36a
PB
591 endif
592 config_target_mak += {target: config_target}
a81df1b6 593endforeach
a81df1b6 594
2becc36a
PB
595# This configuration is used to build files that are shared by
596# multiple binaries, and then extracted out of the "common"
597# static_library target.
598#
599# We do not use all_sources()/all_dependencies(), because it would
600# build literally all source files, including devices only used by
601# targets that are not built for this compilation. The CONFIG_ALL
602# pseudo symbol replaces it.
603
2becc36a
PB
604config_all = config_all_devices
605config_all += config_host
606config_all += config_all_disas
607config_all += {
608 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
609 'CONFIG_SOFTMMU': have_system,
610 'CONFIG_USER_ONLY': have_user,
611 'CONFIG_ALL': true,
612}
613
a81df1b6
PB
614# Generators
615
3f885659 616hxtool = find_program('scripts/hxtool')
650b5d54 617shaderinclude = find_program('scripts/shaderinclude.pl')
a81df1b6
PB
618qapi_gen = find_program('scripts/qapi-gen.py')
619qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
620 meson.source_root() / 'scripts/qapi/commands.py',
621 meson.source_root() / 'scripts/qapi/common.py',
622 meson.source_root() / 'scripts/qapi/doc.py',
623 meson.source_root() / 'scripts/qapi/error.py',
624 meson.source_root() / 'scripts/qapi/events.py',
625 meson.source_root() / 'scripts/qapi/expr.py',
626 meson.source_root() / 'scripts/qapi/gen.py',
627 meson.source_root() / 'scripts/qapi/introspect.py',
628 meson.source_root() / 'scripts/qapi/parser.py',
629 meson.source_root() / 'scripts/qapi/schema.py',
630 meson.source_root() / 'scripts/qapi/source.py',
631 meson.source_root() / 'scripts/qapi/types.py',
632 meson.source_root() / 'scripts/qapi/visit.py',
633 meson.source_root() / 'scripts/qapi/common.py',
634 meson.source_root() / 'scripts/qapi/doc.py',
635 meson.source_root() / 'scripts/qapi-gen.py'
636]
637
638tracetool = [
639 python, files('scripts/tracetool.py'),
640 '--backend=' + config_host['TRACE_BACKENDS']
641]
642
2c273f32
MAL
643qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
644 meson.current_source_dir(),
859aef02 645 config_host['PKGVERSION'], meson.project_version()]
2c273f32
MAL
646qemu_version = custom_target('qemu-version.h',
647 output: 'qemu-version.h',
648 command: qemu_version_cmd,
649 capture: true,
650 build_by_default: true,
651 build_always_stale: true)
652genh += qemu_version
653
3f885659
MAL
654hxdep = []
655hx_headers = [
656 ['qemu-options.hx', 'qemu-options.def'],
657 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
658]
659if have_system
660 hx_headers += [
661 ['hmp-commands.hx', 'hmp-commands.h'],
662 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
663 ]
664endif
665foreach d : hx_headers
b7c70bf2 666 hxdep += custom_target(d[1],
3f885659
MAL
667 input: files(d[0]),
668 output: d[1],
669 capture: true,
670 build_by_default: true, # to be removed when added to a target
671 command: [hxtool, '-h', '@INPUT0@'])
672endforeach
673genh += hxdep
674
a81df1b6
PB
675# Collect sourcesets.
676
677util_ss = ss.source_set()
678stub_ss = ss.source_set()
679trace_ss = ss.source_set()
3154fee4 680block_ss = ss.source_set()
4a96337d 681blockdev_ss = ss.source_set()
ff219dca 682qmp_ss = ss.source_set()
2becc36a
PB
683common_ss = ss.source_set()
684softmmu_ss = ss.source_set()
685user_ss = ss.source_set()
686bsd_user_ss = ss.source_set()
687linux_user_ss = ss.source_set()
688specific_ss = ss.source_set()
64ed6f92 689specific_fuzz_ss = ss.source_set()
2becc36a 690
3154fee4 691modules = {}
2becc36a
PB
692hw_arch = {}
693target_arch = {}
694target_softmmu_arch = {}
a81df1b6
PB
695
696###############
697# Trace files #
698###############
699
c9322ab5
MAL
700# TODO: add each directory to the subdirs from its own meson.build, once
701# we have those
a81df1b6
PB
702trace_events_subdirs = [
703 'accel/kvm',
704 'accel/tcg',
705 'crypto',
706 'monitor',
707]
708if have_user
709 trace_events_subdirs += [ 'linux-user' ]
710endif
711if have_block
712 trace_events_subdirs += [
713 'authz',
714 'block',
715 'io',
716 'nbd',
717 'scsi',
718 ]
719endif
720if have_system
721 trace_events_subdirs += [
722 'audio',
723 'backends',
724 'backends/tpm',
725 'chardev',
726 'hw/9pfs',
727 'hw/acpi',
728 'hw/alpha',
729 'hw/arm',
730 'hw/audio',
731 'hw/block',
732 'hw/block/dataplane',
733 'hw/char',
734 'hw/display',
735 'hw/dma',
736 'hw/hppa',
737 'hw/hyperv',
738 'hw/i2c',
739 'hw/i386',
740 'hw/i386/xen',
741 'hw/ide',
742 'hw/input',
743 'hw/intc',
744 'hw/isa',
745 'hw/mem',
746 'hw/mips',
747 'hw/misc',
748 'hw/misc/macio',
749 'hw/net',
750 'hw/nvram',
751 'hw/pci',
752 'hw/pci-host',
753 'hw/ppc',
754 'hw/rdma',
755 'hw/rdma/vmw',
756 'hw/rtc',
757 'hw/s390x',
758 'hw/scsi',
759 'hw/sd',
760 'hw/sparc',
761 'hw/sparc64',
762 'hw/ssi',
763 'hw/timer',
764 'hw/tpm',
765 'hw/usb',
766 'hw/vfio',
767 'hw/virtio',
768 'hw/watchdog',
769 'hw/xen',
770 'hw/gpio',
a81df1b6
PB
771 'migration',
772 'net',
8b7a5507 773 'softmmu',
a81df1b6
PB
774 'ui',
775 ]
776endif
777trace_events_subdirs += [
778 'hw/core',
779 'qapi',
780 'qom',
781 'target/arm',
782 'target/hppa',
783 'target/i386',
784 'target/mips',
785 'target/ppc',
786 'target/riscv',
787 'target/s390x',
788 'target/sparc',
789 'util',
790]
791
a81df1b6
PB
792subdir('qapi')
793subdir('qobject')
794subdir('stubs')
795subdir('trace')
796subdir('util')
5582c58f
MAL
797subdir('qom')
798subdir('authz')
a81df1b6 799subdir('crypto')
2d78b56e 800subdir('ui')
a81df1b6 801
3154fee4
MAL
802
803if enable_modules
804 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
805 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
806endif
807
a81df1b6
PB
808# Build targets from sourcesets
809
2becc36a 810stub_ss = stub_ss.apply(config_all, strict: false)
a81df1b6
PB
811
812util_ss.add_all(trace_ss)
2becc36a 813util_ss = util_ss.apply(config_all, strict: false)
a81df1b6
PB
814libqemuutil = static_library('qemuutil',
815 sources: util_ss.sources() + stub_ss.sources() + genh,
816 dependencies: [util_ss.dependencies(), m, glib, socket])
817qemuutil = declare_dependency(link_with: libqemuutil,
04c6f1e7 818 sources: genh + version_res)
a81df1b6 819
abff1abf
PB
820decodetree = generator(find_program('scripts/decodetree.py'),
821 output: 'decode-@[email protected]',
822 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
823
478e943f 824subdir('audio')
7fcfd456 825subdir('io')
848e8ff6 826subdir('chardev')
ec0d5893 827subdir('fsdev')
abff1abf 828subdir('libdecnumber')
d3b18480 829subdir('target')
708eab42 830subdir('dump')
ec0d5893 831
5e5733e5
MAL
832block_ss.add(files(
833 'block.c',
834 'blockjob.c',
835 'job.c',
836 'qemu-io-cmds.c',
837))
838block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
839
840subdir('nbd')
841subdir('scsi')
842subdir('block')
843
4a96337d
PB
844blockdev_ss.add(files(
845 'blockdev.c',
846 'blockdev-nbd.c',
847 'iothread.c',
848 'job-qmp.c',
849))
850
851# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
852# os-win32.c does not
853blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
854softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
855
856softmmu_ss.add_all(blockdev_ss)
857softmmu_ss.add(files(
858 'bootdevice.c',
859 'dma-helpers.c',
860 'qdev-monitor.c',
861), sdl)
862
863softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
864softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
865softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
866
867common_ss.add(files('cpus-common.c'))
868
5d3ea0e1 869subdir('softmmu')
c9322ab5 870
c7c91a74 871specific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem, libdaxctl)
c9322ab5
MAL
872specific_ss.add(files('exec-vary.c'))
873specific_ss.add(when: 'CONFIG_TCG', if_true: files(
874 'fpu/softfloat.c',
875 'tcg/optimize.c',
876 'tcg/tcg-common.c',
877 'tcg/tcg-op-gvec.c',
878 'tcg/tcg-op-vec.c',
879 'tcg/tcg-op.c',
880 'tcg/tcg.c',
881))
882specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
883
ab318051 884subdir('backends')
c574e161 885subdir('disas')
55166230 886subdir('migration')
ff219dca 887subdir('monitor')
cdaf0722 888subdir('net')
17ef2af6 889subdir('replay')
582ea95f 890subdir('hw')
1a82878a 891subdir('accel')
f556b4a1 892subdir('plugins')
b309c321 893subdir('bsd-user')
3a30446a
MAL
894subdir('linux-user')
895
b309c321
MAL
896bsd_user_ss.add(files('gdbstub.c'))
897specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
898
3a30446a
MAL
899linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
900specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
5d3ea0e1 901
a2ce7dbd
PB
902# needed for fuzzing binaries
903subdir('tests/qtest/libqos')
64ed6f92 904subdir('tests/qtest/fuzz')
a2ce7dbd 905
3154fee4
MAL
906block_mods = []
907softmmu_mods = []
908foreach d, list : modules
909 foreach m, module_ss : list
910 if enable_modules and targetos != 'windows'
3e292c51 911 module_ss = module_ss.apply(config_all, strict: false)
3154fee4
MAL
912 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
913 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
914 if d == 'block'
915 block_mods += sl
916 else
917 softmmu_mods += sl
918 endif
919 else
920 if d == 'block'
921 block_ss.add_all(module_ss)
922 else
923 softmmu_ss.add_all(module_ss)
924 endif
925 endif
926 endforeach
927endforeach
928
929nm = find_program('nm')
604f3e4e 930undefsym = find_program('scripts/undefsym.py')
3154fee4
MAL
931block_syms = custom_target('block.syms', output: 'block.syms',
932 input: [libqemuutil, block_mods],
933 capture: true,
934 command: [undefsym, nm, '@INPUT@'])
935qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
936 input: [libqemuutil, softmmu_mods],
937 capture: true,
938 command: [undefsym, nm, '@INPUT@'])
939
5e5733e5
MAL
940block_ss = block_ss.apply(config_host, strict: false)
941libblock = static_library('block', block_ss.sources() + genh,
942 dependencies: block_ss.dependencies(),
943 link_depends: block_syms,
944 name_suffix: 'fa',
945 build_by_default: false)
946
947block = declare_dependency(link_whole: [libblock],
b7c70bf2
MAL
948 link_args: '@block.syms',
949 dependencies: [crypto, io])
5e5733e5 950
ff219dca
PB
951qmp_ss = qmp_ss.apply(config_host, strict: false)
952libqmp = static_library('qmp', qmp_ss.sources() + genh,
953 dependencies: qmp_ss.dependencies(),
954 name_suffix: 'fa',
955 build_by_default: false)
956
957qmp = declare_dependency(link_whole: [libqmp])
958
3154fee4
MAL
959foreach m : block_mods + softmmu_mods
960 shared_module(m.name(),
961 name_prefix: '',
962 link_whole: m,
963 install: true,
964 install_dir: config_host['qemu_moddir'])
965endforeach
966
64ed6f92
PB
967softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
968common_ss.add(qom, qemuutil)
969
970common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
2becc36a
PB
971common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
972
973common_all = common_ss.apply(config_all, strict: false)
974common_all = static_library('common',
975 build_by_default: false,
976 sources: common_all.sources() + genh,
977 dependencies: common_all.dependencies(),
978 name_suffix: 'fa')
979
c9322ab5
MAL
980feature_to_c = find_program('scripts/feature_to_c.sh')
981
64ed6f92 982emulators = []
2becc36a
PB
983foreach target : target_dirs
984 config_target = config_target_mak[target]
985 target_name = config_target['TARGET_NAME']
986 arch = config_target['TARGET_BASE_ARCH']
859aef02 987 arch_srcs = [config_target_h[target]]
64ed6f92
PB
988 arch_deps = []
989 c_args = ['-DNEED_CPU_H',
990 '-DCONFIG_TARGET="@[email protected]"'.format(target),
991 '-DCONFIG_DEVICES="@[email protected]"'.format(target)]
992 link_args = []
2becc36a 993
859aef02 994 config_target += config_host
2becc36a
PB
995 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
996 if targetos == 'linux'
997 target_inc += include_directories('linux-headers', is_system: true)
998 endif
999 if target.endswith('-softmmu')
1000 qemu_target_name = 'qemu-system-' + target_name
1001 target_type='system'
abff1abf
PB
1002 t = target_softmmu_arch[arch].apply(config_target, strict: false)
1003 arch_srcs += t.sources()
64ed6f92 1004 arch_deps += t.dependencies()
abff1abf 1005
2c44220d
MAL
1006 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
1007 hw = hw_arch[hw_dir].apply(config_target, strict: false)
1008 arch_srcs += hw.sources()
64ed6f92 1009 arch_deps += hw.dependencies()
2c44220d 1010
2becc36a 1011 arch_srcs += config_devices_h[target]
64ed6f92 1012 link_args += ['@block.syms', '@qemu.syms']
2becc36a 1013 else
3a30446a 1014 abi = config_target['TARGET_ABI_DIR']
2becc36a
PB
1015 target_type='user'
1016 qemu_target_name = 'qemu-' + target_name
1017 if 'CONFIG_LINUX_USER' in config_target
1018 base_dir = 'linux-user'
1019 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1020 else
1021 base_dir = 'bsd-user'
1022 endif
1023 target_inc += include_directories(
1024 base_dir,
3a30446a 1025 base_dir / abi,
2becc36a 1026 )
3a30446a
MAL
1027 if 'CONFIG_LINUX_USER' in config_target
1028 dir = base_dir / abi
1029 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1030 if config_target.has_key('TARGET_SYSTBL_ABI')
1031 arch_srcs += \
1032 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1033 extra_args : config_target['TARGET_SYSTBL_ABI'])
1034 endif
1035 endif
2becc36a
PB
1036 endif
1037
c9322ab5
MAL
1038 if 'TARGET_XML_FILES' in config_target
1039 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1040 output: target + '-gdbstub-xml.c',
1041 input: files(config_target['TARGET_XML_FILES'].split()),
1042 command: [feature_to_c, '@INPUT@'],
1043 capture: true)
1044 arch_srcs += gdbstub_xml
1045 endif
1046
abff1abf
PB
1047 t = target_arch[arch].apply(config_target, strict: false)
1048 arch_srcs += t.sources()
64ed6f92 1049 arch_deps += t.dependencies()
abff1abf 1050
2becc36a
PB
1051 target_common = common_ss.apply(config_target, strict: false)
1052 objects = common_all.extract_objects(target_common.sources())
64ed6f92 1053 deps = target_common.dependencies()
2becc36a 1054
2becc36a
PB
1055 target_specific = specific_ss.apply(config_target, strict: false)
1056 arch_srcs += target_specific.sources()
64ed6f92 1057 arch_deps += target_specific.dependencies()
2becc36a 1058
64ed6f92 1059 lib = static_library('qemu-' + target,
859aef02 1060 sources: arch_srcs + genh,
b7612f45 1061 dependencies: arch_deps,
2becc36a
PB
1062 objects: objects,
1063 include_directories: target_inc,
64ed6f92
PB
1064 c_args: c_args,
1065 build_by_default: false,
2becc36a 1066 name_suffix: 'fa')
64ed6f92
PB
1067
1068 if target.endswith('-softmmu')
1069 execs = [{
1070 'name': 'qemu-system-' + target_name,
1071 'gui': false,
1072 'sources': files('softmmu/main.c'),
1073 'dependencies': []
1074 }]
35be72ba 1075 if targetos == 'windows' and (sdl.found() or gtk.found())
64ed6f92
PB
1076 execs += [{
1077 'name': 'qemu-system-' + target_name + 'w',
1078 'gui': true,
1079 'sources': files('softmmu/main.c'),
1080 'dependencies': []
1081 }]
1082 endif
1083 if config_host.has_key('CONFIG_FUZZ')
1084 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1085 execs += [{
1086 'name': 'qemu-fuzz-' + target_name,
1087 'gui': false,
1088 'sources': specific_fuzz.sources(),
1089 'dependencies': specific_fuzz.dependencies(),
64ed6f92
PB
1090 }]
1091 endif
1092 else
1093 execs = [{
1094 'name': 'qemu-' + target_name,
1095 'gui': false,
1096 'sources': [],
1097 'dependencies': []
1098 }]
1099 endif
1100 foreach exe: execs
1101 emulators += executable(exe['name'], exe['sources'],
1102 install: true,
1103 c_args: c_args,
1104 dependencies: arch_deps + deps + exe['dependencies'],
1105 objects: lib.extract_all_objects(recursive: true),
1106 link_language: link_language,
1107 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1108 link_args: link_args,
1109 gui_app: exe['gui'])
10e1d263
MAL
1110
1111 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1112 foreach stp: [
bd5f973a
SH
1113 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1114 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
10e1d263
MAL
1115 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1116 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1117 ]
bd5f973a 1118 custom_target(exe['name'] + stp['ext'],
10e1d263 1119 input: trace_events_all,
bd5f973a 1120 output: exe['name'] + stp['ext'],
10e1d263
MAL
1121 capture: true,
1122 install: stp['install'],
ab4c0996 1123 install_dir: qemu_datadir / '../systemtap/tapset',
10e1d263
MAL
1124 command: [
1125 tracetool, '--group=all', '--format=' + stp['fmt'],
1126 '--binary=' + stp['bin'],
1127 '--target-name=' + target_name,
1128 '--target-type=' + target_type,
1129 '--probe-prefix=qemu.' + target_type + '.' + target_name,
1130 '@INPUT@',
1131 ])
1132 endforeach
1133 endif
64ed6f92 1134 endforeach
2becc36a
PB
1135endforeach
1136
931049b4 1137# Other build targets
897b5afa 1138
f556b4a1
PB
1139if 'CONFIG_PLUGIN' in config_host
1140 install_headers('include/qemu/qemu-plugin.h')
1141endif
1142
f15bff25
PB
1143if 'CONFIG_GUEST_AGENT' in config_host
1144 subdir('qga')
1145endif
1146
9755c94a
LV
1147# Don't build qemu-keymap if xkbcommon is not explicitly enabled
1148# when we don't build tools or system
4113f4cf 1149if xkbcommon.found()
28742467
MAL
1150 # used for the update-keymaps target, so include rules even if !have_tools
1151 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1152 dependencies: [qemuutil, xkbcommon], install: have_tools)
1153endif
1154
8855e8f0 1155qemu_block_tools = []
931049b4 1156if have_tools
b7c70bf2
MAL
1157 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1158 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1159 qemu_io = executable('qemu-io', files('qemu-io.c'),
1160 dependencies: [block, qemuutil], install: true)
eb705985 1161 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
b7c70bf2 1162 dependencies: [block, qemuutil], install: true)
b7c70bf2 1163
7c58bb76 1164 subdir('storage-daemon')
a9c9727c 1165 subdir('contrib/rdmacm-mux')
1d7bb6ab 1166 subdir('contrib/elf2dmp')
a9c9727c 1167
157e7b13
MAL
1168 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1169 dependencies: qemuutil,
1170 install: true)
1171
931049b4
PB
1172 if 'CONFIG_VHOST_USER' in config_host
1173 subdir('contrib/libvhost-user')
2d7ac0af 1174 subdir('contrib/vhost-user-blk')
b7612f45 1175 subdir('contrib/vhost-user-gpu')
32fcc624 1176 subdir('contrib/vhost-user-input')
99650b62 1177 subdir('contrib/vhost-user-scsi')
931049b4 1178 endif
8f51e01c
MAL
1179
1180 if targetos == 'linux'
1181 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1182 dependencies: [qemuutil, libcap_ng],
1183 install: true,
1184 install_dir: get_option('libexecdir'))
897b5afa
MAL
1185
1186 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1187 dependencies: [authz, crypto, io, qom, qemuutil,
1188 libcap_ng, libudev, libmpathpersist],
1189 install: true)
8f51e01c
MAL
1190 endif
1191
5ee24e78
MAL
1192 if 'CONFIG_IVSHMEM' in config_host
1193 subdir('contrib/ivshmem-client')
1194 subdir('contrib/ivshmem-server')
1195 endif
931049b4
PB
1196endif
1197
f5aa6320 1198subdir('scripts')
3f99cf57 1199subdir('tools')
bdcbea7a 1200subdir('pc-bios')
ce1c1e7a 1201subdir('tests')
f8aa24ea 1202subdir('docs')
e8f3bd71
MAL
1203if 'CONFIG_GTK' in config_host
1204 subdir('po')
1205endif
3f99cf57 1206
acfdaac5
PB
1207if build_docs
1208 makeinfo = find_program('makeinfo', required: build_docs)
1209
1210 docs_inc = [
1211 '-I', meson.current_source_dir(),
1212 '-I', meson.current_build_dir() / 'docs',
1213 '-I', '@OUTDIR@',
1214 ]
1215
1216 version_texi = configure_file(output: 'version.texi',
1217 input: 'version.texi.in',
1218 configuration: {'VERSION': meson.project_version(),
1219 'qemu_confdir': config_host['qemu_confdir']})
1220
1221 texi = {
1222 'qemu-qmp-ref': ['docs/interop/qemu-qmp-ref.texi', qapi_doc_texi, version_texi],
1223 }
1224 if 'CONFIG_GUEST_AGENT' in config_host
1225 texi += {'qemu-ga-ref': ['docs/interop/qemu-ga-ref.texi', qga_qapi_doc_texi, version_texi]}
1226 endif
1227
1228 if makeinfo.found()
1229 cmd = [
1230 'env', 'LC_ALL=C', makeinfo, '--no-split', '--number-sections', docs_inc,
1231 '@INPUT0@', '-o', '@OUTPUT@',
1232 ]
1233 foreach ext, args: {
1234 'info': [],
1235 'html': ['--no-headers', '--html'],
1236 'txt': ['--no-headers', '--plaintext'],
1237 }
1238 t = []
1239 foreach doc, input: texi
1240 output = doc + '.' + ext
1241 t += custom_target(output,
1242 input: input,
1243 output: output,
1244 install: true,
491e74c1 1245 install_dir: qemu_docdir / 'interop',
acfdaac5
PB
1246 command: cmd + args)
1247 endforeach
1248 alias_target(ext, t)
1249 endforeach
1250 endif
1251
1252 texi2pdf = find_program('texi2pdf', required: false)
1253
1254 if texi2pdf.found()
1255 pdfs = []
1256 foreach doc, input: texi
1257 output = doc + '.pdf'
1258 pdfs += custom_target(output,
1259 input: input,
1260 output: output,
1261 command: [texi2pdf, '-q', docs_inc, '@INPUT0@', '-o', '@OUTPUT@'],
1262 build_by_default: false)
1263 endforeach
1264 alias_target('pdf', pdfs)
1265 endif
1266
1267 texi2pod = find_program('scripts/texi2pod.pl')
1268 pod2man = find_program('pod2man', required: build_docs)
1269
1270 if pod2man.found()
1271 foreach doc, input: texi
1272 man = doc + '.7'
1273 pod = custom_target(man + '.pod',
1274 input: input,
1275 output: man + '.pod',
1276 command: [texi2pod,
1277 '-DVERSION="' + meson.project_version() + '"',
1278 '-DCONFDIR="' + config_host['qemu_confdir'] + '"',
1279 '@INPUT0@', '@OUTPUT@'])
1280 man = custom_target(man,
1281 input: pod,
1282 output: man,
1283 capture: true,
1284 install: true,
b81efab7 1285 install_dir: get_option('mandir') / 'man7',
acfdaac5
PB
1286 command: [pod2man, '--utf8', '--section=7', '--center=" "',
1287 '--release=" "', '@INPUT@'])
1288 endforeach
1289 endif
1290endif
1291
8adfeba9
MAL
1292if host_machine.system() == 'windows'
1293 nsis_cmd = [
1294 find_program('scripts/nsis.py'),
1295 '@OUTPUT@',
1296 get_option('prefix'),
1297 meson.current_source_dir(),
1298 host_machine.cpu_family(),
1299 '--',
1300 '-DDISPLAYVERSION=' + meson.project_version(),
1301 ]
1302 if build_docs
1303 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
1304 endif
1305 if 'CONFIG_GTK' in config_host
1306 nsis_cmd += '-DCONFIG_GTK=y'
1307 endif
1308
1309 nsis = custom_target('nsis',
1310 output: 'qemu-setup-' + meson.project_version() + '.exe',
1311 input: files('qemu.nsi'),
1312 build_always_stale: true,
1313 command: nsis_cmd + ['@INPUT@'])
1314 alias_target('installer', nsis)
1315endif
1316
f9332757
PB
1317summary_info = {}
1318summary_info += {'Install prefix': config_host['prefix']}
1319summary_info += {'BIOS directory': config_host['qemu_datadir']}
1320summary_info += {'firmware path': config_host['qemu_firmwarepath']}
1321summary_info += {'binary directory': config_host['bindir']}
1322summary_info += {'library directory': config_host['libdir']}
1323summary_info += {'module directory': config_host['qemu_moddir']}
1324summary_info += {'libexec directory': config_host['libexecdir']}
1325summary_info += {'include directory': config_host['includedir']}
1326summary_info += {'config directory': config_host['sysconfdir']}
1327if targetos != 'windows'
1328 summary_info += {'local state directory': config_host['qemu_localstatedir']}
b81efab7 1329 summary_info += {'Manual directory': get_option('mandir')}
f9332757
PB
1330else
1331 summary_info += {'local state directory': 'queried at runtime'}
1332endif
491e74c1 1333summary_info += {'Doc directory': get_option('docdir')}
f9332757
PB
1334summary_info += {'Build directory': meson.current_build_dir()}
1335summary_info += {'Source path': meson.current_source_dir()}
1336summary_info += {'GIT binary': config_host['GIT']}
1337summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
1338summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
1339summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
1340if link_language == 'cpp'
1341 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
1342else
1343 summary_info += {'C++ compiler': false}
1344endif
1345if targetos == 'darwin'
1346 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1347endif
1348summary_info += {'ARFLAGS': config_host['ARFLAGS']}
1349summary_info += {'CFLAGS': config_host['CFLAGS']}
1350summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
1351summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
1352summary_info += {'make': config_host['MAKE']}
f9332757
PB
1353summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1354summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
1355summary_info += {'genisoimage': config_host['GENISOIMAGE']}
1356# TODO: add back version
1357summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
1358if config_host.has_key('CONFIG_SLIRP')
1359 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
1360endif
1361summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
1362if config_host.has_key('CONFIG_MODULES')
1363 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1364endif
1365summary_info += {'host CPU': cpu}
1366summary_info += {'host endianness': build_machine.endian()}
1367summary_info += {'target list': config_host['TARGET_DIRS']}
1368summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
1369summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
1370summary_info += {'strip binaries': get_option('strip')}
1371summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
3e8529dd 1372summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
f9332757
PB
1373if targetos == 'darwin'
1374 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1375endif
1376# TODO: add back version
35be72ba
PB
1377summary_info += {'SDL support': sdl.found()}
1378summary_info += {'SDL image support': sdl_image.found()}
f9332757
PB
1379# TODO: add back version
1380summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
1381summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
b7612f45 1382summary_info += {'pixman': pixman.found()}
f9332757
PB
1383# TODO: add back version
1384summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
1385summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
1386summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
1387# TODO: add back version
1388summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
1389if config_host.has_key('CONFIG_GCRYPT')
1390 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
1391 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1392endif
1393# TODO: add back version
1394summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
1395if config_host.has_key('CONFIG_NETTLE')
1396 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1397endif
1398summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1399summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1400summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1401summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1402# TODO: add back version
1403summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1404summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1405summary_info += {'mingw32 support': targetos == 'windows'}
1406summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1407summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1408summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1409summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
1410summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
a0b93237
PB
1411summary_info += {'VNC support': vnc.found()}
1412if vnc.found()
1413 summary_info += {'VNC SASL support': sasl.found()}
1414 summary_info += {'VNC JPEG support': jpeg.found()}
1415 summary_info += {'VNC PNG support': png.found()}
f9332757
PB
1416endif
1417summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1418if config_host.has_key('CONFIG_XEN_BACKEND')
1419 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1420endif
1421summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1422summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1423summary_info += {'PIE': get_option('b_pie')}
1424summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1425summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1426summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1427summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1428summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1429summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1430# TODO: add back KVM/HAX/HVF/WHPX/TCG
1431#summary_info += {'KVM support': have_kvm'}
1432#summary_info += {'HAX support': have_hax'}
1433#summary_info += {'HVF support': have_hvf'}
1434#summary_info += {'WHPX support': have_whpx'}
1435#summary_info += {'TCG support': have_tcg'}
1436#if get_option('tcg')
1437# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1438# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1439#endif
1440summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1441summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1442summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1443summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
1444summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1445summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1446summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1447summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1448summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1449summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1450summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1451summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1452summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1453summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1454summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1455summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1456summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1457summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1458summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1459if config_host['TRACE_BACKENDS'].split().contains('simple')
1460 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1461endif
1462# TODO: add back protocol and server version
1463summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1464summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1465summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1466summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
0a40bcb7 1467summary_info += {'U2F support': u2f.found()}
f9332757
PB
1468summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1469summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1470summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1471summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1472summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1473summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1474summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1475if targetos == 'windows'
1476 if 'WIN_SDK' in config_host
1477 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1478 endif
1479 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1480 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1481 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1482endif
1483summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1484summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1485summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1486summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1487summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1488summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1489summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
bf0e56a3 1490summary_info += {'gcov': get_option('b_coverage')}
f9332757
PB
1491summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1492summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1493summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1494summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1495summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1496summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1497summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1498summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1499summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1500summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1501summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1502summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1503summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1504summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1505summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1506summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1507summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1508summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1509summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1510summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1511summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1512summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1513summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1514summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1515summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1516summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1517summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1518summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1519summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1520summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1521summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1522summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1523if config_host.has_key('HAVE_GDB_BIN')
1524 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1525endif
1526summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1527summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1528summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1529summary(summary_info, bool_yn: true)
1530
1531if not supported_cpus.contains(cpu)
1532 message()
1533 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1534 message()
1535 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1536 message('The QEMU project intends to remove support for this host CPU in')
1537 message('a future release if nobody volunteers to maintain it and to')
1538 message('provide a build host for our continuous integration setup.')
1539 message('configure has succeeded and you can continue to build, but')
1540 message('if you care about QEMU on this platform you should contact')
1541 message('us upstream at [email protected].')
1542endif
1543
1544if not supported_oses.contains(targetos)
1545 message()
1546 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1547 message()
1548 message('Host OS ' + targetos + 'support is not currently maintained.')
1549 message('The QEMU project intends to remove support for this host OS in')
1550 message('a future release if nobody volunteers to maintain it and to')
1551 message('provide a build host for our continuous integration setup.')
1552 message('configure has succeeded and you can continue to build, but')
1553 message('if you care about QEMU on this platform you should contact')
1554 message('us upstream at [email protected].')
1555endif
This page took 0.290103 seconds and 4 git commands to generate.