blob: d619cd901e95aa3a32f6bb205c0bf7d730e944e9 [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',
Paolo Bonzini3e0e5192020-09-01 12:48:00 -04003 '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')
Marc-André Lureau3154fee2019-08-29 22:07:01 +040017enable_modules = 'CONFIG_MODULES' in config_host
Paolo Bonzini35be72b2020-02-06 14:17:15 +010018enable_static = 'CONFIG_STATIC' in config_host
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +020019build_docs = 'BUILD_DOCS' in config_host
Marc-André Lureauab4c0992020-08-26 15:04:16 +040020qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
Marc-André Lureau491e74c2020-08-26 15:04:17 +040021qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
Paolo Bonzini859aef02020-08-04 18:14:26 +020022config_host_data = configuration_data()
23genh = []
Paolo Bonzinia5665052019-06-10 12:05:14 +020024
Paolo Bonzini760e4322020-08-26 08:09:48 +020025target_dirs = config_host['TARGET_DIRS'].split()
26have_user = false
27have_system = false
28foreach target : target_dirs
29 have_user = have_user or target.endswith('-user')
30 have_system = have_system or target.endswith('-softmmu')
31endforeach
32have_tools = 'CONFIG_TOOLS' in config_host
33have_block = have_system or have_tools
34
Paolo Bonzini201e8ed2020-09-01 07:45:54 -040035python = import('python').find_installation()
36
37supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
38supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
39 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
40
41cpu = host_machine.cpu_family()
42targetos = host_machine.system()
43
44configure_file(input: files('scripts/ninjatool.py'),
45 output: 'ninjatool',
46 configuration: config_host)
47
48##################
49# Compiler flags #
50##################
51
Paolo Bonzinia5665052019-06-10 12:05:14 +020052add_project_arguments(config_host['QEMU_CFLAGS'].split(),
53 native: false, language: ['c', 'objc'])
54add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
55 native: false, language: 'cpp')
56add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
57 native: false, language: ['c', 'cpp', 'objc'])
58add_project_arguments(config_host['QEMU_INCLUDES'].split(),
59 language: ['c', 'cpp', 'objc'])
60
Marc-André Lureaufc929892019-07-13 01:47:54 +040061link_language = meson.get_external_property('link_language', 'cpp')
62if link_language == 'cpp'
63 add_languages('cpp', required: true, native: false)
64endif
Paolo Bonzinia5665052019-06-10 12:05:14 +020065if host_machine.system() == 'darwin'
66 add_languages('objc', required: false, native: false)
67endif
68
Paolo Bonzini968b4db2020-02-03 14:45:33 +010069if 'SPARSE_CFLAGS' in config_host
70 run_target('sparse',
71 command: [find_program('scripts/check_sparse.py'),
72 config_host['SPARSE_CFLAGS'].split(),
73 'compile_commands.json'])
74endif
75
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040076m = cc.find_library('m', required: false)
77util = cc.find_library('util', required: false)
Paolo Bonzini4a963372020-08-03 16:22:28 +020078winmm = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040079socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +040080version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +040081coref = []
82iokit = []
83cocoa = []
84hvf = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040085if targetos == 'windows'
86 socket = cc.find_library('ws2_32')
Paolo Bonzini4a963372020-08-03 16:22:28 +020087 winmm = cc.find_library('winmm')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +040088
89 win = import('windows')
90 version_res = win.compile_resources('version.rc',
91 depend_files: files('pc-bios/qemu-nsis.ico'),
92 include_directories: include_directories('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +040093elif targetos == 'darwin'
94 coref = dependency('appleframeworks', modules: 'CoreFoundation')
95 iokit = dependency('appleframeworks', modules: 'IOKit')
96 cocoa = dependency('appleframeworks', modules: 'Cocoa')
97 hvf = dependency('appleframeworks', modules: 'Hypervisor')
Paolo Bonzinicfad62f2020-08-09 23:47:45 +020098elif targetos == 'sunos'
99 socket = [cc.find_library('socket'),
100 cc.find_library('nsl'),
101 cc.find_library('resolv')]
102elif targetos == 'haiku'
103 socket = [cc.find_library('posix_error_mapper'),
104 cc.find_library('network'),
105 cc.find_library('bsd')]
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400106endif
107glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
108 link_args: config_host['GLIB_LIBS'].split())
109gio = not_found
110if 'CONFIG_GIO' in config_host
111 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
112 link_args: config_host['GIO_LIBS'].split())
113endif
114lttng = not_found
115if 'CONFIG_TRACE_UST' in config_host
116 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
117endif
118urcubp = not_found
119if 'CONFIG_TRACE_UST' in config_host
120 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
121endif
Daniel P. Berrangé46859d92020-09-01 14:30:49 +0100122gcrypt = not_found
123if 'CONFIG_GCRYPT' in config_host
124 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
125 link_args: config_host['GCRYPT_LIBS'].split())
126endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400127nettle = not_found
128if 'CONFIG_NETTLE' in config_host
129 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
130 link_args: config_host['NETTLE_LIBS'].split())
131endif
132gnutls = not_found
133if 'CONFIG_GNUTLS' in config_host
134 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
135 link_args: config_host['GNUTLS_LIBS'].split())
136endif
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200137pixman = not_found
138if have_system or have_tools
139 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
Paolo Bonzini1a949332020-08-31 06:27:00 -0400140 method: 'pkg-config', static: enable_static)
Paolo Bonzinib7612f42020-08-26 08:22:58 +0200141endif
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400142pam = not_found
143if 'CONFIG_AUTH_PAM' in config_host
144 pam = cc.find_library('pam')
145endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400146libaio = cc.find_library('aio', required: false)
Paolo Bonzini1ffb3bb2020-08-28 19:33:54 +0200147zlib = dependency('zlib', required: true, static: enable_static)
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400148linux_io_uring = not_found
149if 'CONFIG_LINUX_IO_URING' in config_host
150 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
151 link_args: config_host['LINUX_IO_URING_LIBS'].split())
152endif
153libxml2 = not_found
154if 'CONFIG_LIBXML2' in config_host
155 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
156 link_args: config_host['LIBXML2_LIBS'].split())
157endif
158libnfs = not_found
159if 'CONFIG_LIBNFS' in config_host
160 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
161endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400162libattr = not_found
163if 'CONFIG_ATTR' in config_host
164 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
165endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100166seccomp = not_found
167if 'CONFIG_SECCOMP' in config_host
168 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
169 link_args: config_host['SECCOMP_LIBS'].split())
170endif
171libcap_ng = not_found
172if 'CONFIG_LIBCAP_NG' in config_host
173 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
174endif
Paolo Bonzini1917ec62020-08-26 03:24:11 -0400175if get_option('xkbcommon').auto() and not have_system and not have_tools
176 xkbcommon = not_found
177else
178 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400179 method: 'pkg-config', static: enable_static)
Marc-André Lureauade60d42019-07-15 14:48:31 +0400180endif
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400181slirp = not_found
182if config_host.has_key('CONFIG_SLIRP')
183 slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
184 link_args: config_host['SLIRP_LIBS'].split())
185endif
186vde = not_found
187if config_host.has_key('CONFIG_VDE')
188 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
189endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200190pulse = not_found
191if 'CONFIG_LIBPULSE' in config_host
192 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
193 link_args: config_host['PULSE_LIBS'].split())
194endif
195alsa = not_found
196if 'CONFIG_ALSA' in config_host
197 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
198 link_args: config_host['ALSA_LIBS'].split())
199endif
200jack = not_found
201if 'CONFIG_LIBJACK' in config_host
202 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
203endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200204spice = not_found
205if 'CONFIG_SPICE' in config_host
206 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
207 link_args: config_host['SPICE_LIBS'].split())
208endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400209rt = cc.find_library('rt', required: false)
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400210libmpathpersist = not_found
211if config_host.has_key('CONFIG_MPATH')
212 libmpathpersist = cc.find_library('mpathpersist')
213endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200214libiscsi = not_found
215if 'CONFIG_LIBISCSI' in config_host
216 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
217 link_args: config_host['LIBISCSI_LIBS'].split())
218endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400219zstd = not_found
220if 'CONFIG_ZSTD' in config_host
221 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
222 link_args: config_host['ZSTD_LIBS'].split())
223endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400224gbm = not_found
225if 'CONFIG_GBM' in config_host
226 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
227 link_args: config_host['GBM_LIBS'].split())
228endif
229virgl = not_found
230if 'CONFIG_VIRGL' in config_host
231 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
232 link_args: config_host['VIRGL_LIBS'].split())
233endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400234curl = not_found
235if 'CONFIG_CURL' in config_host
236 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
237 link_args: config_host['CURL_LIBS'].split())
238endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200239libudev = not_found
240if 'CONFIG_LIBUDEV' in config_host
241 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
242endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200243brlapi = not_found
244if 'CONFIG_BRLAPI' in config_host
245 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
246endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100247
Paolo Bonzini760e4322020-08-26 08:09:48 +0200248sdl = not_found
249if have_system
Yonggang Luo363743d2020-08-26 23:10:03 +0800250 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
Paolo Bonzini760e4322020-08-26 08:09:48 +0200251 sdl_image = not_found
252endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100253if sdl.found()
254 # work around 2.0.8 bug
255 sdl = declare_dependency(compile_args: '-Wno-undef',
256 dependencies: sdl)
Volker Rümelin7161a432020-08-29 12:41:58 +0200257 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400258 method: 'pkg-config', static: enable_static)
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100259else
260 if get_option('sdl_image').enabled()
261 error('sdl-image required, but SDL was @0@',
262 get_option('sdl').disabled() ? 'disabled' : 'not found')
263 endif
264 sdl_image = not_found
Paolo Bonzini26347332019-07-29 15:40:07 +0200265endif
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100266
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400267rbd = not_found
268if 'CONFIG_RBD' in config_host
269 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
270endif
271glusterfs = not_found
272if 'CONFIG_GLUSTERFS' in config_host
273 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
274 link_args: config_host['GLUSTERFS_LIBS'].split())
275endif
276libssh = not_found
277if 'CONFIG_LIBSSH' in config_host
278 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
279 link_args: config_host['LIBSSH_LIBS'].split())
280endif
281libbzip2 = not_found
282if 'CONFIG_BZIP2' in config_host
283 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
284endif
285liblzfse = not_found
286if 'CONFIG_LZFSE' in config_host
287 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
288endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200289oss = not_found
290if 'CONFIG_AUDIO_OSS' in config_host
291 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
292endif
293dsound = not_found
294if 'CONFIG_AUDIO_DSOUND' in config_host
295 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
296endif
297coreaudio = not_found
298if 'CONFIG_AUDIO_COREAUDIO' in config_host
299 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
300endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400301opengl = not_found
302if 'CONFIG_OPENGL' in config_host
303 opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
304else
305endif
306gtk = not_found
307if 'CONFIG_GTK' in config_host
308 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
309 link_args: config_host['GTK_LIBS'].split())
310endif
311vte = not_found
312if 'CONFIG_VTE' in config_host
313 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
314 link_args: config_host['VTE_LIBS'].split())
315endif
316x11 = not_found
317if 'CONFIG_X11' in config_host
318 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
319 link_args: config_host['X11_LIBS'].split())
320endif
321curses = not_found
322if 'CONFIG_CURSES' in config_host
323 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
324 link_args: config_host['CURSES_LIBS'].split())
325endif
326iconv = not_found
327if 'CONFIG_ICONV' in config_host
328 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
329 link_args: config_host['ICONV_LIBS'].split())
330endif
331gio = not_found
332if 'CONFIG_GIO' in config_host
333 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
334 link_args: config_host['GIO_LIBS'].split())
335endif
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100336vnc = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400337png = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400338jpeg = not_found
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400339sasl = not_found
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100340if get_option('vnc').enabled()
341 vnc = declare_dependency() # dummy dependency
342 png = dependency('libpng', required: get_option('vnc_png'),
Paolo Bonzini1a949332020-08-31 06:27:00 -0400343 method: 'pkg-config', static: enable_static)
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100344 jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
345 required: get_option('vnc_jpeg'),
346 static: enable_static)
347 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
348 required: get_option('vnc_sasl'),
349 static: enable_static)
350 if sasl.found()
351 sasl = declare_dependency(dependencies: sasl,
352 compile_args: '-DSTRUCT_IOVEC_DEFINED')
353 endif
Marc-André Lureau2b1ccdf2019-07-16 23:21:02 +0400354endif
Paolo Bonzini4a963372020-08-03 16:22:28 +0200355fdt = not_found
356if 'CONFIG_FDT' in config_host
357 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
358 link_args: config_host['FDT_LIBS'].split())
359endif
Marc-André Lureau708eab42019-09-03 16:59:33 +0400360snappy = not_found
361if 'CONFIG_SNAPPY' in config_host
362 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
363endif
364lzo = not_found
365if 'CONFIG_LZO' in config_host
366 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
367endif
Marc-André Lureau55166232019-07-24 19:16:22 +0400368rdma = not_found
369if 'CONFIG_RDMA' in config_host
370 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
371endif
Marc-André Lureauab318052019-07-24 19:23:16 +0400372numa = not_found
373if 'CONFIG_NUMA' in config_host
374 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
375endif
Marc-André Lureau582ea952019-08-15 15:15:32 +0400376xen = not_found
377if 'CONFIG_XEN_BACKEND' in config_host
378 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
379 link_args: config_host['XEN_LIBS'].split())
380endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200381cacard = not_found
382if 'CONFIG_SMARTCARD' in config_host
383 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
384 link_args: config_host['SMARTCARD_LIBS'].split())
385endif
César Belley0a40bcb2020-08-26 13:42:04 +0200386u2f = not_found
387if have_system
388 u2f = dependency('u2f-emu', required: get_option('u2f'),
389 method: 'pkg-config',
390 static: enable_static)
391endif
Paolo Bonzini06677ce2020-08-06 13:07:39 +0200392usbredir = not_found
393if 'CONFIG_USB_REDIR' in config_host
394 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
395 link_args: config_host['USB_REDIR_LIBS'].split())
396endif
397libusb = not_found
398if 'CONFIG_USB_LIBUSB' in config_host
399 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
400 link_args: config_host['LIBUSB_LIBS'].split())
401endif
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400402capstone = not_found
403if 'CONFIG_CAPSTONE' in config_host
404 capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(),
405 link_args: config_host['CAPSTONE_LIBS'].split())
406endif
407libpmem = not_found
408if 'CONFIG_LIBPMEM' in config_host
409 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
410 link_args: config_host['LIBPMEM_LIBS'].split())
411endif
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600412libdaxctl = not_found
413if 'CONFIG_LIBDAXCTL' in config_host
414 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
415endif
Marc-André Lureau8ce0a452020-08-28 15:07:20 +0400416tasn1 = not_found
417if 'CONFIG_TASN1' in config_host
418 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
419 link_args: config_host['TASN1_LIBS'].split())
420endif
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400421keyutils = dependency('libkeyutils', required: false,
422 method: 'pkg-config', static: enable_static)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400423
Marc-André Lureau3909def2020-08-28 15:07:33 +0400424has_gettid = cc.has_function('gettid')
425
Paolo Bonzini859aef02020-08-04 18:14:26 +0200426# Create config-host.h
427
Paolo Bonzini35be72b2020-02-06 14:17:15 +0100428config_host_data.set('CONFIG_SDL', sdl.found())
429config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
Paolo Bonzinia0b93232020-02-06 15:48:52 +0100430config_host_data.set('CONFIG_VNC', vnc.found())
431config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
432config_host_data.set('CONFIG_VNC_PNG', png.found())
433config_host_data.set('CONFIG_VNC_SASL', sasl.found())
Laurent Vivier4113f4c2020-08-24 17:24:29 +0200434config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
Marc-André Lureauaf04e892020-08-28 15:07:25 +0400435config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
Marc-André Lureau3909def2020-08-28 15:07:33 +0400436config_host_data.set('CONFIG_GETTID', has_gettid)
Paolo Bonzini859aef02020-08-04 18:14:26 +0200437config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
438config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
439config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
440config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
441
442arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
443strings = ['HOST_DSOSUF', 'CONFIG_IASL', 'qemu_confdir', 'qemu_datadir',
444 'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
445 'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath']
446foreach k, v: config_host
447 if arrays.contains(k)
448 if v != ''
449 v = '"' + '", "'.join(v.split()) + '", '
450 endif
451 config_host_data.set(k, v)
452 elif k == 'ARCH'
453 config_host_data.set('HOST_' + v.to_upper(), 1)
454 elif strings.contains(k)
455 if not k.startswith('CONFIG_')
456 k = 'CONFIG_' + k.to_upper()
457 endif
458 config_host_data.set_quoted(k, v)
459 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
460 config_host_data.set(k, v == 'y' ? 1 : v)
461 endif
462endforeach
463genh += configure_file(output: 'config-host.h', configuration: config_host_data)
464
Paolo Bonzini2becc362020-02-03 11:42:03 +0100465minikconf = find_program('scripts/minikconf.py')
Paolo Bonzinia98006b2020-09-01 05:32:23 -0400466config_all_devices = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400467config_all_disas = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100468config_devices_mak_list = []
469config_devices_h = {}
Paolo Bonzini859aef02020-08-04 18:14:26 +0200470config_target_h = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100471config_target_mak = {}
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400472
473disassemblers = {
474 'alpha' : ['CONFIG_ALPHA_DIS'],
475 'arm' : ['CONFIG_ARM_DIS'],
476 'avr' : ['CONFIG_AVR_DIS'],
477 'cris' : ['CONFIG_CRIS_DIS'],
478 'hppa' : ['CONFIG_HPPA_DIS'],
479 'i386' : ['CONFIG_I386_DIS'],
480 'x86_64' : ['CONFIG_I386_DIS'],
481 'x32' : ['CONFIG_I386_DIS'],
482 'lm32' : ['CONFIG_LM32_DIS'],
483 'm68k' : ['CONFIG_M68K_DIS'],
484 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
485 'mips' : ['CONFIG_MIPS_DIS'],
486 'moxie' : ['CONFIG_MOXIE_DIS'],
487 'nios2' : ['CONFIG_NIOS2_DIS'],
488 'or1k' : ['CONFIG_OPENRISC_DIS'],
489 'ppc' : ['CONFIG_PPC_DIS'],
490 'riscv' : ['CONFIG_RISCV_DIS'],
491 'rx' : ['CONFIG_RX_DIS'],
492 's390' : ['CONFIG_S390_DIS'],
493 'sh4' : ['CONFIG_SH4_DIS'],
494 'sparc' : ['CONFIG_SPARC_DIS'],
495 'xtensa' : ['CONFIG_XTENSA_DIS'],
496}
497if link_language == 'cpp'
498 disassemblers += {
499 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
500 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
501 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
502 }
503endif
504
Paolo Bonzini2becc362020-02-03 11:42:03 +0100505kconfig_external_symbols = [
506 'CONFIG_KVM',
507 'CONFIG_XEN',
508 'CONFIG_TPM',
509 'CONFIG_SPICE',
510 'CONFIG_IVSHMEM',
511 'CONFIG_OPENGL',
512 'CONFIG_X11',
513 'CONFIG_VHOST_USER',
514 'CONFIG_VHOST_KERNEL',
515 'CONFIG_VIRTFS',
516 'CONFIG_LINUX',
517 'CONFIG_PVRDMA',
518]
Paolo Bonzini859aef02020-08-04 18:14:26 +0200519ignored = ['TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_DIRS']
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400520
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400521foreach target : target_dirs
Paolo Bonzini859aef02020-08-04 18:14:26 +0200522 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak')
523
Paolo Bonzinica0fc782020-09-01 06:04:28 -0400524 foreach k, v: disassemblers
525 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
526 foreach sym: v
527 config_target += { sym: 'y' }
528 config_all_disas += { sym: 'y' }
529 endforeach
530 endif
531 endforeach
532
Paolo Bonzini859aef02020-08-04 18:14:26 +0200533 config_target_data = configuration_data()
534 foreach k, v: config_target
535 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
536 # do nothing
537 elif ignored.contains(k)
538 # do nothing
539 elif k == 'TARGET_BASE_ARCH'
540 config_target_data.set('TARGET_' + v.to_upper(), 1)
541 elif k == 'TARGET_NAME'
542 config_target_data.set_quoted(k, v)
543 elif v == 'y'
544 config_target_data.set(k, 1)
545 else
546 config_target_data.set(k, v)
547 endif
548 endforeach
549 config_target_h += {target: configure_file(output: target + '-config-target.h',
550 configuration: config_target_data)}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100551
552 if target.endswith('-softmmu')
Paolo Bonzini2becc362020-02-03 11:42:03 +0100553 base_kconfig = []
554 foreach sym : kconfig_external_symbols
Paolo Bonzini859aef02020-08-04 18:14:26 +0200555 if sym in config_target or sym in config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +0100556 base_kconfig += '@0@=y'.format(sym)
557 endif
558 endforeach
559
560 config_devices_mak = target + '-config-devices.mak'
561 config_devices_mak = configure_file(
562 input: ['default-configs' / target + '.mak', 'Kconfig'],
563 output: config_devices_mak,
564 depfile: config_devices_mak + '.d',
565 capture: true,
566 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
567 config_devices_mak, '@DEPFILE@', '@INPUT@',
568 base_kconfig])
Paolo Bonzini859aef02020-08-04 18:14:26 +0200569
570 config_devices_data = configuration_data()
571 config_devices = keyval.load(config_devices_mak)
572 foreach k, v: config_devices
573 config_devices_data.set(k, 1)
574 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +0100575 config_devices_mak_list += config_devices_mak
Paolo Bonzini859aef02020-08-04 18:14:26 +0200576 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
577 configuration: config_devices_data)}
578 config_target += config_devices
Paolo Bonzinia98006b2020-09-01 05:32:23 -0400579 config_all_devices += config_devices
Paolo Bonzini2becc362020-02-03 11:42:03 +0100580 endif
581 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400582endforeach
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400583
Paolo Bonzini2becc362020-02-03 11:42:03 +0100584# This configuration is used to build files that are shared by
585# multiple binaries, and then extracted out of the "common"
586# static_library target.
587#
588# We do not use all_sources()/all_dependencies(), because it would
589# build literally all source files, including devices only used by
590# targets that are not built for this compilation. The CONFIG_ALL
591# pseudo symbol replaces it.
592
Paolo Bonzini2becc362020-02-03 11:42:03 +0100593config_all = config_all_devices
594config_all += config_host
595config_all += config_all_disas
596config_all += {
597 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
598 'CONFIG_SOFTMMU': have_system,
599 'CONFIG_USER_ONLY': have_user,
600 'CONFIG_ALL': true,
601}
602
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400603# Generators
604
Marc-André Lureau3f885652019-07-15 18:06:04 +0400605hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +0400606shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400607qapi_gen = find_program('scripts/qapi-gen.py')
608qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
609 meson.source_root() / 'scripts/qapi/commands.py',
610 meson.source_root() / 'scripts/qapi/common.py',
611 meson.source_root() / 'scripts/qapi/doc.py',
612 meson.source_root() / 'scripts/qapi/error.py',
613 meson.source_root() / 'scripts/qapi/events.py',
614 meson.source_root() / 'scripts/qapi/expr.py',
615 meson.source_root() / 'scripts/qapi/gen.py',
616 meson.source_root() / 'scripts/qapi/introspect.py',
617 meson.source_root() / 'scripts/qapi/parser.py',
618 meson.source_root() / 'scripts/qapi/schema.py',
619 meson.source_root() / 'scripts/qapi/source.py',
620 meson.source_root() / 'scripts/qapi/types.py',
621 meson.source_root() / 'scripts/qapi/visit.py',
622 meson.source_root() / 'scripts/qapi/common.py',
623 meson.source_root() / 'scripts/qapi/doc.py',
624 meson.source_root() / 'scripts/qapi-gen.py'
625]
626
627tracetool = [
628 python, files('scripts/tracetool.py'),
629 '--backend=' + config_host['TRACE_BACKENDS']
630]
631
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400632qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
633 meson.current_source_dir(),
Paolo Bonzini859aef02020-08-04 18:14:26 +0200634 config_host['PKGVERSION'], meson.project_version()]
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400635qemu_version = custom_target('qemu-version.h',
636 output: 'qemu-version.h',
637 command: qemu_version_cmd,
638 capture: true,
639 build_by_default: true,
640 build_always_stale: true)
641genh += qemu_version
642
Marc-André Lureau3f885652019-07-15 18:06:04 +0400643hxdep = []
644hx_headers = [
645 ['qemu-options.hx', 'qemu-options.def'],
646 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
647]
648if have_system
649 hx_headers += [
650 ['hmp-commands.hx', 'hmp-commands.h'],
651 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
652 ]
653endif
654foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400655 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +0400656 input: files(d[0]),
657 output: d[1],
658 capture: true,
659 build_by_default: true, # to be removed when added to a target
660 command: [hxtool, '-h', '@INPUT0@'])
661endforeach
662genh += hxdep
663
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400664# Collect sourcesets.
665
666util_ss = ss.source_set()
667stub_ss = ss.source_set()
668trace_ss = ss.source_set()
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400669block_ss = ss.source_set()
Paolo Bonzini4a963372020-08-03 16:22:28 +0200670blockdev_ss = ss.source_set()
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200671qmp_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +0100672common_ss = ss.source_set()
673softmmu_ss = ss.source_set()
674user_ss = ss.source_set()
675bsd_user_ss = ss.source_set()
676linux_user_ss = ss.source_set()
677specific_ss = ss.source_set()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200678specific_fuzz_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +0100679
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400680modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100681hw_arch = {}
682target_arch = {}
683target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400684
685###############
686# Trace files #
687###############
688
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400689# TODO: add each directory to the subdirs from its own meson.build, once
690# we have those
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400691trace_events_subdirs = [
692 'accel/kvm',
693 'accel/tcg',
694 'crypto',
695 'monitor',
696]
697if have_user
698 trace_events_subdirs += [ 'linux-user' ]
699endif
700if have_block
701 trace_events_subdirs += [
702 'authz',
703 'block',
704 'io',
705 'nbd',
706 'scsi',
707 ]
708endif
709if have_system
710 trace_events_subdirs += [
711 'audio',
712 'backends',
713 'backends/tpm',
714 'chardev',
715 'hw/9pfs',
716 'hw/acpi',
717 'hw/alpha',
718 'hw/arm',
719 'hw/audio',
720 'hw/block',
721 'hw/block/dataplane',
722 'hw/char',
723 'hw/display',
724 'hw/dma',
725 'hw/hppa',
726 'hw/hyperv',
727 'hw/i2c',
728 'hw/i386',
729 'hw/i386/xen',
730 'hw/ide',
731 'hw/input',
732 'hw/intc',
733 'hw/isa',
734 'hw/mem',
735 'hw/mips',
736 'hw/misc',
737 'hw/misc/macio',
738 'hw/net',
739 'hw/nvram',
740 'hw/pci',
741 'hw/pci-host',
742 'hw/ppc',
743 'hw/rdma',
744 'hw/rdma/vmw',
745 'hw/rtc',
746 'hw/s390x',
747 'hw/scsi',
748 'hw/sd',
749 'hw/sparc',
750 'hw/sparc64',
751 'hw/ssi',
752 'hw/timer',
753 'hw/tpm',
754 'hw/usb',
755 'hw/vfio',
756 'hw/virtio',
757 'hw/watchdog',
758 'hw/xen',
759 'hw/gpio',
760 'hw/riscv',
761 'migration',
762 'net',
763 'ui',
764 ]
765endif
766trace_events_subdirs += [
767 'hw/core',
768 'qapi',
769 'qom',
770 'target/arm',
771 'target/hppa',
772 'target/i386',
773 'target/mips',
774 'target/ppc',
775 'target/riscv',
776 'target/s390x',
777 'target/sparc',
778 'util',
779]
780
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400781subdir('qapi')
782subdir('qobject')
783subdir('stubs')
784subdir('trace')
785subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +0400786subdir('qom')
787subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400788subdir('crypto')
Marc-André Lureau2d78b562019-07-15 16:00:36 +0400789subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400790
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400791
792if enable_modules
793 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
794 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
795endif
796
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400797# Build targets from sourcesets
798
Paolo Bonzini2becc362020-02-03 11:42:03 +0100799stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400800
801util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +0100802util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400803libqemuutil = static_library('qemuutil',
804 sources: util_ss.sources() + stub_ss.sources() + genh,
805 dependencies: [util_ss.dependencies(), m, glib, socket])
806qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400807 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400808
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200809decodetree = generator(find_program('scripts/decodetree.py'),
810 output: 'decode-@BASENAME@.c.inc',
811 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
812
Paolo Bonzini478e9432020-08-17 12:47:55 +0200813subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +0400814subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +0400815subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400816subdir('fsdev')
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200817subdir('libdecnumber')
Marc-André Lureaud3b18482019-08-17 14:55:32 +0400818subdir('target')
Marc-André Lureau708eab42019-09-03 16:59:33 +0400819subdir('dump')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400820
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400821block_ss.add(files(
822 'block.c',
823 'blockjob.c',
824 'job.c',
825 'qemu-io-cmds.c',
826))
827block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
828
829subdir('nbd')
830subdir('scsi')
831subdir('block')
832
Paolo Bonzini4a963372020-08-03 16:22:28 +0200833blockdev_ss.add(files(
834 'blockdev.c',
835 'blockdev-nbd.c',
836 'iothread.c',
837 'job-qmp.c',
838))
839
840# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
841# os-win32.c does not
842blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
843softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
844
845softmmu_ss.add_all(blockdev_ss)
846softmmu_ss.add(files(
847 'bootdevice.c',
848 'dma-helpers.c',
849 'qdev-monitor.c',
850), sdl)
851
852softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
853softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
854softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
855
856common_ss.add(files('cpus-common.c'))
857
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +0200858subdir('softmmu')
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400859
Bruce Rogersc7c91a72020-08-24 09:52:12 -0600860specific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem, libdaxctl)
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400861specific_ss.add(files('exec-vary.c'))
862specific_ss.add(when: 'CONFIG_TCG', if_true: files(
863 'fpu/softfloat.c',
864 'tcg/optimize.c',
865 'tcg/tcg-common.c',
866 'tcg/tcg-op-gvec.c',
867 'tcg/tcg-op-vec.c',
868 'tcg/tcg-op.c',
869 'tcg/tcg.c',
870))
871specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
872
Marc-André Lureauab318052019-07-24 19:23:16 +0400873subdir('backends')
Marc-André Lureauc574e162019-07-26 12:02:31 +0400874subdir('disas')
Marc-André Lureau55166232019-07-24 19:16:22 +0400875subdir('migration')
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200876subdir('monitor')
Marc-André Lureaucdaf0722019-07-22 23:47:50 +0400877subdir('net')
Marc-André Lureau17ef2af2019-07-22 23:40:45 +0400878subdir('replay')
Marc-André Lureau582ea952019-08-15 15:15:32 +0400879subdir('hw')
Marc-André Lureau1a828782019-08-18 16:13:08 +0400880subdir('accel')
Paolo Bonzinif556b4a2020-01-24 13:08:01 +0100881subdir('plugins')
Marc-André Lureaub309c322019-08-18 19:20:37 +0400882subdir('bsd-user')
Marc-André Lureau3a304462019-08-18 16:13:08 +0400883subdir('linux-user')
884
Marc-André Lureaub309c322019-08-18 19:20:37 +0400885bsd_user_ss.add(files('gdbstub.c'))
886specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
887
Marc-André Lureau3a304462019-08-18 16:13:08 +0400888linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
889specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
Paolo Bonzini5d3ea0e2020-08-06 13:40:26 +0200890
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +0200891# needed for fuzzing binaries
892subdir('tests/qtest/libqos')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200893subdir('tests/qtest/fuzz')
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +0200894
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400895block_mods = []
896softmmu_mods = []
897foreach d, list : modules
898 foreach m, module_ss : list
899 if enable_modules and targetos != 'windows'
900 module_ss = module_ss.apply(config_host, strict: false)
901 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
902 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
903 if d == 'block'
904 block_mods += sl
905 else
906 softmmu_mods += sl
907 endif
908 else
909 if d == 'block'
910 block_ss.add_all(module_ss)
911 else
912 softmmu_ss.add_all(module_ss)
913 endif
914 endif
915 endforeach
916endforeach
917
918nm = find_program('nm')
919undefsym = find_program('scripts/undefsym.sh')
920block_syms = custom_target('block.syms', output: 'block.syms',
921 input: [libqemuutil, block_mods],
922 capture: true,
923 command: [undefsym, nm, '@INPUT@'])
924qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
925 input: [libqemuutil, softmmu_mods],
926 capture: true,
927 command: [undefsym, nm, '@INPUT@'])
928
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400929block_ss = block_ss.apply(config_host, strict: false)
930libblock = static_library('block', block_ss.sources() + genh,
931 dependencies: block_ss.dependencies(),
932 link_depends: block_syms,
933 name_suffix: 'fa',
934 build_by_default: false)
935
936block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400937 link_args: '@block.syms',
938 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400939
Paolo Bonziniff219dc2020-08-04 21:14:26 +0200940qmp_ss = qmp_ss.apply(config_host, strict: false)
941libqmp = static_library('qmp', qmp_ss.sources() + genh,
942 dependencies: qmp_ss.dependencies(),
943 name_suffix: 'fa',
944 build_by_default: false)
945
946qmp = declare_dependency(link_whole: [libqmp])
947
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400948foreach m : block_mods + softmmu_mods
949 shared_module(m.name(),
950 name_prefix: '',
951 link_whole: m,
952 install: true,
953 install_dir: config_host['qemu_moddir'])
954endforeach
955
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200956softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
957common_ss.add(qom, qemuutil)
958
959common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
Paolo Bonzini2becc362020-02-03 11:42:03 +0100960common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
961
962common_all = common_ss.apply(config_all, strict: false)
963common_all = static_library('common',
964 build_by_default: false,
965 sources: common_all.sources() + genh,
966 dependencies: common_all.dependencies(),
967 name_suffix: 'fa')
968
Marc-André Lureauc9322ab2019-08-18 19:51:17 +0400969feature_to_c = find_program('scripts/feature_to_c.sh')
970
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200971emulators = []
Paolo Bonzini2becc362020-02-03 11:42:03 +0100972foreach target : target_dirs
973 config_target = config_target_mak[target]
974 target_name = config_target['TARGET_NAME']
975 arch = config_target['TARGET_BASE_ARCH']
Paolo Bonzini859aef02020-08-04 18:14:26 +0200976 arch_srcs = [config_target_h[target]]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200977 arch_deps = []
978 c_args = ['-DNEED_CPU_H',
979 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
980 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
981 link_args = []
Paolo Bonzini2becc362020-02-03 11:42:03 +0100982
Paolo Bonzini859aef02020-08-04 18:14:26 +0200983 config_target += config_host
Paolo Bonzini2becc362020-02-03 11:42:03 +0100984 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
985 if targetos == 'linux'
986 target_inc += include_directories('linux-headers', is_system: true)
987 endif
988 if target.endswith('-softmmu')
989 qemu_target_name = 'qemu-system-' + target_name
990 target_type='system'
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200991 t = target_softmmu_arch[arch].apply(config_target, strict: false)
992 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200993 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +0200994
Marc-André Lureau2c442202019-08-17 13:55:58 +0400995 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
996 hw = hw_arch[hw_dir].apply(config_target, strict: false)
997 arch_srcs += hw.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +0200998 arch_deps += hw.dependencies()
Marc-André Lureau2c442202019-08-17 13:55:58 +0400999
Paolo Bonzini2becc362020-02-03 11:42:03 +01001000 arch_srcs += config_devices_h[target]
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001001 link_args += ['@block.syms', '@qemu.syms']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001002 else
Marc-André Lureau3a304462019-08-18 16:13:08 +04001003 abi = config_target['TARGET_ABI_DIR']
Paolo Bonzini2becc362020-02-03 11:42:03 +01001004 target_type='user'
1005 qemu_target_name = 'qemu-' + target_name
1006 if 'CONFIG_LINUX_USER' in config_target
1007 base_dir = 'linux-user'
1008 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1009 else
1010 base_dir = 'bsd-user'
1011 endif
1012 target_inc += include_directories(
1013 base_dir,
Marc-André Lureau3a304462019-08-18 16:13:08 +04001014 base_dir / abi,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001015 )
Marc-André Lureau3a304462019-08-18 16:13:08 +04001016 if 'CONFIG_LINUX_USER' in config_target
1017 dir = base_dir / abi
1018 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1019 if config_target.has_key('TARGET_SYSTBL_ABI')
1020 arch_srcs += \
1021 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1022 extra_args : config_target['TARGET_SYSTBL_ABI'])
1023 endif
1024 endif
Paolo Bonzini2becc362020-02-03 11:42:03 +01001025 endif
1026
Marc-André Lureauc9322ab2019-08-18 19:51:17 +04001027 if 'TARGET_XML_FILES' in config_target
1028 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1029 output: target + '-gdbstub-xml.c',
1030 input: files(config_target['TARGET_XML_FILES'].split()),
1031 command: [feature_to_c, '@INPUT@'],
1032 capture: true)
1033 arch_srcs += gdbstub_xml
1034 endif
1035
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001036 t = target_arch[arch].apply(config_target, strict: false)
1037 arch_srcs += t.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001038 arch_deps += t.dependencies()
Paolo Bonziniabff1ab2020-08-07 12:10:23 +02001039
Paolo Bonzini2becc362020-02-03 11:42:03 +01001040 target_common = common_ss.apply(config_target, strict: false)
1041 objects = common_all.extract_objects(target_common.sources())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001042 deps = target_common.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001043
Paolo Bonzini2becc362020-02-03 11:42:03 +01001044 target_specific = specific_ss.apply(config_target, strict: false)
1045 arch_srcs += target_specific.sources()
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001046 arch_deps += target_specific.dependencies()
Paolo Bonzini2becc362020-02-03 11:42:03 +01001047
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001048 lib = static_library('qemu-' + target,
Paolo Bonzini859aef02020-08-04 18:14:26 +02001049 sources: arch_srcs + genh,
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001050 dependencies: arch_deps,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001051 objects: objects,
1052 include_directories: target_inc,
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001053 c_args: c_args,
1054 build_by_default: false,
Paolo Bonzini2becc362020-02-03 11:42:03 +01001055 name_suffix: 'fa')
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001056
1057 if target.endswith('-softmmu')
1058 execs = [{
1059 'name': 'qemu-system-' + target_name,
1060 'gui': false,
1061 'sources': files('softmmu/main.c'),
1062 'dependencies': []
1063 }]
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001064 if targetos == 'windows' and (sdl.found() or gtk.found())
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001065 execs += [{
1066 'name': 'qemu-system-' + target_name + 'w',
1067 'gui': true,
1068 'sources': files('softmmu/main.c'),
1069 'dependencies': []
1070 }]
1071 endif
1072 if config_host.has_key('CONFIG_FUZZ')
1073 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1074 execs += [{
1075 'name': 'qemu-fuzz-' + target_name,
1076 'gui': false,
1077 'sources': specific_fuzz.sources(),
1078 'dependencies': specific_fuzz.dependencies(),
1079 'link_depends': [files('tests/qtest/fuzz/fork_fuzz.ld')],
1080 }]
1081 endif
1082 else
1083 execs = [{
1084 'name': 'qemu-' + target_name,
1085 'gui': false,
1086 'sources': [],
1087 'dependencies': []
1088 }]
1089 endif
1090 foreach exe: execs
1091 emulators += executable(exe['name'], exe['sources'],
1092 install: true,
1093 c_args: c_args,
1094 dependencies: arch_deps + deps + exe['dependencies'],
1095 objects: lib.extract_all_objects(recursive: true),
1096 link_language: link_language,
1097 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1098 link_args: link_args,
1099 gui_app: exe['gui'])
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001100
1101 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1102 foreach stp: [
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001103 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1104 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001105 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1106 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1107 ]
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001108 custom_target(exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001109 input: trace_events_all,
Stefan Hajnoczibd5f9732020-08-25 08:49:53 +02001110 output: exe['name'] + stp['ext'],
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001111 capture: true,
1112 install: stp['install'],
Marc-André Lureauab4c0992020-08-26 15:04:16 +04001113 install_dir: qemu_datadir / '../systemtap/tapset',
Marc-André Lureau10e1d262019-08-20 12:29:52 +04001114 command: [
1115 tracetool, '--group=all', '--format=' + stp['fmt'],
1116 '--binary=' + stp['bin'],
1117 '--target-name=' + target_name,
1118 '--target-type=' + target_type,
1119 '--probe-prefix=qemu.' + target_type + '.' + target_name,
1120 '@INPUT@',
1121 ])
1122 endforeach
1123 endif
Paolo Bonzini64ed6f92020-08-03 17:04:25 +02001124 endforeach
Paolo Bonzini2becc362020-02-03 11:42:03 +01001125endforeach
1126
Paolo Bonzini931049b2020-02-05 09:44:24 +01001127# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +04001128
Paolo Bonzinif556b4a2020-01-24 13:08:01 +01001129if 'CONFIG_PLUGIN' in config_host
1130 install_headers('include/qemu/qemu-plugin.h')
1131endif
1132
Paolo Bonzinif15bff22019-07-18 13:19:02 +02001133if 'CONFIG_GUEST_AGENT' in config_host
1134 subdir('qga')
1135endif
1136
Laurent Vivier9755c942020-08-24 17:24:30 +02001137# Don't build qemu-keymap if xkbcommon is not explicitly enabled
1138# when we don't build tools or system
Laurent Vivier4113f4c2020-08-24 17:24:29 +02001139if xkbcommon.found()
Marc-André Lureau28742462019-09-19 20:24:43 +04001140 # used for the update-keymaps target, so include rules even if !have_tools
1141 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1142 dependencies: [qemuutil, xkbcommon], install: have_tools)
1143endif
1144
Philippe Mathieu-Daudé8855e8f2020-08-21 17:05:56 +02001145qemu_block_tools = []
Paolo Bonzini931049b2020-02-05 09:44:24 +01001146if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001147 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1148 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1149 qemu_io = executable('qemu-io', files('qemu-io.c'),
1150 dependencies: [block, qemuutil], install: true)
Daniel P. Berrangéeb705982020-08-25 11:38:50 +01001151 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001152 dependencies: [block, qemuutil], install: true)
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +04001153
Paolo Bonzini7c58bb72020-08-04 20:18:36 +02001154 subdir('storage-daemon')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02001155 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +04001156 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +02001157
Marc-André Lureau157e7b12019-07-15 14:50:58 +04001158 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1159 dependencies: qemuutil,
1160 install: true)
1161
Paolo Bonzini931049b2020-02-05 09:44:24 +01001162 if 'CONFIG_VHOST_USER' in config_host
1163 subdir('contrib/libvhost-user')
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +02001164 subdir('contrib/vhost-user-blk')
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001165 subdir('contrib/vhost-user-gpu')
Marc-André Lureau32fcc622019-07-12 22:11:20 +04001166 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +02001167 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +01001168 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +04001169
1170 if targetos == 'linux'
1171 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1172 dependencies: [qemuutil, libcap_ng],
1173 install: true,
1174 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +04001175
1176 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1177 dependencies: [authz, crypto, io, qom, qemuutil,
1178 libcap_ng, libudev, libmpathpersist],
1179 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +04001180 endif
1181
Marc-André Lureau5ee24e72019-07-12 23:16:54 +04001182 if 'CONFIG_IVSHMEM' in config_host
1183 subdir('contrib/ivshmem-client')
1184 subdir('contrib/ivshmem-server')
1185 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +01001186endif
1187
Marc-André Lureauf5aa6322020-08-26 17:06:18 +04001188subdir('scripts')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001189subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +04001190subdir('pc-bios')
Paolo Bonzinice1c1e72020-01-28 16:41:44 +01001191subdir('tests')
Paolo Bonzinif8aa24e2020-08-05 15:49:10 +02001192subdir('docs')
Marc-André Lureaue8f3bd72019-09-19 21:02:09 +04001193if 'CONFIG_GTK' in config_host
1194 subdir('po')
1195endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +01001196
Paolo Bonziniacfdaac2020-08-05 13:07:48 +02001197if build_docs
1198 makeinfo = find_program('makeinfo', required: build_docs)
1199
1200 docs_inc = [
1201 '-I', meson.current_source_dir(),
1202 '-I', meson.current_build_dir() / 'docs',
1203 '-I', '@OUTDIR@',
1204 ]
1205
1206 version_texi = configure_file(output: 'version.texi',
1207 input: 'version.texi.in',
1208 configuration: {'VERSION': meson.project_version(),
1209 'qemu_confdir': config_host['qemu_confdir']})
1210
1211 texi = {
1212 'qemu-qmp-ref': ['docs/interop/qemu-qmp-ref.texi', qapi_doc_texi, version_texi],
1213 }
1214 if 'CONFIG_GUEST_AGENT' in config_host
1215 texi += {'qemu-ga-ref': ['docs/interop/qemu-ga-ref.texi', qga_qapi_doc_texi, version_texi]}
1216 endif
1217
1218 if makeinfo.found()
1219 cmd = [
1220 'env', 'LC_ALL=C', makeinfo, '--no-split', '--number-sections', docs_inc,
1221 '@INPUT0@', '-o', '@OUTPUT@',
1222 ]
1223 foreach ext, args: {
1224 'info': [],
1225 'html': ['--no-headers', '--html'],
1226 'txt': ['--no-headers', '--plaintext'],
1227 }
1228 t = []
1229 foreach doc, input: texi
1230 output = doc + '.' + ext
1231 t += custom_target(output,
1232 input: input,
1233 output: output,
1234 install: true,
Marc-André Lureau491e74c2020-08-26 15:04:17 +04001235 install_dir: qemu_docdir / 'interop',
Paolo Bonziniacfdaac2020-08-05 13:07:48 +02001236 command: cmd + args)
1237 endforeach
1238 alias_target(ext, t)
1239 endforeach
1240 endif
1241
1242 texi2pdf = find_program('texi2pdf', required: false)
1243
1244 if texi2pdf.found()
1245 pdfs = []
1246 foreach doc, input: texi
1247 output = doc + '.pdf'
1248 pdfs += custom_target(output,
1249 input: input,
1250 output: output,
1251 command: [texi2pdf, '-q', docs_inc, '@INPUT0@', '-o', '@OUTPUT@'],
1252 build_by_default: false)
1253 endforeach
1254 alias_target('pdf', pdfs)
1255 endif
1256
1257 texi2pod = find_program('scripts/texi2pod.pl')
1258 pod2man = find_program('pod2man', required: build_docs)
1259
1260 if pod2man.found()
1261 foreach doc, input: texi
1262 man = doc + '.7'
1263 pod = custom_target(man + '.pod',
1264 input: input,
1265 output: man + '.pod',
1266 command: [texi2pod,
1267 '-DVERSION="' + meson.project_version() + '"',
1268 '-DCONFDIR="' + config_host['qemu_confdir'] + '"',
1269 '@INPUT0@', '@OUTPUT@'])
1270 man = custom_target(man,
1271 input: pod,
1272 output: man,
1273 capture: true,
1274 install: true,
Marc-André Lureaub81efab2020-08-26 15:04:18 +04001275 install_dir: get_option('mandir') / 'man7',
Paolo Bonziniacfdaac2020-08-05 13:07:48 +02001276 command: [pod2man, '--utf8', '--section=7', '--center=" "',
1277 '--release=" "', '@INPUT@'])
1278 endforeach
1279 endif
1280endif
1281
Marc-André Lureau8adfeba2020-08-26 15:04:19 +04001282if host_machine.system() == 'windows'
1283 nsis_cmd = [
1284 find_program('scripts/nsis.py'),
1285 '@OUTPUT@',
1286 get_option('prefix'),
1287 meson.current_source_dir(),
1288 host_machine.cpu_family(),
1289 '--',
1290 '-DDISPLAYVERSION=' + meson.project_version(),
1291 ]
1292 if build_docs
1293 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
1294 endif
1295 if 'CONFIG_GTK' in config_host
1296 nsis_cmd += '-DCONFIG_GTK=y'
1297 endif
1298
1299 nsis = custom_target('nsis',
1300 output: 'qemu-setup-' + meson.project_version() + '.exe',
1301 input: files('qemu.nsi'),
1302 build_always_stale: true,
1303 command: nsis_cmd + ['@INPUT@'])
1304 alias_target('installer', nsis)
1305endif
1306
Paolo Bonzinif9332752020-02-03 13:28:38 +01001307summary_info = {}
1308summary_info += {'Install prefix': config_host['prefix']}
1309summary_info += {'BIOS directory': config_host['qemu_datadir']}
1310summary_info += {'firmware path': config_host['qemu_firmwarepath']}
1311summary_info += {'binary directory': config_host['bindir']}
1312summary_info += {'library directory': config_host['libdir']}
1313summary_info += {'module directory': config_host['qemu_moddir']}
1314summary_info += {'libexec directory': config_host['libexecdir']}
1315summary_info += {'include directory': config_host['includedir']}
1316summary_info += {'config directory': config_host['sysconfdir']}
1317if targetos != 'windows'
1318 summary_info += {'local state directory': config_host['qemu_localstatedir']}
Marc-André Lureaub81efab2020-08-26 15:04:18 +04001319 summary_info += {'Manual directory': get_option('mandir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001320else
1321 summary_info += {'local state directory': 'queried at runtime'}
1322endif
Marc-André Lureau491e74c2020-08-26 15:04:17 +04001323summary_info += {'Doc directory': get_option('docdir')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001324summary_info += {'Build directory': meson.current_build_dir()}
1325summary_info += {'Source path': meson.current_source_dir()}
1326summary_info += {'GIT binary': config_host['GIT']}
1327summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
1328summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
1329summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
1330if link_language == 'cpp'
1331 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
1332else
1333 summary_info += {'C++ compiler': false}
1334endif
1335if targetos == 'darwin'
1336 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1337endif
1338summary_info += {'ARFLAGS': config_host['ARFLAGS']}
1339summary_info += {'CFLAGS': config_host['CFLAGS']}
1340summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
1341summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
1342summary_info += {'make': config_host['MAKE']}
1343summary_info += {'install': config_host['INSTALL']}
1344summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1345summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
1346summary_info += {'genisoimage': config_host['GENISOIMAGE']}
1347# TODO: add back version
1348summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
1349if config_host.has_key('CONFIG_SLIRP')
1350 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
1351endif
1352summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
1353if config_host.has_key('CONFIG_MODULES')
1354 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1355endif
1356summary_info += {'host CPU': cpu}
1357summary_info += {'host endianness': build_machine.endian()}
1358summary_info += {'target list': config_host['TARGET_DIRS']}
1359summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
1360summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
1361summary_info += {'strip binaries': get_option('strip')}
1362summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
1363summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
1364if targetos == 'darwin'
1365 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1366endif
1367# TODO: add back version
Paolo Bonzini35be72b2020-02-06 14:17:15 +01001368summary_info += {'SDL support': sdl.found()}
1369summary_info += {'SDL image support': sdl_image.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001370# TODO: add back version
1371summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
1372summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
Paolo Bonzinib7612f42020-08-26 08:22:58 +02001373summary_info += {'pixman': pixman.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001374# TODO: add back version
1375summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
1376summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
1377summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
1378# TODO: add back version
1379summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
1380if config_host.has_key('CONFIG_GCRYPT')
1381 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
1382 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1383endif
1384# TODO: add back version
1385summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
1386if config_host.has_key('CONFIG_NETTLE')
1387 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1388endif
1389summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1390summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1391summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1392summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1393# TODO: add back version
1394summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1395summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1396summary_info += {'mingw32 support': targetos == 'windows'}
1397summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1398summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1399summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1400summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
1401summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
Paolo Bonzinia0b93232020-02-06 15:48:52 +01001402summary_info += {'VNC support': vnc.found()}
1403if vnc.found()
1404 summary_info += {'VNC SASL support': sasl.found()}
1405 summary_info += {'VNC JPEG support': jpeg.found()}
1406 summary_info += {'VNC PNG support': png.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001407endif
1408summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1409if config_host.has_key('CONFIG_XEN_BACKEND')
1410 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1411endif
1412summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1413summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1414summary_info += {'PIE': get_option('b_pie')}
1415summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1416summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1417summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1418summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1419summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1420summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1421# TODO: add back KVM/HAX/HVF/WHPX/TCG
1422#summary_info += {'KVM support': have_kvm'}
1423#summary_info += {'HAX support': have_hax'}
1424#summary_info += {'HVF support': have_hvf'}
1425#summary_info += {'WHPX support': have_whpx'}
1426#summary_info += {'TCG support': have_tcg'}
1427#if get_option('tcg')
1428# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1429# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1430#endif
1431summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1432summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1433summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1434summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
1435summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1436summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1437summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1438summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1439summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1440summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1441summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1442summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1443summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1444summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1445summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1446summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1447summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1448summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1449summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1450if config_host['TRACE_BACKENDS'].split().contains('simple')
1451 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1452endif
1453# TODO: add back protocol and server version
1454summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1455summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1456summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1457summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
César Belley0a40bcb2020-08-26 13:42:04 +02001458summary_info += {'U2F support': u2f.found()}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001459summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1460summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1461summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1462summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1463summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1464summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1465summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1466if targetos == 'windows'
1467 if 'WIN_SDK' in config_host
1468 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1469 endif
1470 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1471 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1472 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1473endif
1474summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1475summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1476summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1477summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1478summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1479summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1480summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +04001481summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +01001482summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1483summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1484summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1485summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1486summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1487summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1488summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1489summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1490summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1491summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1492summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1493summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1494summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1495summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1496summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1497summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1498summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1499summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1500summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1501summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1502summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1503summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1504summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1505summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1506summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1507summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1508summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1509summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1510summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1511summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1512summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1513summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1514if config_host.has_key('HAVE_GDB_BIN')
1515 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1516endif
1517summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1518summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1519summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1520summary(summary_info, bool_yn: true)
1521
1522if not supported_cpus.contains(cpu)
1523 message()
1524 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1525 message()
1526 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1527 message('The QEMU project intends to remove support for this host CPU in')
1528 message('a future release if nobody volunteers to maintain it and to')
1529 message('provide a build host for our continuous integration setup.')
1530 message('configure has succeeded and you can continue to build, but')
1531 message('if you care about QEMU on this platform you should contact')
1532 message('us upstream at qemu-devel@nongnu.org.')
1533endif
1534
1535if not supported_oses.contains(targetos)
1536 message()
1537 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1538 message()
1539 message('Host OS ' + targetos + 'support is not currently maintained.')
1540 message('The QEMU project intends to remove support for this host OS in')
1541 message('a future release if nobody volunteers to maintain it and to')
1542 message('provide a build host for our continuous integration setup.')
1543 message('configure has succeeded and you can continue to build, but')
1544 message('if you care about QEMU on this platform you should contact')
1545 message('us upstream at qemu-devel@nongnu.org.')
1546endif