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