blob: 6b2fc769330d78c79e84252c1cae5f7438c19cf3 [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
Paolo Bonzini859aef02020-08-04 18:14:26 +020021config_host_data = configuration_data()
22genh = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020023
Paolo Bonzini760e4322020-08-26 08:09:48 +020024target_dirs = config_host['TARGET_DIRS'].split()
25have_user = false
26have_system = false
27foreach target : target_dirs
28 have_user = have_user or target.endswith('-user')
29 have_system = have_system or target.endswith('-softmmu')
30endforeach
31have_tools = 'CONFIG_TOOLS' in config_host
32have_block = have_system or have_tools
33
Paolo Bonzinia5665052019-06-10 12:05:14 +020034add_project_arguments(config_host['QEMU_CFLAGS'].split(),
35 native: false, language: ['c', 'objc'])
36add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
37 native: false, language: 'cpp')
38add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
39 native: false, language: ['c', 'cpp', 'objc'])
40add_project_arguments(config_host['QEMU_INCLUDES'].split(),
41 language: ['c', 'cpp', 'objc'])
42
Marc-André Lureaufc929892019-07-13 01:47:54 +040043python = import('python').find_installation()
44
45link_language = meson.get_external_property('link_language', 'cpp')
46if link_language == 'cpp'
47 add_languages('cpp', required: true, native: false)
48endif
Paolo Bonzinia5665052019-06-10 12:05:14 +020049if host_machine.system() == 'darwin'
50 add_languages('objc', required: false, native: false)
51endif
52
Paolo Bonzini968b4db2020-02-03 14:45:33 +010053if 'SPARSE_CFLAGS' in config_host
54 run_target('sparse',
55 command: [find_program('scripts/check_sparse.py'),
56 config_host['SPARSE_CFLAGS'].split(),
57 'compile_commands.json'])
58endif
59
Paolo Bonzinia5665052019-06-10 12:05:14 +020060configure_file(input: files('scripts/ninjatool.py'),
61 output: 'ninjatool',
62 configuration: config_host)
Paolo Bonzinif9332752020-02-03 13:28:38 +010063
64supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
65supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
66 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
67
68cpu = host_machine.cpu_family()
69targetos = host_machine.system()
70
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040071m = cc.find_library('m', required: false)
72util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +020073winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040074socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +040075version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +040076coref = []
77iokit = []
78cocoa = []
79hvf = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040080if targetos == 'windows'
81 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +020082 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +040083
84 win = import('windows')
85 version_res = win.compile_resources('version.rc',
86 depend_files: files('pc-bios/qemu-nsis.ico'),
87 include_directories: include_directories('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +040088elif targetos == 'darwin'
89 coref = dependency('appleframeworks', modules: 'CoreFoundation')
90 iokit = dependency('appleframeworks', modules: 'IOKit')
91 cocoa = dependency('appleframeworks', modules: 'Cocoa')
92 hvf = dependency('appleframeworks', modules: 'Hypervisor')
Paolo Bonzinicfad62f2020-08-09 23:47:45 +020093elif targetos == 'sunos'
94 socket = [cc.find_library('socket'),
95 cc.find_library('nsl'),
96 cc.find_library('resolv')]
97elif targetos == 'haiku'
98 socket = [cc.find_library('posix_error_mapper'),
99 cc.find_library('network'),
100 cc.find_library('bsd')]
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400101endif
102glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
103 link_args: config_host['GLIB_LIBS'].split())
104gio = not_found
105if 'CONFIG_GIO' in config_host
106 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
107 link_args: config_host['GIO_LIBS'].split())
108endif
109lttng = not_found
110if 'CONFIG_TRACE_UST' in config_host
111 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
112endif
113urcubp = not_found
114if 'CONFIG_TRACE_UST' in config_host
115 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
116endif
117nettle = not_found
118if 'CONFIG_NETTLE' in config_host
119 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
120 link_args: config_host['NETTLE_LIBS'].split())
121endif
122gnutls = not_found
123if 'CONFIG_GNUTLS' in config_host
124 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
125 link_args: config_host['GNUTLS_LIBS'].split())
126endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200127pixman = not_found
128if have_system or have_tools
129 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
130 static: enable_static)
131endif
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400132pam = not_found
133if 'CONFIG_AUTH_PAM' in config_host
134 pam = cc.find_library('pam')
135endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400136libaio = cc.find_library('aio', required: false)
137zlib = not_found
138if 'CONFIG_ZLIB' in config_host
139 zlib = declare_dependency(compile_args: config_host['ZLIB_CFLAGS'].split(),
140 link_args: config_host['ZLIB_LIBS'].split())
141endif
142linux_io_uring = not_found
143if 'CONFIG_LINUX_IO_URING' in config_host
144 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
145 link_args: config_host['LINUX_IO_URING_LIBS'].split())
146endif
147libxml2 = not_found
148if 'CONFIG_LIBXML2' in config_host
149 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
150 link_args: config_host['LIBXML2_LIBS'].split())
151endif
152libnfs = not_found
153if 'CONFIG_LIBNFS' in config_host
154 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
155endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400156libattr = not_found
157if 'CONFIG_ATTR' in config_host
158 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
159endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100160seccomp = not_found
161if 'CONFIG_SECCOMP' in config_host
162 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
163 link_args: config_host['SECCOMP_LIBS'].split())
164endif
165libcap_ng = not_found
166if 'CONFIG_LIBCAP_NG' in config_host
167 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
168endif
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400169if get_option('xkbcommon').auto() and not have_system and not have_tools
170 xkbcommon = not_found
171else
172 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
173 static: enable_static)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400174endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400175slirp = not_found
176if config_host.has_key('CONFIG_SLIRP')
177 slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
178 link_args: config_host['SLIRP_LIBS'].split())
179endif
180vde = not_found
181if config_host.has_key('CONFIG_VDE')
182 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
183endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200184pulse = not_found
185if 'CONFIG_LIBPULSE' in config_host
186 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
187 link_args: config_host['PULSE_LIBS'].split())
188endif
189alsa = not_found
190if 'CONFIG_ALSA' in config_host
191 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
192 link_args: config_host['ALSA_LIBS'].split())
193endif
194jack = not_found
195if 'CONFIG_LIBJACK' in config_host
196 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
197endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200198spice = not_found
199if 'CONFIG_SPICE' in config_host
200 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
201 link_args: config_host['SPICE_LIBS'].split())
202endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400203rt = cc.find_library('rt', required: false)
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400204libmpathpersist = not_found
205if config_host.has_key('CONFIG_MPATH')
206 libmpathpersist = cc.find_library('mpathpersist')
207endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200208libiscsi = not_found
209if 'CONFIG_LIBISCSI' in config_host
210 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
211 link_args: config_host['LIBISCSI_LIBS'].split())
212endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400213zstd = not_found
214if 'CONFIG_ZSTD' in config_host
215 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
216 link_args: config_host['ZSTD_LIBS'].split())
217endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400218gbm = not_found
219if 'CONFIG_GBM' in config_host
220 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
221 link_args: config_host['GBM_LIBS'].split())
222endif
223virgl = not_found
224if 'CONFIG_VIRGL' in config_host
225 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
226 link_args: config_host['VIRGL_LIBS'].split())
227endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400228curl = not_found
229if 'CONFIG_CURL' in config_host
230 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
231 link_args: config_host['CURL_LIBS'].split())
232endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200233libudev = not_found
234if 'CONFIG_LIBUDEV' in config_host
235 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
236endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200237brlapi = not_found
238if 'CONFIG_BRLAPI' in config_host
239 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
240endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100241
Paolo Bonzini760e4322020-08-26 08:09:48 +0200242sdl = not_found
243if have_system
Yonggang Luo363743d2020-08-26 23:10:03 +0800244 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200245 sdl_image = not_found
246endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100247if sdl.found()
248 # work around 2.0.8 bug
249 sdl = declare_dependency(compile_args: '-Wno-undef',
250 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200251 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100252 static: enable_static)
253else
254 if get_option('sdl_image').enabled()
255 error('sdl-image required, but SDL was @0@',
256 get_option('sdl').disabled() ? 'disabled' : 'not found')
257 endif
258 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200259endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100260
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400261rbd = not_found
262if 'CONFIG_RBD' in config_host
263 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
264endif
265glusterfs = not_found
266if 'CONFIG_GLUSTERFS' in config_host
267 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
268 link_args: config_host['GLUSTERFS_LIBS'].split())
269endif
270libssh = not_found
271if 'CONFIG_LIBSSH' in config_host
272 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
273 link_args: config_host['LIBSSH_LIBS'].split())
274endif
275libbzip2 = not_found
276if 'CONFIG_BZIP2' in config_host
277 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
278endif
279liblzfse = not_found
280if 'CONFIG_LZFSE' in config_host
281 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
282endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200283oss = not_found
284if 'CONFIG_AUDIO_OSS' in config_host
285 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
286endif
287dsound = not_found
288if 'CONFIG_AUDIO_DSOUND' in config_host
289 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
290endif
291coreaudio = not_found
292if 'CONFIG_AUDIO_COREAUDIO' in config_host
293 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
294endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400295opengl = not_found
296if 'CONFIG_OPENGL' in config_host
297 opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
298else
299endif
300gtk = not_found
301if 'CONFIG_GTK' in config_host
302 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
303 link_args: config_host['GTK_LIBS'].split())
304endif
305vte = not_found
306if 'CONFIG_VTE' in config_host
307 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
308 link_args: config_host['VTE_LIBS'].split())
309endif
310x11 = not_found
311if 'CONFIG_X11' in config_host
312 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
313 link_args: config_host['X11_LIBS'].split())
314endif
315curses = not_found
316if 'CONFIG_CURSES' in config_host
317 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
318 link_args: config_host['CURSES_LIBS'].split())
319endif
320iconv = not_found
321if 'CONFIG_ICONV' in config_host
322 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
323 link_args: config_host['ICONV_LIBS'].split())
324endif
325gio = not_found
326if 'CONFIG_GIO' in config_host
327 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
328 link_args: config_host['GIO_LIBS'].split())
329endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100330vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400331png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400332jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400333sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100334if get_option('vnc').enabled()
335 vnc = declare_dependency() # dummy dependency
336 png = dependency('libpng', required: get_option('vnc_png'),
337 static: enable_static)
338 jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
339 required: get_option('vnc_jpeg'),
340 static: enable_static)
341 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
342 required: get_option('vnc_sasl'),
343 static: enable_static)
344 if sasl.found()
345 sasl = declare_dependency(dependencies: sasl,
346 compile_args: '-DSTRUCT_IOVEC_DEFINED')
347 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400348endif
Paolo Bonzini4a963372020-08-03 16:22:28 +0200349fdt = not_found
350if 'CONFIG_FDT' in config_host
351 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
352 link_args: config_host['FDT_LIBS'].split())
353endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400354snappy = not_found
355if 'CONFIG_SNAPPY' in config_host
356 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
357endif
358lzo = not_found
359if 'CONFIG_LZO' in config_host
360 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
361endif
Marc-André Lureau55166232019-07-24 19:16:22 +0400362rdma = not_found
363if 'CONFIG_RDMA' in config_host
364 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
365endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400366numa = not_found
367if 'CONFIG_NUMA' in config_host
368 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
369endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400370xen = not_found
371if 'CONFIG_XEN_BACKEND' in config_host
372 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
373 link_args: config_host['XEN_LIBS'].split())
374endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200375cacard = not_found
376if 'CONFIG_SMARTCARD' in config_host
377 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
378 link_args: config_host['SMARTCARD_LIBS'].split())
379endif
César Belley0a40bcb2020-08-26 13:42:04 +0200380u2f = not_found
381if have_system
382 u2f = dependency('u2f-emu', required: get_option('u2f'),
383 method: 'pkg-config',
384 static: enable_static)
385endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200386usbredir = not_found
387if 'CONFIG_USB_REDIR' in config_host
388 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
389 link_args: config_host['USB_REDIR_LIBS'].split())
390endif
391libusb = not_found
392if 'CONFIG_USB_LIBUSB' in config_host
393 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
394 link_args: config_host['LIBUSB_LIBS'].split())
395endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400396capstone = not_found
397if 'CONFIG_CAPSTONE' in config_host
398 capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(),
399 link_args: config_host['CAPSTONE_LIBS'].split())
400endif
401libpmem = not_found
402if 'CONFIG_LIBPMEM' in config_host
403 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
404 link_args: config_host['LIBPMEM_LIBS'].split())
405endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600406libdaxctl = not_found
407if 'CONFIG_LIBDAXCTL' in config_host
408 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
409endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400410
Paolo Bonzini859aef02020-08-04 18:14:26 +0200411# Create config-host.h
412
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100413config_host_data.set('CONFIG_SDL', sdl.found())
414config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100415config_host_data.set('CONFIG_VNC', vnc.found())
416config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
417config_host_data.set('CONFIG_VNC_PNG', png.found())
418config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +0200419config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Paolo Bonzini859aef02020-08-04 18:14:26 +0200420config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
421config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
422config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
423config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
424
425arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
426strings = ['HOST_DSOSUF', 'CONFIG_IASL', 'qemu_confdir', 'qemu_datadir',
427 'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
428 'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath']
429foreach k, v: config_host
430 if arrays.contains(k)
431 if v != ''
432 v = '"' + '", "'.join(v.split()) + '", '
433 endif
434 config_host_data.set(k, v)
435 elif k == 'ARCH'
436 config_host_data.set('HOST_' + v.to_upper(), 1)
437 elif strings.contains(k)
438 if not k.startswith('CONFIG_')
439 k = 'CONFIG_' + k.to_upper()
440 endif
441 config_host_data.set_quoted(k, v)
442 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
443 config_host_data.set(k, v == 'y' ? 1 : v)
444 endif
445endforeach
446genh += configure_file(output: 'config-host.h', configuration: config_host_data)
447
Paolo Bonzini2becc362020-02-03 11:42:03 +0100448minikconf = find_program('scripts/minikconf.py')
Paolo Bonzini2becc362020-02-03 11:42:03 +0100449config_devices_mak_list = []
450config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +0200451config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100452config_target_mak = {}
453kconfig_external_symbols = [
454 'CONFIG_KVM',
455 'CONFIG_XEN',
456 'CONFIG_TPM',
457 'CONFIG_SPICE',
458 'CONFIG_IVSHMEM',
459 'CONFIG_OPENGL',
460 'CONFIG_X11',
461 'CONFIG_VHOST_USER',
462 'CONFIG_VHOST_KERNEL',
463 'CONFIG_VIRTFS',
464 'CONFIG_LINUX',
465 'CONFIG_PVRDMA',
466]
Paolo Bonzini859aef02020-08-04 18:14:26 +0200467ignored = ['TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_DIRS']
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400468foreach target : target_dirs
Paolo Bonzini859aef02020-08-04 18:14:26 +0200469 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak')
470
471 config_target_data = configuration_data()
472 foreach k, v: config_target
473 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
474 # do nothing
475 elif ignored.contains(k)
476 # do nothing
477 elif k == 'TARGET_BASE_ARCH'
478 config_target_data.set('TARGET_' + v.to_upper(), 1)
479 elif k == 'TARGET_NAME'
480 config_target_data.set_quoted(k, v)
481 elif v == 'y'
482 config_target_data.set(k, 1)
483 else
484 config_target_data.set(k, v)
485 endif
486 endforeach
487 config_target_h += {target: configure_file(output: target + '-config-target.h',
488 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100489
490 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +0100491 base_kconfig = []
492 foreach sym : kconfig_external_symbols
Paolo Bonzini859aef02020-08-04 18:14:26 +0200493 if sym in config_target or sym in config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +0100494 base_kconfig += '@0@=y'.format(sym)
495 endif
496 endforeach
497
498 config_devices_mak = target + '-config-devices.mak'
499 config_devices_mak = configure_file(
500 input: ['default-configs' / target + '.mak', 'Kconfig'],
501 output: config_devices_mak,
502 depfile: config_devices_mak + '.d',
503 capture: true,
504 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
505 config_devices_mak, '@DEPFILE@', '@INPUT@',
506 base_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +0200507
508 config_devices_data = configuration_data()
509 config_devices = keyval.load(config_devices_mak)
510 foreach k, v: config_devices
511 config_devices_data.set(k, 1)
512 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +0100513 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +0200514 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
515 configuration: config_devices_data)}
516 config_target += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +0100517 endif
518 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400519endforeach
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400520
Paolo Bonzini2becc362020-02-03 11:42:03 +0100521grepy = find_program('scripts/grepy.sh')
522# This configuration is used to build files that are shared by
523# multiple binaries, and then extracted out of the "common"
524# static_library target.
525#
526# We do not use all_sources()/all_dependencies(), because it would
527# build literally all source files, including devices only used by
528# targets that are not built for this compilation. The CONFIG_ALL
529# pseudo symbol replaces it.
530
531if have_system
532 config_all_devices_mak = configure_file(
533 output: 'config-all-devices.mak',
534 input: config_devices_mak_list,
535 capture: true,
536 command: [grepy, '@INPUT@'],
537 )
538 config_all_devices = keyval.load(config_all_devices_mak)
539else
540 config_all_devices = {}
541endif
542config_all = config_all_devices
543config_all += config_host
544config_all += config_all_disas
545config_all += {
546 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
547 'CONFIG_SOFTMMU': have_system,
548 'CONFIG_USER_ONLY': have_user,
549 'CONFIG_ALL': true,
550}
551
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400552# Generators
553
Marc-André Lureau3f885652019-07-15 18:06:04 +0400554hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +0400555shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400556qapi_gen = find_program('scripts/qapi-gen.py')
557qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
558 meson.source_root() / 'scripts/qapi/commands.py',
559 meson.source_root() / 'scripts/qapi/common.py',
560 meson.source_root() / 'scripts/qapi/doc.py',
561 meson.source_root() / 'scripts/qapi/error.py',
562 meson.source_root() / 'scripts/qapi/events.py',
563 meson.source_root() / 'scripts/qapi/expr.py',
564 meson.source_root() / 'scripts/qapi/gen.py',
565 meson.source_root() / 'scripts/qapi/introspect.py',
566 meson.source_root() / 'scripts/qapi/parser.py',
567 meson.source_root() / 'scripts/qapi/schema.py',
568 meson.source_root() / 'scripts/qapi/source.py',
569 meson.source_root() / 'scripts/qapi/types.py',
570 meson.source_root() / 'scripts/qapi/visit.py',
571 meson.source_root() / 'scripts/qapi/common.py',
572 meson.source_root() / 'scripts/qapi/doc.py',
573 meson.source_root() / 'scripts/qapi-gen.py'
574]
575
576tracetool = [
577 python, files('scripts/tracetool.py'),
578 '--backend=' + config_host['TRACE_BACKENDS']
579]
580
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400581qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
582 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +0200583 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400584qemu_version = custom_target('qemu-version.h',
585 output: 'qemu-version.h',
586 command: qemu_version_cmd,
587 capture: true,
588 build_by_default: true,
589 build_always_stale: true)
590genh += qemu_version
591
Marc-André Lureau3f885652019-07-15 18:06:04 +0400592hxdep = []
593hx_headers = [
594 ['qemu-options.hx', 'qemu-options.def'],
595 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
596]
597if have_system
598 hx_headers += [
599 ['hmp-commands.hx', 'hmp-commands.h'],
600 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
601 ]
602endif
603foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400604 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +0400605 input: files(d[0]),
606 output: d[1],
607 capture: true,
608 build_by_default: true, # to be removed when added to a target
609 command: [hxtool, '-h', '@INPUT0@'])
610endforeach
611genh += hxdep
612
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400613# Collect sourcesets.
614
615util_ss = ss.source_set()
616stub_ss = ss.source_set()
617trace_ss = ss.source_set()
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400618block_ss = ss.source_set()
Paolo Bonzini4a963372020-08-03 16:22:28 +0200619blockdev_ss = ss.source_set()
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200620qmp_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +0100621common_ss = ss.source_set()
622softmmu_ss = ss.source_set()
623user_ss = ss.source_set()
624bsd_user_ss = ss.source_set()
625linux_user_ss = ss.source_set()
626specific_ss = ss.source_set()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200627specific_fuzz_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +0100628
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400629modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100630hw_arch = {}
631target_arch = {}
632target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400633
634###############
635# Trace files #
636###############
637
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400638# TODO: add each directory to the subdirs from its own meson.build, once
639# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400640trace_events_subdirs = [
641 'accel/kvm',
642 'accel/tcg',
643 'crypto',
644 'monitor',
645]
646if have_user
647 trace_events_subdirs += [ 'linux-user' ]
648endif
649if have_block
650 trace_events_subdirs += [
651 'authz',
652 'block',
653 'io',
654 'nbd',
655 'scsi',
656 ]
657endif
658if have_system
659 trace_events_subdirs += [
660 'audio',
661 'backends',
662 'backends/tpm',
663 'chardev',
664 'hw/9pfs',
665 'hw/acpi',
666 'hw/alpha',
667 'hw/arm',
668 'hw/audio',
669 'hw/block',
670 'hw/block/dataplane',
671 'hw/char',
672 'hw/display',
673 'hw/dma',
674 'hw/hppa',
675 'hw/hyperv',
676 'hw/i2c',
677 'hw/i386',
678 'hw/i386/xen',
679 'hw/ide',
680 'hw/input',
681 'hw/intc',
682 'hw/isa',
683 'hw/mem',
684 'hw/mips',
685 'hw/misc',
686 'hw/misc/macio',
687 'hw/net',
688 'hw/nvram',
689 'hw/pci',
690 'hw/pci-host',
691 'hw/ppc',
692 'hw/rdma',
693 'hw/rdma/vmw',
694 'hw/rtc',
695 'hw/s390x',
696 'hw/scsi',
697 'hw/sd',
698 'hw/sparc',
699 'hw/sparc64',
700 'hw/ssi',
701 'hw/timer',
702 'hw/tpm',
703 'hw/usb',
704 'hw/vfio',
705 'hw/virtio',
706 'hw/watchdog',
707 'hw/xen',
708 'hw/gpio',
709 'hw/riscv',
710 'migration',
711 'net',
712 'ui',
713 ]
714endif
715trace_events_subdirs += [
716 'hw/core',
717 'qapi',
718 'qom',
719 'target/arm',
720 'target/hppa',
721 'target/i386',
722 'target/mips',
723 'target/ppc',
724 'target/riscv',
725 'target/s390x',
726 'target/sparc',
727 'util',
728]
729
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400730subdir('qapi')
731subdir('qobject')
732subdir('stubs')
733subdir('trace')
734subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +0400735subdir('qom')
736subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400737subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +0400738subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400739
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400740
741if enable_modules
742 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
743 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
744endif
745
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400746# Build targets from sourcesets
747
Paolo Bonzini2becc362020-02-03 11:42:03 +0100748stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400749
750util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +0100751util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400752libqemuutil = static_library('qemuutil',
753 sources: util_ss.sources() + stub_ss.sources() + genh,
754 dependencies: [util_ss.dependencies(), m, glib, socket])
755qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400756 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400757
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200758decodetree = generator(find_program('scripts/decodetree.py'),
759 output: 'decode-@BASENAME@.c.inc',
760 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
761
Paolo Bonzini478e9432020-08-17 12:47:55 +0200762subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +0400763subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +0400764subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400765subdir('fsdev')
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200766subdir('libdecnumber')
Marc-André Lureaud3b18482019-08-17 14:55:32 +0400767subdir('target')
Marc-André Lureau708eab42019-09-03 16:59:33 +0400768subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400769
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400770block_ss.add(files(
771 'block.c',
772 'blockjob.c',
773 'job.c',
774 'qemu-io-cmds.c',
775))
776block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
777
778subdir('nbd')
779subdir('scsi')
780subdir('block')
781
Paolo Bonzini4a963372020-08-03 16:22:28 +0200782blockdev_ss.add(files(
783 'blockdev.c',
784 'blockdev-nbd.c',
785 'iothread.c',
786 'job-qmp.c',
787))
788
789# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
790# os-win32.c does not
791blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
792softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
793
794softmmu_ss.add_all(blockdev_ss)
795softmmu_ss.add(files(
796 'bootdevice.c',
797 'dma-helpers.c',
798 'qdev-monitor.c',
799), sdl)
800
801softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
802softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
803softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
804
805common_ss.add(files('cpus-common.c'))
806
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +0200807subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400808
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600809specific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem, libdaxctl)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400810specific_ss.add(files('exec-vary.c'))
811specific_ss.add(when: 'CONFIG_TCG', if_true: files(
812 'fpu/softfloat.c',
813 'tcg/optimize.c',
814 'tcg/tcg-common.c',
815 'tcg/tcg-op-gvec.c',
816 'tcg/tcg-op-vec.c',
817 'tcg/tcg-op.c',
818 'tcg/tcg.c',
819))
820specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
821
Marc-André Lureauab318052019-07-24 19:23:16 +0400822subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +0400823subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +0400824subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200825subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400826subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +0400827subdir('replay')
Marc-André Lureau582ea952019-08-15 15:15:32 +0400828subdir('hw')
Marc-André Lureau1a828782019-08-18 16:13:08 +0400829subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +0100830subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +0400831subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +0400832subdir('linux-user')
833
Marc-André Lureaub309c322019-08-18 19:20:37 +0400834bsd_user_ss.add(files('gdbstub.c'))
835specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
836
Marc-André Lureau3a304462019-08-18 16:13:08 +0400837linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
838specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +0200839
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +0200840# needed for fuzzing binaries
841subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200842subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +0200843
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400844block_mods = []
845softmmu_mods = []
846foreach d, list : modules
847 foreach m, module_ss : list
848 if enable_modules and targetos != 'windows'
849 module_ss = module_ss.apply(config_host, strict: false)
850 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
851 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
852 if d == 'block'
853 block_mods += sl
854 else
855 softmmu_mods += sl
856 endif
857 else
858 if d == 'block'
859 block_ss.add_all(module_ss)
860 else
861 softmmu_ss.add_all(module_ss)
862 endif
863 endif
864 endforeach
865endforeach
866
867nm = find_program('nm')
868undefsym = find_program('scripts/undefsym.sh')
869block_syms = custom_target('block.syms', output: 'block.syms',
870 input: [libqemuutil, block_mods],
871 capture: true,
872 command: [undefsym, nm, '@INPUT@'])
873qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
874 input: [libqemuutil, softmmu_mods],
875 capture: true,
876 command: [undefsym, nm, '@INPUT@'])
877
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400878block_ss = block_ss.apply(config_host, strict: false)
879libblock = static_library('block', block_ss.sources() + genh,
880 dependencies: block_ss.dependencies(),
881 link_depends: block_syms,
882 name_suffix: 'fa',
883 build_by_default: false)
884
885block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400886 link_args: '@block.syms',
887 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400888
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200889qmp_ss = qmp_ss.apply(config_host, strict: false)
890libqmp = static_library('qmp', qmp_ss.sources() + genh,
891 dependencies: qmp_ss.dependencies(),
892 name_suffix: 'fa',
893 build_by_default: false)
894
895qmp = declare_dependency(link_whole: [libqmp])
896
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400897foreach m : block_mods + softmmu_mods
898 shared_module(m.name(),
899 name_prefix: '',
900 link_whole: m,
901 install: true,
902 install_dir: config_host['qemu_moddir'])
903endforeach
904
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200905softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
906common_ss.add(qom, qemuutil)
907
908common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +0100909common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
910
911common_all = common_ss.apply(config_all, strict: false)
912common_all = static_library('common',
913 build_by_default: false,
914 sources: common_all.sources() + genh,
915 dependencies: common_all.dependencies(),
916 name_suffix: 'fa')
917
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400918feature_to_c = find_program('scripts/feature_to_c.sh')
919
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200920emulators = []
Paolo Bonzini2becc362020-02-03 11:42:03 +0100921foreach target : target_dirs
922 config_target = config_target_mak[target]
923 target_name = config_target['TARGET_NAME']
924 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +0200925 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200926 arch_deps = []
927 c_args = ['-DNEED_CPU_H',
928 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
929 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
930 link_args = []
Paolo Bonzini2becc362020-02-03 11:42:03 +0100931
Paolo Bonzini859aef02020-08-04 18:14:26 +0200932 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +0100933 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
934 if targetos == 'linux'
935 target_inc += include_directories('linux-headers', is_system: true)
936 endif
937 if target.endswith('-softmmu')
938 qemu_target_name = 'qemu-system-' + target_name
939 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200940 t = target_softmmu_arch[arch].apply(config_target, strict: false)
941 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200942 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200943
Marc-André Lureau2c442202019-08-17 13:55:58 +0400944 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
945 hw = hw_arch[hw_dir].apply(config_target, strict: false)
946 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200947 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +0400948
Paolo Bonzini2becc362020-02-03 11:42:03 +0100949 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200950 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +0100951 else
Marc-André Lureau3a304462019-08-18 16:13:08 +0400952 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +0100953 target_type='user'
954 qemu_target_name = 'qemu-' + target_name
955 if 'CONFIG_LINUX_USER' in config_target
956 base_dir = 'linux-user'
957 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
958 else
959 base_dir = 'bsd-user'
960 endif
961 target_inc += include_directories(
962 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +0400963 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +0100964 )
Marc-André Lureau3a304462019-08-18 16:13:08 +0400965 if 'CONFIG_LINUX_USER' in config_target
966 dir = base_dir / abi
967 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
968 if config_target.has_key('TARGET_SYSTBL_ABI')
969 arch_srcs += \
970 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
971 extra_args : config_target['TARGET_SYSTBL_ABI'])
972 endif
973 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +0100974 endif
975
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400976 if 'TARGET_XML_FILES' in config_target
977 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
978 output: target + '-gdbstub-xml.c',
979 input: files(config_target['TARGET_XML_FILES'].split()),
980 command: [feature_to_c, '@INPUT@'],
981 capture: true)
982 arch_srcs += gdbstub_xml
983 endif
984
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200985 t = target_arch[arch].apply(config_target, strict: false)
986 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200987 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200988
Paolo Bonzini2becc362020-02-03 11:42:03 +0100989 target_common = common_ss.apply(config_target, strict: false)
990 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200991 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +0100992
Paolo Bonzini2becc362020-02-03 11:42:03 +0100993 target_specific = specific_ss.apply(config_target, strict: false)
994 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200995 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +0100996
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200997 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +0200998 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200999 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001000 objects: objects,
1001 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001002 c_args: c_args,
1003 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001004 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001005
1006 if target.endswith('-softmmu')
1007 execs = [{
1008 'name': 'qemu-system-' + target_name,
1009 'gui': false,
1010 'sources': files('softmmu/main.c'),
1011 'dependencies': []
1012 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001013 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001014 execs += [{
1015 'name': 'qemu-system-' + target_name + 'w',
1016 'gui': true,
1017 'sources': files('softmmu/main.c'),
1018 'dependencies': []
1019 }]
1020 endif
1021 if config_host.has_key('CONFIG_FUZZ')
1022 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1023 execs += [{
1024 'name': 'qemu-fuzz-' + target_name,
1025 'gui': false,
1026 'sources': specific_fuzz.sources(),
1027 'dependencies': specific_fuzz.dependencies(),
1028 'link_depends': [files('tests/qtest/fuzz/fork_fuzz.ld')],
1029 }]
1030 endif
1031 else
1032 execs = [{
1033 'name': 'qemu-' + target_name,
1034 'gui': false,
1035 'sources': [],
1036 'dependencies': []
1037 }]
1038 endif
1039 foreach exe: execs
1040 emulators += executable(exe['name'], exe['sources'],
1041 install: true,
1042 c_args: c_args,
1043 dependencies: arch_deps + deps + exe['dependencies'],
1044 objects: lib.extract_all_objects(recursive: true),
1045 link_language: link_language,
1046 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1047 link_args: link_args,
1048 gui_app: exe['gui'])
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001049
1050 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1051 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001052 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1053 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001054 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1055 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1056 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001057 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001058 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001059 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001060 capture: true,
1061 install: stp['install'],
1062 install_dir: config_host['qemu_datadir'] / '../systemtap/tapset',
1063 command: [
1064 tracetool, '--group=all', '--format=' + stp['fmt'],
1065 '--binary=' + stp['bin'],
1066 '--target-name=' + target_name,
1067 '--target-type=' + target_type,
1068 '--probe-prefix=qemu.' + target_type + '.' + target_name,
1069 '@INPUT@',
1070 ])
1071 endforeach
1072 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001073 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001074endforeach
1075
Paolo Bonzini931049b2020-02-05 09:44:24 +01001076# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04001077
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001078if 'CONFIG_PLUGIN' in config_host
1079 install_headers('include/qemu/qemu-plugin.h')
1080endif
1081
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001082if 'CONFIG_GUEST_AGENT' in config_host
1083 subdir('qga')
1084endif
1085
Laurent Vivier9755c942020-08-24 17:24:30 +02001086# Don't build qemu-keymap if xkbcommon is not explicitly enabled
1087# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001088if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04001089 # used for the update-keymaps target, so include rules even if !have_tools
1090 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1091 dependencies: [qemuutil, xkbcommon], install: have_tools)
1092endif
1093
Philippe Mathieu-Daudé8855e8f2020-08-21 17:05:56 +02001094qemu_block_tools = []
Paolo Bonzini931049b2020-02-05 09:44:24 +01001095if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001096 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1097 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1098 qemu_io = executable('qemu-io', files('qemu-io.c'),
1099 dependencies: [block, qemuutil], install: true)
Philippe Mathieu-Daudé8855e8f2020-08-21 17:05:56 +02001100 qemu_block_tools += [qemu_img, qemu_io]
Thomas Huth5f7e9662020-08-23 10:32:15 +02001101 if targetos != 'windows'
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001102 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1103 dependencies: [block, qemuutil], install: true)
Paolo Bonzinid3ca5922020-01-28 14:49:18 +01001104 qemu_block_tools += [qemu_nbd]
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001105 endif
1106
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02001107 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02001108 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001109 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02001110
Marc-André Lureau157e7b12019-07-15 14:50:58 +04001111 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1112 dependencies: qemuutil,
1113 install: true)
1114
Paolo Bonzini931049b2020-02-05 09:44:24 +01001115 if 'CONFIG_VHOST_USER' in config_host
1116 subdir('contrib/libvhost-user')
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02001117 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001118 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04001119 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02001120 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01001121 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04001122
1123 if targetos == 'linux'
1124 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1125 dependencies: [qemuutil, libcap_ng],
1126 install: true,
1127 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04001128
1129 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1130 dependencies: [authz, crypto, io, qom, qemuutil,
1131 libcap_ng, libudev, libmpathpersist],
1132 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04001133 endif
1134
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04001135 if 'CONFIG_IVSHMEM' in config_host
1136 subdir('contrib/ivshmem-client')
1137 subdir('contrib/ivshmem-server')
1138 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01001139endif
1140
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04001141subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001142subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04001143subdir('pc-bios')
Paolo Bonzinice1c1e72020-01-28 16:41:44 +01001144subdir('tests')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02001145subdir('docs')
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04001146if 'CONFIG_GTK' in config_host
1147 subdir('po')
1148endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001149
Paolo Bonziniacfdaac2020-08-05 13:07:48 +02001150if build_docs
1151 makeinfo = find_program('makeinfo', required: build_docs)
1152
1153 docs_inc = [
1154 '-I', meson.current_source_dir(),
1155 '-I', meson.current_build_dir() / 'docs',
1156 '-I', '@OUTDIR@',
1157 ]
1158
1159 version_texi = configure_file(output: 'version.texi',
1160 input: 'version.texi.in',
1161 configuration: {'VERSION': meson.project_version(),
1162 'qemu_confdir': config_host['qemu_confdir']})
1163
1164 texi = {
1165 'qemu-qmp-ref': ['docs/interop/qemu-qmp-ref.texi', qapi_doc_texi, version_texi],
1166 }
1167 if 'CONFIG_GUEST_AGENT' in config_host
1168 texi += {'qemu-ga-ref': ['docs/interop/qemu-ga-ref.texi', qga_qapi_doc_texi, version_texi]}
1169 endif
1170
1171 if makeinfo.found()
1172 cmd = [
1173 'env', 'LC_ALL=C', makeinfo, '--no-split', '--number-sections', docs_inc,
1174 '@INPUT0@', '-o', '@OUTPUT@',
1175 ]
1176 foreach ext, args: {
1177 'info': [],
1178 'html': ['--no-headers', '--html'],
1179 'txt': ['--no-headers', '--plaintext'],
1180 }
1181 t = []
1182 foreach doc, input: texi
1183 output = doc + '.' + ext
1184 t += custom_target(output,
1185 input: input,
1186 output: output,
1187 install: true,
1188 install_dir: config_host['qemu_docdir'] / 'interop',
1189 command: cmd + args)
1190 endforeach
1191 alias_target(ext, t)
1192 endforeach
1193 endif
1194
1195 texi2pdf = find_program('texi2pdf', required: false)
1196
1197 if texi2pdf.found()
1198 pdfs = []
1199 foreach doc, input: texi
1200 output = doc + '.pdf'
1201 pdfs += custom_target(output,
1202 input: input,
1203 output: output,
1204 command: [texi2pdf, '-q', docs_inc, '@INPUT0@', '-o', '@OUTPUT@'],
1205 build_by_default: false)
1206 endforeach
1207 alias_target('pdf', pdfs)
1208 endif
1209
1210 texi2pod = find_program('scripts/texi2pod.pl')
1211 pod2man = find_program('pod2man', required: build_docs)
1212
1213 if pod2man.found()
1214 foreach doc, input: texi
1215 man = doc + '.7'
1216 pod = custom_target(man + '.pod',
1217 input: input,
1218 output: man + '.pod',
1219 command: [texi2pod,
1220 '-DVERSION="' + meson.project_version() + '"',
1221 '-DCONFDIR="' + config_host['qemu_confdir'] + '"',
1222 '@INPUT0@', '@OUTPUT@'])
1223 man = custom_target(man,
1224 input: pod,
1225 output: man,
1226 capture: true,
1227 install: true,
1228 install_dir: config_host['mandir'] / 'man7',
1229 command: [pod2man, '--utf8', '--section=7', '--center=" "',
1230 '--release=" "', '@INPUT@'])
1231 endforeach
1232 endif
1233endif
1234
Paolo Bonzinif9332752020-02-03 13:28:38 +01001235summary_info = {}
1236summary_info += {'Install prefix': config_host['prefix']}
1237summary_info += {'BIOS directory': config_host['qemu_datadir']}
1238summary_info += {'firmware path': config_host['qemu_firmwarepath']}
1239summary_info += {'binary directory': config_host['bindir']}
1240summary_info += {'library directory': config_host['libdir']}
1241summary_info += {'module directory': config_host['qemu_moddir']}
1242summary_info += {'libexec directory': config_host['libexecdir']}
1243summary_info += {'include directory': config_host['includedir']}
1244summary_info += {'config directory': config_host['sysconfdir']}
1245if targetos != 'windows'
1246 summary_info += {'local state directory': config_host['qemu_localstatedir']}
1247 summary_info += {'Manual directory': config_host['mandir']}
1248else
1249 summary_info += {'local state directory': 'queried at runtime'}
1250endif
1251summary_info += {'Build directory': meson.current_build_dir()}
1252summary_info += {'Source path': meson.current_source_dir()}
1253summary_info += {'GIT binary': config_host['GIT']}
1254summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
1255summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
1256summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
1257if link_language == 'cpp'
1258 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
1259else
1260 summary_info += {'C++ compiler': false}
1261endif
1262if targetos == 'darwin'
1263 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1264endif
1265summary_info += {'ARFLAGS': config_host['ARFLAGS']}
1266summary_info += {'CFLAGS': config_host['CFLAGS']}
1267summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
1268summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
1269summary_info += {'make': config_host['MAKE']}
1270summary_info += {'install': config_host['INSTALL']}
1271summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1272summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
1273summary_info += {'genisoimage': config_host['GENISOIMAGE']}
1274# TODO: add back version
1275summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
1276if config_host.has_key('CONFIG_SLIRP')
1277 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
1278endif
1279summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
1280if config_host.has_key('CONFIG_MODULES')
1281 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1282endif
1283summary_info += {'host CPU': cpu}
1284summary_info += {'host endianness': build_machine.endian()}
1285summary_info += {'target list': config_host['TARGET_DIRS']}
1286summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
1287summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
1288summary_info += {'strip binaries': get_option('strip')}
1289summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
1290summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
1291if targetos == 'darwin'
1292 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1293endif
1294# TODO: add back version
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001295summary_info += {'SDL support': sdl.found()}
1296summary_info += {'SDL image support': sdl_image.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001297# TODO: add back version
1298summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
1299summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001300summary_info += {'pixman': pixman.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001301# TODO: add back version
1302summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
1303summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
1304summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
1305# TODO: add back version
1306summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
1307if config_host.has_key('CONFIG_GCRYPT')
1308 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
1309 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1310endif
1311# TODO: add back version
1312summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
1313if config_host.has_key('CONFIG_NETTLE')
1314 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1315endif
1316summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1317summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1318summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1319summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1320# TODO: add back version
1321summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1322summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1323summary_info += {'mingw32 support': targetos == 'windows'}
1324summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1325summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1326summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1327summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
1328summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001329summary_info += {'VNC support': vnc.found()}
1330if vnc.found()
1331 summary_info += {'VNC SASL support': sasl.found()}
1332 summary_info += {'VNC JPEG support': jpeg.found()}
1333 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001334endif
1335summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1336if config_host.has_key('CONFIG_XEN_BACKEND')
1337 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1338endif
1339summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1340summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1341summary_info += {'PIE': get_option('b_pie')}
1342summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1343summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1344summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1345summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1346summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1347summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1348# TODO: add back KVM/HAX/HVF/WHPX/TCG
1349#summary_info += {'KVM support': have_kvm'}
1350#summary_info += {'HAX support': have_hax'}
1351#summary_info += {'HVF support': have_hvf'}
1352#summary_info += {'WHPX support': have_whpx'}
1353#summary_info += {'TCG support': have_tcg'}
1354#if get_option('tcg')
1355# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1356# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1357#endif
1358summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1359summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1360summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1361summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
1362summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1363summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1364summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1365summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1366summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1367summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1368summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1369summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1370summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1371summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1372summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1373summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1374summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1375summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1376summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1377if config_host['TRACE_BACKENDS'].split().contains('simple')
1378 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1379endif
1380# TODO: add back protocol and server version
1381summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1382summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1383summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1384summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02001385summary_info += {'U2F support': u2f.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001386summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1387summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1388summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1389summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1390summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1391summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1392summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1393if targetos == 'windows'
1394 if 'WIN_SDK' in config_host
1395 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1396 endif
1397 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1398 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1399 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1400endif
1401summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1402summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1403summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1404summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1405summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1406summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1407summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +04001408summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001409summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1410summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1411summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1412summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1413summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1414summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1415summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1416summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1417summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1418summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1419summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1420summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1421summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1422summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1423summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1424summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1425summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1426summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1427summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1428summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1429summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1430summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1431summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1432summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1433summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1434summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1435summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1436summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1437summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1438summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1439summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1440summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1441if config_host.has_key('HAVE_GDB_BIN')
1442 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1443endif
1444summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1445summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1446summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1447summary(summary_info, bool_yn: true)
1448
1449if not supported_cpus.contains(cpu)
1450 message()
1451 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1452 message()
1453 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1454 message('The QEMU project intends to remove support for this host CPU in')
1455 message('a future release if nobody volunteers to maintain it and to')
1456 message('provide a build host for our continuous integration setup.')
1457 message('configure has succeeded and you can continue to build, but')
1458 message('if you care about QEMU on this platform you should contact')
1459 message('us upstream at qemu-devel@nongnu.org.')
1460endif
1461
1462if not supported_oses.contains(targetos)
1463 message()
1464 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1465 message()
1466 message('Host OS ' + targetos + 'support is not currently maintained.')
1467 message('The QEMU project intends to remove support for this host OS in')
1468 message('a future release if nobody volunteers to maintain it and to')
1469 message('provide a build host for our continuous integration setup.')
1470 message('configure has succeeded and you can continue to build, but')
1471 message('if you care about QEMU on this platform you should contact')
1472 message('us upstream at qemu-devel@nongnu.org.')
1473endif