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