]> git.proxmox.com Git - mirror_qemu.git/blame - meson.build
meson: convert chardev directory to Meson (emulator part)
[mirror_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
3154fee4
MAL
538block_mods = []
539softmmu_mods = []
540foreach d, list : modules
541 foreach m, module_ss : list
542 if enable_modules and targetos != 'windows'
543 module_ss = module_ss.apply(config_host, strict: false)
544 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
545 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
546 if d == 'block'
547 block_mods += sl
548 else
549 softmmu_mods += sl
550 endif
551 else
552 if d == 'block'
553 block_ss.add_all(module_ss)
554 else
555 softmmu_ss.add_all(module_ss)
556 endif
557 endif
558 endforeach
559endforeach
560
561nm = find_program('nm')
562undefsym = find_program('scripts/undefsym.sh')
563block_syms = custom_target('block.syms', output: 'block.syms',
564 input: [libqemuutil, block_mods],
565 capture: true,
566 command: [undefsym, nm, '@INPUT@'])
567qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
568 input: [libqemuutil, softmmu_mods],
569 capture: true,
570 command: [undefsym, nm, '@INPUT@'])
571
5e5733e5
MAL
572block_ss = block_ss.apply(config_host, strict: false)
573libblock = static_library('block', block_ss.sources() + genh,
574 dependencies: block_ss.dependencies(),
575 link_depends: block_syms,
576 name_suffix: 'fa',
577 build_by_default: false)
578
579block = declare_dependency(link_whole: [libblock],
b7c70bf2
MAL
580 link_args: '@block.syms',
581 dependencies: [crypto, io])
5e5733e5 582
3154fee4
MAL
583foreach m : block_mods + softmmu_mods
584 shared_module(m.name(),
585 name_prefix: '',
586 link_whole: m,
587 install: true,
588 install_dir: config_host['qemu_moddir'])
589endforeach
590
2becc36a
PB
591common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
592common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
593
594common_all = common_ss.apply(config_all, strict: false)
595common_all = static_library('common',
596 build_by_default: false,
597 sources: common_all.sources() + genh,
598 dependencies: common_all.dependencies(),
599 name_suffix: 'fa')
600
601foreach target : target_dirs
602 config_target = config_target_mak[target]
603 target_name = config_target['TARGET_NAME']
604 arch = config_target['TARGET_BASE_ARCH']
605 arch_srcs = []
606
607 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
608 if targetos == 'linux'
609 target_inc += include_directories('linux-headers', is_system: true)
610 endif
611 if target.endswith('-softmmu')
612 qemu_target_name = 'qemu-system-' + target_name
613 target_type='system'
614 arch_srcs += config_devices_h[target]
615 else
616 target_type='user'
617 qemu_target_name = 'qemu-' + target_name
618 if 'CONFIG_LINUX_USER' in config_target
619 base_dir = 'linux-user'
620 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
621 else
622 base_dir = 'bsd-user'
623 endif
624 target_inc += include_directories(
625 base_dir,
626 base_dir / config_target['TARGET_ABI_DIR'],
627 )
628 endif
629
630 target_common = common_ss.apply(config_target, strict: false)
631 objects = common_all.extract_objects(target_common.sources())
632
633 # TODO: Change to generator once obj-y goes away
634 config_target_h = custom_target(target + '-config-target.h',
635 input: meson.current_build_dir() / target / 'config-target.mak',
636 output: target + '-config-target.h',
637 capture: true,
638 command: [create_config, '@INPUT@'])
639
640 target_specific = specific_ss.apply(config_target, strict: false)
641 arch_srcs += target_specific.sources()
642
643 static_library('qemu-' + target,
644 sources: arch_srcs + [config_target_h] + genh,
645 objects: objects,
646 include_directories: target_inc,
647 c_args: ['-DNEED_CPU_H',
648 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
649 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
650 name_suffix: 'fa')
651endforeach
652
931049b4 653# Other build targets
897b5afa 654
f15bff25
PB
655if 'CONFIG_GUEST_AGENT' in config_host
656 subdir('qga')
657endif
658
931049b4 659if have_tools
b7c70bf2
MAL
660 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
661 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
662 qemu_io = executable('qemu-io', files('qemu-io.c'),
663 dependencies: [block, qemuutil], install: true)
664 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
665 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
666 dependencies: [block, qemuutil], install: true)
667 endif
668
a9c9727c 669 subdir('contrib/rdmacm-mux')
1d7bb6ab 670 subdir('contrib/elf2dmp')
a9c9727c 671
ade60d4f
MAL
672 if 'CONFIG_XKBCOMMON' in config_host
673 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
674 dependencies: [qemuutil, xkbcommon], install: true)
675 endif
676
157e7b13
MAL
677 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
678 dependencies: qemuutil,
679 install: true)
680
931049b4
PB
681 if 'CONFIG_VHOST_USER' in config_host
682 subdir('contrib/libvhost-user')
2d7ac0af 683 subdir('contrib/vhost-user-blk')
ea458960
MAL
684 if 'CONFIG_LINUX' in config_host
685 subdir('contrib/vhost-user-gpu')
686 endif
32fcc624 687 subdir('contrib/vhost-user-input')
99650b62 688 subdir('contrib/vhost-user-scsi')
931049b4 689 endif
8f51e01c
MAL
690
691 if targetos == 'linux'
692 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
693 dependencies: [qemuutil, libcap_ng],
694 install: true,
695 install_dir: get_option('libexecdir'))
897b5afa
MAL
696
697 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
698 dependencies: [authz, crypto, io, qom, qemuutil,
699 libcap_ng, libudev, libmpathpersist],
700 install: true)
8f51e01c
MAL
701 endif
702
5ee24e78
MAL
703 if 'CONFIG_IVSHMEM' in config_host
704 subdir('contrib/ivshmem-client')
705 subdir('contrib/ivshmem-server')
706 endif
931049b4
PB
707endif
708
3f99cf57 709subdir('tools')
bdcbea7a 710subdir('pc-bios')
ce1c1e7a 711subdir('tests')
3f99cf57 712
f9332757
PB
713summary_info = {}
714summary_info += {'Install prefix': config_host['prefix']}
715summary_info += {'BIOS directory': config_host['qemu_datadir']}
716summary_info += {'firmware path': config_host['qemu_firmwarepath']}
717summary_info += {'binary directory': config_host['bindir']}
718summary_info += {'library directory': config_host['libdir']}
719summary_info += {'module directory': config_host['qemu_moddir']}
720summary_info += {'libexec directory': config_host['libexecdir']}
721summary_info += {'include directory': config_host['includedir']}
722summary_info += {'config directory': config_host['sysconfdir']}
723if targetos != 'windows'
724 summary_info += {'local state directory': config_host['qemu_localstatedir']}
725 summary_info += {'Manual directory': config_host['mandir']}
726else
727 summary_info += {'local state directory': 'queried at runtime'}
728endif
729summary_info += {'Build directory': meson.current_build_dir()}
730summary_info += {'Source path': meson.current_source_dir()}
731summary_info += {'GIT binary': config_host['GIT']}
732summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
733summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
734summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
735if link_language == 'cpp'
736 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
737else
738 summary_info += {'C++ compiler': false}
739endif
740if targetos == 'darwin'
741 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
742endif
743summary_info += {'ARFLAGS': config_host['ARFLAGS']}
744summary_info += {'CFLAGS': config_host['CFLAGS']}
745summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
746summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
747summary_info += {'make': config_host['MAKE']}
748summary_info += {'install': config_host['INSTALL']}
749summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
750summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
751summary_info += {'genisoimage': config_host['GENISOIMAGE']}
752# TODO: add back version
753summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
754if config_host.has_key('CONFIG_SLIRP')
755 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
756endif
757summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
758if config_host.has_key('CONFIG_MODULES')
759 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
760endif
761summary_info += {'host CPU': cpu}
762summary_info += {'host endianness': build_machine.endian()}
763summary_info += {'target list': config_host['TARGET_DIRS']}
764summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
765summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
766summary_info += {'strip binaries': get_option('strip')}
767summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
768summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
769if targetos == 'darwin'
770 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
771endif
772# TODO: add back version
773summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
774summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
775# TODO: add back version
776summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
777summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
778# TODO: add back version
779summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
780summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
781summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
782# TODO: add back version
783summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
784if config_host.has_key('CONFIG_GCRYPT')
785 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
786 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
787endif
788# TODO: add back version
789summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
790if config_host.has_key('CONFIG_NETTLE')
791 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
792endif
793summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
794summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
795summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
796summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
797# TODO: add back version
798summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
799summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
800summary_info += {'mingw32 support': targetos == 'windows'}
801summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
802summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
803summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
804summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
805summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
806summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
807if config_host.has_key('CONFIG_VNC')
808 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
809 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
810 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
811endif
812summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
813if config_host.has_key('CONFIG_XEN_BACKEND')
814 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
815endif
816summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
817summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
818summary_info += {'PIE': get_option('b_pie')}
819summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
820summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
821summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
822summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
823summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
824summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
825# TODO: add back KVM/HAX/HVF/WHPX/TCG
826#summary_info += {'KVM support': have_kvm'}
827#summary_info += {'HAX support': have_hax'}
828#summary_info += {'HVF support': have_hvf'}
829#summary_info += {'WHPX support': have_whpx'}
830#summary_info += {'TCG support': have_tcg'}
831#if get_option('tcg')
832# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
833# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
834#endif
835summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
836summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
837summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
838summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
839summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
840summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
841summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
842summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
843summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
844summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
845summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
846summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
847summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
848summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
849summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
850summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
851summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
852summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
853summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
854if config_host['TRACE_BACKENDS'].split().contains('simple')
855 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
856endif
857# TODO: add back protocol and server version
858summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
859summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
860summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
861summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
862summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
863summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
864summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
865summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
866summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
867summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
868summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
869if targetos == 'windows'
870 if 'WIN_SDK' in config_host
871 summary_info += {'Windows SDK': config_host['WIN_SDK']}
872 endif
873 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
874 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
875 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
876endif
877summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
878summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
879summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
880summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
881summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
882summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
883summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
bf0e56a3 884summary_info += {'gcov': get_option('b_coverage')}
f9332757
PB
885summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
886summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
887summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
888summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
889summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
890summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
891summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
892summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
893summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
894summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
895summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
896summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
897summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
898summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
899summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
900summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
901summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
902summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
903summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
904summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
905summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
906summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
907summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
908summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
909summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
910summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
911summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
912summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
913summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
914summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
915summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
916summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
917if config_host.has_key('HAVE_GDB_BIN')
918 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
919endif
920summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
921summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
922summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
923summary(summary_info, bool_yn: true)
924
925if not supported_cpus.contains(cpu)
926 message()
927 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
928 message()
929 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
930 message('The QEMU project intends to remove support for this host CPU in')
931 message('a future release if nobody volunteers to maintain it and to')
932 message('provide a build host for our continuous integration setup.')
933 message('configure has succeeded and you can continue to build, but')
934 message('if you care about QEMU on this platform you should contact')
935 message('us upstream at qemu-devel@nongnu.org.')
936endif
937
938if not supported_oses.contains(targetos)
939 message()
940 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
941 message()
942 message('Host OS ' + targetos + 'support is not currently maintained.')
943 message('The QEMU project intends to remove support for this host OS in')
944 message('a future release if nobody volunteers to maintain it and to')
945 message('provide a build host for our continuous integration setup.')
946 message('configure has succeeded and you can continue to build, but')
947 message('if you care about QEMU on this platform you should contact')
948 message('us upstream at qemu-devel@nongnu.org.')
949endif