]> git.ipfire.org Git - thirdparty/qemu.git/blame - meson.build
meson: convert tests/qtest to meson
[thirdparty/qemu.git] / meson.build
CommitLineData
a5665051
PB
1project('qemu', ['c'], meson_version: '>=0.55.0',
2 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_lundef=false'],
3 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
4
5not_found = dependency('', required: false)
6keyval = import('unstable-keyval')
a81df1b6
PB
7ss = import('sourceset')
8
ce1c1e7a 9sh = find_program('sh')
a81df1b6 10cc = meson.get_compiler('c')
a5665051 11config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
2becc36a 12config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
3154fee4 13enable_modules = 'CONFIG_MODULES' in config_host
a5665051
PB
14
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
fc929892
MAL
24python = 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
a5665051
PB
30if host_machine.system() == 'darwin'
31 add_languages('objc', required: false, native: false)
32endif
33
968b4db3
PB
34if '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
a5665051
PB
41configure_file(input: files('scripts/ninjatool.py'),
42 output: 'ninjatool',
43 configuration: config_host)
f9332757
PB
44
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
a81df1b6
PB
52m = cc.find_library('m', required: false)
53util = cc.find_library('util', required: false)
54socket = []
04c6f1e7 55version_res = []
d92989aa
MAL
56coref = []
57iokit = []
58cocoa = []
59hvf = []
a81df1b6
PB
60if targetos == 'windows'
61 socket = cc.find_library('ws2_32')
04c6f1e7
MAL
62
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('.'))
d92989aa
MAL
67elif 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')
cfad62f1
PB
72elif 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')]
a81df1b6
PB
80endif
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
ea458960
MAL
106pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
107 link_args: config_host['PIXMAN_LIBS'].split())
5e7fbd25
MAL
108pam = not_found
109if 'CONFIG_AUTH_PAM' in config_host
110 pam = cc.find_library('pam')
111endif
5e5733e5
MAL
112libaio = 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
ec0d5893
MAL
132libattr = not_found
133if 'CONFIG_ATTR' in config_host
134 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
135endif
3f99cf57
PB
136seccomp = 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
ade60d4f
MAL
145xkbcommon = 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
2634733c
PB
150spice = not_found
151if 'CONFIG_SPICE' in config_host
152 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
153 link_args: config_host['SPICE_LIBS'].split())
154endif
5ee24e78 155rt = cc.find_library('rt', required: false)
897b5afa
MAL
156libmpathpersist = not_found
157if config_host.has_key('CONFIG_MPATH')
158 libmpathpersist = cc.find_library('mpathpersist')
159endif
99650b62
PB
160libiscsi = not_found
161if 'CONFIG_LIBISCSI' in config_host
162 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
163 link_args: config_host['LIBISCSI_LIBS'].split())
164endif
5e5733e5
MAL
165zstd = not_found
166if 'CONFIG_ZSTD' in config_host
167 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
168 link_args: config_host['ZSTD_LIBS'].split())
169endif
ea458960
MAL
170gbm = not_found
171if 'CONFIG_GBM' in config_host
172 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
173 link_args: config_host['GBM_LIBS'].split())
174endif
175virgl = not_found
176if 'CONFIG_VIRGL' in config_host
177 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
178 link_args: config_host['VIRGL_LIBS'].split())
179endif
1d7bb6ab
MAL
180curl = not_found
181if 'CONFIG_CURL' in config_host
182 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
183 link_args: config_host['CURL_LIBS'].split())
184endif
f15bff25
PB
185libudev = not_found
186if 'CONFIG_LIBUDEV' in config_host
187 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
188endif
2634733c
PB
189brlapi = not_found
190if 'CONFIG_BRLAPI' in config_host
191 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
192endif
193sdl = not_found
194if 'CONFIG_SDL' in config_host
195 sdl = declare_dependency(compile_args: config_host['SDL_CFLAGS'].split(),
196 link_args: config_host['SDL_LIBS'].split())
197endif
5e5733e5
MAL
198rbd = not_found
199if 'CONFIG_RBD' in config_host
200 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
201endif
202glusterfs = not_found
203if 'CONFIG_GLUSTERFS' in config_host
204 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
205 link_args: config_host['GLUSTERFS_LIBS'].split())
206endif
207libssh = not_found
208if 'CONFIG_LIBSSH' in config_host
209 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
210 link_args: config_host['LIBSSH_LIBS'].split())
211endif
212libbzip2 = not_found
213if 'CONFIG_BZIP2' in config_host
214 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
215endif
216liblzfse = not_found
217if 'CONFIG_LZFSE' in config_host
218 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
219endif
a81df1b6 220
2becc36a
PB
221create_config = find_program('scripts/create_config')
222minikconf = find_program('scripts/minikconf.py')
a81df1b6
PB
223target_dirs = config_host['TARGET_DIRS'].split()
224have_user = false
225have_system = false
2becc36a
PB
226config_devices_mak_list = []
227config_devices_h = {}
228config_target_mak = {}
229kconfig_external_symbols = [
230 'CONFIG_KVM',
231 'CONFIG_XEN',
232 'CONFIG_TPM',
233 'CONFIG_SPICE',
234 'CONFIG_IVSHMEM',
235 'CONFIG_OPENGL',
236 'CONFIG_X11',
237 'CONFIG_VHOST_USER',
238 'CONFIG_VHOST_KERNEL',
239 'CONFIG_VIRTFS',
240 'CONFIG_LINUX',
241 'CONFIG_PVRDMA',
242]
a81df1b6
PB
243foreach target : target_dirs
244 have_user = have_user or target.endswith('-user')
2becc36a
PB
245 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
246
247 if target.endswith('-softmmu')
248 have_system = true
249
250 base_kconfig = []
251 foreach sym : kconfig_external_symbols
252 if sym in config_target
253 base_kconfig += '@0@=y'.format(sym)
254 endif
255 endforeach
256
257 config_devices_mak = target + '-config-devices.mak'
258 config_devices_mak = configure_file(
259 input: ['default-configs' / target + '.mak', 'Kconfig'],
260 output: config_devices_mak,
261 depfile: config_devices_mak + '.d',
262 capture: true,
263 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
264 config_devices_mak, '@DEPFILE@', '@INPUT@',
265 base_kconfig])
266 config_devices_h += {target: custom_target(
267 target + '-config-devices.h',
268 input: config_devices_mak,
269 output: target + '-config-devices.h',
270 capture: true,
271 command: [create_config, '@INPUT@'])}
272 config_devices_mak_list += config_devices_mak
273 config_target += keyval.load(config_devices_mak)
274 endif
275 config_target_mak += {target: config_target}
a81df1b6
PB
276endforeach
277have_tools = 'CONFIG_TOOLS' in config_host
278have_block = have_system or have_tools
279
2becc36a
PB
280grepy = find_program('scripts/grepy.sh')
281# This configuration is used to build files that are shared by
282# multiple binaries, and then extracted out of the "common"
283# static_library target.
284#
285# We do not use all_sources()/all_dependencies(), because it would
286# build literally all source files, including devices only used by
287# targets that are not built for this compilation. The CONFIG_ALL
288# pseudo symbol replaces it.
289
290if have_system
291 config_all_devices_mak = configure_file(
292 output: 'config-all-devices.mak',
293 input: config_devices_mak_list,
294 capture: true,
295 command: [grepy, '@INPUT@'],
296 )
297 config_all_devices = keyval.load(config_all_devices_mak)
298else
299 config_all_devices = {}
300endif
301config_all = config_all_devices
302config_all += config_host
303config_all += config_all_disas
304config_all += {
305 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
306 'CONFIG_SOFTMMU': have_system,
307 'CONFIG_USER_ONLY': have_user,
308 'CONFIG_ALL': true,
309}
310
a81df1b6
PB
311# Generators
312
2c273f32 313genh = []
3f885659 314hxtool = find_program('scripts/hxtool')
650b5d54 315shaderinclude = find_program('scripts/shaderinclude.pl')
a81df1b6
PB
316qapi_gen = find_program('scripts/qapi-gen.py')
317qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
318 meson.source_root() / 'scripts/qapi/commands.py',
319 meson.source_root() / 'scripts/qapi/common.py',
320 meson.source_root() / 'scripts/qapi/doc.py',
321 meson.source_root() / 'scripts/qapi/error.py',
322 meson.source_root() / 'scripts/qapi/events.py',
323 meson.source_root() / 'scripts/qapi/expr.py',
324 meson.source_root() / 'scripts/qapi/gen.py',
325 meson.source_root() / 'scripts/qapi/introspect.py',
326 meson.source_root() / 'scripts/qapi/parser.py',
327 meson.source_root() / 'scripts/qapi/schema.py',
328 meson.source_root() / 'scripts/qapi/source.py',
329 meson.source_root() / 'scripts/qapi/types.py',
330 meson.source_root() / 'scripts/qapi/visit.py',
331 meson.source_root() / 'scripts/qapi/common.py',
332 meson.source_root() / 'scripts/qapi/doc.py',
333 meson.source_root() / 'scripts/qapi-gen.py'
334]
335
336tracetool = [
337 python, files('scripts/tracetool.py'),
338 '--backend=' + config_host['TRACE_BACKENDS']
339]
340
2c273f32
MAL
341qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
342 meson.current_source_dir(),
343 config_host['PKGVERSION'], config_host['VERSION']]
344qemu_version = custom_target('qemu-version.h',
345 output: 'qemu-version.h',
346 command: qemu_version_cmd,
347 capture: true,
348 build_by_default: true,
349 build_always_stale: true)
350genh += qemu_version
351
2becc36a
PB
352config_host_h = custom_target('config-host.h',
353 input: meson.current_build_dir() / 'config-host.mak',
354 output: 'config-host.h',
355 capture: true,
356 command: [create_config, '@INPUT@'])
357genh += config_host_h
358
3f885659
MAL
359hxdep = []
360hx_headers = [
361 ['qemu-options.hx', 'qemu-options.def'],
362 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
363]
364if have_system
365 hx_headers += [
366 ['hmp-commands.hx', 'hmp-commands.h'],
367 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
368 ]
369endif
370foreach d : hx_headers
b7c70bf2 371 hxdep += custom_target(d[1],
3f885659
MAL
372 input: files(d[0]),
373 output: d[1],
374 capture: true,
375 build_by_default: true, # to be removed when added to a target
376 command: [hxtool, '-h', '@INPUT0@'])
377endforeach
378genh += hxdep
379
a81df1b6
PB
380# Collect sourcesets.
381
382util_ss = ss.source_set()
383stub_ss = ss.source_set()
384trace_ss = ss.source_set()
3154fee4 385block_ss = ss.source_set()
2becc36a
PB
386common_ss = ss.source_set()
387softmmu_ss = ss.source_set()
388user_ss = ss.source_set()
389bsd_user_ss = ss.source_set()
390linux_user_ss = ss.source_set()
391specific_ss = ss.source_set()
392
3154fee4 393modules = {}
2becc36a
PB
394hw_arch = {}
395target_arch = {}
396target_softmmu_arch = {}
a81df1b6
PB
397
398###############
399# Trace files #
400###############
401
402trace_events_subdirs = [
403 'accel/kvm',
404 'accel/tcg',
405 'crypto',
406 'monitor',
407]
408if have_user
409 trace_events_subdirs += [ 'linux-user' ]
410endif
411if have_block
412 trace_events_subdirs += [
413 'authz',
414 'block',
415 'io',
416 'nbd',
417 'scsi',
418 ]
419endif
420if have_system
421 trace_events_subdirs += [
422 'audio',
423 'backends',
424 'backends/tpm',
425 'chardev',
426 'hw/9pfs',
427 'hw/acpi',
428 'hw/alpha',
429 'hw/arm',
430 'hw/audio',
431 'hw/block',
432 'hw/block/dataplane',
433 'hw/char',
434 'hw/display',
435 'hw/dma',
436 'hw/hppa',
437 'hw/hyperv',
438 'hw/i2c',
439 'hw/i386',
440 'hw/i386/xen',
441 'hw/ide',
442 'hw/input',
443 'hw/intc',
444 'hw/isa',
445 'hw/mem',
446 'hw/mips',
447 'hw/misc',
448 'hw/misc/macio',
449 'hw/net',
450 'hw/nvram',
451 'hw/pci',
452 'hw/pci-host',
453 'hw/ppc',
454 'hw/rdma',
455 'hw/rdma/vmw',
456 'hw/rtc',
457 'hw/s390x',
458 'hw/scsi',
459 'hw/sd',
460 'hw/sparc',
461 'hw/sparc64',
462 'hw/ssi',
463 'hw/timer',
464 'hw/tpm',
465 'hw/usb',
466 'hw/vfio',
467 'hw/virtio',
468 'hw/watchdog',
469 'hw/xen',
470 'hw/gpio',
471 'hw/riscv',
472 'migration',
473 'net',
474 'ui',
475 ]
476endif
477trace_events_subdirs += [
478 'hw/core',
479 'qapi',
480 'qom',
481 'target/arm',
482 'target/hppa',
483 'target/i386',
484 'target/mips',
485 'target/ppc',
486 'target/riscv',
487 'target/s390x',
488 'target/sparc',
489 'util',
490]
491
a81df1b6
PB
492subdir('qapi')
493subdir('qobject')
494subdir('stubs')
495subdir('trace')
496subdir('util')
5582c58f
MAL
497subdir('qom')
498subdir('authz')
a81df1b6
PB
499subdir('crypto')
500subdir('storage-daemon')
2d78b56e 501subdir('ui')
a81df1b6 502
3154fee4
MAL
503
504if enable_modules
505 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
506 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
507endif
508
a81df1b6
PB
509# Build targets from sourcesets
510
2becc36a 511stub_ss = stub_ss.apply(config_all, strict: false)
a81df1b6
PB
512
513util_ss.add_all(trace_ss)
2becc36a 514util_ss = util_ss.apply(config_all, strict: false)
a81df1b6
PB
515libqemuutil = static_library('qemuutil',
516 sources: util_ss.sources() + stub_ss.sources() + genh,
517 dependencies: [util_ss.dependencies(), m, glib, socket])
518qemuutil = declare_dependency(link_with: libqemuutil,
04c6f1e7 519 sources: genh + version_res)
a81df1b6 520
7fcfd456 521subdir('io')
848e8ff6 522subdir('chardev')
ec0d5893 523subdir('fsdev')
d3b18480 524subdir('target')
ec0d5893 525
5e5733e5
MAL
526block_ss.add(files(
527 'block.c',
528 'blockjob.c',
529 'job.c',
530 'qemu-io-cmds.c',
531))
532block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
533
534subdir('nbd')
535subdir('scsi')
536subdir('block')
537
a2ce7dbd
PB
538# needed for fuzzing binaries
539subdir('tests/qtest/libqos')
540
3154fee4
MAL
541block_mods = []
542softmmu_mods = []
543foreach d, list : modules
544 foreach m, module_ss : list
545 if enable_modules and targetos != 'windows'
546 module_ss = module_ss.apply(config_host, strict: false)
547 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
548 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
549 if d == 'block'
550 block_mods += sl
551 else
552 softmmu_mods += sl
553 endif
554 else
555 if d == 'block'
556 block_ss.add_all(module_ss)
557 else
558 softmmu_ss.add_all(module_ss)
559 endif
560 endif
561 endforeach
562endforeach
563
564nm = find_program('nm')
565undefsym = find_program('scripts/undefsym.sh')
566block_syms = custom_target('block.syms', output: 'block.syms',
567 input: [libqemuutil, block_mods],
568 capture: true,
569 command: [undefsym, nm, '@INPUT@'])
570qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
571 input: [libqemuutil, softmmu_mods],
572 capture: true,
573 command: [undefsym, nm, '@INPUT@'])
574
5e5733e5
MAL
575block_ss = block_ss.apply(config_host, strict: false)
576libblock = static_library('block', block_ss.sources() + genh,
577 dependencies: block_ss.dependencies(),
578 link_depends: block_syms,
579 name_suffix: 'fa',
580 build_by_default: false)
581
582block = declare_dependency(link_whole: [libblock],
b7c70bf2
MAL
583 link_args: '@block.syms',
584 dependencies: [crypto, io])
5e5733e5 585
3154fee4
MAL
586foreach m : block_mods + softmmu_mods
587 shared_module(m.name(),
588 name_prefix: '',
589 link_whole: m,
590 install: true,
591 install_dir: config_host['qemu_moddir'])
592endforeach
593
2becc36a
PB
594common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
595common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
596
597common_all = common_ss.apply(config_all, strict: false)
598common_all = static_library('common',
599 build_by_default: false,
600 sources: common_all.sources() + genh,
601 dependencies: common_all.dependencies(),
602 name_suffix: 'fa')
603
604foreach target : target_dirs
605 config_target = config_target_mak[target]
606 target_name = config_target['TARGET_NAME']
607 arch = config_target['TARGET_BASE_ARCH']
608 arch_srcs = []
609
610 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
611 if targetos == 'linux'
612 target_inc += include_directories('linux-headers', is_system: true)
613 endif
614 if target.endswith('-softmmu')
615 qemu_target_name = 'qemu-system-' + target_name
616 target_type='system'
617 arch_srcs += config_devices_h[target]
618 else
619 target_type='user'
620 qemu_target_name = 'qemu-' + target_name
621 if 'CONFIG_LINUX_USER' in config_target
622 base_dir = 'linux-user'
623 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
624 else
625 base_dir = 'bsd-user'
626 endif
627 target_inc += include_directories(
628 base_dir,
629 base_dir / config_target['TARGET_ABI_DIR'],
630 )
631 endif
632
633 target_common = common_ss.apply(config_target, strict: false)
634 objects = common_all.extract_objects(target_common.sources())
635
636 # TODO: Change to generator once obj-y goes away
637 config_target_h = custom_target(target + '-config-target.h',
638 input: meson.current_build_dir() / target / 'config-target.mak',
639 output: target + '-config-target.h',
640 capture: true,
641 command: [create_config, '@INPUT@'])
642
643 target_specific = specific_ss.apply(config_target, strict: false)
644 arch_srcs += target_specific.sources()
645
646 static_library('qemu-' + target,
647 sources: arch_srcs + [config_target_h] + genh,
648 objects: objects,
649 include_directories: target_inc,
650 c_args: ['-DNEED_CPU_H',
651 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
652 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
653 name_suffix: 'fa')
654endforeach
655
931049b4 656# Other build targets
897b5afa 657
f15bff25
PB
658if 'CONFIG_GUEST_AGENT' in config_host
659 subdir('qga')
660endif
661
931049b4 662if have_tools
b7c70bf2
MAL
663 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
664 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
665 qemu_io = executable('qemu-io', files('qemu-io.c'),
666 dependencies: [block, qemuutil], install: true)
667 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
668 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
669 dependencies: [block, qemuutil], install: true)
670 endif
671
a9c9727c 672 subdir('contrib/rdmacm-mux')
1d7bb6ab 673 subdir('contrib/elf2dmp')
a9c9727c 674
ade60d4f
MAL
675 if 'CONFIG_XKBCOMMON' in config_host
676 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
677 dependencies: [qemuutil, xkbcommon], install: true)
678 endif
679
157e7b13
MAL
680 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
681 dependencies: qemuutil,
682 install: true)
683
931049b4
PB
684 if 'CONFIG_VHOST_USER' in config_host
685 subdir('contrib/libvhost-user')
2d7ac0af 686 subdir('contrib/vhost-user-blk')
ea458960
MAL
687 if 'CONFIG_LINUX' in config_host
688 subdir('contrib/vhost-user-gpu')
689 endif
32fcc624 690 subdir('contrib/vhost-user-input')
99650b62 691 subdir('contrib/vhost-user-scsi')
931049b4 692 endif
8f51e01c
MAL
693
694 if targetos == 'linux'
695 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
696 dependencies: [qemuutil, libcap_ng],
697 install: true,
698 install_dir: get_option('libexecdir'))
897b5afa
MAL
699
700 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
701 dependencies: [authz, crypto, io, qom, qemuutil,
702 libcap_ng, libudev, libmpathpersist],
703 install: true)
8f51e01c
MAL
704 endif
705
5ee24e78
MAL
706 if 'CONFIG_IVSHMEM' in config_host
707 subdir('contrib/ivshmem-client')
708 subdir('contrib/ivshmem-server')
709 endif
931049b4
PB
710endif
711
3f99cf57 712subdir('tools')
bdcbea7a 713subdir('pc-bios')
ce1c1e7a 714subdir('tests')
3f99cf57 715
f9332757
PB
716summary_info = {}
717summary_info += {'Install prefix': config_host['prefix']}
718summary_info += {'BIOS directory': config_host['qemu_datadir']}
719summary_info += {'firmware path': config_host['qemu_firmwarepath']}
720summary_info += {'binary directory': config_host['bindir']}
721summary_info += {'library directory': config_host['libdir']}
722summary_info += {'module directory': config_host['qemu_moddir']}
723summary_info += {'libexec directory': config_host['libexecdir']}
724summary_info += {'include directory': config_host['includedir']}
725summary_info += {'config directory': config_host['sysconfdir']}
726if targetos != 'windows'
727 summary_info += {'local state directory': config_host['qemu_localstatedir']}
728 summary_info += {'Manual directory': config_host['mandir']}
729else
730 summary_info += {'local state directory': 'queried at runtime'}
731endif
732summary_info += {'Build directory': meson.current_build_dir()}
733summary_info += {'Source path': meson.current_source_dir()}
734summary_info += {'GIT binary': config_host['GIT']}
735summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
736summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
737summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
738if link_language == 'cpp'
739 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
740else
741 summary_info += {'C++ compiler': false}
742endif
743if targetos == 'darwin'
744 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
745endif
746summary_info += {'ARFLAGS': config_host['ARFLAGS']}
747summary_info += {'CFLAGS': config_host['CFLAGS']}
748summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
749summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
750summary_info += {'make': config_host['MAKE']}
751summary_info += {'install': config_host['INSTALL']}
752summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
753summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
754summary_info += {'genisoimage': config_host['GENISOIMAGE']}
755# TODO: add back version
756summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
757if config_host.has_key('CONFIG_SLIRP')
758 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
759endif
760summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
761if config_host.has_key('CONFIG_MODULES')
762 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
763endif
764summary_info += {'host CPU': cpu}
765summary_info += {'host endianness': build_machine.endian()}
766summary_info += {'target list': config_host['TARGET_DIRS']}
767summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
768summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
769summary_info += {'strip binaries': get_option('strip')}
770summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
771summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
772if targetos == 'darwin'
773 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
774endif
775# TODO: add back version
776summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
777summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
778# TODO: add back version
779summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
780summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
781# TODO: add back version
782summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
783summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
784summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
785# TODO: add back version
786summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
787if config_host.has_key('CONFIG_GCRYPT')
788 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
789 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
790endif
791# TODO: add back version
792summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
793if config_host.has_key('CONFIG_NETTLE')
794 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
795endif
796summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
797summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
798summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
799summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
800# TODO: add back version
801summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
802summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
803summary_info += {'mingw32 support': targetos == 'windows'}
804summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
805summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
806summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
807summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
808summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
809summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
810if config_host.has_key('CONFIG_VNC')
811 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
812 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
813 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
814endif
815summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
816if config_host.has_key('CONFIG_XEN_BACKEND')
817 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
818endif
819summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
820summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
821summary_info += {'PIE': get_option('b_pie')}
822summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
823summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
824summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
825summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
826summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
827summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
828# TODO: add back KVM/HAX/HVF/WHPX/TCG
829#summary_info += {'KVM support': have_kvm'}
830#summary_info += {'HAX support': have_hax'}
831#summary_info += {'HVF support': have_hvf'}
832#summary_info += {'WHPX support': have_whpx'}
833#summary_info += {'TCG support': have_tcg'}
834#if get_option('tcg')
835# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
836# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
837#endif
838summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
839summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
840summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
841summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
842summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
843summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
844summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
845summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
846summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
847summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
848summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
849summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
850summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
851summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
852summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
853summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
854summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
855summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
856summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
857if config_host['TRACE_BACKENDS'].split().contains('simple')
858 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
859endif
860# TODO: add back protocol and server version
861summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
862summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
863summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
864summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
865summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
866summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
867summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
868summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
869summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
870summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
871summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
872if targetos == 'windows'
873 if 'WIN_SDK' in config_host
874 summary_info += {'Windows SDK': config_host['WIN_SDK']}
875 endif
876 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
877 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
878 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
879endif
880summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
881summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
882summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
883summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
884summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
885summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
886summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
bf0e56a3 887summary_info += {'gcov': get_option('b_coverage')}
f9332757
PB
888summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
889summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
890summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
891summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
892summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
893summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
894summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
895summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
896summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
897summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
898summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
899summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
900summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
901summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
902summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
903summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
904summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
905summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
906summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
907summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
908summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
909summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
910summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
911summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
912summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
913summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
914summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
915summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
916summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
917summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
918summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
919summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
920if config_host.has_key('HAVE_GDB_BIN')
921 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
922endif
923summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
924summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
925summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
926summary(summary_info, bool_yn: true)
927
928if not supported_cpus.contains(cpu)
929 message()
930 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
931 message()
932 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
933 message('The QEMU project intends to remove support for this host CPU in')
934 message('a future release if nobody volunteers to maintain it and to')
935 message('provide a build host for our continuous integration setup.')
936 message('configure has succeeded and you can continue to build, but')
937 message('if you care about QEMU on this platform you should contact')
938 message('us upstream at qemu-devel@nongnu.org.')
939endif
940
941if not supported_oses.contains(targetos)
942 message()
943 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
944 message()
945 message('Host OS ' + targetos + 'support is not currently maintained.')
946 message('The QEMU project intends to remove support for this host OS in')
947 message('a future release if nobody volunteers to maintain it and to')
948 message('provide a build host for our continuous integration setup.')
949 message('configure has succeeded and you can continue to build, but')
950 message('if you care about QEMU on this platform you should contact')
951 message('us upstream at qemu-devel@nongnu.org.')
952endif