blob: 1d301948b79ac479ecaf5ee57e7c587f0ef1423b [file] [log] [blame]
Paolo Bonzinia5665052019-06-10 12:05:14 +02001project('qemu', ['c'], meson_version: '>=0.55.0',
2 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_lundef=false'],
3 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
4
5not_found = dependency('', required: false)
6keyval = import('unstable-keyval')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04007ss = import('sourceset')
8
Paolo Bonzinice1c1e72020-01-28 16:41:44 +01009sh = find_program('sh')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040010cc = meson.get_compiler('c')
Paolo Bonzinia5665052019-06-10 12:05:14 +020011config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Paolo Bonzini2becc362020-02-03 11:42:03 +010012config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
Marc-André Lureau3154fee2019-08-29 22:07:01 +040013enable_modules = 'CONFIG_MODULES' in config_host
Paolo Bonzinia5665052019-06-10 12:05:14 +020014
15add_project_arguments(config_host['QEMU_CFLAGS'].split(),
16 native: false, language: ['c', 'objc'])
17add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
18 native: false, language: 'cpp')
19add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
20 native: false, language: ['c', 'cpp', 'objc'])
21add_project_arguments(config_host['QEMU_INCLUDES'].split(),
22 language: ['c', 'cpp', 'objc'])
23
Marc-André Lureaufc929892019-07-13 01:47:54 +040024python = import('python').find_installation()
25
26link_language = meson.get_external_property('link_language', 'cpp')
27if link_language == 'cpp'
28 add_languages('cpp', required: true, native: false)
29endif
Paolo Bonzinia5665052019-06-10 12:05:14 +020030if host_machine.system() == 'darwin'
31 add_languages('objc', required: false, native: false)
32endif
33
Paolo Bonzini968b4db2020-02-03 14:45:33 +010034if 'SPARSE_CFLAGS' in config_host
35 run_target('sparse',
36 command: [find_program('scripts/check_sparse.py'),
37 config_host['SPARSE_CFLAGS'].split(),
38 'compile_commands.json'])
39endif
40
Paolo Bonzinia5665052019-06-10 12:05:14 +020041configure_file(input: files('scripts/ninjatool.py'),
42 output: 'ninjatool',
43 configuration: config_host)
Paolo Bonzinif9332752020-02-03 13:28:38 +010044
45supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
46supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
47 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
48
49cpu = host_machine.cpu_family()
50targetos = host_machine.system()
51
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040052m = cc.find_library('m', required: false)
53util = cc.find_library('util', required: false)
54socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +040055version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +040056coref = []
57iokit = []
58cocoa = []
59hvf = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040060if targetos == 'windows'
61 socket = cc.find_library('ws2_32')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +040062
63 win = import('windows')
64 version_res = win.compile_resources('version.rc',
65 depend_files: files('pc-bios/qemu-nsis.ico'),
66 include_directories: include_directories('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +040067elif targetos == 'darwin'
68 coref = dependency('appleframeworks', modules: 'CoreFoundation')
69 iokit = dependency('appleframeworks', modules: 'IOKit')
70 cocoa = dependency('appleframeworks', modules: 'Cocoa')
71 hvf = dependency('appleframeworks', modules: 'Hypervisor')
Paolo Bonzinicfad62f2020-08-09 23:47:45 +020072elif targetos == 'sunos'
73 socket = [cc.find_library('socket'),
74 cc.find_library('nsl'),
75 cc.find_library('resolv')]
76elif targetos == 'haiku'
77 socket = [cc.find_library('posix_error_mapper'),
78 cc.find_library('network'),
79 cc.find_library('bsd')]
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040080endif
81glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
82 link_args: config_host['GLIB_LIBS'].split())
83gio = not_found
84if 'CONFIG_GIO' in config_host
85 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
86 link_args: config_host['GIO_LIBS'].split())
87endif
88lttng = not_found
89if 'CONFIG_TRACE_UST' in config_host
90 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
91endif
92urcubp = not_found
93if 'CONFIG_TRACE_UST' in config_host
94 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
95endif
96nettle = not_found
97if 'CONFIG_NETTLE' in config_host
98 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
99 link_args: config_host['NETTLE_LIBS'].split())
100endif
101gnutls = not_found
102if 'CONFIG_GNUTLS' in config_host
103 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
104 link_args: config_host['GNUTLS_LIBS'].split())
105endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400106pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
107 link_args: config_host['PIXMAN_LIBS'].split())
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400108pam = not_found
109if 'CONFIG_AUTH_PAM' in config_host
110 pam = cc.find_library('pam')
111endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400112libaio = cc.find_library('aio', required: false)
113zlib = not_found
114if 'CONFIG_ZLIB' in config_host
115 zlib = declare_dependency(compile_args: config_host['ZLIB_CFLAGS'].split(),
116 link_args: config_host['ZLIB_LIBS'].split())
117endif
118linux_io_uring = not_found
119if 'CONFIG_LINUX_IO_URING' in config_host
120 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
121 link_args: config_host['LINUX_IO_URING_LIBS'].split())
122endif
123libxml2 = not_found
124if 'CONFIG_LIBXML2' in config_host
125 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
126 link_args: config_host['LIBXML2_LIBS'].split())
127endif
128libnfs = not_found
129if 'CONFIG_LIBNFS' in config_host
130 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
131endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400132libattr = not_found
133if 'CONFIG_ATTR' in config_host
134 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
135endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100136seccomp = not_found
137if 'CONFIG_SECCOMP' in config_host
138 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
139 link_args: config_host['SECCOMP_LIBS'].split())
140endif
141libcap_ng = not_found
142if 'CONFIG_LIBCAP_NG' in config_host
143 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
144endif
Marc-André Lureauade60d42019-07-15 14:48:31 +0400145xkbcommon = not_found
146if 'CONFIG_XKBCOMMON' in config_host
147 xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(),
148 link_args: config_host['XKBCOMMON_LIBS'].split())
149endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400150rt = cc.find_library('rt', required: false)
Paolo Bonzini99650b62019-06-10 12:21:14 +0200151libiscsi = not_found
152if 'CONFIG_LIBISCSI' in config_host
153 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
154 link_args: config_host['LIBISCSI_LIBS'].split())
155endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400156zstd = not_found
157if 'CONFIG_ZSTD' in config_host
158 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
159 link_args: config_host['ZSTD_LIBS'].split())
160endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400161gbm = not_found
162if 'CONFIG_GBM' in config_host
163 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
164 link_args: config_host['GBM_LIBS'].split())
165endif
166virgl = not_found
167if 'CONFIG_VIRGL' in config_host
168 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
169 link_args: config_host['VIRGL_LIBS'].split())
170endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400171curl = not_found
172if 'CONFIG_CURL' in config_host
173 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
174 link_args: config_host['CURL_LIBS'].split())
175endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200176libudev = not_found
177if 'CONFIG_LIBUDEV' in config_host
178 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
179endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400180rbd = not_found
181if 'CONFIG_RBD' in config_host
182 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
183endif
184glusterfs = not_found
185if 'CONFIG_GLUSTERFS' in config_host
186 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
187 link_args: config_host['GLUSTERFS_LIBS'].split())
188endif
189libssh = not_found
190if 'CONFIG_LIBSSH' in config_host
191 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
192 link_args: config_host['LIBSSH_LIBS'].split())
193endif
194libbzip2 = not_found
195if 'CONFIG_BZIP2' in config_host
196 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
197endif
198liblzfse = not_found
199if 'CONFIG_LZFSE' in config_host
200 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
201endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400202
Paolo Bonzini2becc362020-02-03 11:42:03 +0100203create_config = find_program('scripts/create_config')
204minikconf = find_program('scripts/minikconf.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400205target_dirs = config_host['TARGET_DIRS'].split()
206have_user = false
207have_system = false
Paolo Bonzini2becc362020-02-03 11:42:03 +0100208config_devices_mak_list = []
209config_devices_h = {}
210config_target_mak = {}
211kconfig_external_symbols = [
212 'CONFIG_KVM',
213 'CONFIG_XEN',
214 'CONFIG_TPM',
215 'CONFIG_SPICE',
216 'CONFIG_IVSHMEM',
217 'CONFIG_OPENGL',
218 'CONFIG_X11',
219 'CONFIG_VHOST_USER',
220 'CONFIG_VHOST_KERNEL',
221 'CONFIG_VIRTFS',
222 'CONFIG_LINUX',
223 'CONFIG_PVRDMA',
224]
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400225foreach target : target_dirs
226 have_user = have_user or target.endswith('-user')
Paolo Bonzini2becc362020-02-03 11:42:03 +0100227 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
228
229 if target.endswith('-softmmu')
230 have_system = true
231
232 base_kconfig = []
233 foreach sym : kconfig_external_symbols
234 if sym in config_target
235 base_kconfig += '@0@=y'.format(sym)
236 endif
237 endforeach
238
239 config_devices_mak = target + '-config-devices.mak'
240 config_devices_mak = configure_file(
241 input: ['default-configs' / target + '.mak', 'Kconfig'],
242 output: config_devices_mak,
243 depfile: config_devices_mak + '.d',
244 capture: true,
245 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
246 config_devices_mak, '@DEPFILE@', '@INPUT@',
247 base_kconfig])
248 config_devices_h += {target: custom_target(
249 target + '-config-devices.h',
250 input: config_devices_mak,
251 output: target + '-config-devices.h',
252 capture: true,
253 command: [create_config, '@INPUT@'])}
254 config_devices_mak_list += config_devices_mak
255 config_target += keyval.load(config_devices_mak)
256 endif
257 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400258endforeach
259have_tools = 'CONFIG_TOOLS' in config_host
260have_block = have_system or have_tools
261
Paolo Bonzini2becc362020-02-03 11:42:03 +0100262grepy = find_program('scripts/grepy.sh')
263# This configuration is used to build files that are shared by
264# multiple binaries, and then extracted out of the "common"
265# static_library target.
266#
267# We do not use all_sources()/all_dependencies(), because it would
268# build literally all source files, including devices only used by
269# targets that are not built for this compilation. The CONFIG_ALL
270# pseudo symbol replaces it.
271
272if have_system
273 config_all_devices_mak = configure_file(
274 output: 'config-all-devices.mak',
275 input: config_devices_mak_list,
276 capture: true,
277 command: [grepy, '@INPUT@'],
278 )
279 config_all_devices = keyval.load(config_all_devices_mak)
280else
281 config_all_devices = {}
282endif
283config_all = config_all_devices
284config_all += config_host
285config_all += config_all_disas
286config_all += {
287 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
288 'CONFIG_SOFTMMU': have_system,
289 'CONFIG_USER_ONLY': have_user,
290 'CONFIG_ALL': true,
291}
292
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400293# Generators
294
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400295genh = []
Marc-André Lureau3f885652019-07-15 18:06:04 +0400296hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +0400297shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400298qapi_gen = find_program('scripts/qapi-gen.py')
299qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
300 meson.source_root() / 'scripts/qapi/commands.py',
301 meson.source_root() / 'scripts/qapi/common.py',
302 meson.source_root() / 'scripts/qapi/doc.py',
303 meson.source_root() / 'scripts/qapi/error.py',
304 meson.source_root() / 'scripts/qapi/events.py',
305 meson.source_root() / 'scripts/qapi/expr.py',
306 meson.source_root() / 'scripts/qapi/gen.py',
307 meson.source_root() / 'scripts/qapi/introspect.py',
308 meson.source_root() / 'scripts/qapi/parser.py',
309 meson.source_root() / 'scripts/qapi/schema.py',
310 meson.source_root() / 'scripts/qapi/source.py',
311 meson.source_root() / 'scripts/qapi/types.py',
312 meson.source_root() / 'scripts/qapi/visit.py',
313 meson.source_root() / 'scripts/qapi/common.py',
314 meson.source_root() / 'scripts/qapi/doc.py',
315 meson.source_root() / 'scripts/qapi-gen.py'
316]
317
318tracetool = [
319 python, files('scripts/tracetool.py'),
320 '--backend=' + config_host['TRACE_BACKENDS']
321]
322
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400323qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
324 meson.current_source_dir(),
325 config_host['PKGVERSION'], config_host['VERSION']]
326qemu_version = custom_target('qemu-version.h',
327 output: 'qemu-version.h',
328 command: qemu_version_cmd,
329 capture: true,
330 build_by_default: true,
331 build_always_stale: true)
332genh += qemu_version
333
Paolo Bonzini2becc362020-02-03 11:42:03 +0100334config_host_h = custom_target('config-host.h',
335 input: meson.current_build_dir() / 'config-host.mak',
336 output: 'config-host.h',
337 capture: true,
338 command: [create_config, '@INPUT@'])
339genh += config_host_h
340
Marc-André Lureau3f885652019-07-15 18:06:04 +0400341hxdep = []
342hx_headers = [
343 ['qemu-options.hx', 'qemu-options.def'],
344 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
345]
346if have_system
347 hx_headers += [
348 ['hmp-commands.hx', 'hmp-commands.h'],
349 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
350 ]
351endif
352foreach d : hx_headers
353 custom_target(d[1],
354 input: files(d[0]),
355 output: d[1],
356 capture: true,
357 build_by_default: true, # to be removed when added to a target
358 command: [hxtool, '-h', '@INPUT0@'])
359endforeach
360genh += hxdep
361
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400362# Collect sourcesets.
363
364util_ss = ss.source_set()
365stub_ss = ss.source_set()
366trace_ss = ss.source_set()
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400367block_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +0100368common_ss = ss.source_set()
369softmmu_ss = ss.source_set()
370user_ss = ss.source_set()
371bsd_user_ss = ss.source_set()
372linux_user_ss = ss.source_set()
373specific_ss = ss.source_set()
374
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400375modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100376hw_arch = {}
377target_arch = {}
378target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400379
380###############
381# Trace files #
382###############
383
384trace_events_subdirs = [
385 'accel/kvm',
386 'accel/tcg',
387 'crypto',
388 'monitor',
389]
390if have_user
391 trace_events_subdirs += [ 'linux-user' ]
392endif
393if have_block
394 trace_events_subdirs += [
395 'authz',
396 'block',
397 'io',
398 'nbd',
399 'scsi',
400 ]
401endif
402if have_system
403 trace_events_subdirs += [
404 'audio',
405 'backends',
406 'backends/tpm',
407 'chardev',
408 'hw/9pfs',
409 'hw/acpi',
410 'hw/alpha',
411 'hw/arm',
412 'hw/audio',
413 'hw/block',
414 'hw/block/dataplane',
415 'hw/char',
416 'hw/display',
417 'hw/dma',
418 'hw/hppa',
419 'hw/hyperv',
420 'hw/i2c',
421 'hw/i386',
422 'hw/i386/xen',
423 'hw/ide',
424 'hw/input',
425 'hw/intc',
426 'hw/isa',
427 'hw/mem',
428 'hw/mips',
429 'hw/misc',
430 'hw/misc/macio',
431 'hw/net',
432 'hw/nvram',
433 'hw/pci',
434 'hw/pci-host',
435 'hw/ppc',
436 'hw/rdma',
437 'hw/rdma/vmw',
438 'hw/rtc',
439 'hw/s390x',
440 'hw/scsi',
441 'hw/sd',
442 'hw/sparc',
443 'hw/sparc64',
444 'hw/ssi',
445 'hw/timer',
446 'hw/tpm',
447 'hw/usb',
448 'hw/vfio',
449 'hw/virtio',
450 'hw/watchdog',
451 'hw/xen',
452 'hw/gpio',
453 'hw/riscv',
454 'migration',
455 'net',
456 'ui',
457 ]
458endif
459trace_events_subdirs += [
460 'hw/core',
461 'qapi',
462 'qom',
463 'target/arm',
464 'target/hppa',
465 'target/i386',
466 'target/mips',
467 'target/ppc',
468 'target/riscv',
469 'target/s390x',
470 'target/sparc',
471 'util',
472]
473
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400474subdir('qapi')
475subdir('qobject')
476subdir('stubs')
477subdir('trace')
478subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +0400479subdir('qom')
480subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400481subdir('crypto')
482subdir('storage-daemon')
Marc-André Lureau2d78b562019-07-15 16:00:36 +0400483subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400484
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400485
486if enable_modules
487 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
488 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
489endif
490
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400491# Build targets from sourcesets
492
Paolo Bonzini2becc362020-02-03 11:42:03 +0100493stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400494
495util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +0100496util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400497libqemuutil = static_library('qemuutil',
498 sources: util_ss.sources() + stub_ss.sources() + genh,
499 dependencies: [util_ss.dependencies(), m, glib, socket])
500qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400501 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400502
Marc-André Lureau7fcfd452019-07-16 19:33:55 +0400503subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +0400504subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400505subdir('fsdev')
Marc-André Lureaud3b18482019-08-17 14:55:32 +0400506subdir('target')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400507
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400508block_ss.add(files(
509 'block.c',
510 'blockjob.c',
511 'job.c',
512 'qemu-io-cmds.c',
513))
514block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
515
516subdir('nbd')
517subdir('scsi')
518subdir('block')
519
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400520block_mods = []
521softmmu_mods = []
522foreach d, list : modules
523 foreach m, module_ss : list
524 if enable_modules and targetos != 'windows'
525 module_ss = module_ss.apply(config_host, strict: false)
526 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
527 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
528 if d == 'block'
529 block_mods += sl
530 else
531 softmmu_mods += sl
532 endif
533 else
534 if d == 'block'
535 block_ss.add_all(module_ss)
536 else
537 softmmu_ss.add_all(module_ss)
538 endif
539 endif
540 endforeach
541endforeach
542
543nm = find_program('nm')
544undefsym = find_program('scripts/undefsym.sh')
545block_syms = custom_target('block.syms', output: 'block.syms',
546 input: [libqemuutil, block_mods],
547 capture: true,
548 command: [undefsym, nm, '@INPUT@'])
549qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
550 input: [libqemuutil, softmmu_mods],
551 capture: true,
552 command: [undefsym, nm, '@INPUT@'])
553
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400554block_ss = block_ss.apply(config_host, strict: false)
555libblock = static_library('block', block_ss.sources() + genh,
556 dependencies: block_ss.dependencies(),
557 link_depends: block_syms,
558 name_suffix: 'fa',
559 build_by_default: false)
560
561block = declare_dependency(link_whole: [libblock],
562 link_args: '@block.syms')
563
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400564foreach m : block_mods + softmmu_mods
565 shared_module(m.name(),
566 name_prefix: '',
567 link_whole: m,
568 install: true,
569 install_dir: config_host['qemu_moddir'])
570endforeach
571
Paolo Bonzini2becc362020-02-03 11:42:03 +0100572common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
573common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
574
575common_all = common_ss.apply(config_all, strict: false)
576common_all = static_library('common',
577 build_by_default: false,
578 sources: common_all.sources() + genh,
579 dependencies: common_all.dependencies(),
580 name_suffix: 'fa')
581
582foreach target : target_dirs
583 config_target = config_target_mak[target]
584 target_name = config_target['TARGET_NAME']
585 arch = config_target['TARGET_BASE_ARCH']
586 arch_srcs = []
587
588 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
589 if targetos == 'linux'
590 target_inc += include_directories('linux-headers', is_system: true)
591 endif
592 if target.endswith('-softmmu')
593 qemu_target_name = 'qemu-system-' + target_name
594 target_type='system'
595 arch_srcs += config_devices_h[target]
596 else
597 target_type='user'
598 qemu_target_name = 'qemu-' + target_name
599 if 'CONFIG_LINUX_USER' in config_target
600 base_dir = 'linux-user'
601 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
602 else
603 base_dir = 'bsd-user'
604 endif
605 target_inc += include_directories(
606 base_dir,
607 base_dir / config_target['TARGET_ABI_DIR'],
608 )
609 endif
610
611 target_common = common_ss.apply(config_target, strict: false)
612 objects = common_all.extract_objects(target_common.sources())
613
614 # TODO: Change to generator once obj-y goes away
615 config_target_h = custom_target(target + '-config-target.h',
616 input: meson.current_build_dir() / target / 'config-target.mak',
617 output: target + '-config-target.h',
618 capture: true,
619 command: [create_config, '@INPUT@'])
620
621 target_specific = specific_ss.apply(config_target, strict: false)
622 arch_srcs += target_specific.sources()
623
624 static_library('qemu-' + target,
625 sources: arch_srcs + [config_target_h] + genh,
626 objects: objects,
627 include_directories: target_inc,
628 c_args: ['-DNEED_CPU_H',
629 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
630 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
631 name_suffix: 'fa')
632endforeach
633
Paolo Bonzini931049b2020-02-05 09:44:24 +0100634# Other build targets
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200635if 'CONFIG_GUEST_AGENT' in config_host
636 subdir('qga')
637endif
638
Paolo Bonzini931049b2020-02-05 09:44:24 +0100639if have_tools
Paolo Bonzinia9c97272019-06-10 12:27:52 +0200640 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400641 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +0200642
Marc-André Lureauade60d42019-07-15 14:48:31 +0400643 if 'CONFIG_XKBCOMMON' in config_host
644 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
645 dependencies: [qemuutil, xkbcommon], install: true)
646 endif
647
Marc-André Lureau157e7b12019-07-15 14:50:58 +0400648 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
649 dependencies: qemuutil,
650 install: true)
651
Paolo Bonzini931049b2020-02-05 09:44:24 +0100652 if 'CONFIG_VHOST_USER' in config_host
653 subdir('contrib/libvhost-user')
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +0200654 subdir('contrib/vhost-user-blk')
Marc-André Lureauea458962019-07-12 22:23:46 +0400655 if 'CONFIG_LINUX' in config_host
656 subdir('contrib/vhost-user-gpu')
657 endif
Marc-André Lureau32fcc622019-07-12 22:11:20 +0400658 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +0200659 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +0100660 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +0400661
662 if targetos == 'linux'
663 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
664 dependencies: [qemuutil, libcap_ng],
665 install: true,
666 install_dir: get_option('libexecdir'))
667 endif
668
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400669 if 'CONFIG_IVSHMEM' in config_host
670 subdir('contrib/ivshmem-client')
671 subdir('contrib/ivshmem-server')
672 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +0100673endif
674
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100675subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +0400676subdir('pc-bios')
Paolo Bonzinice1c1e72020-01-28 16:41:44 +0100677subdir('tests')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100678
Paolo Bonzinif9332752020-02-03 13:28:38 +0100679summary_info = {}
680summary_info += {'Install prefix': config_host['prefix']}
681summary_info += {'BIOS directory': config_host['qemu_datadir']}
682summary_info += {'firmware path': config_host['qemu_firmwarepath']}
683summary_info += {'binary directory': config_host['bindir']}
684summary_info += {'library directory': config_host['libdir']}
685summary_info += {'module directory': config_host['qemu_moddir']}
686summary_info += {'libexec directory': config_host['libexecdir']}
687summary_info += {'include directory': config_host['includedir']}
688summary_info += {'config directory': config_host['sysconfdir']}
689if targetos != 'windows'
690 summary_info += {'local state directory': config_host['qemu_localstatedir']}
691 summary_info += {'Manual directory': config_host['mandir']}
692else
693 summary_info += {'local state directory': 'queried at runtime'}
694endif
695summary_info += {'Build directory': meson.current_build_dir()}
696summary_info += {'Source path': meson.current_source_dir()}
697summary_info += {'GIT binary': config_host['GIT']}
698summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
699summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
700summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
701if link_language == 'cpp'
702 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
703else
704 summary_info += {'C++ compiler': false}
705endif
706if targetos == 'darwin'
707 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
708endif
709summary_info += {'ARFLAGS': config_host['ARFLAGS']}
710summary_info += {'CFLAGS': config_host['CFLAGS']}
711summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
712summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
713summary_info += {'make': config_host['MAKE']}
714summary_info += {'install': config_host['INSTALL']}
715summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
716summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
717summary_info += {'genisoimage': config_host['GENISOIMAGE']}
718# TODO: add back version
719summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
720if config_host.has_key('CONFIG_SLIRP')
721 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
722endif
723summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
724if config_host.has_key('CONFIG_MODULES')
725 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
726endif
727summary_info += {'host CPU': cpu}
728summary_info += {'host endianness': build_machine.endian()}
729summary_info += {'target list': config_host['TARGET_DIRS']}
730summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
731summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
732summary_info += {'strip binaries': get_option('strip')}
733summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
734summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
735if targetos == 'darwin'
736 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
737endif
738# TODO: add back version
739summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
740summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
741# TODO: add back version
742summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
743summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
744# TODO: add back version
745summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
746summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
747summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
748# TODO: add back version
749summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
750if config_host.has_key('CONFIG_GCRYPT')
751 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
752 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
753endif
754# TODO: add back version
755summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
756if config_host.has_key('CONFIG_NETTLE')
757 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
758endif
759summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
760summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
761summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
762summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
763# TODO: add back version
764summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
765summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
766summary_info += {'mingw32 support': targetos == 'windows'}
767summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
768summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
769summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
770summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
771summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
772summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
773if config_host.has_key('CONFIG_VNC')
774 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
775 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
776 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
777endif
778summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
779if config_host.has_key('CONFIG_XEN_BACKEND')
780 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
781endif
782summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
783summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
784summary_info += {'PIE': get_option('b_pie')}
785summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
786summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
787summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
788summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
789summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
790summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
791# TODO: add back KVM/HAX/HVF/WHPX/TCG
792#summary_info += {'KVM support': have_kvm'}
793#summary_info += {'HAX support': have_hax'}
794#summary_info += {'HVF support': have_hvf'}
795#summary_info += {'WHPX support': have_whpx'}
796#summary_info += {'TCG support': have_tcg'}
797#if get_option('tcg')
798# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
799# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
800#endif
801summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
802summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
803summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
804summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
805summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
806summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
807summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
808summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
809summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
810summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
811summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
812summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
813summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
814summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
815summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
816summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
817summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
818summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
819summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
820if config_host['TRACE_BACKENDS'].split().contains('simple')
821 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
822endif
823# TODO: add back protocol and server version
824summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
825summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
826summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
827summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
828summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
829summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
830summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
831summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
832summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
833summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
834summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
835if targetos == 'windows'
836 if 'WIN_SDK' in config_host
837 summary_info += {'Windows SDK': config_host['WIN_SDK']}
838 endif
839 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
840 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
841 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
842endif
843summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
844summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
845summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
846summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
847summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
848summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
849summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +0400850summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +0100851summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
852summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
853summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
854summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
855summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
856summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
857summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
858summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
859summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
860summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
861summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
862summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
863summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
864summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
865summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
866summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
867summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
868summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
869summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
870summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
871summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
872summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
873summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
874summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
875summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
876summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
877summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
878summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
879summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
880summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
881summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
882summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
883if config_host.has_key('HAVE_GDB_BIN')
884 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
885endif
886summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
887summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
888summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
889summary(summary_info, bool_yn: true)
890
891if not supported_cpus.contains(cpu)
892 message()
893 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
894 message()
895 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
896 message('The QEMU project intends to remove support for this host CPU in')
897 message('a future release if nobody volunteers to maintain it and to')
898 message('provide a build host for our continuous integration setup.')
899 message('configure has succeeded and you can continue to build, but')
900 message('if you care about QEMU on this platform you should contact')
901 message('us upstream at qemu-devel@nongnu.org.')
902endif
903
904if not supported_oses.contains(targetos)
905 message()
906 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
907 message()
908 message('Host OS ' + targetos + 'support is not currently maintained.')
909 message('The QEMU project intends to remove support for this host OS in')
910 message('a future release if nobody volunteers to maintain it and to')
911 message('provide a build host for our continuous integration setup.')
912 message('configure has succeeded and you can continue to build, but')
913 message('if you care about QEMU on this platform you should contact')
914 message('us upstream at qemu-devel@nongnu.org.')
915endif