blob: 5aaa3647305d3e100ba86de4c0b190b24f4be95a [file] [log] [blame]
Paolo Bonzinia5665052019-06-10 12:05:14 +02001project('qemu', ['c'], meson_version: '>=0.55.0',
Gerd Hoffmann90756b22020-08-25 08:43:42 +02002 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11',
3 'b_lundef=false','b_colorout=auto'],
Paolo Bonzinia5665052019-06-10 12:05:14 +02004 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5
6not_found = dependency('', required: false)
Paolo Bonzinib29b40f2020-08-10 18:04:43 +02007if meson.version().version_compare('>=0.56.0')
8 keyval = import('keyval')
9else
10 keyval = import('unstable-keyval')
11endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040012ss = import('sourceset')
13
Paolo Bonzinice1c1e72020-01-28 16:41:44 +010014sh = find_program('sh')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040015cc = meson.get_compiler('c')
Paolo Bonzinia5665052019-06-10 12:05:14 +020016config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Paolo Bonzini2becc362020-02-03 11:42:03 +010017config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
Marc-André Lureau3154fee2019-08-29 22:07:01 +040018enable_modules = 'CONFIG_MODULES' in config_host
Paolo Bonzini35be72b2020-02-06 14:17:15 +010019enable_static = 'CONFIG_STATIC' in config_host
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +020020build_docs = 'BUILD_DOCS' in config_host
Marc-André Lureauab4c0992020-08-26 15:04:16 +040021qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040022qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini859aef02020-08-04 18:14:26 +020023config_host_data = configuration_data()
24genh = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020025
Paolo Bonzini760e4322020-08-26 08:09:48 +020026target_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
Paolo Bonzinia5665052019-06-10 12:05:14 +020036add_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
Marc-André Lureaufc929892019-07-13 01:47:54 +040045python = 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
Paolo Bonzinia5665052019-06-10 12:05:14 +020051if host_machine.system() == 'darwin'
52 add_languages('objc', required: false, native: false)
53endif
54
Paolo Bonzini968b4db2020-02-03 14:45:33 +010055if '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
Paolo Bonzinia5665052019-06-10 12:05:14 +020062configure_file(input: files('scripts/ninjatool.py'),
63 output: 'ninjatool',
64 configuration: config_host)
Paolo Bonzinif9332752020-02-03 13:28:38 +010065
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
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040073m = cc.find_library('m', required: false)
74util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +020075winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040076socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +040077version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +040078coref = []
79iokit = []
80cocoa = []
81hvf = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040082if targetos == 'windows'
83 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +020084 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +040085
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('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +040090elif 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')
Paolo Bonzinicfad62f2020-08-09 23:47:45 +020095elif 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')]
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400103endif
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
119nettle = not_found
120if 'CONFIG_NETTLE' in config_host
121 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
122 link_args: config_host['NETTLE_LIBS'].split())
123endif
124gnutls = not_found
125if 'CONFIG_GNUTLS' in config_host
126 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
127 link_args: config_host['GNUTLS_LIBS'].split())
128endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200129pixman = not_found
130if have_system or have_tools
131 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzini1a949332020-08-31 06:27:00 -0400132 method: 'pkg-config', static: enable_static)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200133endif
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400134pam = not_found
135if 'CONFIG_AUTH_PAM' in config_host
136 pam = cc.find_library('pam')
137endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400138libaio = cc.find_library('aio', required: false)
Paolo Bonzini1ffb3bb2020-08-28 19:33:54 +0200139zlib = dependency('zlib', required: true, static: enable_static)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400140linux_io_uring = not_found
141if 'CONFIG_LINUX_IO_URING' in config_host
142 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
143 link_args: config_host['LINUX_IO_URING_LIBS'].split())
144endif
145libxml2 = not_found
146if 'CONFIG_LIBXML2' in config_host
147 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
148 link_args: config_host['LIBXML2_LIBS'].split())
149endif
150libnfs = not_found
151if 'CONFIG_LIBNFS' in config_host
152 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
153endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400154libattr = not_found
155if 'CONFIG_ATTR' in config_host
156 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
157endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100158seccomp = not_found
159if 'CONFIG_SECCOMP' in config_host
160 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
161 link_args: config_host['SECCOMP_LIBS'].split())
162endif
163libcap_ng = not_found
164if 'CONFIG_LIBCAP_NG' in config_host
165 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
166endif
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400167if get_option('xkbcommon').auto() and not have_system and not have_tools
168 xkbcommon = not_found
169else
170 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400171 method: 'pkg-config', static: enable_static)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400172endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400173slirp = not_found
174if config_host.has_key('CONFIG_SLIRP')
175 slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
176 link_args: config_host['SLIRP_LIBS'].split())
177endif
178vde = not_found
179if config_host.has_key('CONFIG_VDE')
180 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
181endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200182pulse = not_found
183if 'CONFIG_LIBPULSE' in config_host
184 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
185 link_args: config_host['PULSE_LIBS'].split())
186endif
187alsa = not_found
188if 'CONFIG_ALSA' in config_host
189 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
190 link_args: config_host['ALSA_LIBS'].split())
191endif
192jack = not_found
193if 'CONFIG_LIBJACK' in config_host
194 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
195endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200196spice = not_found
197if 'CONFIG_SPICE' in config_host
198 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
199 link_args: config_host['SPICE_LIBS'].split())
200endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400201rt = cc.find_library('rt', required: false)
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400202libmpathpersist = not_found
203if config_host.has_key('CONFIG_MPATH')
204 libmpathpersist = cc.find_library('mpathpersist')
205endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200206libiscsi = not_found
207if 'CONFIG_LIBISCSI' in config_host
208 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
209 link_args: config_host['LIBISCSI_LIBS'].split())
210endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400211zstd = not_found
212if 'CONFIG_ZSTD' in config_host
213 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
214 link_args: config_host['ZSTD_LIBS'].split())
215endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400216gbm = not_found
217if 'CONFIG_GBM' in config_host
218 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
219 link_args: config_host['GBM_LIBS'].split())
220endif
221virgl = not_found
222if 'CONFIG_VIRGL' in config_host
223 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
224 link_args: config_host['VIRGL_LIBS'].split())
225endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400226curl = not_found
227if 'CONFIG_CURL' in config_host
228 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
229 link_args: config_host['CURL_LIBS'].split())
230endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200231libudev = not_found
232if 'CONFIG_LIBUDEV' in config_host
233 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
234endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200235brlapi = not_found
236if 'CONFIG_BRLAPI' in config_host
237 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
238endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100239
Paolo Bonzini760e4322020-08-26 08:09:48 +0200240sdl = not_found
241if have_system
Yonggang Luo363743d2020-08-26 23:10:03 +0800242 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200243 sdl_image = not_found
244endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100245if sdl.found()
246 # work around 2.0.8 bug
247 sdl = declare_dependency(compile_args: '-Wno-undef',
248 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200249 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400250 method: 'pkg-config', static: enable_static)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100251else
252 if get_option('sdl_image').enabled()
253 error('sdl-image required, but SDL was @0@',
254 get_option('sdl').disabled() ? 'disabled' : 'not found')
255 endif
256 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200257endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100258
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400259rbd = not_found
260if 'CONFIG_RBD' in config_host
261 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
262endif
263glusterfs = not_found
264if 'CONFIG_GLUSTERFS' in config_host
265 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
266 link_args: config_host['GLUSTERFS_LIBS'].split())
267endif
268libssh = not_found
269if 'CONFIG_LIBSSH' in config_host
270 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
271 link_args: config_host['LIBSSH_LIBS'].split())
272endif
273libbzip2 = not_found
274if 'CONFIG_BZIP2' in config_host
275 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
276endif
277liblzfse = not_found
278if 'CONFIG_LZFSE' in config_host
279 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
280endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200281oss = not_found
282if 'CONFIG_AUDIO_OSS' in config_host
283 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
284endif
285dsound = not_found
286if 'CONFIG_AUDIO_DSOUND' in config_host
287 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
288endif
289coreaudio = not_found
290if 'CONFIG_AUDIO_COREAUDIO' in config_host
291 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
292endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400293opengl = not_found
294if 'CONFIG_OPENGL' in config_host
295 opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
296else
297endif
298gtk = not_found
299if 'CONFIG_GTK' in config_host
300 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
301 link_args: config_host['GTK_LIBS'].split())
302endif
303vte = not_found
304if 'CONFIG_VTE' in config_host
305 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
306 link_args: config_host['VTE_LIBS'].split())
307endif
308x11 = not_found
309if 'CONFIG_X11' in config_host
310 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
311 link_args: config_host['X11_LIBS'].split())
312endif
313curses = not_found
314if 'CONFIG_CURSES' in config_host
315 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
316 link_args: config_host['CURSES_LIBS'].split())
317endif
318iconv = not_found
319if 'CONFIG_ICONV' in config_host
320 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
321 link_args: config_host['ICONV_LIBS'].split())
322endif
323gio = not_found
324if 'CONFIG_GIO' in config_host
325 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
326 link_args: config_host['GIO_LIBS'].split())
327endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100328vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400329png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400330jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400331sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100332if get_option('vnc').enabled()
333 vnc = declare_dependency() # dummy dependency
334 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400335 method: 'pkg-config', static: enable_static)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100336 jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
337 required: get_option('vnc_jpeg'),
338 static: enable_static)
339 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
340 required: get_option('vnc_sasl'),
341 static: enable_static)
342 if sasl.found()
343 sasl = declare_dependency(dependencies: sasl,
344 compile_args: '-DSTRUCT_IOVEC_DEFINED')
345 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400346endif
Paolo Bonzini4a963372020-08-03 16:22:28 +0200347fdt = not_found
348if 'CONFIG_FDT' in config_host
349 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
350 link_args: config_host['FDT_LIBS'].split())
351endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400352snappy = not_found
353if 'CONFIG_SNAPPY' in config_host
354 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
355endif
356lzo = not_found
357if 'CONFIG_LZO' in config_host
358 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
359endif
Marc-André Lureau55166232019-07-24 19:16:22 +0400360rdma = not_found
361if 'CONFIG_RDMA' in config_host
362 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
363endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400364numa = not_found
365if 'CONFIG_NUMA' in config_host
366 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
367endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400368xen = not_found
369if 'CONFIG_XEN_BACKEND' in config_host
370 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
371 link_args: config_host['XEN_LIBS'].split())
372endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200373cacard = not_found
374if 'CONFIG_SMARTCARD' in config_host
375 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
376 link_args: config_host['SMARTCARD_LIBS'].split())
377endif
César Belley0a40bcb2020-08-26 13:42:04 +0200378u2f = not_found
379if have_system
380 u2f = dependency('u2f-emu', required: get_option('u2f'),
381 method: 'pkg-config',
382 static: enable_static)
383endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200384usbredir = not_found
385if 'CONFIG_USB_REDIR' in config_host
386 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
387 link_args: config_host['USB_REDIR_LIBS'].split())
388endif
389libusb = not_found
390if 'CONFIG_USB_LIBUSB' in config_host
391 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
392 link_args: config_host['LIBUSB_LIBS'].split())
393endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400394capstone = not_found
395if 'CONFIG_CAPSTONE' in config_host
396 capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(),
397 link_args: config_host['CAPSTONE_LIBS'].split())
398endif
399libpmem = not_found
400if 'CONFIG_LIBPMEM' in config_host
401 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
402 link_args: config_host['LIBPMEM_LIBS'].split())
403endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600404libdaxctl = not_found
405if 'CONFIG_LIBDAXCTL' in config_host
406 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
407endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400408
Paolo Bonzini859aef02020-08-04 18:14:26 +0200409# Create config-host.h
410
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100411config_host_data.set('CONFIG_SDL', sdl.found())
412config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100413config_host_data.set('CONFIG_VNC', vnc.found())
414config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
415config_host_data.set('CONFIG_VNC_PNG', png.found())
416config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +0200417config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Paolo Bonzini859aef02020-08-04 18:14:26 +0200418config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
419config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
420config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
421config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
422
423arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
424strings = ['HOST_DSOSUF', 'CONFIG_IASL', 'qemu_confdir', 'qemu_datadir',
425 'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
426 'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath']
427foreach k, v: config_host
428 if arrays.contains(k)
429 if v != ''
430 v = '"' + '", "'.join(v.split()) + '", '
431 endif
432 config_host_data.set(k, v)
433 elif k == 'ARCH'
434 config_host_data.set('HOST_' + v.to_upper(), 1)
435 elif strings.contains(k)
436 if not k.startswith('CONFIG_')
437 k = 'CONFIG_' + k.to_upper()
438 endif
439 config_host_data.set_quoted(k, v)
440 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
441 config_host_data.set(k, v == 'y' ? 1 : v)
442 endif
443endforeach
444genh += configure_file(output: 'config-host.h', configuration: config_host_data)
445
Paolo Bonzini2becc362020-02-03 11:42:03 +0100446minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini2becc362020-02-03 11:42:03 +0100447config_devices_mak_list = []
448config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +0200449config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100450config_target_mak = {}
451kconfig_external_symbols = [
452 'CONFIG_KVM',
453 'CONFIG_XEN',
454 'CONFIG_TPM',
455 'CONFIG_SPICE',
456 'CONFIG_IVSHMEM',
457 'CONFIG_OPENGL',
458 'CONFIG_X11',
459 'CONFIG_VHOST_USER',
460 'CONFIG_VHOST_KERNEL',
461 'CONFIG_VIRTFS',
462 'CONFIG_LINUX',
463 'CONFIG_PVRDMA',
464]
Paolo Bonzini859aef02020-08-04 18:14:26 +0200465ignored = ['TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_DIRS']
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400466foreach target : target_dirs
Paolo Bonzini859aef02020-08-04 18:14:26 +0200467 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak')
468
469 config_target_data = configuration_data()
470 foreach k, v: config_target
471 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
472 # do nothing
473 elif ignored.contains(k)
474 # do nothing
475 elif k == 'TARGET_BASE_ARCH'
476 config_target_data.set('TARGET_' + v.to_upper(), 1)
477 elif k == 'TARGET_NAME'
478 config_target_data.set_quoted(k, v)
479 elif v == 'y'
480 config_target_data.set(k, 1)
481 else
482 config_target_data.set(k, v)
483 endif
484 endforeach
485 config_target_h += {target: configure_file(output: target + '-config-target.h',
486 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100487
488 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +0100489 base_kconfig = []
490 foreach sym : kconfig_external_symbols
Paolo Bonzini859aef02020-08-04 18:14:26 +0200491 if sym in config_target or sym in config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +0100492 base_kconfig += '@0@=y'.format(sym)
493 endif
494 endforeach
495
496 config_devices_mak = target + '-config-devices.mak'
497 config_devices_mak = configure_file(
498 input: ['default-configs' / target + '.mak', 'Kconfig'],
499 output: config_devices_mak,
500 depfile: config_devices_mak + '.d',
501 capture: true,
502 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
503 config_devices_mak, '@DEPFILE@', '@INPUT@',
504 base_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +0200505
506 config_devices_data = configuration_data()
507 config_devices = keyval.load(config_devices_mak)
508 foreach k, v: config_devices
509 config_devices_data.set(k, 1)
510 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +0100511 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +0200512 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
513 configuration: config_devices_data)}
514 config_target += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +0100515 endif
516 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400517endforeach
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400518
Paolo Bonzini2becc362020-02-03 11:42:03 +0100519grepy = find_program('scripts/grepy.sh')
520# This configuration is used to build files that are shared by
521# multiple binaries, and then extracted out of the "common"
522# static_library target.
523#
524# We do not use all_sources()/all_dependencies(), because it would
525# build literally all source files, including devices only used by
526# targets that are not built for this compilation. The CONFIG_ALL
527# pseudo symbol replaces it.
528
529if have_system
530 config_all_devices_mak = configure_file(
531 output: 'config-all-devices.mak',
532 input: config_devices_mak_list,
533 capture: true,
534 command: [grepy, '@INPUT@'],
535 )
536 config_all_devices = keyval.load(config_all_devices_mak)
537else
538 config_all_devices = {}
539endif
540config_all = config_all_devices
541config_all += config_host
542config_all += config_all_disas
543config_all += {
544 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
545 'CONFIG_SOFTMMU': have_system,
546 'CONFIG_USER_ONLY': have_user,
547 'CONFIG_ALL': true,
548}
549
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400550# Generators
551
Marc-André Lureau3f885652019-07-15 18:06:04 +0400552hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +0400553shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400554qapi_gen = find_program('scripts/qapi-gen.py')
555qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
556 meson.source_root() / 'scripts/qapi/commands.py',
557 meson.source_root() / 'scripts/qapi/common.py',
558 meson.source_root() / 'scripts/qapi/doc.py',
559 meson.source_root() / 'scripts/qapi/error.py',
560 meson.source_root() / 'scripts/qapi/events.py',
561 meson.source_root() / 'scripts/qapi/expr.py',
562 meson.source_root() / 'scripts/qapi/gen.py',
563 meson.source_root() / 'scripts/qapi/introspect.py',
564 meson.source_root() / 'scripts/qapi/parser.py',
565 meson.source_root() / 'scripts/qapi/schema.py',
566 meson.source_root() / 'scripts/qapi/source.py',
567 meson.source_root() / 'scripts/qapi/types.py',
568 meson.source_root() / 'scripts/qapi/visit.py',
569 meson.source_root() / 'scripts/qapi/common.py',
570 meson.source_root() / 'scripts/qapi/doc.py',
571 meson.source_root() / 'scripts/qapi-gen.py'
572]
573
574tracetool = [
575 python, files('scripts/tracetool.py'),
576 '--backend=' + config_host['TRACE_BACKENDS']
577]
578
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400579qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
580 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +0200581 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400582qemu_version = custom_target('qemu-version.h',
583 output: 'qemu-version.h',
584 command: qemu_version_cmd,
585 capture: true,
586 build_by_default: true,
587 build_always_stale: true)
588genh += qemu_version
589
Marc-André Lureau3f885652019-07-15 18:06:04 +0400590hxdep = []
591hx_headers = [
592 ['qemu-options.hx', 'qemu-options.def'],
593 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
594]
595if have_system
596 hx_headers += [
597 ['hmp-commands.hx', 'hmp-commands.h'],
598 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
599 ]
600endif
601foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400602 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +0400603 input: files(d[0]),
604 output: d[1],
605 capture: true,
606 build_by_default: true, # to be removed when added to a target
607 command: [hxtool, '-h', '@INPUT0@'])
608endforeach
609genh += hxdep
610
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400611# Collect sourcesets.
612
613util_ss = ss.source_set()
614stub_ss = ss.source_set()
615trace_ss = ss.source_set()
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400616block_ss = ss.source_set()
Paolo Bonzini4a963372020-08-03 16:22:28 +0200617blockdev_ss = ss.source_set()
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200618qmp_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +0100619common_ss = ss.source_set()
620softmmu_ss = ss.source_set()
621user_ss = ss.source_set()
622bsd_user_ss = ss.source_set()
623linux_user_ss = ss.source_set()
624specific_ss = ss.source_set()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200625specific_fuzz_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +0100626
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400627modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100628hw_arch = {}
629target_arch = {}
630target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400631
632###############
633# Trace files #
634###############
635
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400636# TODO: add each directory to the subdirs from its own meson.build, once
637# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400638trace_events_subdirs = [
639 'accel/kvm',
640 'accel/tcg',
641 'crypto',
642 'monitor',
643]
644if have_user
645 trace_events_subdirs += [ 'linux-user' ]
646endif
647if have_block
648 trace_events_subdirs += [
649 'authz',
650 'block',
651 'io',
652 'nbd',
653 'scsi',
654 ]
655endif
656if have_system
657 trace_events_subdirs += [
658 'audio',
659 'backends',
660 'backends/tpm',
661 'chardev',
662 'hw/9pfs',
663 'hw/acpi',
664 'hw/alpha',
665 'hw/arm',
666 'hw/audio',
667 'hw/block',
668 'hw/block/dataplane',
669 'hw/char',
670 'hw/display',
671 'hw/dma',
672 'hw/hppa',
673 'hw/hyperv',
674 'hw/i2c',
675 'hw/i386',
676 'hw/i386/xen',
677 'hw/ide',
678 'hw/input',
679 'hw/intc',
680 'hw/isa',
681 'hw/mem',
682 'hw/mips',
683 'hw/misc',
684 'hw/misc/macio',
685 'hw/net',
686 'hw/nvram',
687 'hw/pci',
688 'hw/pci-host',
689 'hw/ppc',
690 'hw/rdma',
691 'hw/rdma/vmw',
692 'hw/rtc',
693 'hw/s390x',
694 'hw/scsi',
695 'hw/sd',
696 'hw/sparc',
697 'hw/sparc64',
698 'hw/ssi',
699 'hw/timer',
700 'hw/tpm',
701 'hw/usb',
702 'hw/vfio',
703 'hw/virtio',
704 'hw/watchdog',
705 'hw/xen',
706 'hw/gpio',
707 'hw/riscv',
708 'migration',
709 'net',
710 'ui',
711 ]
712endif
713trace_events_subdirs += [
714 'hw/core',
715 'qapi',
716 'qom',
717 'target/arm',
718 'target/hppa',
719 'target/i386',
720 'target/mips',
721 'target/ppc',
722 'target/riscv',
723 'target/s390x',
724 'target/sparc',
725 'util',
726]
727
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400728subdir('qapi')
729subdir('qobject')
730subdir('stubs')
731subdir('trace')
732subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +0400733subdir('qom')
734subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400735subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +0400736subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400737
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400738
739if enable_modules
740 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
741 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
742endif
743
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400744# Build targets from sourcesets
745
Paolo Bonzini2becc362020-02-03 11:42:03 +0100746stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400747
748util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +0100749util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400750libqemuutil = static_library('qemuutil',
751 sources: util_ss.sources() + stub_ss.sources() + genh,
752 dependencies: [util_ss.dependencies(), m, glib, socket])
753qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400754 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400755
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200756decodetree = generator(find_program('scripts/decodetree.py'),
757 output: 'decode-@BASENAME@.c.inc',
758 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
759
Paolo Bonzini478e9432020-08-17 12:47:55 +0200760subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +0400761subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +0400762subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400763subdir('fsdev')
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200764subdir('libdecnumber')
Marc-André Lureaud3b18482019-08-17 14:55:32 +0400765subdir('target')
Marc-André Lureau708eab42019-09-03 16:59:33 +0400766subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400767
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400768block_ss.add(files(
769 'block.c',
770 'blockjob.c',
771 'job.c',
772 'qemu-io-cmds.c',
773))
774block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
775
776subdir('nbd')
777subdir('scsi')
778subdir('block')
779
Paolo Bonzini4a963372020-08-03 16:22:28 +0200780blockdev_ss.add(files(
781 'blockdev.c',
782 'blockdev-nbd.c',
783 'iothread.c',
784 'job-qmp.c',
785))
786
787# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
788# os-win32.c does not
789blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
790softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
791
792softmmu_ss.add_all(blockdev_ss)
793softmmu_ss.add(files(
794 'bootdevice.c',
795 'dma-helpers.c',
796 'qdev-monitor.c',
797), sdl)
798
799softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
800softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
801softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
802
803common_ss.add(files('cpus-common.c'))
804
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +0200805subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400806
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600807specific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem, libdaxctl)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400808specific_ss.add(files('exec-vary.c'))
809specific_ss.add(when: 'CONFIG_TCG', if_true: files(
810 'fpu/softfloat.c',
811 'tcg/optimize.c',
812 'tcg/tcg-common.c',
813 'tcg/tcg-op-gvec.c',
814 'tcg/tcg-op-vec.c',
815 'tcg/tcg-op.c',
816 'tcg/tcg.c',
817))
818specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
819
Marc-André Lureauab318052019-07-24 19:23:16 +0400820subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +0400821subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +0400822subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200823subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400824subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +0400825subdir('replay')
Marc-André Lureau582ea952019-08-15 15:15:32 +0400826subdir('hw')
Marc-André Lureau1a828782019-08-18 16:13:08 +0400827subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +0100828subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +0400829subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +0400830subdir('linux-user')
831
Marc-André Lureaub309c322019-08-18 19:20:37 +0400832bsd_user_ss.add(files('gdbstub.c'))
833specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
834
Marc-André Lureau3a304462019-08-18 16:13:08 +0400835linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
836specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +0200837
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +0200838# needed for fuzzing binaries
839subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200840subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +0200841
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400842block_mods = []
843softmmu_mods = []
844foreach d, list : modules
845 foreach m, module_ss : list
846 if enable_modules and targetos != 'windows'
847 module_ss = module_ss.apply(config_host, strict: false)
848 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
849 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
850 if d == 'block'
851 block_mods += sl
852 else
853 softmmu_mods += sl
854 endif
855 else
856 if d == 'block'
857 block_ss.add_all(module_ss)
858 else
859 softmmu_ss.add_all(module_ss)
860 endif
861 endif
862 endforeach
863endforeach
864
865nm = find_program('nm')
866undefsym = find_program('scripts/undefsym.sh')
867block_syms = custom_target('block.syms', output: 'block.syms',
868 input: [libqemuutil, block_mods],
869 capture: true,
870 command: [undefsym, nm, '@INPUT@'])
871qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
872 input: [libqemuutil, softmmu_mods],
873 capture: true,
874 command: [undefsym, nm, '@INPUT@'])
875
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400876block_ss = block_ss.apply(config_host, strict: false)
877libblock = static_library('block', block_ss.sources() + genh,
878 dependencies: block_ss.dependencies(),
879 link_depends: block_syms,
880 name_suffix: 'fa',
881 build_by_default: false)
882
883block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400884 link_args: '@block.syms',
885 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400886
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200887qmp_ss = qmp_ss.apply(config_host, strict: false)
888libqmp = static_library('qmp', qmp_ss.sources() + genh,
889 dependencies: qmp_ss.dependencies(),
890 name_suffix: 'fa',
891 build_by_default: false)
892
893qmp = declare_dependency(link_whole: [libqmp])
894
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400895foreach m : block_mods + softmmu_mods
896 shared_module(m.name(),
897 name_prefix: '',
898 link_whole: m,
899 install: true,
900 install_dir: config_host['qemu_moddir'])
901endforeach
902
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200903softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
904common_ss.add(qom, qemuutil)
905
906common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +0100907common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
908
909common_all = common_ss.apply(config_all, strict: false)
910common_all = static_library('common',
911 build_by_default: false,
912 sources: common_all.sources() + genh,
913 dependencies: common_all.dependencies(),
914 name_suffix: 'fa')
915
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400916feature_to_c = find_program('scripts/feature_to_c.sh')
917
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200918emulators = []
Paolo Bonzini2becc362020-02-03 11:42:03 +0100919foreach target : target_dirs
920 config_target = config_target_mak[target]
921 target_name = config_target['TARGET_NAME']
922 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +0200923 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200924 arch_deps = []
925 c_args = ['-DNEED_CPU_H',
926 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
927 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
928 link_args = []
Paolo Bonzini2becc362020-02-03 11:42:03 +0100929
Paolo Bonzini859aef02020-08-04 18:14:26 +0200930 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +0100931 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
932 if targetos == 'linux'
933 target_inc += include_directories('linux-headers', is_system: true)
934 endif
935 if target.endswith('-softmmu')
936 qemu_target_name = 'qemu-system-' + target_name
937 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200938 t = target_softmmu_arch[arch].apply(config_target, strict: false)
939 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200940 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200941
Marc-André Lureau2c442202019-08-17 13:55:58 +0400942 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
943 hw = hw_arch[hw_dir].apply(config_target, strict: false)
944 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200945 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +0400946
Paolo Bonzini2becc362020-02-03 11:42:03 +0100947 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200948 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +0100949 else
Marc-André Lureau3a304462019-08-18 16:13:08 +0400950 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +0100951 target_type='user'
952 qemu_target_name = 'qemu-' + target_name
953 if 'CONFIG_LINUX_USER' in config_target
954 base_dir = 'linux-user'
955 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
956 else
957 base_dir = 'bsd-user'
958 endif
959 target_inc += include_directories(
960 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +0400961 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +0100962 )
Marc-André Lureau3a304462019-08-18 16:13:08 +0400963 if 'CONFIG_LINUX_USER' in config_target
964 dir = base_dir / abi
965 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
966 if config_target.has_key('TARGET_SYSTBL_ABI')
967 arch_srcs += \
968 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
969 extra_args : config_target['TARGET_SYSTBL_ABI'])
970 endif
971 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +0100972 endif
973
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400974 if 'TARGET_XML_FILES' in config_target
975 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
976 output: target + '-gdbstub-xml.c',
977 input: files(config_target['TARGET_XML_FILES'].split()),
978 command: [feature_to_c, '@INPUT@'],
979 capture: true)
980 arch_srcs += gdbstub_xml
981 endif
982
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200983 t = target_arch[arch].apply(config_target, strict: false)
984 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200985 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200986
Paolo Bonzini2becc362020-02-03 11:42:03 +0100987 target_common = common_ss.apply(config_target, strict: false)
988 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200989 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +0100990
Paolo Bonzini2becc362020-02-03 11:42:03 +0100991 target_specific = specific_ss.apply(config_target, strict: false)
992 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200993 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +0100994
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200995 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +0200996 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200997 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +0100998 objects: objects,
999 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001000 c_args: c_args,
1001 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001002 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001003
1004 if target.endswith('-softmmu')
1005 execs = [{
1006 'name': 'qemu-system-' + target_name,
1007 'gui': false,
1008 'sources': files('softmmu/main.c'),
1009 'dependencies': []
1010 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001011 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001012 execs += [{
1013 'name': 'qemu-system-' + target_name + 'w',
1014 'gui': true,
1015 'sources': files('softmmu/main.c'),
1016 'dependencies': []
1017 }]
1018 endif
1019 if config_host.has_key('CONFIG_FUZZ')
1020 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1021 execs += [{
1022 'name': 'qemu-fuzz-' + target_name,
1023 'gui': false,
1024 'sources': specific_fuzz.sources(),
1025 'dependencies': specific_fuzz.dependencies(),
1026 'link_depends': [files('tests/qtest/fuzz/fork_fuzz.ld')],
1027 }]
1028 endif
1029 else
1030 execs = [{
1031 'name': 'qemu-' + target_name,
1032 'gui': false,
1033 'sources': [],
1034 'dependencies': []
1035 }]
1036 endif
1037 foreach exe: execs
1038 emulators += executable(exe['name'], exe['sources'],
1039 install: true,
1040 c_args: c_args,
1041 dependencies: arch_deps + deps + exe['dependencies'],
1042 objects: lib.extract_all_objects(recursive: true),
1043 link_language: link_language,
1044 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1045 link_args: link_args,
1046 gui_app: exe['gui'])
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001047
1048 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1049 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001050 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1051 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001052 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1053 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1054 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001055 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001056 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001057 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001058 capture: true,
1059 install: stp['install'],
Marc-André Lureauab4c0992020-08-26 15:04:16 +04001060 install_dir: qemu_datadir / '../systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001061 command: [
1062 tracetool, '--group=all', '--format=' + stp['fmt'],
1063 '--binary=' + stp['bin'],
1064 '--target-name=' + target_name,
1065 '--target-type=' + target_type,
1066 '--probe-prefix=qemu.' + target_type + '.' + target_name,
1067 '@INPUT@',
1068 ])
1069 endforeach
1070 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001071 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001072endforeach
1073
Paolo Bonzini931049b2020-02-05 09:44:24 +01001074# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04001075
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001076if 'CONFIG_PLUGIN' in config_host
1077 install_headers('include/qemu/qemu-plugin.h')
1078endif
1079
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001080if 'CONFIG_GUEST_AGENT' in config_host
1081 subdir('qga')
1082endif
1083
Laurent Vivier9755c942020-08-24 17:24:30 +02001084# Don't build qemu-keymap if xkbcommon is not explicitly enabled
1085# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001086if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04001087 # used for the update-keymaps target, so include rules even if !have_tools
1088 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1089 dependencies: [qemuutil, xkbcommon], install: have_tools)
1090endif
1091
Philippe Mathieu-Daudé8855e8f2020-08-21 17:05:56 +02001092qemu_block_tools = []
Paolo Bonzini931049b2020-02-05 09:44:24 +01001093if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001094 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1095 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1096 qemu_io = executable('qemu-io', files('qemu-io.c'),
1097 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01001098 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001099 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01001100 qemu_block_tools += [qemu_img, qemu_io, qemu_nbd]
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001101
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02001102 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02001103 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001104 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02001105
Marc-André Lureau157e7b12019-07-15 14:50:58 +04001106 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1107 dependencies: qemuutil,
1108 install: true)
1109
Paolo Bonzini931049b2020-02-05 09:44:24 +01001110 if 'CONFIG_VHOST_USER' in config_host
1111 subdir('contrib/libvhost-user')
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02001112 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001113 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04001114 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02001115 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01001116 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04001117
1118 if targetos == 'linux'
1119 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1120 dependencies: [qemuutil, libcap_ng],
1121 install: true,
1122 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04001123
1124 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1125 dependencies: [authz, crypto, io, qom, qemuutil,
1126 libcap_ng, libudev, libmpathpersist],
1127 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04001128 endif
1129
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04001130 if 'CONFIG_IVSHMEM' in config_host
1131 subdir('contrib/ivshmem-client')
1132 subdir('contrib/ivshmem-server')
1133 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01001134endif
1135
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04001136subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001137subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04001138subdir('pc-bios')
Paolo Bonzinice1c1e72020-01-28 16:41:44 +01001139subdir('tests')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02001140subdir('docs')
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04001141if 'CONFIG_GTK' in config_host
1142 subdir('po')
1143endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001144
Paolo Bonziniacfdaac2020-08-05 13:07:48 +02001145if build_docs
1146 makeinfo = find_program('makeinfo', required: build_docs)
1147
1148 docs_inc = [
1149 '-I', meson.current_source_dir(),
1150 '-I', meson.current_build_dir() / 'docs',
1151 '-I', '@OUTDIR@',
1152 ]
1153
1154 version_texi = configure_file(output: 'version.texi',
1155 input: 'version.texi.in',
1156 configuration: {'VERSION': meson.project_version(),
1157 'qemu_confdir': config_host['qemu_confdir']})
1158
1159 texi = {
1160 'qemu-qmp-ref': ['docs/interop/qemu-qmp-ref.texi', qapi_doc_texi, version_texi],
1161 }
1162 if 'CONFIG_GUEST_AGENT' in config_host
1163 texi += {'qemu-ga-ref': ['docs/interop/qemu-ga-ref.texi', qga_qapi_doc_texi, version_texi]}
1164 endif
1165
1166 if makeinfo.found()
1167 cmd = [
1168 'env', 'LC_ALL=C', makeinfo, '--no-split', '--number-sections', docs_inc,
1169 '@INPUT0@', '-o', '@OUTPUT@',
1170 ]
1171 foreach ext, args: {
1172 'info': [],
1173 'html': ['--no-headers', '--html'],
1174 'txt': ['--no-headers', '--plaintext'],
1175 }
1176 t = []
1177 foreach doc, input: texi
1178 output = doc + '.' + ext
1179 t += custom_target(output,
1180 input: input,
1181 output: output,
1182 install: true,
Marc-André Lureau491e74c2020-08-26 15:04:17 +04001183 install_dir: qemu_docdir / 'interop',
Paolo Bonziniacfdaac2020-08-05 13:07:48 +02001184 command: cmd + args)
1185 endforeach
1186 alias_target(ext, t)
1187 endforeach
1188 endif
1189
1190 texi2pdf = find_program('texi2pdf', required: false)
1191
1192 if texi2pdf.found()
1193 pdfs = []
1194 foreach doc, input: texi
1195 output = doc + '.pdf'
1196 pdfs += custom_target(output,
1197 input: input,
1198 output: output,
1199 command: [texi2pdf, '-q', docs_inc, '@INPUT0@', '-o', '@OUTPUT@'],
1200 build_by_default: false)
1201 endforeach
1202 alias_target('pdf', pdfs)
1203 endif
1204
1205 texi2pod = find_program('scripts/texi2pod.pl')
1206 pod2man = find_program('pod2man', required: build_docs)
1207
1208 if pod2man.found()
1209 foreach doc, input: texi
1210 man = doc + '.7'
1211 pod = custom_target(man + '.pod',
1212 input: input,
1213 output: man + '.pod',
1214 command: [texi2pod,
1215 '-DVERSION="' + meson.project_version() + '"',
1216 '-DCONFDIR="' + config_host['qemu_confdir'] + '"',
1217 '@INPUT0@', '@OUTPUT@'])
1218 man = custom_target(man,
1219 input: pod,
1220 output: man,
1221 capture: true,
1222 install: true,
Marc-André Lureaub81efab2020-08-26 15:04:18 +04001223 install_dir: get_option('mandir') / 'man7',
Paolo Bonziniacfdaac2020-08-05 13:07:48 +02001224 command: [pod2man, '--utf8', '--section=7', '--center=" "',
1225 '--release=" "', '@INPUT@'])
1226 endforeach
1227 endif
1228endif
1229
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04001230if host_machine.system() == 'windows'
1231 nsis_cmd = [
1232 find_program('scripts/nsis.py'),
1233 '@OUTPUT@',
1234 get_option('prefix'),
1235 meson.current_source_dir(),
1236 host_machine.cpu_family(),
1237 '--',
1238 '-DDISPLAYVERSION=' + meson.project_version(),
1239 ]
1240 if build_docs
1241 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
1242 endif
1243 if 'CONFIG_GTK' in config_host
1244 nsis_cmd += '-DCONFIG_GTK=y'
1245 endif
1246
1247 nsis = custom_target('nsis',
1248 output: 'qemu-setup-' + meson.project_version() + '.exe',
1249 input: files('qemu.nsi'),
1250 build_always_stale: true,
1251 command: nsis_cmd + ['@INPUT@'])
1252 alias_target('installer', nsis)
1253endif
1254
Paolo Bonzinif9332752020-02-03 13:28:38 +01001255summary_info = {}
1256summary_info += {'Install prefix': config_host['prefix']}
1257summary_info += {'BIOS directory': config_host['qemu_datadir']}
1258summary_info += {'firmware path': config_host['qemu_firmwarepath']}
1259summary_info += {'binary directory': config_host['bindir']}
1260summary_info += {'library directory': config_host['libdir']}
1261summary_info += {'module directory': config_host['qemu_moddir']}
1262summary_info += {'libexec directory': config_host['libexecdir']}
1263summary_info += {'include directory': config_host['includedir']}
1264summary_info += {'config directory': config_host['sysconfdir']}
1265if targetos != 'windows'
1266 summary_info += {'local state directory': config_host['qemu_localstatedir']}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04001267 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001268else
1269 summary_info += {'local state directory': 'queried at runtime'}
1270endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04001271summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001272summary_info += {'Build directory': meson.current_build_dir()}
1273summary_info += {'Source path': meson.current_source_dir()}
1274summary_info += {'GIT binary': config_host['GIT']}
1275summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
1276summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
1277summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
1278if link_language == 'cpp'
1279 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
1280else
1281 summary_info += {'C++ compiler': false}
1282endif
1283if targetos == 'darwin'
1284 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1285endif
1286summary_info += {'ARFLAGS': config_host['ARFLAGS']}
1287summary_info += {'CFLAGS': config_host['CFLAGS']}
1288summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
1289summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
1290summary_info += {'make': config_host['MAKE']}
1291summary_info += {'install': config_host['INSTALL']}
1292summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1293summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
1294summary_info += {'genisoimage': config_host['GENISOIMAGE']}
1295# TODO: add back version
1296summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
1297if config_host.has_key('CONFIG_SLIRP')
1298 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
1299endif
1300summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
1301if config_host.has_key('CONFIG_MODULES')
1302 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1303endif
1304summary_info += {'host CPU': cpu}
1305summary_info += {'host endianness': build_machine.endian()}
1306summary_info += {'target list': config_host['TARGET_DIRS']}
1307summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
1308summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
1309summary_info += {'strip binaries': get_option('strip')}
1310summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
1311summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
1312if targetos == 'darwin'
1313 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1314endif
1315# TODO: add back version
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001316summary_info += {'SDL support': sdl.found()}
1317summary_info += {'SDL image support': sdl_image.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001318# TODO: add back version
1319summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
1320summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001321summary_info += {'pixman': pixman.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001322# TODO: add back version
1323summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
1324summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
1325summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
1326# TODO: add back version
1327summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
1328if config_host.has_key('CONFIG_GCRYPT')
1329 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
1330 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1331endif
1332# TODO: add back version
1333summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
1334if config_host.has_key('CONFIG_NETTLE')
1335 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1336endif
1337summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1338summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1339summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1340summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1341# TODO: add back version
1342summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1343summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1344summary_info += {'mingw32 support': targetos == 'windows'}
1345summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1346summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1347summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1348summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
1349summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001350summary_info += {'VNC support': vnc.found()}
1351if vnc.found()
1352 summary_info += {'VNC SASL support': sasl.found()}
1353 summary_info += {'VNC JPEG support': jpeg.found()}
1354 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001355endif
1356summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1357if config_host.has_key('CONFIG_XEN_BACKEND')
1358 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1359endif
1360summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1361summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1362summary_info += {'PIE': get_option('b_pie')}
1363summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1364summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1365summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1366summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1367summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1368summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1369# TODO: add back KVM/HAX/HVF/WHPX/TCG
1370#summary_info += {'KVM support': have_kvm'}
1371#summary_info += {'HAX support': have_hax'}
1372#summary_info += {'HVF support': have_hvf'}
1373#summary_info += {'WHPX support': have_whpx'}
1374#summary_info += {'TCG support': have_tcg'}
1375#if get_option('tcg')
1376# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1377# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1378#endif
1379summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1380summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1381summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1382summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
1383summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1384summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1385summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1386summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1387summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1388summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1389summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1390summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1391summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1392summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1393summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1394summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1395summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1396summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1397summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1398if config_host['TRACE_BACKENDS'].split().contains('simple')
1399 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1400endif
1401# TODO: add back protocol and server version
1402summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1403summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1404summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1405summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02001406summary_info += {'U2F support': u2f.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001407summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1408summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1409summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1410summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1411summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1412summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1413summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1414if targetos == 'windows'
1415 if 'WIN_SDK' in config_host
1416 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1417 endif
1418 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1419 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1420 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1421endif
1422summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1423summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1424summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1425summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1426summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1427summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1428summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +04001429summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001430summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1431summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1432summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1433summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1434summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1435summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1436summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1437summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1438summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1439summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1440summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1441summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1442summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1443summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1444summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1445summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1446summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1447summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1448summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1449summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1450summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1451summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1452summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1453summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1454summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1455summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1456summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1457summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1458summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1459summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1460summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1461summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1462if config_host.has_key('HAVE_GDB_BIN')
1463 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1464endif
1465summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1466summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1467summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1468summary(summary_info, bool_yn: true)
1469
1470if not supported_cpus.contains(cpu)
1471 message()
1472 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1473 message()
1474 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1475 message('The QEMU project intends to remove support for this host CPU in')
1476 message('a future release if nobody volunteers to maintain it and to')
1477 message('provide a build host for our continuous integration setup.')
1478 message('configure has succeeded and you can continue to build, but')
1479 message('if you care about QEMU on this platform you should contact')
1480 message('us upstream at qemu-devel@nongnu.org.')
1481endif
1482
1483if not supported_oses.contains(targetos)
1484 message()
1485 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1486 message()
1487 message('Host OS ' + targetos + 'support is not currently maintained.')
1488 message('The QEMU project intends to remove support for this host OS in')
1489 message('a future release if nobody volunteers to maintain it and to')
1490 message('provide a build host for our continuous integration setup.')
1491 message('configure has succeeded and you can continue to build, but')
1492 message('if you care about QEMU on this platform you should contact')
1493 message('us upstream at qemu-devel@nongnu.org.')
1494endif