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