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