xref: /qemu/meson.build (revision 8a19980e)
1a5665051SPaolo Bonziniproject('qemu', ['c'], meson_version: '>=0.55.0',
290756b2fSGerd Hoffmann        default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11',
33e0e5190SPaolo Bonzini                          'b_colorout=auto'],
4a5665051SPaolo Bonzini        version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5a5665051SPaolo Bonzini
6a5665051SPaolo Bonzininot_found = dependency('', required: false)
7b29b40f4SPaolo Bonziniif meson.version().version_compare('>=0.56.0')
8b29b40f4SPaolo Bonzini  keyval = import('keyval')
9b29b40f4SPaolo Bonzinielse
10a5665051SPaolo Bonzini  keyval = import('unstable-keyval')
11b29b40f4SPaolo Bonziniendif
12a81df1b6SPaolo Bonziniss = import('sourceset')
13a81df1b6SPaolo Bonzini
14ce1c1e7aSPaolo Bonzinish = find_program('sh')
15a81df1b6SPaolo Bonzinicc = meson.get_compiler('c')
16a5665051SPaolo Bonziniconfig_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
173154fee4SMarc-André Lureauenable_modules = 'CONFIG_MODULES' in config_host
1835be72baSPaolo Bonzinienable_static = 'CONFIG_STATIC' in config_host
19f8aa24eaSPaolo Bonzinibuild_docs = 'BUILD_DOCS' in config_host
208fe11232SMarc-André Lureau
218fe11232SMarc-André Lureauif get_option('qemu_suffix').startswith('/')
228fe11232SMarc-André Lureau  error('qemu_suffix cannot start with a /')
238fe11232SMarc-André Lureauendif
248fe11232SMarc-André Lureau
25ab4c0996SMarc-André Lureauqemu_datadir = get_option('datadir') / get_option('qemu_suffix')
26491e74c1SMarc-André Lureauqemu_docdir = get_option('docdir') / get_option('qemu_suffix')
27859aef02SPaolo Bonziniconfig_host_data = configuration_data()
28859aef02SPaolo Bonzinigenh = []
29a5665051SPaolo Bonzini
30760e4327SPaolo Bonzinitarget_dirs = config_host['TARGET_DIRS'].split()
31760e4327SPaolo Bonzinihave_user = false
32760e4327SPaolo Bonzinihave_system = false
33760e4327SPaolo Bonziniforeach target : target_dirs
34760e4327SPaolo Bonzini  have_user = have_user or target.endswith('-user')
35760e4327SPaolo Bonzini  have_system = have_system or target.endswith('-softmmu')
36760e4327SPaolo Bonziniendforeach
37760e4327SPaolo Bonzinihave_tools = 'CONFIG_TOOLS' in config_host
38760e4327SPaolo Bonzinihave_block = have_system or have_tools
39760e4327SPaolo Bonzini
40201e8ed7SPaolo Bonzinipython = import('python').find_installation()
41201e8ed7SPaolo Bonzini
42201e8ed7SPaolo Bonzinisupported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
43201e8ed7SPaolo Bonzinisupported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
44201e8ed7SPaolo Bonzini  'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
45201e8ed7SPaolo Bonzini
46201e8ed7SPaolo Bonzinicpu = host_machine.cpu_family()
47201e8ed7SPaolo Bonzinitargetos = host_machine.system()
48201e8ed7SPaolo Bonzini
49201e8ed7SPaolo Bonziniconfigure_file(input: files('scripts/ninjatool.py'),
50201e8ed7SPaolo Bonzini               output: 'ninjatool',
51201e8ed7SPaolo Bonzini               configuration: config_host)
52201e8ed7SPaolo Bonzini
53*8a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64']
54*8a19980eSPaolo Bonzini  kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
55*8a19980eSPaolo Bonzinielif cpu == 'aarch64'
56*8a19980eSPaolo Bonzini  kvm_targets = ['aarch64-softmmu']
57*8a19980eSPaolo Bonzinielif cpu == 's390x'
58*8a19980eSPaolo Bonzini  kvm_targets = ['s390x-softmmu']
59*8a19980eSPaolo Bonzinielif cpu in ['ppc', 'ppc64']
60*8a19980eSPaolo Bonzini  kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
61*8a19980eSPaolo Bonzinielse
62*8a19980eSPaolo Bonzini  kvm_targets = []
63*8a19980eSPaolo Bonziniendif
64*8a19980eSPaolo Bonzini
65*8a19980eSPaolo Bonziniaccelerator_targets = { 'CONFIG_KVM': kvm_targets }
66*8a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64']
67*8a19980eSPaolo Bonzini  accelerator_targets += {
68*8a19980eSPaolo Bonzini    'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
69*8a19980eSPaolo Bonzini    'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
70*8a19980eSPaolo Bonzini    'CONFIG_HVF': ['x86_64-softmmu'],
71*8a19980eSPaolo Bonzini    'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
72*8a19980eSPaolo Bonzini  }
73*8a19980eSPaolo Bonziniendif
74*8a19980eSPaolo Bonzini
75201e8ed7SPaolo Bonzini##################
76201e8ed7SPaolo Bonzini# Compiler flags #
77201e8ed7SPaolo Bonzini##################
78201e8ed7SPaolo Bonzini
79ff9ed62bSAlexander Bulekov# Specify linker-script with add_project_link_arguments so that it is not placed
80ff9ed62bSAlexander Bulekov# within a linker --start-group/--end-group pair
81ff9ed62bSAlexander Bulekovif 'CONFIG_FUZZ' in config_host
82ff9ed62bSAlexander Bulekov   add_project_link_arguments(['-Wl,-T,',
83ff9ed62bSAlexander Bulekov                               (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
84ff9ed62bSAlexander Bulekov                              native: false, language: ['c', 'cpp', 'objc'])
85ff9ed62bSAlexander Bulekovendif
86ff9ed62bSAlexander Bulekov
87a5665051SPaolo Bonziniadd_project_arguments(config_host['QEMU_CFLAGS'].split(),
88a5665051SPaolo Bonzini                      native: false, language: ['c', 'objc'])
89a5665051SPaolo Bonziniadd_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
90a5665051SPaolo Bonzini                      native: false, language: 'cpp')
91a5665051SPaolo Bonziniadd_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
92a5665051SPaolo Bonzini                           native: false, language: ['c', 'cpp', 'objc'])
93a5665051SPaolo Bonziniadd_project_arguments(config_host['QEMU_INCLUDES'].split(),
94a5665051SPaolo Bonzini                      language: ['c', 'cpp', 'objc'])
95a5665051SPaolo Bonzini
96c46f76d1SAlexander Bulekov
97fc929892SMarc-André Lureaulink_language = meson.get_external_property('link_language', 'cpp')
98fc929892SMarc-André Lureauif link_language == 'cpp'
99fc929892SMarc-André Lureau  add_languages('cpp', required: true, native: false)
100fc929892SMarc-André Lureauendif
101a5665051SPaolo Bonziniif host_machine.system() == 'darwin'
102a5665051SPaolo Bonzini  add_languages('objc', required: false, native: false)
103a5665051SPaolo Bonziniendif
104a5665051SPaolo Bonzini
105968b4db3SPaolo Bonziniif 'SPARSE_CFLAGS' in config_host
106968b4db3SPaolo Bonzini  run_target('sparse',
107968b4db3SPaolo Bonzini             command: [find_program('scripts/check_sparse.py'),
108968b4db3SPaolo Bonzini                       config_host['SPARSE_CFLAGS'].split(),
109968b4db3SPaolo Bonzini                       'compile_commands.json'])
110968b4db3SPaolo Bonziniendif
111968b4db3SPaolo Bonzini
1126ec0e15dSPaolo Bonzini###########################################
1136ec0e15dSPaolo Bonzini# Target-specific checks and dependencies #
1146ec0e15dSPaolo Bonzini###########################################
1156ec0e15dSPaolo Bonzini
1166ec0e15dSPaolo Bonziniif targetos != 'linux' and get_option('mpath').enabled()
1176ec0e15dSPaolo Bonzini  error('Multipath is supported only on Linux')
1186ec0e15dSPaolo Bonziniendif
1196ec0e15dSPaolo Bonzini
120a81df1b6SPaolo Bonzinim = cc.find_library('m', required: false)
121a81df1b6SPaolo Bonziniutil = cc.find_library('util', required: false)
1224a96337dSPaolo Bonziniwinmm = []
123a81df1b6SPaolo Bonzinisocket = []
12404c6f1e7SMarc-André Lureauversion_res = []
125d92989aaSMarc-André Lureaucoref = []
126d92989aaSMarc-André Lureauiokit = []
127b4e312e9SPaolo Bonzinicocoa = not_found
128*8a19980eSPaolo Bonzinihvf = not_found
129a81df1b6SPaolo Bonziniif targetos == 'windows'
130a81df1b6SPaolo Bonzini  socket = cc.find_library('ws2_32')
1314a96337dSPaolo Bonzini  winmm = cc.find_library('winmm')
13204c6f1e7SMarc-André Lureau
13304c6f1e7SMarc-André Lureau  win = import('windows')
13404c6f1e7SMarc-André Lureau  version_res = win.compile_resources('version.rc',
13504c6f1e7SMarc-André Lureau                                      depend_files: files('pc-bios/qemu-nsis.ico'),
13604c6f1e7SMarc-André Lureau                                      include_directories: include_directories('.'))
137d92989aaSMarc-André Lureauelif targetos == 'darwin'
138d92989aaSMarc-André Lureau  coref = dependency('appleframeworks', modules: 'CoreFoundation')
139d92989aaSMarc-André Lureau  iokit = dependency('appleframeworks', modules: 'IOKit')
140b4e312e9SPaolo Bonzini  cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
141cfad62f1SPaolo Bonzinielif targetos == 'sunos'
142cfad62f1SPaolo Bonzini  socket = [cc.find_library('socket'),
143cfad62f1SPaolo Bonzini            cc.find_library('nsl'),
144cfad62f1SPaolo Bonzini            cc.find_library('resolv')]
145cfad62f1SPaolo Bonzinielif targetos == 'haiku'
146cfad62f1SPaolo Bonzini  socket = [cc.find_library('posix_error_mapper'),
147cfad62f1SPaolo Bonzini            cc.find_library('network'),
148cfad62f1SPaolo Bonzini            cc.find_library('bsd')]
149a81df1b6SPaolo Bonziniendif
1506ec0e15dSPaolo Bonzini
151*8a19980eSPaolo Bonziniaccelerators = []
152*8a19980eSPaolo Bonziniif not get_option('kvm').disabled() and targetos == 'linux'
153*8a19980eSPaolo Bonzini  accelerators += 'CONFIG_KVM'
154*8a19980eSPaolo Bonziniendif
155*8a19980eSPaolo Bonziniif not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
156*8a19980eSPaolo Bonzini  accelerators += 'CONFIG_XEN'
157*8a19980eSPaolo Bonzini  have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
158*8a19980eSPaolo Bonzinielse
159*8a19980eSPaolo Bonzini  have_xen_pci_passthrough = false
160*8a19980eSPaolo Bonziniendif
161*8a19980eSPaolo Bonziniif not get_option('whpx').disabled() and targetos == 'windows'
162*8a19980eSPaolo Bonzini  if get_option('whpx').enabled() and cpu != 'x86_64'
163*8a19980eSPaolo Bonzini    error('WHPX requires 64-bit host')
164*8a19980eSPaolo Bonzini  elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
165*8a19980eSPaolo Bonzini       cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
166*8a19980eSPaolo Bonzini    accelerators += 'CONFIG_WHPX'
167*8a19980eSPaolo Bonzini  endif
168*8a19980eSPaolo Bonziniendif
169*8a19980eSPaolo Bonziniif not get_option('hvf').disabled()
170*8a19980eSPaolo Bonzini  hvf = dependency('appleframeworks', modules: 'Hypervisor',
171*8a19980eSPaolo Bonzini                   required: get_option('hvf'))
172*8a19980eSPaolo Bonzini  if hvf.found()
173*8a19980eSPaolo Bonzini    accelerators += 'CONFIG_HVF'
174*8a19980eSPaolo Bonzini  endif
175*8a19980eSPaolo Bonziniendif
176*8a19980eSPaolo Bonziniif not get_option('hax').disabled()
177*8a19980eSPaolo Bonzini  if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
178*8a19980eSPaolo Bonzini    accelerators += 'CONFIG_HAX'
179*8a19980eSPaolo Bonzini  endif
180*8a19980eSPaolo Bonziniendif
181*8a19980eSPaolo Bonziniif not get_option('tcg').disabled()
182*8a19980eSPaolo Bonzini  if cpu not in supported_cpus
183*8a19980eSPaolo Bonzini    if 'CONFIG_TCG_INTERPRETER' in config_host
184*8a19980eSPaolo Bonzini      warning('Unsupported CPU @0@, will use TCG with TCI (experimental)'.format(cpu))
185*8a19980eSPaolo Bonzini    else
186*8a19980eSPaolo Bonzini      error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
187*8a19980eSPaolo Bonzini    endif
188*8a19980eSPaolo Bonzini  endif
189*8a19980eSPaolo Bonzini  accelerators += 'CONFIG_TCG'
190*8a19980eSPaolo Bonzini  config_host += { 'CONFIG_TCG': 'y' }
191*8a19980eSPaolo Bonziniendif
192*8a19980eSPaolo Bonzini
193*8a19980eSPaolo Bonziniif 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
194*8a19980eSPaolo Bonzini  error('KVM not available on this platform')
195*8a19980eSPaolo Bonziniendif
196*8a19980eSPaolo Bonziniif 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
197*8a19980eSPaolo Bonzini  error('HVF not available on this platform')
198*8a19980eSPaolo Bonziniendif
199*8a19980eSPaolo Bonziniif 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
200*8a19980eSPaolo Bonzini  error('WHPX not available on this platform')
201*8a19980eSPaolo Bonziniendif
202*8a19980eSPaolo Bonziniif not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
203*8a19980eSPaolo Bonzini  if 'CONFIG_XEN' in accelerators
204*8a19980eSPaolo Bonzini    error('Xen PCI passthrough not available on this platform')
205*8a19980eSPaolo Bonzini  else
206*8a19980eSPaolo Bonzini    error('Xen PCI passthrough requested but Xen not enabled')
207*8a19980eSPaolo Bonzini  endif
208*8a19980eSPaolo Bonziniendif
209b4e312e9SPaolo Bonziniif not cocoa.found() and get_option('cocoa').enabled()
210b4e312e9SPaolo Bonzini  error('Cocoa not available on this platform')
211b4e312e9SPaolo Bonziniendif
212b4e312e9SPaolo Bonzini
2136ec0e15dSPaolo Bonzini################
2146ec0e15dSPaolo Bonzini# Dependencies #
2156ec0e15dSPaolo Bonzini################
2166ec0e15dSPaolo Bonzini
217215b0c2fSPaolo Bonzini# The path to glib.h is added to all compilation commands.  This was
218215b0c2fSPaolo Bonzini# grandfathered in from the QEMU Makefiles.
219215b0c2fSPaolo Bonziniadd_project_arguments(config_host['GLIB_CFLAGS'].split(),
220215b0c2fSPaolo Bonzini                      native: false, language: ['c', 'cpp', 'objc'])
221215b0c2fSPaolo Bonziniglib = declare_dependency(link_args: config_host['GLIB_LIBS'].split())
222a81df1b6SPaolo Bonzinigio = not_found
223a81df1b6SPaolo Bonziniif 'CONFIG_GIO' in config_host
224a81df1b6SPaolo Bonzini  gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
225a81df1b6SPaolo Bonzini                           link_args: config_host['GIO_LIBS'].split())
226a81df1b6SPaolo Bonziniendif
227a81df1b6SPaolo Bonzinilttng = not_found
228a81df1b6SPaolo Bonziniif 'CONFIG_TRACE_UST' in config_host
229a81df1b6SPaolo Bonzini  lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
230a81df1b6SPaolo Bonziniendif
231a81df1b6SPaolo Bonziniurcubp = not_found
232a81df1b6SPaolo Bonziniif 'CONFIG_TRACE_UST' in config_host
233a81df1b6SPaolo Bonzini  urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
234a81df1b6SPaolo Bonziniendif
23546859d93SDaniel P. Berrangégcrypt = not_found
23646859d93SDaniel P. Berrangéif 'CONFIG_GCRYPT' in config_host
23746859d93SDaniel P. Berrangé  gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
23846859d93SDaniel P. Berrangé                              link_args: config_host['GCRYPT_LIBS'].split())
23946859d93SDaniel P. Berrangéendif
240a81df1b6SPaolo Bonzininettle = not_found
241a81df1b6SPaolo Bonziniif 'CONFIG_NETTLE' in config_host
242a81df1b6SPaolo Bonzini  nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
243a81df1b6SPaolo Bonzini                              link_args: config_host['NETTLE_LIBS'].split())
244a81df1b6SPaolo Bonziniendif
245a81df1b6SPaolo Bonzinignutls = not_found
246a81df1b6SPaolo Bonziniif 'CONFIG_GNUTLS' in config_host
247a81df1b6SPaolo Bonzini  gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
248a81df1b6SPaolo Bonzini                              link_args: config_host['GNUTLS_LIBS'].split())
249a81df1b6SPaolo Bonziniendif
250b7612f45SPaolo Bonzinipixman = not_found
251b7612f45SPaolo Bonziniif have_system or have_tools
252b7612f45SPaolo Bonzini  pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
2531a94933fSPaolo Bonzini                      method: 'pkg-config', static: enable_static)
254b7612f45SPaolo Bonziniendif
2555e7fbd25SMarc-André Lureaupam = not_found
2565e7fbd25SMarc-André Lureauif 'CONFIG_AUTH_PAM' in config_host
2575e7fbd25SMarc-André Lureau  pam = cc.find_library('pam')
2585e7fbd25SMarc-André Lureauendif
2595e5733e5SMarc-André Lureaulibaio = cc.find_library('aio', required: false)
2601ffb3bbbSPaolo Bonzinizlib = dependency('zlib', required: true, static: enable_static)
2615e5733e5SMarc-André Lureaulinux_io_uring = not_found
2625e5733e5SMarc-André Lureauif 'CONFIG_LINUX_IO_URING' in config_host
2635e5733e5SMarc-André Lureau  linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
2645e5733e5SMarc-André Lureau                                      link_args: config_host['LINUX_IO_URING_LIBS'].split())
2655e5733e5SMarc-André Lureauendif
2665e5733e5SMarc-André Lureaulibxml2 = not_found
2675e5733e5SMarc-André Lureauif 'CONFIG_LIBXML2' in config_host
2685e5733e5SMarc-André Lureau  libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
2695e5733e5SMarc-André Lureau                               link_args: config_host['LIBXML2_LIBS'].split())
2705e5733e5SMarc-André Lureauendif
2715e5733e5SMarc-André Lureaulibnfs = not_found
2725e5733e5SMarc-André Lureauif 'CONFIG_LIBNFS' in config_host
2735e5733e5SMarc-André Lureau  libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
2745e5733e5SMarc-André Lureauendif
275ec0d5893SMarc-André Lureaulibattr = not_found
276ec0d5893SMarc-André Lureauif 'CONFIG_ATTR' in config_host
277ec0d5893SMarc-André Lureau  libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
278ec0d5893SMarc-André Lureauendif
2793f99cf57SPaolo Bonziniseccomp = not_found
2803f99cf57SPaolo Bonziniif 'CONFIG_SECCOMP' in config_host
2813f99cf57SPaolo Bonzini  seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
2823f99cf57SPaolo Bonzini                               link_args: config_host['SECCOMP_LIBS'].split())
2833f99cf57SPaolo Bonziniendif
2843f99cf57SPaolo Bonzinilibcap_ng = not_found
2853f99cf57SPaolo Bonziniif 'CONFIG_LIBCAP_NG' in config_host
2863f99cf57SPaolo Bonzini  libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
2873f99cf57SPaolo Bonziniendif
2881917ec6dSPaolo Bonziniif get_option('xkbcommon').auto() and not have_system and not have_tools
2891917ec6dSPaolo Bonzini  xkbcommon = not_found
2901917ec6dSPaolo Bonzinielse
2911917ec6dSPaolo Bonzini  xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
2921a94933fSPaolo Bonzini                         method: 'pkg-config', static: enable_static)
293ade60d4fSMarc-André Lureauendif
294cdaf0722SMarc-André Lureauslirp = not_found
295cdaf0722SMarc-André Lureauif config_host.has_key('CONFIG_SLIRP')
296cdaf0722SMarc-André Lureau  slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
297cdaf0722SMarc-André Lureau                             link_args: config_host['SLIRP_LIBS'].split())
298cdaf0722SMarc-André Lureauendif
299cdaf0722SMarc-André Lureauvde = not_found
300cdaf0722SMarc-André Lureauif config_host.has_key('CONFIG_VDE')
301cdaf0722SMarc-André Lureau  vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
302cdaf0722SMarc-André Lureauendif
303478e943fSPaolo Bonzinipulse = not_found
304478e943fSPaolo Bonziniif 'CONFIG_LIBPULSE' in config_host
305478e943fSPaolo Bonzini  pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
306478e943fSPaolo Bonzini                             link_args: config_host['PULSE_LIBS'].split())
307478e943fSPaolo Bonziniendif
308478e943fSPaolo Bonzinialsa = not_found
309478e943fSPaolo Bonziniif 'CONFIG_ALSA' in config_host
310478e943fSPaolo Bonzini  alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
311478e943fSPaolo Bonzini                            link_args: config_host['ALSA_LIBS'].split())
312478e943fSPaolo Bonziniendif
313478e943fSPaolo Bonzinijack = not_found
314478e943fSPaolo Bonziniif 'CONFIG_LIBJACK' in config_host
315478e943fSPaolo Bonzini  jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
316478e943fSPaolo Bonziniendif
3172634733cSPaolo Bonzinispice = not_found
3182634733cSPaolo Bonziniif 'CONFIG_SPICE' in config_host
3192634733cSPaolo Bonzini  spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
3202634733cSPaolo Bonzini                             link_args: config_host['SPICE_LIBS'].split())
3212634733cSPaolo Bonziniendif
3225ee24e78SMarc-André Lureaurt = cc.find_library('rt', required: false)
323ccf7afa5SPaolo Bonzinilibdl = not_found
324ccf7afa5SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host
325ccf7afa5SPaolo Bonzini  libdl = cc.find_library('dl', required: true)
326ccf7afa5SPaolo Bonziniendif
32799650b62SPaolo Bonzinilibiscsi = not_found
32899650b62SPaolo Bonziniif 'CONFIG_LIBISCSI' in config_host
32999650b62SPaolo Bonzini  libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
33099650b62SPaolo Bonzini                                link_args: config_host['LIBISCSI_LIBS'].split())
33199650b62SPaolo Bonziniendif
3325e5733e5SMarc-André Lureauzstd = not_found
3335e5733e5SMarc-André Lureauif 'CONFIG_ZSTD' in config_host
3345e5733e5SMarc-André Lureau  zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
3355e5733e5SMarc-André Lureau                            link_args: config_host['ZSTD_LIBS'].split())
3365e5733e5SMarc-André Lureauendif
337ea458960SMarc-André Lureaugbm = not_found
338ea458960SMarc-André Lureauif 'CONFIG_GBM' in config_host
339ea458960SMarc-André Lureau  gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
340ea458960SMarc-André Lureau                           link_args: config_host['GBM_LIBS'].split())
341ea458960SMarc-André Lureauendif
342ea458960SMarc-André Lureauvirgl = not_found
343ea458960SMarc-André Lureauif 'CONFIG_VIRGL' in config_host
344ea458960SMarc-André Lureau  virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
345ea458960SMarc-André Lureau                             link_args: config_host['VIRGL_LIBS'].split())
346ea458960SMarc-André Lureauendif
3471d7bb6abSMarc-André Lureaucurl = not_found
3481d7bb6abSMarc-André Lureauif 'CONFIG_CURL' in config_host
3491d7bb6abSMarc-André Lureau  curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
3501d7bb6abSMarc-André Lureau                            link_args: config_host['CURL_LIBS'].split())
3511d7bb6abSMarc-André Lureauendif
352f15bff25SPaolo Bonzinilibudev = not_found
353f01496a3SPaolo Bonziniif targetos == 'linux' and (have_system or have_tools)
3546ec0e15dSPaolo Bonzini  libudev = dependency('libudev',
3556ec0e15dSPaolo Bonzini                       required: get_option('mpath').enabled(),
3566ec0e15dSPaolo Bonzini                       static: enable_static)
357f15bff25SPaolo Bonziniendif
3586ec0e15dSPaolo Bonzini
3596ec0e15dSPaolo Bonzinimpathpersist = not_found
3606ec0e15dSPaolo Bonzinimpathpersist_new_api = false
3616ec0e15dSPaolo Bonziniif targetos == 'linux' and have_tools and not get_option('mpath').disabled()
3626ec0e15dSPaolo Bonzini  mpath_test_source_new = '''
3636ec0e15dSPaolo Bonzini    #include <libudev.h>
3646ec0e15dSPaolo Bonzini    #include <mpath_persist.h>
3656ec0e15dSPaolo Bonzini    unsigned mpath_mx_alloc_len = 1024;
3666ec0e15dSPaolo Bonzini    int logsink;
3676ec0e15dSPaolo Bonzini    static struct config *multipath_conf;
3686ec0e15dSPaolo Bonzini    extern struct udev *udev;
3696ec0e15dSPaolo Bonzini    extern struct config *get_multipath_config(void);
3706ec0e15dSPaolo Bonzini    extern void put_multipath_config(struct config *conf);
3716ec0e15dSPaolo Bonzini    struct udev *udev;
3726ec0e15dSPaolo Bonzini    struct config *get_multipath_config(void) { return multipath_conf; }
3736ec0e15dSPaolo Bonzini    void put_multipath_config(struct config *conf) { }
3746ec0e15dSPaolo Bonzini    int main(void) {
3756ec0e15dSPaolo Bonzini        udev = udev_new();
3766ec0e15dSPaolo Bonzini        multipath_conf = mpath_lib_init();
3776ec0e15dSPaolo Bonzini        return 0;
3786ec0e15dSPaolo Bonzini    }'''
3796ec0e15dSPaolo Bonzini  mpath_test_source_old = '''
3806ec0e15dSPaolo Bonzini      #include <libudev.h>
3816ec0e15dSPaolo Bonzini      #include <mpath_persist.h>
3826ec0e15dSPaolo Bonzini      unsigned mpath_mx_alloc_len = 1024;
3836ec0e15dSPaolo Bonzini      int logsink;
3846ec0e15dSPaolo Bonzini      int main(void) {
3856ec0e15dSPaolo Bonzini          struct udev *udev = udev_new();
3866ec0e15dSPaolo Bonzini          mpath_lib_init(udev);
3876ec0e15dSPaolo Bonzini          return 0;
3886ec0e15dSPaolo Bonzini      }'''
38943b43a40SPaolo Bonzini  mpathlibs = [libudev]
39043b43a40SPaolo Bonzini  if enable_static
39143b43a40SPaolo Bonzini    mpathlibs += cc.find_library('devmapper',
3926ec0e15dSPaolo Bonzini                                   required: get_option('mpath'),
3936ec0e15dSPaolo Bonzini                                   static: enable_static)
39443b43a40SPaolo Bonzini  endif
39543b43a40SPaolo Bonzini  mpathlibs += cc.find_library('multipath',
3966ec0e15dSPaolo Bonzini                               required: get_option('mpath'),
3976ec0e15dSPaolo Bonzini                               static: enable_static)
39843b43a40SPaolo Bonzini  mpathlibs += cc.find_library('mpathpersist',
39943b43a40SPaolo Bonzini                               required: get_option('mpath'),
40043b43a40SPaolo Bonzini                               static: enable_static)
40143b43a40SPaolo Bonzini  foreach lib: mpathlibs
40243b43a40SPaolo Bonzini    if not lib.found()
40343b43a40SPaolo Bonzini      mpathlibs = []
40443b43a40SPaolo Bonzini      break
40543b43a40SPaolo Bonzini    endif
40643b43a40SPaolo Bonzini  endforeach
40743b43a40SPaolo Bonzini  if mpathlibs.length() > 0
4086ec0e15dSPaolo Bonzini    if cc.links(mpath_test_source_new, dependencies: mpathlibs)
4096ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
4106ec0e15dSPaolo Bonzini      mpathpersist_new_api = true
4116ec0e15dSPaolo Bonzini    elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
4126ec0e15dSPaolo Bonzini      mpathpersist = declare_dependency(dependencies: mpathlibs)
4136ec0e15dSPaolo Bonzini    else
4146ec0e15dSPaolo Bonzini      if get_option('mpath').enabled()
4156ec0e15dSPaolo Bonzini        error('Cannot detect libmpathpersist API')
4166ec0e15dSPaolo Bonzini      else
4176ec0e15dSPaolo Bonzini        warning('Cannot detect libmpathpersist API, disabling')
4186ec0e15dSPaolo Bonzini      endif
4196ec0e15dSPaolo Bonzini    endif
4206ec0e15dSPaolo Bonzini  endif
4216ec0e15dSPaolo Bonziniendif
4226ec0e15dSPaolo Bonzini
4232634733cSPaolo Bonzinibrlapi = not_found
4242634733cSPaolo Bonziniif 'CONFIG_BRLAPI' in config_host
4252634733cSPaolo Bonzini  brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
4262634733cSPaolo Bonziniendif
42735be72baSPaolo Bonzini
428760e4327SPaolo Bonzinisdl = not_found
429760e4327SPaolo Bonziniif have_system
430363743daSYonggang Luo  sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
43135be72baSPaolo Bonzini  sdl_image = not_found
432760e4327SPaolo Bonziniendif
43335be72baSPaolo Bonziniif sdl.found()
43435be72baSPaolo Bonzini  # work around 2.0.8 bug
43535be72baSPaolo Bonzini  sdl = declare_dependency(compile_args: '-Wno-undef',
43635be72baSPaolo Bonzini                           dependencies: sdl)
4377161a433SVolker Rümelin  sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
4381a94933fSPaolo Bonzini                         method: 'pkg-config', static: enable_static)
43935be72baSPaolo Bonzinielse
44035be72baSPaolo Bonzini  if get_option('sdl_image').enabled()
441a8dc2aceSSergei Trofimovich    error('sdl-image required, but SDL was @0@'.format(
442a8dc2aceSSergei Trofimovich          get_option('sdl').disabled() ? 'disabled' : 'not found'))
4432634733cSPaolo Bonzini  endif
44435be72baSPaolo Bonzini  sdl_image = not_found
44535be72baSPaolo Bonziniendif
44635be72baSPaolo Bonzini
4475e5733e5SMarc-André Lureaurbd = not_found
4485e5733e5SMarc-André Lureauif 'CONFIG_RBD' in config_host
4495e5733e5SMarc-André Lureau  rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
4505e5733e5SMarc-André Lureauendif
4515e5733e5SMarc-André Lureauglusterfs = not_found
4525e5733e5SMarc-André Lureauif 'CONFIG_GLUSTERFS' in config_host
4535e5733e5SMarc-André Lureau  glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
4545e5733e5SMarc-André Lureau                                 link_args: config_host['GLUSTERFS_LIBS'].split())
4555e5733e5SMarc-André Lureauendif
4565e5733e5SMarc-André Lureaulibssh = not_found
4575e5733e5SMarc-André Lureauif 'CONFIG_LIBSSH' in config_host
4585e5733e5SMarc-André Lureau  libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
4595e5733e5SMarc-André Lureau                              link_args: config_host['LIBSSH_LIBS'].split())
4605e5733e5SMarc-André Lureauendif
4615e5733e5SMarc-André Lureaulibbzip2 = not_found
4625e5733e5SMarc-André Lureauif 'CONFIG_BZIP2' in config_host
4635e5733e5SMarc-André Lureau  libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
4645e5733e5SMarc-André Lureauendif
4655e5733e5SMarc-André Lureauliblzfse = not_found
4665e5733e5SMarc-André Lureauif 'CONFIG_LZFSE' in config_host
4675e5733e5SMarc-André Lureau  liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
4685e5733e5SMarc-André Lureauendif
469478e943fSPaolo Bonzinioss = not_found
470478e943fSPaolo Bonziniif 'CONFIG_AUDIO_OSS' in config_host
471478e943fSPaolo Bonzini  oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
472478e943fSPaolo Bonziniendif
473478e943fSPaolo Bonzinidsound = not_found
474478e943fSPaolo Bonziniif 'CONFIG_AUDIO_DSOUND' in config_host
475478e943fSPaolo Bonzini  dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
476478e943fSPaolo Bonziniendif
477478e943fSPaolo Bonzinicoreaudio = not_found
478478e943fSPaolo Bonziniif 'CONFIG_AUDIO_COREAUDIO' in config_host
479478e943fSPaolo Bonzini  coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
480478e943fSPaolo Bonziniendif
4812b1ccdf4SMarc-André Lureauopengl = not_found
4822b1ccdf4SMarc-André Lureauif 'CONFIG_OPENGL' in config_host
483de2d3005SPaolo Bonzini  opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
484de2d3005SPaolo Bonzini                              link_args: config_host['OPENGL_LIBS'].split())
4852b1ccdf4SMarc-André Lureauendif
4862b1ccdf4SMarc-André Lureaugtk = not_found
4872b1ccdf4SMarc-André Lureauif 'CONFIG_GTK' in config_host
4882b1ccdf4SMarc-André Lureau  gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
4892b1ccdf4SMarc-André Lureau                              link_args: config_host['GTK_LIBS'].split())
4902b1ccdf4SMarc-André Lureauendif
4912b1ccdf4SMarc-André Lureauvte = not_found
4922b1ccdf4SMarc-André Lureauif 'CONFIG_VTE' in config_host
4932b1ccdf4SMarc-André Lureau  vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
4942b1ccdf4SMarc-André Lureau                           link_args: config_host['VTE_LIBS'].split())
4952b1ccdf4SMarc-André Lureauendif
4962b1ccdf4SMarc-André Lureaux11 = not_found
4972b1ccdf4SMarc-André Lureauif 'CONFIG_X11' in config_host
4982b1ccdf4SMarc-André Lureau  x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
4992b1ccdf4SMarc-André Lureau                           link_args: config_host['X11_LIBS'].split())
5002b1ccdf4SMarc-André Lureauendif
5012b1ccdf4SMarc-André Lureaucurses = not_found
5022b1ccdf4SMarc-André Lureauif 'CONFIG_CURSES' in config_host
5032b1ccdf4SMarc-André Lureau  curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
5042b1ccdf4SMarc-André Lureau                              link_args: config_host['CURSES_LIBS'].split())
5052b1ccdf4SMarc-André Lureauendif
5062b1ccdf4SMarc-André Lureauiconv = not_found
5072b1ccdf4SMarc-André Lureauif 'CONFIG_ICONV' in config_host
5082b1ccdf4SMarc-André Lureau  iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
5092b1ccdf4SMarc-André Lureau                             link_args: config_host['ICONV_LIBS'].split())
5102b1ccdf4SMarc-André Lureauendif
511a0b93237SPaolo Bonzinivnc = not_found
5122b1ccdf4SMarc-André Lureaupng = not_found
5132b1ccdf4SMarc-André Lureaujpeg = not_found
5142b1ccdf4SMarc-André Lureausasl = not_found
515a0b93237SPaolo Bonziniif get_option('vnc').enabled()
516a0b93237SPaolo Bonzini  vnc = declare_dependency() # dummy dependency
517a0b93237SPaolo Bonzini  png = dependency('libpng', required: get_option('vnc_png'),
5181a94933fSPaolo Bonzini                   method: 'pkg-config', static: enable_static)
519a0b93237SPaolo Bonzini  jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
520a0b93237SPaolo Bonzini                         required: get_option('vnc_jpeg'),
521a0b93237SPaolo Bonzini                         static: enable_static)
522a0b93237SPaolo Bonzini  sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
523a0b93237SPaolo Bonzini                         required: get_option('vnc_sasl'),
524a0b93237SPaolo Bonzini                         static: enable_static)
525a0b93237SPaolo Bonzini  if sasl.found()
526a0b93237SPaolo Bonzini    sasl = declare_dependency(dependencies: sasl,
527a0b93237SPaolo Bonzini                              compile_args: '-DSTRUCT_IOVEC_DEFINED')
528a0b93237SPaolo Bonzini  endif
5292b1ccdf4SMarc-André Lureauendif
5304a96337dSPaolo Bonzinifdt = not_found
5314a96337dSPaolo Bonziniif 'CONFIG_FDT' in config_host
5324a96337dSPaolo Bonzini  fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
5334a96337dSPaolo Bonzini                           link_args: config_host['FDT_LIBS'].split())
5344a96337dSPaolo Bonziniendif
535708eab42SMarc-André Lureausnappy = not_found
536708eab42SMarc-André Lureauif 'CONFIG_SNAPPY' in config_host
537708eab42SMarc-André Lureau  snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
538708eab42SMarc-André Lureauendif
539708eab42SMarc-André Lureaulzo = not_found
540708eab42SMarc-André Lureauif 'CONFIG_LZO' in config_host
541708eab42SMarc-André Lureau  lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
542708eab42SMarc-André Lureauendif
54355166230SMarc-André Lureaurdma = not_found
54455166230SMarc-André Lureauif 'CONFIG_RDMA' in config_host
54555166230SMarc-André Lureau  rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
54655166230SMarc-André Lureauendif
547ab318051SMarc-André Lureaunuma = not_found
548ab318051SMarc-André Lureauif 'CONFIG_NUMA' in config_host
549ab318051SMarc-André Lureau  numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
550ab318051SMarc-André Lureauendif
551582ea95fSMarc-André Lureauxen = not_found
552582ea95fSMarc-André Lureauif 'CONFIG_XEN_BACKEND' in config_host
553582ea95fSMarc-André Lureau  xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
554582ea95fSMarc-André Lureau                           link_args: config_host['XEN_LIBS'].split())
555582ea95fSMarc-André Lureauendif
55606677ce1SPaolo Bonzinicacard = not_found
55706677ce1SPaolo Bonziniif 'CONFIG_SMARTCARD' in config_host
55806677ce1SPaolo Bonzini  cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
55906677ce1SPaolo Bonzini                              link_args: config_host['SMARTCARD_LIBS'].split())
56006677ce1SPaolo Bonziniendif
5610a40bcb7SCésar Belleyu2f = not_found
5620a40bcb7SCésar Belleyif have_system
5630a40bcb7SCésar Belley  u2f = dependency('u2f-emu', required: get_option('u2f'),
5640a40bcb7SCésar Belley                   method: 'pkg-config',
5650a40bcb7SCésar Belley                   static: enable_static)
5660a40bcb7SCésar Belleyendif
56706677ce1SPaolo Bonziniusbredir = not_found
56806677ce1SPaolo Bonziniif 'CONFIG_USB_REDIR' in config_host
56906677ce1SPaolo Bonzini  usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
57006677ce1SPaolo Bonzini                                link_args: config_host['USB_REDIR_LIBS'].split())
57106677ce1SPaolo Bonziniendif
57206677ce1SPaolo Bonzinilibusb = not_found
57306677ce1SPaolo Bonziniif 'CONFIG_USB_LIBUSB' in config_host
57406677ce1SPaolo Bonzini  libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
57506677ce1SPaolo Bonzini                              link_args: config_host['LIBUSB_LIBS'].split())
57606677ce1SPaolo Bonziniendif
577c9322ab5SMarc-André Lureaucapstone = not_found
578c9322ab5SMarc-André Lureauif 'CONFIG_CAPSTONE' in config_host
579c9322ab5SMarc-André Lureau  capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(),
580c9322ab5SMarc-André Lureau                                link_args: config_host['CAPSTONE_LIBS'].split())
581c9322ab5SMarc-André Lureauendif
582c9322ab5SMarc-André Lureaulibpmem = not_found
583c9322ab5SMarc-André Lureauif 'CONFIG_LIBPMEM' in config_host
584c9322ab5SMarc-André Lureau  libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
585c9322ab5SMarc-André Lureau                               link_args: config_host['LIBPMEM_LIBS'].split())
586c9322ab5SMarc-André Lureauendif
587c7c91a74SBruce Rogerslibdaxctl = not_found
588c7c91a74SBruce Rogersif 'CONFIG_LIBDAXCTL' in config_host
589c7c91a74SBruce Rogers  libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
590c7c91a74SBruce Rogersendif
5918ce0a45fSMarc-André Lureautasn1 = not_found
5928ce0a45fSMarc-André Lureauif 'CONFIG_TASN1' in config_host
5938ce0a45fSMarc-André Lureau  tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
5948ce0a45fSMarc-André Lureau                             link_args: config_host['TASN1_LIBS'].split())
5958ce0a45fSMarc-André Lureauendif
596af04e89dSMarc-André Lureaukeyutils = dependency('libkeyutils', required: false,
597af04e89dSMarc-André Lureau                      method: 'pkg-config', static: enable_static)
598a81df1b6SPaolo Bonzini
5993909def8SMarc-André Lureauhas_gettid = cc.has_function('gettid')
6003909def8SMarc-André Lureau
601aa087962SPaolo Bonzini# Malloc tests
602aa087962SPaolo Bonzini
603aa087962SPaolo Bonzinimalloc = []
604aa087962SPaolo Bonziniif get_option('malloc') == 'system'
605aa087962SPaolo Bonzini  has_malloc_trim = \
606aa087962SPaolo Bonzini    not get_option('malloc_trim').disabled() and \
607aa087962SPaolo Bonzini    cc.links('''#include <malloc.h>
608aa087962SPaolo Bonzini                int main(void) { malloc_trim(0); return 0; }''')
609aa087962SPaolo Bonzinielse
610aa087962SPaolo Bonzini  has_malloc_trim = false
611aa087962SPaolo Bonzini  malloc = cc.find_library(get_option('malloc'), required: true)
612aa087962SPaolo Bonziniendif
613aa087962SPaolo Bonziniif not has_malloc_trim and get_option('malloc_trim').enabled()
614aa087962SPaolo Bonzini  if get_option('malloc') == 'system'
615aa087962SPaolo Bonzini    error('malloc_trim not available on this platform.')
616aa087962SPaolo Bonzini  else
617aa087962SPaolo Bonzini    error('malloc_trim not available with non-libc memory allocator')
618aa087962SPaolo Bonzini  endif
619aa087962SPaolo Bonziniendif
620aa087962SPaolo Bonzini
621859aef02SPaolo Bonzini# Create config-host.h
622859aef02SPaolo Bonzini
623b4e312e9SPaolo Bonziniconfig_host_data.set('CONFIG_COCOA', cocoa.found())
624f01496a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBUDEV', libudev.found())
6256ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH', mpathpersist.found())
6266ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
62735be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL', sdl.found())
62835be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
629a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC', vnc.found())
630a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
631a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_PNG', png.found())
632a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_SASL', sasl.found())
6334113f4cfSLaurent Vivierconfig_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
634af04e89dSMarc-André Lureauconfig_host_data.set('CONFIG_KEYUTILS', keyutils.found())
6353909def8SMarc-André Lureauconfig_host_data.set('CONFIG_GETTID', has_gettid)
636aa087962SPaolo Bonziniconfig_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
637859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
638859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
639859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
640859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
641859aef02SPaolo Bonzini
642859aef02SPaolo Bonziniarrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
643f4f5ed2cSPaolo Bonzinistrings = ['HOST_DSOSUF', 'CONFIG_IASL', 'bindir', 'prefix', 'qemu_confdir', 'qemu_datadir',
644859aef02SPaolo Bonzini           'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
645f4f5ed2cSPaolo Bonzini           'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath', 'sysconfdir']
646859aef02SPaolo Bonziniforeach k, v: config_host
647859aef02SPaolo Bonzini  if arrays.contains(k)
648859aef02SPaolo Bonzini    if v != ''
649859aef02SPaolo Bonzini      v = '"' + '", "'.join(v.split()) + '", '
650859aef02SPaolo Bonzini    endif
651859aef02SPaolo Bonzini    config_host_data.set(k, v)
652859aef02SPaolo Bonzini  elif k == 'ARCH'
653859aef02SPaolo Bonzini    config_host_data.set('HOST_' + v.to_upper(), 1)
654859aef02SPaolo Bonzini  elif strings.contains(k)
655859aef02SPaolo Bonzini    if not k.startswith('CONFIG_')
656859aef02SPaolo Bonzini      k = 'CONFIG_' + k.to_upper()
657859aef02SPaolo Bonzini    endif
658859aef02SPaolo Bonzini    config_host_data.set_quoted(k, v)
659859aef02SPaolo Bonzini  elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
660859aef02SPaolo Bonzini    config_host_data.set(k, v == 'y' ? 1 : v)
661859aef02SPaolo Bonzini  endif
662859aef02SPaolo Bonziniendforeach
663859aef02SPaolo Bonzinigenh += configure_file(output: 'config-host.h', configuration: config_host_data)
664859aef02SPaolo Bonzini
6652becc36aSPaolo Bonziniminikconf = find_program('scripts/minikconf.py')
66605512f55SPaolo Bonziniconfig_all = {}
667a98006bcSPaolo Bonziniconfig_all_devices = {}
668ca0fc784SPaolo Bonziniconfig_all_disas = {}
6692becc36aSPaolo Bonziniconfig_devices_mak_list = []
6702becc36aSPaolo Bonziniconfig_devices_h = {}
671859aef02SPaolo Bonziniconfig_target_h = {}
6722becc36aSPaolo Bonziniconfig_target_mak = {}
673ca0fc784SPaolo Bonzini
674ca0fc784SPaolo Bonzinidisassemblers = {
675ca0fc784SPaolo Bonzini  'alpha' : ['CONFIG_ALPHA_DIS'],
676ca0fc784SPaolo Bonzini  'arm' : ['CONFIG_ARM_DIS'],
677ca0fc784SPaolo Bonzini  'avr' : ['CONFIG_AVR_DIS'],
678ca0fc784SPaolo Bonzini  'cris' : ['CONFIG_CRIS_DIS'],
679ca0fc784SPaolo Bonzini  'hppa' : ['CONFIG_HPPA_DIS'],
680ca0fc784SPaolo Bonzini  'i386' : ['CONFIG_I386_DIS'],
681ca0fc784SPaolo Bonzini  'x86_64' : ['CONFIG_I386_DIS'],
682ca0fc784SPaolo Bonzini  'x32' : ['CONFIG_I386_DIS'],
683ca0fc784SPaolo Bonzini  'lm32' : ['CONFIG_LM32_DIS'],
684ca0fc784SPaolo Bonzini  'm68k' : ['CONFIG_M68K_DIS'],
685ca0fc784SPaolo Bonzini  'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
686ca0fc784SPaolo Bonzini  'mips' : ['CONFIG_MIPS_DIS'],
687ca0fc784SPaolo Bonzini  'moxie' : ['CONFIG_MOXIE_DIS'],
688ca0fc784SPaolo Bonzini  'nios2' : ['CONFIG_NIOS2_DIS'],
689ca0fc784SPaolo Bonzini  'or1k' : ['CONFIG_OPENRISC_DIS'],
690ca0fc784SPaolo Bonzini  'ppc' : ['CONFIG_PPC_DIS'],
691ca0fc784SPaolo Bonzini  'riscv' : ['CONFIG_RISCV_DIS'],
692ca0fc784SPaolo Bonzini  'rx' : ['CONFIG_RX_DIS'],
693ca0fc784SPaolo Bonzini  's390' : ['CONFIG_S390_DIS'],
694ca0fc784SPaolo Bonzini  'sh4' : ['CONFIG_SH4_DIS'],
695ca0fc784SPaolo Bonzini  'sparc' : ['CONFIG_SPARC_DIS'],
696ca0fc784SPaolo Bonzini  'xtensa' : ['CONFIG_XTENSA_DIS'],
697ca0fc784SPaolo Bonzini}
698ca0fc784SPaolo Bonziniif link_language == 'cpp'
699ca0fc784SPaolo Bonzini  disassemblers += {
700ca0fc784SPaolo Bonzini    'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
701ca0fc784SPaolo Bonzini    'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
702ca0fc784SPaolo Bonzini    'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
703ca0fc784SPaolo Bonzini  }
704ca0fc784SPaolo Bonziniendif
705ca0fc784SPaolo Bonzini
7062becc36aSPaolo Bonzinikconfig_external_symbols = [
7072becc36aSPaolo Bonzini  'CONFIG_KVM',
7082becc36aSPaolo Bonzini  'CONFIG_XEN',
7092becc36aSPaolo Bonzini  'CONFIG_TPM',
7102becc36aSPaolo Bonzini  'CONFIG_SPICE',
7112becc36aSPaolo Bonzini  'CONFIG_IVSHMEM',
7122becc36aSPaolo Bonzini  'CONFIG_OPENGL',
7132becc36aSPaolo Bonzini  'CONFIG_X11',
7142becc36aSPaolo Bonzini  'CONFIG_VHOST_USER',
71540bc0ca9SLaurent Vivier  'CONFIG_VHOST_VDPA',
7162becc36aSPaolo Bonzini  'CONFIG_VHOST_KERNEL',
7172becc36aSPaolo Bonzini  'CONFIG_VIRTFS',
7182becc36aSPaolo Bonzini  'CONFIG_LINUX',
7192becc36aSPaolo Bonzini  'CONFIG_PVRDMA',
7202becc36aSPaolo Bonzini]
721859aef02SPaolo Bonziniignored = ['TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_DIRS']
722ca0fc784SPaolo Bonzini
723a81df1b6SPaolo Bonziniforeach target : target_dirs
724859aef02SPaolo Bonzini  config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak')
725859aef02SPaolo Bonzini
726*8a19980eSPaolo Bonzini  have_accel = false
727*8a19980eSPaolo Bonzini  foreach sym: accelerators
728*8a19980eSPaolo Bonzini    if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
729*8a19980eSPaolo Bonzini      config_target += { sym: 'y' }
730*8a19980eSPaolo Bonzini      config_all += { sym: 'y' }
731*8a19980eSPaolo Bonzini      if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
732*8a19980eSPaolo Bonzini        config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
733*8a19980eSPaolo Bonzini      endif
734*8a19980eSPaolo Bonzini      have_accel = true
735*8a19980eSPaolo Bonzini    endif
736*8a19980eSPaolo Bonzini  endforeach
737*8a19980eSPaolo Bonzini  assert(have_accel)
738*8a19980eSPaolo Bonzini
739ca0fc784SPaolo Bonzini  foreach k, v: disassemblers
740ca0fc784SPaolo Bonzini    if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
741ca0fc784SPaolo Bonzini      foreach sym: v
742ca0fc784SPaolo Bonzini        config_target += { sym: 'y' }
743ca0fc784SPaolo Bonzini        config_all_disas += { sym: 'y' }
744ca0fc784SPaolo Bonzini      endforeach
745ca0fc784SPaolo Bonzini    endif
746ca0fc784SPaolo Bonzini  endforeach
747ca0fc784SPaolo Bonzini
748859aef02SPaolo Bonzini  config_target_data = configuration_data()
749859aef02SPaolo Bonzini  foreach k, v: config_target
750859aef02SPaolo Bonzini    if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
751859aef02SPaolo Bonzini      # do nothing
752859aef02SPaolo Bonzini    elif ignored.contains(k)
753859aef02SPaolo Bonzini      # do nothing
754859aef02SPaolo Bonzini    elif k == 'TARGET_BASE_ARCH'
755859aef02SPaolo Bonzini      config_target_data.set('TARGET_' + v.to_upper(), 1)
756859aef02SPaolo Bonzini    elif k == 'TARGET_NAME'
757859aef02SPaolo Bonzini      config_target_data.set_quoted(k, v)
758859aef02SPaolo Bonzini    elif v == 'y'
759859aef02SPaolo Bonzini      config_target_data.set(k, 1)
760859aef02SPaolo Bonzini    else
761859aef02SPaolo Bonzini      config_target_data.set(k, v)
762859aef02SPaolo Bonzini    endif
763859aef02SPaolo Bonzini  endforeach
764859aef02SPaolo Bonzini  config_target_h += {target: configure_file(output: target + '-config-target.h',
765859aef02SPaolo Bonzini                                               configuration: config_target_data)}
7662becc36aSPaolo Bonzini
7672becc36aSPaolo Bonzini  if target.endswith('-softmmu')
7682becc36aSPaolo Bonzini    base_kconfig = []
7692becc36aSPaolo Bonzini    foreach sym : kconfig_external_symbols
770859aef02SPaolo Bonzini      if sym in config_target or sym in config_host
7712becc36aSPaolo Bonzini        base_kconfig += '@0@=y'.format(sym)
7722becc36aSPaolo Bonzini      endif
7732becc36aSPaolo Bonzini    endforeach
7742becc36aSPaolo Bonzini
7752becc36aSPaolo Bonzini    config_devices_mak = target + '-config-devices.mak'
7762becc36aSPaolo Bonzini    config_devices_mak = configure_file(
7771bb4cb1cSPaolo Bonzini      input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
7782becc36aSPaolo Bonzini      output: config_devices_mak,
7792becc36aSPaolo Bonzini      depfile: config_devices_mak + '.d',
7802becc36aSPaolo Bonzini      capture: true,
7812becc36aSPaolo Bonzini      command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
7822becc36aSPaolo Bonzini                config_devices_mak, '@DEPFILE@', '@INPUT@',
7832becc36aSPaolo Bonzini                base_kconfig])
784859aef02SPaolo Bonzini
785859aef02SPaolo Bonzini    config_devices_data = configuration_data()
786859aef02SPaolo Bonzini    config_devices = keyval.load(config_devices_mak)
787859aef02SPaolo Bonzini    foreach k, v: config_devices
788859aef02SPaolo Bonzini      config_devices_data.set(k, 1)
789859aef02SPaolo Bonzini    endforeach
7902becc36aSPaolo Bonzini    config_devices_mak_list += config_devices_mak
791859aef02SPaolo Bonzini    config_devices_h += {target: configure_file(output: target + '-config-devices.h',
792859aef02SPaolo Bonzini                                                configuration: config_devices_data)}
793859aef02SPaolo Bonzini    config_target += config_devices
794a98006bcSPaolo Bonzini    config_all_devices += config_devices
7952becc36aSPaolo Bonzini  endif
7962becc36aSPaolo Bonzini  config_target_mak += {target: config_target}
797a81df1b6SPaolo Bonziniendforeach
798a81df1b6SPaolo Bonzini
7992becc36aSPaolo Bonzini# This configuration is used to build files that are shared by
8002becc36aSPaolo Bonzini# multiple binaries, and then extracted out of the "common"
8012becc36aSPaolo Bonzini# static_library target.
8022becc36aSPaolo Bonzini#
8032becc36aSPaolo Bonzini# We do not use all_sources()/all_dependencies(), because it would
8042becc36aSPaolo Bonzini# build literally all source files, including devices only used by
8052becc36aSPaolo Bonzini# targets that are not built for this compilation.  The CONFIG_ALL
8062becc36aSPaolo Bonzini# pseudo symbol replaces it.
8072becc36aSPaolo Bonzini
80805512f55SPaolo Bonziniconfig_all += config_all_devices
8092becc36aSPaolo Bonziniconfig_all += config_host
8102becc36aSPaolo Bonziniconfig_all += config_all_disas
8112becc36aSPaolo Bonziniconfig_all += {
8122becc36aSPaolo Bonzini  'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
8132becc36aSPaolo Bonzini  'CONFIG_SOFTMMU': have_system,
8142becc36aSPaolo Bonzini  'CONFIG_USER_ONLY': have_user,
8152becc36aSPaolo Bonzini  'CONFIG_ALL': true,
8162becc36aSPaolo Bonzini}
8172becc36aSPaolo Bonzini
818a81df1b6SPaolo Bonzini# Generators
819a81df1b6SPaolo Bonzini
8203f885659SMarc-André Lureauhxtool = find_program('scripts/hxtool')
821650b5d54SMarc-André Lureaushaderinclude = find_program('scripts/shaderinclude.pl')
822a81df1b6SPaolo Bonziniqapi_gen = find_program('scripts/qapi-gen.py')
823a81df1b6SPaolo Bonziniqapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
824a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/commands.py',
825a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/common.py',
826a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/error.py',
827a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/events.py',
828a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/expr.py',
829a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/gen.py',
830a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/introspect.py',
831a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/parser.py',
832a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/schema.py',
833a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/source.py',
834a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/types.py',
835a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/visit.py',
836a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi/common.py',
837a81df1b6SPaolo Bonzini                     meson.source_root() / 'scripts/qapi-gen.py'
838a81df1b6SPaolo Bonzini]
839a81df1b6SPaolo Bonzini
840a81df1b6SPaolo Bonzinitracetool = [
841a81df1b6SPaolo Bonzini  python, files('scripts/tracetool.py'),
842a81df1b6SPaolo Bonzini   '--backend=' + config_host['TRACE_BACKENDS']
843a81df1b6SPaolo Bonzini]
844a81df1b6SPaolo Bonzini
8452c273f32SMarc-André Lureauqemu_version_cmd = [find_program('scripts/qemu-version.sh'),
8462c273f32SMarc-André Lureau                    meson.current_source_dir(),
847859aef02SPaolo Bonzini                    config_host['PKGVERSION'], meson.project_version()]
8482c273f32SMarc-André Lureauqemu_version = custom_target('qemu-version.h',
8492c273f32SMarc-André Lureau                             output: 'qemu-version.h',
8502c273f32SMarc-André Lureau                             command: qemu_version_cmd,
8512c273f32SMarc-André Lureau                             capture: true,
8522c273f32SMarc-André Lureau                             build_by_default: true,
8532c273f32SMarc-André Lureau                             build_always_stale: true)
8542c273f32SMarc-André Lureaugenh += qemu_version
8552c273f32SMarc-André Lureau
8563f885659SMarc-André Lureauhxdep = []
8573f885659SMarc-André Lureauhx_headers = [
8583f885659SMarc-André Lureau  ['qemu-options.hx', 'qemu-options.def'],
8593f885659SMarc-André Lureau  ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
8603f885659SMarc-André Lureau]
8613f885659SMarc-André Lureauif have_system
8623f885659SMarc-André Lureau  hx_headers += [
8633f885659SMarc-André Lureau    ['hmp-commands.hx', 'hmp-commands.h'],
8643f885659SMarc-André Lureau    ['hmp-commands-info.hx', 'hmp-commands-info.h'],
8653f885659SMarc-André Lureau  ]
8663f885659SMarc-André Lureauendif
8673f885659SMarc-André Lureauforeach d : hx_headers
868b7c70bf2SMarc-André Lureau  hxdep += custom_target(d[1],
8693f885659SMarc-André Lureau                input: files(d[0]),
8703f885659SMarc-André Lureau                output: d[1],
8713f885659SMarc-André Lureau                capture: true,
8723f885659SMarc-André Lureau                build_by_default: true, # to be removed when added to a target
8733f885659SMarc-André Lureau                command: [hxtool, '-h', '@INPUT0@'])
8743f885659SMarc-André Lureauendforeach
8753f885659SMarc-André Lureaugenh += hxdep
8763f885659SMarc-André Lureau
877eb937365SPeter MaydellSPHINX_ARGS = [config_host['SPHINX_BUILD'],
878eb937365SPeter Maydell               '-Dversion=' + meson.project_version(),
879eb937365SPeter Maydell               '-Drelease=' + config_host['PKGVERSION']]
880eb937365SPeter Maydell
881eb937365SPeter Maydellif get_option('werror')
882eb937365SPeter Maydell  SPHINX_ARGS += [ '-W' ]
883eb937365SPeter Maydellendif
884eb937365SPeter Maydell
885b3f4830aSPeter Maydellsphinx_extn_depends = [ meson.source_root() / 'docs/sphinx/depfile.py',
886b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/hxtool.py',
887b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/kerneldoc.py',
888b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/kernellog.py',
889b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/qapidoc.py',
890b3f4830aSPeter Maydell                        meson.source_root() / 'docs/sphinx/qmp_lexer.py',
891b3f4830aSPeter Maydell                        qapi_gen_depends ]
892b3f4830aSPeter Maydell
893a81df1b6SPaolo Bonzini# Collect sourcesets.
894a81df1b6SPaolo Bonzini
895a81df1b6SPaolo Bonziniutil_ss = ss.source_set()
896a81df1b6SPaolo Bonzinistub_ss = ss.source_set()
897a81df1b6SPaolo Bonzinitrace_ss = ss.source_set()
8983154fee4SMarc-André Lureaublock_ss = ss.source_set()
8994a96337dSPaolo Bonziniblockdev_ss = ss.source_set()
900ff219dcaSPaolo Bonziniqmp_ss = ss.source_set()
9012becc36aSPaolo Bonzinicommon_ss = ss.source_set()
9022becc36aSPaolo Bonzinisoftmmu_ss = ss.source_set()
9032becc36aSPaolo Bonziniuser_ss = ss.source_set()
9042becc36aSPaolo Bonzinibsd_user_ss = ss.source_set()
9052becc36aSPaolo Bonzinilinux_user_ss = ss.source_set()
9062becc36aSPaolo Bonzinispecific_ss = ss.source_set()
90764ed6f92SPaolo Bonzinispecific_fuzz_ss = ss.source_set()
9082becc36aSPaolo Bonzini
9093154fee4SMarc-André Lureaumodules = {}
9102becc36aSPaolo Bonzinihw_arch = {}
9112becc36aSPaolo Bonzinitarget_arch = {}
9122becc36aSPaolo Bonzinitarget_softmmu_arch = {}
913a81df1b6SPaolo Bonzini
914a81df1b6SPaolo Bonzini###############
915a81df1b6SPaolo Bonzini# Trace files #
916a81df1b6SPaolo Bonzini###############
917a81df1b6SPaolo Bonzini
918c9322ab5SMarc-André Lureau# TODO: add each directory to the subdirs from its own meson.build, once
919c9322ab5SMarc-André Lureau# we have those
920a81df1b6SPaolo Bonzinitrace_events_subdirs = [
921a81df1b6SPaolo Bonzini  'accel/kvm',
922a81df1b6SPaolo Bonzini  'accel/tcg',
923a81df1b6SPaolo Bonzini  'crypto',
924a81df1b6SPaolo Bonzini  'monitor',
925a81df1b6SPaolo Bonzini]
926a81df1b6SPaolo Bonziniif have_user
927a81df1b6SPaolo Bonzini  trace_events_subdirs += [ 'linux-user' ]
928a81df1b6SPaolo Bonziniendif
929a81df1b6SPaolo Bonziniif have_block
930a81df1b6SPaolo Bonzini  trace_events_subdirs += [
931a81df1b6SPaolo Bonzini    'authz',
932a81df1b6SPaolo Bonzini    'block',
933a81df1b6SPaolo Bonzini    'io',
934a81df1b6SPaolo Bonzini    'nbd',
935a81df1b6SPaolo Bonzini    'scsi',
936a81df1b6SPaolo Bonzini  ]
937a81df1b6SPaolo Bonziniendif
938a81df1b6SPaolo Bonziniif have_system
939a81df1b6SPaolo Bonzini  trace_events_subdirs += [
940a81df1b6SPaolo Bonzini    'audio',
941a81df1b6SPaolo Bonzini    'backends',
942a81df1b6SPaolo Bonzini    'backends/tpm',
943a81df1b6SPaolo Bonzini    'chardev',
944a81df1b6SPaolo Bonzini    'hw/9pfs',
945a81df1b6SPaolo Bonzini    'hw/acpi',
946a81df1b6SPaolo Bonzini    'hw/alpha',
947a81df1b6SPaolo Bonzini    'hw/arm',
948a81df1b6SPaolo Bonzini    'hw/audio',
949a81df1b6SPaolo Bonzini    'hw/block',
950a81df1b6SPaolo Bonzini    'hw/block/dataplane',
951a81df1b6SPaolo Bonzini    'hw/char',
952a81df1b6SPaolo Bonzini    'hw/display',
953a81df1b6SPaolo Bonzini    'hw/dma',
954a81df1b6SPaolo Bonzini    'hw/hppa',
955a81df1b6SPaolo Bonzini    'hw/hyperv',
956a81df1b6SPaolo Bonzini    'hw/i2c',
957a81df1b6SPaolo Bonzini    'hw/i386',
958a81df1b6SPaolo Bonzini    'hw/i386/xen',
959a81df1b6SPaolo Bonzini    'hw/ide',
960a81df1b6SPaolo Bonzini    'hw/input',
961a81df1b6SPaolo Bonzini    'hw/intc',
962a81df1b6SPaolo Bonzini    'hw/isa',
963a81df1b6SPaolo Bonzini    'hw/mem',
964a81df1b6SPaolo Bonzini    'hw/mips',
965a81df1b6SPaolo Bonzini    'hw/misc',
966a81df1b6SPaolo Bonzini    'hw/misc/macio',
967a81df1b6SPaolo Bonzini    'hw/net',
968a81df1b6SPaolo Bonzini    'hw/nvram',
969a81df1b6SPaolo Bonzini    'hw/pci',
970a81df1b6SPaolo Bonzini    'hw/pci-host',
971a81df1b6SPaolo Bonzini    'hw/ppc',
972a81df1b6SPaolo Bonzini    'hw/rdma',
973a81df1b6SPaolo Bonzini    'hw/rdma/vmw',
974a81df1b6SPaolo Bonzini    'hw/rtc',
975a81df1b6SPaolo Bonzini    'hw/s390x',
976a81df1b6SPaolo Bonzini    'hw/scsi',
977a81df1b6SPaolo Bonzini    'hw/sd',
978a81df1b6SPaolo Bonzini    'hw/sparc',
979a81df1b6SPaolo Bonzini    'hw/sparc64',
980a81df1b6SPaolo Bonzini    'hw/ssi',
981a81df1b6SPaolo Bonzini    'hw/timer',
982a81df1b6SPaolo Bonzini    'hw/tpm',
983a81df1b6SPaolo Bonzini    'hw/usb',
984a81df1b6SPaolo Bonzini    'hw/vfio',
985a81df1b6SPaolo Bonzini    'hw/virtio',
986a81df1b6SPaolo Bonzini    'hw/watchdog',
987a81df1b6SPaolo Bonzini    'hw/xen',
988a81df1b6SPaolo Bonzini    'hw/gpio',
989a81df1b6SPaolo Bonzini    'migration',
990a81df1b6SPaolo Bonzini    'net',
9918b7a5507SPhilippe Mathieu-Daudé    'softmmu',
992a81df1b6SPaolo Bonzini    'ui',
993a81df1b6SPaolo Bonzini  ]
994a81df1b6SPaolo Bonziniendif
995a81df1b6SPaolo Bonzinitrace_events_subdirs += [
996a81df1b6SPaolo Bonzini  'hw/core',
997a81df1b6SPaolo Bonzini  'qapi',
998a81df1b6SPaolo Bonzini  'qom',
999a81df1b6SPaolo Bonzini  'target/arm',
1000a81df1b6SPaolo Bonzini  'target/hppa',
1001a81df1b6SPaolo Bonzini  'target/i386',
1002a81df1b6SPaolo Bonzini  'target/mips',
1003a81df1b6SPaolo Bonzini  'target/ppc',
1004a81df1b6SPaolo Bonzini  'target/riscv',
1005a81df1b6SPaolo Bonzini  'target/s390x',
1006a81df1b6SPaolo Bonzini  'target/sparc',
1007a81df1b6SPaolo Bonzini  'util',
1008a81df1b6SPaolo Bonzini]
1009a81df1b6SPaolo Bonzini
1010a81df1b6SPaolo Bonzinisubdir('qapi')
1011a81df1b6SPaolo Bonzinisubdir('qobject')
1012a81df1b6SPaolo Bonzinisubdir('stubs')
1013a81df1b6SPaolo Bonzinisubdir('trace')
1014a81df1b6SPaolo Bonzinisubdir('util')
10155582c58fSMarc-André Lureausubdir('qom')
10165582c58fSMarc-André Lureausubdir('authz')
1017a81df1b6SPaolo Bonzinisubdir('crypto')
10182d78b56eSMarc-André Lureausubdir('ui')
1019a81df1b6SPaolo Bonzini
10203154fee4SMarc-André Lureau
10213154fee4SMarc-André Lureauif enable_modules
10223154fee4SMarc-André Lureau  libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
10233154fee4SMarc-André Lureau  modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
10243154fee4SMarc-André Lureauendif
10253154fee4SMarc-André Lureau
1026a81df1b6SPaolo Bonzini# Build targets from sourcesets
1027a81df1b6SPaolo Bonzini
10282becc36aSPaolo Bonzinistub_ss = stub_ss.apply(config_all, strict: false)
1029a81df1b6SPaolo Bonzini
1030a81df1b6SPaolo Bonziniutil_ss.add_all(trace_ss)
10312becc36aSPaolo Bonziniutil_ss = util_ss.apply(config_all, strict: false)
1032a81df1b6SPaolo Bonzinilibqemuutil = static_library('qemuutil',
1033a81df1b6SPaolo Bonzini                             sources: util_ss.sources() + stub_ss.sources() + genh,
1034aa087962SPaolo Bonzini                             dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
1035a81df1b6SPaolo Bonziniqemuutil = declare_dependency(link_with: libqemuutil,
103604c6f1e7SMarc-André Lureau                              sources: genh + version_res)
1037a81df1b6SPaolo Bonzini
1038abff1abfSPaolo Bonzinidecodetree = generator(find_program('scripts/decodetree.py'),
1039abff1abfSPaolo Bonzini                       output: 'decode-@BASENAME@.c.inc',
1040abff1abfSPaolo Bonzini                       arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1041abff1abfSPaolo Bonzini
1042478e943fSPaolo Bonzinisubdir('audio')
10437fcfd456SMarc-André Lureausubdir('io')
1044848e8ff6SMarc-André Lureausubdir('chardev')
1045ec0d5893SMarc-André Lureausubdir('fsdev')
1046abff1abfSPaolo Bonzinisubdir('libdecnumber')
1047d3b18480SMarc-André Lureausubdir('target')
1048708eab42SMarc-André Lureausubdir('dump')
1049ec0d5893SMarc-André Lureau
10505e5733e5SMarc-André Lureaublock_ss.add(files(
10515e5733e5SMarc-André Lureau  'block.c',
105256ee8626SKevin Wolf  'blockdev-nbd.c',
10535e5733e5SMarc-André Lureau  'blockjob.c',
10545e5733e5SMarc-André Lureau  'job.c',
10555e5733e5SMarc-André Lureau  'qemu-io-cmds.c',
10565e5733e5SMarc-André Lureau))
10575e5733e5SMarc-André Lureaublock_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
10585e5733e5SMarc-André Lureau
10595e5733e5SMarc-André Lureausubdir('nbd')
10605e5733e5SMarc-André Lureausubdir('scsi')
10615e5733e5SMarc-André Lureausubdir('block')
10625e5733e5SMarc-André Lureau
10634a96337dSPaolo Bonziniblockdev_ss.add(files(
10644a96337dSPaolo Bonzini  'blockdev.c',
10654a96337dSPaolo Bonzini  'iothread.c',
10664a96337dSPaolo Bonzini  'job-qmp.c',
10674a96337dSPaolo Bonzini))
10684a96337dSPaolo Bonzini
10694a96337dSPaolo Bonzini# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
10704a96337dSPaolo Bonzini# os-win32.c does not
10714a96337dSPaolo Bonziniblockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
10724a96337dSPaolo Bonzinisoftmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
10734a96337dSPaolo Bonzini
10744a96337dSPaolo Bonzinisoftmmu_ss.add_all(blockdev_ss)
10754a96337dSPaolo Bonzinisoftmmu_ss.add(files(
10764a96337dSPaolo Bonzini  'bootdevice.c',
10774a96337dSPaolo Bonzini  'dma-helpers.c',
10784a96337dSPaolo Bonzini  'qdev-monitor.c',
10794a96337dSPaolo Bonzini), sdl)
10804a96337dSPaolo Bonzini
10814a96337dSPaolo Bonzinisoftmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
10824a96337dSPaolo Bonzinisoftmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
10834a96337dSPaolo Bonzinisoftmmu_ss.add(when: ['CONFIG_FDT', fdt],  if_true: [files('device_tree.c')])
10844a96337dSPaolo Bonzini
10854a96337dSPaolo Bonzinicommon_ss.add(files('cpus-common.c'))
10864a96337dSPaolo Bonzini
10875d3ea0e1SPaolo Bonzinisubdir('softmmu')
1088c9322ab5SMarc-André Lureau
1089c7c91a74SBruce Rogersspecific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem, libdaxctl)
1090c9322ab5SMarc-André Lureauspecific_ss.add(files('exec-vary.c'))
1091c9322ab5SMarc-André Lureauspecific_ss.add(when: 'CONFIG_TCG', if_true: files(
1092c9322ab5SMarc-André Lureau  'fpu/softfloat.c',
1093c9322ab5SMarc-André Lureau  'tcg/optimize.c',
1094c9322ab5SMarc-André Lureau  'tcg/tcg-common.c',
1095c9322ab5SMarc-André Lureau  'tcg/tcg-op-gvec.c',
1096c9322ab5SMarc-André Lureau  'tcg/tcg-op-vec.c',
1097c9322ab5SMarc-André Lureau  'tcg/tcg-op.c',
1098c9322ab5SMarc-André Lureau  'tcg/tcg.c',
1099c9322ab5SMarc-André Lureau))
1100c9322ab5SMarc-André Lureauspecific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1101c9322ab5SMarc-André Lureau
1102ab318051SMarc-André Lureausubdir('backends')
1103c574e161SMarc-André Lureausubdir('disas')
110455166230SMarc-André Lureausubdir('migration')
1105ff219dcaSPaolo Bonzinisubdir('monitor')
1106cdaf0722SMarc-André Lureausubdir('net')
110717ef2af6SMarc-André Lureausubdir('replay')
1108582ea95fSMarc-André Lureausubdir('hw')
11091a82878aSMarc-André Lureausubdir('accel')
1110f556b4a1SPaolo Bonzinisubdir('plugins')
1111b309c321SMarc-André Lureausubdir('bsd-user')
11123a30446aSMarc-André Lureausubdir('linux-user')
11133a30446aSMarc-André Lureau
1114b309c321SMarc-André Lureaubsd_user_ss.add(files('gdbstub.c'))
1115b309c321SMarc-André Lureauspecific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1116b309c321SMarc-André Lureau
11173a30446aSMarc-André Lureaulinux_user_ss.add(files('gdbstub.c', 'thunk.c'))
11183a30446aSMarc-André Lureauspecific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
11195d3ea0e1SPaolo Bonzini
1120a2ce7dbdSPaolo Bonzini# needed for fuzzing binaries
1121a2ce7dbdSPaolo Bonzinisubdir('tests/qtest/libqos')
112264ed6f92SPaolo Bonzinisubdir('tests/qtest/fuzz')
1123a2ce7dbdSPaolo Bonzini
11243154fee4SMarc-André Lureaublock_mods = []
11253154fee4SMarc-André Lureausoftmmu_mods = []
11263154fee4SMarc-André Lureauforeach d, list : modules
11273154fee4SMarc-André Lureau  foreach m, module_ss : list
11283154fee4SMarc-André Lureau    if enable_modules and targetos != 'windows'
11293e292c51SGerd Hoffmann      module_ss = module_ss.apply(config_all, strict: false)
11303154fee4SMarc-André Lureau      sl = static_library(d + '-' + m, [genh, module_ss.sources()],
11313154fee4SMarc-André Lureau                          dependencies: [modulecommon, module_ss.dependencies()], pic: true)
11323154fee4SMarc-André Lureau      if d == 'block'
11333154fee4SMarc-André Lureau        block_mods += sl
11343154fee4SMarc-André Lureau      else
11353154fee4SMarc-André Lureau        softmmu_mods += sl
11363154fee4SMarc-André Lureau      endif
11373154fee4SMarc-André Lureau    else
11383154fee4SMarc-André Lureau      if d == 'block'
11393154fee4SMarc-André Lureau        block_ss.add_all(module_ss)
11403154fee4SMarc-André Lureau      else
11413154fee4SMarc-André Lureau        softmmu_ss.add_all(module_ss)
11423154fee4SMarc-André Lureau      endif
11433154fee4SMarc-André Lureau    endif
11443154fee4SMarc-André Lureau  endforeach
11453154fee4SMarc-André Lureauendforeach
11463154fee4SMarc-André Lureau
11473154fee4SMarc-André Lureaunm = find_program('nm')
1148604f3e4eSYonggang Luoundefsym = find_program('scripts/undefsym.py')
11493154fee4SMarc-André Lureaublock_syms = custom_target('block.syms', output: 'block.syms',
11503154fee4SMarc-André Lureau                             input: [libqemuutil, block_mods],
11513154fee4SMarc-André Lureau                             capture: true,
11523154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
11533154fee4SMarc-André Lureauqemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
11543154fee4SMarc-André Lureau                             input: [libqemuutil, softmmu_mods],
11553154fee4SMarc-André Lureau                             capture: true,
11563154fee4SMarc-André Lureau                             command: [undefsym, nm, '@INPUT@'])
11573154fee4SMarc-André Lureau
11585e5733e5SMarc-André Lureaublock_ss = block_ss.apply(config_host, strict: false)
11595e5733e5SMarc-André Lureaulibblock = static_library('block', block_ss.sources() + genh,
11605e5733e5SMarc-André Lureau                          dependencies: block_ss.dependencies(),
11615e5733e5SMarc-André Lureau                          link_depends: block_syms,
11625e5733e5SMarc-André Lureau                          name_suffix: 'fa',
11635e5733e5SMarc-André Lureau                          build_by_default: false)
11645e5733e5SMarc-André Lureau
11655e5733e5SMarc-André Lureaublock = declare_dependency(link_whole: [libblock],
1166b7c70bf2SMarc-André Lureau                           link_args: '@block.syms',
1167b7c70bf2SMarc-André Lureau                           dependencies: [crypto, io])
11685e5733e5SMarc-André Lureau
1169ff219dcaSPaolo Bonziniqmp_ss = qmp_ss.apply(config_host, strict: false)
1170ff219dcaSPaolo Bonzinilibqmp = static_library('qmp', qmp_ss.sources() + genh,
1171ff219dcaSPaolo Bonzini                        dependencies: qmp_ss.dependencies(),
1172ff219dcaSPaolo Bonzini                        name_suffix: 'fa',
1173ff219dcaSPaolo Bonzini                        build_by_default: false)
1174ff219dcaSPaolo Bonzini
1175ff219dcaSPaolo Bonziniqmp = declare_dependency(link_whole: [libqmp])
1176ff219dcaSPaolo Bonzini
11773154fee4SMarc-André Lureauforeach m : block_mods + softmmu_mods
11783154fee4SMarc-André Lureau  shared_module(m.name(),
11793154fee4SMarc-André Lureau                name_prefix: '',
11803154fee4SMarc-André Lureau                link_whole: m,
11813154fee4SMarc-André Lureau                install: true,
11823154fee4SMarc-André Lureau                install_dir: config_host['qemu_moddir'])
11833154fee4SMarc-André Lureauendforeach
11843154fee4SMarc-André Lureau
118564ed6f92SPaolo Bonzinisoftmmu_ss.add(authz, block, chardev, crypto, io, qmp)
118664ed6f92SPaolo Bonzinicommon_ss.add(qom, qemuutil)
118764ed6f92SPaolo Bonzini
118864ed6f92SPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
11892becc36aSPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
11902becc36aSPaolo Bonzini
11912becc36aSPaolo Bonzinicommon_all = common_ss.apply(config_all, strict: false)
11922becc36aSPaolo Bonzinicommon_all = static_library('common',
11932becc36aSPaolo Bonzini                            build_by_default: false,
11942becc36aSPaolo Bonzini                            sources: common_all.sources() + genh,
11952becc36aSPaolo Bonzini                            dependencies: common_all.dependencies(),
11962becc36aSPaolo Bonzini                            name_suffix: 'fa')
11972becc36aSPaolo Bonzini
1198c9322ab5SMarc-André Lureaufeature_to_c = find_program('scripts/feature_to_c.sh')
1199c9322ab5SMarc-André Lureau
1200fd5eef85SPaolo Bonziniemulators = {}
12012becc36aSPaolo Bonziniforeach target : target_dirs
12022becc36aSPaolo Bonzini  config_target = config_target_mak[target]
12032becc36aSPaolo Bonzini  target_name = config_target['TARGET_NAME']
12042becc36aSPaolo Bonzini  arch = config_target['TARGET_BASE_ARCH']
1205859aef02SPaolo Bonzini  arch_srcs = [config_target_h[target]]
120664ed6f92SPaolo Bonzini  arch_deps = []
120764ed6f92SPaolo Bonzini  c_args = ['-DNEED_CPU_H',
120864ed6f92SPaolo Bonzini            '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
120964ed6f92SPaolo Bonzini            '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
121064ed6f92SPaolo Bonzini  link_args = []
12112becc36aSPaolo Bonzini
1212859aef02SPaolo Bonzini  config_target += config_host
12132becc36aSPaolo Bonzini  target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
12142becc36aSPaolo Bonzini  if targetos == 'linux'
12152becc36aSPaolo Bonzini    target_inc += include_directories('linux-headers', is_system: true)
12162becc36aSPaolo Bonzini  endif
12172becc36aSPaolo Bonzini  if target.endswith('-softmmu')
12182becc36aSPaolo Bonzini    qemu_target_name = 'qemu-system-' + target_name
12192becc36aSPaolo Bonzini    target_type='system'
1220abff1abfSPaolo Bonzini    t = target_softmmu_arch[arch].apply(config_target, strict: false)
1221abff1abfSPaolo Bonzini    arch_srcs += t.sources()
122264ed6f92SPaolo Bonzini    arch_deps += t.dependencies()
1223abff1abfSPaolo Bonzini
12242c44220dSMarc-André Lureau    hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
12252c44220dSMarc-André Lureau    hw = hw_arch[hw_dir].apply(config_target, strict: false)
12262c44220dSMarc-André Lureau    arch_srcs += hw.sources()
122764ed6f92SPaolo Bonzini    arch_deps += hw.dependencies()
12282c44220dSMarc-André Lureau
12292becc36aSPaolo Bonzini    arch_srcs += config_devices_h[target]
123064ed6f92SPaolo Bonzini    link_args += ['@block.syms', '@qemu.syms']
12312becc36aSPaolo Bonzini  else
12323a30446aSMarc-André Lureau    abi = config_target['TARGET_ABI_DIR']
12332becc36aSPaolo Bonzini    target_type='user'
12342becc36aSPaolo Bonzini    qemu_target_name = 'qemu-' + target_name
12352becc36aSPaolo Bonzini    if 'CONFIG_LINUX_USER' in config_target
12362becc36aSPaolo Bonzini      base_dir = 'linux-user'
12372becc36aSPaolo Bonzini      target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
12382becc36aSPaolo Bonzini    else
12392becc36aSPaolo Bonzini      base_dir = 'bsd-user'
12402becc36aSPaolo Bonzini    endif
12412becc36aSPaolo Bonzini    target_inc += include_directories(
12422becc36aSPaolo Bonzini      base_dir,
12433a30446aSMarc-André Lureau      base_dir / abi,
12442becc36aSPaolo Bonzini    )
12453a30446aSMarc-André Lureau    if 'CONFIG_LINUX_USER' in config_target
12463a30446aSMarc-André Lureau      dir = base_dir / abi
12473a30446aSMarc-André Lureau      arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
12483a30446aSMarc-André Lureau      if config_target.has_key('TARGET_SYSTBL_ABI')
12493a30446aSMarc-André Lureau        arch_srcs += \
12503a30446aSMarc-André Lureau          syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
12513a30446aSMarc-André Lureau                                             extra_args : config_target['TARGET_SYSTBL_ABI'])
12523a30446aSMarc-André Lureau      endif
12533a30446aSMarc-André Lureau    endif
12542becc36aSPaolo Bonzini  endif
12552becc36aSPaolo Bonzini
1256c9322ab5SMarc-André Lureau  if 'TARGET_XML_FILES' in config_target
1257c9322ab5SMarc-André Lureau    gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1258c9322ab5SMarc-André Lureau                                output: target + '-gdbstub-xml.c',
1259c9322ab5SMarc-André Lureau                                input: files(config_target['TARGET_XML_FILES'].split()),
1260c9322ab5SMarc-André Lureau                                command: [feature_to_c, '@INPUT@'],
1261c9322ab5SMarc-André Lureau                                capture: true)
1262c9322ab5SMarc-André Lureau    arch_srcs += gdbstub_xml
1263c9322ab5SMarc-André Lureau  endif
1264c9322ab5SMarc-André Lureau
1265abff1abfSPaolo Bonzini  t = target_arch[arch].apply(config_target, strict: false)
1266abff1abfSPaolo Bonzini  arch_srcs += t.sources()
126764ed6f92SPaolo Bonzini  arch_deps += t.dependencies()
1268abff1abfSPaolo Bonzini
12692becc36aSPaolo Bonzini  target_common = common_ss.apply(config_target, strict: false)
12702becc36aSPaolo Bonzini  objects = common_all.extract_objects(target_common.sources())
127164ed6f92SPaolo Bonzini  deps = target_common.dependencies()
12722becc36aSPaolo Bonzini
12732becc36aSPaolo Bonzini  target_specific = specific_ss.apply(config_target, strict: false)
12742becc36aSPaolo Bonzini  arch_srcs += target_specific.sources()
127564ed6f92SPaolo Bonzini  arch_deps += target_specific.dependencies()
12762becc36aSPaolo Bonzini
127764ed6f92SPaolo Bonzini  lib = static_library('qemu-' + target,
1278859aef02SPaolo Bonzini                 sources: arch_srcs + genh,
1279b7612f45SPaolo Bonzini                 dependencies: arch_deps,
12802becc36aSPaolo Bonzini                 objects: objects,
12812becc36aSPaolo Bonzini                 include_directories: target_inc,
128264ed6f92SPaolo Bonzini                 c_args: c_args,
128364ed6f92SPaolo Bonzini                 build_by_default: false,
12842becc36aSPaolo Bonzini                 name_suffix: 'fa')
128564ed6f92SPaolo Bonzini
128664ed6f92SPaolo Bonzini  if target.endswith('-softmmu')
128764ed6f92SPaolo Bonzini    execs = [{
128864ed6f92SPaolo Bonzini      'name': 'qemu-system-' + target_name,
128964ed6f92SPaolo Bonzini      'gui': false,
129064ed6f92SPaolo Bonzini      'sources': files('softmmu/main.c'),
129164ed6f92SPaolo Bonzini      'dependencies': []
129264ed6f92SPaolo Bonzini    }]
129335be72baSPaolo Bonzini    if targetos == 'windows' and (sdl.found() or gtk.found())
129464ed6f92SPaolo Bonzini      execs += [{
129564ed6f92SPaolo Bonzini        'name': 'qemu-system-' + target_name + 'w',
129664ed6f92SPaolo Bonzini        'gui': true,
129764ed6f92SPaolo Bonzini        'sources': files('softmmu/main.c'),
129864ed6f92SPaolo Bonzini        'dependencies': []
129964ed6f92SPaolo Bonzini      }]
130064ed6f92SPaolo Bonzini    endif
130164ed6f92SPaolo Bonzini    if config_host.has_key('CONFIG_FUZZ')
130264ed6f92SPaolo Bonzini      specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
130364ed6f92SPaolo Bonzini      execs += [{
130464ed6f92SPaolo Bonzini        'name': 'qemu-fuzz-' + target_name,
130564ed6f92SPaolo Bonzini        'gui': false,
130664ed6f92SPaolo Bonzini        'sources': specific_fuzz.sources(),
130764ed6f92SPaolo Bonzini        'dependencies': specific_fuzz.dependencies(),
130864ed6f92SPaolo Bonzini      }]
130964ed6f92SPaolo Bonzini    endif
131064ed6f92SPaolo Bonzini  else
131164ed6f92SPaolo Bonzini    execs = [{
131264ed6f92SPaolo Bonzini      'name': 'qemu-' + target_name,
131364ed6f92SPaolo Bonzini      'gui': false,
131464ed6f92SPaolo Bonzini      'sources': [],
131564ed6f92SPaolo Bonzini      'dependencies': []
131664ed6f92SPaolo Bonzini    }]
131764ed6f92SPaolo Bonzini  endif
131864ed6f92SPaolo Bonzini  foreach exe: execs
1319fd5eef85SPaolo Bonzini    emulators += {exe['name']:
1320fd5eef85SPaolo Bonzini         executable(exe['name'], exe['sources'],
132164ed6f92SPaolo Bonzini               install: true,
132264ed6f92SPaolo Bonzini               c_args: c_args,
132364ed6f92SPaolo Bonzini               dependencies: arch_deps + deps + exe['dependencies'],
132464ed6f92SPaolo Bonzini               objects: lib.extract_all_objects(recursive: true),
132564ed6f92SPaolo Bonzini               link_language: link_language,
132664ed6f92SPaolo Bonzini               link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
132764ed6f92SPaolo Bonzini               link_args: link_args,
132864ed6f92SPaolo Bonzini               gui_app: exe['gui'])
1329fd5eef85SPaolo Bonzini    }
133010e1d263SMarc-André Lureau
133110e1d263SMarc-André Lureau    if 'CONFIG_TRACE_SYSTEMTAP' in config_host
133210e1d263SMarc-André Lureau      foreach stp: [
1333bd5f973aSStefan Hajnoczi        {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1334bd5f973aSStefan Hajnoczi        {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
133510e1d263SMarc-André Lureau        {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
133610e1d263SMarc-André Lureau        {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
133710e1d263SMarc-André Lureau      ]
1338bd5f973aSStefan Hajnoczi        custom_target(exe['name'] + stp['ext'],
133910e1d263SMarc-André Lureau                      input: trace_events_all,
1340bd5f973aSStefan Hajnoczi                      output: exe['name'] + stp['ext'],
134110e1d263SMarc-André Lureau                      capture: true,
134210e1d263SMarc-André Lureau                      install: stp['install'],
1343ab4c0996SMarc-André Lureau                      install_dir: qemu_datadir / '../systemtap/tapset',
134410e1d263SMarc-André Lureau                      command: [
134510e1d263SMarc-André Lureau                        tracetool, '--group=all', '--format=' + stp['fmt'],
134610e1d263SMarc-André Lureau                        '--binary=' + stp['bin'],
134710e1d263SMarc-André Lureau                        '--target-name=' + target_name,
134810e1d263SMarc-André Lureau                        '--target-type=' + target_type,
134910e1d263SMarc-André Lureau                        '--probe-prefix=qemu.' + target_type + '.' + target_name,
135010e1d263SMarc-André Lureau                        '@INPUT@',
135110e1d263SMarc-André Lureau                      ])
135210e1d263SMarc-André Lureau      endforeach
135310e1d263SMarc-André Lureau    endif
135464ed6f92SPaolo Bonzini  endforeach
13552becc36aSPaolo Bonziniendforeach
13562becc36aSPaolo Bonzini
1357931049b4SPaolo Bonzini# Other build targets
1358897b5afaSMarc-André Lureau
1359f556b4a1SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host
1360f556b4a1SPaolo Bonzini  install_headers('include/qemu/qemu-plugin.h')
1361f556b4a1SPaolo Bonziniendif
1362f556b4a1SPaolo Bonzini
1363f15bff25SPaolo Bonziniif 'CONFIG_GUEST_AGENT' in config_host
1364f15bff25SPaolo Bonzini  subdir('qga')
1365f15bff25SPaolo Bonziniendif
1366f15bff25SPaolo Bonzini
13679755c94aSLaurent Vivier# Don't build qemu-keymap if xkbcommon is not explicitly enabled
13689755c94aSLaurent Vivier# when we don't build tools or system
13694113f4cfSLaurent Vivierif xkbcommon.found()
137028742467SMarc-André Lureau  # used for the update-keymaps target, so include rules even if !have_tools
137128742467SMarc-André Lureau  qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
137228742467SMarc-André Lureau                           dependencies: [qemuutil, xkbcommon], install: have_tools)
137328742467SMarc-André Lureauendif
137428742467SMarc-André Lureau
1375931049b4SPaolo Bonziniif have_tools
1376b7c70bf2SMarc-André Lureau  qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1377b7c70bf2SMarc-André Lureau             dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1378b7c70bf2SMarc-André Lureau  qemu_io = executable('qemu-io', files('qemu-io.c'),
1379b7c70bf2SMarc-André Lureau             dependencies: [block, qemuutil], install: true)
1380b7c70bf2SMarc-André Lureau  qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1381b7c70bf2SMarc-André Lureau               dependencies: [block, qemuutil], install: true)
1382b7c70bf2SMarc-André Lureau
13837c58bb76SPaolo Bonzini  subdir('storage-daemon')
1384a9c9727cSPaolo Bonzini  subdir('contrib/rdmacm-mux')
13851d7bb6abSMarc-André Lureau  subdir('contrib/elf2dmp')
1386a9c9727cSPaolo Bonzini
1387157e7b13SMarc-André Lureau  executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1388157e7b13SMarc-André Lureau             dependencies: qemuutil,
1389157e7b13SMarc-André Lureau             install: true)
1390157e7b13SMarc-André Lureau
1391931049b4SPaolo Bonzini  if 'CONFIG_VHOST_USER' in config_host
1392931049b4SPaolo Bonzini    subdir('contrib/libvhost-user')
13932d7ac0afSPaolo Bonzini    subdir('contrib/vhost-user-blk')
1394ea458960SMarc-André Lureau    subdir('contrib/vhost-user-gpu')
139532fcc624SMarc-André Lureau    subdir('contrib/vhost-user-input')
139699650b62SPaolo Bonzini    subdir('contrib/vhost-user-scsi')
1397931049b4SPaolo Bonzini  endif
13988f51e01cSMarc-André Lureau
13998f51e01cSMarc-André Lureau  if targetos == 'linux'
14008f51e01cSMarc-André Lureau    executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
14018f51e01cSMarc-André Lureau               dependencies: [qemuutil, libcap_ng],
14028f51e01cSMarc-André Lureau               install: true,
14038f51e01cSMarc-André Lureau               install_dir: get_option('libexecdir'))
1404897b5afaSMarc-André Lureau
1405897b5afaSMarc-André Lureau    executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1406897b5afaSMarc-André Lureau               dependencies: [authz, crypto, io, qom, qemuutil,
14076ec0e15dSPaolo Bonzini                              libcap_ng, mpathpersist],
1408897b5afaSMarc-André Lureau               install: true)
14098f51e01cSMarc-André Lureau  endif
14108f51e01cSMarc-André Lureau
14115ee24e78SMarc-André Lureau  if 'CONFIG_IVSHMEM' in config_host
14125ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-client')
14135ee24e78SMarc-André Lureau    subdir('contrib/ivshmem-server')
14145ee24e78SMarc-André Lureau  endif
1415931049b4SPaolo Bonziniendif
1416931049b4SPaolo Bonzini
1417f5aa6320SMarc-André Lureausubdir('scripts')
14183f99cf57SPaolo Bonzinisubdir('tools')
1419bdcbea7aSMarc-André Lureausubdir('pc-bios')
1420ce1c1e7aSPaolo Bonzinisubdir('tests')
1421f8aa24eaSPaolo Bonzinisubdir('docs')
1422e8f3bd71SMarc-André Lureauif 'CONFIG_GTK' in config_host
1423e8f3bd71SMarc-André Lureau  subdir('po')
1424e8f3bd71SMarc-André Lureauendif
14253f99cf57SPaolo Bonzini
14268adfeba9SMarc-André Lureauif host_machine.system() == 'windows'
14278adfeba9SMarc-André Lureau  nsis_cmd = [
14288adfeba9SMarc-André Lureau    find_program('scripts/nsis.py'),
14298adfeba9SMarc-André Lureau    '@OUTPUT@',
14308adfeba9SMarc-André Lureau    get_option('prefix'),
14318adfeba9SMarc-André Lureau    meson.current_source_dir(),
14328adfeba9SMarc-André Lureau    host_machine.cpu_family(),
14338adfeba9SMarc-André Lureau    '--',
14348adfeba9SMarc-André Lureau    '-DDISPLAYVERSION=' + meson.project_version(),
14358adfeba9SMarc-André Lureau  ]
14368adfeba9SMarc-André Lureau  if build_docs
14378adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
14388adfeba9SMarc-André Lureau  endif
14398adfeba9SMarc-André Lureau  if 'CONFIG_GTK' in config_host
14408adfeba9SMarc-André Lureau    nsis_cmd += '-DCONFIG_GTK=y'
14418adfeba9SMarc-André Lureau  endif
14428adfeba9SMarc-André Lureau
14438adfeba9SMarc-André Lureau  nsis = custom_target('nsis',
14448adfeba9SMarc-André Lureau                       output: 'qemu-setup-' + meson.project_version() + '.exe',
14458adfeba9SMarc-André Lureau                       input: files('qemu.nsi'),
14468adfeba9SMarc-André Lureau                       build_always_stale: true,
14478adfeba9SMarc-André Lureau                       command: nsis_cmd + ['@INPUT@'])
14488adfeba9SMarc-André Lureau  alias_target('installer', nsis)
14498adfeba9SMarc-André Lureauendif
14508adfeba9SMarc-André Lureau
1451f9332757SPaolo Bonzinisummary_info = {}
1452f9332757SPaolo Bonzinisummary_info += {'Install prefix':    config_host['prefix']}
1453f9332757SPaolo Bonzinisummary_info += {'BIOS directory':    config_host['qemu_datadir']}
1454f9332757SPaolo Bonzinisummary_info += {'firmware path':     config_host['qemu_firmwarepath']}
1455f9332757SPaolo Bonzinisummary_info += {'binary directory':  config_host['bindir']}
1456f9332757SPaolo Bonzinisummary_info += {'library directory': config_host['libdir']}
1457f9332757SPaolo Bonzinisummary_info += {'module directory':  config_host['qemu_moddir']}
1458f9332757SPaolo Bonzinisummary_info += {'libexec directory': config_host['libexecdir']}
1459f9332757SPaolo Bonzinisummary_info += {'include directory': config_host['includedir']}
1460f9332757SPaolo Bonzinisummary_info += {'config directory':  config_host['sysconfdir']}
1461f9332757SPaolo Bonziniif targetos != 'windows'
1462f9332757SPaolo Bonzini  summary_info += {'local state directory': config_host['qemu_localstatedir']}
1463b81efab7SMarc-André Lureau  summary_info += {'Manual directory':      get_option('mandir')}
1464f9332757SPaolo Bonzinielse
1465f9332757SPaolo Bonzini  summary_info += {'local state directory': 'queried at runtime'}
1466f9332757SPaolo Bonziniendif
1467491e74c1SMarc-André Lureausummary_info += {'Doc directory':     get_option('docdir')}
1468f9332757SPaolo Bonzinisummary_info += {'Build directory':   meson.current_build_dir()}
1469f9332757SPaolo Bonzinisummary_info += {'Source path':       meson.current_source_dir()}
1470f9332757SPaolo Bonzinisummary_info += {'GIT binary':        config_host['GIT']}
1471f9332757SPaolo Bonzinisummary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
1472f9332757SPaolo Bonzinisummary_info += {'C compiler':        meson.get_compiler('c').cmd_array()[0]}
1473f9332757SPaolo Bonzinisummary_info += {'Host C compiler':   meson.get_compiler('c', native: true).cmd_array()[0]}
1474f9332757SPaolo Bonziniif link_language == 'cpp'
1475f9332757SPaolo Bonzini  summary_info += {'C++ compiler':      meson.get_compiler('cpp').cmd_array()[0]}
1476f9332757SPaolo Bonzinielse
1477f9332757SPaolo Bonzini  summary_info += {'C++ compiler':      false}
1478f9332757SPaolo Bonziniendif
1479f9332757SPaolo Bonziniif targetos == 'darwin'
1480f9332757SPaolo Bonzini  summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1481f9332757SPaolo Bonziniendif
1482f9332757SPaolo Bonzinisummary_info += {'ARFLAGS':           config_host['ARFLAGS']}
1483f9332757SPaolo Bonzinisummary_info += {'CFLAGS':            config_host['CFLAGS']}
1484f9332757SPaolo Bonzinisummary_info += {'QEMU_CFLAGS':       config_host['QEMU_CFLAGS']}
1485f9332757SPaolo Bonzinisummary_info += {'QEMU_LDFLAGS':      config_host['QEMU_LDFLAGS']}
1486f9332757SPaolo Bonzinisummary_info += {'make':              config_host['MAKE']}
1487f9332757SPaolo Bonzinisummary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1488f9332757SPaolo Bonzinisummary_info += {'sphinx-build':      config_host['SPHINX_BUILD']}
1489f9332757SPaolo Bonzinisummary_info += {'genisoimage':       config_host['GENISOIMAGE']}
1490f9332757SPaolo Bonzini# TODO: add back version
1491f9332757SPaolo Bonzinisummary_info += {'slirp support':     config_host.has_key('CONFIG_SLIRP')}
1492f9332757SPaolo Bonziniif config_host.has_key('CONFIG_SLIRP')
1493f9332757SPaolo Bonzini  summary_info += {'smbd':            config_host['CONFIG_SMBD_COMMAND']}
1494f9332757SPaolo Bonziniendif
1495f9332757SPaolo Bonzinisummary_info += {'module support':    config_host.has_key('CONFIG_MODULES')}
1496f9332757SPaolo Bonziniif config_host.has_key('CONFIG_MODULES')
1497f9332757SPaolo Bonzini  summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1498f9332757SPaolo Bonziniendif
1499f9332757SPaolo Bonzinisummary_info += {'host CPU':          cpu}
1500f9332757SPaolo Bonzinisummary_info += {'host endianness':   build_machine.endian()}
1501f9332757SPaolo Bonzinisummary_info += {'target list':       config_host['TARGET_DIRS']}
1502f9332757SPaolo Bonzinisummary_info += {'gprof enabled':     config_host.has_key('CONFIG_GPROF')}
1503f9332757SPaolo Bonzinisummary_info += {'sparse enabled':    meson.get_compiler('c').cmd_array().contains('cgcc')}
1504f9332757SPaolo Bonzinisummary_info += {'strip binaries':    get_option('strip')}
1505f9332757SPaolo Bonzinisummary_info += {'profiler':          config_host.has_key('CONFIG_PROFILER')}
15063e8529ddSLaurent Viviersummary_info += {'static build':      config_host.has_key('CONFIG_STATIC')}
1507f9332757SPaolo Bonziniif targetos == 'darwin'
1508f9332757SPaolo Bonzini  summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1509f9332757SPaolo Bonziniendif
1510f9332757SPaolo Bonzini# TODO: add back version
151135be72baSPaolo Bonzinisummary_info += {'SDL support':       sdl.found()}
151235be72baSPaolo Bonzinisummary_info += {'SDL image support': sdl_image.found()}
1513f9332757SPaolo Bonzini# TODO: add back version
1514f9332757SPaolo Bonzinisummary_info += {'GTK support':       config_host.has_key('CONFIG_GTK')}
1515f9332757SPaolo Bonzinisummary_info += {'GTK GL support':    config_host.has_key('CONFIG_GTK_GL')}
1516b7612f45SPaolo Bonzinisummary_info += {'pixman':            pixman.found()}
1517f9332757SPaolo Bonzini# TODO: add back version
1518f9332757SPaolo Bonzinisummary_info += {'VTE support':       config_host.has_key('CONFIG_VTE')}
1519f9332757SPaolo Bonzinisummary_info += {'TLS priority':      config_host['CONFIG_TLS_PRIORITY']}
1520f9332757SPaolo Bonzinisummary_info += {'GNUTLS support':    config_host.has_key('CONFIG_GNUTLS')}
1521f9332757SPaolo Bonzini# TODO: add back version
1522f9332757SPaolo Bonzinisummary_info += {'libgcrypt':         config_host.has_key('CONFIG_GCRYPT')}
1523f9332757SPaolo Bonziniif config_host.has_key('CONFIG_GCRYPT')
1524f9332757SPaolo Bonzini   summary_info += {'  hmac':            config_host.has_key('CONFIG_GCRYPT_HMAC')}
1525f9332757SPaolo Bonzini   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1526f9332757SPaolo Bonziniendif
1527f9332757SPaolo Bonzini# TODO: add back version
1528f9332757SPaolo Bonzinisummary_info += {'nettle':            config_host.has_key('CONFIG_NETTLE')}
1529f9332757SPaolo Bonziniif config_host.has_key('CONFIG_NETTLE')
1530f9332757SPaolo Bonzini   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1531f9332757SPaolo Bonziniendif
1532f9332757SPaolo Bonzinisummary_info += {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
1533f9332757SPaolo Bonzinisummary_info += {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
1534f9332757SPaolo Bonzinisummary_info += {'iconv support':     config_host.has_key('CONFIG_ICONV')}
1535f9332757SPaolo Bonzinisummary_info += {'curses support':    config_host.has_key('CONFIG_CURSES')}
1536f9332757SPaolo Bonzini# TODO: add back version
1537f9332757SPaolo Bonzinisummary_info += {'virgl support':     config_host.has_key('CONFIG_VIRGL')}
1538f9332757SPaolo Bonzinisummary_info += {'curl support':      config_host.has_key('CONFIG_CURL')}
1539f9332757SPaolo Bonzinisummary_info += {'mingw32 support':   targetos == 'windows'}
1540f9332757SPaolo Bonzinisummary_info += {'Audio drivers':     config_host['CONFIG_AUDIO_DRIVERS']}
1541f9332757SPaolo Bonzinisummary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1542f9332757SPaolo Bonzinisummary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1543f9332757SPaolo Bonzinisummary_info += {'VirtFS support':    config_host.has_key('CONFIG_VIRTFS')}
15446ec0e15dSPaolo Bonzinisummary_info += {'Multipath support': mpathpersist.found()}
1545a0b93237SPaolo Bonzinisummary_info += {'VNC support':       vnc.found()}
1546a0b93237SPaolo Bonziniif vnc.found()
1547a0b93237SPaolo Bonzini  summary_info += {'VNC SASL support':  sasl.found()}
1548a0b93237SPaolo Bonzini  summary_info += {'VNC JPEG support':  jpeg.found()}
1549a0b93237SPaolo Bonzini  summary_info += {'VNC PNG support':   png.found()}
1550f9332757SPaolo Bonziniendif
1551f9332757SPaolo Bonzinisummary_info += {'xen support':       config_host.has_key('CONFIG_XEN_BACKEND')}
1552f9332757SPaolo Bonziniif config_host.has_key('CONFIG_XEN_BACKEND')
1553f9332757SPaolo Bonzini  summary_info += {'xen ctrl version':  config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1554f9332757SPaolo Bonziniendif
1555f9332757SPaolo Bonzinisummary_info += {'brlapi support':    config_host.has_key('CONFIG_BRLAPI')}
1556f9332757SPaolo Bonzinisummary_info += {'Documentation':     config_host.has_key('BUILD_DOCS')}
1557f9332757SPaolo Bonzinisummary_info += {'PIE':               get_option('b_pie')}
1558f9332757SPaolo Bonzinisummary_info += {'vde support':       config_host.has_key('CONFIG_VDE')}
1559f9332757SPaolo Bonzinisummary_info += {'netmap support':    config_host.has_key('CONFIG_NETMAP')}
1560f9332757SPaolo Bonzinisummary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1561f9332757SPaolo Bonzinisummary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1562f9332757SPaolo Bonzinisummary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1563f9332757SPaolo Bonzinisummary_info += {'Install blobs':     config_host.has_key('INSTALL_BLOBS')}
156405512f55SPaolo Bonzinisummary_info += {'KVM support':       config_all.has_key('CONFIG_KVM')}
156505512f55SPaolo Bonzinisummary_info += {'HAX support':       config_all.has_key('CONFIG_HAX')}
156605512f55SPaolo Bonzinisummary_info += {'HVF support':       config_all.has_key('CONFIG_HVF')}
156705512f55SPaolo Bonzinisummary_info += {'WHPX support':      config_all.has_key('CONFIG_WHPX')}
156805512f55SPaolo Bonzinisummary_info += {'TCG support':       config_all.has_key('CONFIG_TCG')}
156905512f55SPaolo Bonziniif config_all.has_key('CONFIG_TCG')
157005512f55SPaolo Bonzini  summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
157105512f55SPaolo Bonzini  summary_info += {'TCG interpreter':   config_host.has_key('CONFIG_TCG_INTERPRETER')}
157205512f55SPaolo Bonziniendif
1573aa087962SPaolo Bonzinisummary_info += {'malloc trim support': has_malloc_trim}
1574f9332757SPaolo Bonzinisummary_info += {'RDMA support':      config_host.has_key('CONFIG_RDMA')}
1575f9332757SPaolo Bonzinisummary_info += {'PVRDMA support':    config_host.has_key('CONFIG_PVRDMA')}
1576f9332757SPaolo Bonzinisummary_info += {'fdt support':       config_host.has_key('CONFIG_FDT')}
1577f9332757SPaolo Bonzinisummary_info += {'membarrier':        config_host.has_key('CONFIG_MEMBARRIER')}
1578f9332757SPaolo Bonzinisummary_info += {'preadv support':    config_host.has_key('CONFIG_PREADV')}
1579f9332757SPaolo Bonzinisummary_info += {'fdatasync':         config_host.has_key('CONFIG_FDATASYNC')}
1580f9332757SPaolo Bonzinisummary_info += {'madvise':           config_host.has_key('CONFIG_MADVISE')}
1581f9332757SPaolo Bonzinisummary_info += {'posix_madvise':     config_host.has_key('CONFIG_POSIX_MADVISE')}
1582f9332757SPaolo Bonzinisummary_info += {'posix_memalign':    config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1583f9332757SPaolo Bonzinisummary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1584f9332757SPaolo Bonzinisummary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1585f9332757SPaolo Bonzinisummary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1586f9332757SPaolo Bonzinisummary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1587f9332757SPaolo Bonzinisummary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1588f9332757SPaolo Bonzinisummary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1589f9332757SPaolo Bonzinisummary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1590f9332757SPaolo Bonzinisummary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1591f9332757SPaolo Bonzinisummary_info += {'Trace backends':    config_host['TRACE_BACKENDS']}
1592f9332757SPaolo Bonziniif config_host['TRACE_BACKENDS'].split().contains('simple')
1593f9332757SPaolo Bonzini  summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1594f9332757SPaolo Bonziniendif
1595f9332757SPaolo Bonzini# TODO: add back protocol and server version
1596f9332757SPaolo Bonzinisummary_info += {'spice support':     config_host.has_key('CONFIG_SPICE')}
1597f9332757SPaolo Bonzinisummary_info += {'rbd support':       config_host.has_key('CONFIG_RBD')}
1598f9332757SPaolo Bonzinisummary_info += {'xfsctl support':    config_host.has_key('CONFIG_XFS')}
1599f9332757SPaolo Bonzinisummary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
16000a40bcb7SCésar Belleysummary_info += {'U2F support':       u2f.found()}
1601f9332757SPaolo Bonzinisummary_info += {'libusb':            config_host.has_key('CONFIG_USB_LIBUSB')}
1602f9332757SPaolo Bonzinisummary_info += {'usb net redir':     config_host.has_key('CONFIG_USB_REDIR')}
1603f9332757SPaolo Bonzinisummary_info += {'OpenGL support':    config_host.has_key('CONFIG_OPENGL')}
1604f9332757SPaolo Bonzinisummary_info += {'OpenGL dmabufs':    config_host.has_key('CONFIG_OPENGL_DMABUF')}
1605f9332757SPaolo Bonzinisummary_info += {'libiscsi support':  config_host.has_key('CONFIG_LIBISCSI')}
1606f9332757SPaolo Bonzinisummary_info += {'libnfs support':    config_host.has_key('CONFIG_LIBNFS')}
1607f9332757SPaolo Bonzinisummary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1608f9332757SPaolo Bonziniif targetos == 'windows'
1609f9332757SPaolo Bonzini  if 'WIN_SDK' in config_host
1610f9332757SPaolo Bonzini    summary_info += {'Windows SDK':       config_host['WIN_SDK']}
1611f9332757SPaolo Bonzini  endif
1612f9332757SPaolo Bonzini  summary_info += {'QGA VSS support':   config_host.has_key('CONFIG_QGA_VSS')}
1613f9332757SPaolo Bonzini  summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
16144bad7c3bSStefan Hajnoczi  summary_info += {'QGA MSI support':   config_host.has_key('CONFIG_QGA_MSI')}
1615f9332757SPaolo Bonziniendif
1616f9332757SPaolo Bonzinisummary_info += {'seccomp support':   config_host.has_key('CONFIG_SECCOMP')}
1617f9332757SPaolo Bonzinisummary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1618f9332757SPaolo Bonzinisummary_info += {'coroutine pool':    config_host['CONFIG_COROUTINE_POOL'] == '1'}
1619f9332757SPaolo Bonzinisummary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1620f9332757SPaolo Bonzinisummary_info += {'mutex debugging':   config_host.has_key('CONFIG_DEBUG_MUTEX')}
1621f9332757SPaolo Bonzinisummary_info += {'crypto afalg':      config_host.has_key('CONFIG_AF_ALG')}
1622f9332757SPaolo Bonzinisummary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1623bf0e56a3SMarc-André Lureausummary_info += {'gcov':              get_option('b_coverage')}
1624f9332757SPaolo Bonzinisummary_info += {'TPM support':       config_host.has_key('CONFIG_TPM')}
1625f9332757SPaolo Bonzinisummary_info += {'libssh support':    config_host.has_key('CONFIG_LIBSSH')}
1626f9332757SPaolo Bonzinisummary_info += {'QOM debugging':     config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1627f9332757SPaolo Bonzinisummary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1628f9332757SPaolo Bonzinisummary_info += {'lzo support':       config_host.has_key('CONFIG_LZO')}
1629f9332757SPaolo Bonzinisummary_info += {'snappy support':    config_host.has_key('CONFIG_SNAPPY')}
1630f9332757SPaolo Bonzinisummary_info += {'bzip2 support':     config_host.has_key('CONFIG_BZIP2')}
1631f9332757SPaolo Bonzinisummary_info += {'lzfse support':     config_host.has_key('CONFIG_LZFSE')}
1632f9332757SPaolo Bonzinisummary_info += {'zstd support':      config_host.has_key('CONFIG_ZSTD')}
1633f9332757SPaolo Bonzinisummary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1634f9332757SPaolo Bonzinisummary_info += {'libxml2':           config_host.has_key('CONFIG_LIBXML2')}
1635aa087962SPaolo Bonzinisummary_info += {'memory allocator':  get_option('malloc')}
1636f9332757SPaolo Bonzinisummary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1637f9332757SPaolo Bonzinisummary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1638f9332757SPaolo Bonzinisummary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1639f9332757SPaolo Bonzinisummary_info += {'bochs support':     config_host.has_key('CONFIG_BOCHS')}
1640f9332757SPaolo Bonzinisummary_info += {'cloop support':     config_host.has_key('CONFIG_CLOOP')}
1641f9332757SPaolo Bonzinisummary_info += {'dmg support':       config_host.has_key('CONFIG_DMG')}
1642f9332757SPaolo Bonzinisummary_info += {'qcow v1 support':   config_host.has_key('CONFIG_QCOW1')}
1643f9332757SPaolo Bonzinisummary_info += {'vdi support':       config_host.has_key('CONFIG_VDI')}
1644f9332757SPaolo Bonzinisummary_info += {'vvfat support':     config_host.has_key('CONFIG_VVFAT')}
1645f9332757SPaolo Bonzinisummary_info += {'qed support':       config_host.has_key('CONFIG_QED')}
1646f9332757SPaolo Bonzinisummary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1647f9332757SPaolo Bonzinisummary_info += {'sheepdog support':  config_host.has_key('CONFIG_SHEEPDOG')}
1648f9332757SPaolo Bonzinisummary_info += {'capstone':          config_host.has_key('CONFIG_CAPSTONE')}
1649f9332757SPaolo Bonzinisummary_info += {'libpmem support':   config_host.has_key('CONFIG_LIBPMEM')}
1650f9332757SPaolo Bonzinisummary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1651f01496a3SPaolo Bonzinisummary_info += {'libudev':           libudev.found()}
1652f9332757SPaolo Bonzinisummary_info += {'default devices':   config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1653f9332757SPaolo Bonzinisummary_info += {'plugin support':    config_host.has_key('CONFIG_PLUGIN')}
1654f9332757SPaolo Bonzinisummary_info += {'fuzzing support':   config_host.has_key('CONFIG_FUZZ')}
1655f9332757SPaolo Bonziniif config_host.has_key('HAVE_GDB_BIN')
1656f9332757SPaolo Bonzini  summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
1657f9332757SPaolo Bonziniendif
1658f9332757SPaolo Bonzinisummary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
1659f9332757SPaolo Bonzinisummary_info += {'rng-none':          config_host.has_key('CONFIG_RNG_NONE')}
1660f9332757SPaolo Bonzinisummary_info += {'Linux keyring':     config_host.has_key('CONFIG_SECRET_KEYRING')}
1661f9332757SPaolo Bonzinisummary(summary_info, bool_yn: true)
1662f9332757SPaolo Bonzini
1663f9332757SPaolo Bonziniif not supported_cpus.contains(cpu)
1664f9332757SPaolo Bonzini  message()
1665f9332757SPaolo Bonzini  warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1666f9332757SPaolo Bonzini  message()
1667f9332757SPaolo Bonzini  message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1668f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host CPU in')
1669f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
1670f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
1671f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
1672f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
1673f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
1674f9332757SPaolo Bonziniendif
1675f9332757SPaolo Bonzini
1676f9332757SPaolo Bonziniif not supported_oses.contains(targetos)
1677f9332757SPaolo Bonzini  message()
1678f9332757SPaolo Bonzini  warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1679f9332757SPaolo Bonzini  message()
1680f9332757SPaolo Bonzini  message('Host OS ' + targetos + 'support is not currently maintained.')
1681f9332757SPaolo Bonzini  message('The QEMU project intends to remove support for this host OS in')
1682f9332757SPaolo Bonzini  message('a future release if nobody volunteers to maintain it and to')
1683f9332757SPaolo Bonzini  message('provide a build host for our continuous integration setup.')
1684f9332757SPaolo Bonzini  message('configure has succeeded and you can continue to build, but')
1685f9332757SPaolo Bonzini  message('if you care about QEMU on this platform you should contact')
1686f9332757SPaolo Bonzini  message('us upstream at qemu-devel@nongnu.org.')
1687f9332757SPaolo Bonziniendif
1688